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
spec(automation): a flow start input may declare that it is a record id of a named object (#29425 ruling A) #29442
Source: ruling A on #29425 (6580257050, batch #458 item 1, maintainer 「同意」). Handled under ruling C: this card and its PR state the rule only. The ruling orders the spec half first. The server half (every start door checks a declared input) is Blocked-by this card.
Ask. A flow's start-input declaration gains an optional record-reference form: the input is the id of a record of a named object. The brief suggests type: 'record' beside objectName, the word the CRUD nodes already use. The spelling is this card's to set. Its describe states the rule: every door that starts the flow by name loads a declared input from the named object in the caller's own scope before the run exists. Unreadable → 404 RECORD_NOT_FOUND. Not an id → 400 VALIDATION_FAILED naming the input. An input without the declaration keeps #29365's visible-read rule. Wire it into the flow schema and lint where start inputs are validated, with gen artifacts and docs.
Declarations: Clause-②: yes (widening), Metadata-protocol: added. A spec minor, with a Skills-docs: line.
Read fresh. Executes [Decision] flows and records: may a flow start input declare a record reference (A), and does a non-system create stop choosing the new record's id (C)? #29425 ruling A (6580257050): a flow start input may declare that it is the record id of a named object. Metadata-protocol: added is a protocol addition, so p1 by standing ruling. ⛔ The card leaves the spelling (type: 'record' beside objectName is suggested) to the PR, and a new authorable name waits for the maintainer's approval before merge. It is handled under ruling C, so the card and the PR state the rule only. The server half is blocked behind this card.
Claim: PM loop round 2
Session: session_01JQwxbWR3K3h7i1ytwycVg1
Account: os-warren
Branch: claude/project-thread-xoyhoi (card thread; the thread can push only its own branch — measured platform exception to claude/issue-29442-…)
Worktree: objectstack-issue-29442
Domain: domain:spec
Seat: domain:spec#5
File surface: packages/spec/src/automation/flow.zod.ts (the start-input declaration) and wherever its schema actually lives under packages/spec/src/automation/, packages/lint/src/** where flow start inputs are validated, regenerated spec artifacts and docs, .changeset/29442-flow-start-input-record.md; ⛔ no packages/services/** (the server half is blocked behind this card)
Container & model: M, mode:thread, model: TIER_DEFAULT build; Clause-② widening review at CONTRACT_REVIEW_TIER (dispatch-gates --tier: contract-surface SUSPECT, the review owed by surface), effort: xhigh (p1) requested; the thread runs at the project default, only the maintainer sets effort
Clause-②: yes
Metadata-protocol: added
Responsibility: n/a — not a defect card
Thread-read: 6583861409
Premise: holds — ruling A on #29425 (6580257050) orders the spec half first; triage 6583861409 leaves the spelling to the PR and holds a new authorable name for the maintainer's approval before merge.
Serial constraints cleared: PR #29495 edits packages/lint/src/validate-flow-region-shape.ts (flow region shape, not start inputs; disjoint unless the dev's lint landing reaches that file, then merge main and the later lander resolves); no open PR touches packages/spec/src/automation/** (census of 52 open PRs at 2026-11-02T17:42Z).
{
"issue": 29442,
"status": "done",
"branch": "claude/project-thread-xoyhoi",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29571",
"head": "cfe7f4e4f",
"session": "session_01JQwxbaiSvS6eyjEknCGKao",
"premise_still_valid": true,
"summary": "Spec half of #29425 ruling A. FlowVariableSchema gains optional objectName (object-name grammar): an input declares its value is the id of one record of that object; the describe states the start-door rule (load in the caller's scope before the run exists; unreadable 404 RECORD_NOT_FOUND, not an id 400 VALIDATION_FAILED naming the input; undeclared inputs keep the visible-read rule). objectName on a non-input is refused at the key. Lint adds flow-input-unknown-object in validateFlowTriggerReadiness (warning; error under a stated package closure; sys_ not judged). Spelling chosen: objectName alone, not type 'record' beside it, because type 'record' already names a whole-record variable in examples/app-todo task.flow.ts. The new authorable name waits for the maintainer's approval before merge (triage 6583861409).",
"tests": "spec flow.test.ts + flow-bound-variable-name.test.ts: 2 files, 260 passed. lint package test: 191 files, 7876 passed, 5 skipped (new cases 4 passed). platform-objects test: 109 files, 1507 passed after the 699 to 700 translated-count pin. spec+lint typecheck: lock VERDICT command-exit 0. eslint on 6 changed sources: exit 0. No ablation: the diff adds behaviour, none was changed under a pin.",
"gates": "dispatch-gates --commands: 106 derived; --ran reconcile exit 0: 105 run, 1 NOT MEASURED (check:dual-build-cjs-loads exit 3, needs every package built, left to CI), 0 unrun. 104 exit 0 at 1f7c1d5a. check:i18n: exit 3 (CLI closure) then exit 1 on this diff's own form-row drift, fixed in 6aefef655, then exit 0; check:i18n-stale-fill exit 0; check:i18n-coverage exit 0; check-changeset-no-major and check-empty-changeset exit 0 on cfe7f4e4f. spec build lock VERDICT 0; check:generated 0 after gen:docs. CI check-runs not yet concluded at report time.",
"line_budget": "371 changed lines at the sweep tree (+350/-21, generated included), under the 3000 human-merge threshold; final head adds the bundle labels, one pin and the changeset line.",
"files_changed": [
".changeset/29442-flow-start-input-record.md",
"content/docs/automation/flows.mdx",
"content/docs/deployment/validating-metadata.mdx",
"content/docs/references/api/automation-api.mdx (gen)",
"content/docs/references/automation/flow.mdx (gen)",
"packages/lint/src/index.ts",
"packages/lint/src/validate-flow-trigger-readiness.ts",
"packages/lint/src/validate-flow-trigger-readiness.test.ts",
"packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts",
"packages/spec/authorable-surface/automation.json (gen)",
"packages/spec/dropped-refinements.baseline.json",
"packages/spec/liveness/flow.json",
"packages/spec/src/automation/flow.form.ts",
"packages/spec/src/automation/flow.test.ts",
"packages/spec/src/automation/flow.zod.ts"
],
"deviations": [
"Clause-② line written as 'yes (widening)' (card and order) where the Claim reads bare 'yes'; measured as a widening: one optional key, refusals only on that key.",
"File surface widened past the Claim: packages/platform-objects translation bundles + one test pin (check:i18n named the new form row as drift) and content/docs/deployment/validating-metadata.mdx (names the new lint id).",
"dropped-refinements.baseline.json grows by the input-only refinement (13 entries): an if/then on a value is not a projectable arm; declared, not weakened.",
"Gate sweep tree is 1f7c1d5a; the families reading the two later commits were re-run on the final head.",
"Effort: ran at the project default, not xhigh."
],
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 relay writes: pr_create (repository_dispatch, run 41505320506, PR 29571, body 10772 bytes sent = stored) and this report via post-stamped; git push is not a REST write",
"body_amendments": "none",
"open_questions": [
{
"question": "Approve objectName as the authorable spelling?",
"options": [
"A: objectName on the input (this PR)",
"B: type 'record' beside objectName, as the brief suggested"
],
"recommendation": "A, because type 'record' already names a variable holding a whole record in the shipped corpus"
},
{
"question": "Hold this PR until the server half is ready, so the describe and docs never state a rule no door enforces?",
"options": [
"A: land when approved; the changeset says it is the contract half",
"B: hold for the same release as the server half"
],
"recommendation": "B, because declared-not-enforced is the Prime Directive 10 shape; the ruling's order only requires spec first"
}
],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: Warren · skills/objectstack-automation/SKILL.md teaches variables as {name,type,isInput,isOutput}; teaching objectName is a Tier H edit, recorded as the Skills-docs follow-up owed · noted, not filed"
]
}
State: pm:dispatched removed, so the stay-behind tail is closed. A flow start input that declares a record id now carries objectName (contract review round 3 PASS 6589498225, ACCEPT 6589521351, delta re-ACCEPT 6593159998 on the merge-main head 62f9f7f6). The maintainer approved the key name, and the approval is quoted in the PR body.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p1 (was p2) ·
domain:speckept · 2026-11-02T17:33Z⛔ Not a claim.
Metadata-protocol: addedis a protocol addition, so p1 by standing ruling. ⛔ The card leaves the spelling (type: 'record'besideobjectNameis suggested) to the PR, and a new authorable name waits for the maintainer's approval before merge. It is handled under ruling C, so the card and the PR state the rule only. The server half is blocked behind this card.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1
Claim: PM loop round 2
Session:
session_01JQwxbWR3K3h7i1ytwycVg1Account:
os-warrenBranch:
claude/project-thread-xoyhoi(card thread; the thread can push only its own branch — measured platform exception toclaude/issue-29442-…)Worktree:
objectstack-issue-29442Domain:
domain:specSeat:
domain:spec#5File surface:
packages/spec/src/automation/flow.zod.ts(the start-input declaration) and wherever its schema actually lives underpackages/spec/src/automation/,packages/lint/src/**where flow start inputs are validated, regenerated spec artifacts and docs,.changeset/29442-flow-start-input-record.md; ⛔ nopackages/services/**(the server half is blocked behind this card)Container & model:
M,mode:thread,model: TIER_DEFAULT build; Clause-② widening review at CONTRACT_REVIEW_TIER (dispatch-gates --tier: contract-surface SUSPECT, the review owed by surface),effort: xhigh (p1) requested; the thread runs at the project default, only the maintainer sets effortClause-②: yes
Metadata-protocol: added
Responsibility:
n/a — not a defect cardThread-read: 6583861409
Premise: holds — ruling A on #29425 (6580257050) orders the spec half first; triage 6583861409 leaves the spelling to the PR and holds a new authorable name for the maintainer's approval before merge.
Serial constraints cleared: PR #29495 edits
packages/lint/src/validate-flow-region-shape.ts(flow region shape, not start inputs; disjoint unless the dev's lint landing reaches that file, then merge main and the later lander resolves); no open PR touchespackages/spec/src/automation/**(census of 52 open PRs at 2026-11-02T17:42Z).objectstack-fleet commentedon Nov 2, 2026
domain:spec#5 · os-warren · session_01JQwxbaiSvS6eyjEknCGKao
os-dev-report
{ "issue": 29442, "status": "done", "branch": "claude/project-thread-xoyhoi", "pr": "https://github.com/objectstack-ai/objectstack/pull/29571", "head": "cfe7f4e4f", "session": "session_01JQwxbaiSvS6eyjEknCGKao", "premise_still_valid": true, "summary": "Spec half of #29425 ruling A. FlowVariableSchema gains optional objectName (object-name grammar): an input declares its value is the id of one record of that object; the describe states the start-door rule (load in the caller's scope before the run exists; unreadable 404 RECORD_NOT_FOUND, not an id 400 VALIDATION_FAILED naming the input; undeclared inputs keep the visible-read rule). objectName on a non-input is refused at the key. Lint adds flow-input-unknown-object in validateFlowTriggerReadiness (warning; error under a stated package closure; sys_ not judged). Spelling chosen: objectName alone, not type 'record' beside it, because type 'record' already names a whole-record variable in examples/app-todo task.flow.ts. The new authorable name waits for the maintainer's approval before merge (triage 6583861409).", "tests": "spec flow.test.ts + flow-bound-variable-name.test.ts: 2 files, 260 passed. lint package test: 191 files, 7876 passed, 5 skipped (new cases 4 passed). platform-objects test: 109 files, 1507 passed after the 699 to 700 translated-count pin. spec+lint typecheck: lock VERDICT command-exit 0. eslint on 6 changed sources: exit 0. No ablation: the diff adds behaviour, none was changed under a pin.", "gates": "dispatch-gates --commands: 106 derived; --ran reconcile exit 0: 105 run, 1 NOT MEASURED (check:dual-build-cjs-loads exit 3, needs every package built, left to CI), 0 unrun. 104 exit 0 at 1f7c1d5a. check:i18n: exit 3 (CLI closure) then exit 1 on this diff's own form-row drift, fixed in 6aefef655, then exit 0; check:i18n-stale-fill exit 0; check:i18n-coverage exit 0; check-changeset-no-major and check-empty-changeset exit 0 on cfe7f4e4f. spec build lock VERDICT 0; check:generated 0 after gen:docs. CI check-runs not yet concluded at report time.", "line_budget": "371 changed lines at the sweep tree (+350/-21, generated included), under the 3000 human-merge threshold; final head adds the bundle labels, one pin and the changeset line.", "files_changed": [ ".changeset/29442-flow-start-input-record.md", "content/docs/automation/flows.mdx", "content/docs/deployment/validating-metadata.mdx", "content/docs/references/api/automation-api.mdx (gen)", "content/docs/references/automation/flow.mdx (gen)", "packages/lint/src/index.ts", "packages/lint/src/validate-flow-trigger-readiness.ts", "packages/lint/src/validate-flow-trigger-readiness.test.ts", "packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.metadata-forms.generated.ts", "packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts", "packages/spec/authorable-surface/automation.json (gen)", "packages/spec/dropped-refinements.baseline.json", "packages/spec/liveness/flow.json", "packages/spec/src/automation/flow.form.ts", "packages/spec/src/automation/flow.test.ts", "packages/spec/src/automation/flow.zod.ts" ], "deviations": [ "Clause-② line written as 'yes (widening)' (card and order) where the Claim reads bare 'yes'; measured as a widening: one optional key, refusals only on that key.", "File surface widened past the Claim: packages/platform-objects translation bundles + one test pin (check:i18n named the new form row as drift) and content/docs/deployment/validating-metadata.mdx (names the new lint id).", "dropped-refinements.baseline.json grows by the input-only refinement (13 entries): an if/then on a value is not a projectable arm; declared, not weakened.", "Gate sweep tree is 1f7c1d5a; the families reading the two later commits were re-run on the final head.", "Effort: ran at the project default, not xhigh." ], "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 relay writes: pr_create (repository_dispatch, run 41505320506, PR 29571, body 10772 bytes sent = stored) and this report via post-stamped; git push is not a REST write", "body_amendments": "none", "open_questions": [ { "question": "Approve objectName as the authorable spelling?", "options": [ "A: objectName on the input (this PR)", "B: type 'record' beside objectName, as the brief suggested" ], "recommendation": "A, because type 'record' already names a variable holding a whole record in the shipped corpus" }, { "question": "Hold this PR until the server half is ready, so the describe and docs never state a rule no door enforces?", "options": [ "A: land when approved; the changeset says it is the contract half", "B: hold for the same release as the server half" ], "recommendation": "B, because declared-not-enforced is the Prime Directive 10 shape; the ruling's order only requires spec first" } ], "security_findings": "none", "out_of_scope_findings": [ "carrier: Warren · skills/objectstack-automation/SKILL.md teaches variables as {name,type,isInput,isOutput}; teaching objectName is a Tier H edit, recorded as the Skills-docs follow-up owed · noted, not filed" ] }objectstack-fleet commentedon Nov 2, 2026
domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1
Claim amendment to 6584041344 (same session, same branch
claude/project-thread-xoyhoi) · 2026-11-02T19:59ZFile surface adds the files for the must-fix of contract review on PR #29571:
packages/spec/liveness/flow.json: drillvariables, with each child rowliveexceptobjectName, which isplannedwithauthorWarn+authorHint.packages/spec/scripts/liveness/undrilled-containers.baseline.json: theflow/variablesrow leaves.objectNamedescribe/TSDoc and the flows.mdx subsection take the repo's planned wording.flow-input-unknown-objectentry inpackages/lint/src/rule-explanations.ts.The rest of the claim stands.
fix(lint,spec): future-tense the flow-input-unknown-object consequenc…
objectstack-fleet commentedon Nov 3, 2026
domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1
Landed: PR #29571 · 2026-11-03T02:04Z
772b3565completedbyFixes #29442State:
pm:dispatchedremoved, so the stay-behind tail is closed. A flow start input that declares a record id now carriesobjectName(contract review round 3 PASS 6589498225, ACCEPT 6589521351, delta re-ACCEPT 6593159998 on the merge-main head62f9f7f6). The maintainer approved the key name, and the approval is quoted in the PR body.