Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
230 commits
Select commit Hold shift + click to select a range
6ca80f9
docs: add Slack integration setup guide and app manifest
Sep 15, 2026
6ed47ed
docs(skills): rewire the spec-reviewer prompt + analyze off the dead …
aarontrowbridge Sep 20, 2026
bead5cc
feat(packs): the pack lint + the two seeded domain packs — EE/test-&-…
aarontrowbridge Sep 20, 2026
b3d5d26
docs(skills): route amico-schema-check escalation off the dead STRATE…
aarontrowbridge Sep 24, 2026
cedaaf3
docs(paper-mode): ADR-0023 + glossary for human-in-the-loop LaTeX co-…
Sep 28, 2026
629eb3b
feat(skills): concise mode — toggleable output-shaping skill
Sep 28, 2026
5d7af5f
feat(app): concise-mode toggle in the composer bottom row
Sep 28, 2026
59cbefb
feat(app): concise mode as a composer switch, applied on send
Sep 28, 2026
a2fdaa3
fix(app): concise directive rides as invisible per-turn system, not v…
Sep 28, 2026
e4f45c7
refactor(app): drop concise-mode tooltip — label is self-explanatory
Sep 28, 2026
7208d91
fix(app): persist preview open-paths across editor reload (#1640)
Sep 28, 2026
2a6f711
fix(app): gate preview restore on store hydration (fixes only-1-of-N)
Sep 28, 2026
369fb9f
chore(app-bundle): refresh manifest for preview-persistence overlay e…
Sep 28, 2026
4ec3396
fix(app): rework preview persistence to Approach A (survives reload +…
Sep 29, 2026
d37c3d6
chore(app): strip preview-persistence debug diagnostics
Sep 29, 2026
333cebd
feat(app): responsive concise toggle — hide when the composer is narrow
Sep 30, 2026
e47a124
fix(app): concise switch survives composer remount — session-keyed st…
Sep 30, 2026
177c512
feat(amico-run): amico fleet shard-rehome — the tested re-home for me…
aarontrowbridge Oct 1, 2026
ef6adaa
feat(amico-run): corrections scan — mine session corrections into ski…
aarontrowbridge Oct 2, 2026
2cea672
fix(amico-run): corrections scan tuning — the pasqal backfill verdict…
aarontrowbridge Oct 2, 2026
2ae58dd
fix(amico-run): corrections scan — independent-review hardening (#1677)
aarontrowbridge Oct 2, 2026
915d731
feat(skills): formulation-display — canonical optimization-problem pr…
aarontrowbridge Oct 4, 2026
ec56ece
feat(skills): the component inventory — integrators, objective terms,…
aarontrowbridge Oct 4, 2026
8f92ee7
docs(skills): the papers are style exemplars, not sources of truth — …
aarontrowbridge Oct 4, 2026
4cac10b
docs(skills): formulation-display gains the record doctrine — render …
aarontrowbridge Oct 4, 2026
4b1b725
docs(skills): formulation-display adopts the research loop report nam…
aarontrowbridge Oct 5, 2026
7c8d3e7
feat(app): Cmd+F find in Preview PDFs (S1) — shared DOM engine, Custo…
Oct 5, 2026
4e6c631
docs(skills): amico-catalog — compiler-stack fields landed in the com…
aarontrowbridge Oct 7, 2026
87846f6
test(skills): admission goldens — public-only regime over the real re…
aarontrowbridge Oct 10, 2026
6c74963
test(skills): admission goldens — entitled regime + entitlement leak pin
aarontrowbridge Oct 10, 2026
b203696
test(skills): admission goldens — internal mount present/absent + per…
aarontrowbridge Oct 10, 2026
27308c0
test(skills): admission goldens — least-privilege invariant across al…
aarontrowbridge Oct 10, 2026
ed295c9
test(ops): hub staging goldens — stage-internal-skills.sh mirror acro…
aarontrowbridge Oct 10, 2026
4a028e0
test(extension): panel-registration invariants — golden-enumerated we…
aarontrowbridge Oct 10, 2026
5018865
test(extension): leak-direction pins — the panel-flag golden bites
aarontrowbridge Oct 10, 2026
9970afc
docs(skills): findings F33 + F34 — the empty cast-death class and sta…
aarontrowbridge Oct 21, 2026
b24d04c
docs(skills): develop — de-companion the implementer-card reference (…
aarontrowbridge Oct 21, 2026
7ab632e
docs(skills): loop-methodology laws from the diraq-esr-realism campaign
aarontrowbridge Oct 23, 2026
3d8af4c
fix(skills): arjev-onboarding — the real Slack scope set and the one-…
aarontrowbridge Oct 25, 2026
6b2cf7c
docs(skills): spec-design checks + loop-hygiene lessons in deliberate…
aarontrowbridge Oct 26, 2026
b7cbf8b
docs(skills): intonatissimo QP-ILC step-representation guidance; conj…
aarontrowbridge Oct 26, 2026
66cd535
docs(skills): intonatissimo — scope the step guidance to what was mea…
aarontrowbridge Oct 27, 2026
be97ffc
feat(amico-run): spec slices adopts an existing issue named by a row'…
aarontrowbridge Oct 27, 2026
1fcfbd4
chore: untrack ops/hub/__pycache__ and gitignore __pycache__/ repo-wi…
aarontrowbridge Oct 27, 2026
0af89d2
fix(extension): suppress followed-session notifications for any visib…
aarontrowbridge Oct 27, 2026
c8943bf
fix(app): suppress question/permission toasts for the viewed session …
aarontrowbridge Oct 27, 2026
ba59888
fix(ops/hub): deploy-gate smoke bounds the staged server's shutdown (…
aarontrowbridge Oct 27, 2026
c7a2517
docs(release): refresh the pinned CLI on every machine after a CLI-ch…
aarontrowbridge Oct 27, 2026
0868868
feat(extension): stage skills into opencode's native user skill dir (…
aarontrowbridge Oct 27, 2026
5962171
docs(develop): the walk unit for a campaign PRD is the tier/wave per …
aarontrowbridge Oct 27, 2026
2a89073
docs(develop): name the lifecycle-tools degradation fallback (#1949)
aarontrowbridge Oct 27, 2026
f789dc2
Merge pull request #1952 from harmoniqs/v311-1949b
aarontrowbridge Oct 27, 2026
a83733b
Merge pull request #1950 from harmoniqs/v311-1948
aarontrowbridge Oct 27, 2026
7e08366
Merge pull request #1951 from harmoniqs/v311-1949a
aarontrowbridge Oct 27, 2026
8bbc3da
chore(extension): version the live-test lane 0.3.11-lane.1
aarontrowbridge Oct 27, 2026
517f0ee
fix(extension): regenerate exemplars/index.json — rydberg-cz baseline…
aarontrowbridge Oct 27, 2026
4469c58
fix(packs): re-pin quantum-control's integrity sha for the regenerate…
aarontrowbridge Oct 27, 2026
f01f59d
Merge pull request #1954 from harmoniqs/v311-exemplar-index
aarontrowbridge Oct 27, 2026
4006ae3
fix(ops/hub): frontdoor binds loopback by default; LAN exposure is an…
aarontrowbridge Oct 28, 2026
7ce345d
docs(adr): 0037 Armonia trust boundaries — Tailscale transport, sover…
aarontrowbridge Oct 28, 2026
6f5fb41
docs(skills): intonatissimo — QPILCStrategy knobs (:lowrank, Analytic…
aarontrowbridge Oct 28, 2026
d04e5d0
feat(session-ui): add Cmd+L (Mod-l) go-to-line shortcut in CM6 editors
harmoniqs-amico-agent[bot] Oct 28, 2026
2aca2f0
fix(app): refocus composer and restore caret on session tab switch
harmoniqs-amico-agent[bot] Oct 28, 2026
486f9bd
test: #1790 AC1/AC2/AC3 pinning tests for the three remaining SSE str…
harmoniqs-amico-agent[bot] Oct 28, 2026
a93bd6b
perf(fleet): linear-time SSE frame splitting in the three remaining r…
harmoniqs-amico-agent[bot] Oct 28, 2026
d997537
fix(test): surface engine log on session-create timeout; 120s cold-st…
harmoniqs-amico-agent[bot] Oct 28, 2026
c9bcffe
fix(onboarding): drop profileHasIdentity() gate from shouldOnboard (#…
harmoniqs-amico-agent[bot] Oct 28, 2026
ef9b1eb
fix(fleet): one gap per lost stretch — a refusing member no longer ga…
harmoniqs-amico-agent[bot] Oct 28, 2026
c73621b
Merge pull request #1957 from harmoniqs/v311-frontdoor-loopback
aarontrowbridge Oct 28, 2026
2e4a398
fix(extension): type SessionStreamFilter.tail as Buffer so subarray t…
aarontrowbridge Oct 28, 2026
9966f63
chore(app-bundle): refresh manifest for session.tsx overlay edit (#1248)
aarontrowbridge Oct 28, 2026
01d51a2
feat(notturno): .notturno/gates — drift gate, typecheck, touched vite…
aarontrowbridge Oct 28, 2026
6c3eded
fix(app-bundle): refresh manifest hashes for editor-core overlay edit…
aarontrowbridge Oct 28, 2026
6b44b1b
feat(engine): POST /provider/probe one-token reachability probe with …
aarontrowbridge Oct 28, 2026
8bd9f3a
test(service): RED — model-reachability cache, rate limit, demote, ru…
aarontrowbridge Oct 28, 2026
89db4ab
feat(service): model-reachability cache + scheduler + GET/refresh/dem…
aarontrowbridge Oct 28, 2026
a713624
Merge pull request #1983 from harmoniqs/amico/issue-1980-notturno-gates
aarontrowbridge Oct 28, 2026
b6f4708
test(app): RED — picker reachability merge: visible set, toggle count…
aarontrowbridge Oct 28, 2026
f78c29a
feat(app): model picker hides dead models — 'Show unavailable (N)' wi…
aarontrowbridge Oct 28, 2026
9f07829
test(app): RED — dead-pick: demote-class vs transient turn errors, fr…
aarontrowbridge Oct 28, 2026
c092d07
feat(app): fail fast on a dead pick — demote on denied/unavailable/in…
aarontrowbridge Oct 28, 2026
d974e7e
test(app): RED — picker short list: favorites → recommended → recent …
aarontrowbridge Oct 28, 2026
491289a
feat(app): model picker short list — favorites (star, persisted) → re…
aarontrowbridge Oct 28, 2026
be98bd2
Merge remote-tracking branch 'origin/opencode/1989-dead-pick' into am…
aarontrowbridge Oct 28, 2026
fccbd34
test(app): RED — picker row meta formatter (price rounding / free / m…
aarontrowbridge Oct 28, 2026
f17e56c
feat(chat): inline previews for agent-written images, with copy to th…
aarontrowbridge Oct 28, 2026
9026bc1
feat(app): model picker row meta — $in/$out · cache per Mtok, context…
aarontrowbridge Oct 28, 2026
88adea0
chore(deps): bump the prod-dependencies group across 1 directory with…
dependabot[bot] Oct 28, 2026
5e4ae2c
test(engine): RED — probe retries once at a max_output_tokens floor (…
aarontrowbridge Oct 28, 2026
ee09bcc
fix(engine): probe retries once at a max_output_tokens floor (parsed …
aarontrowbridge Oct 28, 2026
ca0328e
Merge remote-tracking branch 'origin/amico/issue-1979-model-picker' i…
Oct 28, 2026
0a58964
test(engine,app): RED — Meta max_output_tokens floor wording retries …
aarontrowbridge Oct 28, 2026
3ae2e92
fix(engine,app): probe classifier broadens the max_output_tokens floo…
aarontrowbridge Oct 28, 2026
a5ae805
test(app): RED — picker row renders the name with a full-name title a…
aarontrowbridge Oct 28, 2026
e7a7a1c
fix(app): picker rows are two lines — name owns line 1 (wraps ≤2, tit…
aarontrowbridge Oct 28, 2026
f7be6d5
fix(app): picker scroll area max-h-[min(420px,60vh)] (V2) and V1 popo…
aarontrowbridge Oct 28, 2026
1aab753
Merge pull request #1995 from harmoniqs/amico/issue-1979-into-lane311
aarontrowbridge Oct 28, 2026
a389bed
docs(skills): Measurement index semantics on the QICK seam — intonati…
aarontrowbridge Oct 28, 2026
19afeaf
feat(app): tour targets for file tree, preview, files changed, posture
harmoniqs-amico-agent[bot] Oct 29, 2026
6e39da8
feat(app): data-tour-target anchors for side panel and posture select
harmoniqs-amico-agent[bot] Oct 29, 2026
7cfa6ca
chore(app-bundle): refresh manifest for tour-target overlay edits
harmoniqs-amico-agent[bot] Oct 29, 2026
966b931
feat(session-ui): syntax-aware code folding in CM6 editors (harmoniqs…
harmoniqs-amico-agent[bot] Oct 29, 2026
de6ac5a
test(notturno): RED — gates' vitest steps run under CI's env (CI=true…
aarontrowbridge Oct 29, 2026
f444f56
fix(notturno): gates run vitest suites the way CI's fast job does — e…
aarontrowbridge Oct 29, 2026
d328852
Merge pull request #1981 from harmoniqs/night/amicode-1793-2026-10-28…
aarontrowbridge Oct 29, 2026
837ec56
Merge pull request #2004 from harmoniqs/night/amicode-1162-2026-10-29
aarontrowbridge Oct 29, 2026
38ed48a
Merge remote-tracking branch 'origin/lane/0.4.0' into opencode/2007-s…
aarontrowbridge Oct 29, 2026
158f301
Merge branch 'opencode/1658-shard-rehome' of github.com:harmoniqs/ami…
aarontrowbridge Oct 29, 2026
432d016
Merge branch '1677-featamico-run-corrections-scan-mine-session-correc…
aarontrowbridge Oct 29, 2026
31d3a3c
Merge branch 'night/amicode-1517-2026-10-29-r2' of github.com:harmoni…
aarontrowbridge Oct 29, 2026
19da81a
Merge branch 'night/amicode-1515-2026-10-28b' of github.com:harmoniqs…
aarontrowbridge Oct 29, 2026
ce3616b
fix(amico-run): corrections — cap preview jev calls at 50, keep amico…
aarontrowbridge Oct 29, 2026
5c98f47
fix(session-ui): drop unused keymapBindings opts; test Mod-L/Mod-Alt-…
aarontrowbridge Oct 29, 2026
4fb5ecb
Merge branch 'night/amicode-1248-2026-10-28b' of github.com:harmoniqs…
aarontrowbridge Oct 29, 2026
84e2188
Merge branch 'image-preview-copy' of github.com:harmoniqs/amicode int…
aarontrowbridge Oct 29, 2026
80589a5
fix(app): guard tab-switch composer refocus like type-to-focus; use p…
aarontrowbridge Oct 29, 2026
d35db15
Merge branch 'night/amicode-1790-2026-10-28b' of github.com:harmoniqs…
aarontrowbridge Oct 29, 2026
4744b0b
fix(fleet): restore the resume filter's frame-boundary floor; move Ss…
aarontrowbridge Oct 29, 2026
1fcd8b7
Merge branch 'night/amicode-1796-2026-10-28b' of github.com:harmoniqs…
aarontrowbridge Oct 29, 2026
93b0cef
fix(chat-images): await the nonce'd clipboard-image-written reply, ne…
aarontrowbridge Oct 29, 2026
9463c91
Merge branch 'feat/pdf-find-s1' of github.com:harmoniqs/amicode into …
aarontrowbridge Oct 29, 2026
ebf8e8c
Merge branch 'preview-reload-persist' of github.com:harmoniqs/amicode…
aarontrowbridge Oct 29, 2026
0f9a004
fix(preview): persist the open set only from the visible foreground s…
aarontrowbridge Oct 29, 2026
66ef7d5
Merge branch 'concise-skill' of github.com:harmoniqs/amicode into ami…
aarontrowbridge Oct 29, 2026
874299c
fix(test): warm the instance before the timed session create in the m…
aarontrowbridge Oct 29, 2026
d914dc0
Merge branch 'night/amicode-1161-2026-10-28b' of github.com:harmoniqs…
aarontrowbridge Oct 29, 2026
d2262ba
fix(concise): pin the hidden concise directive reaching the V1 prompt…
aarontrowbridge Oct 29, 2026
c9538c3
fix(extension): delete unused profileHasIdentity and its tests; refre…
aarontrowbridge Oct 29, 2026
b0edbef
Merge branch 'opencode/issue-1747-panel-invariants' of github.com:har…
aarontrowbridge Oct 29, 2026
72d5f65
Merge branch 'dependabot/npm_and_yarn/prod-dependencies-564d45e3e8' o…
aarontrowbridge Oct 29, 2026
4d2e652
test(extension,app): RED — What's-new release selection (0.3.10→0.4.0…
aarontrowbridge Oct 29, 2026
f5ec353
feat(extension,app): What's-new landing page — docs/releases/<v>.md b…
aarontrowbridge Oct 29, 2026
a66fadd
chore(deps): lockfile-only fast-uri 3.1.9 + zod 4.6.7; bump overlay p…
aarontrowbridge Oct 29, 2026
79bf53d
Merge branch 'skill-loop-laws' of github.com:harmoniqs/amicode into a…
aarontrowbridge Oct 29, 2026
79cf79d
Merge branch 'research-loop-lessons' of github.com:harmoniqs/amicode …
aarontrowbridge Oct 29, 2026
23e2ffd
fix(skills): research — pinned-harness guidance in its own paragraph …
aarontrowbridge Oct 29, 2026
78dbad4
Merge branch 'skills-intonatissimo-qpilc' of github.com:harmoniqs/ami…
aarontrowbridge Oct 29, 2026
e148399
Merge branch 'intonatissimo-step-doctrine' of github.com:harmoniqs/am…
aarontrowbridge Oct 29, 2026
45a384e
fix(skills): intonatissimo — drop #1899's duplicate null-space-penalt…
aarontrowbridge Oct 29, 2026
e18af86
Merge branch 'skills-measurement-index' of github.com:harmoniqs/amico…
aarontrowbridge Oct 29, 2026
05ff188
Merge branch 'opencode/1726-amico-catalog-schema-v3' of github.com:ha…
aarontrowbridge Oct 29, 2026
bfa6cb1
Merge branch 'opencode/issue-1743-admission-goldens' of github.com:ha…
aarontrowbridge Oct 29, 2026
59de03c
Merge branch 'arjev-skill-scopes' of github.com:harmoniqs/amicode int…
aarontrowbridge Oct 29, 2026
9fb3483
fix(skills): arjev-onboarding — add channels:join to the Slack scopes…
aarontrowbridge Oct 29, 2026
da07bf5
Merge branch 'amico/1328-reland' of github.com:harmoniqs/amicode into…
aarontrowbridge Oct 29, 2026
a7f155f
Merge branch 'amico/1326-reland' of github.com:harmoniqs/amicode into…
aarontrowbridge Oct 29, 2026
209afa7
fix(skills): analyze — `amico-run strategy-brief` → `amico strategy-b…
aarontrowbridge Oct 29, 2026
be45245
Merge branch 'findings-f33-f34' of github.com:harmoniqs/amicode into …
aarontrowbridge Oct 29, 2026
0a92a0b
test(skills): pin develop's F33 cast-death paragraph (carried over fr…
aarontrowbridge Oct 29, 2026
c1793d2
Merge branch 'docs/slack-setup-guide' of github.com:harmoniqs/amicode…
aarontrowbridge Oct 29, 2026
03547f8
fix(skills): amico-slack SETUP — Steps 4–5 for the `amico slack login…
aarontrowbridge Oct 29, 2026
e64ed19
Merge branch 'docs/paper-mode-adr' of github.com:harmoniqs/amicode in…
aarontrowbridge Oct 29, 2026
4d1120f
fix(docs): renumber the Paper Mode ADR 0023 → 0038 (0023 is taken, 00…
aarontrowbridge Oct 29, 2026
996ede6
Merge branch 'formulation-display' of github.com:harmoniqs/amicode in…
aarontrowbridge Oct 29, 2026
d941afa
fix(skills): formulation-display — quote the YAML description (unquot…
aarontrowbridge Oct 29, 2026
d8bb78a
Merge remote-tracking branch 'origin/amico/0.4-docs' into amico/0.4-i…
aarontrowbridge Oct 29, 2026
6a9fbd6
Merge remote-tracking branch 'origin/amico/0.4-features' into amico/0…
aarontrowbridge Oct 29, 2026
72deacb
Merge remote-tracking branch 'origin/amico/0.4-night' into amico/0.4-…
aarontrowbridge Oct 29, 2026
a3e1b55
Merge remote-tracking branch 'origin/opencode/2007-sandbox-gates' int…
aarontrowbridge Oct 29, 2026
687072e
Merge remote-tracking branch 'origin/opencode/2001-whats-new' into am…
aarontrowbridge Oct 29, 2026
5c55b59
chore(app-bundle): refresh manifest after the 0.4.0 batch integration
aarontrowbridge Oct 29, 2026
a2a745a
chore: lane version 0.4.0-lane.1
aarontrowbridge Oct 29, 2026
4c44931
Merge pull request #2011 from harmoniqs/amico/0.4-integrate
aarontrowbridge Oct 29, 2026
8cc6e04
test(session-ui): pin multiple-cursor keybindings and in-sync edits (…
harmoniqs-amico-agent[bot] Oct 30, 2026
896bdf4
feat(session-ui): enable multiple cursors in CM6 editors (harmoniqs/a…
harmoniqs-amico-agent[bot] Oct 30, 2026
684febb
feat(composer): drag-to-resize height model with persistence (harmoni…
harmoniqs-amico-agent[bot] Oct 30, 2026
2450466
feat(composer): mount the resize handle on both chat inputs (harmoniq…
harmoniqs-amico-agent[bot] Oct 30, 2026
6a5ac7c
fix(releases): bake the build version into the runner + ship releases…
aarontrowbridge Oct 30, 2026
f8fccee
Merge pull request #2018 from harmoniqs/opencode/2017-runner-version
aarontrowbridge Oct 30, 2026
1762779
fix(notturno): drop root for the vitest steps, name missing CI tools,…
aarontrowbridge Oct 30, 2026
e5d5ba9
feat(whats-new): pinned header/footer frame, collapsible cards, clamp…
aarontrowbridge Oct 30, 2026
bb5a323
test(ui): RED — one-line $$..$$ and \[..\] display math render as KaT…
aarontrowbridge Oct 30, 2026
5377744
test(onboarding): focused connect must hide the welcome animation con…
harmoniqs-amico-agent[bot] Oct 30, 2026
1943e17
fix(ui): one-line $$..$$ and \[..\] display math render as KaTeX in t…
aarontrowbridge Oct 30, 2026
d75fcaf
fix(onboarding): hide welcome animation on focused connect so the for…
harmoniqs-amico-agent[bot] Oct 30, 2026
eaa18b0
test(ops-dir): RED — one amicodeOpsDir, shared dir, legacy ~/.amico f…
aarontrowbridge Oct 30, 2026
fea6abe
test(onboarding): default config path must honour XDG_CONFIG_HOME (ha…
aarontrowbridge Oct 30, 2026
6f3408d
test(app,session-ui): RED — user messages sent mid-run read as queued…
aarontrowbridge Oct 30, 2026
84cfb17
fix(ops-dir): one amicodeOpsDir() default ~/.amico/amicode; legacy ~/…
aarontrowbridge Oct 30, 2026
f0089e5
test(preview): RED — preview-file is session-targeted: pure target pr…
aarontrowbridge Oct 30, 2026
35059ca
fix(onboarding): resolve the default opencode config path via opencod…
aarontrowbridge Oct 30, 2026
2437d10
test(mode-cards): staging dirs must honour XDG_CONFIG_HOME (harmoniqs…
aarontrowbridge Oct 30, 2026
4ca569a
fix(mode-cards): stage agents/modes under opencodeConfigDir() so XDG_…
aarontrowbridge Oct 30, 2026
709d9cc
test(status-bar): RED — persistent stale-engine indicator (#1571)
aarontrowbridge Oct 30, 2026
8d2a2c8
test(handoff): expect normal-session for every intent after onboarding
harmoniqs-amico-agent[bot] Oct 30, 2026
9a13a59
feat(handoff): collapse post-onboarding routing to a single new session
harmoniqs-amico-agent[bot] Oct 30, 2026
21ed25f
feat(status-bar): persistent stale-engine indicator while the adopted…
aarontrowbridge Oct 30, 2026
1e8c235
fix(app,session-ui): messages sent mid-run show a Queued tag in the c…
aarontrowbridge Oct 30, 2026
11e5f5a
test(rail-gate): RED — amico run classifies as amicode work, deleted …
aarontrowbridge Oct 30, 2026
08e15b9
test(session-ui): RED — a tool under a completed assistant message st…
aarontrowbridge Oct 30, 2026
fd85011
fix(session-ui): a tool under a completed assistant message stops spi…
aarontrowbridge Oct 30, 2026
1797d4e
test(app): RED — context tab shows no total-cost row (#627)
aarontrowbridge Oct 30, 2026
1162605
fix(preview): preview-file is session-targeted — host stamps the pane…
aarontrowbridge Oct 30, 2026
b96db5e
fix(app): remove the misleading Total Cost row from the context tab (…
aarontrowbridge Oct 30, 2026
4ea9119
feat(models): model arrivals — catalog diff per connected provider, w…
aarontrowbridge Oct 30, 2026
758d3fa
fix(overlay): rail-gate + brain-ref match 'amico run' (+catalog/vault…
aarontrowbridge Oct 30, 2026
cf799d1
test(preview): RED — per-(session,path) draft store (isolation, resto…
aarontrowbridge Oct 30, 2026
78c848f
test(app): RED — local status re-seed reads per pinned-session direct…
aarontrowbridge Oct 30, 2026
fcc30ad
fix(app): local status re-seed reads /session/status per pinned-sessi…
aarontrowbridge Oct 30, 2026
8c7be5c
fix(preview): per-session Preview with a per-(session,path) draft sto…
aarontrowbridge Oct 30, 2026
8b7e319
test(server-lifecycle): RED — fake_serve.mjs servers are reaped after…
aarontrowbridge Oct 30, 2026
35f8de9
fix(test): reap detached fake_serve.mjs servers after every server li…
aarontrowbridge Oct 30, 2026
b16e194
test(preview): RED — persistence lifecycle simulation (reload, re-ins…
aarontrowbridge Oct 30, 2026
1b5a004
fix(preview): restore plan treats store hydration as an input so a ne…
aarontrowbridge Oct 30, 2026
f8d535c
test(mcp): RED — a removed config-baked MCP server stays gone (#1205)
aarontrowbridge Oct 30, 2026
8e4c685
test(preview,sidebar): RED — Find in sidebar: reveal chain/expansion …
aarontrowbridge Oct 30, 2026
39563e5
fix(mcp): removing a config-baked MCP server (OPENCODE_CONFIG_CONTENT…
aarontrowbridge Oct 30, 2026
e24353f
fix(ops-dir): keep the standalone plugin free of parent-relative impo…
aarontrowbridge Oct 30, 2026
bacfbb8
feat(preview,sidebar): Find in sidebar — Preview tab menu item posts …
aarontrowbridge Oct 30, 2026
4b54826
test(preview): RED — Compile button for .tex/.ltx in the Preview floa…
aarontrowbridge Oct 30, 2026
22d68ec
feat(preview): Compile button in the Preview floating controls for .t…
aarontrowbridge Oct 30, 2026
0644e94
Merge remote-tracking branch 'origin/opencode/2000-arrivals' into ami…
aarontrowbridge Oct 30, 2026
528e940
Merge remote-tracking branch 'origin/opencode/2020-whatsnew-ux' into …
aarontrowbridge Oct 30, 2026
23c5c8a
Merge remote-tracking branch 'origin/opencode/2021-sandbox-root' into…
aarontrowbridge Oct 30, 2026
f516b6c
Merge remote-tracking branch 'origin/opencode/04b-chat' into amico/0.…
aarontrowbridge Oct 30, 2026
acbd77c
Merge remote-tracking branch 'origin/opencode/04b-preview' into amico…
aarontrowbridge Oct 30, 2026
8e997d3
Merge remote-tracking branch 'origin/opencode/04b-onboard' into amico…
aarontrowbridge Oct 30, 2026
655c338
fix(composer): resize handle focus ring, token geometry, i18n, reacti…
aarontrowbridge Oct 30, 2026
8350084
Merge remote-tracking branch 'origin/opencode/04b-ops' into amico/0.4…
aarontrowbridge Oct 30, 2026
96312f5
Merge remote-tracking branch 'origin/night/amicode-1516-2026-10-30' i…
aarontrowbridge Oct 30, 2026
2bcd55c
Merge remote-tracking branch 'origin/opencode/2015-fix' into amico/0.…
aarontrowbridge Oct 30, 2026
479fcce
chore(app-bundle): refresh manifest after the second 0.4.0 batch
aarontrowbridge Oct 30, 2026
853c3d7
ci: boot-smoke on macos-15 (macOS 14 runner images are in brownout an…
aarontrowbridge Oct 30, 2026
005d952
Merge pull request #2023 from harmoniqs/opencode/ci-macos15
aarontrowbridge Oct 30, 2026
b7bd770
Merge remote-tracking branch 'origin/lane/0.4.0' into amico/0.4-int2
aarontrowbridge Oct 30, 2026
adb01ae
Merge pull request #2022 from harmoniqs/amico/0.4-int2
aarontrowbridge Oct 30, 2026
1848a7c
test(amico-run): team-mount attributed writes — refusal, attribution …
harmoniqs-amico-agent[bot] Oct 31, 2026
670ef4b
feat(amico-run): routed note schema check + quarantine annotation, --…
harmoniqs-amico-agent[bot] Oct 31, 2026
1ec2170
feat(amico-run): attributed team-mount writes — refuse without attrib…
harmoniqs-amico-agent[bot] Oct 31, 2026
c30326f
Merge pull request #2028 from harmoniqs/night/amicode-1863-2026-10-31
harmoniqs-amico-agent[bot] Oct 31, 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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,9 @@ jobs:
# linux-x64 + linux-arm64 + darwin-arm64 — every pin machine-gated (spec §5).
# ubuntu-24.04-arm is the free GitHub-hosted arm runner (public repo), and it
# is the ONLY place a linux-arm64 binary is executed.
# macos-14 boot-smoke: the binary is cross-compiled from linux; native
# macos-15 boot-smoke: the binary is cross-compiled from linux; native
# execution on macOS is the safety net.
os: [ubuntu-latest, ubuntu-24.04-arm, macos-14]
os: [ubuntu-latest, ubuntu-24.04-arm, macos-15]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ packages/extension/bin/

# personal local dev config — machine-specific, not for the container
opencode.json
ops/hub/__pycache__/
# python bytecode, anywhere (#1943)
__pycache__/
379 changes: 379 additions & 0 deletions .notturno/gates

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,16 @@ macOS note: the vendored binary is unsigned — if Gatekeeper blocks it:
| Julia solve E2E | `AMICO_TEST_JULIA_PROJECT=$HOME/.amico/julia pnpm --filter amicode run test:slow` | template vet passes, F > 0.999 |
| Live interview E2E | `cd packages/extension && AMICODE_E2E_LIVE=1 npx vitest run test/slow/interview_e2e.test.ts` | tiers A/B/C pass (C needs a provider; flaky on free tier) |
| Full chain (opt-in, ~3 min) | add `AMICODE_E2E_FULLCHAIN=1` | tier D: interview → real solve → F > 0.99 |
| Pre-push gates (night runner) | `./.notturno/gates` | `RESULT: GREEN` — drift gate + `pnpm -r run typecheck` + vitest of the packages the diff touched (vs the merge-base with `NOTTURNO_BASE`, else the nearest `origin/lane/*`/`origin/main`) |

**Overlay rule (CI's app-bundle drift gate):** any edit under `packages/app-bundle/overlay/**`
(add, change, delete, rename) must be followed by
`node packages/app-bundle/scripts/refresh_manifest.mjs` and then
`node packages/app-bundle/scripts/drift_gate.mjs` (expect `PASS`) **before you commit**;
commit the refreshed `packages/app-bundle/manifest.json` with the overlay change.
`refresh_manifest` needs the materialized upstream tree
(`pnpm --filter @amicode/app-bundle run materialize` once). An overlay edit without the
refresh reds CI (2 of night batch 1's red PRs, #1980) and reds `./.notturno/gates`.

## Development facts you need

Expand Down Expand Up @@ -177,6 +187,12 @@ passes, **promote** it → clean `v0.0.3` → Marketplace. The first promotion o
bump (alphas never hit the Marketplace, so the version is still free); re-promoting an
already-published base does.

**After a CLI-changing release, refresh the pinned CLI on every machine** (#1949): the `amico`
shims run the pinned dist (`~/.amico/server/cli/`), not the checkout, so a CLI change has not
shipped on a machine until its pin is refreshed. From that machine's freshly built checkout:
`bash ops/install-cli-pin.sh --dist packages/amico-run/dist` (then `amico doctor` → `pinned_cli`
reports the new sha). See `ops/README.md` § The pinned CLI root.

## Known sharp edges

- `test:slow` without `AMICO_TEST_JULIA_PROJECT` silently skips the Julia gates.
Expand Down
12 changes: 12 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,18 @@ _Avoid_: Explorer (VS Code's native file explorer is separate), Panel (the in-ap
The multi-document file workspace in the side panel. Holds zero or more files as inner tabs, each rendering its content (markdown rendered with a toggle to edit; text/code files in a CodeMirror editor; images and PDFs inline). Files arrive via Sidebar single-click or a Chat file pill and accumulate as tabs — each closeable and drag-reorderable; opening an already-open file focuses its existing tab rather than duplicating it. A breadcrumb bar under each pane's tab strip shows the active file's project-relative path with interactive sibling navigation. Supports recursive split panes via edge-drop: dragging a tab toward a pane's edge divides the view, and each resulting pane keeps its own tab bar, breadcrumb, zoom, and preview/edit toggle. Empty panes auto-collapse; a minimum pane dimension is enforced so splits can't shrink below a usable size. Opens and activates automatically when the first file is selected; shows a placeholder when no file is open. For committed editing, double-click the Sidebar entry to open a native VS Code tab.
_Avoid_: Editor (Preview is a multi-document viewer, not a primary editor — committed editing belongs in a native VS Code tab), File browser (the Sidebar is still the primary project-wide file tree; the breadcrumb is a contextual sibling-navigation aid scoped to the open file, not a second tree)

**Paper Mode**:
A first-class, opt-in session surface for *committed* LaTeX co-editing: the `.tex` editor is primary, Chat docks beneath it, and the compiled PDF sits to the right. Distinct from Preview (which stays a viewer) and from the Work Column layout — Paper Mode is its own layout, not a resize of an existing one. The live editor Draft is the single source of truth; the agent reads it fresh each turn; agent edits arrive as reviewable Pending Hunks rather than direct disk writes; and compilation is manual. Does not depend on the paused wide-mode work.
_Avoid_: Write mode (superseded name), Overleaf mode, wide mode (a separate, paused feature)

**Draft** (Paper Mode):
The live in-editor content of a `.tex` file, versioned by a monotonic Content Revision. In Paper Mode it is the single source of truth: the human's typing and accepted agent edits both land here, saves flush it to disk, and the agent always reads it at its current revision. Supersedes disk and any cached copy as the authority for "current content."
_Avoid_: Buffer (implementation detail), file contents (ambiguous with disk)

**Pending Hunk**:
A proposed agent edit shown as an inline, reviewable diff decoration in the Paper Mode editor, not yet written to the Draft or disk. Accepted (`✓`) hunks apply to the Draft; rejected (`✗`) hunks vanish. A Pending Hunk that overlaps concurrent human edits becomes a Conflict Hunk requiring explicit resolution — nothing lands unchecked. Only accepted hunks emit mutation-ledger receipts and enter the compiled source.
_Avoid_: Suggestion, agent write (in Paper Mode the agent proposes, it does not write disk), pending change

### Developer tooling

**Rebuild (local)**:
Expand Down
107 changes: 107 additions & 0 deletions docs/adr/0037-armonia-trust-boundaries.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
---
status: proposed
date: 2026-10-27
deciders: Aaron Trowbridge
tags: [security, fleet, armonia, tailscale, lab-deployment]
supersedes: []
related: ["#1872", "#1874", "#1879", "#1887", "#1956", "#1957", "spec-20261026-101500-rd-system-v2-1 (A15, A16)", "amicissimo ADR-0007 (C2 signed artifacts)"]
---

# ADR 0037: Armonia trust boundaries (Tailscale transport, sovereign clients, sandboxed agents)

## Context

Armonia deployments put a shared hub next to personal machines. The hub is a lab computer or a Modal container. It runs unattended agents and sits in front of instruments. Students, PIs, and outside collaborators attach laptops to it. The lab wants that system to be secure by design. The people using it want install to be one command and one click.

A capability audit of the hub-client posture (2026-10-27) found:

**Already sound:**
- In hub-client posture the laptop runs no server and opens no port.
- The tunnel is forward-only and has no `-R`.
- The agent tool server runs on the hub.
- Link resolution previews only vault roots.
- Widget iframes are sandboxed.

**Unsafe:**
- **Hub-served code runs on the laptop.** The chat panel's JavaScript is served by the hub from a directory the agents' OS user can write. It runs inside the laptop's VS Code and can send about 40 kinds of bridge message to the extension. Some of those:
- run processes without consent: `dev-tools-rebuild` and `dev-tools-build-vsix` run git and `pnpm install` in any path;
- read the clipboard silently;
- change settings;
- push workspace paths;
- watch arbitrary files;
- send typed credentials to the hub.
- **The frontdoor listened unauthenticated on `0.0.0.0`.** It was reachable from the LAN as well as the tailnet. Fixed by #1957 (loopback by default).
- **Remote access ran over hand-built SSH tunnels on per-machine ports.** Settings Sync carried one machine's port to another and hung its boot (#1956).
- **Agents run as the same OS user as everything else on the hub:** the UI it serves, the gates, the charter.

## Decision

### 1. Tailscale is the transport and the identity bootstrap
- The frontdoor listens on loopback only. It is published to the tailnet with `tailscale serve`, giving HTTPS at `https://<hub>.<tailnet>.ts.net` with Tailscale-issued certificates.
- Nothing is exposed on a LAN or to the public internet. SSH tunnels survive only as a fallback.
- The frontdoor maps the verified `Tailscale-User-Login` / `Tailscale-User-Name` headers that `serve` injects to #1874's person principal. These headers are trusted only on the loopback hop from `tailscaled`.
- The principal model stays transport-independent: an OIDC login can produce the same principal later.
- **Tailnet policy encodes the boundary**, shipped as a reviewed snippet:
- `tag:armonia-hub` accepts traffic from lab members;
- `tag:armonia-site` and `tag:lab-instrument` accept traffic only from the hub;
- **no rule permits connections to personal devices.**
- Execution sites (lab PCs, Modal sandboxes, cluster login nodes) join with short-lived, pre-approved tagged auth keys. They are identities by tag, never by person.
- **Tailscale is transport; Armonia is authorization.** Being reachable grants nothing. Membership, campaigns, charters, and Strumento decide.
- Labs that cannot use the hosted control plane run **Headscale** (the Enterprise profile), which gives the same model. Where neither is permitted, the fallback is plain WireGuard managed by `armonia init`.

### 2. The client is sovereign: the hub sends data, never code
- In hub-client posture, the panel loads its UI from the **installed, signed extension**, not from the hub.
- If a deployment opts into hub-served UI, the client loads it only when its bundle signature verifies against the pinned root set (the amicissimo C2 channel). An agent editing the hub's dist then changes nothing on any laptop.
- **The bridge is a capability table.** Every message kind is classed per posture:
- **view:** no side effects;
- **consented:** a native VS Code prompt naming the hub and the action, optionally remembered per hub;
- **forbidden in hub-client posture:** `dev-tools-*`, `data-storage-update`, `skill-providers-autodiscover`/`add`, arbitrary `watch-files`.
- **Clipboard** reads happen only from a real user paste in the webview. There is no read-on-request path.
- **Share nothing by default.** Workspace paths are not pushed to the hub. Opening, watching, and previewing local files is limited to folders the user has explicitly shared with that hub, listed and revocable in a "Shared with <hub>" view.
- **Personal credentials stay on the laptop.** Hub-side features use deployment or service credentials. A form that would store a user's key on a hub says so before submit.
- **The laptop keeps its own audit log** of every request the hub made and how it was answered.

### 3. Agents are sandboxed apart from what users run
- On the hub, agents run as a separate OS user (or in a container, gVisor, or Modal Sandbox per #1879).
- That user cannot write:
- the served UI;
- the gate scripts;
- the charter;
- the deployment config;
- other principals' worktrees.
- Credentials reachable by agents are short-lived and bound to a principal (A15 mint records; Bedrock via identity tokens per #1887, not keys).

### 4. Install is one command and one click
- **Hub:** `armonia init --lab "<name>"`. It runs these steps:
1. host checks;
2. creates the agent user and sandbox runtime;
3. joins the tailnet and tags the machine;
4. emits the ACL snippet (or applies it through the API);
5. mints the lab starter vault and signs the conservative charter;
6. installs services that update from the signed channel;
7. prints a join link and QR code.
- **Laptop:** install the extension, then open the join link.
- The Tailscale login, via the institution's SSO, admits the device.
- MagicDNS locates the hub.
- A "share folders?" screen opens with nothing selected.
- No ports, keys, or settings files are involved.
- **Instrument or site machine:** `armonia site join --kind lab` with a one-time tagged key. Outbound only.
- **`armonia doctor`** reports tailnet membership, identity, hub reachability, version skew, signatures, and charter state. Each result is a named outcome with its remedy.

## Consequences

- Port drift, tunnel daemons, and the `fleet.repair` port migration stop being necessary once clients use the MagicDNS URL. #1956's machine-scoped settings remain, as defense in depth.
- A compromised hub, or an agent on it, can no longer run code, read the clipboard, or browse files on a laptop. The worst case reduces to what the user shared or explicitly consented to.
- Tailscale becomes a deployment dependency for the Lab and Harmoniqs profiles. The Open profile (local only) is unaffected. Headscale or WireGuard cover labs that cannot use it.
- The capability table and signed UI bundle are new extension work. Hub-served UI stops being the default update path for laptops: UI updates ride the signed extension or a signed bundle.

## Slices

1. **#1957** frontdoor loopback bind (done and live).
2. `tailscale serve` publishing plus identity-header principal mapping in the frontdoor. Clients use the MagicDNS URL. The tunnel becomes a fallback.
3. The bridge capability table: forbid or consent per posture, clipboard on paste only, `open-file`/`watch-files` scoped to shared folders, no automatic workspace push.
4. The panel loads UI from the extension in hub-client posture; signed hub bundle opt-in.
5. Separate agent OS user on the hub with read-only served UI, gates, and charter (with #1879).
6. Tailnet ACL/grants snippet plus tagged site auth keys; `armonia site join`.
7. `armonia init` and `armonia doctor`.
8. The "Shared with <hub>" view and the laptop-side audit log.
27 changes: 27 additions & 0 deletions docs/adr/0038-paper-mode-snapshot-base-3way-merge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# ADR 0038 — Paper Mode: live-draft source of truth and snapshot-base 3-way merge for AI/human co-editing

Status: proposed (2026-09-28)

Tracking: harmoniqs/amicode#1620 · Glossary: `CONTEXT.md` (Paper Mode, Draft, Pending Hunk)

Paper Mode is a new opt-in session surface for *committed* LaTeX writing (editor primary, Chat docked beneath, PDF right; distinct from Preview, which stays a viewer, and independent of the paused wide-mode work). It exists because Amicode has no safe surface for AI and human to co-edit the same `.tex`: today the agent reads a stale disk/cache snapshot (edits it "saw" go missing from its output), agent writes bypass the editor buffer (the human must reopen the file), concurrent edits clobber silently, and there is no way to review an agent change before it lands or to control when compilation runs.

The decision is fourfold, and each part is hard to reverse because tooling, UI, and the mutation boundary all bind to it:

1. **The live editor Draft is the single source of truth**, versioned by a monotonic Content Revision (extending the content-revision rule ADR-0013 already mandates). In Paper Mode the agent's Read/Edit tools read the Draft *at its current revision every turn* — never disk, never a cache. "The agent always sees my edits" becomes true by construction and checkable, because the revision it read is stamped. This supersedes the coarse revert-based fix in #1422, which only reverts a *clean* buffer and blocks while the human is typing — insufficient for real co-editing.

2. **Agent edits propose to a review layer; they do not write disk.** An agent Edit/Write in Paper Mode produces Pending Hunks — inline diff decorations in the editor — leaving the Draft and disk unchanged until the human accepts. The human's own typing writes the Draft as normal and is always authoritative. Un-accepted agent text is therefore never in the file, which is what makes "the AI never interferes," "human always wins," and "nothing compiles behind my back" all fall out of one mechanism.

3. **Concurrent edits reconcile via a snapshot-base 3-way merge.** The Content Revision the agent read at edit-start is captured as the merge base. At apply time we 3-way merge (base → human-edited Draft, base → agent hunks): non-overlapping regions land as Pending Hunks; regions both parties touched become **Conflict Hunks** the human must resolve. Conflicts are **never auto-resolved** — the human explicitly wanted to be able to check whether their text was removed. CM6's `@codemirror/merge` (already a dependency, already used in `editable-diff-view.tsx`) supplies the merge/decoration primitive.

4. **Compilation is manual, on the accepted Draft.** It fires only on an explicit Compile action and compiles the Draft as it stands — Pending (un-accepted) Hunks are excluded because they are not yet in the file. Accepted hunks emit ADR-0017 mutation-ledger receipts (appearing in Files Changed with real provenance); pending and rejected hunks emit nothing.

## Considered options

- **Agent-writes-disk with a revert-style overlay (today's #1422 model), rejected.** Reachable from current code, but the agent's text *is* in the file before the human approves, so "human always wins," "review before it lands," and "compile only on approve" all become muddy special cases rather than consequences of the model. The dirty-buffer guard also silently blocks agent edits whenever the human is typing, which is the opposite of collaboration.
- **CRDT live merge (Yjs), rejected for now.** A shared mergeable document gives Google-Docs-style seamlessness, but it is a heavy, hard-to-reverse architectural commitment, and per-hunk human review sits *on top* of it anyway. The snapshot-base 3-way merge delivers the reviewed-collaboration requirement with far less machinery; revisit only if real-time multi-human co-presence becomes a requirement.
- **Promote Preview into a primary editor, rejected.** Reverses ADR-0013 and the glossary's deliberate "Preview = viewer" boundary and tangles viewer and editor responsibilities in one component. Paper Mode is a separate bounded surface instead.

## Consequences

The agent's Edit/Write tools gain a Paper-Mode-specific behavior (propose to the review layer instead of writing disk), which must fail closed — an agent edit that cannot be expressed as a Pending Hunk is surfaced, not silently written. The Draft/revision authority and the review/merge UI are new machinery, but both build on primitives that already exist (ADR-0013 content revisions, ADR-0017 receipts, `@codemirror/merge`). Paper Mode deliberately does **not** depend on the paused wide-mode work (#1434) and is built as its own layout. LaTeX language intelligence (#1513), SyncTeX (#1432/#1514), an outline navigator, and in-editor search (#1430) are out of scope — they dock into Paper Mode later as independent slices. Revisit this decision only if Amicode adopts real-time multi-human collaboration, at which point option 2 (CRDT) is the successor.
25 changes: 25 additions & 0 deletions docs/releases/0.3.10.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
version: 0.3.10
date: 2026-10-27
highlights:
- title: Sticky widgets
body: >-
Opt a widget into "sticky" and it docks as a compact strip when you
scroll it out of view, so a live readout stays in sight while the
conversation moves on.
- title: Step-limited subagents report what they finished
body: >-
A subagent that runs out of steps now hands back an EXHAUSTED receipt —
what it finished and what is left — instead of stopping silently.
- title: Specs that file their own issues
body: >-
"amico spec slices" turns a spec's plan rows into linked GitHub issues,
and "amico census" gives a quick read of open work with named gaps and a
72-hour stall tripwire.
- title: Safer hub deploys
body: >-
The hub now deploys a lane build with an atomic switch, pinned
provenance, and one-step rollback.
links:
notes: https://github.com/harmoniqs/amicode/releases/tag/v0.3.10
---
Loading
Loading