Phase 08+ scope: IronKey Keypad 200C as Tier 2 hardware-encrypted storage for Włóczykij vault #180
Labels
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
pdurlej/platform#180
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Per operator voice-note 2026-05-11 07:45 + image IMG_9781.HEIC (Kingston IronKey Keypad 200C 16GB, purchased Black Friday November 2025):
This is a 3-tier privacy architecture upgrade over the original Włóczykij scope in issue #178. The IronKey provides hardware-encrypted Tier 2 storage with physical forcing-function for context switching.
Hardware specification
Kingston IronKey Keypad 200C, 16GB, USB-C
3-tier privacy architecture
Iskra-i-Piotr/*(excluding hard_private folders)Iskra-i-Piotr/{Journal,Finance,Family,Health}(per ADR-0010 hard_private mapping, amended per operator 2026-05-11)/Volumes/IRONKEY/Włóczykij/*Why this is sound architecture
Physical forcing-function for context switch. No software lock can be accidentally bypassed by drag-drop into chat. IronKey-in-drawer = vault literally absent from M1 disk.
Defense-in-depth. Even if M1 is compromised (malware, theft), attacker cannot auto-mount Włóczykij because:
Air-gapped-by-default. Tier 2 content is not on M1 disk except when IronKey is mounted. Not in cloud (per operator's voice-note: not in encrypted Dropbox by default — see Open Question #1 below). Not in Synology. Operator physically controls when Tier 2 content "exists" on a computer.
Local LLM compatibility. ADR-0010 local-admin LLM tier (gemma-3 on M1) runs locally; supports Tier 2 workflows because both LLM and content are on operator's M1 (no cloud dispatch needed). KOS2-derived guard rails apply.
Operator portability. "Markdown zawsze ze mną w kluczach" — operator can mount on any USB-C-capable computer (not just M1) to access Tier 2 content. Useful when traveling without M1.
Workflow (operator-mode based)
Daily mode (IronKey in drawer)
Privacy mode (IronKey mounted)
Promotion path (Iskra-i-Piotr → Włóczykij)
Import path (Włóczykij → Iskra-i-Piotr) — rare
Integration with existing architecture
ADR-0010 (local-admin LLM tier) — amendment
ops/local-admin/capabilities.yamlgets newvault_rootsfield (already proposed in issue #178 for Iskra-i-Piotr/Włóczykij split; this issue adds IronKey path):local-admin LLMruntime check: at every read attempt, verify/Volumes/IRONKEY/is mounted; if not, refuse Tier 2 access.ADR-0013 (4th replica) — amendment / OPEN QUESTION
Does Tier 2 content (Włóczykij) join the 4th replica chain?
Operator's voice-note 2026-05-11 suggested Option A or B. Operator decides; this issue captures the question.
Issue #178 (Włóczykij second-tier vault)
Issue #178 assumed
/Users/pd/Obsidian/Włóczykij/(M1 disk) as canonical. This issue supersedes that location: IronKey-mounted path is canonical; M1-disk mirror is optional (if any).scripts/vault-sync-iskra-to-wloczykij.sh(proposed in #178) becomes:/Users/pd/Obsidian/Włóczykij/for redundancy/Volumes/IRONKEY/Włóczykij/, runs only when mountedOperator picks.
KOS2-derived guard rails
Per operator (voice-note 2026-05-11): "Lokalny model językowy. Robię w Włóczykij zgodnie z guard rails, które stworzymy — które są wypadkową KOSA 2."
KOS2 (
github.com/pdurlej/KOS2) provides the prior-art reference for vault janitor / hygiene patterns. Tier 2 KOS2-derived rules (Phase 08+ design):/Volumes/IRONKEY/.iskra-audit/YYYY-MM-DD.ndjson(audit-on-IronKey, not on M1 — audit stays with vault)Open questions (operator decides)
/Users/pd/Obsidian/Włóczykij/: keep (redundancy) or remove (IronKey-only-canonical)?Scope (this issue produces Phase 08+ tickets)
Ticket A — Hardware setup runbook
docs/runbooks/ironkey-setup.md:Ticket B — Local-admin LLM amendment (extends ADR-0010)
ops/local-admin/capabilities.yamladdsaccessible_when_mountedsemantics. Wrapper code at runtime checksos.path.ismount('/Volumes/IRONKEY/')before granting Tier 2 access.Ticket C — Optional encrypted Dropbox backup of IronKey content
If operator chooses Option B above, add
scripts/4th-replica/sync-ironkey-to-dropbox.sh(runs only when IronKey mounted; encrypts via age before upload).Ticket D — KOS2-derived guard rails for Tier 2
Phase 08+ — adapt KOS2 patterns for IronKey vault janitor + privacy-aware mutations.
Phase
Phase 08+. Most likely sequencing:
Could be earlier IF operator wants to use IronKey for current intimate notes BEFORE Phase 07 — that's a Ticket A "operator-driven manual" path with no automation, just hardware setup + manual file moves.
Acceptance criteria
Refs
vault_rootsfieldCoordination
Role: advisor (claude)
Captured for: operator's "szaleństwo z przymrużeniem oka" architectural intuition — "żebyś wiedział, możesz to zapisać gdzieś jako komentarz jaki jest jakby myśl, jaka jest struktura tutaj jakby danych wokół tego"
Role: operator (piotr) → recorded by claude (orchestrator)
Intent: operator-feedback-applied (6 Open Questions answered)
Needs owner: no (operator has spoken; this is record-keeping)
Operator voice-note 2026-05-11 ~07:55 answered all 6 Open Questions from this issue. Summary + new architecture discoveries below.
Answers to Open Questions
Q1 — Backup of Tier 2 content: Option B-modified (Synology-only, not Dropbox)
Operator: "Kingston tutaj jakby wystarczy. Synology backup może tego Kingstona jako backup tier 2 ale póki co to jest jakby mówimy o przyszłych planach na tym momencie to jeszcze nie boli."
Decision:
Architecture implication: Synology has TWO roles now:
/volume1/iskra-baseline//volume1/iskra-tier2-encrypted/(encrypted blob from IronKey)These are separate directories on the same Synology. Different encryption keys; different mount semantics; different access policies.
Q2 — M1-disk mirror: KEEP for Obsidian compatibility
Operator: "Nie jestem w stanie zrobić tej dwójki [IronKey-only canonical] bo Obsidian wariuje. Więc chyba będzie M1 disk mirror po prostu a tym."
Decision:
/Users/pd/Obsidian/Włóczykij/stays as M1-disk mirror (Obsidian needs stable vault path)/Volumes/IRONKEY/Włóczykij/is the canonical security boundaryvault_roots.denylistper ADR-0010 (agents NEVER read it, even though physical files exist)Open follow-up: figure out cleaner solution. Obsidian's "vault must be local" constraint is the friction. Possible Phase 09+ ideas:
/Volumes/IRONKEY/Włóczykij/directly when mounted, falls back to read-only stub when unmountedQ3 — PIN management: physical secure location (undisclosed)
Operator: "Mam fizycznie miejsce, gdzie składuję ważne papiery, więc tam będzie w fizycznym miejscu dla mnie dostępnym. Specjalnie ci nie mówię, gdzie dokładnie, żeby nawet to nie wyleciało tutaj."
Decision:
Q4 — 2nd IronKey: NO
Operator: "Nie chciałbym, bo jest dość drogie, a nie ma wartości, prócz tego, że się tym jaram. Zacznijmy od testowania tego."
Decision: single IronKey for now. Operator self-aware about FOMO vs actual value. Re-evaluate after operational period (e.g. 3 months) if hardware-failure risk feels real.
Q5 — Read-only vs read-write default: READ-ONLY default + manual toggle + auto-revert
Operator: "Tryb read only żeby właśnie dla agentów i read write żeby w momencie kiedy jest coś do zrobienia. Może powinien się sam wyłączać po jakimś czasie."
Decision:
iskra-ironkey mode read-write) for write modeImplementation note (Phase 08+): IronKey Keypad 200C supports read-only mode toggle via device or via mount-time option. Wrapper script
scripts/ironkey/mount-readonly.shis the safe-default path;scripts/ironkey/toggle-readwrite.shis operator-explicit.Q6 — KOS2 guard-rail timeline: defer to Phase 08+
Operator: "Z racji, że nie działa, możemy sobie ustawić na kolejne fazy."
Decision: Phase 08+ as originally proposed. KOS2-derived guard rails implement when IronKey integration becomes active (after Phase 07 lands local-admin tier on Iskra-i-Piotr).
NEW DISCOVERY — 2× YubiKey in operator's hardware inventory
Operator: "U tego Synology można wykorzystać to, że mam YubiKey, a też 2 YubiKey, więc to też można tutaj jakoś to pewnie włączyć."
This is new information not previously in any platform inventory. Two YubiKeys in operator's possession.
Architectural implications
YubiKey (FIDO2/U2F/PIV/OpenPGP capable) opens several potential roles in the privacy chain:
Synology auth factor: 2FA for Synology DSM admin login (FIDO2 via WebAuthn) — protects the future Tier 2 backup target.
SSH key storage: SSH private keys stored on YubiKey (PIV slot or OpenPGP); SSH to RS2000/VPS1000/kip uses hardware-resident key. Eliminates
~/.ssh/id_*files on M1 disk for production-tier auth.Age key co-storage: ADR-0013 mentions age encryption key for encrypted Dropbox. Could move age key to YubiKey (via age-plugin-yubikey) — encryption now requires hardware presence.
GitHub/Forgejo SSH key: per-actor PATs currently in BW custom field; could augment with YubiKey-resident SSH keys for git push (defense-in-depth against M1 compromise).
PIN recovery factor for IronKey: NOT directly — IronKey PIN is on-device only. BUT YubiKey-protected Synology backup means "if IronKey PIN forgotten, restore from Synology requires YubiKey hardware presence" — better than software password.
Future M1 boot / FileVault: macOS supports YubiKey for Touch ID alternative; not in current scope but possible later.
Capture in inventory
Recommendation: open separate follow-up issue
Phase 08+ scope: integrate 2× YubiKey into platform auth chaincovering the above 6 roles. Operator picks which to enable.For THIS issue (#180), YubiKey relevance is narrow:
Updated architecture summary
Recommended follow-up tickets (not opening now; operator-paced)
Phase 08+ scope: integrate 2× YubiKey into platform auth chain— 6 potential roles enumerated abovePhase 08+ ticket: operator-driven IronKey setup runbook(Ticket A from this issue body) — operator-paced, can be done before Phase 07 landsPhase 08+ ticket: M1-disk mirror sync semantics for Obsidian compatibility— figure out cleaner Obsidian-doesn't-wariuje patternNext action
This issue is now operator-answered + architecture-recorded. No blocker. Implementation lives in Phase 08+ post-Phase-07.
Role: orchestrator → record-keeper (claude)
Lane: architecture documentation
M10 disposition: moved to
10 - Improvements.What this is: IronKey hardware-encrypted storage.
Why parked here: Parked in M10 because it is a useful physical-storage improvement for Włóczykij, but not a blocker for M02 infrastructure DR or M04 Vault sunset entry criteria.
This preserves the idea without letting it block M02/M03/M04 closeout. Before reactivation, split it into a narrow issue or PR with concrete acceptance criteria.
Parked (p3, M10 closure plan #653 + Judging Claw priority). Reactivate when IronKey Tier-2 hardware storage is scheduled.
{
"confidence": 5,
"effort_hint": "large",
"escalation": {
"kind": "operator",
"reason": "Hardware-encrypted vault storage changes privacy, backup, import, and failure-mode decisions."
},
"evidence_refs": [
{
"note": "Issue scopes IronKey Keypad 200C as Tier 2 hardware-encrypted storage for W\u0142\u00f3czykij vault.",
"type": "forgejo",
"value": "issue-title-body-labels-and-target-snapshot"
},
{
"note": "Body frames a three-tier privacy architecture for portable markdown notes and local-model work.",
"type": "forgejo",
"value": "issue-body-context"
},
{
"note": "Snapshot labels mark the work as priority p3 and parked.",
"type": "snapshot",
"value": "target-snapshot-labels"
}
],
"impact": 4,
"judge_actor": {
"name": "iskra",
"runtime": "openclaw"
},
"judged_at": "2026-06-09T01:02:00Z",
"labels_to_apply": [
"judge/p2",
"judge/operator-needed"
],
"piotr_fit": "high",
"priority": "p2",
"rationale_summary": "This is P2 operator-shaped privacy architecture because hardware-encrypted W\u0142\u00f3czykij storage can protect sensitive notes but needs explicit guardrails and recovery design.",
"reach": 4,
"recommended_next_action": "operator_needed",
"rerun_reason": "no_prior_judgment",
"schema": "openclaw.judge.v0",
"target": {
"kind": "issue",
"number": 180,
"repo": "pdurlej/platform"
},
"target_snapshot": {
"body_hash": "sha256:ce8293aac1a6cd1811e5fb9c4d8af9a31e59e5ec460de282e8a584c360d61c1b",
"commit_count": null,
"evidence_hash": "sha256:460e2fade7e0c27dc5476907dd2548f2dff6d7401a067e1f89f195aff14589c0",
"head_sha": null,
"labels": [
"agent/claude-code",
"priority:p3",
"status:parked"
],
"labels_hash": "sha256:9e8ed9cb7b1b30f4dcf389e2b3d1f8e66c19eb940504926be5872a601be5b3ab",
"state": "open",
"title_hash": "sha256:1ca3f9926f56472e77f3a27c7cae050460b0ceb16b2937063711a15c13bd6ea2",
"updated_at": "2026-06-01T08:53:15+02:00"
},
"top_caveat": "Do not make it the only vault location until backup, loss, corruption, and import boundaries are deliberately tested."
}