File Linear ticket for fleet-task substrate-bugs trio (early-lease executor, cross-context binding restriction, standup-queue-for-N+1 gap)
completedFile a single bundled Linear ticket against fleet-task infrastructure (tag Victor as CTO + assignee/owner). This is the corrective for three multi-week substrate patterns now documented in LEARNINGS. The agent loop has been catching all three with compensating controls; the root causes need fleet-infra ownership.
Linear ticket title: "Fleet-task substrate bugs (early-lease executor retry-cap, cross-context message-routing restriction, standup-queue-for-N+1 gap) — bundle for fleet infra triage"
Body outline:
1) Early-lease executor pattern (12+ consecutive nights observed)
- Fleet-task executor leases scheduled tasks before metadata.trigger_after_utc, retries on the timing/status guard's intentional abort, exhausts retry_count up to max_retries=3, and marks the task `failed` (poison pill).
- Example task IDs from carson-engineer: 46070e6e (June 6 standup, hit retry cap with all 3 lease expiries before 12:30 UTC send window opened), abe49985 (June 5 standup, retry_count=1), 8277e968 (June 4 standup), cabad6a7 (June 1 standup, in-window early lease that expired mid-run then re-leased).
- Compensating control on agent side: send-side timing/status guard absorbs the early lease without firing a Slack POST; standup still delivers via main-heartbeat recovery path.
- Technical writeup: memory/2026-05-25-standup-executor-timing-status-guard.md (in carson-engineer agent repo)
- Recommended fix: executor should respect metadata.trigger_after_utc as a hard gate before leasing, not just as a content hint.
2) Cross-context message-routing restriction (May 14 + June 6, identical error text)
- Sub-agents bound to webchat context cannot use `message action=send target provider "slack"`; receive error: "Cross-context messaging denied: action=send target provider \"slack\" while bound to \"webchat\""
- This blocks recovery sub-agent send paths. Workaround: sub-agent prepares content + verifies preconditions; main heartbeat session delivers verbatim. Works but adds a recovery hop.
- Recommended fix: either allow declared cross-context send capability for fleet sub-agents, or document the restriction explicitly in the sub-agent template so the workaround pattern is baseline.
3) Standup-queue-for-N+1 gap (first miss June 7; gap pattern at the wiring-audit template layer)
- Each nightly cron queues only the next day's standup task; if cron N's queue step misses (e.g., reflection sub-agent writes the action item but doesn't POST), day N+1 has no standup at all.
- Concrete example: 2026-06-07 04:10 UTC cron wrote LEARNINGS entry committing to queue June 8 standup, but did not POST; fleet-tasks API returned 0 queued tasks across June 6 12:33 UTC → June 8 04:10 UTC. Carson got no June 7 standup.
- Compensating control on agent side (shipped 2026-06-08 cron): queue both N+1 *and* N+2 in every nightly cron so a single missed cron cannot eliminate a day.
- Recommended fix (fleet-side): consider a "standup-pipeline-liveness" check at the dashboard layer that surfaces missing-standup-for-today-after-12:30-UTC as a visible warning.
Links to include:
- LEARNINGS.md June 7 entry: ~/agents/carson-engineer/LEARNINGS.md line 1012
- LEARNINGS.md June 8 entry (this cron's reflection)
- memory/standups/2026-06-06.md (recovery substrate note from poison-pill day)
- Failed task ID `46070e6e-7fce-4d6f-b257-f939e97f4787` (June 6 standup poison pill)
Execution steps:
1. Verify Linear API access (HOME=/var/tmp/op-agent op read "op://Fleet Secrets/Linear API Key - Carson Junginger/password" OR cat /home/agent/agents/carson-engineer/.linear-token)
2. Find or create appropriate Linear team/project for fleet-infra issues (likely under BOLT or similar agent-infra label)
3. Create the ticket with title above + body composed from the outline
4. Tag Victor (assignee or @-mention) — he is CTO + fleet infra owner
5. PATCH this fleet-task with metadata.linear_issue_id once created
6. Mark this fleet-task `completed` with result.linear_url
Priority: not urgent (compensating controls catching symptoms), but multi-week pattern with concrete documented examples deserves fleet-infra triage queue presence. Single bundled ticket > three separate filings.
Event Timeline
created
status_change
queued → completed