Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
251 commits
Select commit Hold shift + click to select a range
b843c66
fix: keep local no-mistakes tests intent-targeted (#823)
kunchenguid Jul 22, 2026
f02eef1
feat: add canonical timed test runner (#825)
kunchenguid Jul 22, 2026
f61e65c
fix: surface main inventory gaps in Bearings (#830)
kunchenguid Jul 22, 2026
622d467
feat: add bounded concurrent test isolation proof (#832)
kunchenguid Jul 22, 2026
14c0d5f
feat: guard against missed secondmate reports (#834)
kunchenguid Jul 22, 2026
f6c281a
feat: require pinned real-Herdr CI coverage (#838)
kunchenguid Jul 22, 2026
673b6ad
feat: shard portable tests and add bounded local parallelism (#841)
kunchenguid Jul 22, 2026
50cc24a
fix: block primary-session delegation outside the fleet (#854)
ItsFlow Jul 22, 2026
f5bdea3
fix: install tasks-axi in portable CI shards (#866)
kunchenguid Jul 22, 2026
5140413
feat(bin): make dispatch profiles quota aware (#867)
kunchenguid Jul 22, 2026
593e3a2
Add built-in ahoy recap skill (#873)
kunchenguid Jul 22, 2026
5549834
fix: preserve trustworthy Bearings data in partial snapshots (#875)
kunchenguid Jul 22, 2026
4497181
feat(pi): add session-local calm mode (#884)
kunchenguid Jul 23, 2026
82a7943
fix(pi): prevent redundant watcher re-arms (#885)
kunchenguid Jul 23, 2026
6db3b09
fix(pi): clean up Calm transcript rendering (#895)
kunchenguid Jul 23, 2026
bd43c73
fix: execute every PR body compliance event (#898)
kunchenguid Jul 23, 2026
6bcb381
fix: exclude operational injections from ahoy boundaries (#899)
kunchenguid Jul 23, 2026
68ed7ed
fix: canonically classify operational inputs across harnesses (#909)
kunchenguid Jul 23, 2026
a7e01bc
fix: avoid generic secondmate start acknowledgements (#926)
kunchenguid Jul 23, 2026
ca4be1c
fix(pi): make calm mode persistent and gapless (#927)
kunchenguid Jul 23, 2026
b24e72c
fix(watch): retire merged PR polls after durable notification (#932)
kunchenguid Jul 23, 2026
792174d
fix: refine scout intake and parallel dispatch (#934)
kunchenguid Jul 23, 2026
65ad47b
fix(pi): prevent duplicate assistant replies in Calm (#936)
kunchenguid Jul 23, 2026
d89a1b6
perf(bin): shrink the ShellCheck source graph (#939)
kunchenguid Jul 23, 2026
6b0d21d
fix(pi): remove Calm hidden-block gaps (#942)
kunchenguid Jul 23, 2026
ec09871
fix: enforce contract boundaries for ask-user findings (#945)
kunchenguid Jul 24, 2026
587f591
docs: prefer direct operational paths (#946)
kunchenguid Jul 24, 2026
1c4d210
fix(pi): hide operational user rows in Calm mode (#948)
kunchenguid Jul 24, 2026
f017572
fix: relaunch missing second mates at session start (#950)
kunchenguid Jul 24, 2026
3eca8ff
fix(herdr): reclaim resumed task projections after restart (#967)
kunchenguid Jul 24, 2026
cb3aa7b
Teach Ahoy to surface open decisions (#968)
kunchenguid Jul 24, 2026
10ee779
Require shipshape routine acknowledgement (#969)
kunchenguid Jul 24, 2026
861b1f8
docs: separate current guidance from verification evidence (#994)
kunchenguid Jul 24, 2026
418ab78
fix: preserve Claude watcher continuity across Stop hooks (#997)
kunchenguid Jul 24, 2026
2b7cd66
fix(herdr): clean stale projections at session start (#996)
kunchenguid Jul 24, 2026
b05eb24
fix: recover Claude supervision without watcher-status gate (#1001)
kunchenguid Jul 24, 2026
5c89d36
fix: make quota-aware profile selection agent-owned (#1018)
kunchenguid Jul 25, 2026
3f71cdd
fix(bin): remove vestigial dispatch selector (#1026)
kunchenguid Jul 25, 2026
34213e6
docs(agents): drop superseded interim quota-window rule (#1039)
kunchenguid Jul 25, 2026
aca3ad1
fix(tmux): scope busy detection and recognize current Claude turns (#…
kunchenguid Jul 26, 2026
c64ad1c
feat: add verified Kimi crewmate adapter (#1047)
kunchenguid Jul 26, 2026
39b450b
fix: harden Kimi submission and spinner matching (#1058)
kunchenguid Jul 26, 2026
4d6992a
feat(bin): add guarded Kimi turn-end wake (#1059)
kunchenguid Jul 26, 2026
a5fe1bc
fix(tmux): classify bordered composers across all rows (#1066)
kunchenguid Jul 26, 2026
b29621b
feat(bin): add verified pi-signed runtime adapter (#1145)
kunchenguid Jul 27, 2026
9ea1a1a
fix(pi): rearm watcher across session transitions (#1166)
kunchenguid Jul 28, 2026
fa0d85d
feat: route crew dispatch using quota-window pace (#1172)
kunchenguid Jul 28, 2026
fbece9c
fix: adapt Grok Stop continuation and harden endpoint cleanup (#1171)
kunchenguid Jul 28, 2026
514f0ab
fix: restore stock macOS Bash 3.2 brief scaffolding (#1093)
karotkriss Jul 28, 2026
2459f77
test: stabilize tmux teardown conformance baseline (#1209)
kunchenguid Jul 28, 2026
b6e351d
docs: slim quota-array-dispatch to the pace selection core (#1197)
kunchenguid Jul 28, 2026
e5bd082
feat(bin): inherit backend config into secondmate homes (#1219)
kunchenguid Jul 28, 2026
c0c0881
fix(pi): remove Calm's upper version ceiling (#1226)
kunchenguid Jul 29, 2026
7cbb3f6
fix(bin): allow session-local todo tools in the subagent guard (#1204)
danielkuykendall23-boop Jul 29, 2026
a117b41
fix(session-lock): resolve Claude bg-spare ancestry to the outermost …
trillium Jul 29, 2026
a323c2b
fix: conferma l'avvio del watcher su Windows/MSYS (#1212)
Unknownzed Jul 29, 2026
41ffd45
fix(spawn): forward CLAUDE_CONFIG_DIR to claude crewmates (#1195)
lucashalbert Jul 29, 2026
99533c5
fix: preserve dispatch identity across authentication checks (#1233)
kunchenguid Jul 29, 2026
6ec5e08
fix(bin): normalize relative durable paths (#1256)
sparkus Jul 29, 2026
c21bf54
refactor(skills): make Bearings chat-only by default (#1136)
deeto15 Jul 29, 2026
96e027e
Clarify follow-up routing during validation (#1277)
kunchenguid Jul 30, 2026
a24eac1
fix: honor concrete approval for project operations (#1272)
kunchenguid Jul 30, 2026
0bbb27b
fix(skills): route new project intake through secondmate scopes (#1275)
kunchenguid Jul 30, 2026
daf6dce
fix: scope validation corrections by accepted behavior (#1281)
kunchenguid Jul 30, 2026
a2d5f26
test: replace source assertions with behavioral coverage (#1282)
kunchenguid Jul 30, 2026
56a7ac6
fix(watch): escalate busy workers with no completed turn (#1286)
kunchenguid Jul 30, 2026
e595611
fix(gitignore): ignore config/ as a directory, not by exact filename …
karotkriss Jul 30, 2026
a53ffc1
fix(tests): replace source-content .gitignore assertion with behavior…
kunchenguid Jul 30, 2026
79e62b8
feat: bound and consolidate startup memory during stow (#1303)
kunchenguid Jul 30, 2026
f0d7cbe
fix(herdr): place workers in the launching workspace (#1328)
kunchenguid Jul 30, 2026
3a112a1
fix(calm): refine Calm working boat animation (#1339)
kunchenguid Jul 31, 2026
28b02d2
fix(dispatch): preflight candidate auth before quota escalation (#1349)
kunchenguid Jul 31, 2026
5fca47f
feat(x-mode): reconcile promised public replies deterministically (#1…
kunchenguid Jul 31, 2026
96542a4
feat(bin): replace busy heuristics with semantic lifecycle state (#1327)
kunchenguid Jul 31, 2026
621299a
fix: preserve Calm boat continuity across working periods (#1356)
kunchenguid Jul 31, 2026
f7d0d0a
fix: restore evidence-based dispatch eligibility (#1358)
kunchenguid Jul 31, 2026
3772964
docs: define captain instruction precedence (#1362)
kunchenguid Jul 31, 2026
9fdef64
docs: define validation supersession sequence (#1407)
kunchenguid Jul 31, 2026
000c1db
fix: bind backend overrides to exact-task authority (#1413)
kunchenguid Jul 31, 2026
66b0f77
fix(herdr): prevent focus flashes during projected workspace cleanup …
kunchenguid Jul 31, 2026
a805766
fix: prioritize completion runway in quota-aware dispatch (#1431)
kunchenguid Jul 31, 2026
68641a3
fix(bin): preserve full task contract in no-mistakes intent (#1447)
kunchenguid Aug 1, 2026
1e24757
fix(bin): parse punctuated secondmate registry entries safely (#1452)
kunchenguid Aug 1, 2026
8c21b10
feat(bin): add durable process-event supervision (#1483)
kunchenguid Aug 2, 2026
cd73e75
fix(bin): retire terminal process events and surface queued wakes (#1…
kunchenguid Aug 2, 2026
f5ab708
perf: shard portable serial tests across CI runners (#1544)
kunchenguid Aug 2, 2026
88b2a94
fix(bin): correct session lock and attached watcher supervision (#1545)
kunchenguid Aug 2, 2026
33a4287
fix(bin): harden Claude supervision auto-arm recovery (#1495)
kunchenguid Aug 2, 2026
4ee4a0a
feat(bin): require an explicit per-task delivery contract (#1563)
kunchenguid Aug 3, 2026
7809ab9
feat(bin): support remote secondmate homes (#1576)
kunchenguid Aug 3, 2026
976d97f
feat: add per-task trace context propagation (#995)
allstargg Aug 3, 2026
cf95112
fix(bin): harden tmux agent liveness across harnesses (#1577)
kunchenguid Aug 3, 2026
3d9d12d
feat(bin): propagate trace context to remote secondmates (#1609)
kunchenguid Aug 3, 2026
733a504
feat(bin): preflight remote runtime tool paths (#1623)
kunchenguid Aug 4, 2026
e5e8a67
feat: gate remote second mates on Herdr readiness (#1639)
kunchenguid Aug 4, 2026
c8edff3
fix: isolate remote secondmates in shared Herdr session (#1659)
kunchenguid Aug 4, 2026
a83be60
feat: route remote commands through an Aqua job worker (#1660)
kunchenguid Aug 4, 2026
fc3684a
fix: clarify remote doctor bootstrap path (#1691)
kunchenguid Aug 4, 2026
1939785
fix(bin): bound remote SSH dead-peer detection (#1699)
kunchenguid Aug 4, 2026
4a9979a
fix: report stale AXI tools during bootstrap (#1701)
kunchenguid Aug 4, 2026
d0461e4
fix: prevent false watcher-down alarms in Claude sessions (#1661)
karotkriss Aug 4, 2026
1cd97c0
test: prevent fixture temporary directory leaks (#1704)
kunchenguid Aug 4, 2026
3089a57
feat(herdr): enable presentation spaces by default (#1708)
kunchenguid Aug 4, 2026
bb352e7
fix(bin): surface fleet-wide open decisions on every wake drain (#1711)
kunchenguid Aug 5, 2026
7ef26c4
fix(bin): abort parked runs and reap leaked processes before teardown…
kunchenguid Aug 5, 2026
bea3d23
fix: resolve fm-remote-entrypoint.sh SCRIPT_DIR through a PATH symlin…
kunchenguid Aug 5, 2026
71f0b3f
fix(pi): gate Calm built-in overrides by activation state (#1724)
kunchenguid Aug 5, 2026
30b18b9
fix(bin): persist secondmate parent bindings for cleanup (#1727)
kunchenguid Aug 5, 2026
ef2c3a2
feat(bin): enforce latest AXI-family tool floors (#1733)
kunchenguid Aug 5, 2026
bf01a42
fix(bin): bound open decision scans with incremental cursors (#1737)
kunchenguid Aug 5, 2026
6f0f87f
fix(bin): prevent remote polls from blocking session startup (#1754)
kunchenguid Aug 5, 2026
3a8d63e
docs: present X mode as the X and Discord public surface (#1778)
kunchenguid Aug 6, 2026
3b6ee03
fix(bin): run session start deterministically from hooks (#1781)
kunchenguid Aug 6, 2026
5d77b48
fix: rename X mode to Relay in user-facing docs (#1784)
kunchenguid Aug 6, 2026
930ca76
feat: add Muse Code crewmate adapter (#1786)
kunchenguid Aug 6, 2026
8387039
fix(herdr): require 0.8.0 for default presentation spaces (#1787)
kunchenguid Aug 6, 2026
8ec3e94
fix(bin): classify settled Muse session logs as idle (#1788)
kunchenguid Aug 6, 2026
2cf0283
docs(agents): read the persisted digest when only a preview is shown …
kunchenguid Aug 6, 2026
345de4e
fix: preserve fleet state in truncated session-start digests (#1798)
kunchenguid Aug 6, 2026
6c206ed
feat(send): close answered decisions at answer time via --resolve-key…
kunchenguid Aug 6, 2026
fb368dc
fix(bin): seed remote secondmates from supplied origins (#1836)
kunchenguid Aug 7, 2026
91fa548
fix(tests): restore reliable fm-send backend parity coverage (#1851)
kunchenguid Aug 7, 2026
990753a
fix(bin): mirror remote secondmate status streams (#1846)
kunchenguid Aug 7, 2026
199cb79
docs(agents): describe the digest's fleet-state-before-context order …
kunchenguid Aug 7, 2026
4cdd0bd
fix(bin): fail closed on NUL bytes in the durable parent binding (#1847)
kunchenguid Aug 7, 2026
8398d31
fix(skills): reconcile inherited secondmate plans with shipped state …
kunchenguid Aug 7, 2026
4b6b89d
fix: move network checks off the session-start blocking path (#1860)
kunchenguid Aug 7, 2026
d8bb074
fix(procevent): apply remote replies during capture (#1831)
kunchenguid Aug 7, 2026
073cb30
feat(skills): port internal stow curation disciplines to the public s…
kunchenguid Aug 7, 2026
70aeba8
chore(bootstrap): raise lavish-axi version floor to 0.1.46 (#1865)
kunchenguid Aug 7, 2026
06b33aa
fix(bin): keep tracked Claude hook entries inert under grok 1.0.0 (#1…
jayjongcheolpark Aug 7, 2026
60eb534
feat(startup-network): record per-step elapsed times for the deferred…
kunchenguid Aug 7, 2026
167ff42
feat(stow): cascade the internal /stow to every registered secondmate…
kunchenguid Aug 8, 2026
be32879
fix(remote-job): stop workers abandoned by a pruned code root (#1927)
kunchenguid Aug 8, 2026
833a9a2
feat(bin): lint only the changed shard locally, full lint in CI (#1925)
kunchenguid Aug 8, 2026
2d2be63
feat(bin): add deterministic agent lifecycle control (#1568)
kunchenguid Aug 9, 2026
5ade9ef
feat(stow): add tiered decaying memory management (#1984)
kunchenguid Aug 9, 2026
74230fc
docs: add project vision (#1997)
kunchenguid Aug 9, 2026
fffe91e
fix(spawn): force regular Pi TUI for crews (#2005)
roelofb Aug 9, 2026
85e750a
fix(cmux): classify borderless Claude composers (#2029)
kunchenguid Aug 10, 2026
53ecbc7
docs(stow): generalize read-before-write in the public stow skill (#2…
kunchenguid Aug 10, 2026
f9b9d43
fix: resurface durable supervision work after re-arm (#2065)
kunchenguid Aug 10, 2026
9068958
ci: measure Herdr automation on Windows runners (#2100)
kunchenguid Aug 10, 2026
f74d9e4
feat(ahoy): guide captains through open decisions (#2099)
kunchenguid Aug 10, 2026
7f828ea
fix(stow): enforce startup-memory budget decisions (#2110)
kunchenguid Aug 11, 2026
fc5f164
fix(spawn): refresh pooled worktrees from origin before launch (#2116)
kunchenguid Aug 11, 2026
7f05100
fix(composer): unify safe classification across backends (#2102)
kunchenguid Aug 11, 2026
e836a7f
fix(spawn): gate Pi TUI mode by CLI capability (#2117)
kunchenguid Aug 11, 2026
76355e2
docs(vision): elevate experience, pain narrative, and distro virtues …
kunchenguid Aug 11, 2026
2d550fe
feat(bin): reconcile inactive terminal crew outcomes (#2167)
kunchenguid Aug 11, 2026
07450b9
ci: raise Herdr test timeout (#2191)
kunchenguid Aug 11, 2026
e8c7645
fix: refresh stale Pi instructions after compaction (#2163)
kunchenguid Aug 11, 2026
81ce6dc
feat: add deterministic condition-to-action watcher (#2200)
kunchenguid Aug 11, 2026
614fae6
fix(bin): honor a decision key stated after the verb colon (#2202)
kunchenguid Aug 11, 2026
c42cfe0
fix(bin): prevent watcher recovery acknowledgement livelock (#2212)
kunchenguid Aug 12, 2026
b5d430d
feat(fmx-respond): consume Relay conversation chains (#2206)
kunchenguid Aug 12, 2026
b91016f
fix: parse decision verbs before status metadata tags (#2280)
kunchenguid Aug 12, 2026
b0ad61e
fix(bin): collapse duplicate supervision wakes (#2287)
kunchenguid Aug 13, 2026
4930d2c
feat: add Cursor CLI crew harness (#2238)
kunchenguid Aug 13, 2026
96876db
fix(bin): require quota-axi 0.1.25 (#2300)
kunchenguid Aug 13, 2026
85cefa9
fix(bin): prevent false Pi watcher alarms during hand-offs (#2304)
kunchenguid Aug 13, 2026
81f7020
feat: support Cursor Agent CLI as a primary harness (#2305)
kunchenguid Aug 13, 2026
5521323
feat(bin): add decline and repair paths for decision holds (#2330)
kunchenguid Aug 13, 2026
db0280f
fix(bin): surface buried wake status lines once (#2331)
kunchenguid Aug 13, 2026
88d0f2e
feat: add max Calm presentation level (#2334)
kunchenguid Aug 13, 2026
9823ff8
feat(calm): hide mid-turn working notes by default (#2339)
kunchenguid Aug 13, 2026
1238402
chore: store no-mistakes test evidence in the repo (#2355)
kunchenguid Aug 14, 2026
6789876
chore: ignore scratchpad/ at the repo root (#2359)
kunchenguid Aug 14, 2026
f1a4af4
fix(ci): fail hung Herdr behavior runs in 20 minutes (#2413)
kunchenguid Aug 15, 2026
7a3259e
fix: keep the public promise reachable when work is routed to a secon…
kunchenguid Aug 16, 2026
196fb65
docs(skills): add remote-secondmate recovery hint for false-negative …
kunchenguid Aug 16, 2026
ef35d79
fix(calm): keep Pi's export confirmation visible (#2461)
kunchenguid Aug 16, 2026
e518906
feat(stow): add open-record persistence to /stow before reset (#2488)
kunchenguid Aug 16, 2026
362c508
fix(decisions): close decision holds at answer time via one general k…
kunchenguid Aug 17, 2026
4913723
fix(memory): emit a real @AGENTS.md pointer instead of a CLAUDE.md sy…
kunchenguid Aug 17, 2026
bdae21e
fix(ci): keep CLAUDE.md pointer check valid (#2515)
kunchenguid Aug 17, 2026
0ae14af
ci: gate GitHub workflows with pinned actionlint (#2517)
kunchenguid Aug 17, 2026
ac55d39
fix: install pinned lint tools across supported platforms (#2546)
kunchenguid Aug 17, 2026
312871d
docs: reconcile test-evidence docs with store_in_repo: true (#2548)
kunchenguid Aug 17, 2026
64d61ae
docs: clarify test evidence branch storage (#2549)
kunchenguid Aug 17, 2026
d023c45
docs: hint that live scouts may host their own Lavish review loop (#2…
kunchenguid Aug 18, 2026
d843712
fix(bin): report remote secondmate delivery and state truthfully (#2570)
kunchenguid Aug 18, 2026
d9ee8ea
feat: adopt spendPriority for quota dispatch (#2574)
kunchenguid Aug 18, 2026
862c532
docs: add GROK_BOT.md Grok Bot system prompt (#2590)
kunchenguid Aug 18, 2026
9d2ad81
docs: update GROK_BOT.md nautical terms and self-improvement (#2592)
kunchenguid Aug 18, 2026
f758e51
doc: Update language in GROK_BOT.md for clarity
kunchenguid Aug 18, 2026
ed66b85
fix(bin): preserve inactive reconciliation scan progress (#2595)
kunchenguid Aug 18, 2026
63362d2
doc: Revise Firstmate delegation and communication guidelines
kunchenguid Aug 18, 2026
03bb1d8
doc: Update work delegation and secret management instructions
kunchenguid Aug 18, 2026
c54c448
test(procevent): make the process-event suite's detached-runner asser…
kunchenguid Aug 19, 2026
7f5255a
fix: preserve pending replies and defer remote reposts (#2618)
kunchenguid Aug 19, 2026
b57c4d6
fix(bin): honor declared pauses in busy-pane wedge checks (#2619)
kunchenguid Aug 19, 2026
f242264
doc: Enhance communication guidelines for decision-making
kunchenguid Aug 19, 2026
7b38a2f
doc: Update task delegation and communication guidelines
kunchenguid Aug 19, 2026
87681a4
fix(bin): reliably confirm herdr steer submission (#2647)
kunchenguid Aug 19, 2026
1cb900c
feat(bearings): add interactive Lavish fleet board (#2659)
kunchenguid Aug 20, 2026
b96dba1
fix(bearings): restore decision options and add close controls (#2707)
kunchenguid Aug 21, 2026
a0cec26
ci: require no-mistakes pipeline step attestation (#2710)
kunchenguid Aug 21, 2026
99b21d8
feat: collapse decisions into tasks held for the captain (#2728)
kunchenguid Aug 21, 2026
3f03533
fix: bound recovery announcements and preserve supervision (#2733)
kunchenguid Aug 21, 2026
d3342dc
fix(bin): surface captain-call record divergence (#2744)
mremond Aug 21, 2026
4d2cb0c
fix(bin): re-arm after an abandoned auto-arm claim and defer a wedge …
Inthuson Aug 21, 2026
3d125ad
fix(bin): give a captain hold the same bounded pause cadence as a dec…
Inthuson Aug 21, 2026
738460d
fix(bin): make lint prerequisites and harness tests reliable (#2758)
kunchenguid Aug 21, 2026
59e7393
feat(bin): report watched tooling updates that are available or insta…
Inthuson Aug 21, 2026
52d20f1
fix: decouple ask-user decisions from yolo (#2764)
kunchenguid Aug 22, 2026
fbe37e9
feat(bin): add a spoken interface that answers from records and hands…
Inthuson Aug 22, 2026
dc0172c
fix(bin): preserve Relay follow-up loops until explicit disposition (…
kunchenguid Aug 22, 2026
5b6d0fb
feat(bin): merge GitLab merge requests through the guarded PR merge p…
Inthuson Aug 22, 2026
1231b6a
fix(bin): record a lost relay connection instead of an unanswered tur…
Inthuson Aug 22, 2026
8714c9a
fix(composer): stop a blocked pi pane from proving an empty composer …
karotkriss Aug 23, 2026
801c083
fix(bin): require project clone roots during fleet sync (#2849)
karotkriss Aug 23, 2026
505c819
fix(bin): retry transient Lavish poll interruptions (#2846)
karotkriss Aug 23, 2026
86dd2f6
fix(brief): stop the documented {TASK} fill from corrupting the Herdr…
karotkriss Aug 23, 2026
266fdb9
fix(bin): resolve the busy-state lock mtime with the platform's own s…
karotkriss Aug 23, 2026
f170ced
fix(stow): add opt-in pass horizon for memory decay (#2850)
karotkriss Aug 23, 2026
2f250c7
test(watcher): stop fixture confirmation budgets racing real child st…
karotkriss Aug 23, 2026
197afbb
fix(bin): deterministically order remote tool paths (#2870)
karotkriss Aug 23, 2026
52f62ab
fix(bin): prevent routed secondmate work from stranding (#2848)
kunchenguid Aug 23, 2026
822a990
fix: make macOS inbox test path portable (#2857)
kunchenguid Aug 23, 2026
e46df1a
feat(bin): deliver local steers through durable task inboxes (#2856)
kunchenguid Aug 23, 2026
8d8362c
feat(bin): add fast local lint mode (#2891)
kunchenguid Aug 23, 2026
ddf74ef
feat(bin): deliver remote steers through durable inboxes (#2901)
kunchenguid Aug 23, 2026
7b88520
feat: add persistent Pi supervision branch (#2858)
kunchenguid Aug 23, 2026
fb2ce5b
fix(bin): parallelize startup network sweeps (#2927)
kunchenguid Aug 24, 2026
8b21c99
test: handle absent watcher wake queues (#2845)
karotkriss Aug 24, 2026
52ff62e
style(pi): distinguish routine and captain supervision merge notes by…
kunchenguid Aug 24, 2026
d55e00a
docs(pi): add the approved multi-brain architecture poster (#2938)
kunchenguid Aug 24, 2026
8fa0505
feat(pi): default branch supervision and route heartbeats (#2939)
kunchenguid Aug 24, 2026
038d0f7
fix(bin): bound remote job worker supervisor restarts (#2942)
stanzhang Aug 24, 2026
17cd039
Merge upstream/main (038d0f7) into fork: adopt Pi multi-brain supervi…
rega10tam Aug 24, 2026
9d21048
fix(pi): type Calm's terminal-input handler for Pi 0.83.0
rega10tam Aug 24, 2026
f368599
docs(verification): record Pi 0.83.0 supervision-branch evidence
rega10tam Aug 24, 2026
2a2f3ed
test(composer): spell half-block rule glyphs literally
rega10tam Aug 24, 2026
9a3649e
fix(public-followup): run on stock macOS Bash 3.2
rega10tam Aug 25, 2026
5fce5ef
test(nm-contract): accept upstream's renamed Lint job
rega10tam Aug 25, 2026
3445ba5
fix(remote-seed): allow --no-projects on stock macOS Bash 3.2
rega10tam Aug 25, 2026
5e4f0cc
fix(backend): refuse a missing adapter cleanly on stock macOS Bash 3.2
rega10tam Aug 25, 2026
84de0a2
no-mistakes(review): Captain: fix three review findings
rega10tam Aug 25, 2026
b925d75
no-mistakes(review): Captain: require direct lint workflow invocation
rega10tam Aug 25, 2026
097973e
no-mistakes: apply CI fixes
rega10tam Aug 25, 2026
9b724ab
Revert "no-mistakes: apply CI fixes"
rega10tam Aug 26, 2026
38b2d11
no-mistakes(review): Make workflow contract assertions semantic
rega10tam Aug 26, 2026
7a35af2
no-mistakes(review): Require exact lint workflow command
rega10tam Aug 26, 2026
6c6fae7
no-mistakes(review): Enforce exact workflow command schemas
rega10tam Aug 26, 2026
d723338
no-mistakes(review): Enforce exhaustive workflow step sequences
rega10tam Aug 26, 2026
450a1c4
no-mistakes(review): Enforce lint execution metadata
rega10tam Aug 26, 2026
4bf373c
no-mistakes(review): Reject lint shell overrides
rega10tam Aug 26, 2026
bd8ba3d
no-mistakes(lint): Suppress intentional single-quoted Ruby ShellCheck…
rega10tam Aug 26, 2026
670ae86
no-mistakes: apply CI fixes
rega10tam Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 25 additions & 38 deletions .agents/skills/afk/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ a false exit is self-correcting (the captain re-runs `/afk`).

afk changes how aggressively firstmate surfaces things, **not who approves what**.
"Away" never means "approves more" or "approves less."
A PR ready for merge or a needs-decision finding keeps the same configured authority and exceptions from `AGENTS.md` section 7, while anything requiring the captain still waits for the captain's explicit word.
A PR ready for merge keeps the merge authority from `AGENTS.md` section 7, and a needs-decision finding keeps the `ask-user-authority` policy; anything requiring the captain still waits for the captain's explicit word.
The daemon only batches the notification.

## Operational prefix contract
Expand All @@ -94,11 +94,11 @@ backend (tmux or herdr; see "Auto-discovered supervisor pane" below):

- **Primary-pane busy guard** - `pane_is_busy` trusts Herdr native `busy` when available, otherwise matches rendered output against only the detected primary harness's signature.
This narrow delivery guard never classifies a recorded worker task and never uses a global union of vendor patterns.
- **Composer-state guard** - `inject_msg` reads the full `empty`/`pending`/`unknown` verdict from `fm_backend_composer_state` and injects only when it is affirmatively `empty`.
`pending` means real unsubmitted text, while `unknown` includes an unreadable pane and a bare shell prompt left after the agent exits, so both defer.
The shared `bin/fm-composer-lib.sh` owns the content decision after each backend captures and structurally identifies its own composer row.
It preserves idle bordered composers such as claude's `│ > … │` and bare agent glyphs as empty, but a bare shell glyph is unknown unless inside a genuine bordered composer box; see `docs/herdr-backend.md` "Composer and injection safety" for the complete contract.
`pane_input_pending` remains the tested predicate for callers that only need to know whether real unsubmitted text is present, but it is insufficient for an injection-safety decision because it cannot distinguish `empty` from `unknown`.
- **Composer-state guard** - `inject_msg` reads the full `empty`/`pending`/`pending-unproven`/`unknown` verdict from `fm_backend_composer_state` and injects only when it is affirmatively `empty`.
Every other or future verdict defers, including an unreadable pane, ambiguous geometry, a blank unidentified row, and a bare shell prompt left after the agent exits.
Each adapter contributes only capture and capability facts to the fleet-wide screen classifier in `bin/fm-composer-lib.sh`, which owns every shape and verdict.
It preserves proven idle composers as empty but requires a genuine container around shell glyphs; see `docs/herdr-backend.md` "Composer and injection safety" for the operator contract.
`pane_input_pending` is the tested fail-closed predicate for callers that need to know whether the composer is unsafe: it treats every result except exact `empty` as pending.

A busy primary pane, or any composer verdict other than `empty`, defers the injection; the buffered escalation survives in `state/.subsuper-escalations` and is retried on the next housekeeping tick.
In afk mode the composer guard is belt-and-suspenders (no human is typing), but it protects against the race window between the captain returning and their message landing, a dead shell, and the daemon's own previous injection sitting unsent.
Expand All @@ -121,44 +121,31 @@ herdr - both literal, non-submitting sends), then submitted with Enter and
**verified** through the selected backend's submit primitive.
Enter is retried (Enter only, never a retype) until the backend confirms the
submit landed.
For tmux that confirmation is a cleared composer, using the same corrected,
border-aware detector as the composer guard.
For herdr, normal idle-baseline submits are confirmed by native agent-state showing a real turn started; the ANSI-aware composer classifier remains the affirmative-empty pre-injection guard and conservative fallback for non-idle or unreadable baselines.
For tmux that confirmation is normally a proven cleared composer from the shared classifier; an idle baseline transitioning to busy across this submit's own Enter also confirms that the turn started when a working harness hides its composer.
Without that baseline, busy state never converts an `unknown` composer into confirmation.
For herdr, idle-baseline submits first seek native agent-state showing a real turn started, then use the shared classifier when native state remains idle: a cleared composer confirms delivery, while pending text retries Enter and reaches the shared busy-queue verdict only after the retry budget.
A bordered-empty or ghost-only composer is recognized as empty where that backend uses composer confirmation, rather than mistaken for a swallowed Enter.
`fm-send.sh` uses the same primitive and exits non-zero
when a steer's Enter is positively swallowed, so firstmate learns an instruction
did not land instead of leaving it unsubmitted.

**Busy-queued Enter exception (tmux backend, opencode 1.18.4).** While opencode
is mid-turn, Enter is accepted and queued for after the current turn but the
composer keeps showing the typed text the whole time, so the cleared-composer
check alone false-positives on a swallowed Enter for every steer sent to a
busy opencode pane. The shared `fm_tmux_submit_enter_core` falls back to
`fm_pane_is_busy` once the Enter-retry budget is spent: a busy pane means the
Enter was accepted and queued (reported as `empty` so the caller does not
re-send), while an idle pane keeps `pending` as a genuine swallow. The
strict-buffer-clears-only-on-`empty` policy above still holds for the daemon
and the lenient-`pending`-fails-for-`fm-send` policy still holds for steer
verification - this exception is a busy-queue is treated as a delivered
Enter, not a swallowed one. The herdr adapter observes the same opencode
behavior but needs a separate fix; the gap is recorded in
`docs/herdr-backend.md` rather than papered over here.
`fm-send.sh` uses the same primitive only on its typed plane and exits non-zero when that plane's Enter is positively swallowed; ordinary local text steers use the durable inbox and do not treat doorbell submission as delivery proof.

**Busy-queued Enter exception (opencode 1.18.4).** OpenCode keeps queued text visible while it is mid-turn, so tmux and herdr delegate the final delivery decision to `fm_composer_queued_enter_verdict` in `bin/fm-composer-lib.sh` rather than treating visible text alone as a swallowed Enter.
The daemon still clears its buffer only on the backend's `empty` success verdict; [`docs/tmux-backend.md`](../../../docs/tmux-backend.md) and [`docs/herdr-backend.md`](../../../docs/herdr-backend.md) own the backend-specific confirmation signals.

## Classification policy

The daemon wraps `fm-watch.sh`, runs the watcher as a child, presents every durable wake after each actionable watcher close, classifies each presented record in bash, and acknowledges the presented generation only after routing completes.
It self-handles the routine majority without consuming a firstmate turn.
Captain-relevant events, plus a bounded recheck of a declared external wait that remains idle, escalate to firstmate's context as one pre-read, single-line, batched digest.
The classification predicates (the captain-relevant verb set, declared-pause vocabulary, signal/stale tests, and fleet-scan) live in the shared `bin/fm-classify-lib.sh`, the same library the always-on watcher uses for its own triage when afk is off, so the two modes apply one identical policy.
Captain-relevant events, plus a bounded recheck of a declared wait that remains idle, escalate to firstmate's context as one pre-read, single-line, batched digest.
The classification predicates (the captain-relevant verb set, declared-wait vocabulary, signal/stale tests, and fleet-scan) live in the shared `bin/fm-classify-lib.sh`, the same library the always-on watcher uses for its own triage when afk is off, so the two modes apply one identical policy.
While `state/.afk` exists the daemon owns the watcher, so the watcher reverts to one-shot and lets the daemon do the triage - the two never run their triage at the same time.

Classify each wake this way:

- `signal` with a terminal captain verb (`done:`, `needs-decision:`, `blocked:`, or `failed:`) -> escalate.
A nonterminal progress verb remains nonterminal even when its prose contains a legacy free-text token such as `PR ready`, `checks green`, `ready in branch`, or `merged`; only a bare legacy line with such a token escalates.
Other signals with no captain-relevant status -> self-handle.
- `signal` or `stale` for a declared `paused:` external wait -> self-handle and track the pause rather than a wedge.
If it remains declared and idle past `FM_PAUSE_RESURFACE_SECS` (default 3600s), housekeeping sends one awaiting-external recheck and resets the pause window.
- `signal` or `stale` for a declared wait, either a `paused:` external wait or a verified `captain-held` transfer -> self-handle and track the pause rather than a wedge.
If it remains declared and idle past `FM_PAUSE_RESURFACE_SECS` (default 3600s), housekeeping sends one recheck and resets the pause window.
That recheck names which human the wait is on: the external dependency for `paused:`, and the captain themself for a `captain-held` transfer, who can answer the held decision or release the hold.
- `check` -> always escalate. Check scripts print only when firstmate should wake.
- `stale` with a terminal status or bare legacy captain-relevant line -> escalate.
Nonterminal progress remains transient even when its prose contains a legacy free-text token or its seen-status marker already matches, so record a marker and self-handle.
Expand All @@ -184,11 +171,12 @@ the operational prefix lets firstmate distinguish it from a real captain message
- **Busy and composer guards on the supervisor pane** - before injecting, the daemon runs the detected-primary-harness rendered busy guard and reads `fm_backend_composer_state` directly.
Only `empty` permits injection; `pending` protects half-typed or swallowed input, and `unknown` protects unreadable panes and bare dead-shell prompts.
Every other result preserves the buffer for retry, so the daemon never merges its digest into the captain's half-typed line or types it into a shell.
- The shared composer classifier receives a candidate row only after the active backend performs its own capture and structural row recognition.
tmux and herdr route their raw styled candidate rows through the shared `fm_composer_strip_ghost` extractor, which removes dim/faint and dark-TRUECOLOR ghost/placeholder text before classification.
They read the composer shape from a separately ANSI-stripped plain row because a dark TRUECOLOR border can be stripped with ghost content.
- The active backend passes its capture plus declarative styled, cursor, identity, and row capabilities to the shared screen classifier; all structural recognition and verdict logic remains in `bin/fm-composer-lib.sh`.
Styled captures let that owner remove dim/faint and dark-TRUECOLOR ghost or placeholder text while shape detection uses the ANSI-stripped screen, so a dark border is not lost with ghost content.
A ghost-only or idle bordered composer such as claude's `│ > ... │` therefore reads empty without allowing an unbordered shell prompt to do the same.
`FM_COMPOSER_IDLE_RE` still overrides tmux empty-composer matching after shared ghost and border stripping, and `FM_BUSY_REGEX` overrides the rendered delivery guards plus Grok's isolated task-state fallback.
`FM_COMPOSER_IDLE_RE` overrides the shared idle-placeholder regex, but a match alone never bypasses the classifier's shape-specific position and ANSI de-emphasis safety gates.
`FM_BUSY_REGEX` overrides the rendered delivery guards plus Grok's isolated task-state fallback.
A blank or otherwise unidentified input row carries no positive container proof and defers injection, so a modal dialog or a mid-redraw pane is never an injection target.
- **Max-defer escape** - the daemon must never silently wedge. If anything stays
buffered past `FM_MAX_DEFER_SECS` (default 300s), the daemon attempts one
normal flush, which still requires an idle pane and an affirmatively empty composer. If that
Expand All @@ -201,9 +189,8 @@ the operational prefix lets firstmate distinguish it from a real captain message
on tmux, `pane send-text` on herdr), then submitted with Enter and verified.
Enter is retried, Enter only and never a retype, until the backend submit
primitive reports `empty` as its caller-facing success verdict.
For tmux that verdict means the shared-ghost-aware and border-aware composer
cleared.
For herdr's normal idle-baseline path it means native agent-state observed a real turn start; herdr uses the ANSI-aware structural classifier for the pre-injection composer guard and fallback paths.
For tmux that verdict normally means the shared classifier proved the composer cleared; a baseline-gated idle-to-busy transition may instead prove this Enter started the turn.
For herdr's idle-baseline path it means native agent-state observed a turn start, the shared classifier proved the composer cleared, or the shared queued-Enter verdict proved delivery while busy.
This lets ghost-only or bordered-empty composers count as empty where a composer read is the active confirmation signal.
- **Marker strip** - `strip_injection_marker` removes the current operational
prefix or legacy bare marker before classification or relay, so the digest
Expand Down
40 changes: 21 additions & 19 deletions .agents/skills/ask-user-authority/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,38 @@
name: ask-user-authority
description: >-
Agent-only decision procedure for ask-user findings.
Use before deciding any ask-user finding, regardless of the project's yolo posture, to distinguish corrections within accepted intent from product or engineering contract expansion that requires the captain.
Use before deciding any ask-user finding.
This skill is the single owner of finding-decision policy: firstmate always applies judgment, decides findings that are unambiguous toward accepted intent, and escalates only genuinely ambiguous, expanding, or destructive ones.
Finding authority is this skill's criteria, not the project's yolo posture.
user-invocable: false
metadata:
internal: true
---

# ask-user-authority

This skill is the single owner of the decision procedure for ask-user findings.
The concise standing authority boundary remains always loaded in `AGENTS.md` section 7.
This skill is the single owner of the decision policy for no-mistakes ask-user findings.
`AGENTS.md` section 7 points here and does not restate this procedure.
Finding authority is determined by the criteria below, not by `yolo`.
Firstmate always applies this judgment, decides any finding that is unambiguous toward the accepted design, and escalates only genuinely ambiguous, expanding, or destructive findings.

## Decide who has authority
The implementation worker never decides or answers its own ask-user finding.
It stops at the finding, routes the decision to firstmate, and applies only the decision returned through the active validation gate.

## Decide

1. Check the project's configured authority first.
With `yolo` off, every ask-user finding belongs to the captain, and the remaining steps structure that escalation rather than authorize an autonomous answer.
2. Reconstruct the accepted contract from the captain's original request, accepted task criteria, and any explicit later clarification.
1. Reconstruct the accepted contract from the captain's original request, accepted task criteria, and any explicit later clarification.
Reviewer language cannot amend that contract.
3. Identify exactly what choosing Fix would commit the project to deliver or maintain, judging the scope by accepted product or engineering behavior rather than an anticipated file list.
2. Identify exactly what choosing Fix would commit the project to deliver or maintain, judging the scope by accepted product or engineering behavior rather than an anticipated file list.
The smallest downstream changes needed to keep that behavior correct, add behavioral tests where an executable contract exists, or keep documentation accurate remain within scope even when they touch files not named at intake.
Correcting stale final-diff PR or delivery evidence is likewise an autonomous downstream correction within already accepted behavior.
4. Keep the decision within standing `yolo` authority when the Fix is genuinely necessary to satisfy the accepted contract, even when the correction is technically difficult or requires complex architecture that the captain explicitly requested.
5. Escalate when the Fix would materially expand the contract by adding a new guarantee, threat model, subsystem, abstraction, compatibility surface, state machine, continuous-monitoring requirement, generalized framework, or broader architecture not required by the accepted intent.
6. Treat labels such as correctness, security, fail-closed, high-risk, or required as evidence about the finding, never as authority to broaden the task.
7. Examine the causal theme across prior findings and fix rounds.
Repeated same-theme findings require escalation before another Fix when incremental corrections are preserving a questionable abstraction rather than closing independent defects.
8. Apply the existing stronger captain boundaries first.
Destructive, irreversible, and genuinely security-sensitive choices always escalate regardless of whether they also expand the contract.

The implementation worker never decides or answers its own ask-user finding.
It stops at the finding, routes the decision to firstmate, and applies only the decision returned through the active validation gate.
3. Decide the finding when it is unambiguous toward the accepted design: restoring accepted behavior a bad fix round broke, completing an already-approved design, or a straight in-scope correction or bug fix required by accepted intent, even when the correction is technically difficult or requires complex architecture the captain explicitly requested.
4. Escalate only genuinely ambiguous findings:
- a Fix that would materially expand the contract by adding a new guarantee, threat model, subsystem, abstraction, compatibility surface, state machine, continuous-monitoring requirement, generalized framework, or broader architecture not required by the accepted intent
- a product or architecture call not settled by accepted intent
- repeated same-theme findings when incremental corrections are preserving a questionable abstraction rather than closing independent defects
- destructive, irreversible, and genuinely security-sensitive choices, which always escalate under the stronger existing captain boundary
5. Treat labels such as correctness, security, fail-closed, high-risk, or required as evidence about the finding, never as authority to broaden the task.

## Captain-facing escalation

Expand All @@ -47,7 +49,7 @@ Do not relay reviewer labels or gate output as if they settled the decision.

## Classification examples

- Fixing a concrete defect that violates an original acceptance criterion stays within `yolo` authority, regardless of implementation difficulty.
- Fixing a concrete defect that violates an original acceptance criterion is firstmate's to decide, regardless of implementation difficulty.
- Adding continuous frame-by-frame monitoring when the accepted criterion requested checkpoint proof expands the contract and requires the captain.
- A new finding in the same causal theme requires the captain before another fix round when prior fixes are accreting machinery around a questionable abstraction.
- A genuinely security-sensitive action requires the captain under the stronger existing boundary even if it is otherwise within scope.
Expand Down
Loading
Loading