Skip to content

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

Description

@os-zhuang

Anchor card for the sweep-package promotion of the 2026-08-21 docs-audit finding wave (audit dispatch: #10563, closed). Triage seat authored per the batch-promotion rules (five gates below). This card is the claim/dispatch object; the member cards keep their finding label and are NOT dispatch candidates.

Family criterion (gate ①)

Every member is the same defect shape: a content/docs/** page states something the current enforced platform contradicts, and the fix is a prose/example correction on that page against the cited source of truth. No member changes any contract, schema, or gate.

Members (13)

Issue Page(s) One-line defect
#10581 12 pages (list in card) 22 ObjectSchema.create() examples omit sharingModel; os validate errors on every one (SECURITY_OWD_UNSET)
#10582 getting-started/examples.mdx "Quick Run" omits the required pnpm build, contradicts README.md:210-212
#10583 getting-started/index.mdx advertises GraphQL via IGraphQLService — contract does not exist, /graphql removed
#10584 data-modeling/field-types.mdx:533, validation-rules.mdx:373 location value documented {latitude,longitude}; enforced contract is {lat,lng} (field-value.zod.ts:251-256)
#10585 data-modeling/validation.mdx retired partial index key presented as live
#10586 data-modeling/index.mdx still sells joins + window functions, both retired in protocol 17
#10587 validation-rules.mdx promises constraints for "each field type", covers 44 of 49
#10588 data-modeling/field-types.mdx says unknown field keys are "stripped" — FieldSchema is a strictObject that rejects with guidance (ADR-0078)
#10589 validation-rules.mdx says currency is stored as {value,currency} — it is a bare number
#10590 data-modeling/schema-design.mdx apiMethods sample says "six primitives" and lists five — silently denies bulk
#10591 data-modeling/index.mdx "Four database drivers" — there are five; driver-turso omitted
#10578 ui/actions.mdx rowActions/bulkActions shown at defineView container top level — strictObject rejects it
#10579 ui/ form-section pages 3 of 5 form-section examples omit name

Read each member card in full before editing — each carries exact line numbers, the source-of-truth citation, and (for #10581) the full 22-site table.

Gates ②–⑤

Dispatch notes (for the devx seat)

Triage: lands in content/docs/** ⇒ domain:devx; concrete named landing spots, no open questions ⇒ pm:queue.

Activity

  1. added theissue type on Aug 21, 2026
  2. claude commented on Aug 21, 2026

    @claude
    Contributor

    Claim — PM dispatch (devx seat)

    • Session: c970724d-303c-5614-9d20-a3f92205cfad
    • Branch: claude/issue-10616-docs-audit-sweep

    Premise re-verified on origin/main = dd8172ee22 (fetched 2026-08-21T08:55:41Z), which is
    later than triage's bde0ab9 spot-check. Two members re-derived independently:

    ⚠️ Because one of the two citations I checked was wrong, the dispatch requires every member's
    line numbers and source-of-truth path to be re-derived at the dev's own merge base
    rather than
    adopted. A sweep is exactly where a stale citation gets copied into a diff without anyone
    looking.

    Same-file serial check at claim time, per the card's dispatch note: #10469 (ui/ react-pages
    sample) and #10355 (ai/agents.mdx) are both still pm:queue, unassigned, and not in flight
    from this seat
    ; neither names a file in this sweep. #10487 is not on the devx board. No serial
    constraint.

    No collision with this seat's five in-flight agents — #10653 (packages/lint), #10566
    (check-cross-package-test-inputs.mjs), #10667 (the scripts/** entry-guard burn-down), #10490
    (new gate + lint.yml) and #10664 (#10687, dispatch-gates.mjs + packages/lint). This sweep
    is content/docs/** only and touches none of them.

    The 13 member cards keep their finding label and are not dispatch candidates; this anchor
    card is the claim object.


    Generated by Claude Code

  3. claude commented on Aug 21, 2026

    @claude
    Contributor
    {
      "issue": 10616,
      "status": "done",
      "branch": "claude/issue-10616-docs-audit-sweep",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/10714",
      "premise_still_valid": true,
      "summary": "All 13 members implemented as a docs-only diff: 19 files, every one under content/docs/**, no source/gates/workflows and nothing under references/ or releases/. Every member's premise was re-derived at my own merge base c700fc98ff (later than both the triage and claim-time checks) and all 13 hold; several cards' line numbers had drifted and were re-derived rather than adopted (#10591 :44->:39, #10586 :41->:38, #10581's project_task :365->:374), and #10584's source-of-truth path was wrong exactly as the claim comment flagged (real anchor packages/spec/src/data/field-value.zod.ts:251-256). Two member cards carry census errors that do not invalidate them but do understate the defect: #10579 says 'three of five form-section examples' when the real ui/ census is 7 nameless of 15 across 5 pages and it misses content/docs/ui/forms.mdx entirely, and #10590's sibling trap exists on a second page it does not list. Both were fixed only at the sites the cards name, per gate 3, and the remainders filed as findings per gate 4.",
      "tests": "Gate set derived with `node scripts/pm/dispatch-gates.mjs` (no paths; it reads the change set from the merge base itself) -> 19 paths, 12 matched families. All gates run at branch head 0fb32ad2c0, which is the final commit, with exit codes captured before any pipe (redirect-then-capture, never `cmd | tail; EXIT=$?`). 13/13 green, each quoted from the gate's own verdict line, not from $?:\n  - check:skill-examples  -> '227 prose examples type-check against @objectstack/spec'\n  - check:doc-anchors     -> '272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading'\n  - check:doc-authoring   -> '389 files clean - no bare metadata literals'\n  - check:docs-audit-scope-> 'scope is in sync with content/docs/: 189 hand-written doc(s)'\n  - check:docs-redirects  -> 'OK (92 entries - 89 page destination(s) resolved, 98 chain probe(s) matched)'\n  - check:role-word       -> 'OK, no new occurrences of the reserved word' (the per-file ratchet blocked nothing)\n  - check:published-readme-links -> '152 outbound link(s) across 60 published markdown file(s)'\n  - check:nul-bytes       -> 'OK (scanned 6216 text file(s); no raw ASCII control bytes)'\n  - check:cross-package-test-inputs -> 'OK: 13 package(s) read outside themselves, all declared'\n  - spec check:empty-state / check:liveness / check:strictness-ledger / check:variant-docs -> all green\nREASONED, NOT NAMED BY THE TOOL: check:skill-examples. dispatch-gates left it out, 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. It compiled content/docs/data-modeling/index.mdx:14 among the 227. check:nul-bytes was also added by reasoning (any edit).\nBuild under the shared lock: `bash scripts/pm/os-verify-lock.sh -c '... pnpm --workspace-concurrency=2 --filter @objectstack/spec^... --filter @objectstack/spec build'` -> 'os-verify-lock: VERDICT command-exit 0 - held the lock 133s'; gate batch -> 'VERDICT command-exit 0 - held the lock 28s - waited 0s'. Script names were verified to exist in packages/spec/package.json first, since a zero-match pnpm --filter exits 0 having run nothing.\nNO ABLATION was run: this is a prose/example diff with no new guard to prove failable.\nVoid-mutation defence: every one of the ~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 n - it exits 1 rather than 0 on a no-op, so a zero-match edit could not read as success. Before/after counts printed per site.\n#10587 was reconciled mechanically rather than by eye: 49-member FieldType enum vs the page's ### headings and its summary table, scoped to the table region - 44/44 before, 49/49 and 49/49 after.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #10709: the ui/ form-section census is 7 nameless of 15 across 5 pages, not #10579's 'three of five' - four remain nameless (ui/forms.mdx:68, :328 and ui/views.mdx:352, :363), and ui/forms.mdx is named by no member card",
        "filed as #10710: content/docs/api/index.mdx:19 and :172 still document /graphql as a mounted route returning 501 pending an IGraphQLService implementation - the route is not mounted at all (http-dispatcher.ts:2026); #10583 parked this without filing it. Lower-severity residue at getting-started/quick-reference.mdx:135 and data-modeling/fields.mdx:319; the content/docs/references/** occurrences belong to the generator per gate 5",
        "filed as #10711: content/docs/data-modeling/objects.mdx:84's apiMethods sample omits 'bulk' too - same defect as #10590 on a page that card does not list, and it contradicts the property table twelve lines below it"
      ]
    }

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions