Repository navigation
Assert the merged navigation tree after the package split equals the pre-split tree (objectstack#14553 ruling C half) #1456
Description
Activity
- addedpm:queueReady for the PM dispatch loopReady for the PM dispatch loop
on Sep 2, 2026 First-touch grading →
pm:blocked+ typeTask. ⛔ Notpm:queue: the thing this card compares against does not exist yet.Graded by the
repo:hotcrmseat, R18, as the card asks. ⛔ The ruling is not narrowed or re-litigated — this is sequencing, not scope.The premise check
The card says to compose the split packages and deep-compare the merged navigation tree against the pre-split tree, describing "hotcrm's navigation conversion (hotcrm#1449, 17 nodes)". Measured on
origin/main@c73b496b:top level: .changeset .claude .github AGENTS.md apps assets content docs e2e objectstack.config.ts objectstack.manifest.json package.json scripts src test tsconfig.json vitest.config.ts packages/: (does not exist) composeStacks / navigationContributions — every hit: docs/architecture/module-split-plan.md docs/architecture/module-split-inventory.json .changeset/module-boundary-inventory-and-split-plan.md⇒ hotcrm is still one package. Those two identifiers appear only in plan documents, never in code. And #1449 is not a conversion — its PR is
docs(architecture): module-boundary inventory and split plan for the ADR-0130 multi-package artifact, and it landed exactly three files: a plan, an inventory JSON, and a changeset. The 17 nodes are planned contributions, ⛔ not converted ones.⇒ There is nothing to compose and no post-split tree to compare, so a dispatch today would end at
premise_still_valid: falsebefore writing a line. Blocking it is the honest state, and it costs nothing: the ruling stands and fires the moment the split lands.⭐ One thing I checked because it would have changed the grading, and it does not
My first read was that this card is urgent rather than blocked — that the pre-split baseline is a perishable asset that vanishes when the split lands, so someone must capture it now even if the comparison waits.
That is wrong, and the card had already closed it: it offers the baseline as "a fixture captured from the last single-package build, or computed from the single-package definition on the same commit". The second form is reconstructible from git at any time. ⇒ Nothing perishes, and there is no carve-out worth queuing ahead of the split. Recording the check because "capture it before it's gone" is exactly the argument that would have justified splitting this card, and it does not hold.
Blocker
Blocked-by: objectstack-ai/objectstack#14122— the multi-package epic, written into the body so the unlock sweep can see it.⚠️ Named precisely because it matters for whoever unblocks this: no hotcrm-side card tracks the split conversion itself. #1448 (the inventory) is closed, #1449 (the plan) is merged, and nothing in this repo's backlog carries "perform the split". So this card is blocked on work that has a plan and an epic but no consumer-side tracker. ⇒ When the split is scheduled, a hotcrm card for it should be filed and this one re-pointed at it; until then the epic is the most honest blocker available.On unblocking
The acceptance criteria as written are good and need no change — order-sensitive, group-sensitive, plus a positive control that mutates one
groupto a non-existent id and confirms red. ⭐ That last one is the part that matters most here, because the defect objectstack#14553 measured is silent relocation: without an ablation, a test that merely passes proves nothing about whether it would have caught the relocation.
Generated by Claude Code
- addedci/cdCI plumbing and the verification pipelineCI plumbing and the verification pipelineand removedpm:queueReady for the PM dispatch loopReady for the PM dispatch loop
on Sep 2, 2026 objectstack-fleet commented
on Sep 25, 2026 ContributorMore actionsrepo:hotcrmseat,session_01X8U3asekbiC7yWoEPWR4Dg· stock re-triage group 3 (maintainer-confirmed ten-card group; maintainer reply verbatim: 「同意」) · 2026-09-25T02:19ZClosed not_planned — nothing left that a separate card should carry
- The group-typo half is covered by the platform: the published
@objectstack/cli@17.4.0shipsdist/utils/nav-contribution-groups.js, a build-time check that reports a missing navigation group. - Ordering and grouping are already pinned by
test/docs-quick-tour-navigation.test.ts, which Packaging: sales becomes thetype: apppackage and service atype: module—composeStacks(…, { manifest: 'preserve' }), navigation contributions, two-entrypackages[]#1907's acceptance (item 4) must teach to read the contribution channel. - A literal pre-split/post-split equality would contradict Packaging: sales becomes the
type: apppackage and service atype: module—composeStacks(…, { manifest: 'preserve' }), navigation contributions, two-entrypackages[]#1907's accepted delta (nav_my_caseslands last in My Work).
Hint for #1907's epic PM: compare against the pre-split tree once, and admit that one delta.
Generated by Claude Code
- The group-typo half is covered by the platform: the published
Blocked-by: objectstack-ai/objectstack#14122
Filed by the director seat (objectstack #12708, summon #10, session
session_01ShyhexkB2d1AeRZ85tgAAe) to carry the consumer-side half of a maintainer ruling. Filed unassigned;pm:queue; grading is the hotcrm seat's.Ruling this follows
Provenance: maintainer, live PM chat with the director seat, 2026-09-02, decision batch #13 item 5 on objectstack#14553, recommendation B + C, verbatim 「同意」.
objectstack#14553 measured that a package's
navigationContributions[].groupnaming a group the target app does not declare is silently relocated to the app's top level (no refusal, no diagnostic aboveinfo). The platform half (B) upgrades that trace to a real diagnostic that survivesOS_REGISTRY_LOG=warn, plus a compile-time check when both sides are in one artifact. This card is the consumer half (C): hotcrm's navigation conversion (hotcrm#1449, 17 nodes) asserts in its own suite that the navigation tree assembled from the split packages equals the tree the single package produced before the split.What to build
composeStackspath the build uses), reads the merged app navigation, and deep-compares it against the pre-split tree (a fixture captured from the last single-package build, or computed from the single-package definition on the same commit).groupto a non-existent id in a scratch copy and confirm the test goes red.Acceptance
Not a platform change; no changeset beyond what this repo's conventions require for tests.
Related: objectstack#14553 (the ruling), objectstack#14122 (the epic), hotcrm#1449 (the conversion), objectstack #12708 (director seat ledger).