Skip to content

The native merged sessions view — Slice C of the local-shell data plane (amicissimo#393) - #848

Merged
aarontrowbridge merged 2 commits into
mainfrom
393-merged-sessions-view
Sep 7, 2026
Merged

The native merged sessions view — Slice C of the local-shell data plane (amicissimo#393)#848
aarontrowbridge merged 2 commits into
mainfrom
393-merged-sessions-view

Conversation

@aarontrowbridge

@aarontrowbridge aarontrowbridge commented Sep 7, 2026

Copy link
Copy Markdown
Member

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/sessions merged projection — Slice A's provenance-tagged read path, never a parallel one:

  • BOTH stores in ONE list; every row provenance-tagged local | hub (per D2's tagging; a row the projection ships untagged is never guessed a label).
  • Live posture honesty (D6): the view honors /amicode/fleet/statusdegraded is 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.
  • Refetch-before-first-render (D2): any posture transition bumps the refetch epoch; rendered rows go stale and an honest loading state takes their place — never stale-as-current (the BUG: Archiving the active session blanks the tab instead of entering readonly mode #293 class, killed at the view layer too).
  • Currency honesty (D2): a refetched projection that is currency-compatible with what is rendered (same sources, same token) keeps the rendered rows; tokens over different source sets are never compared.

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: false and 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.
  • i18n: 3 new keys × 18 locales (app-domain parity verified).

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).
  • New tests: 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.
  • i18n app-domain parity: 3 fleet keys present in all 17 non-English locales.
  • NOTE (amicode#842): the app-bundle working tree was restored before this commit; the committed diff contains ONLY this slice's files. The overlay-sync artifact rewrites the tree mid-suite and is never committed.

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)

…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)
@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

… 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
aarontrowbridge marked this pull request as ready for review September 7, 2026 00:26
@aarontrowbridge
aarontrowbridge merged commit ea9d094 into main Sep 7, 2026
10 checks passed
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
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