The native merged sessions view — Slice C of the local-shell data plane (amicissimo#393) - #848
Merged
Merged
Conversation
…cal-shell data plane (amicissimo#393) The home flyout's sessions view renders the /amicode/fleet/sessions merged projection (D2): both stores' sessions in ONE list, each row provenance-tagged local|hub, honoring the live posture from /amicode/fleet/status — degraded surfaced, the hub-down pointer surfaced verbatim with the base list still running, and refetch-before-first-render on every posture transition keyed on the refetch epoch (never stale-as-current). Currency honesty per D2: tokens are only compared when derived over the same source set. Entitlement honesty (the H3 discipline at the view layer): without the amicissimo entitlement the staged status route 404s, the view-model resolves exists=false, and the base sessions list passes through byte-identical. The view-model (fleet-sessions.ts) is pure and solid-free; the Solid consumer (fleet-sessions-view.tsx) is thin; tests run headless under vitest (fleet_sessions_view_393.test.ts, 24 tests). Supersedes the read-only Fleet Sessions tree view (amicode#779, held PR #794) per the sub-spec's D4 — the interim bridge's premise is retired at this plane's landing. Refs: harmoniqs/amicissimo#393, harmoniqs/amicissimo#380, spec spec-20260905-193000-local-shell-data-plane rev 2 (Slice C)
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This was referenced Sep 7, 2026
… hash map (amicissimo#393) The app-bundle drift gate (amicode#842's companion gate) verifies every overlay file's sha256 against the manifest — the Slice C files (2 new + 19 edited) are registered. node packages/app-bundle/scripts/drift_gate.mjs passes: 594 files verified, overlay and manifest in sync.
aarontrowbridge
marked this pull request as ready for review
September 7, 2026 00:26
aarontrowbridge
added a commit
that referenced
this pull request
Sep 7, 2026
…gative path, mid-session re-bind, turn-boundary auto S2 (spec-20260907-011500 D2, #859): the plan-exit confirm surface, first- class on the app overlay (the fork #297 slice-b intent, ported to the substrate — composed on the EXISTING /amicode/* route family and the app's agent binding, never a new engine contract). - GET/POST /amicode/posture (+ /dismiss): a DUMB READER of the compiled plan's STAMPED posture_recommendation — the service never re-derives, never keyword-guesses; an unstamped plan reads null and the offer stays quiet. plan.auto_switch = confirm | auto rides the ops-dir prefs file (fail-safe to confirm). Dismissal is per-plan_hash (a recompile re-arms). - The indicator view-model (pure, headless-tested): named states absent / quiet / offer; the confirm surface carries the NEGATIVE path one click each — confirm / dismiss / wrong—actually <other mode> / stay in plan; a MIXED-shape recommendation names BOTH modes (the user picks — no silent coin-flip); dismissed → ambient again. - Switch mechanics (the Tab-switch contract, made product): local.agent.set IS the mid-session re-bind; in-session it also lands the posture change on the session record (session.update metadata — the ADR-0011 vNext additive surface, fire-and-forget). plan.auto_switch=auto defers the click to the TURN BOUNDARY (never mid-generation), announces, drops when a newer plan supersedes; ONLY the agent binding changes — the session's draft and pending questions ride along untouched. - Bidirectional (D2): the collapsed indicator in develop/research carries the walk-back-to-plan affordance. - Ambient-when-ignored (the observability clause): quiet until there is a recommendation; the offer banner is the one thing that asserts itself; renders NOTHING when the route does not exist (older extension). - Mounted twice: home flyout (acts on the default/draft posture) and the session header's titlebar-right portal (the mid-session re-bind surface). - i18n ×18 locales (15 keys, parity-checked); manifest hash registration for all 23 touched overlay files (#848 gate — drift gate PASS). Refs #859
aarontrowbridge
added a commit
that referenced
this pull request
Sep 7, 2026
…er row, display-only suggestions, the drift seat S3 (spec-20260907-011500 D3, amicode#860), the app-overlay half. A settings tab is explicitly user-invoked — the observability clause's full-visibility surface. - the view-model (subagent-routing.ts, solid-free, headless under the extension's vitest — the #848/#859 pattern): the defensive body parse off GET /amicode/model-routing; unknown tiers read as the default chip, never a wrong provenance - the settings-v2 section (subagent-routing.tsx): per-role rows (role → effective model + provenance chip + edit affordance), the display-only suggestion line (credential-filtered server-side; credentialed-less providers never appear), the drift + reset-to-tuned seat, the opt-in toggle (the zero-config fold's bridge), and the live-providers line; empty edit value resets the row (clears the user-set tier); the route absent → the unavailable note, never a dead table - dialog-settings-v2 gains the subagents tab; i18n ×18 locales (parity gated by test, extension-side so CI runs it); overlay manifest hashes refreshed (the drift gate passes) Refs #860
aarontrowbridge
added a commit
that referenced
this pull request
Sep 10, 2026
…ash registration The docket and shellRowDetail helpers under the extension vitest lane (the #848/#859/#862 headless pattern — the repo's runner, never bun), covering the fork's full test cases, plus CSS-grammar regression guards for the slab / docket slots / yellow answer chip / per-scheme prompt-bubble seating / shell command anatomy (the #349 deletion bug class). Manifest hashes registered for all 8 edited overlay files (the #848 gate); drift gate PASS. Refs #853
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the loop on the user-visible promise of spec-20260905-193000 Slice C (amicissimo#393, amicissimo#380): standalone and hub sessions, one list, no silent split.
What ships
The native merged sessions list (D2, made visible). The home flyout's sessions view now renders the
/amicode/fleet/sessionsmerged projection — Slice A's provenance-tagged read path, never a parallel one:local|hub(per D2's tagging; a row the projection ships untagged is never guessed a label)./amicode/fleet/status—degradedis surfaced (rows still render, the state is never silent), and the hub-down posture surfaces the service's pointer verbatim while the base standalone list keeps running underneath.Entitlement honesty — the H3 discipline at the view layer. Without the amicissimo entitlement the staged status route answers the base no-route 404; the view-model resolves
exists: falseand the base sessions list passes through byte-identical. The view does not exist.D4 — the #779/#794 disposition. This view supersedes the read-only Fleet Sessions tree view (amicode#779; held draft PR amicode#794). Disposition comments recording the supersession (per the sub-spec's "never silent"):
(Closing #794 remains Aaron's click, per the slice contract.)
Shape
fleet-sessions.ts— the view-model: pure, solid-free, headless-testable (the established Re-home the session & device lifecycle base contract onto the app overlay (canonical v1.18.29) #817 discipline).fleet-sessions-view.tsx— the thin Solid consumer rendered AROUND the base list.home.tsx— the flyout's Active tab wraps its base list in<FleetSessions>; children pass through untouched whenever the view is absent/pending/hub-down.Verification (run in this PR's worktree)
Commits:
507e35c8(the view) +6f8dbe1e(the app-bundle manifest hash registration the drift gate requires for overlay files — amicissimo#393's view files are hand-authored, so the manifest's files map is updated per the #841 precedent; the committed-state drift gate passes: 594 files verified, overlay and manifest in sync).pnpm run typecheck— clean.pnpm run test(vitest) —Test Files 3 failed | 168 passed | 1 skipped (172)/Tests 5 failed | 2684 passed | 52 skipped (2741); the 5 failures are the known pre-existing set, present on clean main with the identical environment:terminal ×2,editable_diffs ×2,cli_gate ×1(env-dependent staging fixture).test/fleet_sessions_view_393.test.ts— 24 tests, all green, covering the H3 view-layer honesty, posture parsing, defensive projection parsing, the honest state machine (base/absent/standalone-pointer/loading/stale/degraded/merged), the refetch-epoch gate, and D2 currency comparability.Out of scope (per the sub-spec)
Offline/mirror (sessions-to-go); any write-path change (Slice B owns writes); the hub's side of request-identity dedupe (vNext candidate, recorded).
Refs: harmoniqs/amicissimo#393 · harmoniqs/amicissimo#380 · amicissimo#391 (Slice A) · amicissimo#392 (Slice B)