docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(objectui): widen check-docs-section-name to singular section: and json fences - #14558

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population
Sep 2, 2026
Merged

docs(objectui): widen check-docs-section-name to singular section: and json fences#14558
baozhoutao merged 3 commits into
mainfrom
claude/issue-13880-section-name-population

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#13880

① The prior question, answered first (per triage)

The customizations: overlay-diff list this page's "Layer 2: Admin Customization"
example taught ({ field: ... } / { section: ... } entries meant to patch Layer
1's fields and add a section) is not a declared shape:

Per the ruling, the fence is rewritten, not given an anchor — same register
as the steps: wizard-template ghost layout-dsl.mdx already removed (PR
that landed as 63cf416e8, "layout-dsl teaches only shapes the live schemas
accept"). It is replaced with a <Callout type="warn"> that:

  1. States the overlay-diff list is not declared and cites the retirement
    (#13135, ADR-0126 §6, FormViewSchema.strict()).
  2. Names the real mechanism: a per-org overlay write on the view
    metadata type
    (allowOrgOverride: true on its
    DEFAULT_METADATA_TYPE_REGISTRY entry, ADR-0005) — the org's own
    FormView document, authored with the same shape Layer 1 and the earlier
    "Server Response" example already use, not a diff against the base.

The "Final Merged Layout" JSON fence right below it no longer shows a
"Billing Info" section or a // ← Admin override annotation on phone
(both were only produced by the removed fictional Layer 2) — it now shows
only what the two real layers (base schema + user preferences) actually
merge, and its one remaining section carries name: "contact_information".
The page's "Multi-Layer Resolution Engine" summary diagram got one matching
line-edit so it does not contradict the worked example directly below it
(- Custom sections: Added "Billing Info" section- Org overlay: a full FormView write, not a diff) — plain ASCII, not a fence the gate parses.

The two new selectors (② the population question)

scripts/check-docs-section-name.mjs gains, per the triage ("population by
shape, not marker, not fence language"):

  • Selector ③ — a singular YAML section: mapping (any nesting: a
    document-root key, or a sequence-item value like - section: {...}),
    judged exactly like a sections: sequence item. The YAML_SECTIONS_KEY
    prefilter widens from sections\s*: to sections?\s*:.
  • Selector ④ — a sections: [...] array inside a json/jsonc/json5
    fence, bracket-matched with the same comment-masked matcher the TS arm
    uses (not JSON.parse — a teaching fence carries // ← comments and
    JSON5 trailing commas; concept.mdx's own merged-layout fence does both).

Both are shape-based: fence language and key cardinality vary, the judgment
(does the section-shaped mapping/literal carry name?) does not.

Census, mechanically reproduced

Before this PR's docs fix (widened gate on the unmodifiedconcept.mdx,
run once to make the card's "4, not 3" mechanical):

✗ check-docs-section-name: 4 form-section example(s) in content/docs/** have no `name`
content/docs/protocol/objectui/concept.mdx:307 (Server Response json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:426 (Layer 2 `- section:` yaml — "Billing Info")
content/docs/protocol/objectui/concept.mdx:443 (Final Merged Layout json — "Contact Information")
content/docs/protocol/objectui/concept.mdx:451 (Final Merged Layout json — "Billing Info")

Note the corpus-wide widened sweep surfaced a 5th site the issue itself did not
name: the same page's earlier "Server Response" example (:307, a real,
live-shape example unrelated to the retired-protocol fence) also had a
nameless "Contact Information" section. Fixed in this PR alongside the two
the issue named (listed below) — the widened gate's own directive is "fix
every new red it turns up in content/docs/**", not only the sites a card
happened to enumerate.

After (widened gate over the full corpus, clean):

✓ check-docs-section-name: 0 nameless form-section examples — 404 docs file(s) · 1180 TS-family fence(s) ·
14 `sections: [` array(s) · 22 section literal(s) JUDGED · 13 YAML fence(s) (13 parsed, 0 skipped) ·
22 YAML section mapping(s) JUDGED · 148 json/jsonc/json5 fence(s) · 3 `"sections": [` array(s) ·
2 JSON-family section literal(s) JUDGED

Sites fixed, all in content/docs/protocol/objectui/concept.mdx:

sitefencefix
:307 ("Server Response")jsonadded "name": "contact_information"
:419 (Layer 2 customizations:)yamlrewritten to a <Callout> — no anchor added, per ①
:443/:451 (Final Merged Layout)jsondropped the Billing-Info section produced by the removed Layer 2; remaining section carries "name": "contact_information"

content/docs/ui/forms.mdx:183's "sections": [/* … */] elided placeholder
is judged as zero entries by the new arm (not skipped, not fabricated as
a nameless section) — no change needed there.
content/docs/protocol/objectui/layout-dsl.mdx's three singular section:
sites (from #13759) read ✓ named under the widened selector, as expected.
content/docs/ui/doc-pages.mdx:257 ("…from the previous section:", prose
outside any fence) does not enter the population — verified, no change.

No other content/docs/** page turned red under the widened gate; the corpus
sweep above is over the full 404-file tree.

Gates

  • node scripts/check-docs-section-name.mjs --self-test → 85 cases pass
    (real temp trees on disk; both new selectors driven RED and GREEN, both
    cardinalities of the singular-section: mapping, the JSON elided-placeholder
    and comment/trailing-comma tolerance, every new refusal exercised).
  • node scripts/check-docs-section-name.mjs → green on the merged tree (see
    census above).
  • pnpm --filter @objectstack/spec run check:yaml-examples
    concept.mdx: 0 tagged / 9 untagged (down from 0 tagged / 10 untagged
    one fewer untagged YAML fence, since the customizations: fence is gone).
  • Full derived gate list (node scripts/pm/dispatch-gates.mjs --commands,
    39 commands) run at 45312b3fb — all 39 green (three needed a one-time
    dependency-closure build first: @objectstack/spec,
    @objectstack/formula/@objectstack/lint, @objectstack/client-react
    check:doc-formula-expressions/check:doc-security-posture/
    check:skill-examples each reported PREREQUISITE NOT MET, exit 3, before
    the build — not a finding). check:pm-dispatch-gates (node scripts/pm/check-dispatch-gates.mjs) run detached under heavy shared-lock
    contention (several sibling dispatch's PRs profiling/self-testing the same
    tool concurrently): command-exit 0, dispatch-gates self-test: 1240 cases pass.
  • Re-derived the same 39-command list and re-ran check-docs-section-name.mjs
    • its --self-test at the final merge commit 38c73232d (after pulling
      main a second time, no conflicts, no overlap with this PR's two files) —
      still green; the other 38 were not re-run post-merge since none of the
      incoming commits touch scripts/check-docs-section-name.mjs or
      content/docs/protocol/objectui/** (verified via git log -- <paths>
      over the merged range).
  • A pnpm lint-narrowed ESLint pass over just the two touched files was
    attempted three times (node_modules/eslint/bin/eslint.js scripts/check-docs-section-name.mjs content/docs/protocol/objectui/concept.mdx --no-inline-config) and could not complete: each attempt queued behind
    other agents' heavy jobs on the shared verify-lock and hit the 540s
    acquisition budget before reaching the front (queue-timeout, exit 99,
    NOT MEASURED — never ran, not a finding). Not one of the 39 derived
    commands; CI's required Lint & Repo Gates job runs full pnpm lint
    regardless.

Changeset

None — scripts/** + content/docs/** only, publishes nothing. skip-changeset
label applied and read back.

Out of scope

Nothing filed — the widened gate's full-corpus sweep came back clean apart
from the sites listed above, and no unrelated defect was hit along the way.


Generated by Claude Code


Generated by Claude Code

…d json fences
- scripts/check-docs-section-name.mjs: new selector for a singular YAML
section: mapping (any nesting) and a new JSON-family arm (json/jsonc/json5)
that bracket-matches sections: [ ... ] arrays the same way the TS arm does.
Both are shape-based, not marker-based, per the #13880 triage ruling.
- content/docs/protocol/objectui/concept.mdx: the Layer 2 customizations:
overlay-diff fence taught a shape packages/spec never declared (the
retired paper metadata-customization protocol, ADR-0126 #13135) and is
replaced with a Callout citing that; the Final Merged Layout json fence and
the earlier Server Response json fence now carry name: on their sections.
Fixes#13880
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation labels Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 13:52
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 2a26536Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13880-section-name-population branch September 2, 2026 14:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] The singular section: census is 4, not 3 — concept.mdx carries a 4th nameless one, plus two more in an unjudged JSON fence

2 participants

@baozhoutao@claude