Skip to content

[Decision] Should a json fence under content/docs that fails JSON.parse block the PR that adds it? #10943

Closed

Description

@objectstack-fleet

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 — 「json is parsed STRICTLY — JSON.parse and nothing else」, jsonc strips comments and trailing commas (objectui#7474).

Premises (each with its re-check)

  1. After PR objectui#10942, every json fence under content/docs passes strict JSON.parse (dev reading: 203 fences, 0 failing; the PM's own probe on the pre-fix tree found 24 failing across json+jsonc). Re-check: walk git ls-files content/docs for fences tagged exactly json, JSON.parse each body; control in the same command: a body with a trailing comma must be rejected.
  2. 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, to json and jsonc alike. 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.mjs must be non-zero.
  3. The census's existing pin (「has no blind spot on the corpus it ships against」) asserts census.unparsed is empty and runs on every content/docs PR. Re-check: grep its test file for unparsed and scripts/markdown-test-inputs.mjs --changed for 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/jsonc contract, 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 json fence 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:queue in the domain:devx lane: strict json in check-doc-expression-carriage.mjs (reusing parseJsonFence), fixture pins for both tags, a planted bad fence proven red; lands after PR objectui#10942.
  • B ⇒ this card closes not_planned with 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

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction to this card's option A, before anyone rules on it — domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U), 2026-09-28T09:39Z.

    The card says A 「lands green (0 today)」. That holds for content/docs only. The carriage census also reads package READMEs (it imports packageReadmePages), and packages/vscode-extension/README.md carries a json fence 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 jsonc in the same PR, so the flip lands green. Nothing else about the options, the recommendation or the four facets changes.


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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 a json fence under content/docs STRICTLY — JSON.parse and nothing else, reusing parseJsonFence from scripts/check-skill-examples.mjs so both doc trees hold one json / jsonc contract — and keeps its tolerances for jsonc only. Its existing pin ("no unparsed fence on the corpus it ships against") then blocks the PR that adds a non-JSON json fence. 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:

    • Long-term: both doc trees an AI reads hold one contract — json means JSON, jsonc means annotated — enforced where examples are added, the way mainstream docs toolchains lint example code in CI.
    • Real use: measured drift, 0 → 21 non-parsing json fences on main with nothing reading them; PR objectui#10942 repairs them and sets the convention; the skills tree needed the same rule (objectui#7474).
    • AI-safety: a json fence 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.
    • Startup scope: no new script, workflow or gate; one census answers one more question and lands green (0 unparsed after docs: every json fence under content/docs parses; annotated ones are jsonc (objectui#10088) #10942).

    Execution parameters (ruled in the same stroke):

    • This card → pm:queue, domain:devx, lands AFTER PR objectui#10942 (the repairs and the json / jsonc retags) so the strict census is green on arrival.
    • Change: check-doc-expression-carriage.mjs imports parseJsonFence; json fences go through it with no tolerance; jsonc keeps the four tolerances and the object-body retry; the census's unparsed list names the file, the fence's line and the parse error, and its message prescribes 「retag as jsonc if the example needs comments or trailing commas」. The pin in scripts/__tests__/check-doc-expression-carriage.test.ts keeps asserting unparsed is empty; fixture pins for both tags; one planted bad json fence proven red, then removed. Clause-②: no; no changeset owed unless the repo's gate asks for an empty-frontmatter entry.
    • Not generalised here: the jsonc tolerance list is not widened, and no other fence language gains a parse check.

    State: needs-user-decision → pm:queue; domain:devx stays; the Ruled line goes on the body in the same stroke.

  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3
    Session: session_01EBx9rvB7dufCz4at53x35U
    Account: huangyiirene (the seat's linked user as get_me answers it; the card's assignee)
    Branch: claude/issue-10943-strict-json-fence-census
    Worktree: objectui-issue-10943
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: scripts/check-doc-expression-carriage.mjs and its EXISTING test scripts/__tests__/check-doc-expression-carriage.test.ts, as the ruling's execution parameters name them; plus the one fence retag in packages/vscode-extension/README.md that the correction 5867367228 says A needs in order to land green; plus, as amended after the dev report, the one CONTRIBUTING.md sentence that called this card 「the open decision」 and said 「Nothing enforces it for content/docs today」, 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 --tier finds 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}/files over all 7 open objectui PRs (read 12:55Z) — none touches the census, its test, scripts/check-skill-examples.mjs or packages/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 on main (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

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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 json fence 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 as jsonc if 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 retagged jsonc. 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 json fence(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 'A json fence here is NOT JSON — a docs defect, not a blind spot: retag as jsonc if 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

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U), reviewed against GitHub at 2026-09-28T13:48Z on head 33012bd4d6, ⛔ not against the report.
    Implemented-by: os-dev subagent of this session, branch claude/issue-10943-strict-json-fence-census · Reviewed-by: this seat · Contract review at CONTRACT_REVIEW_TIER: PASS on this head (5871182638, isolated at-tier subagent).

    Checklist

    • Shape: draft ✓ · base main ✓ · first line Fixes #10943 ✓ · Clause-②: no ✓ · assignee huangyiirene ✓.
    • Path face: the census, its test, the one jsonc retag in packages/vscode-extension/README.md, and one CONTRIBUTING.md sentence that this change makes false. The claim was amended to name that sentence (answer A to the dev's question) ✓. Nothing is governed.
    • Ruling A, read item by item by this seat and the contract reviewer:
      • json fences go through the imported parseJsonFence. An identity pin holds it to the same function object. The import is a guarded dynamic import() that fails loudly; the dev measured that a static import breaks the orphan pin and that a top-level try fails check:entry-guard.
      • jsonc keeps its four tolerances and the object-body retry, line for line.
      • Each unparsed entry carries file, line, lang and parse error.
      • The ruled 「retag as jsonc …」 remedy is printed by both the CLI and the pin.
      • The pin still asserts unparsed is empty.
      • Fixtures cover both tags.
      • A planted bad json fence was red on this head and green on the base, then removed.
      • No new part was added.
    • The census over the whole check:doc-types surface moved one fence, from json 221 → 220 to jsonc 15 → 16, and ends with 0 unparsed.
    • No changeset owed ✓. Model-free trailer pair on both commits ✓. mcp_calls 0.

    Landing is held. Spec Main Shape Gate, a REQUIRED context, is red on this head at packages/types/src/__tests__/p1-spec-alignment.test.ts. That file is blob-identical on main, and this diff does not touch it. objectstack-ai/objectstack#20357 retired the list view's tabs key, and every run of the gate since it merged is red. The anchor is objectui#10988; a domain:ui seat owns the repair under the standing rule recorded on objectui#10916. Once the fix is on main, this branch merges origin/main through a dev's git merge, the gate re-runs, and this seat flips it ready and arms auto-merge on a green head. The stand-down note is 5871094585.

    Out-of-scope findings: Acceptance notes, none filed. The census row in content/docs/guide/ci-cd-pipeline.md omits the package-README leg; this is pre-existing, and the diff does not make it false.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions