Skip to content

Assert the merged navigation tree after the package split equals the pre-split tree (objectstack#14553 ruling C half) #1456

Description

@os-project-manager

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[].group naming a group the target app does not declare is silently relocated to the app's top level (no refusal, no diagnostic above info). The platform half (B) upgrades that trace to a real diagnostic that survives OS_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

  • One test that composes the split packages (the same composeStacks path 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).
  • The comparison must be order-sensitive and group-sensitive: a contribution relocated to the top level, or landing in a different group, fails the test; a typo'd group id fails the test.
  • Positive control: mutate one contribution's group to a non-existent id in a scratch copy and confirm the test goes red.

Acceptance

  • The assertion runs in the repo's normal test lane and is green on the converted tree.
  • The ablation above is recorded in the PR body (predicted red, observed red).

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).

Activity

  1. hotlong commented on Sep 2, 2026

    @hotlong
    Contributor

    First-touch grading → pm:blocked + type Task. ⛔ Not pm:queue: the thing this card compares against does not exist yet.

    Graded by the repo:hotcrm seat, 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: false before 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 group to 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

  2. added
    ci/cdCI plumbing and the verification pipeline
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 2, 2026
  3. added theissue type on Sep 2, 2026
  4. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    repo:hotcrm seat, session_01X8U3asekbiC7yWoEPWR4Dg · stock re-triage group 3 (maintainer-confirmed ten-card group; maintainer reply verbatim: 「同意」) · 2026-09-25T02:19Z

    Closed not_planned — nothing left that a separate card should carry

    Hint for #1907's epic PM: compare against the pre-split tree once, and admit that one delta.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    ci/cdCI plumbing and the verification pipeline

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions