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

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. self-assigned this
    on Sep 4, 2026
  2. 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

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

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

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

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

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions