Skip to content

showcase: ten notify recipient slots guard an optional user field with has(FIELD) ? FIELD : null, which answers null on a null column and fails the run with no recipient #29028

Closed

Description

@objectstack-fleet

domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt

Filing gate: ① out-of-scope finding of the #28951 dev (os-dev-report 6570437242), filed by domain:server seat 5. Graded by this seat: p3, the same class as #28951 (the reference app teaches a guard that does not guard). Graded under 「定级你可以自己决定」 (Leehom, 2026-11-01).

Reach: showcase flows other than showcase_project_escalation whose notify recipients read an optional user field (assignee, owner, task.owner, task.watcher), on a record where that field is empty.
Reader who acts: a domain:server seat (examples/app-showcase/src/automation/flows/index.ts).

What happens

PR #29018 (#28951) measured that has(record.X) is true on a declared-but-null key, because the run's record is total over declared fields. So has(FIELD) ? FIELD : null answers null, and a notify whose every recipient evaluates to nothing fails the run. The same recipient guard sits in ten other notify slots of the showcase flows file. The dev did not measure the reach per slot.

Also noted, unmeasured:

  • showcase_committee_quorum's start condition … && total_amount >= 5000 on a sum summary: does it read null on a report with no lines?
  • showcase_budget_approval's start condition budget > 100000 … faults on no budget. In the live run it logged nothing and did not fire.

Wanted

Blocked-by: none (PR #29018's pattern is the reference).

Dedupe: searched showcase has() recipient null notify; only #28951. New.

Links back: #28951, PR #29018.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt

    Claim: PM loop round 1 · card thread · 2026-11-02T06:54Z
    Session: session_01FEkQ5oc56xChD6Wrc4cGSt (the seat); the card thread is card thread cmsg_01TenzsRopZj4jMbvjX8uz1XRzFmxNqPSgstp8DRYyn2mP
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-29vxs6 (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#5
    Ruling-ref: 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z) with the card's grade and this seat's rulings in the order; seat 5 refill agreed with seats 1–3 (2026-11-02T06:48Z); this seat filed the card from the #28951 dev's report.}).}
    File surface: examples/app-showcase/src/automation/ and its tests, changesets; ⛔ no packages/services/**, ⛔ no packages/spec/**
    Container & model: S, mode:thread, model and effort as the thread was opened
    Clause-②: no
    Metadata-protocol: none
    Responsibility: measure every has(...) ? ... : null notify recipient slot and the two start conditions on empty fields; fix each one that fails the run the PR #29018 way
    Thread-read: none
    Premise: holds (read at origin/main d8c611d9: ten notify slots still guard with has() in examples/app-showcase/src/automation/flows/index.ts)
    Serial constraints cleared: waits for PR #29018 (#28951, same file) to merge; the dev starts only after it does
    Resume-from: none — fresh from origin/main

    State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim. Order: pm-orders/server/order-29028.md in the project.

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt

    os-dev-report
    {
    "issue": 29028,
    "status": "done",
    "branch": "claude/project-thread-29vxs6",
    "pr": "#29099",
    "session": "session_01FEkQ5kD3ghfUkHD1rTdWYc",
    "premise_still_valid": true,
    "summary": "Measured all ten has(FIELD) ? FIELD : null notify recipient slots and both start conditions on a row with the field empty (shared flow-run kit, base 6b3ba82). Eight slots failed the run: task_completed, task_assigned_notify, task_follow_up, project_closure, fan_out_notify, nested_fan_out (owner and watcher), task_due_reminder, plus urgent_task_alert on a system write. Notices about the record fall back to role:owner (isBlank; has()+isBlank on loop rows); assignee-only messages (assigned / follow-up / due) sit behind a has_assignee decision with an isDefault edge to end. batch_reminders is fine (try_catch per iteration). budget_approval start condition faulted on a cleared budget and now tests != null first; committee_quorum is fine (sum summary stores 0). Field writes left alone: priority, ownerId, webhook assignee/project. #29018's harness moved into test/showcase-flow-run.testkit.ts and shared by both tests.",
    "tests": "fb792a78: new notify-recipient-optional-fields.test.ts 20/20, project-escalation 7/7, nested-fan-out-region-indices and inert-wirings green (68/68, os-verify-lock VERDICT command-exit 0). Red on base (flows file at 6b3ba82, tests kept): 9 failed / 11 passed (each fixed flow's empty case; controls green). Ablations via scripts/ablation-replace.mjs, one guard per fixed flow (9), each anchor 1->0, each run -t FLOW: 1 failed each; each restored to blob 9f537eab == HEAD, git diff HEAD empty. No dist on path (flows imported from src).",
    "gates": "local on fb792a7: pnpm --filter @objectstack/example-showcase test exit 0 (44 files, 538 tests) then pnpm validate exit 0 (one lock call, VERDICT command-exit 0); typecheck exit 0; eslint --no-inline-config on 4 touched files exit 0. dispatch-gates --commands derived (exit 0) but NOT MEASURED locally, reason: Leehom asked to wrap up (seat relay 07:11Z); CI runs every family, check-runs not yet read. Head 7538f3e merges origin/main, no change under examples/app-showcase.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "4 — pull_request_read get (#29018), issue_read get (#29028), issue_read get_comments (#29028), no write tools",
    "api_writes": "2 so far — relay pr_create (POST pulls + labels leg, skip-changeset) fw-20261102T071709Z-871a2f; this os-dev-report comment via post-stamped. git push not counted.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · reach: not measured (named in PR Acceptance notes) · showcase_task_done_notify_owner hands ownerId has(record.project.owner) ? record.project.owner : null to showcase_notify_owner, whose notify has no recipient on a project with no owner; order ruling 3 kept the write as is · dedupe words: notify_owner subflow ownerId null recipient",
    "carrier: seat 5 (decide whether it is the same family as #29028) · noted, not filed"
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt

    ACCEPT → PR #29099 comment 6571442012 · head 7538f3e3 · 2026-11-02T07:21Z. No contract review owed. Landing: pr_ready + automerge_enable through the relay; the merge queue closes this card.

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt

    Release: session_01FEkQ5oc56xChD6Wrc4cGSt · seat 5 signs off at the maintainer's wrap-up · back to pm:queue for the next domain:server seat
    Resume-from: claude/project-thread-29vxs6@7538f3e3

    The maintainer's words, verbatim: 「尽快提交代码,然后收工」 (2026-11-02T07:10Z) and 「自动合并中的也交给下一任跟进」 (2026-11-02T07:23Z). This is the default hand-back; seat 5 keeps no stay-behind.

    Next: PR #29099 is ACCEPTed on this head, with auto-merge armed; derived gate families were not measured locally, so CI stands in. The next seat posts Landed after merge, clears labels, and asks the coordinator to resolve the card thread.

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1

    Claim: PM loop round 1 · take-over of the predecessor's hand-back · 2026-11-02T08:11Z
    Session: session_01ADHkmQKwKFCp1m6Pb6Q8c1 (the seat; no new dev: PR #29099 is already written and ACCEPTed)
    Account: os-steve (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-29vxs6 (unchanged; the predecessor's card-thread branch)
    Worktree: none (landing watch only)
    Domain: domain:server
    Seat: domain:server#5
    Ruling-ref: the maintainer, in the os-steve project "objectstack spec": 「开 server 2、3、5 号席位, 前任已经下班,接手所有开发,包括跟进之前未完成的开发落地。」; the predecessor's Release 6571775263 names this card for the next seat-5 holder.
    File surface: as PR #29099's file list (unchanged: examples/app-showcase/src/automation/ and tests)
    Container & model: S, landing watch only, no dispatch
    Clause-②: no
    Metadata-protocol: none
    Responsibility: as the predecessor's claim on this card (unchanged)
    Thread-read: 6571775263
    Premise: holds (PR #29099 is ACCEPTed on head 7538f3e3; nothing has moved the head since the Release)
    Serial constraints cleared: none new; the PR is past review.
    Resume-from: claude/project-thread-29vxs6@7538f3e3

    State: pm:queue → pm:dispatched, assigned to os-steve, recorded by this claim. Next: PR #29099 is in the merge queue; the seat posts Landed after merge.

  9. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1

    Landed · #29028 · 2026-11-02T08:48Z

    reading value
    PR #29099 MERGED by the merge queue at 2026-11-02T08:48:05Z, merge commit 4550091a1d (head 7538f3e3, ACCEPTed by the predecessor seat)
    this card closed completed by the PR's Fixes line

    State: pm:dispatched removed; domain:server, area:automation and the type labels stay. Nothing remains 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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions