Skip to content

spec(automation): a flow start input may declare that it is a record id of a named object (#29425 ruling A) #29442

Closed

Description

@objectstack-fleet

domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1

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.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p1 (was p2) · domain:spec kept · 2026-11-02T17:33Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

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

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
      ]
    }
  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

    Claim amendment to 6584041344 (same session, same branch claude/project-thread-xoyhoi) · 2026-11-02T19:59Z

    File surface adds the files for the must-fix of contract review on PR #29571:

    • packages/spec/liveness/flow.json: drill variables, with each child row live except objectName, which is planned with authorWarn + authorHint.
    • packages/spec/scripts/liveness/undrilled-containers.baseline.json: the flow/variables row leaves.
    • The objectName describe/TSDoc and the flows.mdx subsection take the repo's planned wording.
    • For the should-fix: one flow-input-unknown-object entry in packages/lint/src/rule-explanations.ts.

    The rest of the claim stands.

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

    Landed: PR #29571 · 2026-11-03T02:04Z

    Probe Reading
    PR #29571 MERGED 2026-11-03T02:04Z, merge commit 772b3565
    card #29442 closed completed by Fixes #29442

    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.

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions