Repository navigation
Conversation
|
The review of 87969a2 found no blocking code problems, but the evidence is not yet complete, so this is not ready to merge. I could not check the bundle equivalence (124/124 modules), the test-name discovery comparison, or the wire-compat 0-change result, because the scripts and outputs are not in the PR. This review did not build or run any gates, so I could not confirm that the typecheck failures stop at the 39 residue test files. CI shows no checks on this stacked draft. By your own account, Before merge, land 11a-4, re-run the move on top of it and retarget the base. Then show typecheck and Not blocking, and you can take or leave these: (1) the generated export map in packages/daemon/package.json publishes 68 test-only subpaths, including Could you settle the façade now, once 11a-4 lands and the move script can be re-run, instead of recording importer reach? That would mean exporting only the 16 subpaths that production or scripts use, publishing test data as named |
Façade per the #3546 review: - the two internal/* suites move in-package: session-open-surface splits its two buildOpenResult cases into packages/daemon/src (the root-side resolveRequestedOpenSurface case stays root where its module lives), and interaction-touch-response splits its ten pure builder cases in-package (on the sanctioned in-package command-surface fake) while the six --verify handler cases stay root-side where the real command surface they exercise lives; - R11 refuses ./testing/* for every non-test importer (root files, package-internal files, and vi.mock sites), with a pattern-matching named-by-exports check so scripts/ sites resolve through the entry; - DAEMON_SOURCE_ROOT in tracked-sources.ts becomes the one root every layering filter keys on (11 sites, check.ts:588 included); - docs/agents trims duplication to stay inside the 40 000-byte budget after the path lengthening (39 948 measured, headroom kept for PR 10). Generated with assistance.
87969a2 to
fdf8b0c
Compare
… repo Non-blocking #3546 review items: renamedSince gains an optional head ref and an explicit unlimited diff.renameLimit (a clone-side limit silently disables inexact detection, which the daemon move is for every file it touched); wire-compat's tagToHeadRenames now flips the shared helper instead of re-implementing the diff. A fixture-repo test covers git mv + edit plus a hostile renameLimit, in both directions the gates consume. Generated with assistance.
|
Size Report
Startup median (7 runs, lower is better):
|
fdf8b0c to
3424798
Compare
Façade per the #3546 review: - the two internal/* suites move in-package: session-open-surface splits its two buildOpenResult cases into packages/daemon/src (the root-side resolveRequestedOpenSurface case stays root where its module lives), and interaction-touch-response splits its ten pure builder cases in-package (on the sanctioned in-package command-surface fake) while the six --verify handler cases stay root-side where the real command surface they exercise lives; - R11 refuses ./testing/* for every non-test importer (root files, package-internal files, and vi.mock sites), with a pattern-matching named-by-exports check so scripts/ sites resolve through the entry; - DAEMON_SOURCE_ROOT in tracked-sources.ts becomes the one root every layering filter keys on (11 sites, check.ts:588 included); - docs/agents trims duplication to stay inside the 40 000-byte budget after the path lengthening (39 948 measured, headroom kept for PR 10). Generated with assistance.
… repo Non-blocking #3546 review items: renamedSince gains an optional head ref and an explicit unlimited diff.renameLimit (a clone-side limit silently disables inexact detection, which the daemon move is for every file it touched); wire-compat's tagToHeadRenames now flips the shared helper instead of re-implementing the diff. A fixture-repo test covers git mv + edit plus a hostile renameLimit, in both directions the gates consume. Generated with assistance.
Façade per the #3546 review: - the two internal/* suites move in-package: session-open-surface splits its two buildOpenResult cases into packages/daemon/src (the root-side resolveRequestedOpenSurface case stays root where its module lives), and interaction-touch-response splits its ten pure builder cases in-package (on the sanctioned in-package command-surface fake) while the six --verify handler cases stay root-side where the real command surface they exercise lives; - R11 refuses ./testing/* for every non-test importer (root files, package-internal files, and vi.mock sites), with a pattern-matching named-by-exports check so scripts/ sites resolve through the entry; - DAEMON_SOURCE_ROOT in tracked-sources.ts becomes the one root every layering filter keys on (11 sites, check.ts:588 included); - docs/agents trims duplication to stay inside the 40 000-byte budget after the path lengthening (39 948 measured, headroom kept for PR 10). Generated with assistance.
… repo Non-blocking #3546 review items: renamedSince gains an optional head ref and an explicit unlimited diff.renameLimit (a clone-side limit silently disables inexact detection, which the daemon move is for every file it touched); wire-compat's tagToHeadRenames now flips the shared helper instead of re-implementing the diff. A fixture-repo test covers git mv + edit plus a hostile renameLimit, in both directions the gates consume. Generated with assistance.
3424798 to
e00a91f
Compare
|
Move re-run on top of 11a-4 ( |
|
Re-ran the whole move on top of 11a-4 (
|
|
Three CI fixes at e00a91f, each at its cause:
|
The review could not find the scan the PR body reported, and the previous ad-hoc copy under-reported edges: its single alternation bridged `import|export … [\s\S]*? from`, so a vi.mock() specifier sitting between an importOriginal type-import and the file's next static from clause was swallowed by the earlier match and never reported. Five mocks of root platform-runtime modules went unnoticed under it. This scan matches every specifier form independently — statement-anchored static import/export, side-effect import, dynamic import()/require(), vi.mock/doMock/unmock/importMock/importActual/importOriginal with string or template-literal arguments, and importOriginal<typeof import()> — and exits 1 on any relative edge leaving src/daemon. Run: node scripts/daemon-edge-residue-scan.mjs. 11b's R11 package-boundary rule (#3546) makes it permanent once the daemon is its own package.
Façade per the #3546 review: - the two internal/* suites move in-package: session-open-surface splits its two buildOpenResult cases into packages/daemon/src (the root-side resolveRequestedOpenSurface case stays root where its module lives), and interaction-touch-response splits its ten pure builder cases in-package (on the sanctioned in-package command-surface fake) while the six --verify handler cases stay root-side where the real command surface they exercise lives; - R11 refuses ./testing/* for every non-test importer (root files, package-internal files, and vi.mock sites), with a pattern-matching named-by-exports check so scripts/ sites resolve through the entry; - DAEMON_SOURCE_ROOT in tracked-sources.ts becomes the one root every layering filter keys on (11 sites, check.ts:588 included); - docs/agents trims duplication to stay inside the 40 000-byte budget after the path lengthening (39 948 measured, headroom kept for PR 10). Generated with assistance.
… repo Non-blocking #3546 review items: renamedSince gains an optional head ref and an explicit unlimited diff.renameLimit (a clone-side limit silently disables inexact detection, which the daemon move is for every file it touched); wire-compat's tagToHeadRenames now flips the shared helper instead of re-implementing the diff. A fixture-repo test covers git mv + edit plus a hostile renameLimit, in both directions the gates consume. Generated with assistance.
88f6e42 to
b03b59e
Compare
|
Re-run on 11a-4: base is now |
The review could not find the scan the PR body reported, and the previous ad-hoc copy under-reported edges: its single alternation bridged `import|export … [\s\S]*? from`, so a vi.mock() specifier sitting between an importOriginal type-import and the file's next static from clause was swallowed by the earlier match and never reported. Five mocks of root platform-runtime modules went unnoticed under it. This scan matches every specifier form independently — statement-anchored static import/export, side-effect import, dynamic import()/require(), vi.mock/doMock/unmock/importMock/importActual/importOriginal with string or template-literal arguments, and importOriginal<typeof import()> — and exits 1 on any relative edge leaving src/daemon. Run: node scripts/daemon-edge-residue-scan.mjs. 11b's R11 package-boundary rule (#3546) makes it permanent once the daemon is its own package.
|
Reviewed b03b59e. It fixes the mutation-lane failure from the earlier review, and I found no new code problem that needs a change before merge. All 43 checks pass. The PR still conflicts with its base. Not blocking, take or leave: the new wildcard entry at packages/daemon/package.json:98 is the first in the repo. The gates that read the exports map look up exact keys, so Could Next step: re-run the move on 4fb9cb3 to clear the conflict, and settle in the ADR 0033 amendment whether |
The review could not find the scan the PR body reported, and the previous ad-hoc copy under-reported edges: its single alternation bridged `import|export … [\s\S]*? from`, so a vi.mock() specifier sitting between an importOriginal type-import and the file's next static from clause was swallowed by the earlier match and never reported. Five mocks of root platform-runtime modules went unnoticed under it. This scan matches every specifier form independently — statement-anchored static import/export, side-effect import, dynamic import()/require(), vi.mock/doMock/unmock/importMock/importActual/importOriginal with string or template-literal arguments, and importOriginal<typeof import()> — and exits 1 on any relative edge leaving src/daemon. Run: node scripts/daemon-edge-residue-scan.mjs. 11b's R11 package-boundary rule (#3546) makes it permanent once the daemon is its own package.
Façade per the #3546 review: - the two internal/* suites move in-package: session-open-surface splits its two buildOpenResult cases into packages/daemon/src (the root-side resolveRequestedOpenSurface case stays root where its module lives), and interaction-touch-response splits its ten pure builder cases in-package (on the sanctioned in-package command-surface fake) while the six --verify handler cases stay root-side where the real command surface they exercise lives; - R11 refuses ./testing/* for every non-test importer (root files, package-internal files, and vi.mock sites), with a pattern-matching named-by-exports check so scripts/ sites resolve through the entry; - DAEMON_SOURCE_ROOT in tracked-sources.ts becomes the one root every layering filter keys on (11 sites, check.ts:588 included); - docs/agents trims duplication to stay inside the 40 000-byte budget after the path lengthening (39 948 measured, headroom kept for PR 10). Generated with assistance.
… repo Non-blocking #3546 review items: renamedSince gains an optional head ref and an explicit unlimited diff.renameLimit (a clone-side limit silently disables inexact detection, which the daemon move is for every file it touched); wire-compat's tagToHeadRenames now flips the shared helper instead of re-implementing the diff. A fixture-repo test covers git mv + edit plus a hostile renameLimit, in both directions the gates consume. Generated with assistance.
…attern module resolveWorkspaceSpecifier (layering model) mirrors Node's longest-prefix pattern semantics and is the single expansion owner for the layering edges, the depgraph, mutation ownership, and the Stryker alias table — a pattern key held as a literal matched nothing, so every concrete ./testing/<dir>/ import resolved to nowhere in those gates and could miss its vi.mock in the mutation sandbox (#3546 review). Aliases now emit exact entries before capture-group patterns, matching Vite's first-match order. R11's test-data refusal keys on the ./testing/ namespace, not a pattern entry, so narrowing the surface to exact keys cannot smuggle a fixture past the test-file rule. ADR-0033 amendment records the settled policy.
a4c6208 to
0b9d8d0
Compare
A subpath only tests import is not production surface (#3546 review): the scan of every import and vi.mock site outside the package names exactly 16 subpaths with production/script consumers — the move-map set — while the other 72 are test-only, so they move under ./testing/<module> with their importers re-spelled. R11's test-file refusal already guards the whole ./testing/ namespace, so root production code can no longer import daemon internals like ./interaction/internal/types at all.
…nd the alias table namedByExports now calls resolveWorkspaceSpecifier instead of its private prefix scan, and the Stryker alias table orders its Vite first-match list to Node's precedence — exact entries, then patterns by prefix length descending — with a test asserting the alias a probe hits equals resolveWorkspaceSpecifier's target for EVERY export key of every workspace package. The ADR-0033 amendment says what actually owns what: the resolver owns the rules, the alias table inherits its order. (#3546 review round 3)
The inline targets map gave `@agent-device/demo/testing/*` the target `packages/demo/src/*.ts` while the planted manifest declares `./src/shadow/*.ts`, so both patterns filled `testing/handlers/x` to the same path and the cross-check passed whichever alias fired (#3546 review). Aligned to the manifest's shadow tree, the two spellings resolve differently and a shortest-prefix resolver fails the second assertion — bite-proved by flipping the sort to ascending, which now fails exactly the overlap case and passes nothing else about it. Generated with assistance.
|
Re-run on 11a-4: base is |
|
Re-run on the updated 11a-4: base is |
Pure codemod: git mv src/daemon -> packages/daemon/src (670 files), inbound imports rewritten to @agent-device/daemon/<subpath> specifiers with the export facade split up front (16 named production/script entries plus one ./testing/* pattern entry for test-file importers), generated manifest and composite tsconfig, root/examples project references, and the exists-at-head path-literal sweep across code, docs, and ADRs (historical text keeps its original path). Reproducible with node /tmp/11b-move-v2.mjs on a clean tree. Generated with assistance.
…daemon package Hand-written retargets the move requires: R11 gains a vi.mock/doMock/mockActual/ unmock/importActual literal sweep (the AST parser never visits call expressions yet the loader resolves those specifiers); ratchet-reference and wire-compat gain git-rename canonicalization so a bulk git mv cannot zero a ratchet or outrun the released ledger; rule/config paths (stryker, di-seams, .fallowrc, fallow-health and test-file-size baselines, oxlint) retargeted; new URL seams re-anchored. Deletes scripts/daemon-edge-residue-scan.mjs: it measured daemon escape edges while src/daemon was still root code, and R11 owns that invariant permanently once the daemon is a package (run once before deletion: 0 edges). Post-move seam fixes: the replay-repair and session-open-runtime suites dropped their root runtime-hints/apple-application-tools vi.mock tunnels — 11a-4's port fakes already cover those ports through composition — and the device-inventory root test installs its fake tool provider through the production withAppleToolProvider scope instead of a package-internal module mock. Generated with assistance.
Façade per the #3546 review: - the two internal/* suites move in-package: session-open-surface splits its two buildOpenResult cases into packages/daemon/src (the root-side resolveRequestedOpenSurface case stays root where its module lives), and interaction-touch-response splits its ten pure builder cases in-package (on the sanctioned in-package command-surface fake) while the six --verify handler cases stay root-side where the real command surface they exercise lives; - R11 refuses ./testing/* for every non-test importer (root files, package-internal files, and vi.mock sites), with a pattern-matching named-by-exports check so scripts/ sites resolve through the entry; - DAEMON_SOURCE_ROOT in tracked-sources.ts becomes the one root every layering filter keys on (11 sites, check.ts:588 included); - docs/agents trims duplication to stay inside the 40 000-byte budget after the path lengthening (39 948 measured, headroom kept for PR 10). Generated with assistance.
Amends the collocation/extraction ADR with the 11b decision: named exports for production/script consumers only, one ./testing/* pattern entry that R11 refuses for non-test importers, internal modules reached only by in-package tests, and the daemon-request wire-types move noted as the follow-up. Generated with assistance.
… repo Non-blocking #3546 review items: renamedSince gains an optional head ref and an explicit unlimited diff.renameLimit (a clone-side limit silently disables inexact detection, which the daemon move is for every file it touched); wire-compat's tagToHeadRenames now flips the shared helper instead of re-implementing the diff. A fixture-repo test covers git mv + edit plus a hostile renameLimit, in both directions the gates consume. Generated with assistance.
Generated with assistance.
… own config The fixture committed only its base with run-scoped -c identity flags, so every later commit a caller makes (the pad commit in the hostile-renameLimit case) resolves identity from the runner's global config and dies with 'Author identity unknown' on CI. Write user.name/user.email/commit.gpgsign into the temp repo instead so all commits are self-contained.
The move swapped the SUT to '@agent-device/daemon/daemon-stop' while the test mocked the './testing/*' pattern alias. Vitest resolves both to one file in the unit lane, so it passed there, but the mutation lane aliases only the manifest's exact export entries (tracked-manifests), so inside the Stryker sandbox the mock specifier resolved to a phantom id, the real module loaded, and the dry run failed on zero cleanup calls. Mock the exact specifier the SUT imports; the type import follows so the pair cannot drift.
…rowing the facade Collapses the ./testing/* wildcard the export map carried: the 82 production modules reached from root tests through it become named subpaths (one spelling per module), and fixtures keep their ./testing/ spelling as named entries or per-folder ./testing/<dir>/* patterns that expose only __tests__ folders.
…attern module resolveWorkspaceSpecifier (layering model) mirrors Node's longest-prefix pattern semantics and is the single expansion owner for the layering edges, the depgraph, mutation ownership, and the Stryker alias table — a pattern key held as a literal matched nothing, so every concrete ./testing/<dir>/ import resolved to nowhere in those gates and could miss its vi.mock in the mutation sandbox (#3546 review). Aliases now emit exact entries before capture-group patterns, matching Vite's first-match order. R11's test-data refusal keys on the ./testing/ namespace, not a pattern entry, so narrowing the surface to exact keys cannot smuggle a fixture past the test-file rule. ADR-0033 amendment records the settled policy.
…lacing it CodeQL flagged String#replace's first-occurrence semantics: Node fixes the exports target to exactly one `*`, so the splice is exact by construction and the intent reads off the index.
…t moved The teardown closure test still walked srcRoot + daemon/session-teardown.ts, so all three of its cases ENOENTed once the move landed; it now derives its root from DAEMON_SOURCE_ROOT so a future daemon move cannot strand it again. Swept the remaining literals that referred to files existing at head: the platform-policy planted daemon paths (the mechanics-facet allow entry named a daemon test that now lives at handlers/__tests__/session.test.ts), the device-lanes unit-test sample, the fallowrc test-consumer citation (the target-evidence test moved to packages/selectors), the contracts wait-runtime and maestro session-test-runtime citations (both moved out of the daemon earlier), and the CHECKLIST activation claim belongs to interaction-capture-disclosure.test.ts. Citations to files that never existed at the move's base or are historical captures were left alone.
A subpath only tests import is not production surface (#3546 review): the scan of every import and vi.mock site outside the package names exactly 16 subpaths with production/script consumers — the move-map set — while the other 72 are test-only, so they move under ./testing/<module> with their importers re-spelled. R11's test-file refusal already guards the whole ./testing/ namespace, so root production code can no longer import daemon internals like ./interaction/internal/types at all.
…nd the alias table namedByExports now calls resolveWorkspaceSpecifier instead of its private prefix scan, and the Stryker alias table orders its Vite first-match list to Node's precedence — exact entries, then patterns by prefix length descending — with a test asserting the alias a probe hits equals resolveWorkspaceSpecifier's target for EVERY export key of every workspace package. The ADR-0033 amendment says what actually owns what: the resolver owns the rules, the alias table inherits its order. (#3546 review round 3)
The codemod had re-spelled the named-entry assertion to a ./testing/ specifier, which the fixture manifest does not name in that shape, and a compiled site skips resolution — so the [] it asserted passed even for a spelling no entry exports. Restore the fixture's named ./session-store spelling and assert [] in both compiled modes: only the uncompiled pass can report 'not named', so its [] is the non-vacuity proof. Bite-proved: probing an unexported spelling fails exactly that case.
…t-first The exports-semantics cross-check iterates the REAL manifest keys, whose declaration order happens to hide a missing patterns.sort — deleting it left every lane test green. Plant the hostile order instead: a sandbox package declaring ./testing/* before ./testing/handlers/*, targets that fill to different trees so the probe names which alias fired, and check that the first-matched alias equals resolveWorkspaceSpecifier's longest-prefix target. Bite-proved: removing patterns.sort from workspace-aliases.ts fails exactly the new case; restoring it passes 5/5.
The inline targets map gave `@agent-device/demo/testing/*` the target `packages/demo/src/*.ts` while the planted manifest declares `./src/shadow/*.ts`, so both patterns filled `testing/handlers/x` to the same path and the cross-check passed whichever alias fired (#3546 review). Aligned to the manifest's shadow tree, the two spellings resolve differently and a shortest-prefix resolver fails the second assertion — bite-proved by flipping the sort to ascending, which now fails exactly the overlap case and passes nothing else about it. Generated with assistance.
|
Re-run on the new #3544 head ( Range-diff vs the previous lineage ( Acceptance at the new head:
|
What this is
PR 11b of the daemon-extraction plan: an atomic move of
src/daemon/intopackages/daemon/src/as the new workspace package@agent-device/daemon, with every mechanical path rewrite, the rule/config/doc retargets the move requires, and the export façade the #3546 review asked to settle in this PR. Re-run from a hard reset on 11a-4 (refactor/daemon-runtime-fakes@ 980c484 — the re-synced #3544 head, tree-identical to its pre-resync push; the stack sits on current main via #3519 @ df0af2a and #3517 @ e615de3); base retargeted accordingly. Main's daemon-side changes (#3536's/rpcbackstop test + server changes, #3547's minted-per-producerref, #3549's vitest 5 syntax, and the rest) are base content the move absorbs: the codemod moved 669 files, 763 inbound import sites.Commit topology
refactor(move)— pure codemod: 669 filesgit mv'd, 763 inbound import sites rewritten (16 named production/script subpaths + one./testing/*pattern entry decided by the importing file's path), generated manifest + composite tsconfig, root/examples project references, and the exists-at-head path-literal sweep over code/docs/ADRsrefactor(gates)— R11vi.mocksweep, ratchet + wire-compat rename canonicalization, rule fixture re-anchoring (synthetic coordinates), config retargets (stryker, di-seams,.fallowrc, baselines),new URLre-anchors, seam fixes (dead rootvi.mocktunnels dropped — 11a-4 fakes those ports; device-inventory test moved onto the productionwithAppleToolProviderscope; ownership-scan roots extended overpackages/daemon/src); deletesscripts/daemon-edge-residue-scan.mjs— run once before deletion (0 edges), R11 owns that invariant nowrefactor(daemon)— the façade: twointernal/*suites split into the package, R11 refuses./testing/*for non-test importers (unit-tested + bite-proved),DAEMON_SOURCE_ROOTadopted by all filter sites, docs/agents trimdocs(adr)— façade policy amendment to ADR 0033chore(gates)—renamedSincehead-ref + renameLimit, wire-compat uses it, fixture-repo rename testchore(gates)— format re-flowtest(gates)— fixture-repo git identity +commit.gpgsignin its own config (CI fix)fix(test)— daemon-stop test mocks the SUT's exact@agent-device/daemon/daemon-stopspecifier (mutation-lane resolution)refactor(daemon)— façade narrowed per the second review: the 82 production modules root tests reached through the wildcard become named subpaths (one spelling each); fixtures keep./testing/spelling as 25 named entries + four per-folder./testing/<dir>/*patterns exposing only__tests__folders; 150 files re-spelledfix(gates)—resolveWorkspaceSpecifierowns exports-pattern expansion once for the layering edges, depgraph, mutation ownership, and the Stryker alias table (capture-group aliases, exact-first ordering); R11's test-data refusal keys on the./testing/namespace, not a pattern entry; ADR 0033 amendment updatedfix(gates)— pattern alias splices at its known*index (CodeQLString#replacefirst-occurrence finding)refactor(daemon)— test-only reach no longer defines production surface: the 72 named entries whose only consumers (import +vi.mocksweep) are tests move to named./testing/<module>entries, 133 files re-spelled; 16 production subpaths remainrefactor(gates)—namedByExportsdelegates toresolveWorkspaceSpecifier; the alias table orders its Vite first-match list to Node precedence (exact, then patterns by prefix length desc) with a cross-semantics test over every export key (the ADR/amendment hunks of this commit are already base content after the rebase, so it lands as 1 file)test(gates)— the named-entry seam proves the specifier resolves (owner note 1): restores the fixture's@agent-device/daemon/session-storespelling and asserts[]in compiled and uncompiled mode, so an unexported spelling can no longer pass vacuously; bite-provedtest(gates)— proves the alias table orders overlapping patterns longest-first (owner note 2): a sandbox manifest declares./testing/*before./testing/handlers/*with targets that fill to different trees; deletingpatterns.sortfails exactly this case; bite-provedAcceptance evidence (head a4c6208 on base 980c484 — every item re-run on this lineage)
pnpm typecheck→ 0 errors.check:layering: green — 319 rule tests pass; guard summary reports R11 holds 28 packages behind 543 exported subpaths with zero undeclared or relative-tunnel routes — EMPTY residue. (The residue scan measured 0 daemon→root edges on the move commit before its supersession by R11.)pnpm depgraph+ edge scan → 0 edges frompackages/daemon/srcinto rootsrc/.vi.mock, and type-only import through@agent-device/daemon/testing/*each fire R11; a relative tunnel intopackages/daemon/srcfires; a named production subpath does not fire. The./testing/refusal is additionally pinned byscripts/layering/package-boundaries-facade.test.ts(4 tests).daemon-registration-owner.test.tsswaps 6-for-6 parametrized titles embedding pid/Date.now()stamps;eager-closure-budgets.test.tsgrows 854 → 1,031 rows — the suite'stest.forentry-surface expansion over the new shape (the daemon package's export subpaths are newly discovered entry surfaces; the session-teardown parameter retargeted to the moved file) — plus the new rename-detection fixture test from this branch's own gates commit. After folding those, every remaining test name occurs exactly the same number of times on both sides — no test lost, gained, or silently relocated.tsdown --sourcemapbuilt on base and head; foldingpackages/daemon/src/back ontosrc/daemon/: daemon-entry closure 124 modules = 124 modules, identical set; whole-build first-party source multiset 1,574 = 1,574 instances, identical.check:daemon-wire-compat→191 declarations, 0 changed, 0 removed, 0 added, 0 movedagainst v0.21.27.pnpm check:package: the publishable package is sound.pnpm check:fallow: clean.check:affected --run: exit 0 — blast-radius analysis over the full diff.gate mutation --modules kernel-errors --shard 1/5: lane passes (94.74%, 72/76 killed, 0 harness errors; envelope pass recorded at pre-parent-swap SHA bf8a98610615, whose tree hash is byte-identical to this head, scope 1,277/1,277 files; scores advisory per gate(mutation): ratchet graduates on stability alone — a 28.75% score can lock in as the permanently gated floor #1457).workspace-aliases.test.ts+config.test.ts: 11/11 pass incl. the cross-semantics alias test over every export key and the two new bite-proved seams. lint + gate-manifest: clean (57 checks / 27 lanes).The façade (settled here, per review)
./testing/entries + 4 per-folder fixture patterns. Every module has exactly one spelling; nothing is reachable two ways../testing/is the whole test-only surface: fixture files (./testing/__tests__/<fixture>), fixture-folder patterns (target templates reconstruct__tests__folders only), and production modules root tests drive (./testing/<module>). R11 refuses the namespace for any non-test importer — files, package-internal sites, andvi.mock/doMock/importActual— so root production code cannot import daemon internals (./interaction/internal/typeset al.) at all.resolveWorkspaceSpecifier(scripts/layering/model.ts) implements Node's exports rules (exact first, longest prefix, suffix fills the target*) and owns the layering edges, depgraph, mutation ownership, and R11's named-surface check; the Stryker alias table orders its Vite first-match list to that precedence, and a test asserts the alias hit equals the resolver's target for every export key of every workspace package — a pattern-exported module names the same module id in every lane.