chore(fleet): re-home the profile/skill tree to the armonissima vault; multi-root skill validation - #258
Merged
Merged
Conversation
…; multi-root skill validation The internal content half of the amico-plugin dissolution (the public half is PR #255): profiles/, gates/, and the internal skill library now live in the armonissima team vault (pushed as armonissima@3d78491); mount presence is the eligibility proof, same pattern as the retired plugin checkout. profile_verb: the shipped fleet presets compose BOTH tiers (researcher names amico-vault + hypothesis-review — public), and a single --skills-dir cannot name two roots. --skills-dir is now REPEATABLE; skill existence/surface is a union check across roots (first-hit wins, matching the library resolver); defaults = the vault skills dir + the extension's in-repo public library when resolvable from the installed bundle layout (bin/dist -> ../../skills). This lets the 12 long-skipped shipped-preset tests RUN for the first time (the old default root never existed on main) — they pass. Canonicity sweep: the mounts resolver + mount_store were ported from the Claude session-start hook; with the hook retired, the TS ports are the source of truth and the fixtures are the spec. profile_verb's lint-port comments re-point at the vault tree; lens_registry's deviation note resolves to "the design"; verbs/ledger_dispatch comments updated. Verified: amico-run suite 952 passed / 0 skipped (was 940 + 12 skips); extension suite 868 passed; typecheck clean.
jeonghun-jj-lee
added a commit
that referenced
this pull request
Aug 7, 2026
* feat(bug-report): orchestrator create/arm/open + bridge allowlist & lifecycle kinds (amicode#250)
* test(bug-report): lifecycle — archive-on-filed, abort+delete on abandon (amicode#250)
* test(bug-report): single-open invariant — sequential reveal + concurrent join (amicode#250)
* test(bug-report): failure cleanup, unknown-id drops, terminal latches (amicode#250)
* feat(bug-report): boot-param gate, relay lanes, postToApp down-lane, sink wiring (amicode#250)
* test(bug-report): origin session is read-only provenance across every path (amicode#250)
* feat(bug-report): register amicode.reportBug, wire the manager + boot-param gate at every session prep (amicode#250)
* refactor(bug-report): one scoped collection URL, typed down-message, bounded lifecycle logging (amicode#250)
* fix(extension): bug-report-poke up-kind — re-post open-bug-report on app boot (amicode#249 QA)
The app pokes once per frame boot with the flag on; the manager answers
with a fresh open-bug-report when a bug session is live (joining an
in-flight create, never double-creating), silence otherwise. Also: [bug]
lifecycle log lines for the open/poke paths — the preview debugging had
to spelunk the db for what one log line would have said.
* fix(extension): zombie guard — reap orphaned bug sessions on close (amicode#249 QA)
The sync watch can surface a bug session orphaned by a dead extension
host. Closing that dock posted bug-report-closed for an id the new manager
never knew; dropping it left an immortal session the watch resurrected
forever. Unknown-id closes now read the session: bug_report metadata + not
archived → abort + hard delete; archived (filed) sessions and genuinely
foreign ids are never touched.
* feat(extension): pin the bug session's model from the button's live selection (amicode#249 QA)
The report-a-bug bridge command may now carry the composer's current
{providerID, modelID, variant}; the manager pins it on the arming command
(model: '<provider>/<model>') so the bug session runs the model the user
was actually using — subscription provider included (Zen never silently
becomes Go). Shape-validated at the bridge, bounded, stripped when
malformed; absent falls back to the server default.
* fix(extension): defensive postToApp + ghost-session guard (amicode#249 QA)
Two robustness gaps hit in the live preview dogfood:
- postToApp's retry timer threw 'Webview is disposed' when the chat
panel closed between the two posts (window closing mid-flow). The
down-lane now wraps both posts in try/catch — a lost open heals via
the app's boot poke + sync watch.
- A session closed while the bridge was down (disposed webview, dead
window) left manager.current pinned to a ghost: every later button
click would reveal nothing and never create. The reveal path now
probes session liveness (GET, 404-tolerant) before posting —
a dead memory clears itself and falls through to a fresh create.
* feat(extension): hardcode the bug session to opencode/deepseek-v4-pro (amicode#249)
Cheap, fast, no OpenAI/Claude — the report-a-bug command now always
pins the arm to deepseek-v4-pro, bypassing the server default.
* chore: bundle report-a-bug skill with the extension (amicode#249)
Aaron moved all skills into the extension (public) and armonissima
(internal) on main (PRs #258, #255). Our branch still carries the old
default roots, but this copy makes the skill available when the PR
merges — the extension's bundled ./skills dir is the first public root
on main.
* docs(skills): clarify the confirm gate's text-field interaction (amicode#249)
The 'Edit with notes' option requires the user to select it AND type
modifications in the 'Type your own answer' free-text field — the
question tool always appends this field as the last radio option.
Previous wording implied a separate textbox that doesn't exist.
* docs(skills): free-form confirm — textbox always visible, no radio gate (amicode#249)
The confirm step now asks via a plain free-form text question with no
pre-defined options, so the 'Type your own answer' field IS the only
input — always visible. Reply with 'file it', 'edit: <changes>', or
'veto' — the skill parses the answer.
* docs(skills): make the confirm gate match the intake question format exactly (amicode#249)
The confirm step now uses the same 'Ask **one** question, via the `question`
tool' pattern as step 5, which the model follows reliably. Explicit 'Never
ask follow-ups' header prevents the model from inventing repo/comment
questions before the gate.
* feat(app+skill): debug borders for the answer area + comment-on-existing pathway (amicode#249)
- Red/blue debug borders around the answer wrapper + question content —
proves the area renders; textarea is inside.
- The confirm gate gains a fourth option: 'comment: <repo>#<issue> <text>'
posts a clarifying comment to an existing issue via gh issue comment,
prints the sentinel, ends the session.
* fix: remove stray skills/SKILL.md
* bug reporter: deny question tool, free-form dialogue only
- createSession passes permission: [{question, deny, *}] — the question
tool is invisible to the model (hard guardrail, same as CLI non-interactive).
- Skill step 2 (capture) and step 6 (confirm gate): 'via the question tool'
replaced with 'output as plain text, wait for the user's reply.'
- Explicit 'Do not use the question tool' directive in both steps.
- Option A: at least one content question, accepts user follow-ups.
* skill: sentinel prints after ANY GitHub action, explicit format for comment path
- Sentinel is a lifecycle signal, not a semantic bug-classification
judgment. Prints after issue created, comment posted, OR chore filed.
- Comment path: explicit AMICODE_BUG_FILED format with full issue URL
(construct from repo + number).
- Removed 'actual filing' language that made the model skip the sentinel
for comments.
- Invariants updated: 'any successful GitHub action' replaces 'actual
filing'.
* feat: bug report uses the server's default model (no hardcoded model)
- armSession omits the model field entirely — the server uses whatever
model the user has configured globally (their defaultModel or the
server's built-in default).
- Removed findOriginModel (session.model isn't set by the model picker,
only at session create — so it's always empty for picker-users).
- No amicode.bugReportModel setting (unnecessary complexity).
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.
Re-created from #256, which GitHub auto-closed when #255's merge deleted the shared base branch. Same branch, same content (39ad5ff); #255 is now in main, so this diff is the Phase 2 half only.
What
The internal-content half of the amico-plugin dissolution.
profiles/,gates/, and the 28 internal skills now live in the armonissima team vault (pushed asarmonissima@3d78491); mount presence is the eligibility proof — the same pattern as the retired plugin checkout, carried by the vault sync instead of a git clone.The real change: multi-root skill validation in
profile_verbThe shipped fleet presets compose both skill tiers — e.g.
researcherstagesamico-vault+hypothesis-review(public) alongside internal skills. A single--skills-dircannot name two roots, and the old default (~/harmoniqs/amico-plugin/profiles) never existed onmain, which is why the 12 shipped-preset tests were permanent skips.--skills-diris now repeatable; any explicit flag(s) replace the defaults.surface:is a union check across roots, first-hit wins (matching the library resolver).skills/+ the extension's in-repo public library when resolvable from the installed bundle layout (bin/dist/amico.js→../../skills); self-disables in dev/CI.Result: the 12 preset tests run for the first time and pass — amico-run suite is 952 passed / 0 skipped (was 940 + 12 skips).
Canonicity sweep
The mounts resolver (
amico-run/src/mounts.ts) andmount_store.tswere ported from the Claudesession-starthook with a "parity oracle" relationship. The hook is retired with the plugin repo — the TS ports are now declared canonical and the fixtures are the spec.profile_verb's lint-port comments re-point at the vault tree;lens_registry's deviation note resolves to "the design";verbs.ts/ledger_dispatch.tscomments updated.Verification
researcher,experimenter,engineer,librarian-insight,dreamer,default) resolve in both dispatch and spool-up modes against the two-root union.Follow-ups
wip/fleet-profileson amico-plugin should die unmerged — its content landed in the vault.