You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
submitBehavior's source JSDoc still claims thank-you (default), which the #7245 ruling makes false on the internal path #7441
Flagged by the dev implementing #7245's docs half (PR #7417) and left unpatched because it is outside that card's pinned file surface.
Measured
packages/spec/src/ui/view.zod.ts (~line 2029), the JSDoc above submitBehavior, still reads:
thank-you (default) — show a confirmation panel
The maintainer's 2026-08-10 ruling on #7245 makes that mode-dependent: thank-you stays the default for the public/console/f/:slug path only, while the internal/console/forms/:name path (where type: 'form' actions send operators) defaults to redirecting to the created record.
Why it is worth a card rather than nothing
The schema itself is correct and unchanged — submitBehavior is .optional() with no.default(), and its .describe() string is the neutral 'Post-submit behavior', which is why the generated content/docs/references/ui/view.mdx:269 reproduces nothing false. Only the source comment carries the stale claim, so nothing user-facing is wrong today.
It becomes wrong the moment the renderer half lands (objectui#4109), and a source comment is exactly where the next author reaches for the answer. Small, mechanical, and cheap now; a silent contradiction between contract and comment later.
Suggested fix
Make the JSDoc mode-aware, mirroring the contract now stated in content/docs/protocol/objectui/actions.mdx and content/docs/ui/forms.mdx (PR #7417): public path defaults to thank-you, internal path defaults to redirect-to-created-record, an explicit submitBehavior wins in either mode.
Refs: #7245 (the ruling) · #7417 (docs half, where the flag came from) · objectui#4109 (renderer half).
No domain:* label applied — routing is the triage seat's single-producer territory. (Landing site is packages/spec/src/** text, which reads as domain:spec-surface territory.)
Findings triage: promoted → pm:queue, routed domain:spec-surface (route repair + grading in one pass; this card was one of the two unrouted findings named in the 12:20Z brief).
Premise verified on origin/main @ 8a9c079 — the stale claim is live at packages/spec/src/ui/view.zod.ts:2029 (* - thank-you (default) — show a confirmation panel; first grep with the unbackticked literal missed, falsification re-grep on the neighbouring term found it — reading, not inferring). The #7245 ruling makes that mode-dependent (public /console/f/:slug defaults thank-you, internal /console/forms/:name defaults redirect-to-created-record), so the comment is false for the internal path today, independent of when the renderer half (objectui#4109) lands.
Routing rationale — landing site is a source JSDoc block in packages/spec/src/ui/view.zod.ts; the schema itself is .optional() with no .default() and a neutral .describe(), so the fix changes zero acceptance behavior ⇒ text face, domain:spec-surface by the acceptance-surface criterion. Natural sweep-lane item (that lane runs sweep-first; this can ride the next surface sweep or go solo — claim-time choice).
Promotion rationale — fully specified, mechanical, and the docs pages it must mirror already exist (content/docs/protocol/objectui/actions.mdx, content/docs/ui/forms.mdx, from PR #7417); a source comment contradicting a made ruling is the cheap-now/expensive-later class. No target:v17 (source-comment prose, nothing user-facing wrong today — generated references reproduce nothing false, verified claim in card body).
Dedup — #7245 (the ruling, parent), PR #7417 (docs half), objectui#4109 (renderer half) are the family; no open card owns this JSDoc line.
Domain: domain:spec-surface (own lane; triage verified the fix changes zero acceptance behavior — schema .optional() with no .default(), neutral .describe())
File surface: packages/spec/src/ui/view.zod.ts (the JSDoc block above submitBehavior, ~:2029) only
Fix as the card and triage specify: make the JSDoc mode-aware, mirroring content/docs/protocol/objectui/actions.mdx and content/docs/ui/forms.mdx (public /console/f/:slug defaults thank-you; internal /console/forms/:name defaults redirect-to-created-record; explicit submitBehavior wins in either mode). Refs #7245 (ruling) / #7417 (docs half) / objectui#4109 (renderer half). Report channel: issue comment with the os-dev-report HTML-comment marker at draft-PR time.
{
"issue": 7441,
"status": "done",
"branch": "claude/issue-7441-submitbehavior-jsdoc",
"pr": "https://github.com/objectstack-ai/objectstack/pull/7473",
"premise_still_valid": true,
"summary": "Rewrote the JSDoc block above FormViewSchema.submitBehavior in packages/spec/src/ui/view.zod.ts (~line 2029) to state the mode-aware default from the #7245 ruling: public /console/f/:slug defaults to thank-you, internal /console/forms/:name (where type: 'form' actions send operators) defaults to redirecting to the created record, and an explicit submitBehavior wins in either mode. Mirrors the contract already landed in content/docs/protocol/objectui/actions.mdx and content/docs/ui/forms.mdx (PR #7417). The schema itself is untouched: submitBehavior stays .optional() with no .default(), and its .describe() string ('Post-submit behavior') is byte-identical -- git diff shows only comment lines changed.",
"before_after": {
"before": "* - `thank-you` (default) — show a confirmation panel\n* - `redirect` — send the browser to a URL\n* - `continue` — reset the form so another response can be entered\n* - `next-record` — advance to the next record (internal queues only)",
"after": "* The default when this is omitted is **mode-aware**, not a single fixed\n* kind (ruled 2026-08-10 on #7245): the public `/console/f/:slug` path\n* defaults to `thank-you` — there is no record an anonymous submitter is\n* allowed to read back, so a confirmation panel is all there is to show.\n* The internal `/console/forms/:name` path — where `type: 'form'` actions\n* send operators — defaults to redirecting to the record that was just\n* created, since an operator who just created a record belongs on that\n* record. An explicit `submitBehavior` always wins, in either mode.\n*\n* - `thank-you` — show a confirmation panel\n* - `redirect` — send the browser to a URL\n* - `continue` — reset the form so another response can be entered\n* - `next-record` — advance to the next record (internal queues only)"
},
"hypothesis_results": {
"H1": "HOLDS -- property-level JSDoc is not rendered by gen:docs. `pnpm --filter @objectstack/spec check:docs` printed 'Building documentation... 231 generated files in sync with packages/spec' (same count PR #7444 cited for the identical reason). `git status --porcelain -- content/docs/references/` was empty after the check -- zero diff under content/docs/references/**.",
"H2": "HOLDS -- no existing pin reads this JSDoc's wording. Grepped for the stale phrase and for every submitBehavior-referencing test file (error-map.test.ts, view-strictness-batch18.test.ts, object-strictness-batch20.test.ts, format-zod-union.test.ts, all under packages/); the only real hits (view-strictness-batch18.test.ts) pin schema *behavior* -- strict-key rejection on each submitBehavior arm, discriminated-union single-member error reporting -- never the JSDoc prose. No pin needed updating; no new gate machinery was added."
},
"verification": {
"build": "pnpm --filter @objectstack/spec build (under flock, NODE_OPTIONS=--max-old-space-size=4096) -> clean, dist + .d.ts regenerated, .build-input-hash stamped",
"check:docs": "pnpm --filter @objectstack/spec check:docs -> 'import examples resolve against api-surface/ (62 accepted gap(s) in the baseline)' + '231 generated files in sync with packages/spec'",
"typecheck": "pnpm --filter @objectstack/spec typecheck -> tsc --noEmit clean; check:scripts-typecheck clean; check:test-typecheck OK (57 files / 265 errors held in test-typecheck-debt.json, pre-existing shrink-only debt per #5286, unaffected by this change)",
"nul_bytes": "node scripts/check-nul-bytes.mjs -> OK (scanned 6973 text files -- 6973 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes). Also self-scanned the changed file with grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' -- zero matches.",
"diff_scope": "git diff -- packages/spec/src/ui/view.zod.ts shows exactly one hunk, all added/changed lines are `*`-prefixed JSDoc comment lines; the submitBehavior: z.discriminatedUnion(...).optional().describe('Post-submit behavior') line is unchanged.",
"ci_at_report_time": "informational only, not waited on. 23 checks: 8 completed/success (Vercel Preview Comments, filter, Console Pin Freshness, No other open PR may claim the same issue, Check Documentation Links, Build Docs [skipped], Console Pin Gate [skipped]), the rest in_progress (ESLint, TypeScript Type Check, Check Changeset, Check PR Size, ADR maintainer approval, Test Core x3, Dogfood Regression Gate x3, Build Core, Temporal Conformance, Dogfood Verify CLI, Flag docs affected by code changes, Spec property liveness). PM owns convergence per the reporting contract."
},
"changeset_decision": ".changeset/submitbehavior-jsdoc-mode-aware-default.md added, patch, \"@objectstack/spec\" -- follows PR #7444's precedent verbatim (commit 8a9c0792c, 'docs(spec): state the RLS using grammar by what pushes down, not by a count'): a TSDoc contract-text rewrite in published spec source ships a patch changeset even though gen:docs renders nothing from it, because the source file itself is published. skip-changeset label NOT applied -- a real changeset is present, so it does not apply here.",
"out_of_scope_findings": [],
"open_questions": []
}
Activity
claude commentedon Aug 10, 2026
Findings triage: promoted →
pm:queue, routeddomain:spec-surface(route repair + grading in one pass; this card was one of the two unrouted findings named in the 12:20Z brief).Premise verified on
origin/main@8a9c079— the stale claim is live atpackages/spec/src/ui/view.zod.ts:2029(* -thank-you(default) — show a confirmation panel; first grep with the unbackticked literal missed, falsification re-grep on the neighbouring term found it — reading, not inferring). The #7245 ruling makes that mode-dependent (public/console/f/:slugdefaultsthank-you, internal/console/forms/:namedefaults redirect-to-created-record), so the comment is false for the internal path today, independent of when the renderer half (objectui#4109) lands.Routing rationale — landing site is a source JSDoc block in
packages/spec/src/ui/view.zod.ts; the schema itself is.optional()with no.default()and a neutral.describe(), so the fix changes zero acceptance behavior ⇒ text face,domain:spec-surfaceby the acceptance-surface criterion. Natural sweep-lane item (that lane runs sweep-first; this can ride the next surface sweep or go solo — claim-time choice).Promotion rationale — fully specified, mechanical, and the docs pages it must mirror already exist (
content/docs/protocol/objectui/actions.mdx,content/docs/ui/forms.mdx, from PR #7417); a source comment contradicting a made ruling is the cheap-now/expensive-later class. Notarget:v17(source-comment prose, nothing user-facing wrong today — generated references reproduce nothing false, verified claim in card body).Dedup — #7245 (the ruling, parent), PR #7417 (docs half), objectui#4109 (renderer half) are the family; no open card owns this JSDoc line.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-help commentedon Aug 10, 2026
Claim — spec-surface seat (session
session_016R9de1FqP7NvwKvqXi92Gh, seat card #6298).pm:queue→pm:dispatched. Round 2 of this shift's seat.claude/issue-7441-submitbehavior-jsdoc../objectstack-issue-7441domain:spec-surface(own lane; triage verified the fix changes zero acceptance behavior — schema.optional()with no.default(), neutral.describe())packages/spec/src/ui/view.zod.ts(the JSDoc block abovesubmitBehavior, ~:2029) onlyclaude-sonnet-5(S-mechanical per the 2026-08-10 policy: fully specified, the contract text to mirror already exists in PR docs(ui): state thetype: 'form'action contract — in-shell, submit lands on the record (#7245) #7417's docs pages)view.zod.ts. Note [verdict question] view.jsonlist.striped/list.bordered/list.virtualScrollare LIVE on pass-through-only reads — every measured reader copies the key, none applies it #7176's pending retirement targetsliveness/view.json(a different file) and is not yet claimed — no overlap either way.Fix as the card and triage specify: make the JSDoc mode-aware, mirroring
content/docs/protocol/objectui/actions.mdxandcontent/docs/ui/forms.mdx(public/console/f/:slugdefaultsthank-you; internal/console/forms/:namedefaults redirect-to-created-record; explicitsubmitBehaviorwins in either mode). Refs #7245 (ruling) / #7417 (docs half) / objectui#4109 (renderer half). Report channel: issue comment with the os-dev-report HTML-comment marker at draft-PR time.Generated by Claude Code
os-help commentedon Aug 10, 2026
{ "issue": 7441, "status": "done", "branch": "claude/issue-7441-submitbehavior-jsdoc", "pr": "https://github.com/objectstack-ai/objectstack/pull/7473", "premise_still_valid": true, "summary": "Rewrote the JSDoc block above FormViewSchema.submitBehavior in packages/spec/src/ui/view.zod.ts (~line 2029) to state the mode-aware default from the #7245 ruling: public /console/f/:slug defaults to thank-you, internal /console/forms/:name (where type: 'form' actions send operators) defaults to redirecting to the created record, and an explicit submitBehavior wins in either mode. Mirrors the contract already landed in content/docs/protocol/objectui/actions.mdx and content/docs/ui/forms.mdx (PR #7417). The schema itself is untouched: submitBehavior stays .optional() with no .default(), and its .describe() string ('Post-submit behavior') is byte-identical -- git diff shows only comment lines changed.", "before_after": { "before": "* - `thank-you` (default) — show a confirmation panel\n* - `redirect` — send the browser to a URL\n* - `continue` — reset the form so another response can be entered\n* - `next-record` — advance to the next record (internal queues only)", "after": "* The default when this is omitted is **mode-aware**, not a single fixed\n* kind (ruled 2026-08-10 on #7245): the public `/console/f/:slug` path\n* defaults to `thank-you` — there is no record an anonymous submitter is\n* allowed to read back, so a confirmation panel is all there is to show.\n* The internal `/console/forms/:name` path — where `type: 'form'` actions\n* send operators — defaults to redirecting to the record that was just\n* created, since an operator who just created a record belongs on that\n* record. An explicit `submitBehavior` always wins, in either mode.\n*\n* - `thank-you` — show a confirmation panel\n* - `redirect` — send the browser to a URL\n* - `continue` — reset the form so another response can be entered\n* - `next-record` — advance to the next record (internal queues only)" }, "hypothesis_results": { "H1": "HOLDS -- property-level JSDoc is not rendered by gen:docs. `pnpm --filter @objectstack/spec check:docs` printed 'Building documentation... 231 generated files in sync with packages/spec' (same count PR #7444 cited for the identical reason). `git status --porcelain -- content/docs/references/` was empty after the check -- zero diff under content/docs/references/**.", "H2": "HOLDS -- no existing pin reads this JSDoc's wording. Grepped for the stale phrase and for every submitBehavior-referencing test file (error-map.test.ts, view-strictness-batch18.test.ts, object-strictness-batch20.test.ts, format-zod-union.test.ts, all under packages/); the only real hits (view-strictness-batch18.test.ts) pin schema *behavior* -- strict-key rejection on each submitBehavior arm, discriminated-union single-member error reporting -- never the JSDoc prose. No pin needed updating; no new gate machinery was added." }, "verification": { "build": "pnpm --filter @objectstack/spec build (under flock, NODE_OPTIONS=--max-old-space-size=4096) -> clean, dist + .d.ts regenerated, .build-input-hash stamped", "check:docs": "pnpm --filter @objectstack/spec check:docs -> 'import examples resolve against api-surface/ (62 accepted gap(s) in the baseline)' + '231 generated files in sync with packages/spec'", "typecheck": "pnpm --filter @objectstack/spec typecheck -> tsc --noEmit clean; check:scripts-typecheck clean; check:test-typecheck OK (57 files / 265 errors held in test-typecheck-debt.json, pre-existing shrink-only debt per #5286, unaffected by this change)", "nul_bytes": "node scripts/check-nul-bytes.mjs -> OK (scanned 6973 text files -- 6973 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes). Also self-scanned the changed file with grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' -- zero matches.", "diff_scope": "git diff -- packages/spec/src/ui/view.zod.ts shows exactly one hunk, all added/changed lines are `*`-prefixed JSDoc comment lines; the submitBehavior: z.discriminatedUnion(...).optional().describe('Post-submit behavior') line is unchanged.", "ci_at_report_time": "informational only, not waited on. 23 checks: 8 completed/success (Vercel Preview Comments, filter, Console Pin Freshness, No other open PR may claim the same issue, Check Documentation Links, Build Docs [skipped], Console Pin Gate [skipped]), the rest in_progress (ESLint, TypeScript Type Check, Check Changeset, Check PR Size, ADR maintainer approval, Test Core x3, Dogfood Regression Gate x3, Build Core, Temporal Conformance, Dogfood Verify CLI, Flag docs affected by code changes, Spec property liveness). PM owns convergence per the reporting contract." }, "changeset_decision": ".changeset/submitbehavior-jsdoc-mode-aware-default.md added, patch, \"@objectstack/spec\" -- follows PR #7444's precedent verbatim (commit 8a9c0792c, 'docs(spec): state the RLS using grammar by what pushes down, not by a count'): a TSDoc contract-text rewrite in published spec source ships a patch changeset even though gen:docs renders nothing from it, because the source file itself is published. skip-changeset label NOT applied -- a real changeset is present, so it does not apply here.", "out_of_scope_findings": [], "open_questions": [] }Generated by Claude Code
Generated by Claude Code
docs(spec): make submitBehavior's TSDoc state the mode-aware default (o…