Skip to content

Seam (spec lane, ruled): gen:react-blocks stops emitting skills/objectstack-ui/contracts/react-blocks.contract.json — the markdown rendering becomes the single AI-facing output (#14296 item 3 = A) #14559

Closed

Description

@os-litant

Seam card filed by the skills lane seat (session session_01LraLgQVGq8egUwfYZpbYt1) under the maintainer's ruling on #14296 item 3 = A (comment 5507419465, 2026-09-02 09:27Z, director seat relaying 「其他同意」). Program #14292. Filed unassigned for the spec lane; ⛔ the objectstack-ui skill flights do not touch generated output.

The ruling, verbatim in substance

scripts/build-react-blocks-contract.ts (packages/spec, run as gen:react-blocks / checked as check:react-blocks) writes the same content twice — skills/objectstack-ui/contracts/react-blocks.contract.json (5,352 tokens) and skills/objectstack-ui/references/react-blocks.md (3,153 tokens): same four blocks, same prop counts, byte-identical note strings. The JSON rendering has zero in-repo consumers (one comment mention only), and objectui origin/main has zero consumers (git grep react-blocks.contract.json is empty there — re-measured 11:5xZ). The generator stops emitting the JSON; the file is deleted; the markdown is the single AI-facing output. Customers stop paying 2.8% of the published bundle for a second rendering of one table.

Everything that moves with it (the cost the ruling carries into this card)

  1. Generator — packages/spec/scripts/build-react-blocks-contract.ts: drop the JSON writer; --check compares the markdown only. package.json:292-294 scripts keep their names.
  2. Sync gate — check:react-blocks (runs in lint.yml, per .gitattributes:133) now verifies one artifact.
  3. .gitattributes — drop the merge=os-regen row at :155 (react-blocks.contract.json); keep :156 (the markdown). Update the comment at :121 ("both halves of the react-blocks contract").
  4. AGENTS.md:746 — the generated-artifacts row | The react-blocks contract | check:react-blocks | gen:react-blocks | stays but its artifact list names only the markdown. Governed surface ⇒ that edit lands draft-only through the human-merge path (request review from os-zhuang and hotlong, no ready flip, no enqueue).
  5. Ratchet self-test — scripts/check-skills-token-ratchet.mjs uses the JSON as a boundary fixture (genContract at :687, "a real path on this tree") and lists it in the generator-owned exclusion set (:803); both must move to another real generator-owned path (e.g. references/react-blocks.md) or the self-test reds on a missing file. Run the self-test.
  6. ADR-0082 (docs/adr/0082-react-component-contract-governance.md) — the sentence at :39 naming both renderings and the chain diagram at :87 are corrected to one rendering. docs/adr/** is governed ⇒ draft-only, same review path.
  7. check:skill-refs / check:skill-docs — verify neither enumerates the JSON; check:skill-identifier-liveness Leg 1 reads published files, so the deletion shrinks its population.

Landing rules

  • One PR, Fixes #<this card>, governed (AGENTS.md, docs/adr/**, skills/**) ⇒ stays DRAFT; review requested from os-zhuang + hotlong with draft: true; a human merge is the review record.
  • No changeset is owed unless packages/spec publishes something that changes (scripts/ in a published package — verify with scripts/check-empty-changeset.mjs's enumeration; skip-changeset if it releases nothing).
  • Reverse verification: run check:react-blocks at the current head (green, two artifacts), delete the JSON without changing the generator (the gate must go RED — the deletion is real), then land the generator change (green, one artifact).
  • The ratchet's generator-owned population shrinks by one file — no ceiling row exists for it, so the ratchet script changes only in the self-test fixtures named above.

Not in scope

Option C of the same item (moving evals/ out of the published tree) is a later question recorded on #14292, not ruled. The objectstack-ui split (#14298 round 2) proceeds independently and does not touch contracts/ or references/.

Dedupe: a targeted search_issues for this seam returned zero; a control query on the same engine returned 16 hits (so the zero is a reading, not a silent-zero). Nearest neighbours, none this: #14298 (the ui flight that deferred it), #13772 (the closed ui sweep that first measured the double rendering).

Refs: #14296 (ruling) · #14292 (program anchor) · ADR-0082.

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Sep 2, 2026
  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 4, 2026
  3. self-assigned this
    on Sep 4, 2026
  4. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    Claim: PM loop round R1 (slot refill) — domain:spec seat (seat post #6017). Executing the maintainer ruling on #14296 item 3 = A (director relay 5507419465, 2026-09-02, 「其他同意」), as this seam card carries it: gen:react-blocks stops emitting skills/objectstack-ui/contracts/react-blocks.contract.json; the markdown rendering is the single AI-facing output. Taken ahead of #14556 (older by six minutes) because #14556 is a design card whose query-shape call is this seat's to make before dispatch — it takes the next slot.
    Session: session_01H2oQebDDxYKfWZusyd8GXk (GitHub os-justin)
    Branch: claude/issue-14559-react-blocks-single-rendering
    Worktree: objectstack-issue-14559
    Domain: domain:spec
    File surface (all verified present on origin/main 9c1bcda3, 06:44Z): packages/spec/scripts/build-react-blocks-contract.ts (drop the JSON writer; --check verifies the markdown only), skills/objectstack-ui/contracts/react-blocks.contract.json (deleted), .gitattributes (:155 row dropped, :121 comment corrected, :156 kept), AGENTS.md:749 (the generated-artifacts row names one artifact — governed), scripts/check-skills-token-ratchet.mjs (genContract fixture :723 and the generator-owned set :839 move to another real generator-owned path; :124 / :457 comments; the skills lane filed this card, so this cross-lane touch is pre-authorised and mechanical), docs/adr/0082-react-component-contract-governance.md (:39 sentence + :87 chain diagram — governed). Four references the card does not list, found by this seat's grep — each is read-and-repair-or-report, not silent: scripts/regen-artifacts.mjs (the regeneration orchestrator — if it enumerates the JSON, drop the entry), scripts/pm/check-governed-merges.mjs (the queue guard's generator-ownership exception names the JSON — drop the entry so the exception does not reference a deleted file; report what the guard does with a missing path), skills/objectstack-ui/rules/pages.md (a skill body line names the JSON — the line is corrected to the markdown, ⛔ no widening; governed skills/**), objectui scripts/check-governed-queue-guard.mjs (cross-repo: read-and-report only, this seat files the objectui card if the guard breaks on a missing path). Changeset vs skip-changeset: the card's rule (scripts/check-empty-changeset.mjs's enumeration decides). Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus — --tier on AGENTS.md + the ADR + the generator at 9c1bcda3 (06:44Z): no path-derived mandate; content: tooling + a one-row governed-table edit (mechanical, opus construction per the 2026-08-20 ruling), no contract accept/reject behaviour moves.
    Clause-②: no
    Governed surface: check-governed-merges --test 3 of 3 hits (AGENTS.md, docs/adr/**, skills/**) ⇒ the PR stays draft for human merge: review on this card, review requested from os-zhuang + hotlong with the draft flag kept, listed as "awaiting a human merge" in the round report. Net line budget in skills/**: the deletion is net-negative by construction; the rules/pages.md line is a correction, ≤ +0 net.
    Serial constraints cleared: 0 open PRs on any listed file at 06:44Z (branch-name read of 18 open PRs; claude/issue-1429* / 1455* heads: none); the in-flight family #14462 (build-skill-references.ts + skills/*/references/_index.md) shares the skills/objectstack-ui tree but not a file — references/react-blocks.md is generator-owned by a different generator and is not edited here; if the family lands first, regenerate and re-run check:skill-refs before pushing. In-flight #14414 / #14446: no overlap. objectui origin/main 24e027e9: zero consumers of the JSON outside the queue guard's name list (re-measured 06:44Z). H17 index: no hit.


    Generated by Claude Code

  5. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    Dispatch (R1 slot refill, 2026-09-04T06:47Z) — domain:spec seat, session_01H2oQebDDxYKfWZusyd8GXk (os-justin), seat post #6017. mode:subagent, model: opus, size M, Clause ② no. Governed landing: the PR stays draft for human merge (never flipped ready, never queued by an agent seat). The dev leaves its own Claim: comment below before its first edit.

    Rulings (not re-decidable). #14296 item 3 = A (director relay 5507419465, 2026-09-02): the generator stops emitting the JSON; the file is deleted; skills/objectstack-ui/references/react-blocks.md is the single AI-facing output. The card's seven moving parts and its landing rules are the spec: generator + --check on one artifact; .gitattributes :155 row dropped, :121 comment corrected, :156 kept; AGENTS.md:749 row names only the markdown; ratchet self-test fixtures (scripts/check-skills-token-ratchet.mjs:723 genContract, :839 generator-owned set, comments :124 / :457) move to another real generator-owned path and the self-test is run; ADR-0082 :39 + :87 corrected to one rendering; check:skill-refs / check:skill-docs verified not to enumerate the JSON; check:skill-identifier-liveness Leg 1 population shrinks by one. Reverse verification exactly as the card prescribes: check:react-blocks green at base (two artifacts) → delete the JSON without touching the generator → the gate goes RED (the deletion is real) → land the generator change → green (one artifact). ⛔ No widening anywhere; option C (evals/) is not this card.

    Four references the card omits — repair each, or report why not, never silent (all on origin/main 9c1bcda3): scripts/regen-artifacts.mjs:338-340 (the orchestrator entry for the JSON — drop it; keep the markdown entry if one exists, else this generator's row now names the markdown); scripts/pm/check-governed-merges.mjs:790-795 (spec-react-blocks ownership exception: the candidate regex alternation contracts\/react-blocks\.contract\.json is dropped so the exception never names a deleted path — run that script's --test and --self-test if it has one, and report what it says when the JSON is absent); skills/objectstack-ui/rules/pages.md:194 (a blockquote link to the JSON → the markdown rendering, one line, ⛔ no other body change); objectui scripts/check-governed-queue-guard.mjs:106 (comment only on 24e027e9 — read-and-report, no cross-repo edit).

    PM mechanism assumptions (verify). (a) .changeset/skill-catalog-projected-issue-ids.md mentions the JSON in prose — an existing changeset is history, ⛔ not edited. (b) Changeset vs skip-changeset: scripts/check-empty-changeset.mjs's own enumeration decides (packages/spec/scripts/** is inside a published package's tree — check whether scripts/ is in the tarball files; if nothing published changes, skip-changeset; report the gate's line). (c) check:react-blocks runs in lint.yml; the deletion must leave pnpm lint green. (d) The in-flight family PR (#14462, build-skill-references.ts + skills/*/references/_index.md) does not touch references/react-blocks.md; if it lands before you push, merge main and re-run check:skill-refs.

    Surface, gates, report. File surface = the claim comment 5536793270 (stop on breach). Derive gates from your actual paths after the last commit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no path args); at minimum pnpm --filter @objectstack/spec check:react-blocks, check:skill-refs, check:skill-docs (if it exists), check:skill-identifier-liveness (if it exists), node scripts/check-skills-token-ratchet.mjs --self-test (or its spelled invocation), node scripts/pm/check-governed-merges.mjs --self-test / --test on your paths, pnpm check:merge-driver, pnpm check:doc-authoring, pnpm check:nul-bytes, node scripts/check-system-context-census.mjs, the changeset gate self-tests, pnpm lint. Report: os-dev-report first as a comment here, then as the return; machine-checkable fields only, plus the reverse-verification RED/GREEN readings and the answer for each of the four extra references.


    Generated by Claude Code

  6. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    Claim:
    Session: session_01H2oQebDDxYKfWZusyd8GXk
    Branch: claude/issue-14559-react-blocks-single-rendering (pushed empty as the write-route probe before the first edit; worktree objectstack-issue-14559)
    Base: origin/main 96b4af88 — the shared remote ref had advanced past the dispatch's 9c1bcda3 by the time the worktree was cut (another seat's fetch moved refs/remotes/origin/main, which is shared across worktrees); the file surface below was re-verified present at 96b4af88.
    File surface (as claimed by the PM in comment 5536793270, plus the four extra references the dispatch names):

    • packages/spec/scripts/build-react-blocks-contract.ts — drop the JSON writer; --check verifies the markdown only; script names unchanged
    • skills/objectstack-ui/contracts/react-blocks.contract.json — deleted
    • .gitattributes — the react-blocks.contract.json merge=os-regen row dropped, the markdown row kept, the "both halves" comment corrected
    • AGENTS.md — one generated-artifacts row, artifact list names only the markdown (governed)
    • scripts/check-skills-token-ratchet.mjs — genContract self-test fixture and the generator-owned exclusion set move to another real generator-owned path; the two comments corrected; self-test run
    • docs/adr/0082-react-component-contract-governance.md — the :39 sentence and the :87 chain diagram corrected to one rendering (governed)
    • scripts/regen-artifacts.mjs — the orchestrator entry for the JSON
    • scripts/pm/check-governed-merges.mjs — the spec-react-blocks ownership exception's candidate alternation
    • skills/objectstack-ui/rules/pages.md — one line, the blockquote link retargeted to the markdown rendering (governed skills/**, net lines ≤ 0)
    • a changeset or the skip-changeset label, as scripts/check-empty-changeset.mjs's own enumeration decides
      objectui scripts/check-governed-queue-guard.mjs is read-and-report only — no cross-repo edit. The assignee stays the PM's; I never touch it. The PR stays draft for a human merge.
      Clause-②: no

    Generated by Claude Code

  7. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
      "issue": 14559,
      "status": "done",
      "branch": "claude/issue-14559-react-blocks-single-rendering",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/15257",
      "pr_state": "draft, open; reviewers os-zhuang + hotlong requested; labels [size/l, skip-changeset] (union write, read back and confirmed); never flipped ready, never enqueued, no auto-merge",
      "head_sha": "d76ab048",
      "base": "origin/main 96b4af88 at worktree cut (the shared refs/remotes/origin/main had already moved past the dispatch's 9c1bcda3); origin/main 1bc3c092 merged in before the final gate derivation",
      "premise_still_valid": true,
      "premise_evidence": {
        "one_generator_emits_both": "check:react-blocks at base printed 'react-blocks contract: 4 blocks -> skills/objectstack-ui/contracts/react-blocks.contract.json + skills/objectstack-ui/references/react-blocks.md'",
        "same_blocks_and_prop_counts": "JSON ObjectForm:34 ListView:20 ObjectChart:18 Block:1; markdown table rows ObjectForm:34 ListView:20 ObjectChart:18 Block:1",
        "note_string_byte_identical": true,
        "every_json_prop_name_present_in_markdown": true,
        "sizes": "JSON 21406 bytes / 5352 tokens / 559 lines; markdown 12609 bytes / 3153 tokens",
        "in_repo_consumers_of_the_json": "0 readers. git grep react-blocks.contract.json = 12 hits, all names: the generator, .gitattributes, regen-artifacts, check-governed-merges (x2), check-skills-token-ratchet (x4), rules/pages.md, ADR-0082, plus 2 history files (packages/spec/CHANGELOG.md, .changeset/skill-catalog-projected-issue-ids.md)",
        "objectui_consumers": "0 at origin/main 24e027e9 — git grep react-blocks.contract.json is empty there; only prose in scripts/check-governed-queue-guard.mjs:106"
      },
      "reverse_verification": [
        { "step": 1, "what": "base, generator untouched", "command": "pnpm --filter @objectstack/spec check:react-blocks", "exit": 0, "verdict_line": "OK 2 generated files in sync with packages/spec" },
        { "step": 2, "what": "JSON deleted, generator STILL untouched", "command": "pnpm --filter @objectstack/spec check:react-blocks", "exit": 1, "verdict_line": "FAIL: '+ skills/objectstack-ui/contracts/react-blocks.contract.json (missing — spec adds it)' under 'skills/objectstack-ui/ react-blocks contract is out of date with packages/spec'" },
        { "step": 3, "what": "generator change landed", "command": "pnpm --filter @objectstack/spec check:react-blocks", "exit": 0, "verdict_line": "OK 1 generated files in sync with packages/spec" },
        { "step": 4, "what": "write mode agrees (extra)", "command": "pnpm --filter @objectstack/spec gen:react-blocks", "exit": 0, "verdict_line": "OK Generated 1 files; git status clean, markdown byte-identical throughout" }
      ],
      "files_changed": [
        "packages/spec/scripts/build-react-blocks-contract.ts",
        "skills/objectstack-ui/contracts/react-blocks.contract.json (deleted)",
        ".gitattributes",
        "scripts/regen-artifacts.mjs",
        "scripts/pm/check-governed-merges.mjs",
        "scripts/check-skills-token-ratchet.mjs",
        "docs/adr/0082-react-component-contract-governance.md",
        "skills/objectstack-ui/rules/pages.md"
      ],
      "seven_parts": {
        "1_generator": "done — OUT_JSON and its emit() dropped; the JSON-envelope-only fields version/source dropped with them; --check compares the markdown alone; script names unchanged",
        "2_sync_gate": "done — check:react-blocks verifies one artifact (reading 3)",
        "3_gitattributes": "done — the contract.json merge=os-regen row dropped, the markdown row kept, the 'both halves' comment corrected; check:merge-driver exit 0",
        "4_agents_md": "NOT EDITED, reported — the row is '| The react-blocks contract | check:react-blocks | gen:react-blocks |' and carries NO artifact path to narrow; the 'eight checked-in generated artifacts' prose above it counts GATES one per table row, and check:react-blocks is still one of eight. Every cell stays true; editing it would only add text to a governed file",
        "5_ratchet": "done — genContract fixture moved to skills/objectstack-ui/references/react-blocks.md (real, generator-owned, still routes to register row spec-react-blocks), the pinned excluded set drops the JSON, comments corrected; self-test 64 cases pass; gate green with generator-owned population 11 -> 10",
        "6_adr_0082": "line-39 sentence corrected to one rendering plus a correction parenthetical in this ADR's own house style; the chain diagram needed NO change — it already read 'spec zod schema --gen--> react-blocks.md', one rendering",
        "7_skill_gates": "verified — check:skill-refs declares 9 outputs, all _index.md (JSON never enumerated); check:skill-docs in sync; check:skill-identifier-liveness Leg 1 population 47 -> 46 published files, exactly the one deletion"
      },
      "four_extra_references": {
        "scripts/regen-artifacts.mjs": "REPAIRED — the REGEN_ARTIFACTS entry for the JSON dropped, the markdown entry kept so regen-artifacts still knows this generator; the 'both halves' comment corrected. check:merge-driver reconciles this table against .gitattributes and both moved together, exit 0",
        "scripts/pm/check-governed-merges.mjs": "REPAIRED in THREE sites, not one — (a) the spec-react-blocks candidate alternation loses the JSON branch; (b) REGISTER_SAMPLES['spec-react-blocks'] moved to the markdown (the file asserts every sample is matched by its own row, so a stale sample would have redded); (c) the self-test case that pinned BOTH outputs now pins the single output, and a NEW case asserts the retired JSON path is no longer a register member. --self-test 246 assertions exit 0; --test on the eight paths exit 3 GOVERNED",
        "skills/objectstack-ui/rules/pages.md": "REPAIRED, one line — the blockquote's dead link to the JSON becomes 'the block-to-schema index in @objectstack/spec' (also the truer claim: the old line said the markdown was generated FROM the JSON). Net 0 lines (448 -> 448), -9 tokens (5501 -> 5492 against a 5501 ceiling). No other body change",
        "objectui scripts/check-governed-queue-guard.mjs:106": "READ, no edit needed and none made — at origin/main 24e027e9 it is prose in a comment saying objectui's OWN skills/ tree carries no generator output ('no references/_index.md, no react-blocks contract'). It does not name the JSON path, nothing there reads the file, and the sentence stays true after this change"
      },
      "measurements": {
        "published_skill_bundle_tokens": "156787 -> 151426 (-5361, -3.4%)",
        "deleted_json": "5352 tokens / 559 lines",
        "rules_pages_md": "5501 -> 5492 tokens, 448 -> 448 lines, ceiling 5501",
        "generator_owned_bundle_files": "11 -> 10",
        "published_files_liveness_leg1": "47 -> 46",
        "artifacts_check_react_blocks_verifies": "2 -> 1",
        "counting_instrument": "the ratchet's own countTokens applied to base blobs and head files"
      },
      "tests": "Gate families derived AFTER the last commit from the real change set: 'node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands' (no path args) at head d76ab048 — 64 commands, change set exactly the 8 paths above, --repo assertion holds, no stale-tree warning. All 64 were run in the foreground with the exit captured BEFORE any pipe; 63 exit 0.",
      "gates": [
        { "name": "pnpm --filter @objectstack/spec check:react-blocks", "exit": 0, "verdict_line": "OK 1 generated files in sync with packages/spec" },
        { "name": "pnpm --filter @objectstack/spec check:skill-refs", "exit": 0, "verdict_line": "OK 9 generated files in sync with packages/spec" },
        { "name": "pnpm --filter @objectstack/spec check:skill-docs", "exit": 0, "verdict_line": "OK Skill docs in sync" },
        { "name": "pnpm check:skill-identifier-liveness", "exit": 0, "verdict_line": "check-skill-identifier-liveness OK — Leg 1: 465 citation(s) over 46 published file(s) ...; Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)" },
        { "name": "node scripts/check-skills-token-ratchet.mjs --self-test", "exit": 0, "verdict_line": "OK check-skills-token-ratchet self-test: 64 cases pass." },
        { "name": "node scripts/check-skills-token-ratchet.mjs", "exit": 0, "verdict_line": "OK check-skills-token-ratchet: 36 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted." },
        { "name": "node scripts/pm/check-governed-merges.mjs --self-test", "exit": 0, "verdict_line": "OK check-governed-merges --self-test: 246 assertions ... live: the real generator declared 9 output(s) and certified this tree" },
        { "name": "node scripts/pm/check-governed-merges.mjs --test (the 8 paths)", "exit": 3, "verdict_line": "GOVERNED — a human merge is the review record for this PR (#9495 regime); docs/adr/** x1, skills/** x2. Exit 3 is this predicate's GOVERNED code, not a failure" },
        { "name": "pnpm check:pm-governed-merges", "exit": 0, "verdict_line": "green in the derived run" },
        { "name": "pnpm check:merge-driver", "exit": 0, "verdict_line": "OK check-regen-pending self-test passed." },
        { "name": "pnpm check:doc-authoring", "exit": 0, "verdict_line": "OK doc authoring guard: 46 published skill files clean — no internal issue-id references." },
        { "name": "pnpm check:nul-bytes", "exit": 0, "verdict_line": "check-nul-bytes: OK (scanned 8268 text file(s); no raw ASCII control bytes)." },
        { "name": "node scripts/check-system-context-census.mjs", "exit": 0, "verdict_line": "check-system-context-census: OK — 106 elevation read sites in 20 packages across 45 files, all anchored" },
        { "name": "pnpm check:changeset-gate-self-tests", "exit": 0, "verdict_line": "OK check-empty-changeset --self-test: 118 assertions; check-adr-0087-registration 292; check-changeset-no-major 116" },
        { "name": "pnpm check:published-files", "exit": 0, "verdict_line": "OK check:published-files — 69 publishable package(s) ... admits no test, test-harness config or build script" },
        { "name": "pnpm check:adr-anchors / check:pm-dispatch-gates / check:slot-lookup / check:entry-guard / and the other 45 derived families", "exit": 0, "verdict_line": "all exit 0 in the derived run at d76ab048" },
        { "name": "pnpm lint (repo-wide eslint . --no-inline-config, NO narrowing)", "exit": 0, "verdict_line": "clean, no output" },
        { "name": "pnpm check:dual-build-cjs-loads", "exit": 3, "verdict_line": "NOT MEASURED, not red: 'PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/ ... Run pnpm build first. This is NOT a pass: nothing was measured.' Its self-test passed (93 cases) on this tree. Satisfying it needs a full 102-package build (the repo-wide run CI owns). It cannot be moved by this diff: zero of the 8 changed paths are under any package's src/ (git diff vs the MERGE BASE with those pathspecs is empty), and packages/spec/scripts/** is neither published nor compiled (npm pack --dry-run on packages/spec: 2086 files, 0 under scripts/)" }
      ],
      "changeset_decision": {
        "route": "skip-changeset label (this repo's spelling), applied by me at PR-open time, not left to CI",
        "evidence": "packages/spec 'files' whitelist = dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json — no scripts/. Confirmed against the real tarball: npm pack --dry-run lists 2086 files, 0 under scripts/. check:published-files' own line: '69 publishable package(s) ... admits no test, test-harness config or build script'. skills/ is in no workspace glob of pnpm-workspace.yaml and in no package's files array. So this PR releases nothing.",
        "write_route": "REST was 403 in this container (repo-scoped GET https://api.github.com/repos/objectstack-ai/objectstack -> 403; no gh binary), so the additive labels endpoint was unavailable — fell back to MCP: read current set ([size/l]) -> union -> whole-set write ([size/l, skip-changeset]) -> comparison read-back, which returned exactly the union. Declared as a channel switch.",
        "existing_changeset": ".changeset/skill-catalog-projected-issue-ids.md mentions the JSON in prose — history, deliberately NOT edited"
      },
      "deviations_from_the_claim_surface": [
        "AGENTS.md: claimed as a one-row edit; NOT edited. The row carries no artifact list to narrow and the 'eight generated artifacts' prose counts gates, not files — every cell stays true. Consequence: the governed surface is 2 of 3 (docs/adr/** and skills/**), not 3 of 3. The landing route is unchanged — one hit governs the whole PR, so it stays draft for a human merge.",
        "docs/adr/0082 line 87: the card and the dispatch both asked for the chain diagram to be corrected to one rendering. It already reads 'spec zod schema --gen--> react-blocks.md' — one rendering, unchanged since the ADR was written. Only the line-39 sentence named both, and only it moved. I added one correction parenthetical there, in the same form this ADR already uses for its other corrections.",
        "scripts/pm/check-governed-merges.mjs: the dispatch named one site (the candidate regex at :790-795). Two further sites named the same path and would have gone stale silently — REGISTER_SAMPLES at :2372 and the self-test case at :3430. Both repaired, plus one added assertion pinning the retirement. Same file, same mechanism, no new verification surface.",
        "Base drift: the dispatch pinned origin/main 9c1bcda3 at 06:44Z; refs/remotes/origin/main (shared across worktrees) had already advanced to 96b4af88 when the worktree was cut, and to 1bc3c092 later. The whole file surface was re-verified present at 96b4af88 and origin/main was merged in before the final gate derivation. Zero overlap between the merged range and any of my 8 paths.",
        "pnpm check:dual-build-cjs-loads reported as NOT MEASURED (exit 3, prerequisite), never as green — see the gates entry for the proof it cannot be moved by this diff."
      ],
      "mcp_calls": "9 — issue_read get, issue_read get_comments, add_issue_comment (my Claim), create_pull_request, issue_read get_labels (failed: 'Could not resolve to an Issue' for a PR number), pull_request_read get, issue_write update (label union), pull_request_read get (label + body read-back), add_issue_comment (this report)",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  8. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    ACCEPT — review of record for PR #15257 (head d76ab048), domain:spec seat, session_01H2oQebDDxYKfWZusyd8GXk (os-justin), 2026-09-04T07:36Z. Governed route: the PR stays draft for a human merge.

    Verified against GitHub and origin/main, not against the report:

    • PR form: draft, base main, first line Fixes #14559 — the whole card is delivered, so closing on merge is right. Body scanned for closing keywords: only that one; every other # mention is bare.
    • Changed files (8) = the claimed surface minus AGENTS.md, plus the four references the dispatch named. AGENTS.md:749 on origin/main 97bcd99e (07:32Z) reads | The react-blocks contract | check:react-blocks | gen:react-blocks | — no artifact path in the row, so the dev's no-edit is correct and the deviation is accepted. The governed surface is therefore docs/adr/** + skills/** (2 hits at check-governed-merges --test, exit 3); one hit governs the whole PR, so the route does not change.
    • Deletion re-verified on origin/main 97bcd99e: git grep -n react-blocks.contract.json origin/main = 15 lines, all of them names — the generator's own comment and OUT_JSON, .gitattributes:155, ADR-0082 :39, packages/spec/CHANGELOG.md, the existing changeset, the ratchet ×4, the queue guard's REGISTER_SAMPLES + self-test (its candidate regex spells the dot escaped and is the third site the dev repaired), regen-artifacts.mjs:338, rules/pages.md:194. No reader. objectui origin/main 24e027e9: zero hits (dev's reading, consistent with this seat's 06:44Z read).
    • Diff read: generator drops OUT_JSON and the JSON-only envelope fields (version, source); .gitattributes row + comment; regen-artifacts entry; queue guard candidate regex + REGISTER_SAMPLES + self-test, with one new assertion pinning that the retired path is no longer a register member; ratchet fixtures move to the markdown (a real generator-owned path); ADR-0082 :39 sentence + a correction parenthetical in the ADR's own style (:87 already read one rendering — deviation accepted); pages.md:194 one line, 448 → 448 lines, 5,501 → 5,492 tokens against a 5,501 ceiling. No content/docs/releases/ change.
    • Changeset: skip-changeset label on the PR. Verified on origin/main: packages/spec/package.json files = dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json — no scripts/; skills/ is in no workspace package. Nothing published moves, so the label is the honest declaration.
    • Gate readings pinned to head d76ab048 = the PR head. Reverse verification as the card prescribes: green (2 artifacts) → delete without touching the generator → RED (+ skills/objectstack-ui/contracts/react-blocks.contract.json (missing — spec adds it)) → generator change → green (1 artifact). The deletion is real and the sync gate is what sees it. 63 of 64 derived families exit 0; check:dual-build-cjs-loads NOT MEASURED locally (its own prerequisite code) — CI's whole-repo run owns it; recorded, not counted as green.
    • CI on d76ab048 at 07:31Z: 15 completed checks all success (incl. Type Check · source gates, Governed Surface Queue Guard, Spec property liveness, Check Changeset); Lint & Repo Gates, Type Check · workspace / consumer / debt ledger, Build Core, Test Core ×6, Dogfood ×4, Temporal Conformance in_progress. No seat flips this PR, so the human merge reads the final conclusions.
    • No git-answerable API reads in the evidence (one issue_read get_labels on a PR number failed — a known MCP limitation, not a defect).

    Landing (governed): stays draft; review requested from os-zhuang + hotlong (confirmed on the PR); listed as "awaiting a human merge" in the round report. On merge Fixes closes this card and pm:dispatched leaves with the close (this seat's close-out patrol confirms it).


    Generated by Claude Code

  9. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    Landed — domain:spec seat, session_01H2oQebDDxYKfWZusyd8GXk, 2026-09-04T08:46Z. PR #15257 went through the governed human path: approved by os-zhuang at 07:39:59Z, flipped ready and enqueued by the approver, MERGED 08:39:56Z through the merge queue as 9a33cdd8 (squash); Fixes closed this card. Probed on origin/main 0e24b0c2 (08:43Z): skills/objectstack-ui/contracts/react-blocks.contract.json is gone from the tree, packages/spec/scripts/build-react-blocks-contract.ts has no OUT_JSON, and neither .gitattributes nor scripts/regen-artifacts.mjs names the JSON any more. pm:dispatched stripped (read-modify-write: tooling · priority:p2 · domain:spec kept). Landing-window inventory at 08:44Z: closed domain:spec since 08:32Z = this card plus the two the seat stripped at 08:33Z (#14414, #14446) — no silent close. Follow-on the merge created: PR #15284 (#14556) had regenerated the JSON at its base and now carries a modify/delete conflict — the dev is merging main and regenerating to the single artifact in a patch round.


    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

Labels

domain:specDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions