Skip to content

fix(fleet): T72.1 every live agent on GET /api/agents - #58

Merged
marcelocantos merged 2 commits into
masterfrom
fix/t72.1-fleet-agents-api
Aug 1, 2026
Merged

fix(fleet): T72.1 every live agent on GET /api/agents#58
marcelocantos merged 2 commits into
masterfrom
fix/t72.1-fleet-agents-api

Conversation

@marcelocantos

Copy link
Copy Markdown
Owner

Summary

  • 🎯T72.1: GET /api/agents emits the full registered fleet set (with parent when available) so the RHS panel can show every live agent.
  • Hermetic list completeness test.

Test plan

  • go test ./internal/server/ -run Agent
  • CI green

RHS panel completeness is a server feed: list every registry agent
(including PO-spawned/ephemeral children), emit parent lineage, and
keep name-stable ordering. Hermetic tests cover multi-level fleets.
claudia AgentDef has no Parent; keep optional parent JSON empty and
assert registry-complete /api/agents list including AutoStart=false.
@marcelocantos
marcelocantos merged commit 79c236c into master Aug 1, 2026
1 check passed
@marcelocantos
marcelocantos deleted the fix/t72.1-fleet-agents-api branch August 1, 2026 04:55
marcelocantos added a commit that referenced this pull request Aug 2, 2026
* Add isolated owner-chat journey suite (🎯T79)

Boots a throwaway jevonsd on :13715 with temp state_dir and
jevonsmcp-journey so live Grok journeys never hit the daily
stream. make test-journey runs J1–J5; not part of make test.

Co-Authored-By: Grok <noreply@x.ai>

* fix(fleet): independent sessions per agent name; longer session display

Bump claudia to de7e55e (name-keyed EnsureAgent — no workdir session
steal). agent_list/start use sessionDisplay so concurrent UUID-v7
peers no longer look identical. Hermetic regressions for same-workdir
two-name isolation and same-name idempotency (🎯T86).

* fix(chat): collapse by rendered height ratio, not char count

Tallness is full offsetHeight > 1.5 × collapsed-preview height after
layout (tables/markdown no longer miss the gate). Measure only when the
bubble is in the DOM. Latest user and assistant still auto-expand (T66);
prior tall messages collapse (T77).

* docs(T106): collapse/expand design pad with human discussion section

* fix(deps): repin claudia with AgentDef.Parent (T72.1 compile)

Master tip still had de7e55e; chat.go uses Parent. Pin 58cb7f5 so
make bullseye builds again.

* chore: reintegrate unique local work onto origin/master base

Reconcile diverged master: base on origin (PR #54#58), restore
journeys (J6–J10), T104 persona, T96–T106 bullseye ledger, height-ratio
collapse already cherry-picked, Parent wire for fleet list.

* feat(mcp): restore agent kill + parent→descendant lineage

Re-apply jevons_agent_kill and lineage helpers after origin rebase.

* test(journey): restore J10 worker shell + kill in tool surface

* Update bullseye.yaml

* docs+test(T101): journeys are preferred E2E net with hermetic ratchet

AGENTS.md and journey README state preferred E2E net, distinct from
make test, journey-or-exception, and Universe B port refusal. Hermetic
go test ./scripts/journey-suite locks doctrine markers + J1–J10 inventory
+ dailyPort 13705 refusal. Achieve T101.

* test(T101): refuseDailyPort unit-tested on real path

Hermetic check calls refuseDailyPort(dailyPort) and expects error —
comment-only markers no longer keep the test green.

* Update bullseye.yaml

* docs(T107): journeys require agent E2E; hermetic tests are meta only

Owner: a user journey maps real interaction end-to-end and must talk to
an agent; cache after green is OK. Clarify AGENTS + journey README;
doctrine_test.go is explicitly not a journey. File T107; annotate T101.

* refactor: move meta-guards out of journey suite

Doc/inventory ratchets live in scripts/docratchet (prose ratchet, not
journeys). Daily-port refusal is unit-tested in portguard. journey-suite
has no unit tests — live E2E is make test-journey only.

* Update bullseye.yaml

* fix(web): follow long streaming replies to true bottom (T30.2)

Collapse measurement was repainting preview into the live body every
stream frame, thrashing scrollHeight and leaving stick-to-bottom pinned
at a stale mid-bubble offset (manual scroll bounced until seal).

Skip collapse while a bubble is streaming; restore pin-guard + 120px
slack + double-rAF; re-pin on seal/mermaid; end-sentinel IntersectionObserver
when follow is armed but bottom left the viewport; overflow-anchor:none.
Hermetic stream-scroll-test covers growth, scroll-up disarm, and free
scroll after seal.

* Update bullseye.yaml

* feat(control-plane): T108 multi-agent fan-out from owner chat

Close the control-plane dependency graph for complex fleet work: RHS
who-started-whom tree with stable sibling sort, full registry list feed,
event-driven agents.json refresh (fsnotify → agents_changed), mid-turn
tool/fleet progress chrome, stuck-turn watchdog, NCA-named cross-tree
kill deny, persona Build/Ship + fleet-spawn + impatience/RSI doctrine.

Oracles: package tests (agents watch, lineage NCA, persona), UI suite
(fleet-tree, attention, stream-scroll, collapse), journey J6b MCP
reconnect + J8–J10 multi-agent paths on Universe B.

* Update bullseye.yaml

* fix(T108): honest control-plane evidence after skeptic reject

- T94: idle-bound stuck-watchdog; progress resets lastWorkingActivity;
  interrupt+status only after pure idle (no false-recover mid multi-agent).
- T85: SweepDeadAgents / deadRecoveryPlan on list+send; rehydrate or clear.
- T104 under fan-out: FleetStandingBrief on first jevons_agent_send;
  package TestEnsureFleetBriefInjectsOnce.
- J8b-po-worker-lineage-fanout: PO+worker parent lineage + brief ack.
- Reopen/re-achieve T108 only with skeptic-hardened evidence matrix.

* fix(T85): hermetic dead-handle sweep oracle + tool-visible recovery

SweepDeadAgents now runs through fleetSweepReg so tests inject
hasProc&&!Alive without an OS process. Oracles assert Launch (AutoStart
recover) and Stop (ephemeral clear / failed recover). agent_list and
agent_send prepend FormatDeadAgentReport and notify the overseer so
outage/recovery is not log-only.

* Update bullseye.yaml

* feat(T109): unattended safe batch — UI polish, journeys, integrity

Close T109 leaves without owner gates: journey step library (T102),
journey doctrine/cache notes (T107), thread integrity on status (T33),
tool-arg wire detail (T64), composer layout (T69/T70/T70.1), remove
TMUX panel (T73), highlight.js (T74), user quotes (T75), dictation tidy
(T80), GitHub path icon (T84), history redo Enter (T88), timestamp
tooltips (T91). Hermetic batch-t109-test + package/journey oracles.

* Update bullseye.yaml

* fix(T64): pin claudia that preserves tool_call rawInput

claudia 20464ce passes ACP session/update params through as Event.Raw
so rawInput is not dropped by a narrow re-marshal. Bump go.mod and add
TestToolCallDetailFromClaudiaPreservedParams (product-shaped params +
regression guard that stripped re-marshal loses args). Re-achieve T64/T109.

* fix(web): stick-to-bottom during incremental stream (T30.2)

Mid-stream freeze/bounce was still possible: flex-shrink let tall bubbles
under-report scrollHeight, collapse measurement still painted through the
live body on seal/expand, and end-sentinel IO only re-fires on transitions.

- flex-shrink:0 on #messages children so scrollHeight tracks content
- probe-based measureCollapse (no intermediate preview in live body)
- expanded/latest paints full once; stream bubble ResizeObserver re-pins
- pin-guard window + immediate post-paint pin on each stream frame
- stronger hermetic stream-scroll oracle (working chrome + tables)

* fix(web): stop follow-scroll from fighting history browse

End-sentinel IntersectionObserver re-pinned whenever the bottom left the
viewport while autoScroll was still true (within 120px slack). Wheel-up
moved a few pixels then snapped back.

Remove IO re-pin; growth follow stays on post-paint pin + stream
ResizeObserver. Disarm on wheel/touch scroll-up. Hermetic wheel-up
oracle asserts no snap-back.

* Update bullseye.yaml

* feat: unattended frontier batch (T34/T56/T76/T93/T95/T99)

- T34: Butler.PushEvent + jevons_event_push MCP (rehydrate, no silent fail)
- T56: virtualise off-screen chat bodies (virt-shell + content-visibility)
- T76: paste images → POST /api/images → [image:id] on the agent turn
- T93/T95: target: filing aside + jevons_target_file + __TARGET_FILED__ auto-close
- T99: cheap ThreadRoute continuation matcher on main send
- T40: design note only (needs claudia connect-mode) — left open
- Oracles: Go push/image/target-file tests; UI virtual-list + image-paste

* fix(web): latched Track/Free stick-to-bottom (no distance magnet)

Follow mode is sticky policy above the DOM, not nearBottom(120px):
- Track: growth pins to true bottom (re-check before each pin)
- Free: user owns scroll; stream growth never re-arms
- Enter: send/boot/arrive at bottom (16px entry ε only)
- Leave: wheel/touch/PageUp/scrollbar up (not layout clamps)
- Bookkeeping ignores pin, virtualise, and history-prepend scroll noise

Hermetic stream-scroll-test covers small leave mid-stream + re-enter.

* fix(web): hysteresis so Free is not re-armed inside the bottom ε band

After leave, geometry may re-enter Track only once the user has moved
clear of ENTER_BOTTOM_EPS (~16px). Removes the residual mid-stream snag
from leave → still-at-bottom scroll sensor → re-pin, without new policy
layers. Explicit enter (send/boot) still arms immediately.

* fix(web): allow Track re-entry after a full leave past the ε band

leaveTrackBottom only blocks geometry re-arm while still inside the
entry band; a leave that already cleared it (e.g. jump to top) can
re-enter on the next arrival. Amends the hysteresis so hermetic
arrive-at-bottom still works.

* Update bullseye.yaml

* fix(web): rematerialise after T77 collapse so content above reappears

When a prior latest reply collapses on a new request, height shrinks and
Track re-pins; off-screen virt-shells that enter the viewport were not
refreshed until the next user wheel (blank gap above the collapsed bubble).

- scheduleVirtualize after latest-expansion height changes
- virtualise on pin/bookkeeping scroll events too
- rematerialise shell before collapsing a dematerialised prior latest
- re-entrancy guard; keep expand toggle on dematerialise
- hermetic: virtual-list collapse gap; collapse-test stubs virt for DOM asserts

* Update bullseye.yaml

* fix(T70.1): keep latest reply visible when composer grows

When the textarea auto-grows, the flex messages viewport shrinks but
scrollTop stayed fixed, so the bottom of the transcript slid under the
composer. Bump messages.scrollTop by the growth delta (pure policy in
composer_layout.js) and cover growth-without-cover with a hermetic unit
test — no Playwright.

Co-Authored-By: Grok <noreply@x.ai>

* Update bullseye.yaml

* feat(T110): self-test orchestrator, probe surface, and first packs

Add the thin vertical self-test slice: shared report schema, pack runner
(HTTP + MCP), layout probe (JevonsProbe.snapshot), and three gradable packs
(health-L1, composer-growth-L2, agents-parent-L1) for sites live|drill|ci.
Drill site documented as docs-only ensure-isolate path (T110.4).

Co-Authored-By: Grok <noreply@x.ai>

* Update bullseye.yaml

* feat(T113): owner chat send queue — Enter enqueues while busy

While an overseer turn is in flight, plain Enter enqueues the draft as a
follow-up instead of interrupting. Only Control+Enter interjects. Queued
items render above the composer with send-now/cancel; FIFO auto-drains on
turn seal. Alt+Up/Down cycles queue before request history.

Pure policy in web/scripts/send_queue.js + hermetic tests; wired into
make test-web.

* Update bullseye.yaml

* fix(T95.1): dismiss completed asides from chrome, archive not park

closeTargetAside and dismiss set status=done (not parked); stack() is
open+parked only; archive()/archivedStack() keep completed asides
discoverable. Manual park still shows as intentional chips.

Hermetic: after file/close, stack excludes filing asides; archive lists
them. Re-attests T95 auto-close as dismiss-from-chrome + focus main.

Co-Authored-By: Grok jv-t95 <noreply@x.ai>

* fix(T95.1): migrate legacy parked file-target asides to done on load

Pre-T95.1 auto-close used park(), so completed filing asides stayed in
localStorage as parked chips after refresh. On deserialize/load, map
purpose=file-target && status=parked → done; intentional manual parks
unchanged.

---------

Co-authored-by: Grok <noreply@x.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant