Commit graph

15 commits

Author SHA1 Message Date
jedarden
1888875a03 docs(tb-25t): mark Open question 1 as RESOLVED with tmux detector verdict
Mark the tmux detector viability question as RESOLVED (2026-07-02):
- Moved from 'Open' to 'Resolved (recorded so they don't get re-litigated)'
- Added resolution summary with date stamp
- Linked to full findings in docs/notes/decisions.md
- Documented implementation status and enabling instructions

The tmux detector (daemon/tmux-detector.ts) is confirmed viable as a
harness-agnostic fallback for future coding harnesses without hooks.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 11:33:27 -04:00
jedarden
cfae27c36e docs(tb-5qz): record tmux detector viability verdict in decisions
- Add comprehensive Tmux Detector Viability section (2026-07-02)
- Verdict: VIABLE — works as designed as universal fallback
- Document false positive rate: low (30s threshold, prompt patterns, hash comparison)
- Document false negative rate: user-dependent (opt-in compliance)
- Document performance: minimal (<50ms/cycle for 10 panes)
- Document tuning applied: quiet threshold, poll interval, opt-in prefix, prompt patterns
- Include comparison table to hook-based detection
- Resolve Open question 1: tmux-level detector is viable
2026-07-02 11:30:32 -04:00
jedarden
fd53105f6d docs(tmux-detector): add comprehensive detector poller design
Specifies the complete architecture for the harness-agnostic tmux
detector poller, answering all key questions:
- Opt-in mechanism: @tb- pane title prefix pattern
- Quiet detection: capture-pane hash comparison
- Prompt detection: configurable regex patterns
- Quiet threshold: 30 seconds (configurable)
- Unstuck detection: any output change
- Session ID generation: synthetic tmux-{paneId}-{timestamp}

Includes state machine, poll loop pseudocode, error handling,
daemon integration, testing strategy, and future enhancements.

Addresses bead tb-1ke: tmux detector poller architecture design.
2026-07-02 09:41:48 -04:00
jedarden
4ff41bc74b docs(normalized-event-contract): add comprehensive harness-agnostic adapter contract specification
Document the POST /event/normalized endpoint contract with:
- Complete endpoint specification (URL, method, request/response)
- All 4 event types with field descriptions and examples
- Derivation guide for sessionId, paneId, cwd, transcriptPath from harness context
- Implementation example for adapter authors
- Error handling and versioning guidance

This enables future adapter authors to integrate any coding harness
without reading the daemon source code.
2026-07-02 09:38:57 -04:00
jedarden
cab4e37537 docs: update plan.md and README to match shipped Phase 8/9 state
- plan.md: mark Phase 8 as complete, remove (planned) marker
- plan.md: update PermissionRequest status from unverified to confirmed
  (probe 2026-05-25 confirmed firing + payload with tool_name/tool_input)
- plan.md: mark Open question 2 (PermissionRequest specifics) as resolved
- plan.md: correct Phase 8 keyboard map (l/Tab focuses detail pane, not queue head)
- plan.md: mark Open question 5 (popup vs persistent window) as resolved
  (both retained: popup for quick triage, TUI for sustained work)
- README: add SessionStart and SessionEnd to hook wiring snippet
  (daemon also consumes these for registry and retirement)
- README: add trailboss-bootstrap and trailboss-watch to repository layout
  (trailboss-watch noted as deprecated/superseded by TUI)
- CLAUDE.md: update Go version from 1.22+ to 1.24+ to match tui/go.mod

Co-Authored-By: Claude <noreply@anthropic.com>
Bead-Id: tb-1jl
2026-07-02 08:59:53 -04:00
jedarden
31829c48e4 feat(tui): commit Phase 8/9 source files
- Add tui/main.go, tui/go.mod, tui/go.sum (Go + Bubble Tea TUI)
- Add CLAUDE.md with project instructions
- Add bin/trailboss-preview script
- Update bin/trailboss, bin/trailboss-start, bin/trailboss-watch
- Update PROGRESS.md and docs/plan/plan.md to reflect completion
- Add .gitignore entries for build artifacts (tui/tui, bin/trailboss-tui)
- Remove stray root main.go placeholder and ~ directory

Bead-Id: tb-25j
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 07:57:11 -04:00
jedarden
c89b315aa7 feat(trail-boss): phase 1-2 - PermissionRequest probe and emitter
Phase 1: Probed PermissionRequest hook, confirmed firing + payload shape.
Documented in docs/research/claude-code-mechanics.md.

Phase 2: Built trailboss-emit.sh that forwards hook payloads to collector
and injects $TMUX_PANE. Wired all hooks in .claude/settings.json.

Verified: stub collector logs POSTs with session_id, cwd, and pane_id.
Demonstrated bare curl drops $TMUX_PANE, proving wrapper required.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 22:04:03 -04:00
jedarden
18bf11577a docs(plan): add Testing & validation — exit criteria, acceptance scenarios, harness
The plan defined deliverables but no definition of done. Add a "Testing &
validation" section: a per-phase exit-criteria table, seven acceptance
scenarios (AS-1..AS-7, incl. reconcile self-correction, dropped-event
recovery, skip/cooldown, no-forced-focus-steal, pane reuse), a test harness
(synthetic event injection, throwaway-tmux isolation, transcript fixtures,
mock hook emitter, navigation assertion, invariant checks), and a quality
gate. Point the marathon instruction at these as the definition of done.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 21:47:52 -04:00
jedarden
0276706340 docs(plan): specify the switching & keybindings surface
Add a "Switching & keybindings" section: global prefix bindings that call the
daemon via run-shell — Next (jump to head-of-queue pane), Popup (display-popup
picker), Skip (tail+cooldown then advance) — plus a status-line segment.
Documents the prefix-not-bare-key constraint and why the jump is the keypress,
never automatic. Resolves open questions 3 and 4 down to polish.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:37:38 -04:00
jedarden
f6f31ceaea docs: gap-review round 3 — reason enum, skip-cooldown ordering, label fixes
- MEDIUM: reason enum stated as exactly {permission, stopped} (drop stray
  "stopped/needs-next" third label)
- MEDIUM: specify oldest-READY-stuck-first — a cooldowned skipped item is not
  eligible to be the head; advance to next ready item, else present empty
- MEDIUM: SubagentStop downgraded from "Confirmed" to "exists; not probed"
  (probe only saw SessionStart/Stop)
- LOW: agent-inbox reuse reworded (Trail Boss actions are navigate-and-reply /
  skip, not accept/edit/ignore); note permission_mode is display-only

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:28:35 -04:00
jedarden
4e1b8a9cf2 docs: gap-review round 2 — fix hook-wiring self-contradiction
- HIGH: settings.json example wired PermissionRequest to a bare curl that drops
  the env-only $TMUX_PANE; route all hooks through trailboss-emit.sh (which
  injects $TMUX_PANE) and note SessionStart is not special
- MEDIUM: remove the stray trailboss-register.sh (contradicted "registry
  self-heals on every emit"); single emitter script
- LOW: add struck-through SubagentStop row to plan detection table; clarify
  disler's store is append-only (not "read-only")

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:21:23 -04:00
jedarden
675c1e531d docs: gap-review round 1 — reconcile supporting docs + close spec gaps
Fix 10 gaps found by fresh-eyes review:
- CRITICAL: mechanics doc still documented send-keys-relay/Agent-SDK delivery
  and the Notification hook; rewrote DELIVER to the navigator model, dropped
  Notification throughout
- HIGH: decisions.md + related-work.md still referenced priority "ranking",
  /reply dispatch, send-keys/SDK delivery, and the dead plan/question/idle
  reason taxonomy; aligned to FIFO + navigation + permission/stopped
- collector and daemon stated as one process; pull-not-broadcast presentation
- added trust boundary (loopback-only ingest, single-host trust assumption)
- resolved auto-advance focus-steal hazard (operator-initiated jump) and
  specified skip re-ordering (move to tail + cooldown) to avoid livelock
- downgraded SessionEnd to "not yet probed" (probe only saw SessionStart/Stop)
- dropped forked collector's WebSocket layer; most-stuck → oldest-stuck (FIFO)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:18:56 -04:00
jedarden
ca08cbbead docs: simplify to flat FIFO dead-letter queue + harness adapter seam
Resolve open questions from the design session:
- Stuck is stuck: no permission-vs-stopped priority; reason is display-only;
  queue is a flat FIFO dead-letter queue (Stop AND PermissionRequest still
  both required — permission blocks emit no Stop)
- Drop Notification entirely
- Auto-advance depletion loop: next stuck session loads on resolve/skip;
  saturation is a non-issue by construction
- New primary open question: harness-coupled detection vs harness-agnostic
  core, via a normalized stuck/unstuck adapter contract (switching is already
  tmux-level/harness-agnostic)
- Reboot: operator re-invokes manually (no auto-resurrection in v1)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 10:20:58 -04:00
jedarden
4784c61e4c docs: rework plan around navigator model + confirmed hook mechanics
Major design update from the design session:
- Human-on-the-loop framing; "stopped = needs attention" axiom
- Navigator-not-relay delivery via tmux (switch/link), resume + remote-control
  ruled out; live-panes (Model A) chosen over transcript-sessions (Model B)
- Daemon + presentation split; tmux-native durability across disconnect, with
  backlog accumulation while detached
- Transcript-as-ground-truth reconcile loop; non-goals; failure modes/invariants
- Probe-confirmed mechanics (2026-05-25): $TMUX_PANE + identity in hook env,
  Stop carries last_assistant_message, both interactive and -p fire hooks

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 10:01:17 -04:00
jedarden
f5e66b831c Initial commit: Trail Boss design docs
Single-pane attention router for interactive AI coding agents: stuck sessions
surface in one prioritized queue (most-stuck first) via Claude Code hooks, and
your reply is delivered back into the exact session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 22:37:56 -04:00