Repository navigation
T101: the doxBench texts read the carved and composed homes (plan 038; T094's map R2-INV-R9) - #48
Conversation
…; T094's map R2-INV-R9) Respells the seven doxBench and doxchat test files the map's T101 row owns to the carve's homes and its ruled designs, and moves the one declaration entry W5 clears. Test text only; no src/ change. - PP 25: pre-carve scripts/ideation_dashboard/ reads at their carved homes (conftest's carved_module_path), and the push sweep's three openxFactory-only modules at openxFactory's tree (openxfactory_root()), each swept module read from exactly one home. - CP 6: liveness asked through the scope seam (T084); compute_capabilities asked with this leg's gate routes (T084); the save seam at Q3/Q10's placements (S5); the broker-enrolled auth kinds (T080); the approval's machine trust recorded before the model is available (T100). - CS 5: the chat-turn and gate-action-record schemas read from T095's farm (CONTRACTS_DIR). - HH 1: the raw client sends one Host line (openDox's T103 guard). - W5 (RULED 6021830531): the manifest home is dropped; the declaration's blank_reason entry loses openxfactory-contracts and its note (RULED 6022291206), count 66. - W6 (RULED 6021830531): the release record is read over both owners' manifests in the composed tree, both digests recomputed. Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Reviewer's GuideThis draft updates eight test files to validate the carved/composed repository topology and current openDox seams, covering source resolution, gate and transport behavior, model trust, contract ownership/digests, and the W5 exclusion change; it is intentionally dependent on T095 for composed-root and contract-farm helpers. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Composed validation still depends on unmerged T095 work, and the current head intentionally fails collection.
Review effort: Balanced
Findings: 1
Open (1)
What changed in this PR
Aligns doxBench tests with the carved multi-repository layout and current openDox seams.
Changes:
- Resolves modules, schemas, and manifests from composed owners.
- Updates capability, trust, transport, and liveness assertions.
- Narrows the blank-reason exclusion to
doc_health.
| File | Description |
|---|---|
tests/test_doxbench_threads.py |
Uses carved module paths. |
tests/test_doxbench_thread_wiring.py |
Updates source ownership and liveness checks. |
tests/test_doxbench_knowledge_service.py |
Reads carved sources and composed schemas. |
tests/test_doxbench_transport.py |
Updates Host and save-seam assertions. |
tests/test_doxbench_request_handling.py |
Supplies contributed gate routes. |
tests/test_doxchat_model_intake.py |
Updates authentication, trust, and release-owner tests. |
tests/test_doxbench_blank_reason.py |
Removes the obsolete manifest home. |
tests/declared_exclusion.yaml |
Removes the obsolete contracts exclusion reason. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…320) Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The branch intentionally depends on unmerged PR #46 and currently fails validation because its composed-test helpers are unavailable.
Review effort: Balanced
Findings: None
Resolved since last review (1)
Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 18 hours and 30 minutes by commenting |
|
READY at 6f157db Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Holder, automatic READY on Brett's word "land lane 3's PRs when green" (2026-10-06). At the head: |
Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n 038, T094's map R2-INV-R9) (#54) Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Authored by lane openXfactory-3, delegated by lane openxfactory-4 (#656 6021862323) Arc: neutral-product-standalone-operability ## T100: the repo selector's declared tests, respelled to the carve (plan 038, T094's map R2-INV-R9) **Contract.** There is no `tasks.md` entry yet. Lane 4 records T095 to T104 after T002. The contract is T094's slice-outline row for T100 and the holder's rulings on the map, opensoft/openxFactory#656 comment 6021830531. - **Realizes:** the requirement 9 declared composed tests (T073, F9.1), for `tests/test_repo_selector.py`. It owns 24 composed reds, and its 7 host-registration nodes arrive with T095. - **Falsifier:** the composed run of the file, alone, goes from red to green. The unchanged set stays node-for-node unchanged, and `tests/test_declared_exclusion.py` stays green lone. - **After:** T095 (#46), LANDED as `e2340bb6`. main is merged in. **Ruled (#656 6021830531), as applied here:** - **R9-W1 (A″):** the three Node harnesses copy `display.js` beside the model, with `package.json`, as T026's harnesses do. 17 nodes. - **R9-R1 (a):** the sparse-station node is handed the display `/capabilities` serves under the registered host, and asserts the served words. 1 node. - **MN:** `SNAPSHOT_INDEX_ROUTE` is read from `openxdox.serve_projection`. 2 nodes. - **R9-W4:** the plain-script and module subprocess tests register the host from THIS checkout before `opendox.serve` runs. 2 nodes. The child, in order: 1. puts this checkout's `src/` first and imports openXdox's governed columns from it; 2. checks that `openxdox` resolves to this checkout; 3. registers openXdox's governed projection (`projection_contributions.register()`, the call openxFactory's host makes, plan 034 T064); 4. builds openxFactory's composite with `sys.path` saved and put back; 5. runs T020's `_refuse_an_openxdox_from_elsewhere`, the very function (its source, run in the child); 6. registers the composite. - **R9-R2 (a):** re-scoped to openDox with no host (`python -m opendox.serve`, a PyYAML blocker as its only path entry). The refresh is refused as `unknown_action`, and no `yaml` is loaded. 1 node. - **R9-W3:** `test_serve_module_uses_no_relative_imports` is RETIRED. 1 node. **Two notes for the holder (measured; no ruling taken):** 1. **R9-R2: openDox's serve tries `import yaml` at START, not on a POST.** - Measured: `build_server()`, then `_probe_nlm`, then `real_notebook_adapter`, then `opendox.workbench:52`, which imports PyYAML. - The blocker refuses it, and the probe reads that as no notebook support. - None of the three POSTs tries it. So the blocker counts every import attempt, and the test asserts that the count after the POSTs equals the count once the serve is up. - Mutant M11 (below) shows the count catches a POST that reaches for `yaml`. 2. **R9-W3's scope: the regex retires together with its self-test.** - The pin was the scan, the pattern it scanned with (`RELATIVE_IMPORT_RE`), and that pattern's 7-case self-test (`test_the_relative_import_guard_catches_every_dot_and_segment_depth`). The file's own comment named the three as one pin. - All three are retired: 1 red node and 7 green. - Say if you want the self-test kept. **R9-R2's lone consequence: none.** - Run alone lone, the re-scoped node does not run. The file still fails at COLLECTION on `doc_health` (`openxdox.generator`): `ModuleNotFoundError: No module named 'doc_health'`, `1 error in 0.39s`. - So `tests/declared_exclusion.yaml` is unchanged, and the entry keeps `[doc_health]`. ## Falsifier, quoted **The composed form (R1Q23 (a)):** - openxFactory `92010d3e` (`tests/composed_host_pin.yaml`), with `openDox`, `openXdox` and `openXwallet` recursive, and its `scripts/` on `PYTHONPATH`; - openDox-code `84f8ed83`, installed; - T022's runbook placement made before the run and removed after; - the colour variables unset, with `TERM=dumb`; - each file run ALONE: `python -m pytest -q -p no:cacheprovider -rfE --junitxml=… <file>`. Measured over REAL main, after T095 (#46) landed: - **base:** main `e2340bb6`; - **head:** this PR's head `ba0c3446`, which is main `e2340bb6` plus this PR's one file. | | `tests/test_repo_selector.py` | |---|---| | base, main `e2340bb6` | `18 passed, 24 failed` | | head `ba0c3446` | `34 passed, 0 failed` | The 24 at the base are DJ 17, DJ+VR 1, MN 2, W4 2, W3 1 and R9-R2 1. T095's 7 host-registration nodes are already green there. 42 nodes become 34: W3 retires 1 red and 7 green. **Unchanged set, composed, each file alone, at base and head: node-for-node identical, 974 nodes, 0 red at both.** - 12.5's 16 governed suites: the same 16 at both. - F5.2's 5: `test_generator` 45, `test_session_snapshot` 23, `test_snapshot_determinism` 6, `test_snapshot_registry` 40, `test_snapshot_validation_launch` 9, all passed. - `test_column_contributions_governed.py`: `9 passed`. - Over all 23 files: base `992 passed, 24 failed`; head `1008 passed, 0 failed`. **Lone (CI venv, openDox `dede32b4` by the pin), at `ba0c3446`:** - `tests/test_declared_exclusion.py`: `207 passed`. - The R9-R2 node alone: `1 error`, `ModuleNotFoundError: No module named 'doc_health'` at collection. Its entry stays as it is. - The CI form (`python -m pytest -q --deselect "$LEFT_OUT"`): `1161 passed, 4 skipped, 1 deselected`. That is selected 1165, against the floors 1099 / 1095 / 4. The floors are untouched. ## Mutants (one exact edit each, the file run composed alone) Measured at the earlier integration of main `f70bc9c3` + #46 `c2192e3e`. This PR's file is byte-identical at `ba0c3446`. | id | mutation | result | |---|---|---| | M1 | `display.js` not copied | KILLED, 18 red | | M2 | no `package.json` | survived: equivalent on Node 24, whose syntax detection reads `display.js` as a module; kept for parity with T026's harnesses | | M3 | the harness ignores the display it is handed | KILLED | | M4 | `sparseNotice` not given the display | survived: equivalent at this pin, since the served words for the four empty stations are openDox's neutral ones (the ruled overlay changes only `completion` and the values). M3 guards the hand-off | | M5 | this checkout's `src/` not put first | KILLED, both W4 nodes. Locally, the editable install is another clone; in CI it is the checkout itself, so there this edit is equivalent | | M6 | openXdox's columns not imported from this checkout first | KILLED, both W4 nodes, by T020's guard | | M7 | M6, with the guard call removed too | survived: the control, showing that the guard is what kills M6 | | M8 | the governed projection not registered | KILLED, both W4 nodes | | M9 | `sys.path` not put back | survived: no `openxdox` import after the composite is read reaches the pinned leg in these two tests. The in-process harness has the same posture | | M10 | the composite not registered | KILLED, both W4 nodes | | M11 | R9-R2 on loopback, with the notebook asserts dropped, so a POST reaches `yaml` | KILLED, by the attempt count | ## Files changed - `tests/test_repo_selector.py` (only). ## Gates at `ba0c3446` - **CI:** - `validate` passed (run 37548690247): `1161 passed, 4 skipped, 1 deselected`, and `triple: selected=1165 passed=1161 skipped=4 failures=0 errors=0` against the floors 1099 / 1095 / 4. - SonarCloud Code Analysis passed. - **Copilot:** review 5435813621 at `ba0c3446` reads "Findings: None". Its "Needs a closer look" note concerns the then-unlanded #46, which has since LANDED as `e2340bb6` and is merged into this head. The earlier review, 5435251251 at `0c0f8bc8`, also read "Findings: None". - **Review threads:** 0, so 0 unresolved. ## What remains - Nothing for the writer. The PR is final and frozen. - It is behind main `fc1115d6`. Lane 4's autoland loop runs update-branch and re-requests Copilot. - `main` since `e2340bb6` (#48 T101, #51 T098) does not touch `tests/test_repo_selector.py`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Arc: neutral-product-standalone-operability Lane: openxfactory-4 (openXfactory-4-openDox_extraction) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Brings T101 (#48), T098 (#51), T103 (#49), T096 (#53), T100 (#54), T099 (#47), T021's follow-on (#55), T102 (#52), T022 (#41, landed as aefd109), T097 (#50) and T096's follow-on (#56). Conflicted: scripts/composed_placements.py and tests/test_composed_placements.py, both T022's files, which this branch carried from #41 through #44. Main's landed side is kept for both. tests/declared_exclusion.yaml merged clean (T101's entry edits beside T073's header and open_until). Lane: openXfactory-3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>




Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Authored by lane openXfactory-3, delegated by lane openxfactory-4 (#656 6021862323)
Arc: neutral-product-standalone-operability
T101 (plan 038): the doxBench texts
One of the R9 repair slices, T095 to T104, which repair every composed red outside 12.5's set in this leg's declared exclusion, so that T073's composed step 5a goes green (requirement 9's declared composed tests, T073, F9.1).
Contract. There is no
tasks.mdentry yet: lane 4 records T095 to T104 after T002 (#1251). The contract is T101's row in T094's map,R2-INV-R9.md§ "Slice outline" (#6566021830607), plus the holder's rulings:6021830531: W5, drop the manifest home; W6, rewrite over both owners.6022291206: T101's Files gaintests/declared_exclusion.yamlfor one entry only,test_doxbench_blank_reason.py.Realizes: T094's row T101: PP 25 (threads 21, thread_wiring 2, knowledge_service 2), CP 6 (thread_wiring 1, transport 1, request_handling 1, doxchat 3), CS constants 5 (knowledge_service 2, doxchat 3) and HH 1, so 37 in all; plus 1 on W5 and 1 on W6.
Falsifier: these files composed, each file alone, red at the base and green at the head; plus the unchanged set.
After: T095 (T095: the composed harness for the declared integration tests (plan 038, T094's R2-INV-R9) #46) for
CONTRACTS_DIRandopenxfactory_root(), LANDED ase2340bb6; T021 (T021, U-2: the gate console's schemas, each read where its owner keeps it, nothing vendored (plan 038, P4F-4) #40), LANDED asf70bc9c3. Met.What changes (test text only; no
src/change)test_doxbench_threads.py(21),test_doxbench_thread_wiring.py(2),test_doxbench_knowledge_service.py(2)scripts/ideation_dashboard/reads respelled to their carved homes, through the conftest'scarved_module_path(plan 034 T040's resolver). The push sweep also reads its three openxFactory-only modules (nightly_lane.py,doxbench_status_exemption.py,serve_openxfactory_lanes.py) from the composed tree,openxfactory_root(). Each swept module is read from exactly one of its three homes; a module in two or none refuses the sweep by name.test_doxbench_thread_wiring.pye49b17c):self._is_live_session_ref(→column_seams.scope.current().is_live_session_ref(. openXdox's registration there ISdoxbench_scope(column_contributions.SCOPE is doxbench_scope).live_session_branches(stays absent.test_doxbench_request_handling.pycompute_capabilitiesfor the local human is asked with this leg's own gate routes (GateRoutesExtension().routes()), since T084 makesgatetrue only where a contributed binding answersPOST /actions/gate/<verb>. The pinned dict is unchanged.test_doxbench_transport.py5642758731): the route is inswb-session.js, not openDox's model. Q10 (5648065587), S5 (openDox-code8efb3cf): no static import inapp.js; one.session.firstEditTransport(call site with therefusalTransport()fallback; andfirstEditTransportdeclared in thegate.workbench.sessionbinding'sexports(VIEW_BINDING_SPECS). This was the map's one INFERRED node, now measured.test_doxchat_model_intake.py(3)none(T080, openDox-code1130e99; #1144 16.3). The approval case, after approving, reads the model listed and NOT yet available. It then records this machine's trust asopendox model-binding trustdoes (doxbench_trust.recording_for, through the case's ownstand_in_host_trust), and reads a fresh catalog in which the model is available (T100, openDox-code38d3350; #1144 16.3a). A factory takes its verdict when it is built, so each catalog comes from a factory built at that moment.test_doxbench_knowledge_service.py(2),test_doxchat_model_intake.py(3)CONTRACTS_DIR.test_doxbench_transport.pyHostline (skip_host=True). openDox's loopback Host guard (openDox-code390e2c2) refuses a second one as403 invalid_host.test_doxbench_blank_reason.pytests/declared_exclusion.yamltest_doxbench_blank_reason.py→reasons: [doc_health], and its note is dropped.countstays 66, andopenxfactory-contractskeeps its four contracts-only entries. That reason carries noonlylist atmain, so nothing moves there.test_doxchat_model_intake.pygate-action-recordin the openXdox root's,xfactory-workbench-chat-turnin the openDox root's.release_memberandcontract_schema_version: 1hold, and the digest is recomputed from the spec leg's bytes. The immutable half, the CHANGELOG entry and the digest inventory, is read from openxFactory's tree. The twoconsumption_ruleasserts left with openxFactory's rows at contract-v4.0.Falsifier (measured; quoted)
Composed form, R1Q23 (a):
92010d3e(tests/composed_host_pin.yamlin DRAFT: T029, U-9: the composed run, permanent: composed.yml and its openxFactory pin (plan 038) #44), withopenDox,openXdoxandopenXwalletinitialized recursively and itsscripts/onPYTHONPATH.main84f8ed83.TERM=dumb.python -m pytest -q -p no:cacheprovider -rfE --junitxml=… tests/<file>from the checkout root.Base:
maine2340bb6(T095 landed). Head:6f157db7, this PR: one change commit, the Copilot fix2fdbd96, and merges ofmain. Measured 23:34Z to 23:43Z.test_doxbench_threads.pytest_doxbench_thread_wiring.pytest_doxbench_knowledge_service.pytest_doxbench_transport.pytest_doxbench_request_handling.pytest_doxchat_model_intake.pytest_doxbench_blank_reason.pymainalone (8b64fae0, before T095), the main-measurable part read 49 → 17 over these files. The 17 were T095's HR 7, T021's 3, CS 5 and the approval node.HOST_SEAM_SUITESemptied by a throwaway plugin, it passes, andtest_doxchat_model_intake.pyreads 43 passed. Its ownstand_in_host_trustcarries the trust.The unchanged set, base vs head, same form, node for node (0 newly red):
git grep -l -e open-pr -e open_pr -e FakePullRequests -- 'tests/test_*.py'): identical per node. The reds that remain are other slices', and none is changed.test_generator.py,test_snapshot*.py,test_session_snapshot.py; 7 files): all green at both.test_column_contributions_governed.py: 9 passed at both.Lone,
tests/test_declared_exclusion.py(CI form:pip install -e ".[test]", openDoxdede32b4from the pin), at6f157db7: 207 cases, 0 red, inside the whole-suite run below. The six other files still fail lone at collection ondoc_health, unchanged.Mutants (14 of 14 killed)
Measured over a scratch integration of this change with #40 and #46. Each fault was planted in the subject, its node run composed over the integration, and everything restored and digest-checked.
nightly_lane.py→('nightly_lane.py', 'git push').nightly_lane.pyplanted at this leg'ssrc/openxdox/too → "expected in exactly one of …". The resolver without openxFactory's home (test mutant) → the same.doxbench_scopedirectly → the seam pin fails. A shape-valid copy of the question registered as the scope → the identity pin fails.swb-session.jsimport back inapp.js;firstEditTransportdropped from the binding'sexports; the route constant back in openDox's model; therefusalTransport()fallback gone. Each fails the test.gate-action-record→('gate-action-record', ['openXdox', 'openDox']). A drifted byte in the spec leg's schema →gate-action-record. A drifted recorded digest →xfactory-workbench-chat-turn.assert False is True. The trust never recorded → the same.CI
validateat6f157db7: success (run 37548131461). SonarCloud: success.6f157db7: selected=1165 passed=1161 skipped=4 failures=0 errors=0, abovevalidate.yml's floors 1099/1095/4. The floors are untouched.6f157db7: COMMENTED, "Needs a closer look", Findings: None. One thread in all, r4199422320 (Low, the release test's summary), fixed in2fdbd96and resolved: 0 unresolved.Files (8)
tests/test_doxbench_threads.py,tests/test_doxbench_thread_wiring.py,tests/test_doxbench_knowledge_service.py,tests/test_doxbench_transport.py,tests/test_doxbench_request_handling.py,tests/test_doxchat_model_intake.py,tests/test_doxbench_blank_reason.py. The eighth,tests/declared_exclusion.yaml, is one entry only (holder6022291206). Its chain is now T101 → T073 → T074; T073 (#45) edits only the header andreasonsblock, a different hunk.None of these is in 12.5's computed 16 or in F5.2's set.
Not done
tests/test_declared_exclusion.py's docstring (:28-30) and comment (:261) still nametest_doxbench_blank_reason.pyas a two-reason entry, and_CONTRACT_FILESkeeps the checkout'scontracts/manifest.yamlwith its evidence case. That file is not T101's.🤖 Generated with Claude Code