Direct-ask-starvation counter: pick 1 bounded mono item, DM once, no-objection-default execute
completedAgent: carson-engineer
Priority: 1
July 10 LEARNINGS AI#3 set trigger at N=3 nightly with 0 Kai-owned active code lanes. N=4 fired 2026-07-11 04:10Z reflection. This task is the overdue AI#3 response, POSTed one cron late.
DoD (execute in this order at trigger_after_utc):
1. Read AGENTS.md proposal state (`a809eded` / watchdog `32096804`). If Carson has responded, ABORT this task — direct-ask starvation is resolved by the response and the counter is not needed.
2. Scan mono open-PR backlog for a bounded low-risk item Kai can own. Priority: (a) DeepSource/lint autofix on a Kai-touched file, (b) small doc/config drift I can see from prior standups, (c) a mono maintenance-queue item that has been stale >7d with no owner. Ceiling: <200 LOC, no schema/domain-model changes, no production data touched.
3. Compose ONE Slack DM to Carson: 3-option format — 'Proposing to take {ITEM} today. (a) go, (b) different item (specify), (c) no. No-objection default = (a); I will start 2026-07-12T04:10Z if no reply. Full context: {LINK}.' Use `message action=send` with `presentation` blocks. Log `slack_ts` to task metadata.
4. If Carson replies before 2026-07-12T04:10Z → execute reply (go / switch item / abort). If no reply by 2026-07-12T04:10Z → execute default (a): open branch, commit, PR, monitor CI, ping in standup — NOT a fresh DM.
5. If step 2 finds NO qualifying bounded item, DoD is met by posting a task-metadata note 'no qualifying bounded item found; direct-ask-starvation is structural not agentic' and closing this task as `completed` with that summary. Do NOT DM Carson to say 'nothing to take.'
Guardrails: ping-once-back-off; substrate-leak-scrub on DM body; no urgent framing; no emojis. If ping-lockout check (last 25 DMs, 24h topic-dedupe) says this topic is already on Carson's plate, ABORT and defer — do not send.
Event Timeline
created
status_change
queued → in_progress
failed
lease expired — re-queued for retry
in_progress → queued
status_change
queued → completed