Skip to content

T101: the doxBench texts read the carved and composed homes (plan 038; T094's map R2-INV-R9) - #48

Merged
brettheap merged 4 commits into
mainfrom
r2/t101-doxbench-texts
Oct 6, 2026
Merged

brettheap merged 4 commits into
mainfrom
r2/t101-doxbench-texts

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

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.md entry 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" (#656 6021830607), plus the holder's rulings:

What changes (test text only; no src/ change)

means where what
PP test_doxbench_threads.py (21), test_doxbench_thread_wiring.py (2), test_doxbench_knowledge_service.py (2) Pre-carve scripts/ideation_dashboard/ reads respelled to their carved homes, through the conftest's carved_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.
CP test_doxbench_thread_wiring.py Liveness is now asked through the scope seam (T084, openDox-code e49b17c): self._is_live_session_ref( → column_seams.scope.current().is_live_session_ref(. openXdox's registration there IS doxbench_scope (column_contributions.SCOPE is doxbench_scope). live_session_branches( stays absent.
CP test_doxbench_request_handling.py compute_capabilities for the local human is asked with this leg's own gate routes (GateRoutesExtension().routes()), since T084 makes gate true only where a contributed binding answers POST /actions/gate/<verb>. The pinned dict is unchanged.
CP test_doxbench_transport.py The save seam is re-pinned at its rulings' placements. Q3 (5642758731): the route is in swb-session.js, not openDox's model. Q10 (5648065587), S5 (openDox-code 8efb3cf): no static import in app.js; one .session.firstEditTransport( call site with the refusalTransport() fallback; and firstEditTransport declared in the gate.workbench.session binding's exports (VIEW_BINDING_SPECS). This was the map's one INFERRED node, now measured.
CP test_doxchat_model_intake.py (3) Both auth-kind pins read the broker-enrolled kinds, every member but none (T080, openDox-code 1130e99; #1144 16.3). The approval case, after approving, reads the model listed and NOT yet available. It then records this machine's trust as opendox model-binding trust does (doxbench_trust.recording_for, through the case's own stand_in_host_trust), and reads a fresh catalog in which the model is available (T100, openDox-code 38d3350; #1144 16.3a). A factory takes its verdict when it is built, so each catalog comes from a factory built at that moment.
CS test_doxbench_knowledge_service.py (2), test_doxchat_model_intake.py (3) The chat-turn and gate-action-record schemas are read from T095's farm, CONTRACTS_DIR.
HH test_doxbench_transport.py The raw client sends ONE Host line (skip_host=True). openDox's loopback Host guard (openDox-code 390e2c2) refuses a second one as 403 invalid_host.
W5 test_doxbench_blank_reason.py The manifest home is dropped; the rule stays stated in its other three homes.
W5 tests/declared_exclusion.yaml One entry: test_doxbench_blank_reason.py → reasons: [doc_health], and its note is dropped. count stays 66, and openxfactory-contracts keeps its four contracts-only entries. That reason carries no only list at main, so nothing moves there.
W6 test_doxchat_model_intake.py The v1.45 release test is read over both owners in the composed tree. Each row is in its owner's manifest and in no other of the three: gate-action-record in the openXdox root's, xfactory-workbench-chat-turn in the openDox root's. release_member and contract_schema_version: 1 hold, 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 two consumption_rule asserts left with openxFactory's rows at contract-v4.0.

Falsifier (measured; quoted)

Composed form, R1Q23 (a):

  • openxFactory 92010d3e (tests/composed_host_pin.yaml in DRAFT: T029, U-9: the composed run, permanent: composed.yml and its openxFactory pin (plan 038) #44), with openDox, openXdox and openXwallet initialized recursively and its scripts/ on PYTHONPATH.
  • openDox installed from openDox-code main 84f8ed83.
  • The colour variables unset, and TERM=dumb.
  • Each file alone: python -m pytest -q -p no:cacheprovider -rfE --junitxml=… tests/<file> from the checkout root.
  • T022's placement is immaterial here: it places only the session runbook, which none of these files reads.

Base: main e2340bb6 (T095 landed). Head: 6f157db7, this PR: one change commit, the Copilot fix 2fdbd96, and merges of main. Measured 23:34Z to 23:43Z.

file base head
test_doxbench_threads.py 78 passed, 21 failed 99 passed, 0 failed
test_doxbench_thread_wiring.py 47 passed, 3 failed 50 passed, 0 failed
test_doxbench_knowledge_service.py 47 passed, 4 failed, 1 skipped 51 passed, 0 failed, 1 skipped
test_doxbench_transport.py 27 passed, 2 failed, 1 skipped 29 passed, 0 failed, 1 skipped
test_doxbench_request_handling.py 45 passed, 1 failed 46 passed, 0 failed
test_doxchat_model_intake.py 36 passed, 7 failed 43 passed, 0 failed
test_doxbench_blank_reason.py 119 passed, 1 failed 120 passed, 0 failed

The unchanged set, base vs head, same form, node for node (0 newly red):

  • 12.5's 16 governed suites (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.
  • F5.2's files (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.
  • Over the 31 files: 49 red at the base, 10 at the head (all in 12.5's governed suites, unchanged), 39 fixed (all in T101's seven), 0 newly red.

Lone, tests/test_declared_exclusion.py (CI form: pip install -e ".[test]", openDox dede32b4 from the pin), at 6f157db7: 207 cases, 0 red, inside the whole-suite run below. The six other files still fail lone at collection on doc_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.

  • Push sweep: a push token in openxFactory's nightly_lane.py → ('nightly_lane.py', 'git push'). nightly_lane.py planted at this leg's src/openxdox/ too → "expected in exactly one of …". The resolver without openxFactory's home (test mutant) → the same.
  • Liveness: the serve asking doxbench_scope directly → the seam pin fails. A shape-valid copy of the question registered as the scope → the identity pin fails.
  • Save seam: a static swb-session.js import back in app.js; firstEditTransport dropped from the binding's exports; the route constant back in openDox's model; the refusalTransport() fallback gone. Each fails the test.
  • W6: a second manifest claiming 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.
  • Approval: the catalog read off the pre-trust factory (test mutant) → assert False is True. The trust never recorded → the same.

CI

  • validate at 6f157db7: success (run 37548131461). SonarCloud: success.
  • CI form locally at 6f157db7: selected=1165 passed=1161 skipped=4 failures=0 errors=0, above validate.yml's floors 1099/1095/4. The floors are untouched.
  • Copilot at 6f157db7: COMMENTED, "Needs a closer look", Findings: None. One thread in all, r4199422320 (Low, the release test's summary), fixed in 2fdbd96 and 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 (holder 6022291206). Its chain is now T101 → T073 → T074; T073 (#45) edits only the header and reasons block, a different hunk.

None of these is in 12.5's computed 16 or in F5.2's set.

Not done

  • Nothing owed by this slice.
  • Left as is, stale but harmless: tests/test_declared_exclusion.py's docstring (:28-30) and comment (:261) still name test_doxbench_blank_reason.py as a two-reason entry, and _CONTRACT_FILES keeps the checkout's contracts/manifest.yaml with its evidence case. That file is not T101's.

🤖 Generated with Claude Code

…; 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>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 19:07
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

This 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

Change Details Files
Repoint source and contract assertions to the composed repository layout after the carve.
  • Use carved-module resolvers for openDox-owned dashboard modules and gate routes.
  • Resolve released schemas and manifests through T095's composed contract farm and enforce single ownership across roots.
  • Add composed-tree resolution for the push-sweep modules retained by openxFactory.
tests/test_doxbench_threads.py
tests/test_doxbench_thread_wiring.py
tests/test_doxbench_knowledge_service.py
tests/test_doxchat_model_intake.py
Update behavioral pins to match the current scope, routing, transport, and trust seams.
  • Query liveness through the registered scope seam and supply contributed gate routes when computing capabilities.
  • Pin the save route and transport export to the session binding, including its refusal fallback.
  • Send exactly one Host header and validate post-approval trust before rebuilding the model catalog.
  • Expect broker-enrolled authentication kinds rather than the unregistered none kind.
tests/test_doxbench_thread_wiring.py
tests/test_doxbench_request_handling.py
tests/test_doxbench_transport.py
tests/test_doxchat_model_intake.py
Adjust the blank-reason exclusion and its textual-home invariant for the carved manifest ownership.
  • Drop the openxFactory manifest from the four-home admission-rule check while retaining the rule in the remaining three homes.
  • Change the declared exclusion entry to doc_health only and remove its obsolete explanatory note.
tests/test_doxbench_blank_reason.py
tests/declared_exclusion.yaml
Strengthen release-contract validation across the two owning roots.
  • Verify each released schema appears in exactly its designated owner manifest.
  • Recompute digests from the owner's spec-leg bytes and validate the immutable CHANGELOG and inventory records.
tests/test_doxchat_model_intake.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 Low severity

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.

Comment thread tests/test_doxchat_model_intake.py Outdated
brettheap and others added 2 commits October 6, 2026 19:11
…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>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 23:43
@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Final confidence depends on the composed cross-repository environment and its pinned external contracts.

Review effort: Balanced
Findings: None

@brettheap brettheap changed the title DRAFT: T101: the doxBench texts read the carved and composed homes (plan 038; T094's map R2-INV-R9) T101: the doxBench texts read the carved and composed homes (plan 038; T094's map R2-INV-R9) Oct 6, 2026
@brettheap
brettheap marked this pull request as ready for review October 6, 2026 23:47
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

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 @sourcery-ai review. Upgrade to get a review now.

@brettheap

Copy link
Copy Markdown
Contributor Author

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: CLEAN, rollup SUCCESS, nothing pending, 0 unresolved threads, and Copilot at 6f157db7 reads "🔵 Needs a closer look". The per-repo lander checks closing keywords and lands it.

@brettheap
brettheap merged commit 8b0401a into main Oct 6, 2026
4 checks passed
@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

LANDED — lane openxfactory-4, 2026-10-06T23:51:49Z, PR #48 → 8b0401a (opensoft/openXdox-code main; plain gate)

Brett: plan 038 RULED incl. lane openxfactory-4 lands every PR (#656 6013547504); Start release 2 (#656 6001702967)

brettheap added a commit that referenced this pull request Oct 7, 2026
Lane: openXfactory-3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 7, 2026
…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>
brettheap added a commit that referenced this pull request Oct 7, 2026
Lane: openXfactory-3

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 8, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants