II.
Page JSON
Structured · livepage:docs-specs-platform-gaps-phase1-rn-05-rename
WP-RN-05 record: Phase-1 package renames — the full §3.1/§3.2 matrix json
Inspect the normalized record payload exactly as the atlas UI reads it.
{
"id": "page:docs-specs-platform-gaps-phase1-rn-05-rename",
"_kind": "Page",
"_file": "wiki/docs/specs/platform-gaps/phase1/rn-05-rename.md",
"_cluster": "wiki",
"attributes": {
"nodeKind": "Page",
"sourcePath": "docs/specs/platform-gaps/phase1/rn-05-rename.md",
"sourceKind": "repo-docs",
"title": "WP-RN-05 record: Phase-1 package renames — the full §3.1/§3.2 matrix",
"displayName": "WP-RN-05 record: Phase-1 package renames — the full §3.1/§3.2 matrix",
"slug": "docs/specs/platform-gaps/phase1/rn-05-rename",
"articlePath": "wiki/docs/specs/platform-gaps/phase1/rn-05-rename.md",
"article": "\n# WP-RN-05 record: Phase-1 package renames — the full §3.1/§3.2 matrix\n\nExecuted 2026-09-29 on branch `phase1/rename-train` of `a5c-ai/fabric` (base `531975433` = `origin/staging`). Spec: `docs/specs/platform-gaps/15-private-isolation-rename.md` §3.1 (43 publishables), §3.2 (8 renamable private workspaces + the 8-shell retirement row), §3.4/§3.5 (env vars and directories do NOT change in RN-1), §4.3 (guards G1–G6) and \"WP-RN-05\"; intent `00-intent.md` D10 (major bump, no shims) and D17–D21; roadmap `50-roadmap-workpackages.md` Phase 1 / M1. Builds on the Phase-0 records `phase0/publish-guards.md` (selector deferral), `phase0/no-double-rename.md` (baseline oracle) and `phase0/scope-relock.md` (`@fabricstack`).\n\nThe public repository `a5c-ai/babysitter` was never written to: `gh api repos/a5c-ai/babysitter --jq .pushed_at` → `2026-09-16T19:59:50Z` at start and end (only GET calls were issued); `git remote -v` → `upstream no_push (push)`. Nothing was published to any registry, no tag was created, no PR was opened.\n\n## What changed\n\nEvery change is driven by the machine-readable matrix `scripts/lib/rename-spec.cjs` (which parses spec 15), never by a hand-typed list. **Directories do not move** (RN-3, WP-RN-10): every package keeps its current directory; only names, `publishConfig`, dependency edges, import specifiers, scripts, workflow invocations, the lockfile and versions change.\n\n| Surface | Change |\n|---|---|\n| 43 publishable manifests (§3.1) | `name` → `@fabricstack/<neutral name>`; `publishConfig` → `{ \"registry\": \"https://us-central1-npm.pkg.dev/boot-464019/fabric-npm/\" }` (no `access: \"public\"`, G1); `version` → `7.0.0` |\n| 8 renamable private workspaces (§3.2) | `@a5c-ai/kip-sdk`→`@fabricstack/memory`, `kradle-sdk`→`control-plane-sdk`, `kradle-cli`→`control-plane-cli`, `kradle-web`→`admin-console`, `kradle-jitsi-agent-sidecar`→`meeting-sidecar`, `atlas-webui`→`catalog-webui`, `genty-tui-plugins`→`console-tui-plugins`, `a5c-commander` (`apps/commander`)→`@fabricstack/ops-console`; `private: true` kept; versions → `7.0.0` (the §3.2 note \"rename rides RN-3\" for the commander is read as the *directory* move: the WP-RN-05 objective names all 8 workspaces) |\n| 8 retirement-listed shells (§3.2 last row, T-27) | names, versions and `private: true` untouched (`@a5c-ai/genty-{web,desktop,mobile-android,mobile-ios,tv-androidtv,tv-appletv,watch-watchos,watch-wearos}-app`); only their dependency edges on renamed packages were renamed and pinned (interaction rule 4) |\n| Internal dependency edges | every `dependencies`/`devDependencies`/`peerDependencies`/`optionalDependencies` entry naming a renamed package → new name, pinned exactly to `7.0.0` (also `packages/atlas/webui`'s former `\"@a5c-ai/atlas\": \"*\"` → `\"@fabricstack/catalog\": \"7.0.0\"`, and the root `\"@a5c-ai/adapters\": \"^6.0.0\"` → `\"@fabricstack/harness-sdk\": \"7.0.0\"`) |\n| Root `package.json` | `version` → `7.0.0`; every `--workspace=@a5c-ai/*` script invocation renamed; `workspaces` globs unchanged |\n| Lockstep | `scripts/sync-workspace-versions.mjs` now keys the synchronized family on the private scope from the root `fabric` block and was run with `--version 7.0.0`: `plugins/{babysitter,atlas}-unified/plugin.json`, `plugins/{babysitter,atlas}-unified/versions.json` (`sdkVersion`/`extensionVersion`; there is no root `versions.json` — review round 1 record correction) and the three marketplace manifests (`.agents/plugins`, `.claude-plugin`, `.cursor-plugin`) carry `7.0.0` |\n| `package-lock.json` | regenerated with `npm install --legacy-peer-deps` (never deleted): 50 `@fabricstack/*` workspace links, root `7.0.0`; the only `@a5c-ai/*` nodes left are the external dependency `@a5c-ai/compendium@0.1.1` (resolved from npmjs, not a workspace) and the 8 retired-shell links. The 64 `extraneous: true` nodes (`packages/agent-mux/*`, `packages/tula/*`, `packages/krate/*`, `packag../tula-platform`) are pre-existing at `531975433` (stale directories of an earlier machine) and are not in the install graph; no non-link node was added, removed or changed |\n| Import-specifier sweep | 4,399 replacements in 3,193 files across `packages/ apps/ library/ e2e-tests/ scripts/ .github/workflows/ action.yml vitest.config.ts tsconfig.json` and the tool-input documents `docs/generated/package-plugin-docs-coverage.json` and `docs/adapters/terminology-and-structure-gaps/binary-renames.md`; plus the two tracked `dist-types/` trees of the retired mobile shells (4 files) and, after restoring it, the retired desktop shell (5 files; see \"Incident\"). Regex: the 50 scoped old names, longest first, followed by a name boundary (`(?![A-Za-z0-9-])`), so `@a5c-ai/babysitter` never touches `@a5c-ai/babysitter-pi` and subpath imports (`@a5c-ai/atlas/catalog`) are renamed |\n| Hooks template name | `packages/adapters/hooks/cli/src/cli/adapter-loader.ts` gained `hooksAdapterPackageName(id)` = `@fabricstack/harness-hooks-<id>` with the one template rename of §3.1 rows 22–33 (`genty` → `agent-runtime`, mirrored by `rename-spec.cjs` `TEMPLATE_ID_RENAMES`); used by `adapter-loader`, `commands/doctor.ts`, `__tests__/packaging.test.ts` (and the `cli.test.ts` mock). The CLI still does not pin the Genty leaf (its `//deferred-dependency` note, FIX-005), so the mapping is encoded but not exercised at runtime |\n| Docs executed by CI | the three documents whose `npm run … --workspace=` commands `docs:snippets` executes (`docs/cli-examples.md`, `docs/v6-spec-and-roadmap/{v6-implementation-roadmap,testing-framework}.md`) were swept (27 replacements) so the documented commands resolve |\n\nCounts: `node scripts/lib/publishable-packages.cjs | jq length` → **43**, all `@fabricstack/*` (0 outside the scope); `git diff --stat` of the three commits: 65 + 3186 + tooling files.\n\n## Commands run (from `C:/work/fabric`)\n\n```text\nnode <scratch>/rename-train.cjs --apply --no-md # phase A manifests (rename-spec.cjs matrix), phase B sweep\nnode scripts/sync-workspace-versions.mjs --version 7.0.0 # lockstep (after pointing it at the private scope)\nnpm install --legacy-peer-deps # lockfile regeneration (24 s: added 50, removed 51, changed 1)\nnode scripts/ci/no-double-rename.cjs --write-baseline # 59 packages: 51 new names + 8 retired shells\nnpm run build:runtime && npm run build:observer && npm run build:cloud && npm run build:atlas && npm run build:kip\nnpm run build:adapters && npm run build:hooks-adapter && npm run build:kradle && npm run build:realtime-flow && npm run build:adapters-extensions && npm run build:kradle-web\nnpm run test:architecture && npm run test:sdk && npm run test:effect-baseline && npm run test:release-tooling\nnpm run test:publish-guards && npm run test:no-double-rename && npm run test:package-renames && npm run test:binary-renames\nnode scripts/release-version.cjs verify-manifests --version 7.0.0\n<orchestrator gate, verbatim — see \"Gates\">\n```\n\n## Tooling flips and the private-train flag decision\n\nSpec 15 §4.3 G1 requires the inventory selector to change \"in the same commit\" as the manifests. WP-RN-04 had implemented the RN-1 selector behind `FABRIC_PRIVATE_TRAIN=1`. This WP flips it:\n\n| Component | Now |\n|---|---|\n| `scripts/lib/registry-pin.cjs` `selectsForPublish` | unconditionally `private !== true && publishConfig.registry === <AR URL> && name in @fabricstack` — **the legacy opt-out (`FABRIC_PRIVATE_TRAIN=0`) was NOT kept**: a selector keyed on `publishConfig.access === \"public\"` selects zero packages after the rename, so an opt-out would be a trap, not a feature |\n| `scripts/lib/publishable-packages.cjs` | no `privateTrain` option; resolves the workspace globs before reading the registry config (an unsupported glob stays the first error) |\n| G2(b) (`manifestProblems`: `legacy-scope-name`, `publishable-outside-private-scope`) | unconditional over every manifest that can publish (retirement shells are private → exempt by construction) |\n| G2(d) (`scripts/lib/release-version.cjs` `collectVersionDivergences`) | unconditional: the synchronized family is `@fabricstack/*`; a legacy `@a5c-ai/*` dependency is a divergence **iff it is an internal name** (spec 15 §3.1/§3.2 current-name column via `rename-spec.cjs`) — the guard had been stricter than the spec text (\"internal dep\") and flagged the third-party `@a5c-ai/compendium` |\n| G6 (`scripts/verify-release-artifacts.mjs` `scope` step) | unconditional: any tarball that is not private-scope fails before install |\n| `scripts/ci/publish-isolation-guard.cjs` | manifest rules unconditional; `scripts/ci/fixtures/no-double-rename/` excluded from the real scan like its own fixtures (that gate's negatives carry public `@a5c-ai/*` manifests by design); workflow rules G2(c)/G3 still flag-gated |\n| `scripts/ci/bin-collision-guard.cjs` (G5) | `LEGACY_COLLISIONS` re-keyed on the renamed owners (`@fabricstack/orchestrator`+`orchestrator-sdk`, `harness-sdk`+`orchestrator-sdk`, `orchestrator-sdk`+`harness-hooks-cli`, `control-plane`+`control-plane-cli`); until the bin cutover a publishable private-scope package may still declare exactly the legacy bins of its own §3.1 row (\"Current package — bins\", now parsed by `rename-spec.cjs` as `currentBins`; the \"Bin(s)\" column as `newBins`) — reported as carry-over notices (33 on the tree), any other public-train or off-spec bin is still an error; `public-train-bin`/`bin-not-in-spec` apply to *publishable* owners only (private §3.2 workspaces such as `memory`'s `kip`/`kip-mcp` ship dev-only bins outside the spec column; they remain subject to `duplicate-bin`); `public-train-bins-drift` now compares `PUBLIC_TRAIN_BINS` with the spec-derived union (26 = 26) instead of the (now empty) live legacy inventory |\n| `FABRIC_PRIVATE_TRAIN=1` / `--private-train` | kept, with a narrowed meaning documented in `registry-pin.cjs`: assert the two surfaces still ahead in the train — the G5 bin end-state (WP-RN-06: tolerance retired, `spec-bins-missing`, `public-train-bin`, `bin-not-in-spec`) and the whole-tree workflow rules G2(c)/G3 (WP-RN-07). Default OFF for those; the inventory ignores it |\n| `scripts/check-package-metadata.cjs` (`guard:packages`) | public surfaces must pin `publishConfig.registry` and carry no `access`; \"managed by namespace\" = private scope; `RELEASE_MATRIX_SURFACES = []` with a tracked-gap comment — the inherited `publish-packages-from-tag.yml` publishes the public train to npmjs and by D19 may never name a `@fabricstack/*` package, so it cannot be the private inventory's release surface; **WP-RN-07 must register the AR publish workflow there** to make the coverage gate live again |\n| `scripts/check-package-renames.cjs` (`test:package-renames`) | rewritten against spec 15 (was: a 20-row parser of `docs/adapters/terminology-and-structure-gaps/package-renames.md` that already failed on staging with \"found 13\"): every §3.1/§3.2 unit carries its new name in its current directory, every retirement-listed shell keeps its name, and no old name survives in the RN-1 sweep scope (structured scan of `package-lock.json` ignoring `extraneous` nodes; `.md/.mdx/.mdc` are WP-RN-13's) except an explicit, reasoned allowlist (`ALLOWED_LEGACY_REFERENCES`) |\n| `scripts/lib/gateway-engine-floor.cjs` | its private copy of the old `access === \"public\"` selector made the gateway-reachability walk return nothing; it now uses `selectsForPublish` |\n| `scripts/docs-code-samples-check.cjs` | guard fixture trees are excluded from its package-name map: the WP-RN-04 G5 fixtures carry `@fabricstack/orchestrator-sdk` and shadowed the real SDK once it took that name |\n| Five package-level `verify:release` gates (`packages/adapters/{core,extensions}`, `packages/genty/{tui,ui}`, `packages/kradle/installer`) | assert `publishConfig.registry === <root fabric.privateRegistry>` and no `access` instead of `access === \"public\"` |\n\n## Tests adjusted, and why\n\n- `scripts/__tests__/publishable-packages.test.mjs`: census is the 43 spec 15 names; a new test pins inventory == §3.1 new-name column, each in its pre-RN-3 directory; entries must pin AR, carry no `access`, be at `7.0.0`; the git-tracked oracle uses the G1 predicate.\n- `scripts/ci/publish-guards.test.mjs`: the two \"selector deferral\" tests became \"selector (RN-1)\" tests (43 `@fabricstack` entries, CLI byte-identical to the G1 oracle with the flag unset, `=1` and `=0`; a legacy or public-access manifest is never selected); G1 rules: a publishable legacy manifest always trips `legacy-scope-name`, a private legacy shell does not; G2(d) test uses a genuinely legacy internal name (built with `join()` so a future sweep cannot rewrite it) and proves `@a5c-ai/compendium` is not flagged, plus the real tree has zero divergences; the eight workflows that now name `@fabricstack/*` workspaces are the expected `touchingPrivate` set and the three legacy npmjs workflows are asserted NOT swept; G5: tolerance keyed on new names, carry-over notices present, under the flag all four bin rules trip; G6: unconditional.\n- `scripts/ci/no-double-rename.test.mjs`: the baseline oracle is now the §3.1/§3.2 **new-name** column plus the 8 retirement-listed names (59), `@fabricstack/ops-console` replaces `a5c-commander`; an old name in a spec directory now also trips `legacy-scope-new-unit` (it is no longer baselined); the \"moved elsewhere\" notice case uses the new name; the spec-10 allow-rule test cites an existing unit by a `join()`-built legacy name. Gate fix: the \"baselined at another directory\" notice was unreachable for private-scope names (it sat in the legacy-scope branch) — now independent of scope.\n- `scripts/ci/fixtures/no-double-rename/positive/baseline-unchanged`: `@fabricstack/catalog` at `packages/atlas`, pinned to AR (renamed in place); `publish-guards/g1/positive/pinned/packages/legacy-unit`: `@a5c-ai/legacy` is now `private: true` (the retirement-list shape; a publishable legacy unit is no longer a positive); `publish-guards/g5/negative/public-train-bin`: `@fabricstack/orchestrator` declares `atlas` (another row's bin) instead of its own carry-over `babysitter`, so the negative still trips in default mode.\n- `scripts/__tests__/fixtures/fix011/*` (9 verifier fixtures): renamed to `@fabricstack/fix011-<case>` and pinned to AR — G6 refuses any other scope before the steps those tests exercise; `verify-release-artifacts.test.mjs` reads reports as `fabricstack__<id>.json`.\n- `scripts/__tests__/{release-version,release-promotion,verify-published-release,publish-package-from-tag}.test.mjs`: synthetic fixture repositories carry the root `fabric` block (the selector and G2(d) read it) and private-scope, AR-pinned fixture packages (`@fabricstack/fixture-*`) instead of `@a5c-ai/fixture-*` / `@fixture/*` with `access: public` (which the selector no longer selects). The `npm`-stub tests among them cannot run on Windows (pre-existing); CI verifies them.\n- `scripts/__tests__/release-matrix.test.mjs`: `EXPECTED_HOOKS_LEAVES` sorted (`harness-hooks-agent-runtime` sorts first now); leaf prefix `@fabricstack/harness-hooks-`.\n- `packages/adapters/hooks/cli/src/__tests__/{cli,packaging}.test.ts`: `hooksAdapterPackageName`.\n- Four `release-verification.test.ts` fixtures (adapters/core, genty/tui, genty/ui, kradle/installer): `publishConfig.registry` instead of `access: public`.\n\n## Residuals of `grep -rn \"@a5c-ai/\" --include=package.json --include=*.ts --include=*.tsx --include=*.js --include=*.mjs --include=*.cjs --include=*.json -l packages apps scripts library | sort`\n\nVerbatim (with a full install) the command also lists installed third-party copies under `node_modules/` (e.g. the public `@a5c-ai/*` packages pulled in by `@a5c-ai/compendium`) and `dist/`/`dist-types/`/`.next/` build output — 364 such files at the time of the full install; excluding those, the **64** tracked-relevant files and their one-line justification:\n\n| Files | Token(s) | Why it stays |\n|---|---|---|\n| `packages/genty/{desktop,mobile-android,mobile-ios,tv-androidtv,tv-appletv,watch-watchos,watch-wearos,web}-app/package.json` (8) | their own names | spec 15 §3.2 retirement list (T-27): \"retired, not renamed\" |\n| `scripts/check-architecture-boundaries.cjs`, `scripts/bump-version.mjs`, `scripts/ci/no-double-rename.cjs` (`RETIRED_UNITS`), `scripts/ci/fixtures/no-double-rename/baseline-packages.json`, `scripts/__tests__/publishable-packages.test.mjs` | retired-shell names | classify / baseline / assert the retirement list |\n| `packages/babysitter-sdk/src/harness/install.ts` (+ `__tests__/install.test.ts`), `packages/kradle/installer/src/sdk/agents.ts`, `packages/kradle/installer/tests/plans.test.ts`, `packages/adapters/extensions/src/__tests__/piAgentEndHook.regression.test.ts`, `scripts/docs-freshness-report.cjs`, `scripts/fix-broken-latest-tags.mjs`, `scripts/test-atlas-plugins.mjs`, `library/processes/shared/{db-agent-explore,local-db-build,n-strikes-escalation,scene-context-builder,source-discovery}.js`, `library/specializations/meta/assimilation/harness/shared-assimilation.js` | `@a5c-ai/babysitter-<harness>`, `@a5c-ai/babysitter-library`, `@a5c-ai/atlas-<harness>` | public marketplace plugin package ids installed into third-party harnesses from npmjs — the blueprints/plugins surface (spec 15 §3.4 last paragraph; RN-4, WP-RN-11); not in the §3.1/§3.2 matrix |\n| `packages/atlas/webui/{package.json,components/ThemeToggle.tsx,components/ui/{badge,button,input}.tsx}`, `scripts/lib/release-version.cjs` (comment), `scripts/ci/publish-guards.test.mjs` | `@a5c-ai/compendium` | external npm dependency (non-link lockfile node), not a fabric package |\n| `packages/adapters/gateway/examples/push-relay/package.json` (`@a5c-ai/adapters-push-relay-example`), `packages/adapters/gateway/src/static/webui-server.ts` (`@a5c-ai/genty-webui`, optional external package), `packages/adapters/tasks/.copilot/mcp-config.json` + `.cursor/mcp.json` (`npx -y @a5c-ai/breakpoints-adapter`, harness config for a public npm package), `packages/kradle/installer/src/terraform/root.ts` (`@a5c-ai/cloud` in a generated README header), `packages/atlas/src/catalog/catalog.test.ts` (`@a5c-ai/catalog` catalogue id) and `{consumer-imports,final-removal,workspace-metadata}.contract.test.ts` (`@a5c-ai/agent-catalog` legacy alias also in root `vitest.config.ts`), `packages/kip-sdk/src/__tests__/kip-mcp.test.ts` (prose glob `@a5c-ai/genty-*` in a `describe` title), `packages/observer-dashboard/src/lib/__tests__/ensure-local-deps.test.ts` (`@a5c-ai/fake-dep`), `scripts/check-package-metadata.cjs` (`@a5c-ai/agent-core`, an old-name tombstone check), `scripts/docs-qa-config.cjs` (`@a5c-ai/voice-adapter`, comment) | names that were never in the matrix | not fabric workspace packages; nothing to rename in RN-1 |\n| `scripts/ci/fixtures/publish-guards/{g1/negative/foreign-scope-on-ar,g1/negative/legacy-scope-private-train,g1/positive/pinned,g6/negative/legacy-scope-on-ar}/**`, `scripts/ci/fixtures/no-double-rename/negative/{legacy-scope-new-unit,old-name-in-spec-dir}/**`, `scripts/ci/fixtures/public-push-guard/positive/package-metadata.json` | `@a5c-ai/{mis-scoped,legacy,new-unit,atlas,positive-fixture}` | guard fixtures that must present legacy-scope inputs to prove the guards reject (or, for the push guard, ignore) them |\n| `scripts/ci/publish-guards.test.mjs`, `scripts/ci/no-double-rename.test.mjs`, `scripts/__tests__/release-matrix.test.mjs` | legacy sample inputs (`@a5c-ai/{legacy,mis-scoped,acp,atlas,contracts,new-unit,genty-web-app}`; `release-matrix`: workflow-text fixtures `@a5c-ai/{anchor,only-in-a-comment,real-package,trailing-comment,after-a-positional-count}` and the old hooks prefix in a comment) | tests of the legacy-rejection paths and of comment-stripping over workflow text |\n| `scripts/ci/publish-isolation-guard.cjs`, `scripts/ci/check-spec10-names.cjs`, `scripts/lib/rename-spec.cjs`, `scripts/check-package-renames.cjs`, `scripts/ci/bin-collision-guard.cjs` | the scope string / current-name parsing / documented pre-rename owners | the guards that encode the legacy scope on purpose |\n| `scripts/publish-package-from-tag.mjs`, `scripts/sync-atlas-plugin-repos.mjs`, `scripts/sync-external-plugin-repos.mjs` | `name.startsWith('@a5c-ai/')` | the public-train publish helper (WP-RN-07 retargets it; its comments were swept) and the external plugin-repo sync (marketplace surface, WP-RN-11) |\n\nDeliberately outside the RN-1 sweep (not residual defects): `.github/workflows/{publish-packages-from-tag,fix-npm-tags,live-stack-published}.yml` (legacy npmjs train; naming `@fabricstack/*` there would be a G2(c) finding — WP-RN-07), `packages/atlas/graph/**` (105 YAML + 169 Markdown catalogue records describing the public ecosystem by its public npm names, which D17 keeps), all Markdown/`.mdc` (992 hits: READMEs, skills, process-library docs — WP-RN-13), `plugins/` and `blueprints/` (WP-RN-11), `docs/` other than the three snippet-executed pages and the two tool inputs, `docs-site/`, `.a5c/`, `.claude/`, `.codex/`, `.changeset/` (removed by WP-PKG-02), `e2e-tests/**/*.md`, `video/`.\n\n## Gates (from `C:/work/fabric`)\n\nOrchestrator gate, verbatim, final run after every change: `N=$(node scripts/lib/publishable-packages.cjs | jq -r 'length') && test \"$N\" = \"43\" && node scripts/lib/publishable-packages.cjs | jq -r '.[] | (.name // .)' | grep -vc \"^@fabricstack/\" | grep -qx 0 && node scripts/release-version.cjs verify-manifests --version 7.0.0 && node scripts/ci/publish-isolation-guard.cjs --self-test && node scripts/ci/no-double-rename.cjs --self-test && node scripts/ci/public-push-guard.cjs && npm run guard:packages && echo RN05-PASS` →\n\n```text\nAll synchronized manifests are at release version 7.0.0.\npublish-isolation-guard self-test: 14/14 assertions passed\npublish-isolation-guard: self-test passed; repository scan clean (101 files, 0 findings, 8 legacy-train notice(s))\nok repository scan — 59 manifest(s), 0 findings, 0 notice(s), 0 new unit(s)\nno-double-rename self-test: 10/10 assertions passed (7 negative, 2 positive fixtures; retirement list: 8 units)\npublic-push-guard: scanned 215 files, 0 finding(s), 0 suppressed\n✓ package-integrity guard passed (lockfile sync, native bindings, metadata, arch boundaries).\nRN05-PASS\n```\n\nSuites (Node built-ins only, green after the last change): `test:publish-guards` 17/17; `test:no-double-rename` 16/16; `scripts/__tests__/publishable-packages.test.mjs` 8/8; `gateway-engine-floor.test.mjs` 6/6; `test:package-renames` → \"51 renamed packages (43 publishable + 8 private) and 8 retirement-listed shells; 113 allowed legacy reference file(s)\"; `test:binary-renames` → \"single-bin policy (G5) holds over 32 workspace bin names\"; `test:effect-baseline` 13/13 (with the full install; see the environment note); `check-spec10-names --self-test` passed; `check:sdk-command-templates` / `check:plugin-commands` synchronized; `docs:snippets` and `docs:lint:style` clean, `docs:freshness` fails only on the pre-existing stale-date list (identical on pristine staging).\n\nBuilds (full install, sequential): `build:runtime` (459 s), `build:cloud`, `build:atlas`, `build:kip`, `build:adapters`, `build:hooks-adapter`, `build:kradle`, `build:realtime-flow`, `build:adapters-extensions`, `build:kradle-web` — all PASS.\n\n**Environment (Windows, this machine) — cannot pass here, CI verifies:** `build:observer` fails with `Cannot find module '../lightningcss.win32-x64-msvc.node'`, and `test:sdk` / `test:architecture` (vitest) with `Cannot find module './rolldown-binding.win32-x64-msvc.node'`. The lockfile carries no Windows native bindings (only `lightningcss-linux-x64-gnu`; its non-link nodes are byte-identical to `origin/staging`, so this is not a rename effect); `.github/workflows/ci.yml` works around the same gap on Linux with `npm install --no-save @rolldown/binding-linux-x64-gnu lightningcss-linux-x64-gnu …`, and there is no Windows counterpart in the repository. An attempt to mirror it (`npm install --no-save` of the win32 bindings, 5 min) still left them absent, and the `npm ci` started to restore a faithful install was stopped by the session for low system memory, leaving `node_modules` partial (`typescript`, `next`, `yaml`, `effect`, `@effect/vitest`, `patch-package` missing). Consequently the vitest-based suites (`test:sdk`, `test:architecture`, the four package-level `release-verification.test.ts`, the hooks-CLI `packaging`/`cli` tests) and the five package-level `verify:release` gates could not be re-run on this machine after the last edits to them; the CI `test` / `observer-dashboard` / `workspace-coverage` jobs (ubuntu) verify them on the pushed commits. `package-lock.json` was never modified by any of this (md5 `ab51e0832bee9404974780a1329a8898` before and after). The same partial install had removed `eslint`, which `.githooks/pre-commit` (`scripts/validate-library-js-syntax.cjs --staged`) requires; for the third commit the hook was run unchanged, with `eslint@9.39.5` resolved from an isolated scratch install through `NODE_PATH` (nothing added to the repository tree, no hook bypassed; the commit stages no `library/*.js`, so the hook reports \"No matching library JavaScript files to validate\").\n\n`test:release-tooling` (`node --test scripts/__tests__/*.test.mjs`): pristine staging on this machine → **111 pass / 37 fail of 148** (the FIX-010/FIX-011 workflow-shape tests and the `npm`-on-PATH stub tests, Windows-impossible; list saved with the WP output). After all changes, with the partial install → 103 pass / 46 fail of 149: the 37 pristine failures, 5 environmental ones (`yaml` / `tsx` missing: three `verify-release-artifacts` workflow-shape tests, and the two hooks-leaf packed-install tests, which additionally 404 against npmjs for `@fabricstack/catalog@7.0.0` until the first AR publication — M1 exit criterion 1), and 4 caused by this WP that were then fixed (`@a5c-ai/fixture-*` regexes; `legacyInternalNameSet()` fallback when spec 15 is not reachable from a copied `scripts/lib`). Re-verified per file afterwards: `release-version.test.mjs` + `verify-published-release.test.mjs` → **zero failures that are not in the pristine list**, and four pristine failures now pass (`FIX-001: the release version may be carried by the publication workspace release plan`, `FIX-001: the same tag re-tags the release version once the workspace is synchronized to it`, `FIX-010: channel promotion is a separate job …`, `FIX-010: the publish workflow calls the published-consumer workflow …`). `release-promotion.test.mjs` cannot load in the partial install (`yaml`); with the full install its only non-pristine failure was one of the four fixed regexes. No test was deleted or skipped.\n\n## Incident during execution (recorded for honesty)\n\nA read-only comparison against pristine staging was done through a temporary `git worktree` at `/tmp/fabric-staging` with a `node_modules` link back into this checkout; `git worktree remove --force` followed that link into the `node_modules/@a5c-ai/genty-desktop-app` workspace junction and emptied `packages/genty/desktop-app/` (14 tracked files) at 11:34. It was restored from `531975433`, re-swept (5 `.tsx` files) and re-pinned before anything was pushed; `git ls-files -d` is empty and no other path was affected (checked against `git ls-files -d`, the lockfile and `node_modules` link health). No worktree or link is left behind.\n\n## Gate-B clarifications for the owner (review round 1)\n\n- **`@fabricstack/ops-console` (`apps/commander`)**: spec 15 §3.2 (line 137) says the commander rename \"rides RN-3\", while the binding WP-RN-05 objective (line 293) is \"the 8 renamable private workspaces carry their `@fabricstack/*` names\" and §3.2 lists exactly eight renamable rows including the commander. This record reads \"rides RN-3\" as the *directory* move (`apps/commander` did not move) and executed the *name* rename here; the adversarial review judged this the only reading consistent with the WP text, not a deviation. If the owner intended the name to wait for RN-3 as well, the revert is the one manifest line plus its two dependency edges.\n- **`scripts/check-package-metadata.cjs` `RELEASE_MATRIX_SURFACES = []`**: the release-coverage gate checks nothing until WP-RN-07 registers the AR publish workflow there (the inherited `publish-packages-from-tag.yml` publishes the public train and by D19 may never name a `@fabricstack/*` package). Carried on the WP-RN-07 checklist together with the tag prefix (`babysitter/` → `fabric/`) and the retargeting of the three legacy npmjs workflows.\n\n## Review round 1 (adversarial review, score 74 → fixes)\n\nFindings and what changed are recorded per work package: B1/M2/M3/M6 in `rn-06-bins.md` (\"Review round 1\"), M1 and the CI job split in this file's commits (`f8224cae7` release-tooling job split; `7fdb9becd` publish.yml hooks-leaf names + templated-legacy-name guard in `publish-isolation-guard.cjs` and `check-package-renames.cjs`, the latter now wired into the publish-isolation job), M4 in `pkg-01-exports.md`, M5 in `rn-06-bins.md`. Two further split-token rename casualties of the RN-1 sweep (which matched whole `@a5c-ai/<name>` tokens and therefore could not see `path.join(\"@a5c-ai\", \"babysitter-sdk\")`) were fixed in `ed01994df`: `packages/babysitter-sdk/src/cli/main/runSupport.ts` and `packages/genty/platform/.../planProcess/validation.ts` linked the process-local SDK fallback under the legacy name, where `require(\"@fabricstack/orchestrator-sdk\")` never looked. The ADR `docs/v6-spec-and-roadmap/decisions/ADR-001-agent-platform-seam-contract.md` (asserted by the architecture gate) was swept in `b76f636dd`.\n\n## Not done here (by design)\n\n- Bins keep their legacy names (WP-RN-06 renames them, retires the G5 carry-over tolerance and the four pinned collisions, and flips `spec-bins-missing` on by default).\n- The release machinery (`publish-packages-from-tag.yml`, `fix-npm-tags.yml`, `live-stack-published.yml`, `publish.yml` publication steps, `scripts/publish-package-from-tag.mjs`, tag prefix `fabric/`) is WP-RN-07's; it must also register the AR publish workflow in `check-package-metadata.cjs` `RELEASE_MATRIX_SURFACES` and retire the G2(c)/G3 flag.\n- Docs, READMEs, skills, blueprints/plugins, Atlas catalogue data: WP-RN-13 / WP-RN-11.\n- The first AR publication of the 43 renamed packages (M1 exit criterion 1): until it happens, clean-consumer verifications that install a renamed dependency from a registry cannot pass (see \"Gates\").\n",
"documents": []
},
"outgoingEdges": [],
"incomingEdges": [
{
"from": "page:docs",
"to": "page:docs-specs-platform-gaps-phase1-rn-05-rename",
"kind": "contains_page"
}
]
}