Repository navigation
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
Activity
- addedpriority:p2Medium: important, M3Medium: important, M3
on Sep 2, 2026 Claim: PM loop round R1 (slot refill) —
domain:specseat (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-blocksstops emittingskills/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(GitHubos-justin)
Branch:claude/issue-14559-react-blocks-single-rendering
Worktree:objectstack-issue-14559
Domain:domain:spec
File surface (all verified present onorigin/main9c1bcda3, 06:44Z):packages/spec/scripts/build-react-blocks-contract.ts(drop the JSON writer;--checkverifies the markdown only),skills/objectstack-ui/contracts/react-blocks.contract.json(deleted),.gitattributes(:155row dropped,:121comment corrected,:156kept),AGENTS.md:749(the generated-artifacts row names one artifact — governed),scripts/check-skills-token-ratchet.mjs(genContractfixture:723and the generator-owned set:839move to another real generator-owned path;:124/:457comments; the skills lane filed this card, so this cross-lane touch is pre-authorised and mechanical),docs/adr/0082-react-component-contract-governance.md(:39sentence +:87chain 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; governedskills/**), objectuiscripts/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 vsskip-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—--tieronAGENTS.md+ the ADR + the generator at9c1bcda3(06:44Z): no path-derived mandate; content: tooling + a one-row governed-table edit (mechanical,opusconstruction per the 2026-08-20 ruling), no contract accept/reject behaviour moves.
Clause-②: no
Governed surface:check-governed-merges --test3 of 3 hits (AGENTS.md,docs/adr/**,skills/**) ⇒ the PR stays draft for human merge: review on this card, review requested fromos-zhuang+hotlongwith the draft flag kept, listed as "awaiting a human merge" in the round report. Net line budget inskills/**: the deletion is net-negative by construction; therules/pages.mdline 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 theskills/objectstack-uitree but not a file —references/react-blocks.mdis generator-owned by a different generator and is not edited here; if the family lands first, regenerate and re-runcheck:skill-refsbefore pushing. In-flight #14414 / #14446: no overlap. objectuiorigin/main24e027e9: zero consumers of the JSON outside the queue guard's name list (re-measured 06:44Z). H17 index: no hit.
Generated by Claude Code
Dispatch (R1 slot refill, 2026-09-04T06:47Z) —
domain:specseat,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 ownClaim: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.mdis the single AI-facing output. The card's seven moving parts and its landing rules are the spec: generator +--checkon one artifact;.gitattributes:155row dropped,:121comment corrected,:156kept;AGENTS.md:749row names only the markdown; ratchet self-test fixtures (scripts/check-skills-token-ratchet.mjs:723genContract,:839generator-owned set, comments:124/:457) move to another real generator-owned path and the self-test is run; ADR-0082:39+:87corrected to one rendering;check:skill-refs/check:skill-docsverified not to enumerate the JSON;check:skill-identifier-livenessLeg 1 population shrinks by one. Reverse verification exactly as the card prescribes:check:react-blocksgreen 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/main9c1bcda3):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-blocksownership exception: thecandidateregex alternationcontracts\/react-blocks\.contract\.jsonis dropped so the exception never names a deleted path — run that script's--testand--self-testif 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); objectuiscripts/check-governed-queue-guard.mjs:106(comment only on24e027e9— read-and-report, no cross-repo edit).PM mechanism assumptions (verify). (a)
.changeset/skill-catalog-projected-issue-ids.mdmentions the JSON in prose — an existing changeset is history, ⛔ not edited. (b) Changeset vsskip-changeset:scripts/check-empty-changeset.mjs's own enumeration decides (packages/spec/scripts/**is inside a published package's tree — check whetherscripts/is in the tarballfiles; if nothing published changes,skip-changeset; report the gate's line). (c)check:react-blocksruns inlint.yml; the deletion must leavepnpm lintgreen. (d) The in-flight family PR (#14462,build-skill-references.ts+skills/*/references/_index.md) does not touchreferences/react-blocks.md; if it lands before you push, mergemainand re-runcheck: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 minimumpnpm --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/--teston 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-reportfirst 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
Claim:
Session:session_01H2oQebDDxYKfWZusyd8GXk
Branch:claude/issue-14559-react-blocks-single-rendering(pushed empty as the write-route probe before the first edit; worktreeobjectstack-issue-14559)
Base:origin/main96b4af88— the shared remote ref had advanced past the dispatch's9c1bcda3by the time the worktree was cut (another seat's fetch movedrefs/remotes/origin/main, which is shared across worktrees); the file surface below was re-verified present at96b4af88.
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;--checkverifies the markdown only; script names unchangedskills/objectstack-ui/contracts/react-blocks.contract.json— deleted.gitattributes— thereact-blocks.contract.jsonmerge=os-regenrow dropped, the markdown row kept, the "both halves" comment correctedAGENTS.md— one generated-artifacts row, artifact list names only the markdown (governed)scripts/check-skills-token-ratchet.mjs—genContractself-test fixture and the generator-owned exclusion set move to another real generator-owned path; the two comments corrected; self-test rundocs/adr/0082-react-component-contract-governance.md— the:39sentence and the:87chain diagram corrected to one rendering (governed)scripts/regen-artifacts.mjs— the orchestrator entry for the JSONscripts/pm/check-governed-merges.mjs— thespec-react-blocksownership exception'scandidatealternationskills/objectstack-ui/rules/pages.md— one line, the blockquote link retargeted to the markdown rendering (governedskills/**, net lines ≤ 0)- a changeset or the
skip-changesetlabel, asscripts/check-empty-changeset.mjs's own enumeration decides
objectuiscripts/check-governed-queue-guard.mjsis 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
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
ACCEPT — review of record for PR #15257 (head
d76ab048),domain:specseat,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 lineFixes #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:749onorigin/main97bcd99e(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 thereforedocs/adr/**+skills/**(2 hits atcheck-governed-merges --test, exit 3); one hit governs the whole PR, so the route does not change. - Deletion re-verified on
origin/main97bcd99e:git grep -n react-blocks.contract.json origin/main= 15 lines, all of them names — the generator's own comment andOUT_JSON,.gitattributes:155, ADR-0082:39,packages/spec/CHANGELOG.md, the existing changeset, the ratchet ×4, the queue guard'sREGISTER_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. objectuiorigin/main24e027e9: zero hits (dev's reading, consistent with this seat's 06:44Z read). - Diff read: generator drops
OUT_JSONand the JSON-only envelope fields (version,source);.gitattributesrow + comment;regen-artifactsentry; 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:39sentence + a correction parenthetical in the ADR's own style (:87already read one rendering — deviation accepted);pages.md:194one line, 448 → 448 lines, 5,501 → 5,492 tokens against a 5,501 ceiling. Nocontent/docs/releases/change. - Changeset:
skip-changesetlabel on the PR. Verified onorigin/main:packages/spec/package.jsonfiles= dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json — noscripts/;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-loadsNOT MEASURED locally (its own prerequisite code) — CI's whole-repo run owns it; recorded, not counted as green. - CI on
d76ab048at 07:31Z: 15 completed checks allsuccess(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 Conformancein_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_labelson 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 mergeFixescloses this card andpm:dispatchedleaves with the close (this seat's close-out patrol confirms it).
Generated by Claude Code
- PR form: draft, base
Landed —
domain:specseat,session_01H2oQebDDxYKfWZusyd8GXk, 2026-09-04T08:46Z. PR #15257 went through the governed human path: approved byos-zhuangat 07:39:59Z, flipped ready and enqueued by the approver, MERGED 08:39:56Z through the merge queue as9a33cdd8(squash);Fixesclosed this card. Probed onorigin/main0e24b0c2(08:43Z):skills/objectstack-ui/contracts/react-blocks.contract.jsonis gone from the tree,packages/spec/scripts/build-react-blocks-contract.tshas noOUT_JSON, and neither.gitattributesnorscripts/regen-artifacts.mjsnames the JSON any more.pm:dispatchedstripped (read-modify-write:tooling·priority:p2·domain:speckept). Landing-window inventory at 08:44Z: closeddomain:specsince 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 mergingmainand regenerating to the single artifact in a patch round.
Generated by Claude Code
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 asgen:react-blocks/ checked ascheck:react-blocks) writes the same content twice —skills/objectstack-ui/contracts/react-blocks.contract.json(5,352 tokens) andskills/objectstack-ui/references/react-blocks.md(3,153 tokens): same four blocks, same prop counts, byte-identicalnotestrings. The JSON rendering has zero in-repo consumers (one comment mention only), and objectuiorigin/mainhas zero consumers (git grep react-blocks.contract.jsonis 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)
packages/spec/scripts/build-react-blocks-contract.ts: drop the JSON writer;--checkcompares the markdown only.package.json:292-294scripts keep their names.check:react-blocks(runs inlint.yml, per.gitattributes:133) now verifies one artifact..gitattributes— drop themerge=os-regenrow at:155(react-blocks.contract.json); keep:156(the markdown). Update the comment at:121("both halves of the react-blocks contract").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 fromos-zhuangandhotlong, no ready flip, no enqueue).scripts/check-skills-token-ratchet.mjsuses the JSON as a boundary fixture (genContractat: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.docs/adr/0082-react-component-contract-governance.md) — the sentence at:39naming both renderings and the chain diagram at:87are corrected to one rendering.docs/adr/**is governed ⇒ draft-only, same review path.check:skill-refs/check:skill-docs— verify neither enumerates the JSON;check:skill-identifier-livenessLeg 1 reads published files, so the deletion shrinks its population.Landing rules
Fixes #<this card>, governed (AGENTS.md,docs/adr/**,skills/**) ⇒ stays DRAFT; review requested fromos-zhuang+hotlongwithdraft: true; a human merge is the review record.packages/specpublishes something that changes (scripts/in a published package — verify withscripts/check-empty-changeset.mjs's enumeration;skip-changesetif it releases nothing).check:react-blocksat 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).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 touchcontracts/orreferences/.Dedupe: a targeted
search_issuesfor 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.