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-api): innerRefusal is still described as "the refusal a node's write met"; a read or a script node's function-name refusal fills it too #33402
Filing gate: ① (a follow-up owed by landed work: the contract review of PR #33390, card #32379, comment 6882343575, finding N1; the dev's out_of_scope_findings carried it with carrier: none)
What is wrong.packages/spec/src/api/automation-api.zod.ts on main still describes innerRefusal as "the refusal a node's write met" in three places: the JSDoc of FlowInnerRefusalSchema (near L319), the .describe on AutomationResult.innerRefusal (near L463), and the .describe on FlowFailureDetailsSchema.innerRefusal (near L640), plus the JSDoc near L605. The generated reference content/docs/references/api/automation-api.mdx mirrors the wording. Since PR #32257 (ADR-0150 D3), a script node whose config.function is ambiguous or outside its dependencies closure also fills it, with RESOURCE_CONFLICT, and get_record's catch arm carries a read refusal through the same refusalCarriedBy. PR #33390 corrects the api skill; the spec's own text still under-describes.
Reach. Read in the code: refusalCarriedBy (packages/services/service-automation/src/inner-refusal.ts) runs in all four data-node catch arms of builtin/crud-nodes.ts (get_record included) and in the script node's package-scoped resolveFunction refusal (builtin/screen-nodes.ts). The descriptions ship in @objectstack/spec and in the generated API reference.
Business reason. Client and agent authors read the schema descriptions and the API reference to write flow-door error handling; "a node's write" tells them a read or a function-name refusal never lands there.
Reader who acts. The domain:spec seat: wording-only .describe and JSDoc edits plus the regenerated reference, one changeset ('@objectstack/spec': patch, Clause-②: no).
Dedupe.repo:objectstack-ai/objectstack is:issue innerRefusal describe: 6 hits, the only open one is #32379 (the skill text, PR #33390). … innerRefusal "write met": 2 hits, same.
Suggested-grade: p3 (description wording; no accept-set change).
The describe text for innerRefusal in automation-api.zod.ts and the generated reference are stale since PR #32257: script-node function-name refusals fill it too. This is wording only, so p3.
Claim: PM loop round 1
Session: session_01FEkQ5mecqk8M5q9vjKj6aS (seat); card thread session_01FEkQ5mkZ32rnBNh7FK8TxM
Account: os-project-manager
Branch: claude/project-thread-qecamw
Worktree: the card thread's own checkout
Domain: domain:spec
Seat: domain:spec#4
File surface: packages/spec/src/api/automation-api.zod.ts, packages/spec/src/contracts/automation-service.ts, generated content/docs/references/api/automation-api.mdx (and any file the generator rewrites from those two sources), root .changeset/ (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate; auxiliary face, describe/JSDoc text only), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6884924903
Premise: holds
Serial constraints cleared: none (open domain:spec claims #33447#33301#33246#33153#32134 (seat 1) and #33232#33214 (seat 2) declare no surface in automation-api.zod.ts or contracts/automation-service.ts)
Ruling-ref: 「开放 p3卡认领」 (Leehom, 2026-11-14T21:21Z). Seat split with domain:spec#1 agreed in the project before this claim. Seat reading on origin/mainf068cde8: the stale sentence also sits at packages/spec/src/contracts/automation-service.ts:771; the order adds it.
os-dev-report
{
"issue": 33402,
"status": "done",
"branch": "claude/project-thread-qecamw",
"pr": "#33519",
"session": "session_01FEkQ5mkZ32rnBNh7FK8TxM",
"premise_still_valid": true,
"summary": "Wording only, head 4da1fb6. The five stale sentences (FlowInnerRefusalSchema JSDoc, AutomationResult.innerRefusal describe, FlowFailureDetailsSchema JSDoc and innerRefusal describe in automation-api.zod.ts, and AutomationResult.innerRefusal JSDoc in contracts/automation-service.ts) now say the refusal a node met inside the run (a data node's read or write, or a script node's function resolution), matching refusalCarriedBy's call sites on main: all four crud-nodes.ts catch arms (get_record included) and screen-nodes.ts's script function-resolution refusal (RESOURCE_CONFLICT). In the FlowInnerRefusalSchema JSDoc, 'the data layer gave the node' became 'the data layer (or the function resolver) gave the node' so the sentence stays true for the script node; this is the one clause touched beyond 'write met' and the PR body names it. The reference was regenerated (gen:schema + gen:docs): only the two innerRefusal rows of content/docs/references/api/automation-api.mdx moved; no other generated file changed. Changeset .changeset/33402-inner-refusal-describe.md, '@objectstack/spec': patch, Clause-②: no, Metadata-protocol: none. Mechanism hypothesis measured: check:docs (also inside check:generated) is the drift gate for content/docs/references/**, and gen:docs regenerates it.",
"tests": "No test added, nothing ablated (text only). No test pins the old sentence (git grep 'write met' on origin/main f068cde hit only the edited sites and the two generated rows). On 4da1fb6: pnpm --filter @objectstack/spec typecheck exit 0; pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/api/automation-api src/contracts/automation-service: Test Files 2 passed (2), Tests 93 passed (93), lock VERDICT command-exit 0. git grep -n -i 'write met inside' -- packages/spec/src content/docs/references: zero hits (7 on main); git grep -n 'write met' over packages/spec, content/docs, skills: zero hits describing innerRefusal.",
"gates": "Head 4da1fb6, after building spec + lint + objectql + client + client-react closures. dispatch-gates --commands --repo objectstack-ai/objectstack derived 103 commands, each run with timeout 900, exit captured before any pipe: 101 exit 0 in the loop (incl. spec check:generated, check:docs, check:skill-examples, check:nul-bytes). check-plugin-teardown-shape --self-test exit 3 (shallow clone), exit 0 after git fetch --depth=1 of its pinned fixture commit. pnpm check:dual-build-cjs-loads exit 3 = NOT MEASURED (needs every package's dist), left to CI. --ran: '103 derived famil(ies) accounted for - 102 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Local-only check-dev-prereqs exit 1 (91 of 107 packages unbuilt; checkout state, NOT MEASURED). PR check-runs: in_progress at report time. Log: /mnt/project-files/pm-orders/spec/33402-gates-ran.txt.",
"dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
"mcp_calls": "3 - mcp__github__issue_read x3 (get once, get_comments twice), all reads; no MCP write",
"api_writes": "2 - fleet-write relay pr_create (PR #33519) and this os-dev-report comment via post-stamped; plus git push of claude/project-thread-qecamw (not a REST write). Write budget spent: 3 of 3.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted in PR Acceptance notes, not filed · packages/services/service-automation/src/engine.ts:416-420 (NodeExecutionResult.innerRefusal doc) says 'this node's data call met' and 'Set by the CRUD executors' catch arms'; the script node's function-resolution refusal sets it too. Comment only, outside the spec surface.",
"carrier: none · noted in PR Acceptance notes, not filed · packages/services/service-automation/src/inner-refusal.ts:54-56 and :64 (refusalCarriedBy doc) name only crud-nodes.ts's four arms and 'a write the platform will not do'; screen-nodes.ts also calls it. Comment only."
]
}
Activity
objectstack-fleet commentedon Nov 14, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: first touch →
domain:spec· p3 ·pm:queue· 2026-11-14T22:06Z⛔ Not a claim.
The describe text for
innerRefusalinautomation-api.zod.tsand the generated reference are stale since PR #32257: script-node function-name refusals fill it too. This is wording only, so p3.objectstack-fleet commentedon Nov 14, 2026
domain:spec#4 · os-project-manager · session_01FEkQ5mecqk8M5q9vjKj6aS
Claim: PM loop round 1
Session:
session_01FEkQ5mecqk8M5q9vjKj6aS(seat); card threadsession_01FEkQ5mkZ32rnBNh7FK8TxMAccount:
os-project-managerBranch:
claude/project-thread-qecamwWorktree: the card thread's own checkout
Domain:
domain:specSeat:
domain:spec#4File surface:
packages/spec/src/api/automation-api.zod.ts,packages/spec/src/contracts/automation-service.ts, generatedcontent/docs/references/api/automation-api.mdx(and any file the generator rewrites from those two sources), root.changeset/(stop on breach; explain in the report)Container & model:
S,mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate; auxiliary face, describe/JSDoc text only),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6884924903
Premise: holds
Serial constraints cleared: none (open
domain:specclaims #33447 #33301 #33246 #33153 #32134 (seat 1) and #33232 #33214 (seat 2) declare no surface inautomation-api.zod.tsorcontracts/automation-service.ts)Ruling-ref: 「开放 p3卡认领」 (Leehom, 2026-11-14T21:21Z). Seat split with
domain:spec#1agreed in the project before this claim. Seat reading onorigin/mainf068cde8: the stale sentence also sits atpackages/spec/src/contracts/automation-service.ts:771; the order adds it.objectstack-fleet commentedon Nov 14, 2026
domain:spec#4 · os-project-manager · session_01FEkQ5mkZ32rnBNh7FK8TxM
os-dev-report
{
"issue": 33402,
"status": "done",
"branch": "claude/project-thread-qecamw",
"pr": "#33519",
"session": "session_01FEkQ5mkZ32rnBNh7FK8TxM",
"premise_still_valid": true,
"summary": "Wording only, head 4da1fb6. The five stale sentences (FlowInnerRefusalSchema JSDoc, AutomationResult.innerRefusal describe, FlowFailureDetailsSchema JSDoc and innerRefusal describe in automation-api.zod.ts, and AutomationResult.innerRefusal JSDoc in contracts/automation-service.ts) now say the refusal a node met inside the run (a data node's read or write, or a script node's function resolution), matching refusalCarriedBy's call sites on main: all four crud-nodes.ts catch arms (get_record included) and screen-nodes.ts's script function-resolution refusal (RESOURCE_CONFLICT). In the FlowInnerRefusalSchema JSDoc, 'the data layer gave the node' became 'the data layer (or the function resolver) gave the node' so the sentence stays true for the script node; this is the one clause touched beyond 'write met' and the PR body names it. The reference was regenerated (gen:schema + gen:docs): only the two innerRefusal rows of content/docs/references/api/automation-api.mdx moved; no other generated file changed. Changeset .changeset/33402-inner-refusal-describe.md, '@objectstack/spec': patch, Clause-②: no, Metadata-protocol: none. Mechanism hypothesis measured: check:docs (also inside check:generated) is the drift gate for content/docs/references/**, and gen:docs regenerates it.",
"tests": "No test added, nothing ablated (text only). No test pins the old sentence (git grep 'write met' on origin/main f068cde hit only the edited sites and the two generated rows). On 4da1fb6: pnpm --filter @objectstack/spec typecheck exit 0; pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/api/automation-api src/contracts/automation-service: Test Files 2 passed (2), Tests 93 passed (93), lock VERDICT command-exit 0. git grep -n -i 'write met inside' -- packages/spec/src content/docs/references: zero hits (7 on main); git grep -n 'write met' over packages/spec, content/docs, skills: zero hits describing innerRefusal.",
"gates": "Head 4da1fb6, after building spec + lint + objectql + client + client-react closures. dispatch-gates --commands --repo objectstack-ai/objectstack derived 103 commands, each run with timeout 900, exit captured before any pipe: 101 exit 0 in the loop (incl. spec check:generated, check:docs, check:skill-examples, check:nul-bytes). check-plugin-teardown-shape --self-test exit 3 (shallow clone), exit 0 after git fetch --depth=1 of its pinned fixture commit. pnpm check:dual-build-cjs-loads exit 3 = NOT MEASURED (needs every package's dist), left to CI. --ran: '103 derived famil(ies) accounted for - 102 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Local-only check-dev-prereqs exit 1 (91 of 107 packages unbuilt; checkout state, NOT MEASURED). PR check-runs: in_progress at report time. Log: /mnt/project-files/pm-orders/spec/33402-gates-ran.txt.",
"dogfood_battery": "n/a - no
!in the PR title and no (narrowing) arm","mcp_calls": "3 - mcp__github__issue_read x3 (get once, get_comments twice), all reads; no MCP write",
"api_writes": "2 - fleet-write relay pr_create (PR #33519) and this os-dev-report comment via post-stamped; plus git push of claude/project-thread-qecamw (not a REST write). Write budget spent: 3 of 3.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted in PR Acceptance notes, not filed · packages/services/service-automation/src/engine.ts:416-420 (NodeExecutionResult.innerRefusal doc) says 'this node's data call met' and 'Set by the CRUD executors' catch arms'; the script node's function-resolution refusal sets it too. Comment only, outside the spec surface.",
"carrier: none · noted in PR Acceptance notes, not filed · packages/services/service-automation/src/inner-refusal.ts:54-56 and :64 (refusalCarriedBy doc) name only crud-nodes.ts's four arms and 'a write the platform will not do'; screen-nodes.ts also calls it. Comment only."
]
}
Generated by Claude Code