Author: Lucienne Date: 2026-05-21 Status: proposal / design note
Yes. We should build this — and it should not be limited to cross-machine consultation.
The right pattern is not direct chat between two transient model sessions. The right pattern is a small, durable, file-backed consultation bus that machines and runtimes can read and write, with skills that teach each side when and how to use it.
This gives us a PKA-specific consultation fabric:
Create a shared append-only consultation folder, synced between Mac and Luci, with simple Markdown request/response envelopes.
Suggested canonical folder:
/Users/elmar/PKA/Vault/cross-machine-consultations/ # Mac path
/home/lucienne/workspace/PKA/Vault/cross-machine-consultations/ # Luci path, assuming PKA repo sync
If PKA repo sync is not the right transport, use another already-synced folder, but keep the logical folder name and file schema the same.
Direct agent-to-agent chat sounds attractive, but it is fragile:
A file-backed bus is better because it is:
The filesystem is the right primitive. The key is to choose a transport that is boring, visible, and recoverable.
Recommended transport order:
Use a dedicated consultation folder inside each machine's normal operating workspace, but keep the live queue append-only and mostly untracked.
Recommended paths:
Mac:
/Users/elmar/PKA/consult-bus/
Luci:
/home/lucienne/workspace/consult-bus/
Why keep it under the operating workspace:
Important boundary: the live queue is not the canonical PKA history. If the Mac path is inside the PKA repo, add gitignore rules for volatile live folders such as consult-bus/inbox/, consult-bus/responses/, consult-bus/tmp/, and consult-bus/state/. Track only the stable docs/templates/registry if useful, and archive completed important consultations separately.
Primary read/write transport should be SSH, not git:
# Mac reads Luci consultations directly
ssh -o ConnectTimeout=10 lucienne@<luci-tailscale-host> \
"find ~/workspace/consult-bus -type f -name '*.md' | sort"
# Mac pulls append-only files from Luci
rsync -az --ignore-existing \
lucienne@<luci-tailscale-host>:/home/lucienne/workspace/consult-bus/ \
/Users/elmar/PKA/consult-bus/
# Mac pushes append-only files to Luci
rsync -az --ignore-existing \
/Users/elmar/PKA/consult-bus/ \
lucienne@<luci-tailscale-host>:/home/lucienne/workspace/consult-bus/
--ignore-existing is important because the bus is append-only. It prevents one side from overwriting the other side's file.
Git can be a fallback when SSH/Tailscale is temporarily unavailable but GitHub/repo sync is still working.
Fallback shape:
/Users/elmar/PKA/consult-bus/fallback-outbox/
/home/lucienne/workspace/PKA/consult-bus/fallback-outbox/
Use this only for degraded mode:
consult-bus/fallback-outbox/.This gives the bus two paths:
Rules for the live bus:
.tmp, then rename to .md when complete.rsync --ignore-existing; never destructive mirror-delete.For consultations that matter long-term, copy the final request/response bundle into PKA after completion:
/Users/elmar/PKA/Vault/cross-machine-consultations/archive/
/home/lucienne/workspace/PKA/Vault/cross-machine-consultations/archive/
Use git for the audit/archive layer and degraded fallback, not the normal hot queue.
This keeps the live workflow fast while still preserving important architectural decisions in the durable PKA memory system.
Mission Control can eventually expose consultation requests/responses as first-class objects. That is a later integration step, not the Phase 1 transport.
Phase 1 should use Option A for the live queue, Option B only for degraded fallback, and Option C for archival evidence.
Live bus structure:
consult-bus/
README.md
inbox/
luci/
lucienne/
luci-claude-code/
luci-hermes/
lucienne-hermes-mac/
responses/
archive/
2026/
2026-05/
state/
seen-luci.json
seen-lucienne.json
templates/
request.md
response.md
Simpler alternative:
Vault/cross-machine-consultations/
open/
answered/
archive/
README.md
I prefer the explicit inbox/outbox layout because it makes ownership obvious.
Each request is one Markdown file with YAML frontmatter.
Filename pattern:
YYYYMMDD-HHMMSS-from-TO-topic-slug.md
Example:
20260521-154200-luci-to-lucienne-runtime-independence.md
Template:
---
id: consult-20260521-154200-luci-lucienne-runtime-independence
status: open
from: luci
to: lucienne
created_at: 2026-05-21T15:42:00Z
priority: normal
kind: architecture-review
related_ticket: MC-xxxx
related_files:
- /home/lucienne/workspace/reports/luci-control-room-runtime-independence-plan.md
- /home/lucienne/workspace/mission-control/docs/runtime-architecture-refresh.md
requires_response_by:
allowed_context: internal-pka-no-secrets
---
# Question
Please review whether the proposed runtime-independence plan creates a second source of truth.
# My current position
Luci's current position goes here. State the proposed decision and strongest reasons.
# Context
Relevant excerpts, file paths, ticket links, or summary.
# Specific asks
1. What is the biggest architecture drift risk?
2. What should be changed before implementation?
3. Is this safe to proceed?
# Response contract
Please respond with:
- verdict: approve / revise / reject
- required changes
- optional improvements
- risks
- next action
Responses can either be appended to the request file or written as a separate response file.
I recommend separate response files so neither side edits the other side's original request.
Filename pattern:
YYYYMMDD-HHMMSS-response-to-CONSULT-ID-from-lucienne.md
Template:
---
id: response-20260521-161000-lucienne
responds_to: consult-20260521-154200-luci-lucienne-runtime-independence
status: final
from: lucienne
to: luci
created_at: 2026-05-21T16:10:00Z
verdict: revise
confidence: high
related_ticket: MC-xxxx
---
# Verdict
Revise before implementation.
# Required changes
1. Add source-of-truth boundary.
2. Defer model default changes.
3. Create MC ticket before implementation.
# Reasoning
...
# Next action
Luci should patch the plan, then proceed with Phase 1 only.
The request file can then be marked answered by a small script, or left append-only with an index generated from response files.
Create two small mirrored skills, one usable on each side.
ask-luciPurpose: Lucienne/Mac asks Luci for a cloud-side opinion.
Triggers:
Behavior:
ask-luciennePurpose: Luci asks Lucienne/Mac for a Mac-side / Hermes / architecture continuity opinion.
Triggers:
Behavior:
No daemon. No scheduler.
Both sides know the folder and file schema through skills.
Elmar can say:
The agent writes a request file. The other side reads it when asked.
This is low risk and can be implemented first.
Add a small script on each side:
scripts/consult_bus.py
Commands:
python3 scripts/consult_bus.py create --to luci --kind architecture-review --question-file /tmp/q.md
python3 scripts/consult_bus.py list --to lucienne --status open
python3 scripts/consult_bus.py show CONSULT_ID
python3 scripts/consult_bus.py respond CONSULT_ID --response-file /tmp/response.md
python3 scripts/consult_bus.py archive CONSULT_ID
This script should:
On Luci:
inbox/luci/ every few minutesOn Mac/Hermes:
inbox/lucienne/Important: automated responses must be self-contained because future cron runs do not have current chat context.
For significant consultations:
This makes cross-machine design checks visible in the operating system, not just in files.
question arises
-> origin agent writes consult request
-> sync/transport makes it visible to target machine
-> target agent reads request with skill
-> target writes response file
-> origin agent reads response
-> origin updates decision/ticket/report
-> files archived when done
Do not limit this to cross-machine only.
There are two related but different consultation types:
Use this when the risk is environment drift between Mac/Lucienne and Luci.
Examples:
Use this when the risk is runtime/context drift on the same machine.
Examples:
This is especially useful on Luci because multiple runtimes may share a filesystem but not share memory, tool availability, model defaults, skill loading, or gateway behavior.
Use explicit participant IDs in request frontmatter. Avoid vague names like “agent” or “assistant”.
Suggested IDs:
luci-claude-codeluci-hermesluci-codexluci-gemini-cliluci-hermes-glmluci-hermes-codexluci-hermes-kimiluci-hermes-minimaxluci-claude-glmluci-claude-kimiluci-claude-minimaxlucienne-hermes-maclucienne-claude-code-maclucienne-hermes-glm-maclucienne-hermes-codex-maclucienne-hermes-kimi-maclucienne-hermes-minimax-macatlastessascottModel-backed reviewer IDs can represent either:
claude-glm, claude-kimi, claude-minimax.The request must declare which execution mode was intended so we can distinguish “Hermes running GLM” from “Claude Code running against GLM through provider-switch”.
from: luci-hermes
to: luci-claude-code
machine: luci
runtime_from: hermes
runtime_to: claude-code
For cross-machine requests:
from: luci-claude-code
to: lucienne-hermes-mac
machine_from: luci
machine_to: lucienne-mac
runtime_from: claude-code
runtime_to: hermes
For model-backed reviewer requests:
from: luci-hermes
to: luci-hermes-glm
machine: luci
runtime_to: hermes
provider_to: z.ai
model_to: glm-5.1
execution_mode: hermes-model-override
or:
from: luci-hermes
to: luci-claude-glm
machine: luci
runtime_to: claude-code
provider_to: z.ai
model_to: glm-5.1
execution_mode: claude-provider-switch
The bus should support both named participants and model-backed reviewer pools.
Example pool IDs:
local-diverse-review: luci-hermes-glm, luci-hermes-kimi, luci-hermes-minimaxluci-runtime-review: luci-claude-code, luci-hermes, luci-codexarchitecture-council: luci-claude-code, luci-codex, luci-hermes-glm, luci-hermes-kimi, luci-hermes-minimaxcross-machine-review: luci-claude-code, lucienne-hermes-macThis matches Luci's runtime-independence plan: specialist separation should be expressed as runtime profiles/adapters under MC, not as hard dependency on one runtime.
Model-backed reviewers can be implemented two ways:
Good when we want Hermes tool behavior and memory.
Claude Code runtime with provider switch.
Both are valid. The consultation file should record which one was used.
Use consultation for:
Do not use it for:
second-opinionThis should be treated as a sibling to second-opinion, not a replacement.
second-opinion answers:
What does another model think from the supplied prompt/context?
The consultation bus answers:
What does another machine/runtime/context know that this one might miss?
This distinction matters. Claude Code on Luci may know things Hermes on Luci does not know because it has different transcript history, skill loading, MCP/tool behavior, provider state, or local CLI conventions. Hermes may know things Claude Code does not know because it has Hermes-specific profiles, gateway state, cron jobs, or home-channel behavior. Even on the same machine, runtimes are not interchangeable memories.
For important architecture work, multiple gates can apply:
Add these rules to both ask-luci and ask-lucienne skills:
Mission Control API
Should request/response files live in Vault/, reports/, or agent-control-room/?
My recommendation: Vault/cross-machine-consultations/, with important summaries linked from MC tickets/reports.
My recommendation: start manual, then add Hermes cron only after the manual file flow works.
My recommendation: only for durable system work. Small checks can remain file-only.
Phase 1 can be very small:
Vault/cross-machine-consultations/
README.md
templates/request.md
templates/response.md
inbox/luci/.gitkeep
inbox/lucienne/.gitkeep
responses/.gitkeep
archive/.gitkeep
ask-luci
ask-lucienne
Teach each skill the schema and when to use it.
Do not add automation yet.
This gives Elmar the immediate workflow:
Use the runtime-independence proposal as the first real test.
Build this, but keep it boring.
A simple durable file bus plus two skills will solve most of the drift problem without creating a brittle agent-to-agent chat system.
Start manual and schema-first. Add polling/cron only after the file workflow proves useful.