Phase 08+ scope: Włóczykij as second-tier curated vault (physical-separation safety architecture) #178

Closed
opened 2026-05-11 07:43:59 +02:00 by claude · 3 comments
Collaborator

Context

Per operator voice-note 2026-05-11 07:26:

"Włóczykij jest tutaj /Users/pd/Obsidian/Włóczykij. Docelowy flow jest taki, że będzie jeden szeroki surface, który jest Iskra i Piotr. I tam mamy miejsce na współpracy agentów ze mną. I pewnie będzie taki bardziej Włóczykij, który pewnie będzie kopiował dużo rzeczy z Iskra-Private, ale te agentyczne rzeczy nasze zostawi tam. Czyli to będzie tylko sync w jedną stronę, a kopia go zostaje."

Confirmed path: /Users/pd/Obsidian/Włóczykij/ (already exists as empty directory; aspirational, not yet active).

Architecture (operator's preferred model — supersedes my earlier read-time-filter proposal)

Safety by physical separation, not read-time filtering.

Vault Path Agent access Content
Iskra-i-Piotr /Users/pd/Obsidian/Iskra-i-Piotr/ YES (per sensitivity tier per ADR-0010) wide surface for agent-operator collaboration; current operator working set
Włóczykij /Users/pd/Obsidian/Włóczykij/ NO — physical denylist curated long-term vault; mostly copies from Iskra-i-Piotr without agentic stuff; eventually overlay private filtering

Operator: "Jeśli czegoś nie chce widzieć u agentów no to to jest Włóczykij a jeśli coś akceptuje, że może być u agentów no to jest Iskra-i-Piotr. Wydaje mi się, że taki set jest bezpieczny z definicji."

Operator's reasoning: agents physically cannot leak content from a path they don't read. No filter to misconfigure.

One-way sync model

Iskra-i-Piotr/                          Włóczykij/
   │                                       ▲
   │  operator + agents work here          │
   │                                       │
   │  ── one-way sync (filtered) ──────────┘
   │     (agentic working notes stay; curated content copies)
   │
   │  Włóczykij is read-only from operator's perspective for
   │  active work; operator may edit Włóczykij directly for
   │  curated rewrites but those don't sync back.

Scope (this issue produces 2 follow-up tickets)

Ticket A — Physical-separation enforcement in ops/local-admin/capabilities.yaml

Amend ADR-0010 capabilities.yaml with top-level vault_roots:

vault_roots:
  accessible:
    - "/Users/pd/Obsidian/Iskra-i-Piotr/"
  denylist:
    - "/Users/pd/Obsidian/Włóczykij/"
    - "/Users/pd/Obsidian/100 Projects/"      # operator-confirmed; not in scope
    - "/Users/pd/Obsidian/200 Areas/"          # operator-confirmed; not in scope
    - "/Users/pd/Obsidian/001 System/"         # operator-confirmed; not in scope
    - "/Users/pd/Obsidian/010 Inbox/"          # operator-confirmed; not in scope
    - "/Users/pd/Obsidian/01_Inbox/"           # operator-confirmed; not in scope
    - "/Users/pd/Obsidian/Włóczykij/"
    # (operator confirms full list on review)

Wrappers (per ADR-0010) MUST refuse any read with path matching any denylist entry. Default-deny, allowlist-explicit.

Ticket B — One-way sync script scripts/vault-sync-iskra-to-wloczykij.sh

Operator's spec:

  • Source: /Users/pd/Obsidian/Iskra-i-Piotr/
  • Target: /Users/pd/Obsidian/Włóczykij/
  • Direction: source → target only (no reverse)
  • Filter: agentic-working-notes EXCLUDED (operator defines which folders/tags/frontmatter qualify; suggest agent_workspace: true frontmatter as marker)
  • Schedule: ad-hoc operator-triggered initially; can become weekly via launchd later
  • Conflict policy: if target file edited directly by operator (manual rewrite), source-side change does NOT overwrite — source-newer-but-target-conflicts logs warning, requires operator review

Out of scope (this issue)

  • Replacing pseudo-anonymization (separate issue; defense-in-depth on top of physical separation)
  • Future "private" overlay on Włóczykij (operator-mentioned: "pewnie nałożę na ten volt jakąś tam prywatną") — separate Phase 08+ issue
  • Multi-vault support beyond Iskra-i-Piotr + Włóczykij (Phase 09+)

Phase

Phase 08+ (after Phase 07 implementation of local-admin tier + vault janitor). Ticket A could land sooner as scope-amendment to ADR-0010; Ticket B is post-implementation.

Acceptance criteria

  • ops/local-admin/capabilities.yaml amended with vault_roots.accessible + vault_roots.denylist
  • Wrappers enforce vault_roots boundary at runtime
  • scripts/vault-sync-iskra-to-wloczykij.sh exists with one-way sync semantics
  • Test: agent attempting to read /Users/pd/Obsidian/Włóczykij/anything is denied
  • Operator runs sync once; verifies filtered copies in Włóczykij

Refs

  • Operator voice-note 2026-05-11 07:26 (introduced architecture)
  • ADR-0010 (local-admin tier) — this issue amends its capabilities.yaml
  • PR #171 comment (Włóczykij architecture inversion)
  • Operator's KOS2 (github.com/pdurlej/KOS2) — vault janitor prior art

Coordination

  • Lane: Phase 08+ design (advisor + executor)
  • Owner: TBD (when operator decides Phase 08 priority)
  • Operator: confirms denylist contents; decides sync schedule; reviews first sync output

Role: advisor (claude)

## Context Per operator voice-note 2026-05-11 07:26: > *"Włóczykij jest tutaj /Users/pd/Obsidian/Włóczykij. Docelowy flow jest taki, że będzie jeden szeroki surface, który jest Iskra i Piotr. I tam mamy miejsce na współpracy agentów ze mną. I pewnie będzie taki bardziej Włóczykij, który pewnie będzie kopiował dużo rzeczy z Iskra-Private, ale te agentyczne rzeczy nasze zostawi tam. Czyli to będzie tylko sync w jedną stronę, a kopia go zostaje."* Confirmed path: `/Users/pd/Obsidian/Włóczykij/` (already exists as empty directory; aspirational, not yet active). ## Architecture (operator's preferred model — supersedes my earlier read-time-filter proposal) **Safety by physical separation, not read-time filtering.** | Vault | Path | Agent access | Content | |-------|------|--------------|---------| | `Iskra-i-Piotr` | `/Users/pd/Obsidian/Iskra-i-Piotr/` | YES (per sensitivity tier per ADR-0010) | wide surface for agent-operator collaboration; current operator working set | | `Włóczykij` | `/Users/pd/Obsidian/Włóczykij/` | **NO — physical denylist** | curated long-term vault; mostly copies from Iskra-i-Piotr **without** agentic stuff; eventually overlay private filtering | Operator: *"Jeśli czegoś nie chce widzieć u agentów no to to jest Włóczykij a jeśli coś akceptuje, że może być u agentów no to jest Iskra-i-Piotr. Wydaje mi się, że taki set jest bezpieczny z definicji."* Operator's reasoning: agents physically cannot leak content from a path they don't read. No filter to misconfigure. ## One-way sync model ``` Iskra-i-Piotr/ Włóczykij/ │ ▲ │ operator + agents work here │ │ │ │ ── one-way sync (filtered) ──────────┘ │ (agentic working notes stay; curated content copies) │ │ Włóczykij is read-only from operator's perspective for │ active work; operator may edit Włóczykij directly for │ curated rewrites but those don't sync back. ``` ## Scope (this issue produces 2 follow-up tickets) ### Ticket A — Physical-separation enforcement in `ops/local-admin/capabilities.yaml` Amend ADR-0010 `capabilities.yaml` with top-level `vault_roots`: ```yaml vault_roots: accessible: - "/Users/pd/Obsidian/Iskra-i-Piotr/" denylist: - "/Users/pd/Obsidian/Włóczykij/" - "/Users/pd/Obsidian/100 Projects/" # operator-confirmed; not in scope - "/Users/pd/Obsidian/200 Areas/" # operator-confirmed; not in scope - "/Users/pd/Obsidian/001 System/" # operator-confirmed; not in scope - "/Users/pd/Obsidian/010 Inbox/" # operator-confirmed; not in scope - "/Users/pd/Obsidian/01_Inbox/" # operator-confirmed; not in scope - "/Users/pd/Obsidian/Włóczykij/" # (operator confirms full list on review) ``` Wrappers (per ADR-0010) MUST refuse any read with path matching any `denylist` entry. Default-deny, allowlist-explicit. ### Ticket B — One-way sync script `scripts/vault-sync-iskra-to-wloczykij.sh` Operator's spec: - **Source**: `/Users/pd/Obsidian/Iskra-i-Piotr/` - **Target**: `/Users/pd/Obsidian/Włóczykij/` - **Direction**: source → target only (no reverse) - **Filter**: agentic-working-notes EXCLUDED (operator defines which folders/tags/frontmatter qualify; suggest `agent_workspace: true` frontmatter as marker) - **Schedule**: ad-hoc operator-triggered initially; can become weekly via launchd later - **Conflict policy**: if target file edited directly by operator (manual rewrite), source-side change does NOT overwrite — source-newer-but-target-conflicts logs warning, requires operator review ## Out of scope (this issue) - Replacing pseudo-anonymization (separate issue; defense-in-depth on top of physical separation) - Future "private" overlay on Włóczykij (operator-mentioned: "pewnie nałożę na ten volt jakąś tam prywatną") — separate Phase 08+ issue - Multi-vault support beyond Iskra-i-Piotr + Włóczykij (Phase 09+) ## Phase Phase 08+ (after Phase 07 implementation of local-admin tier + vault janitor). Ticket A could land sooner as scope-amendment to ADR-0010; Ticket B is post-implementation. ## Acceptance criteria - [ ] `ops/local-admin/capabilities.yaml` amended with `vault_roots.accessible` + `vault_roots.denylist` - [ ] Wrappers enforce `vault_roots` boundary at runtime - [ ] `scripts/vault-sync-iskra-to-wloczykij.sh` exists with one-way sync semantics - [ ] Test: agent attempting to read `/Users/pd/Obsidian/Włóczykij/anything` is denied - [ ] Operator runs sync once; verifies filtered copies in Włóczykij ## Refs - Operator voice-note 2026-05-11 07:26 (introduced architecture) - ADR-0010 (local-admin tier) — this issue amends its capabilities.yaml - PR #171 comment (Włóczykij architecture inversion) - Operator's KOS2 (github.com/pdurlej/KOS2) — vault janitor prior art ## Coordination - Lane: Phase 08+ design (advisor + executor) - Owner: TBD (when operator decides Phase 08 priority) - Operator: confirms denylist contents; decides sync schedule; reviews first sync output **Role:** advisor (claude)
Author
Collaborator

Role: advisor (claude)
Intent: cross-link
Needs owner: no

Operator voice-note 2026-05-11 07:45 + image IMG_9781.HEIC introduced a hardware-encryption tier for Włóczykij: Kingston IronKey Keypad 200C 16GB as canonical Tier 2 storage (purchased Black Friday 2025, sitting unused awaiting setup).

This supersedes the storage location assumption in this issue. Canonical Włóczykij is at /Volumes/IRONKEY/Włóczykij/ (only when physically mounted), not /Users/pd/Obsidian/Włóczykij/ (which becomes optional M1-disk mirror).

Full architecture + 6 open operator questions in issue #180.

Recommend: keep this issue (#178) as Phase 08+ scope ticket for vault_roots + one-way sync semantics. Issue #180 adds Phase 08+ scope ticket for hardware-tier storage. Both are needed; both apply to Włóczykij; #180 narrows storage location decision.

**Role:** advisor (claude) **Intent:** cross-link **Needs owner:** no Operator voice-note 2026-05-11 07:45 + image IMG_9781.HEIC introduced a hardware-encryption tier for Włóczykij: **Kingston IronKey Keypad 200C 16GB** as canonical Tier 2 storage (purchased Black Friday 2025, sitting unused awaiting setup). This **supersedes the storage location** assumption in this issue. Canonical Włóczykij is at `/Volumes/IRONKEY/Włóczykij/` (only when physically mounted), not `/Users/pd/Obsidian/Włóczykij/` (which becomes optional M1-disk mirror). Full architecture + 6 open operator questions in issue #180. Recommend: keep this issue (#178) as **Phase 08+ scope ticket for vault_roots + one-way sync semantics**. Issue #180 adds **Phase 08+ scope ticket for hardware-tier storage**. Both are needed; both apply to Włóczykij; #180 narrows storage location decision.
Collaborator

M10 disposition: moved to 10 - Improvements.

What this is: Włóczykij second-tier curated vault.

Why parked here: Parked in M10 because it is product/safety architecture for future curated storage, not part of the immediate DR/secrets closeout path.

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.

M10 disposition: moved to `10 - Improvements`. What this is: Włóczykij second-tier curated vault. Why parked here: Parked in M10 because it is product/safety architecture for future curated storage, not part of the immediate DR/secrets closeout path. 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.
Collaborator

Closing as superseded/completed by the current Wloczykij implementation and ADR-0023.

Evidence checked read-only:

  • /Users/pd/Obsidian/Włóczykij exists locally and contains the vault structure.
  • rs2000:/srv/obsidian/Włóczykij exists.
  • rs2000:/srv/obsidian/Włóczykij-runtime exists for the runtime mirror path.
  • modules/obsidian-headless-wloczykij/module.yaml is active and declares the rs2000 gold-vault boundary.
  • ADR-0023 defines Wloczykij as the gold vault and explicitly forbids raw OpenClaw mounting.

Remaining related improvement stays in #180 / M10: IronKey / physical tier work.

Closing as superseded/completed by the current Wloczykij implementation and ADR-0023. Evidence checked read-only: - `/Users/pd/Obsidian/Włóczykij` exists locally and contains the vault structure. - `rs2000:/srv/obsidian/Włóczykij` exists. - `rs2000:/srv/obsidian/Włóczykij-runtime` exists for the runtime mirror path. - `modules/obsidian-headless-wloczykij/module.yaml` is active and declares the rs2000 gold-vault boundary. - ADR-0023 defines Wloczykij as the gold vault and explicitly forbids raw OpenClaw mounting. Remaining related improvement stays in #180 / M10: IronKey / physical tier work.
codex closed this issue 2026-05-29 16:36:32 +02:00
Sign in to join this conversation.
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
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform#178
No description provided.