Skip to content

0.4.0 backlog integration: 26 PRs + What's-new (#2001) + hermetic night gates (#2009) - #2011

Merged
aarontrowbridge merged 114 commits into
lane/0.4.0from
amico/0.4-integrate
Oct 29, 2026
Merged

aarontrowbridge merged 114 commits into
lane/0.4.0from
amico/0.4-integrate

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

This folds the reviewed backlog into lane/0.4.0. Every PR head was merged as-is, so those PRs are marked merged automatically once this lands. Critic follow-up fixes are separate commits on top.

Docs and skills: #1846, #1893, #1972, #1899, #2003, #1728, #1744, #1859, #1529, #1530, #1832, #1225, #1631 (ADR renumbered to 0038), #1706
Features: #1662, #1678, #1993, #1720, #1641, #1633, #1749, #1652 (plus fast-uri, zod, minimatch and dompurify pins; the engine MCP SDK stays on 1.29.0 for now → #2010)
Night PRs (fixed): #2005, #1973, #1974, #1976, #1977, #1978
New: #2001 What's-new page, #2007 hermetic sandbox gates (#2009). The version is now 0.4.0-lane.1.

The only real conflict was chat_panel.ts: both sides add message kinds to the allow-lists, so both were kept. All manifest.json conflicts were resolved by refresh_manifest.

Director gates on the integrated tree:

  • typecheck, overlay typecheck, engine typecheck and drift: 0.
  • Extension suite: 5715 passed, 5 failed. The 5 (chat_bridge, sidebar_view, skill_drift_lint) also fail on a clean lane checkout on this machine and skip on CI.

Deferred: #1553, #1557, #1852, #1226, #1548, #1712, #1701/#1711/#1719.
Waiting on Aaron: #1861.

Jackson Turner and others added 30 commits September 15, 2026 16:43
- SETUP.md: end-to-end walkthrough for creating the Slack app,
  installing it, wiring the MCP server, and troubleshooting
- slack-manifest.json: ready-to-paste Slack app manifest with
  user + bot scopes (search:read user-only)

Covers the pitfalls we hit: bot_user required for OAuth install,
search:read invalid as a bot scope, redirect URI registration for
amico slack login, and MCP server config in opencode.json.
…P-list model

The amicode tail of the D6 consumer sweep (amico-strategy was #1317's
half; armonissa #105/PR #106 carries the vault half). The spec-reviewer's
conflict criterion now checks the live direction surface (PI-owned INTENT
+ conventions); the analyze skill triggers on 'direction needs informing'
with the D6 routing inline, and its Strategy Suggestions output becomes
Direction Suggestions reading the strategy brief. Zero live P-list
references remain in amicode skills.
…measurement and sensing/metrology

'Seeded' means something now (plan-20260920 step 10):

- The pack schema gains the domain keys (additive, optional at the schema
  layer so the flagship stays valid): curricula, payload_schemas,
  verification (contract reference + claim-class bindings),
  instruments (with the coverage scope bound), benchmarks, first_task
  (with the shakedown/substrate level ladder). scores minItems relaxed
  deliberately: a seeded domain pack legitimately carries no composed
  scores yet — the quantum-era single-pack contract, not the general
  one (test updated to the new contract, reason inline).
- The pack lint: schema validation PLUS reference resolution (dangling
  refs = named findings) PLUS the seeded-key check — the flagship reads
  FORMALIZED (missing first_task), exactly the grandfathered design,
  and its snapshot-layout skill paths surface as the known real finding
  the step-14 formalization must reconcile (baked into the test so the
  reconciliation cannot land silently).
- The two seeded packs, each with a verification contract (tier
  assignments, claim-class bindings), the payloads doc, the first-task
  declaration (shakedown-marked, NOT yet run — exercised is a run
  state, never a manifest state), a curriculum skeleton authored to be
  filled from measured practice, and corrector integrity manifests
  (load-time shas, the #369 pattern — found by running the loader).

Verified: pack_lint 4/4 (EE + sensing seeded; flagship formalized with
the known finding); scores suite 323/323; schema 284/284; packaging +
gate_packs 65 passed. Loader loads all three packs clean (errors: []).

Part of amicode #1328 (plan-20260920-general-research-engine step 10).
…GY.md model

The D6 sweep's enumeration counted the spec-reviewer prompt and the
analyze skill as the last amicode-side dead-model refs, but
amico-schema-check's escalation step still told agents to append to
STRATEGY `## Agent Suggestions` (the line predates the sweep — it rode
in with the library-absorb chore). Same D6 routing as the analyze
rewrite: agents never edit the direction surface; the finding routes to
the amicissimo proposals surface.
…editing

Records the Paper Mode design (epic #1620): a new committed-editing surface
with the live Draft as source of truth, agent edits proposed as reviewable
Pending Hunks, snapshot-base 3-way merge, per-hunk accept/reject with explicit
conflict resolution, manual gated compile, and ADR-0017 ledger provenance for
accepted hunks. Adds Paper Mode / Draft / Pending Hunk glossary terms.

Refs #1620
A user-invoked skill that shapes every response to lead with the answer/next
action, cut preamble and closers, number multi-step work, cap visible lists,
give concrete time estimates, and state errors matter-of-factly. Persists for
the session; toggled off with "normal mode"/"stop concise". Never auto-triggers.

Adapted (MIT) from ayghri/i-have-adhd, retuned for Amico's research-copilot
context and gate/verification/persona invariants.

Supersedes the response-presentation engine epic (#1330) for the 'toggle
concise on/off' need.
A little icon-only toggle (the 'collapse' glyph) beside the report-bug button
that turns the concise skill on/off by sending its own toggle phrases
('concise mode' / 'normal mode'). ON state uses the accent selected-state
tokens (--accent-fill-soft + --accent-edge); aria-pressed + a state-dependent
label carry the meaning so color isn't the only signal. Both themes, focus
ring and tokens inherited from IconButtonV2.

Lightweight by design — drives the skill, not a persisted engine setting.
Part of the concise-mode feature (with the skill in this branch).
Replace the ambiguous collapse-icon button with a real switch (Concise). It no
longer sends its own message: flipping it sets a persistent per-session flag,
and while on, a concise directive is appended to the outgoing prose message at
submit time (normal turns only — shell/slash unaffected), so the response comes
back concise. User text and history stay unmodified.

- concise-mode-toggle.tsx: switch (checked/onChange) + label, replaces the icon button
- prompt-input-v2: controller exposes concise {on,set}; passed into createPromptSubmit
- submit.ts: PromptSubmitInput.concise; conciseDraftPrompt appends directive to the sent draft

App typecheck clean; materialize manifest refreshed.
…isible text

The concise switch appended a bracketed directive to the sent message text,
which showed in the user's bubble. Move it to the message's per-turn `system`
instruction instead: it reaches the model for that turn but is not rendered as
a visible part. Threads system through FollowupDraft, the send call, the
optimistic message, and the server-compat prompt bridge (forwarded to
promptAsync's system). User text stays clean.

App typecheck clean.
The 'Concise' switch label needs no hover description; remove the TooltipV2
wrapper.
Preview tabs were lost on webview reload: the active file lived in the
non-persisted ephemeral store and the full open-tab set only in
SessionPreviewTab's component-local workspace signal. Move both into the
persisted per-session SessionView store (previewActive + previewPaths),
reusing the serverGlobal machinery that already survives reload.

- layout.tsx: SessionView gains previewActive/previewPaths; previewFile
  getter/setter repointed from ephemeral -> persisted store; drop the
  ephemeral sessionPreviewFile.
- session-preview-tab.tsx: restore the workspace from the persisted list
  on mount (before the previewFile re-focus; idempotent), mirror open/close
  back up (gated on restore to avoid clobbering pre-hydration).
- session-side-panel.tsx: wire openPaths/onOpenedPathsChange at both sites.
- session-preview-tree.test.ts: open-paths round-trip invariants.

Split-pane layout stays out of scope (#981). Implements the #1398 wiring in
the persisted store so it covers reload as well as remount.
The persisted layout store hydrates asynchronously. The first restore ran
before hydration (openPaths() still empty), the previewFile effect opened the
active file, restore then bailed on openedPaths().length>0, and the up-sync
wrote the shrunk [active] list back — clobbering the persisted list down to one
tab. Only the active file came back on reload.

Gate reconciliation on the layout store's `ready` signal (threaded in as
`hydrated`): hold both restore and up-sync until hydration completes, then MERGE
the persisted list with anything already open (union, persisted order) and keep
the active tab focused. Extract the merge into a pure `reconcilePreviewPaths`
helper and test it — the [a,b,c] vs open [c] -> [a,b,c] case is the regression.
…dits

Regenerate the overlay content hashes (refresh_manifest.mjs) for the four
files touched by this branch so the CI drift gate passes. Mechanical: the
committed manifest must match the overlay's hashes.
… tab-switch)

Replace the fragile reactive open-on-previewFile effect (the reopen/shift
engine, which re-fired on every #1288 re-instantiation) with a single
signature-guarded reactive restore that opens the persisted set idempotently —
once per distinct value — so it survives async hydration and late session-key
resolution and never loops or re-opens on a tab switch.

- Delete the on(previewFile) open effect; live opens arrive via the mount
  message listener; a first-open-that-mounts is folded into the restore target
  (previewPaths ∪ active) with one deduped post-merge write to persist it.
- Close reassigns previewActive to a remaining tab or null, so a closed file is
  never the active pointer that gets re-opened.
- Extract the restore/close decisions into pure, tested helpers
  (previewRestoreTarget / previewMissingPaths / previewActiveAfterClose) that
  the component uses — the '1-of-N', reopen, net-new and close-reassign
  regressions are now unit-tested (18 pass).
- Strip all debug diagnostics; refresh app-bundle manifest.

Design of record + breaking-point analysis: #1640. Supersedes #1398.
Remove the temporary [PVKEY]/[PVDBG] console probes used to trace the
cross-session bleed. Behavior unchanged; refresh app-bundle manifest.

Known limitation (tracked separately): opening a file in one session's
Preview can bleed into another session's Preview, because the prewarmer
keeps backgrounded session views alive and the preview-file bridge message
is an un-targeted window broadcast — every live SessionPreviewTab handles
it. Not catastrophic; needs a foreground-session gate / session-targeted
message to fix properly.
The composer wrapper becomes a named query container (.amicode-composer-cq);
the concise toggle is wrapped and hidden via @container (max-width: 26rem) so
it disappears when the composer itself is narrow — window narrowed OR side
panel/split shrinks it — keeping the control row from crowding Send. Default
(wide) visible; container-query-keyed so it adapts to layout, not just viewport.
…ore (#1651)

The switch was a createSignal in the composer controller (per-instance
state), so the new-chat -> session handoff and the Changes-tab remount
reset it to off. Hold it in a module-level in-memory store keyed per
session; a new chat writes under its draft key, promoted to the session
key at session creation beside the agent/model promotion.

Closes #1651
…rged client shards (#1658)

Shard merges are #1302's by-hand flow (shard-watch is detection-only, #1306),
and the hand-run re-home of the 2026-10-01 macbook shard doubled path
segments on two home prefixes — directories that exist nowhere, sessions
invisible to every panel listing. The re-home is now tooling, not SQL by
hand: one explicit prefix substitution (client home → hub home; doubling
is structurally impossible — the candidate is exactly hubHome +
from.slice(clientHome.length)), validated to exist on the hub before
writing, falling back to the shard's original directory when it does not
(invisible-but-truthful beats invisible-and-wrong). Dry-run by default;
--apply performs per-id UPDATEs and re-reads the touched rows to verify.

planRehome is a pure function of (rows, clientHome, hubHome, exists) with
the real doubled paths as regression fixtures; the verb's impure edges
(bridge, fs, env) are injectable, mirroring shard_watch.ts.

Verified: 9/9 new tests; typecheck clean; full amico-run suite 1772
passed with one pre-existing month-boundary flake in sessions_verb
(expected 2026-09 vs 2026-10, already under repair on the
sessions-index-month-boundary branch, passes on main); dry-run + apply on
a copy of the real canonical DB seeded with a fresh shard re-homed every
row to a real existing hub path with verification true.
…lls-integrity findings (#1677)

The REMEMBER-family verb the pasqal-campaign lesson demanded: user corrections
observed in chat sessions used to evaporate; now they file. Deterministic
marker pre-filter (recall) over READ-ONLY chat-DB gathers → the ONE jev client
(precision: correction-noul + kind + severity, three questions one call,
receipts, fail-open) → clusters file skill-finding/skill-proposal notes at
status: open in the personal vault per the skills-integrity TEMPLATE shapes,
cross-pass dedup by UPDATE appends; P0/P1 ping via the amico-slack contract;
dry-run by default; watermark; a dashboards/user-corrections.md digest.
…#1677)

Tuned against the live 30-day acceptance run (the issue's named tuning loop):
- recall markers strengthened (interrogative 'why are we', prescriptive 'we
  should', 'wtf', 'are we not', 'way too', display-drift 'not showing/in
  line') — the first pass missed the pasqal campaign's corrections entirely
- filing gate recalibrated 0.90 → 0.80: jev reads true corrections as
  behavior-gap with noul ≥ 0.94 but kind-confidence in the 0.80–0.90 band;
  the noul floor (≥ 0.5) is the corroboration that keeps 0.80 honest
- --max-jev default 200 → 400 (cost guard; the wider recall needs headroom)
- admitted_detail in the result JSON — the dry-run's tuning surface
- sqlite bridge maxBuffer 1MB → 128MB: the fleet-scale windowed gather blew
  node's default with ENOBUFS

Acceptance (live dry-run, 30d window): 1220 scanned → 151 candidates → 17
admitted in 9 clusters, the pasqal campaign corrections included as P1
behavior-gap; nothing filed (dry-run).
The pre-merge reviewer pass (never the implementer) found the vault-write
layer too trusting; all findings fixed and pinned:

IMPORTANT:
- YAML scalar escaping for untrusted user text in evidence lines — a bare
  quote could end the scalar and inject frontmatter keys (file integrity +
  the dedup matcher both read it); backslash+quote escaped, whitespace collapsed
- collision-safe finding filenames — the pass-scoped seq could regenerate a
  triaged closed finding's exact name and silently overwrite it; bump until free
- atomic vault writes (tmp+rename, the house pattern) on every finding/UPDATE/
  digest path — a crash mid-write must never truncate the original claim

MINOR:
- findExistingScanFinding scans the frontmatter BLOCK only (body quotes could
  cross-match a pasted finding-like message)
- cluster severity = worst occurrence (a P2 cluster escalating to P1/P0 now
  files — and pings — at its true severity)
- true unverified count in JSON + digest overflow line (was silently capped)
- admission gated on a fully-ran pass (partial-failure verdicts no longer
  overstate the dry-run output)
- jev circuit breaker: 5 consecutive transport failures degrade the pass
  (a hanging endpoint no longer costs --max-jev × 10s of serial waiting)
- stale filingAdmits docstring (0.90 → 0.80), merged fs imports, dirname

Test gaps pinned: chmod-444 read-only AC, hostile-text YAML escaping,
closed-finding collision path, watermark-not-advanced on fail-open,
escalation ping. Suite: 37 corrections tests, package 1866 passed.
…esentation + QILC/Piccolissimo display sets (#1705)

The papers' classic forms (2305.03261, 2508.19075): continuous core,
direct collocation, indirect/GRAPE contrast, free-time/min-time with the
floor-margin lesson, robustness ensembles. Intonatissimo gains the QILC
form (measurement model, matching NLP, ILC correction) and its required
display set (measurement models, pulse+correction plots per iteration,
convergence). Piccolissimo gains the spline-NLP form and its display set.
Lint: three cards, zero findings (pre-existing main failures unrelated).
… constraints, solvers in classic form, full disclosure (#1705)

Every name verified against package source (MagnusGL4/Adapt4/Chebyshev
cores, Daleckii-Krein, split-operator Strang, Padé-13 internal step
evaluation); forms follow the papers. The completeness rule: a stated
problem lets the reader reconstruct the NLP — trajectory type, integrator
core, every objective term with weight, every constraint with bound,
solver.
…the package source is the truth about what runs (#1705)
…from formulation.toml, the papers' register, provenance rules, receipt meanings (#1705)
…m Highlight painting, focus routing + hijack guard
…pilation package (#1726)

The card deferred the schema-v3 compiler stack fields twice ('not present
yet… added when those phases land'). That phase landed 2026-10-04 with the
compilation package's PRD #50 completion: system_hash (SHA-256 over the
device composite, loud mismatch on load), VerificationRecord (complete or
absent, trust ranking), hash/device-aware query with superseded-dropping
rank, provenance-gated bundled library.

The card now states the three-root truth: the fields' ground truth is the
compilation package's pulse-library module + the legato-dev skill; this
card's own vault-catalog + CLI surface remains Phase 0 (platform+gate
retrieval) with the CLI adoption tracked at harmoniqs/amicissimo#497; the
versioning/lineage conventions are unchanged. Sessions needing hash-exact
or verification-aware lookup are pointed at the compilation package's
query API until the CLI follow-up lands.

Finding: personal-vault skills-integrity finding-20261007-amico-catalog-phase0.
Lint: zero new findings against the main baseline.
…into amico/0.4-docs

# Conflicts:
#	packages/extension/skills/research/SKILL.md
…so 'Re-read it' refers to CHECKOUTS.md (critic follow-up for #1893)
…y bullet and the H25 6–7e-4 benefit numbers #1972 marks upper-tail; point at Production guidance (critic follow-up for #1899)
…, matching the arJev manifest (critic follow-up for #1859)
…amico/0.4-docs

# Conflicts:
#	packages/extension/skills/develop/SKILL.md
…` flow (app creds via AMICODE_SLACK_CLIENT_ID/SECRET or ~/.amico/slack-app.json, token to ~/.amico/slack.json, MCP auto-starts); manifest user scopes gain im:write + mpim:write to match slack_verb.ts USER_SCOPES (critic follow-up for #1225)
…36 reserved for #1861, 0037 exists) (critic follow-up for #1631)
…to amico/0.4-docs

# Conflicts:
#	packages/extension/skills/intonatissimo/SKILL.md
…ed ': ' breaks yaml@2.9.1) and drop the pi-report-findings scenario (the report lane is unmerged) (critic follow-up for #1706)
…integrate

# Conflicts:
#	packages/app-bundle/manifest.json
…ico/0.4-integrate

# Conflicts:
#	packages/app-bundle/manifest.json
#	packages/extension/src/chat_panel.ts
@coderabbitai

coderabbitai Bot commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e01cefd1-d27d-4cae-882f-5b5f55366023

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@aarontrowbridge
aarontrowbridge merged commit 4c44931 into lane/0.4.0 Oct 29, 2026
12 checks passed
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