Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory) - #130

Merged
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity
Jul 14, 2026
Merged

Bootstrap parity: full Armonia mount-stack at session start (discovery, grants, splice, typed memory)#130
Rchari1 merged 4 commits into
mainfrom
aaron/mount-stack-parity

Conversation

@aarontrowbridge

@aarontrowbridgeaarontrowbridge commented Jul 11, 2026

Copy link
Copy Markdown
Member

What

Amicode sessions now see the full Armonia mount stack — not just the personal vault. Implements the bootstrap parity half (Components 1–4) of the context-lifecycle spec (spec-20260707-002846), extension-side only, zero fork patches:

  • substrate/mount_store.ts (new) — TS port of the amico-plugin session-start hook's discovery: .amico-vault.toml markers under ~/.amico/vaults/, mounts.toml order/kind/writable overrides, canonical kind precedence, skip-with-warning semantics.
  • Per-mount external_directory read grants in the injected opencode config — the agent can read notes/cards across the whole stack on demand.
  • "Mount stack (Armonia)" splice into the injected AGENTS.md — one line per mount + condensed resolution/write-routing rules (mirrors the amico-vault skill).
  • Typed memory store (read side + distiller write side)<personal>/amicode/memory/{type}_{topic}.md + MEMORY.md index; only the index is spliced, facts load on demand. DISTILLER.md now writes typed facts and maintains the index; KNOWLEDGE.md/DEMOS.md frozen (idempotent migration pointer).

Semantics (single source of truth)

Canonical kind order per the approved vault-CLI spec (spec-20260703-053956): personal 0 · engagement 1 · project 2 · restricted 3 · team 4 · public 5 · unknown 6. Note: this deliberately corrects the Ombra draft's table (which swaps team/restricted). Two oracle-parity subtleties replicated + tested: manifest-kind override applies before the missing-kind skip (rescue rule), and manifest-unlisted mounts append in discovery order.

Parity oracle: amico-plugin/hooks/session-start on feat/amico-vault-mounts-toml (amico-plugin PR #27).

The three-state vaultDir contract is preserved exactly (undefined → auto-resolve stack / "" → personalization off, no grants, no splice / path → single forced personal mount). Read-posture note: grants are read grants even for ro mounts (the permission surface has no r/w split); write discipline stays distiller-side.

Testing

pnpm test: 460 passed | 3 skipped (baseline 435 | 3 — +25 new, zero regressions). pnpm typecheck clean. New suites: mount_store.test.ts (fixture matrix incl. rescue + discovery-order + restricted rank), splice sections, three-state prep contract. One new test mutates HOME (restored in finally) to hermetically exercise auto-resolve — flagged for reviewer attention.

Deliberately deferred

Ombra C2's compaction knobs + summarizer model pin; Ombra itself (C5–C9); resolver unification with the amico-run twin (packages/amico-run/src/mounts.ts, see #131) — headers cross-reference.

CI: expected red on the pre-existing private-fork binary token issue — unrelated.

🤖 Generated with Claude Code

aarontrowbridgeand others added 4 commits July 11, 2026 01:45
…recedence (spec-20260707-002846 C1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…60707-002846 C3/C4 read side)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prep (spec-20260707-002846 C1–C4 read side; C2's compaction knobs deliberately deferred)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…260707-002846 C4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Rchari1
Rchari1 merged commit f91ab25 into mainJul 14, 2026
5 checks passed
Sign up for freeto 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.

2 participants

@aarontrowbridge@Rchari1