Skip to content

refactor(layering): rank every root module so R5 sees through (root) - #3288

Merged
thymikee merged 3 commits into
mainfrom
refactor/ws4-root-zone-ranks
Oct 7, 2026
Merged

thymikee merged 3 commits into
mainfrom
refactor/ws4-root-zone-ranks

Conversation

@thymikee

@thymikee thymikee commented Oct 7, 2026 •

Copy link
Copy Markdown
Member

Summary

Closes #3280. (root) holds only bin.ts, cli.ts, daemon.ts, ranked above the spine.

  • scripts/layering/root-module-zones.ts declares every other src/*.ts module's zone; a test rejects undeclared, stale or duplicate rows.
  • Scope: this reduces (root) in the logical graph only. The modules stay under src/; classifying them is not collocating them. The table is a bridge: rows go as groups move into zone folders or packages, until a rename inside an owner needs no table edit while forbidden dependencies still fail. Outstanding moves start with Architecture WS9: physical root-pass moves for daemon-diagnostics-scope, runtime-command-surface, runtime-factory #3294.
  • New R80 zone-value-dag rejects zone-level static value cycles, invisible to R5 within one rank.
  • remote ⇄ daemon-server broken by moving the remote temp-path helpers into @agent-device/contracts/daemon-http, with shared extension normalization.
  • Dynamic imports stay out of R5/R80; reason recorded at R5.

sdk/ai-sdk rank 6 (cli 7): their entries publish the daemon client; platform-runtime-host ranks 8, so a static import of the lazy host is an R5 back-edge. R6 reports 10 type-only inversions, 7 previously hidden. 12 files.

Validation

At 66029dd82: pnpm check:affected --run passed all runnable checks.

Planted scripts/layering/check.ts runs (outputs in the review thread):

  • declaration with the old ranks: exactly the 2 known R5 inversions
  • empty declaration: 65 R5 back-edges plus an R80 cycle through (root)
  • pre-fix remote/daemon files: R80 daemon-server -> remote -> daemon-server
  • static host import from platform-runtime.ts or sdk/index.ts: R5

root-module-zones.test.ts pins the sdk rank and generates one static host importer per ranked zone.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Size Report

Metric Base Current Diff
Installed (including dependencies) 5.13 MB 5.13 MB -113 B
Package (unpacked) 5.13 MB 5.13 MB -113 B
Package (download) 1.54 MB 1.54 MB +13 B

Startup median (7 runs, lower is better):

Scenario Base Current Diff
CLI --version 32.9 ms 31.9 ms -1.0 ms
CLI --help 91.3 ms 92.6 ms +1.3 ms

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

All reported issues were addressed across 12 files

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread packages/contracts/src/daemon-http.ts Outdated
Comment thread scripts/layering/model.ts Outdated
@thymikee
thymikee force-pushed the refactor/ws4-root-zone-ranks branch from 603c570 to 4e00f4a Compare October 7, 2026 15:25
@thymikee

thymikee commented Oct 7, 2026

Copy link
Copy Markdown
Member Author

I reviewed 4e00f4a. The code looks right, and I found no blocking defect. All 19 checks pass, including the jobs that run the layering gate and cover contracts/daemon-http. There are no conflicts.

One design question before the label. I looked for a smaller design and mostly found none: each root module needs a declaration, the table is mostly data, R80 is required by the issue, and it reuses findValueImportCycles. The one smaller option is a named sdk -> daemon-client allowance instead of the rank-6 bump. Is that a better fit here, or do you prefer the rank? If you keep the rank, please also confirm that a static sdk -> platform-runtime-host import passes R13 and the eager-closure budgets.

I did not run check:layering or the planted-failure variants, so the R6 "7 inversions" count and the planted outputs come from the PR body. Posting that output would close this.

Not blocking: the PR body says the helpers moved "unchanged", but isRemoteTempArtifactPath now normalizes the extension, so you can reword the body. Both cubic-dev-ai threads are fixed at this commit, so you can resolve them: the extension normalization thread and the rank ordering thread.

@thymikee
thymikee force-pushed the refactor/ws4-root-zone-ranks branch from 4e00f4a to 5ddfa57 Compare October 7, 2026 17:01
@thymikee

thymikee commented Oct 7, 2026

Copy link
Copy Markdown
Member Author

Thanks for the review. Answers in order. Head is now 5ddfa570f, rebased onto origin/main 136eb63b7 with no conflicts; upstream added the daemon-entry budget and depgraph zone summaries.

1. Allowance or rank: I keep the rank, and the host invariant moves to the host's own declaration

Measured at 4e00f4a, over the gate's own edges:

  • sdk has exactly one rank-5 dependency: src/sdk/index.ts → src/agent-device-client.ts.
  • ai-sdk has the same single edge: src/ai-sdk/index.ts → src/agent-device-client.ts.
  • Their eager closures reach 7 daemon-client files and nothing in platform-runtime-host.
  • Every other cross-zone import from either zone is rank ≤ 4.

Why the rank, not an allowance. The SDK zones use no other rank-5 material. But that one edge is what the zone is for, not an exception. index.ts is the package's default entry, createAgentDeviceClient is its main export, and that export's eager closure is daemon-client. A rank says where a zone sits in the dependency order, and a zone that publishes the client sits above it.

An allowance would keep a rank that says the opposite and make the defining edge the exception:

  • It needs two entries today, sdk and ai-sdk.
  • It needs a new entry for every future SDK entry that publishes client surface, so legitimate edges would be reviewed as exceptions.
  • Its one real benefit would be blocking edges that rank 6 now allows but that should not exist.

Your R13 / eager-budget question found exactly such an edge. At 4e00f4a (Plant E below), a static src/sdk/index.ts → src/platform-runtime-operation-host.ts import passes R5, R13 and the eager-closure budgets:

  • The budgets cover workspace facades plus four hubs, not src/sdk/*.
  • R13 governs platform packages, not who imports the host.
  • The same plant also passes on origin/main 136eb63b7, so the gap predates this PR.

An allowance with sdk back at 4 would have caught that, but only for sdk, and only incidentally. daemon-client (rank 5, the same rank as the host) and cli (rank 7) could still import the host statically.

The invariant belongs to the host: every spine zone reaches it only through loadHost's import(). In 5ddfa570f, platform-runtime-host ranks 8, above every spine zone. (root) moves to 9 and still composes it.

  • A static host import is now an R5 back-edge from sdk, daemon-client, cli, platform-runtime and daemon-server. Plant E on 5ddfa570f reports sdk -> platform-runtime-host back-edge.
  • root-module-zones.test.ts now plants cli, daemon-client, sdk and platform-runtime importers of the host, and fails if the host rank goes back to 5.
  • The real tree stays clean, and R6 is unchanged at 10.

What rank 6 still allows that an allowance would not: other sdk modules importing other daemon-client modules. That is the SDK publishing client surface, which the package exports map and check:package already review. I don't think it needs an R5 exception.

If you still prefer the allowance, it's a small change: sdk/ai-sdk back to 4, plus two file-pair entries with a stale-entry check. The host would stay at 8 either way.

2. Evidence

Both blocks come from one script that runs check:layering, lists R6 with typeInversionPair over the gate's own edges, and plants each variant, reverting with git checkout. The tree is clean afterwards.

One correction to the old PR body: with an empty declaration the gate reports 65 R5 back-edges plus the R80 cycle, not 67. The 67 was measured while src/remote-temp-artifact-path.ts still existed, before the helpers moved into contracts. R6 is 10 file pairs in total: the 3 already on main, plus 7 that the old (root) zone hid.

Requested head 4e00f4a: Plant E passes every gate

HEAD 4e00f4a43

$ pnpm check:layering
ℹ tests 294
ℹ pass 294
ℹ fail 0
Layering guard: OK — 1837 source files satisfy R2 and contain no value-import cycles (both checked globally); the ranked target spine contains no back-edges and the zone graph no value-import cycle (R80); the ranked spine's type-only inversions hold at or under the merge-base 7dda0c2bf3 per zone pair (R6, 10 remaining); R14 sr…

R6 type-only inversions (file pairs), via typeInversionPair over the gate's own edges:

commands -> client: src/commands/command-surface.ts -> src/client/client-types.ts
commands -> client: src/commands/family/types.ts -> src/client/client-types.ts
commands -> daemon-client: src/commands/cli-runner.ts -> src/agent-device-client.ts
core -> platform-runtime-host: src/provider-device-runtime.ts -> src/platform-runtime-screen-recording-apple-runner-transport.ts
core -> platform-runtime: src/provider-device-runtime.ts -> src/platform-runtime.ts
mcp -> client: src/mcp/command-tools.ts -> src/client/client-types.ts
platform-runtime -> platform-runtime-host: src/platform-runtime-gateway.ts -> src/platform-runtime-managed-owner.ts
platform-runtime -> platform-runtime-host: src/platform-runtime/request-providers.ts -> src/platform-runtime-screen-recording-apple-runner-transport.ts
platform-runtime -> platform-runtime-host: src/platform-runtime/request-providers.ts -> src/platform-runtime-screen-recording-apple-transport.ts
plugins -> sdk: src/plugins/load.ts -> src/sdk/plugins.ts
total: 10

Plant A: root modules declared, sdk/ai-sdk back at rank 4

Layering guard: 2 violation(s)
  [R5 zero-back-edges] 2 violation(s):
    src/ai-sdk/index.ts:4 — ai-sdk -> daemon-client back-edge: src/ai-sdk/index.ts -> src/agent-device-client.ts. Move the shared contract below both owners.
    src/sdk/index.ts:1 — sdk -> daemon-client back-edge: src/sdk/index.ts -> src/agent-device-client.ts. Move the shared contract below both owners.

Plant B: empty root-module declaration (every root module back in (root))

Layering guard: 66 violation(s)
  [R5 zero-back-edges] 65 violation(s):
  [R80 zone-value-dag] 1 violation(s):
    src/agent-device-client.ts:59 — zone-level value-import cycle: (root) -> commands -> core -> (root) ((root) -> commands: src/agent-device-client.ts -> src/commands/command-flags.ts; commands -> core: src/commands/interaction/runtime/interactions.ts -> src/core/interaction-outcome.ts; core -> (root): src/core/interactors.ts -> src/provider-device-runtime.ts). Move the contract both zones read below both of them.

Plant C: pre-fix src/daemon/macos-app-lease.ts + src/remote/daemon-artifacts.ts restored from 7dda0c2bf

Layering guard: 1 violation(s)
  [R80 zone-value-dag] 1 violation(s):
    src/daemon/macos-app-lease.ts:10 — zone-level value-import cycle: daemon-server -> remote -> daemon-server (daemon-server -> remote: src/daemon/macos-app-lease.ts -> src/remote/daemon-artifacts.ts; remote -> daemon-server: src/remote/remote-request-diagnostics.ts -> src/daemon/session-artifact-paths.ts). Move the contract both zones read below both of them.

Plant D: static import './platform-runtime-operation-host.ts' in src/platform-runtime.ts

Layering guard: 2 violation(s)
  [R5 zero-back-edges] 1 violation(s):
    src/platform-runtime.ts:1 — platform-runtime -> platform-runtime-host back-edge: src/platform-runtime.ts -> src/platform-runtime-operation-host.ts. Move the shared contract below both owners.
  [R80 zone-value-dag] 1 violation(s):
    src/platform-runtime.ts:1 — zone-level value-import cycle: platform-runtime -> platform-runtime-host -> platform-runtime (platform-runtime -> platform-runtime-host: src/platform-runtime.ts -> src/platform-runtime-operation-host.ts; platform-runtime-host -> platform-runtime: src/platform-runtime-android-application-tools.ts -> src/platform-runtime-android-mechanics.ts). Move the contract both zones read below both of them.

Plant E: static import '../platform-runtime-operation-host.ts' in src/sdk/index.ts (layering guard incl. R13, then eager-closure budgets)

Layering guard: OK — 1837 source files satisfy R2 and contain no value-import cycles (both checked globally); the ranked target spine contains no back-edges and the zone graph no value-import cycle (R80); the ranked spine's type-only inversions hold at or under the merge-base 7dda0c2bf3 per zone pair (R6, 10 remaining); R14 sr…
$ pnpm vitest run scripts/__tests__/eager-closure-budgets.test.ts
Test Files  1 passed (1)
Tests  766 passed (766)

Tree after plants: 0 modified files

New head 5ddfa570f: Plant E is an R5 back-edge

HEAD 5ddfa570f

$ pnpm check:layering
ℹ tests 294
ℹ pass 294
ℹ fail 0
Layering guard: OK — 1837 source files satisfy R2 and contain no value-import cycles (both checked globally); the ranked target spine contains no back-edges and the zone graph no value-import cycle (R80); the ranked spine's type-only inversions hold at or under the merge-base 136eb63b7a per zone pair (R6, 10 remaining); R14 sr…

R6 type-only inversions (file pairs), via typeInversionPair over the gate's own edges:

commands -> client: src/commands/command-surface.ts -> src/client/client-types.ts
commands -> client: src/commands/family/types.ts -> src/client/client-types.ts
commands -> daemon-client: src/commands/cli-runner.ts -> src/agent-device-client.ts
core -> platform-runtime-host: src/provider-device-runtime.ts -> src/platform-runtime-screen-recording-apple-runner-transport.ts
core -> platform-runtime: src/provider-device-runtime.ts -> src/platform-runtime.ts
mcp -> client: src/mcp/command-tools.ts -> src/client/client-types.ts
platform-runtime -> platform-runtime-host: src/platform-runtime-gateway.ts -> src/platform-runtime-managed-owner.ts
platform-runtime -> platform-runtime-host: src/platform-runtime/request-providers.ts -> src/platform-runtime-screen-recording-apple-runner-transport.ts
platform-runtime -> platform-runtime-host: src/platform-runtime/request-providers.ts -> src/platform-runtime-screen-recording-apple-transport.ts
plugins -> sdk: src/plugins/load.ts -> src/sdk/plugins.ts
total: 10

Plant A: root modules declared, sdk/ai-sdk back at rank 4

Layering guard: 2 violation(s)
  [R5 zero-back-edges] 2 violation(s):
    src/ai-sdk/index.ts:4 — ai-sdk -> daemon-client back-edge: src/ai-sdk/index.ts -> src/agent-device-client.ts. Move the shared contract below both owners.
    src/sdk/index.ts:1 — sdk -> daemon-client back-edge: src/sdk/index.ts -> src/agent-device-client.ts. Move the shared contract below both owners.

Plant B: empty root-module declaration (every root module back in (root))

Layering guard: 66 violation(s)
  [R5 zero-back-edges] 65 violation(s):
  [R80 zone-value-dag] 1 violation(s):
    src/agent-device-client.ts:59 — zone-level value-import cycle: (root) -> commands -> core -> (root) ((root) -> commands: src/agent-device-client.ts -> src/commands/command-flags.ts; commands -> core: src/commands/interaction/runtime/interactions.ts -> src/core/interaction-outcome.ts; core -> (root): src/core/interactors.ts -> src/provider-device-runtime.ts). Move the contract both zones read below both of them.

Plant C: pre-fix src/daemon/macos-app-lease.ts + src/remote/daemon-artifacts.ts restored from 7dda0c2bf

Layering guard: 1 violation(s)
  [R80 zone-value-dag] 1 violation(s):
    src/daemon/macos-app-lease.ts:10 — zone-level value-import cycle: daemon-server -> remote -> daemon-server (daemon-server -> remote: src/daemon/macos-app-lease.ts -> src/remote/daemon-artifacts.ts; remote -> daemon-server: src/remote/remote-request-diagnostics.ts -> src/daemon/session-artifact-paths.ts). Move the contract both zones read below both of them.

Plant D: static import './platform-runtime-operation-host.ts' in src/platform-runtime.ts

Layering guard: 2 violation(s)
  [R5 zero-back-edges] 1 violation(s):
    src/platform-runtime.ts:1 — platform-runtime -> platform-runtime-host back-edge: src/platform-runtime.ts -> src/platform-runtime-operation-host.ts. Move the shared contract below both owners.
  [R80 zone-value-dag] 1 violation(s):
    src/platform-runtime.ts:1 — zone-level value-import cycle: platform-runtime -> platform-runtime-host -> platform-runtime (platform-runtime -> platform-runtime-host: src/platform-runtime.ts -> src/platform-runtime-operation-host.ts; platform-runtime-host -> platform-runtime: src/platform-runtime-android-application-tools.ts -> src/platform-runtime-android-mechanics.ts). Move the contract both zones read below both of them.

Plant E: static import '../platform-runtime-operation-host.ts' in src/sdk/index.ts (layering guard incl. R13, then eager-closure budgets)

Layering guard: 1 violation(s)
  [R5 zero-back-edges] 1 violation(s):
    src/sdk/index.ts:1 — sdk -> platform-runtime-host back-edge: src/sdk/index.ts -> src/platform-runtime-operation-host.ts. Move the shared contract below both owners.
$ pnpm vitest run scripts/__tests__/eager-closure-budgets.test.ts
Test Files  1 passed (1)
Tests  767 passed (767)

Tree after plants: 0 modified files

3–4

  • The body no longer says the helpers moved unchanged; it says the builder and recognizer now share extension normalization.
  • Both cubic threads (extension normalization and rank ordering) are resolved on GitHub.

pnpm check:affected --run passed every runnable check at 5ddfa570f, the pushed head. Not merging.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

All reported issues were addressed across 4 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread scripts/layering/root-module-zones.test.ts Outdated
@thymikee

thymikee commented Oct 7, 2026

Copy link
Copy Markdown
Member Author

Design follow-up on 5c90cdfcb, considering #3276 and #3287. The host-rank correction and the distinction between static and dynamic edges address the earlier enforcement question. My remaining concern is maintenance cost, not the SDK-rank choice.

ROOT_MODULE_ZONES lists individual filenames and adds missing/stale/duplicate checks. Its header also correctly says R2/R13/R76/R78 continue to use physical paths. That leaves two descriptions of ownership, and an ordinary root-file add/rename/delete must update a central gate table.

Please make the scope and intended end state explicit:

  • Say that (root) is now reduced in the logical graph classification. Most files remain physically under src/; this PR does not complete their collocation.
  • Treat the mapping as the necessary bridge for the existing layout. Prefer directory/package-derived ownership as coherent groups acquire physical homes, removing corresponding filename rows. Don't require a broad move in this PR or add another registry/approval mechanism.
  • Reconcile refactor(move): collocation batch 1 — allocator contract into managed-allocation #3287's ADR 0033 rows marked “move (root pass)” for daemon-diagnostics-scope.ts, runtime-command-surface.ts, and runtime-factory.ts. This PR classifies those files but does not move them. Record whether those moves remain outstanding or have been reconsidered, so closing the root-zone issue doesn't silently complete a different promise.

The useful completion criterion is that an internal rename within an owner eventually needs no central ownership-table edit, while a genuinely forbidden dependency still fails. More declarations alone should not be the long-term architecture.

thymikee and others added 3 commits October 7, 2026 19:38
…HTTP contract

The macos-app lease recognized a remote client's temp artifact path by value-importing
src/remote/daemon-artifacts.ts, while src/remote/ imports the daemon's session artifact paths:
remote and daemon-server formed a zone-level cycle. The path format (builder and recognizer)
is client/daemon wire vocabulary, so it moves verbatim into @agent-device/contracts/daemon-http,
which both sides already load; the daemon no longer loads the remote upload client to check a
path shape.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…uilder writes it

buildRemoteTempArtifactPath dotted a bare extension ('png' -> '.png') but
isRemoteTempArtifactPath stripped and re-appended the extension as given, so a path the
builder produced for 'png' failed the check for 'png'. Both now go through one
dottedExtension helper. Every production caller passes '.png' today, so no admitted path
changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…es (#3280)

R5 could not see through the unranked (root) zone: nine zones formed one value cycle through
it, and src/sdk/index.ts and src/ai-sdk/index.ts (rank 4) reached daemon-client (rank 5)
through src/agent-device-client.ts.

- scripts/layering/root-module-zones.ts declares the zone of every src/*.ts module, and
  targetDagZone reads it. (root) ranks above the spine (9) and holds only bin.ts, cli.ts and
  daemon.ts, so a ranked import of any undeclared root module is an R5 back-edge. New zones:
  daemon-contracts (2), command-runtime (3), platform-runtime (4, now including its private
  src/platform-runtime/ submodule) and platform-runtime-host (8: every spine zone reaches
  it only through loadHost's import(), so a static import of the lazy host is a back-edge
  from any of them; its facets read daemon session artifacts). core takes the two root
  modules it imports; daemon-client takes agent-device-client.ts.
- With that declaration and the old ranks, the gate reports exactly the two known inversions
  (sdk -> daemon-client, ai-sdk -> daemon-client). The published SDK entries must export a
  client that reaches the daemon with no injected transport, so no code change removes that
  dependency: sdk and ai-sdk move to rank 6 above daemon-client, cli to 7.
- R80 zone-value-dag projects static value imports onto zones and rejects any cycle, which
  catches same-rank pairs R5 cannot order.
- Dynamic imports stay out of R5 and R80; the reason is recorded at R5 in check.ts.

R6 now measures seven type-only inversions the unranked root hid (commands -> daemon-client,
core -> platform-runtime, core -> platform-runtime-host, plugins -> sdk, and three
platform-runtime -> platform-runtime-host types of lazily loaded host modules), ratcheted
equally at the merge-base.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@thymikee

thymikee commented Oct 7, 2026

Copy link
Copy Markdown
Member Author

Re: design follow-up. Applied in 66029dd82, rebased onto 0c1ebb33a; since 5c90cdfcb only wording changed. No new registry or approval mechanism.

1. Logical-only scope. It is stated in the ROOT_MODULE_ZONES header, the PR body's Scope bullet, and the §3 status note in docs/dependency-graph-findings.md:

This reduces (root) in the logical graph only: the declared modules still live directly under src/, and classifying them is not collocating them.

2. Bridge and completion criterion. Also in the header:

The table bridges that layout and should shrink. When a group moves into a folder named for its zone (src/command-runtime/, src/daemon-contracts/, ...) or into a package, topFolder derives the same zone and the group's rows are deleted. The end state: renaming a module within its owner needs no edit here, while a forbidden dependency still fails R5 or R80.

Every declared zone name is also a usable folder name, so moving a group changes no rank and no rule; its rows just disappear. The drift test's message now says to put a new module under its zone folder first, and only then add a row for anything still directly under src/.

3. #3287 reconciliation. I agree with the resolution: the three moves stay outstanding in #3294, and this PR says reclassification is not collocation. I have not touched #3287. ADR 0033 at 2a09430df still marks those rows "keep (reconsidered with #3288) … no move remains", so they need flipping to outstanding there.

One point to keep #3294 and ADR 0033 consistent: the owning location is the file's declared zone, not its consumer's folder. ADR 0033 is right that src/daemon/ would be an R5 back-edge:

  • daemon-registration-owner.ts (daemon-contracts, rank 2) imports daemon-diagnostics-scope.ts.
  • runtime.ts (command-runtime, rank 3) imports runtime-command-surface.ts and runtime-factory.ts.

The moves that fit are src/daemon-contracts/daemon-diagnostics-scope.ts and src/command-runtime/runtime-{command-surface,factory}.ts. Besides the rows in this table, no gate config keys on those three paths. The only other mention is a .fallowrc.json comment on a rule keyed to src/runtime.ts. So each move is import fixes plus deleting its row.

4. Coverage fix. This was already in 5c90cdfcb (cubic thread r4209803851) and is unchanged here. The test builds the static host importers from RANKED_ZONES (26 zones) and fails if the host drops to rank 5 or 7.

Validation: pnpm check:affected --run passed all runnable checks at 66029dd82, the pushed head (GitHub-only checks left to CI). Not merging.

@thymikee
thymikee merged commit 3b71fee into main Oct 7, 2026
19 checks passed
@thymikee
thymikee deleted the refactor/ws4-root-zone-ranks branch October 7, 2026 18:24
@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
PR Preview Action v1.8.1
Preview removed because the pull request was closed.
2026-10-07 18:25 UTC

@thymikee

thymikee commented Oct 7, 2026

Copy link
Copy Markdown
Member Author

The code in 66029dd looks good to me. The two fixes from my first review are in: the layering test now generates one host back-edge for every ranked zone instead of four hand-listed ones, and the rank table matches the host declaration comment. Your reasons for ranking over adding an sdk -> daemon-client allowance hold up, so I have no simplicity concern left. Moving the physical files (#3294) is what will shrink ROOT_MODULE_ZONES, and this PR does not need it.

Smoke Tests is still running on 66029dd and has not failed. The changes since the last green run are wording in a script header, a test message and a docs note. The only runtime hunks are the temp-path refactor in daemon-artifacts.ts and macos-app-lease.ts, and those are the same as the earlier heads where all 19 checks passed. I did not run check:layering, the generated test or the rank-5/7 mutation myself. I judged the regression coverage by reading the test and the rank table, and the check:affected pass is your report. There are no conflicts. The cubic-dev-ai threads on the generated host-importer test, the shared dottedExtension in daemon-http.ts, and the platform-runtime-host rank all look fixed at this head, so you can resolve them. Nothing else blocks merge except Smoke Tests finishing green.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Oct 7, 2026
thymikee added a commit that referenced this pull request Oct 7, 2026
…me folder

createAgentDeviceRuntime and the command-surface binding over it are the
in-process runtime assembly #3288 already classifies as command-runtime.
They now live under src/command-runtime/, where topFolder derives that
zone from the folder instead of per-file ROOT_MODULE_ZONES rows. Both
files move as one group: the surface file composes the factory's result,
and neither is importable from the other's consumers separately.
Importers (src/runtime.ts and the daemon runtime modules) re-point.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-human Valid work that needs human implementation, judgment, or maintainer merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Architecture WS4: close R5 blindness through unranked (root) zone

1 participant