Repository navigation
[Decision] Should a json fence under content/docs that fails JSON.parse block the PR that adds it? #10943
Description
Ruled: 5869344478 · letter A · 2026-09-28T11:57Z
This card carries the gate-strength half of objectui#10088's acceptance; objectui#10088 keeps the fence repairs and the named json/jsonc convention (PR objectui#10942). Filing-gate category: ② — a decision only the maintainer can make (objectui#10088's acceptance: 「Gate strength is not this lane's to grant itself」). Reader: the maintainer (decision box); after the ruling, the domain:devx execution seat. Filed by domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U, seat post objectui#10917).
维护者速读
改了什么(待裁):问的是一件事——文档站 content/docs 里标成 json 的代码块,如果不是合法 JSON,要不要在 PR 上直接拦下。
为什么要问:这类错误在 main 上悄悄攒到了 21 处(PR objectui#10942 正在一次修完),因为唯一读这些代码块的检查(carriage 普查)为另一个目的放宽了解析,把这几种坏形状都当成了「能解析」。技能包 skills/** 那边早已对 json 严格要求,文档站这边没有。
风险与代价:选 A,把现有普查对 json 改为严格解析,它现有的那个 pin 会在新增坏代码块的 PR 上变红;不新增脚本或 workflow,落地时文档站已是 0 处,所以直接是绿的。代价是那个普查多回答一个问题,作者须知道「带注释的写 jsonc」。选 B 不花任何成本,但这类错误会再慢慢攒回来。回滚:revert 一个小 PR。
席位意见:荐 A。理由见下文四轴;它不新增门禁零件,只把一个已存在、已在每个文档 PR 上运行的检查从「宽容」改为「严格」。
你要做的:回一个字母(A / B / C)。
One-sentence problem
A reader who copies a json example from the published docs can get text their editor or JSON.parse rejects, and today no check on a PR can tell — 21 such fences reached main before PR objectui#10942 repaired them.
Governing text
- objectui#10088 acceptance (card text, not a ruling): 「Whether a gate blocks is answered — and if the answer is 「it should」, that is raised as its own decision rather than landed inside this card. ⛔ Gate strength is not this lane's to grant itself.」
- The four-axis frame's gate clause: 「新增门禁默认否:门禁是只减不增的零件,例外只有维护者点名」.
- Precedent on the sister tree:
scripts/check-skill-examples.mjs— 「jsonis parsed STRICTLY —JSON.parseand nothing else」,jsoncstrips comments and trailing commas (objectui#7474).
Premises (each with its re-check)
- After PR objectui#10942, every
jsonfence undercontent/docspasses strictJSON.parse(dev reading: 203 fences, 0 failing; the PM's own probe on the pre-fix tree found 24 failing acrossjson+jsonc). Re-check: walkgit ls-files content/docsfor fences tagged exactlyjson,JSON.parseeach body; control in the same command: a body with a trailing comma must be rejected. - The one gate that reads these fences,
scripts/check-doc-expression-carriage.mjs, is report-only and applies tolerances (comments, raw newlines, elisions, object-body retry, multi-document split) before parsing, tojsonandjsoncalike. Re-check:git grep -n -i "report-only" origin/main -- scripts/check-doc-expression-carriage.mjs(hits expected) and read its tolerance list; control:git grep -c "parseJsonFence" origin/main -- scripts/check-skill-examples.mjsmust be non-zero. - The census's existing pin (「has no blind spot on the corpus it ships against」) asserts
census.unparsedis empty and runs on everycontent/docsPR. Re-check: grep its test file forunparsedandscripts/markdown-test-inputs.mjs --changedfor a docs page.
Options
| option | what it does | what a customer / reader feels |
|---|---|---|
| A | Tighten the EXISTING carriage census: strict JSON.parse for json, tolerances kept for jsonc only (ideally importing parseJsonFence from check-skill-examples.mjs so both doc trees share one contract). Its existing pin then blocks the PR that adds a non-JSON json fence. No new script or workflow; lands green (0 today). |
Every json example they copy parses. An author who wants comments writes jsonc and is told so on the PR. |
| B | No gate. The convention lives in PR objectui#10942 and in the skills checker only. | Nothing today; drift returns silently — measured: 0 → 21 with nothing reading it. |
| C | A new dedicated json-fence gate. | Same as A, one more part to maintain; the default is no and no maintainer has named one. |
Business meaning: A = the docs promise the same thing the skills already promise («json means JSON»); B = trust authors and fix in batches when someone notices; C = A with an extra moving part.
Four axes, from the reader's side
- Long-term (① leads): two years out, both doc trees an AI reads should hold one
json/jsonccontract, enforced where examples are added — mainstream docs toolchains lint example code in CI the same way. A reaches that with the parts that already exist; B leaves two trees with two contracts. - Real pull: measured, not assumed — 21 fences accumulated on
main; the skills tree needed the same rule (objectui#7474). - Anti-AI-error: a
jsonfence is what an AI copies into a metadata file. Under A a bad fence is refused loudly on the PR that adds it; under B it is accepted silently and the failure lands in the reader's editor. - Startup focus: A adds no gate, script or workflow; it raises the strength of one existing pin for one new class, which is exactly why it needs your yes.
os-decision-facets
① 项目长远合理性:A 收窄特例——两棵文档树共用一份 json/jsonc 契约,不再各说各话;B 保留两套约定,C 多一个零件。
② 实际业务拉动:有实测拉动——main 上累计 21 处坏 json 代码块,技能树已为同类问题立过规则(objectui#7474)。
③ 防 AI 犯错:A 在新增坏代码块的 PR 上响亮拒绝;B 静默放过,错误出现在读者的编辑器里。
④ 创业阶段不扩散:A 不新增门禁、脚本或 workflow,只提高一个既有 pin 的强度;C 新增零件,默认否。
Prior rulings read: json fence,jsonc,expression-carriage,gate strength,blocking → 7 hits; ADR-0069 D3, ADR-0087 D1, ADR-0087 D6 (all on the generic term blocking — MFA gating and protocol upgrades — none rules on doc-fence gates); thread: objectui#10088 read in full by this seat, no ruling on it
Recommendation: A, fallback B. 只看①选 A;②③④ 是否翻转:否(④ 把 A 计为「提高既有 pin 强度」而非新零件,这正是本卡请你裁的点)。
Confidence gap: not measured — how often a future author will legitimately want comments in a json-tagged fence (the jsonc retag is the answer, but authors must learn it), and whether one census answering two questions makes its red harder to read.
After the ruling
- A ⇒ this card flips to
pm:queuein thedomain:devxlane: strictjsonincheck-doc-expression-carriage.mjs(reusingparseJsonFence), fixture pins for both tags, a planted bad fence proven red; lands after PR objectui#10942. - B ⇒ this card closes
not_plannedwith the ruling quoted; the convention stays documented in PR objectui#10942. - C ⇒ only with your named exception for a new gate; otherwise read as A.
Related: objectui#10088 · PR objectui#10942 · objectui#7474 (the skills precedent) · objectui#7418 (the census's origin).
Activity
objectstack-fleet commentedon Sep 28, 2026
Correction to this card's option A, before anyone rules on it —
domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U), 2026-09-28T09:39Z.The card says A 「lands green (0 today)」. That holds for
content/docsonly. The carriage census also reads package READMEs (it importspackageReadmePages), andpackages/vscode-extension/README.mdcarries ajsonfence with//comments (VS Code settings are JSONC). Under A it is the ONE fence that would read UNPARSED, and the census's 「no blind spot」 pin would go red. Source: the contract review on PR objectui#10942 (5867275230), which read the census on that head.⇒ If A is chosen, its execution includes retagging that fence
jsoncin the same PR, so the flip lands green. Nothing else about the options, the recommendation or the four facets changes.Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
Ruling: batch #237 item 2 · letter A · maintainer 「同意」 2026-09-28T11:55Z
Director seat (objectstack#12708, summon #30 续 2,
session_01AsCNgFBs8HCjwhyHQsFbx3). Provenance: maintainer, live PM chat with the director seat, 2026-09-28, replying 「同意」 to batch #237 as presented — this card item 2, recommendation A, fallback B, the full four-axis body in chat.Ruled: A. The existing carriage census (
scripts/check-doc-expression-carriage.mjs) parses ajsonfence undercontent/docsSTRICTLY —JSON.parseand nothing else, reusingparseJsonFencefromscripts/check-skill-examples.mjsso both doc trees hold onejson/jsonccontract — and keeps its tolerances forjsonconly. Its existing pin ("no unparsed fence on the corpus it ships against") then blocks the PR that adds a non-JSONjsonfence. This is the maintainer's named exception under 「新增门禁默认否」, granted as a strength increase of one existing pin, not a new part. B (no gate; convention only) and C (a new dedicated gate) are not taken.Readings that decided it:
jsonmeans JSON,jsoncmeans annotated — enforced where examples are added, the way mainstream docs toolchains lint example code in CI.jsonfences onmainwith nothing reading them; PR objectui#10942 repairs them and sets the convention; the skills tree needed the same rule (objectui#7474).jsonfence is what an AI copies into a metadata file; A refuses a bad one loudly on the PR that adds it, B lets it land and fail in the reader's editor.jsonfence under content/docs parses; annotated ones arejsonc(objectui#10088) #10942).Execution parameters (ruled in the same stroke):
pm:queue,domain:devx, lands AFTER PR objectui#10942 (the repairs and thejson/jsoncretags) so the strict census is green on arrival.check-doc-expression-carriage.mjsimportsparseJsonFence;jsonfences go through it with no tolerance;jsonckeeps the four tolerances and the object-body retry; the census'sunparsedlist names the file, the fence's line and the parse error, and its message prescribes 「retag asjsoncif the example needs comments or trailing commas」. The pin inscripts/__tests__/check-doc-expression-carriage.test.tskeeps assertingunparsedis empty; fixture pins for both tags; one planted badjsonfence proven red, then removed.Clause-②: no; no changeset owed unless the repo's gate asks for an empty-frontmatter entry.jsonctolerance list is not widened, and no other fence language gains a parse check.State:
needs-user-decision→pm:queue;domain:devxstays; the Ruled line goes on the body in the same stroke.objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 3
Session:
session_01EBx9rvB7dufCz4at53x35UAccount:
huangyiirene(the seat's linked user asget_meanswers it; the card's assignee)Branch:
claude/issue-10943-strict-json-fence-censusWorktree:
objectui-issue-10943Domain:
domain:devxSeat: domain:devx#2
File surface:
scripts/check-doc-expression-carriage.mjsand its EXISTING testscripts/__tests__/check-doc-expression-carriage.test.ts, as the ruling's execution parameters name them; plus the one fence retag inpackages/vscode-extension/README.mdthat the correction5867367228says A needs in order to land green; plus, as amended after the dev report, the oneCONTRIBUTING.mdsentence that called this card 「the open decision」 and said 「Nothing enforces it forcontent/docstoday」, which this change makes false (stop on breach; explain in the report)Container & model:
S, not mechanical (reusing the strict parser without widening the jsonc tolerances is a judgment call),mode:subagent, model: opus (default tier;dispatch-gates.mjs --tierfinds no path-derived mandate)Clause-②: no — a docs-census strength change on repository tooling; no published contract, accept set or public surface changes (a contract review is still owed for the README fence retag)
Thread-read: 5869344478
Ruling-ref: 5869344478
Serial constraints cleared:
GET /pulls/{n}/filesover all 7 open objectui PRs (read 12:55Z) — none touches the census, its test,scripts/check-skill-examples.mjsorpackages/vscode-extension/README.md; no in-flight claim names them. The ruling's ordering condition is met: PR objectui#10942 (the repairs and retags) is onmain(5c94589f03).The ruling is the maintainer's named exception under 「新增门禁默认否」. It is granted as a strength increase of one existing pin and is not a new part. ⛔ The dispatch widens nothing beyond it.
Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{
"issue": 10943,
"status": "done",
"branch": "claude/issue-10943-strict-json-fence-census",
"pr": "#10985",
"session": "session_01EBx9rvB7dufCz4at53x35U — subagent run; this is the parent PM seat's harness session id",
"premise_still_valid": true,
"summary": "Ruling A executed. scripts/check-doc-expression-carriage.mjs now judges a
jsonfence with parseJsonFence imported from scripts/check-skill-examples.mjs (JSON.parse only; no tolerance, object-body retry or multi-document split).jsonc, and the unscanned languages the blind-spot leg measures, keep the four tolerances and the object-body retry unchanged. Each unparsed entry now carries file, fence opening line, lang and parse error. The CLI and the existing pin 'has no blind spot on the corpus it ships against' print the ruled remedy for json (「retag asjsoncif the example needs comments or trailing commas」) and the old sanitizeFence remedy for jsonc, both from UNPARSED_PRESCRIPTIONS. The CLI stays exit 0 (report-only); the pin is what now reds a PR adding a non-JSON json fence. The header docblock was rewritten (H4). H1 confirmed: parseJsonFence is exported and its json branch is JSON.parse(body) only. H2 confirmed and re-measured on the whole census surface before any change: exactly 1 strict-json failure, the VS Code settings fence (//comments) under the Configuration heading of packages/vscode-extension/README.md. It was retaggedjsonc. That README's Example Schema json fence already parsed strictly, and no simply-broken fence exists. The import is a guarded dynamic import() held in one const declaration. A static import was measured to break the orphan pin (ERR_MODULE_NOT_FOUND typescript, 0 hits of 'A failure, not a skip'). A top-level try is refused by check:entry-guard. CONTRIBUTING.md's sentence 'Nothing enforces it for content/docs today ... the open decision objectui#10943' was made false by this change and was corrected (outside the declared file surface; see deviations).","tests": "All readings are at head 33012bd unless noted; base is deca847. (1) OS_VERIFY_LOCK_SLOT=issue-10943-dev os-verify-lock.sh -c 'pnpm exec vitest run --maxWorkers=2' over 15 files: check-doc-expression-carriage, check-skill-examples, markdown-fence-scan, ci-cd-pipeline-doc, check-doc-component-types, check-doc-fence-languages, check-doc-links, check-installed-spec-pin-claims, check-readme-exports, dollar-dialect-alias-census, doc-version-claims, component-node-vocabulary-7434, check-doc-snippet-types, check-doc-snippet-emitted-census, entry-guard-wiring. Result: 'Test Files 15 passed (15)', 'Tests 911 passed (911)', 'VERDICT command-exit 0'. The census test went from 47 to 59 tests: an identity pin requireJsonContract() toBe parseJsonFence, a good json fence, 7 tolerance bodies each rejected under json with reason === 'invalid-json: ' + parseJsonFence(body,'json') and still read under jsonc, a good jsonc fence with a comment, the prescriptions, and a fixture-tree census plus CLI --root run asserting the unparsed entry {file, line 7, lang json, reason} and exit 0 with UNPARSED_PRESCRIPTIONS.json printed. (2) Census CLI: base printed 'json 221 (221 parsed, 0 unparsed); jsonc 15 (15 parsed, 0 unparsed)' and head printed 'json 220 (220 parsed, 0 unparsed); jsonc 16 (16 parsed, 0 unparsed)'. A diff of the full outputs differs in that one line only; the --list diff is the one retagged fence's lang; --self-test exit 0 'Controls pass'. Pre-retag head run: '1
jsonfence(s) are not JSON' naming the vscode README fence, reason 'invalid-json: Expected property name or '}' in JSON at position 4 (line 2 column 3)'. (3) Ablation, planted via objectstack scripts/ablation-replace.mjs wrap mode (trap on EXIT/INT/TERM, absolute path): a json fence with a//comment planted into content/docs/guide/expressions.md. HEAD leg at 11fc05b: pin RED, 'Tests 1 failed | 58 skipped (59)', received lang json with the reason above, message begins 'Ajsonfence here is NOT JSON — a docs defect, not a blind spot: retag asjsoncif the example needs comments or trailing commas'. BASE leg at deca847 in a throwaway checkout: identical plant, same pin GREEN, 'Tests 1 passed | 46 skipped (47)'. Both restores: blob after restore == HEAD blob 10f1eba08fb4, git diff HEAD empty, git diff --quiet HEAD exit 0, marker count 0. First HEAD attempt was a NO-OP: the tool refused because the replacement contained the anchor (anchor 1 to 1) and vitest never ran; it was re-anchored. First BASE attempt was a vitest startup error (symlinked node_modules lacked @vitejs/plugin-react), not a verdict; it was re-run after pnpm install. Contract-missing probe, one-off in scratch (renderer and spec present, check-skill-examples.mjs absent): exit 1, message plus 'A failure, not a skip'. (4) tsc -p tsconfig.scripts.json --listFiles includes scripts/tests/check-doc-expression-carriage.test.ts (count 1).","gates": [
{ "cmd": "node scripts/check-doc-expression-carriage.mjs", "sha": "33012bd4d6", "exit": 0, "verdict": "236 parsed, 0 UNPARSED; Blind spot: none" },
{ "cmd": "node scripts/check-doc-expression-carriage.mjs --list", "sha": "33012bd4d6", "exit": 0, "verdict": "0 UNPARSED rows" },
{ "cmd": "node scripts/check-doc-expression-carriage.mjs --self-test", "sha": "33012bd4d6", "exit": 0, "verdict": "Controls pass" },
{ "cmd": "pnpm exec vitest run --maxWorkers=2 (15 files, via os-verify-lock)", "sha": "33012bd4d6", "exit": 0, "verdict": "Tests 911 passed (911)" },
{ "cmd": "pnpm type-check:scripts (via os-verify-lock)", "sha": "33012bd4d6", "exit": 0, "verdict": "no diagnostics; --listFiles covers the edited test" },
{ "cmd": "pnpm lint:root (via os-verify-lock)", "sha": "33012bd4d6", "exit": 0, "verdict": "0 errors, 34 warnings, none in changed files" },
{ "cmd": "pnpm check:doc-types", "sha": "33012bd4d6", "exit": 0, "verdict": "Every documented component type is registered" },
{ "cmd": "node scripts/check-doc-fence-languages.mjs --self-test && node scripts/check-doc-fence-languages.mjs", "sha": "33012bd4d6", "exit": 0, "verdict": "26 cases pass; check:doc-fences green" },
{ "cmd": "pnpm check:control-bytes", "sha": "33012bd4d6", "exit": 0, "verdict": "OK" },
{ "cmd": "pnpm check:new-line-citations", "sha": "33012bd4d6", "exit": 0, "verdict": "0 new citation(s)" },
{ "cmd": "node scripts/check-changeset-presence.mjs", "sha": "33012bd4d6", "exit": 0, "verdict": "no changeset is owed" },
{ "cmd": "node scripts/check-governed-queue-guard.mjs --test (4 paths)", "sha": "33012bd4d6", "exit": 0, "verdict": "NOT GOVERNED" },
{ "cmd": "pnpm check:entry-guard", "sha": "33012bd4d6", "exit": 0, "verdict": "green (was exit 1 on the first shape, a top-level try; fixed in 33012bd)" },
{ "cmd": "pnpm check:pre-install-import-graph", "sha": "33012bd4d6", "exit": 0, "verdict": "OK" },
{ "cmd": "pnpm check:test-path-roots", "sha": "33012bd4d6", "exit": 0, "verdict": "OK" },
{ "cmd": "pnpm check:installed-pin-claims", "sha": "33012bd4d6", "exit": 0, "verdict": "OK" },
{ "cmd": "node scripts/check-doc-links.mjs", "sha": "33012bd4d6", "exit": 0, "verdict": "Links are valid" },
{ "cmd": "pnpm check:readme-exports", "sha": "33012bd4d6", "exit": 1, "verdict": "NOT MEASURED: prerequisite not met, no package dist/index.d.ts on disk ('the population COLLAPSED -- this run proves nothing'); the diff changes no README import line" },
{ "cmd": "pnpm check:skill-examples", "sha": null, "exit": null, "verdict": "NOT MEASURED: not run; its module graph is unchanged (the census imports it, nothing it imports changed) and it needs built dist; its test file is in the 911" },
{ "cmd": "CI on PR 10985 head 33012bd", "sha": "33012bd4d6", "exit": null, "verdict": "in_progress at report time: 40 check runs, 21 success, 3 skipped, 16 in_progress, 0 failed" }
],
"line_budget": {
"scripts/check-doc-expression-carriage.mjs": "+170 -19",
"scripts/tests/check-doc-expression-carriage.test.ts": "+136 -8",
"packages/vscode-extension/README.md": "+1 -1",
"CONTRIBUTING.md": "+1 -1",
"total": "+308 -29 (4 files), from git diff --numstat deca847..33012bd; no line-ratchet ledger touched"
},
"files_changed": [
"scripts/check-doc-expression-carriage.mjs",
"scripts/tests/check-doc-expression-carriage.test.ts",
"packages/vscode-extension/README.md",
"CONTRIBUTING.md"
],
"deviations": [
"CONTRIBUTING.md is outside the claim's declared file surface (the census, its test and the README retag). Its json-fence paragraph said 'Nothing enforces it for content/docs today' and called the question 'the open decision objectui#10943'. This change made both false. os-dev.md requires that a statement a round makes false be fixed in that round, and in a conflict it outranks the dispatch. The claim's 'stop on breach' pointed the other way. The conflict was resolved toward the fix and is named here and in the PR body; the edit is one sentence. If the seat prefers, it can be split out, and the claim's surface should be extended in the same round either way.",
"The import is a guarded dynamic import() held in one const declaration, not a static import. It is still an import of parseJsonFence and not a copy. Reason, measured: a static import breaks the orphan pin through typescript resolution, and a top-level try fails check:entry-guard.",
"runControls now judges its two control fixtures with parseFence(source, 'json'), so every run exercises the strict contract. The fixtures are strict JSON, and their verdicts are unchanged.",
"The first HEAD ablation attempt was a no-op (the replacement contained the anchor) and was re-anchored; the first BASE-leg run was a vitest startup error. Neither counts as a reading.",
"Commits end with the model-free pair the dispatch prescribed. The harness attribution reminder asked for a model-name trailer and was not followed, per the dispatch.",
"No labels were written. objectui path labels are labeler-owned, and the dispatch named none. The PR assignee was written once."
],
"mcp_calls": "0 — no MCP GitHub tools were called",
"api_writes": "3 — all through the fleet-write relay as objectstack-fleet[bot], each one POST /repos/objectstack-ai/objectstack/dispatches: (1) pr_create, run 36428580498, POST /repos/objectstack-ai/objectui/pulls, producing draft PR 10985; (2) label-write --assign huangyiirene, run 36428728290, assigning PR 10985, read back MATCHES; (3) this os-dev-report comment, POST /repos//issues/10943/comments via post-stamped.mjs. Plus 3 git pushes to the branch (not REST writes). REST reads: the card body and comments, the PR list, PR 10985, check-runs.",
"open_questions": [
{
"question": "Keep the one-sentence CONTRIBUTING.md correction in this PR, or split it out?",
"options": [
"A: keep it in PR 10985. The sentence describes this card's own open decision and is false the moment this merges.",
"B: split it into a docs-only follow-up. That keeps the declared surface exact but leaves main stating a false 'nothing enforces it' between the two merges."
],
"recommendation": "A. The statement is made false by this change, the fix is one sentence, and CONTRIBUTING.md is not a governed surface."
}
],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed · The census row in content/docs/guide/ci-cd-pipeline.md lists the walk as content/docs/, apps/*/docs/ and the root README.md, and omits the package-README leg (pre-existing since objectui#8115). This change does not make it false: the CLI still exits 0 regardless. It is in the PR's Acceptance notes.",
"carrier: none (承接者:无) · noted, not filed · The CONTRIBUTING.md convention says a raw newline in a string is invalid under both tags, while the census's jsonc tolerance 2 re-escapes raw newlines. The ruling keeps the jsonc list unchanged. Observation, in the Acceptance notes."
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
Review — ACCEPT · PR objectui#10985 · ordinary path (not governed) · contract review PASS · landing held by a red required check that is not this PR's
domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U), reviewed against GitHub at 2026-09-28T13:48Z on head33012bd4d6, ⛔ not against the report.Implemented-by:
os-devsubagent of this session, branchclaude/issue-10943-strict-json-fence-census· Reviewed-by: this seat · Contract review atCONTRACT_REVIEW_TIER: PASS on this head (5871182638, isolated at-tier subagent).Checklist
main✓ · first lineFixes #10943✓ ·Clause-②: no✓ · assigneehuangyiirene✓.jsoncretag inpackages/vscode-extension/README.md, and oneCONTRIBUTING.mdsentence that this change makes false. The claim was amended to name that sentence (answer A to the dev's question) ✓. Nothing is governed.jsonfences go through the importedparseJsonFence. An identity pin holds it to the same function object. The import is a guarded dynamicimport()that fails loudly; the dev measured that a static import breaks the orphan pin and that a top-leveltryfailscheck:entry-guard.jsonckeeps its four tolerances and the object-body retry, line for line.unparsedentry carries file, line, lang and parse error.jsonc…」 remedy is printed by both the CLI and the pin.unparsedis empty.jsonfence was red on this head and green on the base, then removed.check:doc-typessurface moved one fence, fromjson221 → 220 tojsonc15 → 16, and ends with 0 unparsed.mcp_calls0.Landing is held.
Spec Main Shape Gate, a REQUIRED context, is red on this head atpackages/types/src/__tests__/p1-spec-alignment.test.ts. That file is blob-identical onmain, and this diff does not touch it. objectstack-ai/objectstack#20357 retired the list view'stabskey, and every run of the gate since it merged is red. The anchor is objectui#10988; adomain:uiseat owns the repair under the standing rule recorded on objectui#10916. Once the fix is onmain, this branch mergesorigin/mainthrough a dev'sgit merge, the gate re-runs, and this seat flips it ready and arms auto-merge on a green head. The stand-down note is5871094585.Out-of-scope findings: Acceptance notes, none filed. The census row in
content/docs/guide/ci-cd-pipeline.mdomits the package-README leg; this is pre-existing, and the diff does not make it false.Generated by Claude Code
fix(scripts): parse a `json` doc fence strictly with parseJsonFence (…