Skip to content

lint: flow-region-shape-invalid anchors the whole flow; point the finding at the region container at fault #29558

Closed

Description

@objectstack-fleet

domain:server#2 · os-steve · session_01ADHkmQxwoGb5fSnrFkpxmt

立卡门: ① 在飞卡欠的后续。#29233 的修正(claim amendment 6585054494)接受了与旧本地规则的三处差异,其中「定位到出错的容器」承诺另开卡。
业务理由: 流程作者看到 flow-region-shape-invalid 只知道整个流程有问题,不知道是哪个区域容器(并行、循环等)形状不对。旧的 cli 本地规则会指到容器,挪到注册行后丢了这一层。
动手的读者: domain:server 席。改 #29495 新增的 lint 注册规则 flow-region-shape-invalid(packages/lint 内 validateFlowRegionShape),让发现带上出错容器的路径。
查重: 规则 #29495 尚未合并,没有同题卡。

Follow-up of: #29233 (PR #29526), #29049 (PR #29495)

Wanted

  • The finding's location names the container at fault (its node id / path inside the flow), not only the flow, when the engine's verdict names one. When it doesn't, the flow stays the anchor, as now.
  • Still one rule, one judge, one spelling: the engine's sentence is the message; no second call, no second check beside the registry row.
  • One finding per container at fault is acceptable; say in the PR which you chose and why.
  • Tests in the rule's own test file. Clause-②: no. Metadata-protocol: none.

Serial


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 kept · domain:server kept for now · 2026-11-03T01:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim: PM loop round 2 · card thread · 2026-11-03T01:44Z
    Session: session_01JQwxbYyp6wSRcywGFK2L4A (the seat); the card thread is session_01JQwxbYhWa8iJ59Un7Uevvs
    Account: os-warren (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-tsltk7 (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/lint/src/validate-flow-region-shape.ts and its test, the rule's rule-explanations.ts entry if the location wording moves, a changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high (order); the thread runs the project default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6592580898
    Premise: holds (on origin/main e0187d0f, flow-region-shape-invalid anchors the whole flow; the dev pins red first)
    Serial constraints cleared: PRs #29495 (7f368f56) and #29526 (0814b892) merged, clearing the card's Serial line. #29557 adds a docblock sentence to the same file and #29544 (this seat) adds a rule in packages/lint: the dev merges origin/main before the PR and after either lands.
    Resume-from: none — fresh from origin/main

    State: pm:queue → pm:dispatched, assigned to os-warren. Order: project folder pm-orders/server/seat3/order-29558.md.

  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim amendment · #29558 · 2026-11-03T01:47Z · amends claim 6593246940 (same session, same branch claude/project-thread-tsltk7)

    • Added to the file surface (forced test edits, path-only): any route moves the finding's path from flows[i] to the container inside it, so the pins of the old anchor move: packages/cli/test/validate-flow-region-shape.test.ts, packages/metadata-protocol/src/runtime-authoring-gate.flow-region.test.ts, packages/metadata-protocol/src/protocol.draft-publish-verdict.test.ts. Only the asserted path may change in them.
    • Not added (pending): the dev measured that the engine's verdict (validateControlFlow, packages/spec/src/automation/control-flow.zod.ts) is a plain Error whose only location is its sentence, so the lint side could locate the container only by parsing that sentence, and cannot locate a nested parallel at all. The contract-first route is an exported Error subclass carrying the container's path and node id, message unchanged byte for byte. That is a packages/spec change and a new public export (Clause-②: yes), so it is spec-lane work by lanes/server.md; this seat asks triage for the route (one cross-domain PR led by domain:server, or a spec card first) and does not widen the claim until it answers.
    • The dev keeps to the claimed surface meanwhile: the red pin and the lint-side reader.
  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: route ruling · spec card first · 2026-11-03T01:49Z

    ⛔ Not a claim. This answers domain:server#3's doorbell (6593296809) on amendment 6593285300.

    • Ruling: a domain:spec card first, not a cross-domain PR. The cross-domain exception path (SKILL.md L172) covers only a cross-domain PR that cannot be split. This one splits cleanly:
      • the spec half: an exported Error subclass on validateControlFlow carrying the container path and node id, with the message unchanged;
      • the lint half, which consumes it.
        The spec half is a new public export (Clause-②: yes), so contract first.
    • Filing: domain:server#3 files the spec card (filing gate ②, out-of-scope finding), citing the measurement in 6593285300. Triage grades it on first touch. A new protocol export is graded p1 under the maintainer's rule 「协议新增定 p1」. The export's name is the spec seat's call where repo precedent settles it, under the veto window.
    • This card: once the spec card exists, lint: flow-region-shape-invalid anchors the whole flow; point the finding at the region container at fault #29558 gains Blocked-by: <spec card> for the container-location part.
      • The seat keeps to the claimed surface meanwhile, or parks the draft under landing-operations.md §C.
      • ⛔ Sentence parsing to locate the container is not an acceptable stopgap. It breaks "one judge, one spelling".
    • p3 kept. domain:server stays as before, while the packages/lint routing ruling is still with the maintainer.

    Generated by Claude Code

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Release: claim 6593246940 (session_01JQwxbYyp6wSRcywGFK2L4A, card thread session_01JQwxbYhWa8iJ59Un7Uevvs, branch claude/project-thread-tsltk7) · 2026-11-03T02:40Z · reason: premise needs an upstream contract (triage route ruling 6593312043: a domain:spec card first) · next: pm:blocked
    Resume-from: claude/project-thread-tsltk7@56820bac6de5be966974d4e691656d1e232c70e5 (one commit on origin/main 1c1a5d40, pushed, no PR)

    Blocked-by: #29719

  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Blocker landed: #29719 merged via PR #29789. validateControlFlow now throws FlowRegionShapeError with path (a FlowGraph.path plus ['nodes', i], raw-indexed) and nodeId, so the lint half here can read err.path. The pm:blocked stroke is the owning lane's.

  7. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim: PM loop · card thread · resume · 2026-11-03T05:39Z
    Session: session_01JQwxbYyp6wSRcywGFK2L4A (the seat); the card thread is session_01JQwxbWp3uyRGHgDR5oyquZ
    Account: os-warren (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-n0hzwf (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#3
    File surface: as in claim 6593246940 and amendment 6593285300: packages/lint/src/validate-flow-region-shape.ts, its test, the three path-only pins, and one lint changeset. ⛔ No packages/spec/**. The dev stops if the change goes outside these files.
    Container & model: M, mode:thread, TIER_DEFAULT, effort: project default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — follow-up owed by #29233
    Thread-read: 6594065165
    Premise: holds. The contract card #29719 is closed by PR #29789 (eb05ea2f): validateControlFlow throws the exported FlowRegionShapeError, which carries path and nodeId, and the message is unchanged. The lint reader on the resume sha still has a placeholder body.
    Seat reading: the reader reads the container's path and node id with an instanceof FlowRegionShapeError check. Any other error keeps the flow as the anchor. One rule, one judge, one spelling, with no second call.
    Serial constraints cleared: no open card touches validateFlowRegionShape.
    Resume-from: claude/project-thread-tsltk7@56820bac6de5be966974d4e691656d1e232c70e5 (release 6594065165), cherry-picked onto fresh origin/main.
    Tier: S.

    State: pm:blocked → pm:dispatched, assigned to os-warren. Order: project folder pm-orders/server/seat3/order-29558.md.

  8. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim amendment · #29558 · 2026-11-03T05:43Z · amends the resume claim on this card (same seat session, card thread session_01JQwxbWp3uyRGHgDR5oyquZ, branch claude/project-thread-n0hzwf)

    • Added to the file surface (a forced test edit, path-only): packages/qa/dogfood/test/flow-region-malformed-publish.dogfood.test.ts. The edit is limited to:
      • the assertion at L120-121, where the draft read's "path" moves from "" to the loop container's "nodes.1";
      • its comment line;
      • the L19 docblock phrase "finding on the flow", which becomes "on the container".
    • Why: this is the same move as the claimed protocol.draft-publish-verdict pin. Once the reader names the container at fault, the dogfood file's path-only assertion turns red on main's full battery. Nothing else in that file changes.
    • Unchanged: Clause-②: no, Metadata-protocol: none, Tier S.
  9. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbWp3uyRGHgDR5oyquZ
    os-dev-report

    {
      "issue": 29558,
      "status": "done",
      "branch": "claude/project-thread-n0hzwf",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29821",
      "session": "session_01JQwxbWp3uyRGHgDR5oyquZ",
      "premise_still_valid": true,
      "summary": "Resumed from claude/project-thread-tsltk7@56820bac (cherry-picked as b9930969 onto origin/main eb05ea2f). containerAtFault() now reads FlowRegionShapeError with one instanceof check: path becomes flows[i] plus the error's path in lint spelling, where becomes flow 'NAME' › node 'ID'; the message is the engine's sentence, unchanged; any other error keeps the flow as the anchor. One finding per flow, which is one per container: the engine throws once at a flow's first malformed region, and a second walk is what the card rules out. The resume commit missed one in-file pin (the non-record-entry case, flows[2] to flows[2].nodes[1]); a fourth forced path-only pin outside the claim (the dogfood flow-region-malformed-publish test, path '' to nodes.1) was added by the seat's claim amendment before the edit. Lint patch changeset added. Head ccbd58d4; origin/main has since moved to 5ac50e48 with no overlap on these files.",
      "tests": "At ccbd58d4, under os-verify-lock: lint typecheck + test VERDICT command-exit 0, Test Files 192/192, Tests 7945/7945; lint rule file 10/10; cli unit validate-flow-region-shape.test.ts 7/7 (authoring-rule-command-parity is integration tier, unedited, left to CI); metadata-protocol runtime-authoring-gate.flow-region + protocol.draft-publish-verdict 57/57 after a lint build; dogfood flow-region-malformed-publish 3/3 after the dogfood closure build. Ablation via scripts/ablation-replace.mjs: the reader's instanceof return replaced with return undefined (anchor x1 to x0, blob 37494f85f3c3 to 122265b776ae), rule file 5 failed / 5 passed (the first case, the three container cases, the non-record case); restored, blob equals HEAD, git diff HEAD empty. The test imports src, so no dist leg.",
      "gates": "dispatch-gates --commands at ccbd58d4: 63 families, all run with exit codes captured before any pipe. --ran reconciliation: 63 derived, 62 run, 1 NOT MEASURED, 0 unrun. NOT MEASURED: pnpm check:dual-build-cjs-loads (exit 3 PREREQUISITE NOT MET, needs every package's dist; CI Lint & Repo Gates runs it). node scripts/check-plugin-teardown-shape.mjs --self-test exited 3 on the shallow clone (pinned fixture commit 621a4876 unreachable), exit 0 after fetching that commit (48 cases). All other families exit 0. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm; the one touched dogfood file was run by itself (3/3).",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#29821, read-back 7455 bytes sent = stored); post-stamped.mjs comment on #29558 (this report). Plus one git push (not a REST write). No labels written (none ordered; a changeset ships, so no skip-changeset).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [],
      "deviations": [
        "The PR body's maintainer quick-read section is in Chinese per os-dev.md, beside the English sections. The session context asked for a GitHub MCP assignee/reviewer step after pr_create; skipped, the order bans MCP and os-dev forbids PR assignees."
      ]
    }
  10. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Landed · 2026-11-03T07:02Z

    Probe Reading
    PR #29821 MERGED at 2026-11-03T07:02Z by the merge queue (seat ACCEPT 6597157344, auto-merge armed by the seat). Merge commit 7a25b39cf981c7eb577c7a92ee601498b9f88a82
    origin/main packages/lint/src/validate-flow-region-shape.ts reads the container through instanceof FlowRegionShapeError (containerAtFault)

    State: closed by Fixes #29558 (completed). pm:dispatched is removed.

    Delivered: flow-region-shape-invalid anchors its finding on the region container that the engine's refusal names. The path runs to that node and where names the node. The message is unchanged. Any other error keeps the flow as the anchor. Nothing is left on this card.

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

Metadata

Metadata

Assignees

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions