Skip to content

docs(spec): the form.sharing and formViews liveness rows quote the code as it reads now - #24296

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24063-view-liveness-evidence
Oct 18, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24063-view-liveness-evidence

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #24063

Clause-②: no

Two evidence strings in packages/spec/liveness/view.json quoted code that main no longer has. This PR rewrites them to cite the code as it reads now. Both verdicts were right and stay live. This is the dispatched card under claim 6248142626, with main at d537a318b3 (the base of this branch; origin/main was re-fetched before this PR and had not moved).

What changes

row quoted before (base d537a318b3) cited now
form.sharing slugMatchesPublicLink(sharing.publicLink, slug) packages/rest/src/form-routes.ts#findPublicFormView, quoting for (const c of anonymousFormIntakeCandidates(view)) and if (c.slug !== slug) continue; · packages/spec/src/ui/anonymous-form-intake.ts#anonymousFormIntakeCandidates, which hands each form's sharing to anonymousFormIntakeSlug (the nested form, every formViews entry, and the flattened config of a viewKind: 'form' item) · packages/spec/src/ui/anonymous-form-intake.ts#anonymousFormIntakeSlug, quoting the three key reads if (s.enabled !== true) return null;, if (s.allowAnonymous !== true) return null;, if (typeof s.publicLink !== 'string' || !s.publicLink) return null; · packages/rest/src/form-routes.ts#resolveFormBySlug (kept)
formViews const formViews = view.formViews packages/spec/src/ui/anonymous-form-intake.ts#anonymousFormIntakeCandidates, quoting for (const [key, fv] of Object.entries(v.formViews)) forms.push({ form: fv, key }); · packages/spec/src/ui/view.zod.ts#expandViewContainerWithDiagnostics (kept, unchanged)

⛔ No verdict, key, note or other row changes. Checked on the parsed JSON: base d537a318b3 and HEAD differ at exactly two paths, .props.form.children.sharing.evidence and .props.formViews.evidence. Both verifiedAt values stay as they are, because the card forbids key changes.

Readings (each a count plus the tree it was taken against)

Repository objectstack-ai/objectstack. Base d537a318b3, HEAD e8dd32685.

  • The two stale quotes, git grep -n -F over packages: at the base, each has exactly 1 hit, view.json:356 (slugMatchesPublicLink) and view.json:392 (const formViews = view.formViews). At HEAD there are 0 hits (exit 1). Positive control at HEAD: findPublicFormView in packages/rest/src/form-routes.ts gives 2 lines (exit 0).
  • A caution on this reading: the pathspec packages/*/src also answers 0 for findPublicFormView, which exists. A git pathspec glob has to match the whole path, so packages/*/src matches no file. The zero readings above use -- packages, with the control beside them.
  • The positions in E1 hold at HEAD: const findPublicFormView = ( at packages/rest/src/form-routes.ts:132, export function anonymousFormIntakeSlug( at packages/spec/src/ui/anonymous-form-intake.ts:74, and export function anonymousFormIntakeCandidates( at :84.
  • Every anchor and every backticked fragment in the two rewritten strings was checked against the file its clause names, read with git show HEAD:PATH, by substring count. All 6 anchors are present. All 13 fragments occur at least once: each of the 7 quoted code lines occurs exactly once, and the 6 single words occur several times (sharing 10, formViews 6, viewKind: 'form' 2). Result: 0 misses.

Which gate reads these citations (E2)

pnpm --filter @objectstack/spec check:liveness (packages/spec/scripts/liveness/evidence.mts#checkEvidenceAnchors, plus key-mention.mts) resolves each repo-local path#symbol token. It checks that the cited file names the symbol as a word, and that every cited file names the row's key. It does not read backticked quotes. Those are checked only by the readings above, which is how both stale quotes survived a green gate. check:spec-docblock-symbol-anchors covers packages/spec/src/** doc prose only, not the ledger JSON.

  • Base d537a318b3: exit 0. symbol anchors: 947 pointer(s) written path#symbol, 947 naming a symbol the cited file contains. key-mention anchoring: 737 (entry, cited file) pair(s) asked, 736 anchored, 1 exempt.
  • HEAD e8dd32685: exit 0. symbol anchors: 949 ..., 949 naming a symbol the cited file contains. key-mention anchoring: 738 ... pair(s) asked, 737 anchored, 1 exempt. The deltas are +2 anchors and +1 pair: the sharing row now anchors two symbols in anonymous-form-intake.ts.
  • One-shot mutation, to prove the gate reads the new anchors. The fix was committed first. With node scripts/ablation-replace.mjs (wrap mode, trap-armed, absolute path), #anonymousFormIntakeSlug (the slug rule became #anonymousFormIntakeSlugGone (the slug rule. Result: check:liveness exit 1, with 949 pointer(s) ..., 948 naming a symbol ..., 1 UNRESOLVED and view/form.sharing → packages/spec/src/ui/anonymous-form-intake.ts#anonymousFormIntakeSlugGone. Restore: the blob after restore equals the HEAD blob (60737e436b96), git diff HEAD is empty and git status --porcelain is clean. No permanent test was added.

Tests and gates (all after the final commit, HEAD e8dd32685)

  • pnpm --filter @objectstack/spec build (verify lock): exit 0.
  • @objectstack/spec vitest run --project local --maxWorkers=2 (verify lock): Test Files 694 passed (694), Tests 21027 passed | 1 todo, exit 0.
  • pnpm --filter @objectstack/spec typecheck (verify lock): exit 0. No TS file imports a liveness ledger (git grep exit 1, with a positive control), and tsconfig.json includes src/** only.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 62 commands from the merge base d537a318b. Of those, 60 exited 0. Two exited 3 with PREREQUISITE NOT MET, so they are NOT MEASURED: pnpm check:dual-build-cjs-loads needs every package's dist/ (69 of 70 are absent in this worktree) and pnpm check:lean-entry-closure needs packages/objectql/dist. This narrowing is declared: the diff changes no build input of any package, and CI's Lint & Repo Gates runs both. --ran printed 62 derived famil(ies) accounted for — 60 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3).
  • check:nul-bytes: exit 0. check:skill-frame-freshness (local-only): exit 0. check:dev-prereqs (local-only): exit 1, The workspace is not built. That is a reading of this worktree's state (only packages/spec is built), not of the diff.
  • No ablation: the diff changes ledger data and no tested behaviour.
  • The whole farm is CI's. The check-runs on this PR are the verdict of record.

Acceptance notes

  • The check:liveness anchor check reads path#symbol and the key-mention check reads file-level mentions, but nothing reads a row's backticked quoted code. Both stale quotes here passed a green gate because the anchors still resolved. This is an observation only. Nothing is filed, and no gate is proposed. Carrier: none.
  • Both rows' note fields still carry superseded rest-server.ts:NNNN line pointers. Each note marks them itself as "superseded by the anchors". The card forbids note changes, so they stay. Carrier: none.
  • Both rows keep verifiedAt: 2026-08-28, although their evidence was re-read for this PR. The card forbids key changes. Carrier: none.

Generated by Claude Code

…de as it reads now

The two rows' evidence quoted code that no longer exists on main
(`slugMatchesPublicLink(...)` and `const formViews = view.formViews`).
They now cite findPublicFormView in packages/rest/src/form-routes.ts and
anonymousFormIntakeCandidates / anonymousFormIntakeSlug in
packages/spec/src/ui/anonymous-form-intake.ts, quoting only text those
files carry. The sharing row names all three keys the slug rule reads.
Verdicts, notes and every other row are unchanged.

Claude-Session: https://claude.ai/code/session_019oFY6Hi35J7atvgVFnmoaK
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling labels Oct 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (packages/spec/liveness/view.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/spec/liveness/view.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 143 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json d537a318b3116a2bcb4f70cf85ffd2a05c13d002 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 (seat check) · PR #24296 · domain:spec seat 2 · zhuangjianguo · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-18T09:45Z

ACCEPT at head e8dd32685675ea23fa5686c269995cf6047f1468 (card #24063, claim 6248142626). It lands once every check on this head is green. No contract review is owed:

  • the diff is packages/spec/liveness/view.json evidence text plus a changeset (record-recognisers --paths → TIER_DEFAULT, no schema face);
  • Clause-②: no; not a governed surface (15 changed lines).
item reading
Shape Draft, base main. The body's line 1 is Fixes #24063, then Clause-②: no; no other closing keyword. Assignee = the card's. 2 files.
Only the two evidence strings move The diff touches form.children.sharing.evidence and formViews.evidence. status, verifiedAt and note are byte-identical, as the card asks.
Every quoted fragment is on origin/main git grep -c -F, 1 hit each, in the file each clause names. form-routes.ts: for (const c of anonymousFormIntakeCandidates(view)), if (c.slug !== slug) continue;, publicFormGrant: { object: match.object }. anonymous-form-intake.ts: the three return null key reads (enabled, allowAnonymous, publicLink) and for (const [key, fv] of Object.entries(v.formViews)) forms.push({ form: fv, key });. The anchors resolve: the dev's mutation of #anonymousFormIntakeSlug turned check:liveness red.
The resolveFormBySlug rewording (deviation 1) Accepted. On main, resolveFormBySlug (form-routes.ts:174) is the lookup both doors share (:218), and the grant is set where the clause now says. The old "grants" overstated it.
Changeset '@objectstack/spec': patch; liveness ships in files[]. Its Clause-②: no (…) line parses as declared · no · arm null (readClause2Line), so the gates read it. The three bullets match the diff.
Gates (check-runs on this head, read now) 38 runs: 17 success, 6 skipped, 15 in progress, 0 failure. Not converged, so it does not land yet.
Out of scope All Acceptance notes, none a card: the gate does not read backticked quotes (an observation, and the dev proposes no gate, rightly: 新增门禁默认否); the superseded rest-server.ts:NNNN pointers inside the notes; verifiedAt left as it was.
Landing After every check on this head is green: pr_ready then automerge_enable, through the relay.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 18, 2026 10:16
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 18, 2026 10:16
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 18, 2026
Merged via the queue into main with commit 2ee5861 Oct 18, 2026
42 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24063-view-liveness-evidence branch October 18, 2026 10:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

2 participants