Skip to content

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

Open

Description

@objectstack-fleet

domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb

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).


Generated by Claude Code

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 14, 2026
  2. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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.

  3. added
    documentationImprovements or additions to documentation
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Nov 14, 2026
  4. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · os-project-manager · session_01FEkQ5mecqk8M5q9vjKj6aS

    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/main f068cde8: the stale sentence also sits at packages/spec/src/contracts/automation-service.ts:771; the order adds it.

  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 14, 2026
  6. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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

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

Metadata

Metadata

Labels

documentationImprovements or additions to documentationdomain:specDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades itpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions