page:docs-specs-platform-gaps-phase1-rn-05-rename
WP-RN-05 record: Phase-1 package renames — the full §3.1/§3.2 matrix reference
Executed 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).
WP-RN-05 record: Phase-1 package renames — the full §3.1/§3.2 matrix
Executed 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).
The 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.
What changed
Every 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.
| Surface | Change |
|---|---|
| 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 |
| 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) |
| 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) |
| 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") |
Root package.json | version → 7.0.0; every --workspace=@a5c-ai/* script invocation renamed; workspaces globs unchanged |
| 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 |
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 |
| 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 |
| 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 |
| 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 |
Counts: 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.
Commands run (from `C:/work/fabric`)
node <scratch>/rename-train.cjs --apply --no-md # phase A manifests (rename-spec.cjs matrix), phase B sweep
node scripts/sync-workspace-versions.mjs --version 7.0.0 # lockstep (after pointing it at the private scope)
npm install --legacy-peer-deps # lockfile regeneration (24 s: added 50, removed 51, changed 1)
node scripts/ci/no-double-rename.cjs --write-baseline # 59 packages: 51 new names + 8 retired shells
npm run build:runtime && npm run build:observer && npm run build:cloud && npm run build:atlas && npm run build:kip
npm 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
npm run test:architecture && npm run test:sdk && npm run test:effect-baseline && npm run test:release-tooling
npm run test:publish-guards && npm run test:no-double-rename && npm run test:package-renames && npm run test:binary-renames
node scripts/release-version.cjs verify-manifests --version 7.0.0
<orchestrator gate, verbatim — see "Gates">Tooling flips and the private-train flag decision
Spec 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:
| Component | Now |
|---|---|
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 |
scripts/lib/publishable-packages.cjs | no privateTrain option; resolves the workspace globs before reading the registry config (an unsupported glob stays the first error) |
G2(b) (manifestProblems: legacy-scope-name, publishable-outside-private-scope) | unconditional over every manifest that can publish (retirement shells are private → exempt by construction) |
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 |
G6 (scripts/verify-release-artifacts.mjs scope step) | unconditional: any tarball that is not private-scope fails before install |
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 |
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 |
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 |
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 |
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) |
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 |
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 |
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" |
Tests adjusted, and why
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 noaccess, be at7.0.0; the git-tracked oracle uses the G1 predicate.scripts/ci/publish-guards.test.mjs: the two "selector deferral" tests became "selector (RN-1)" tests (43@fabricstackentries, CLI byte-identical to the G1 oracle with the flag unset,=1and=0; a legacy or public-access manifest is never selected); G1 rules: a publishable legacy manifest always tripslegacy-scope-name, a private legacy shell does not; G2(d) test uses a genuinely legacy internal name (built withjoin()so a future sweep cannot rewrite it) and proves@a5c-ai/compendiumis not flagged, plus the real tree has zero divergences; the eight workflows that now name@fabricstack/*workspaces are the expectedtouchingPrivateset 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.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-consolereplacesa5c-commander; an old name in a spec directory now also tripslegacy-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 ajoin()-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.scripts/ci/fixtures/no-double-rename/positive/baseline-unchanged:@fabricstack/catalogatpackages/atlas, pinned to AR (renamed in place);publish-guards/g1/positive/pinned/packages/legacy-unit:@a5c-ai/legacyis nowprivate: true(the retirement-list shape; a publishable legacy unit is no longer a positive);publish-guards/g5/negative/public-train-bin:@fabricstack/orchestratordeclaresatlas(another row's bin) instead of its own carry-overbabysitter, so the negative still trips in default mode.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.mjsreads reports asfabricstack__<id>.json.scripts/__tests__/{release-version,release-promotion,verify-published-release,publish-package-from-tag}.test.mjs: synthetic fixture repositories carry the rootfabricblock (the selector and G2(d) read it) and private-scope, AR-pinned fixture packages (@fabricstack/fixture-*) instead of@a5c-ai/fixture-*/@fixture/*withaccess: public(which the selector no longer selects). Thenpm-stub tests among them cannot run on Windows (pre-existing); CI verifies them.scripts/__tests__/release-matrix.test.mjs:EXPECTED_HOOKS_LEAVESsorted (harness-hooks-agent-runtimesorts first now); leaf prefix@fabricstack/harness-hooks-.packages/adapters/hooks/cli/src/__tests__/{cli,packaging}.test.ts:hooksAdapterPackageName.- Four
release-verification.test.tsfixtures (adapters/core, genty/tui, genty/ui, kradle/installer):publishConfig.registryinstead ofaccess: public.
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`
Verbatim (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:
| Files | Token(s) | Why it stays |
|---|---|---|
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" |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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) |
Deliberately 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/.
Gates (from `C:/work/fabric`)
Orchestrator 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 →
All synchronized manifests are at release version 7.0.0.
publish-isolation-guard self-test: 14/14 assertions passed
publish-isolation-guard: self-test passed; repository scan clean (101 files, 0 findings, 8 legacy-train notice(s))
ok repository scan — 59 manifest(s), 0 findings, 0 notice(s), 0 new unit(s)
no-double-rename self-test: 10/10 assertions passed (7 negative, 2 positive fixtures; retirement list: 8 units)
public-push-guard: scanned 215 files, 0 finding(s), 0 suppressed
✓ package-integrity guard passed (lockfile sync, native bindings, metadata, arch boundaries).
RN05-PASSSuites (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).
Builds (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.
**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").
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.
Incident during execution (recorded for honesty)
A 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.
Gate-B clarifications for the owner (review round 1)
- **
@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/commanderdid 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. - **
scripts/check-package-metadata.cjsRELEASE_MATRIX_SURFACES = []**: the release-coverage gate checks nothing until WP-RN-07 registers the AR publish workflow there (the inheritedpublish-packages-from-tag.ymlpublishes 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.
Review round 1 (adversarial review, score 74 → fixes)
Findings 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.
Not done here (by design)
- 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-missingon by default). - The release machinery (
publish-packages-from-tag.yml,fix-npm-tags.yml,live-stack-published.yml,publish.ymlpublication steps,scripts/publish-package-from-tag.mjs, tag prefixfabric/) is WP-RN-07's; it must also register the AR publish workflow incheck-package-metadata.cjsRELEASE_MATRIX_SURFACESand retire the G2(c)/G3 flag. - Docs, READMEs, skills, blueprints/plugins, Atlas catalogue data: WP-RN-13 / WP-RN-11.
- 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").