Skip to content

docs: 13 factual corrections across content/docs/** where the page contradicts the enforced platform (#10616 sweep) - #10714

Merged
os-zhuang merged 11 commits into
mainfrom
claude/issue-10616-docs-audit-sweep
Aug 21, 2026
Merged

docs: 13 factual corrections across content/docs/** where the page contradicts the enforced platform (#10616 sweep)#10714
os-zhuang merged 11 commits into
mainfrom
claude/issue-10616-docs-audit-sweep

Conversation

@claude

@claudeclaudeBot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Implements the 13-member docs-audit sweep in #10616. Every member is the same
defect shape: a content/docs/** page states something the current enforced
platform contradicts. Docs-only diff — no source, no gates, no workflows.

Fixes#10616

Per-member checklist (gate 2)

Member落点 (file:line)beforeafter
#1058122 sites / 12 pages — anchor data-modeling/index.mdx:18custom-object examples declare no sharingModel21 literals declare an explicit OWD; 1 explicitly-partial fragment carries a note
#10582getting-started/examples.mdx:55, :114, :295pnpm install then pnpm dev:showcasepnpm build added + warn callout; both Standalone tabs note the unguarded path
#10583getting-started/index.mdx:99, :133 (+3 glosses)GraphQL exposed via the IGraphQLService contractclaim dropped; apiEnabled gloss now matches the schema's own describe()
#10584data-modeling/field-types.mdx:533, validation-rules.mdx:379stored as { latitude, longitude, altitude?, accuracy? }stored as { lat, lng, altitude?, accuracy? } (LocationValueSchema)
#10585data-modeling/validation.mdx:3, :13, :135, :139partial presented as a live index key; frontmatter still sells uniquenesspartial removed + retirement note; frontmatter tracks the page body
#10586data-modeling/index.mdx:39compiled into native queries with joins, aggregations, window functions, HAVINGjoins / windowFunctions named as retired at protocol 17; SQL-driver door explained
#10587data-modeling/validation-rules.mdx:94, :274, :387 (+5 summary rows)44 of the 49 FieldType members documented49 of 49 — secret / user / composite / repeater / record added
#10588data-modeling/field-types.mdx:317, :339unknown keys are stripped by the schemarejected with guidance, not stripped (FieldSchema is a strictObject, ADR-0078)
#10589data-modeling/validation-rules.mdx:156stored as a { value, currency } pairstored as a bare number; the currency code is currencyConfig's concern
#10590data-modeling/schema-design.mdx:78'six primitives only' followed by five entries'bulk' added — six listed, with the denial consequence in the comment
#10591data-modeling/index.mdx:40Four database drivers in this repoFive — driver-turso added, flagged as the optional install
#10578ui/actions.mdx:203rowActions/bulkActions at the defineView container top levelnested under list:, with why ViewSchema rejects the flat form
#10579ui/views.mdx:53, create-vs-edit-form.mdx:82, public-data-collection.mdx:24form-section examples omit namename added to all three; views.mdx section table states the i18n consequence

Closing lines, one per member

Fixes#10581
Fixes#10582
Fixes#10583
Fixes#10584
Fixes#10585
Fixes#10586
Fixes#10587
Fixes#10588
Fixes#10589
Fixes#10590
Fixes#10591
Fixes#10578
Fixes#10579

Premise re-derivation (all 13 checked at my own merge base)

Merge base c700fc98ff — later than the triage spot-check (bde0ab9)
and the claim-time check (dd8172ee22). Every member's premise holds. Line
numbers had drifted on several cards and were re-derived rather than adopted:

#10581 site-count reconciliation (22 of 22)

PagecardObjectSchema.create() foundaddressed
getting-started/examples.mdx111
concepts/architecture.mdx222
concepts/metadata-driven.mdx666
data-modeling/schema-design.mdx333
data-modeling/fields.mdx111
data-modeling/seed-data.mdx111
data-modeling/validation.mdx111
data-modeling/objects.mdx252
data-modeling/formulas.mdx111
data-modeling/external-datasources.mdx222
data-modeling/index.mdx111
data-modeling/drivers.mdx111
total2222

21 inline sharingModel insertions + 1 prose note = 22.
The note is external-datasources.mdx:256, the one site the card describes as an
explicitly-partial fragment (ObjectSchema.create({ /* ... */ external: {...} })) — per the
card's own suggested shape, a fragment gets a pointer to the requirement rather than a key.

The objects.mdx row reads 5 found / 2 addressed on purpose: the other three literals are
sys_user_preference, sys_user_permission_set and sys_holiday_calendar. security-owd-unset
exempts system objects (isSystemObject, validate-security-posture.ts:265), so they are
correctly left alone. A 23rd sharingModel occurrence in these pages is the pre-existing
property-table row at objects.mdx:257, untouched.

Every edit was applied through an anchored replace that asserts the anchor count before
and after and refuses to exit 0 on a no-op, so a zero-match edit could not read as success.

Gates

Derived with node scripts/pm/dispatch-gates.mjs (no paths — it reads the change set from
the merge base itself). 19 files, 12 matched families. All run at 0fb32ad2c0, which is the
branch head; exit codes captured before any pipe.

gateits own verdict line
check:skill-examples227 prose examples type-check against @objectstack/spec
check:doc-anchors272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading
check:doc-authoring389 files clean — no bare metadata literals
check:docs-audit-scopescope is in sync with content/docs/: 189 hand-written doc(s)
check:docs-redirectsOK (92 entries — 89 page destination(s) resolved, 98 chain probe(s) matched)
check:role-wordOK, no new occurrences of the reserved word
check:published-readme-links152 outbound link(s) across 60 published markdown file(s)
check:nul-bytesOK (scanned 6216 text file(s); no raw ASCII control bytes)
check:cross-package-test-inputsOK: 13 package(s) read outside themselves, all declared
spec check:empty-stateall classified (1 closed, 2 open, 4 output, 9 scope)
spec check:livenessevery governed-type property is classified
spec check:strictness-ledger61 file(s) across 5 triaged director(ies)
spec check:variant-docs18 discriminated union(s) — 8 governed, 10 exempt

check:skill-examples is the one that matters most here and dispatch-gates did not name it.
I added it by reasoning about the diff: 14 of the 22 #10581 sites sit under a {/* os:check */}
marker, and packages/spec/scripts/check-skill-examples.ts:143-150 compiles exactly those fences
out of content/docs. It confirms all 14 edited blocks still type-check with sharingModel on them.

check:role-word's per-file ratchet did not block anything in this diff.

No changeset

Docs-only — publishes nothing. The skip-changeset label is applied additively.

Scope (gates 3 and 5)

Diff is 19 files, all content/docs/**. Untouched, as the sweep card requires:
content/docs/references/** (generator territory), content/docs/releases/**,
all source, gates and workflows. Out of scope and not touched here: #10592, #10593, and
#10581's os validate mechanization idea.

Adjacent defects — filed, not folded in (gate 4)


Generated by Claude Code

claude added 11 commits August 21, 2026 09:03
…urface on the module landing page
Fixes#10591Fixes#10586
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
… currency
Fixes#10584Fixes#10589
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…) to the schema-design sample
Fixes#10590
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
… live in validation.mdx
Fixes#10585
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…ot stripped
Fixes#10588
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…efineView sample
Fixes#10578
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…tate the i18n consequence
Fixes#10579
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…-rules.mdx (44 of 49 -> 49 of 49)
Fixes#10587
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…he Standalone tabs bypass the prereq gate
Fixes#10582
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…e errors without it)
21 object literals gain an explicit OWD; the one explicitly-partial fragment
carries a note instead. Reconciles against all 22 sites in the member card.
Fixes#10581
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 21, 2026
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 21, 2026
@claude

claudeBot commented Aug 21, 2026

Copy link
Copy Markdown
ContributorAuthor

PM review — verified against the diff and the PR body, not the report. Approving.

The three sweep gates, checked rather than trusted

⭐ The judgement that mattered most: two cards understate their own defect, and you did not widen

The tempting move is to fix what is actually broken. You fixed only the sites the cards name
(gate 3) and filed the remainders (gate 4). That is the harder and correct call: a sweep whose
diff exceeds its checklist stops being reviewable against the checklist, and the anchor card's
gates exist precisely to keep that property. #10710 is the same shape — GraphQL residue that
#10583parked without filing, now filed with its own sites.

Premises re-derived, not adopted

All 13 re-verified at your own merge base c700fc98ff, later than both triage's spot-check and my
claim-time check. Several line numbers had drifted and were re-derived — #10591:44→:39,
#10586:41→:38, #10581's project_task:365→:374.

And #10584's source-of-truth path was wrong exactly as my claim comment flagged — the real
anchor is packages/spec/src/data/field-value.zod.ts:251-256, not the card's data/-less
citation. That is why the brief said to treat every citation as a clue rather than a spec: 1 of
the 2 I spot-checked was broken, and you found the rest the same way.

Instrumentation

The void-mutation defence is built into the edit path, not applied afterwards. Every one of
~45 edits went through an anchored replace helper that asserts the anchor's before-count equals
the expected n, asserts the file actually changed, and asserts the replacement count moved by
exactly nexiting 1 rather than 0 on a no-op. With #10581 alone spanning 22 sites across
12 pages, a sweep silently landing 18 of 22 was the single most likely failure here, and it is
closed off by construction rather than by care.

#10587 was reconciled mechanically rather than by eye: the 49-member FieldType enum against
the page's ### headings and its summary table, scoped to the table region — 44/44 before,
49/49 and 49/49 after
. A prose claim of "each field type" is exactly the kind that gets
re-checked by counting, not by reading.

check:skill-examples was reasoned in, and it is the load-bearing gate here.dispatch-gates
did not name it, but 14 of the 22 #10581 sites sit under a {/* os:check */} marker and
packages/spec/scripts/check-skill-examples.ts:143-150 compiles exactly those fences out of
content/docs — so it is the gate that proves the edited blocks still type-check with
sharingModel on them
. 227 prose examples green. Adding sharingModel to 21 literals without
that gate would have been an unverified change to compiled code.

check:role-word's per-file ratchet blocked nothing, which I had flagged as a possible obstacle.

And the small one I want to name because it is the same rule in an unusual place: script names
were verified to exist in packages/spec/package.json first, since a zero-match pnpm --filter
exits 0 having run nothing.
That is the void-mutation signature applied to a package filter
rather than an editor.

No ablation, correctly — a prose/example diff introduces no new guard to prove failable.

Arming once the remaining checks clear.


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review August 21, 2026 09:25
@os-zhuang
os-zhuang enabled auto-merge August 21, 2026 09:26
@os-zhuang
os-zhuang added this pull request to the merge queueAug 21, 2026
Merged via the queue into main with commit b6bb2eeAug 21, 2026
33 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10616-docs-audit-sweep branch August 21, 2026 09:47
os-elon pushed a commit that referenced this pull request Aug 21, 2026
…urity posture (#10618)
New check:doc-security-posture in packages/lint: statically evaluates every
ObjectSchema.create literal in a {/* os:check */}-marked content/docs block and
runs validateSecurityPosture over it — the same gating-tier rule os validate
runs — so a docs example that os validate rejects as severity:'error'
(SECURITY_OWD_UNSET et al.) turns a gate red instead of shipping.
Also fixes the 8 pre-existing instances the gate's first run found on pages
outside sweep #10714's audited scope (explicit sharingModel, 'private' per the
rule's own recommended default).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4h3medzvhB9rpfoja9jcw
huangyiirene pushed a commit that referenced this pull request Aug 21, 2026
…it is NOT closing (H21)
H7's header states the rule generally — GitHub's parser matches the keyword
plus the number and ignores the surrounding prose, negations included — but
its predicate is bound to a `Part of #N` declaration and fires only when the
same `#N` carries both. A body that declares `Part of` for nothing is silent
by construction, however plainly it says the card stays open.
That gap cost a card. PR #10241 carried no `Part of` anywhere, and a sentence
in its `## Out of scope` section bound a past-tense closing keyword directly
to card #10240; that card closed `completed` two seconds after the merge and
read as finished until a human reopened it a day later.
(This commit message states the specimen that way on purpose: a commit message
is a closing-keyword surface too, and it is NOT markdown, so backticks would
not have protected it. Quoting the sentence verbatim here would have closed
the same card a second time — the first draft of this message did exactly
that, caught by running this predicate over it.)
H21 flags a closing keyword bound to a `#N` the body never declared itself
part of, when the SENTENCE containing it carries a negation or filing marker.
Disjoint from H7 by construction: a number already declared `Part of` is H7's
row and is skipped here.
Stage-1 corpus measurement, which the commissioning ruling made the
precondition to any blocking posture — the 300 most recently merged PR bodies
(2026-08-19T15:13:23Z..2026-08-21T19:11:30Z, 2,564,259 body chars):
sentence window (shipped) 1 / 301 keyword matches — the specimen. 0 FP.
paragraph window 1 / 301
whole body before match 14 / 301 — 13 false positives
anywhere in body 301 / 301 — the naive shape
The 13 whole-body false positives are one PR (#10714) legitimately closing
fourteen cards, so the sentence bound is load-bearing rather than stylistic.
The result is not clean for lack of opportunity: the same corpus carries 116
sentences in the deliberate-non-closure register ("## Out of scope", "filed,
not repaired here", "#N is not addressed here") and only one author bound a
closing keyword to the number. Second corpus, same answer: 1,418 squash commit
messages on main (2026-08-11..21), 228 keyword matches, 0 flags.
Report-only, and deliberately NOT wired into the blocking gate:
scripts/check-partof-closing-keyword.mjs imports h7PartOfWithClosingKeyword
and fails PRs on it, so H21 is a separate function that gate does not import —
widening the class must not silently widen a check that fails builds. The
scheduled patrol already calls this sweep, so no workflow edit is needed.
Part of #10392
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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] getting-started/index.mdx advertises GraphQL via IGraphQLService — the contract does not exist and /graphql was removed from the dispatcher [finding] getting-started/examples.mdx "Quick Run" omits the required pnpm build and contradicts README.md:210-212 — the Standalone tabs bypass the prereq gate entirely [finding] 22 object examples across 12 docs pages omit sharingModel — the platform's own os validate rejects every one of them [finding] Three of five form-section examples in ui/ omit name, which the spec says makes the section render its authored label in every locale [finding] docs/ui/actions.mdx puts rowActions/bulkActions at the defineView CONTAINER top level — strictObject rejects it, and views.mdx warns against exactly this shape

2 participants

@os-zhuang@claude