hosystem Engagements

ho-06.1 — The Workshop: responsiveness and honest feedback

created 2026-07-10
status complete
type ho-document
project sharibako
ho 06.1
kamae 5
shape ha
splits-from ho-06
agent-tasks
  • Ho-06.1-AT-01.md
  • Ho-06.1-AT-02.md
  • Ho-06.1-AT-03.md

Make the shipped Workshop responsive and honest. This carries the full followup list from ho-05's gate (ho-05 ): async scan/materialize with scan-result caching — the one ratified ho-05 premise that failed — plus waymarking, status announce, reveal ergonomics, and creation feedback. Nothing here is new capability; everything makes what already shipped visible, honest, and non-blocking.

The ho-06 split. K4 planned ho-06 as a single polish ho and flagged it as the densest in the project. The ho-05 gate added this second list. Ratified split, three ways:

K4's ho-06 entry needs this split recorded — an overview revision, flagged for a ho-kamae-4-overview-collaborator pass, not edited from this session.

Relief valve. If this ho spills a session, -03 (reveal ergonomics + dialog windows) is the pre-declared drop: it moves whole to the front of ho-06.2. AT-01 and AT-02 do not split further.

Out of scope:

Resolves deferred decisions:


Phase 1 — Think

Six decisions, ratified 2026-07-10. The heaviest is Decision 1; Decisions 3–6 lean on the state it creates.

Decision 1 — Concurrency: a VaultWorker actor; long operations become async intents

The property the synchronous posture provided for free — one vault operation at a time, no concurrent mutation of vault files — must survive the move off-main. Three shapes were weighed:

Materializer and VaultCore are already Sendable structs — values cross to the worker without any Core changes. Touch ID / age-key acquisition stays on the main actor (it is user interaction, not CPU work); only the handle's URL crosses. Fast single-file operations — reveal, add, rotate, — stay synchronous: ho-05's Reflect confirmed the premise holds there. sync moves too: git push/pull is network I/O and beach-balls exactly like scans, just gated on network speed — the code read surfaced this even though the Reflect list named only scans.

While activity is non-nil, the toolbar's action buttons disable and the status surface shows progress. Two rapid clicks serialize; they cannot interleave.

Decision 2 — Scan cache: in-memory, session-lifetime, populated at launch

materializeSelectedScope today re-walks the entire scan root to find one scope's marker. The cache: WorkshopModel holds the scan report in memory, populated by a non-blocking async scan at launch (the window opens immediately; the scan fills in behind it) and refreshed by Rescan. Materialize resolves its marker from the cache; a cache miss (marker moved or deleted externally) falls back to one fresh scan before erroring. Nothing persists to disk — markers change externally, and a persisted cache would lie across sessions. This cache also feeds waymarking's jump-to-directory button now and ho-06.2's glyphs later.

Three pieces, answering the gate's "which repo am I on":

Decision 4 — Status announce: pulse, alignment, visible labels, honest icon

The status surface exists (ho-05's statusMessage); this makes it announce. A brief green background pulse when statusMessage changes, red when errorMessage does — the text stays, no auto-clear timer. The status line's left edge aligns with the sidebar column instead of spanning the window. Toolbar buttons show always-visible titles (hover tooltips failed the operator at the gate). Rescan's magnifyingglass icon is replaced with one that reads as re-scan, not search — execution picks the symbol.

Decision 5 — Reveal ergonomics: 5-minute Touch ID reuse, .env preview, honest fields

Decision 6 — Creation announces; Add dialogs become auxiliary windows

Discovery (deferred to execution)


Phase 2 — Execute

Branch ho-06.1 off main. Three agent tasks, executed and verified in order — AT-02's jump button reads AT-01's cache; AT-03 closes with the gate.

Ho-06.1-AT-01 — Concurrency foundation: VaultWorker, async intents, scan cache

The actor; rescan/materializeSelectedScope/sync become async with a published activity state and progress UI; launch-time non-blocking scan; cache-based marker resolution with one-fresh-scan fallback (Decisions 1–2). Model: claude-opus-4-8. → /agent-tasks/Ho-06.1-AT-01.md

Verifiable: a deep scan root no longer beach-balls the window — the UI stays interactive during scan/materialize/sync; materialize resolves from cache without re-walking; rapid action clicks serialize.

Ho-06.1-AT-02 — Waymarking + status announce

Conduit.remoteURL() with unit tests; sidebar footer; detail-pane marker target; jump-to-directory toolbar block left of Sync; green/red status pulse; sidebar-aligned status line; visible toolbar labels; honest Rescan icon; creation announces (Decisions 3–4, 6-announce). Model: claude-sonnet-4-6. → ho-process/agent-tasks/Ho-06.1-AT-02.md

Verifiable: the window names its vault and remote; a selected scope shows its marker target and jumps to it in Finder; every action and creation visibly concludes with a pulse.

Ho-06.1-AT-03 — Reveal ergonomics + dialog windows

Shared LAContext with the 5-minute reuse window; Materializer.preview with unit tests; the .env preview sheet; secure-field eye toggle; rotate prefill-only-when-revealed; Add sheets → auxiliary windows (Decisions 5, 6-windows). Model: claude-sonnet-4-6. → ho-process/agent-tasks/Ho-06.1-AT-03.md

Verifiable: two reveals inside five minutes cost one Touch ID; the preview matches sharibako materialize output byte-for-byte without writing; Add windows move and the main window stays live. Then the gate.

Testing and iteration approach

Per task, the rhythm: swift package clean && swift test directly (clean→build→test still trips the known SwiftPM incremental-link bug after SharibakoCore changes) → swift build -Xswiftc -warnings-as-errorsswift-format lint --strict --recursive Sources Testsswiftlint lint --strict → coverage ≥90%. New branching logic lives tested in WorkshopModel; VaultWorker is headlessly drivable and carries coverage; new View files join ci.yml's named-EXCLUDED regex with justification comments, the established convention. The LAContext cache lives in the already-excluded Keychain adapter file (dogfood-only, like the rest of it).

Tests never touch live user state — the injected-home/injected-roots seams are airtight after the ho-05 config-leak fix; every new test that reads or writes config or scan roots goes through injection. The launch scan in tests runs against injected temp roots only.

Day-to-day iteration runs unsigned against the file-based age key (SHARIBAKO_AGE_KEY); the signed build is produced once, at AT-03's gate.

Done means

Verification and the dogfood gate

  1. The rhythm above, green, on the ho-06.1 branch.
  2. Dogfood gate (signed install + Touch ID) — clean release build, install via scripts/install.sh (the ~/.local path-shadow gotcha applies: verify the installed binary is the fresh one), real vault, real Keychain:
    • Open the Workshop with the production scan root configured. The window is interactive immediately; the launch scan completes in the background — no beach ball at any point, including materialize and sync.
    • Reveal a secret via Touch ID; reveal a second within five minutes — no second prompt. After the window lapses, a reveal prompts again.
    • The sidebar footer names the production vault and the sageframe-irori/sharibako-vault remote correctly.
    • Jump-to-directory opens Finder at the selected scope's marker directory.
    • "Preview .env" for a real scope matches sharibako materialize output for the same scope, and writes nothing.
    • An Add window moves; the main window scrolls and selects behind it; a created shared entry announces in the status surface with the pulse. Not done until this passes.

Phase 3 — Reflect

Executed 2026-07-10: three agent tasks (AT-01 Opus 4.8; AT-02/03 Sonnet 4.6) driven sequentially by a Fable orchestrator, plus one orchestrator-authored gate-fix round. The session hosting AT-02's first agent crashed mid-run; the agent's uncommitted work survived in the tree, compiled, and a fresh agent audited it item-by-item against the spec and completed it — the recovery cost one relaunch, no rework.

Closing this ho

Closing = fill this Reflect + flip status: complete + write the to the project's K6 (ho-process/kamae-6-sharibako-state-memory.md) + append a build-record entry to K4 (ho-process/kamae-4-sharibako-ho-overview.md). The block, verbatim labels and order:

STATE-SUMMARY


Appendix — fresh-session bootstrap

To execute this ho in a new Claude Code session, load and run:

Execute ho-06.1 (Think is ratified — do NOT relitigate the decisions,
especially Decision 1: VaultWorker actor, WorkshopModel stays @MainActor, and
zero CLI files change). Read:
  @ho-process/hos/ho-06.1-workshop-responsiveness.md   (this doc — the plan)
  @ho-process/agent-tasks/Ho-06.1-AT-01.md             (concurrency foundation)
  @ho-process/agent-tasks/Ho-06.1-AT-02.md             (waymarking + announce)
  @ho-process/agent-tasks/Ho-06.1-AT-03.md             (reveal + windows)
  @Sources/Sharibako/WorkshopModel.swift
  @Sources/Sharibako/Views/WorkshopWindow.swift
  @Sources/Sharibako/Support/GUIAgeKeyProvider.swift
  @Sources/SharibakoCore/Materializer.swift  @Sources/SharibakoCore/Conduit.swift
  @CLAUDE.md  @~/.claude/modules/languages-swift.md    (conventions)

Execute AT-01 → AT-02 → AT-03 in order (AT-02 reads AT-01's cache). Run
`swift package clean && swift test` directly — never clean→build→test.
Verify each task with the full rhythm; close the ho with the signed-install +
Touch-ID dogfood gate. Branch ho-06.1 off main; PR-based. Do not sign commits
or PRs.

Authored 2026-07-10 (Think ratified same day, split from K4's planned ho-06 at opening). Execution and Reflect: pending.

Rendered from the corpus, verbatim · source on GitHub →

ingested: sharibako @ 75a79d08a2b3 · ho-system @ 0f93b7fa32f7 · the glossary · the colophon