Phase KIT-PRESERVE-SHARED-ASSETS — ok init --preserve-shared-assets
Status: Reviewed → pass (PSA-r1) + Build verified → pass (PSA-BV-r1).
Implements the consumer-owned shared-asset preserve path so init --migrate --force
stops clobbering bridge scripts (MUSE-BRIDGE-WORKFLOW.md, scripts/muse-bridge-deploy.sh)
and other non-living footprint files the consumer already customized.
phase: KIT-PRESERVE-SHARED-ASSETS
outputs:
- id: preserve-shared-assets
path: docs/archive/phases/PHASE-PRESERVE-SHARED-ASSETS.md
frozen: true
frozen_inputs:
- id: k6-migrate-preserve
path: docs/archive/phases/PHASE-K6-PILOT-INSTALL-MATRIX.md
- id: k7-bridge-footprint
path: docs/archive/phases/PHASE-K7-MUSE-GIT-MIRROR-DOGFOOD.md
- id: kit-spec-cli
path: docs/OVERSEER-KIT-SPEC.md#5
- id: test-tiers
path: policy/test-tiers.yaml
- id: decision-tiers
path: policy/tiers.yaml
- id: scooling-product-order
path: ~/scooling/docs/ROADMAP.md
review_stamp:
reviewed_at: '2026-07-30T17:09:41Z'
verdict: pass
reviewer_mode: agent
reviewer_model: thinking-high
reviewer_provider: local
kit_version: 0.1.0
artifact_digest: sha256:c8f1eacc6f0833997e79810eb37d65f65d62d9c39033c1b5f2fd97b4b467a02c
Incident (ground truth): Knowtation init --migrate --force (2026-07-26) overwrote
consumer bridge assets with kit templates. Living docs were preserved (§K6.4); shared assets
were not. Operator restored bytes and marked origin: preserved by hand; footprint mismatch
remains intentional until this flag lands.
Review record (§6.2): every freeze-review finding MUST cite file+line per SPEC §6; uncited
findings are invalid and are discarded. Fixes applied during the loop are Tier 1 (feature branch);
merge to main is Tier 3 and is never part of this loop.
§PSA.0 — Simple summary
When a repo already has its own bridge scripts (or other kit shared files), install must be
able to keep those files instead of replacing them with kit copies — even when --force is
used for the rest of the install.
Technical summary: add ok init --preserve-shared-assets. Under migrate (and greenfield
conflict handling), differing non-living footprint destinations are classified
preserved, locked origin: preserved, and never byte-written unless
--force --include-preserved promotes them. Default (flag absent) behavior stays unchanged.
§PSA.1 — Scope
In scope:
- Argparse flag
--preserve-shared-assetsonok initonly. - Migrate classification change for non-living footprint rows (§PSA.3).
- Greenfield init: when the flag is set, differing existing shared assets are preserved
instead of conflict/refuse or
--forceoverwrite (§PSA.4). - Lock
origin: preserved+ kit-only digest exclusion (reuse §K6.4 machinery). - Seven-tier tests (§PSA.8).
- Kit ROADMAP + HANDOVER update; no live consumer re-init in this phase.
Out of scope (explicit non-goals):
- Changing default migrate/
--forcebehavior when the flag is absent. - New
syncflag (onceorigin: preserved, existing sync retain rules apply). upgrade-regimeflag changes (keeps its own--forcebridge overwrite contract).- Live Knowtation/Scooling re-init (operator-gated; Tier 3).
- Redesign of living-doc preserve /
--include-preservedpromotion. - Blocking KN-R2 semantic updates (KN-R2 PASS still
updatedwithout--force).
§PSA.2 — Shared asset definition
A footprint destination is a shared asset when it is not in
living_doc_destinations(config) (handover / roadmap / coordination). Includes regime-
conditional bridge files (MUSE-BRIDGE-WORKFLOW.md, scripts/muse-bridge-deploy.sh) and
policy/cursor kit copies.
§PSA.3 — Migrate classification (additive)
Extend _classify_migrate for the shared-asset branch:
| Existing | Identical? | --preserve-shared-assets |
--force --include-preserved |
Class | Lock origin |
|---|---|---|---|---|---|
| absent | — | any | any | seed |
kit |
| present | yes | any | any | unchanged |
kit |
| present | no | set, promote false | — | preserved |
preserved |
| present | no | set | promote true | updated |
kit |
| present | no | unset | force true | updated (today) |
kit |
| present | no | unset | force false | conflict (today) |
— |
| KN-R2 PASS | no | any | — | updated |
kit |
--preserve-shared-assets alone (no --force) converts what would have been a shared-asset
conflict into preserved. With --force and the flag, differing shared assets stay
preserved (do not overwrite). Only --force --include-preserved promotes/overwrites
them (same escape hatch as living docs; pilot-forbidden for routine installs).
Living-doc rows are unchanged by this flag.
§PSA.4 — Greenfield init
When --preserve-shared-assets is set:
- Differing existing shared destinations are not listed as conflicts and are not
written; lock entries use on-disk bytes +
origin: preserved. - Without the flag: existing refuse/
--forceoverwrite behavior unchanged. - Living docs under greenfield remain as today (overwrite on
--force; conflict without).
§PSA.5 — Sync / footprint integrity
No sync code changes required when lock origin is preserved — §K6.4 retain-verbatim and
kit-only digest already apply. --check-footprint excludes origin: preserved from
integrity mismatch (shared or living).
§PSA.6 — CLI surface
ok init --preserve-shared-assets
Help text (exact intent): preserve existing differing shared assets (non-living footprint);
lock origin:preserved; with --force still does not overwrite them unless
--include-preserved.
§PSA.7 — Hard stops
- No live consumer
init/ re-init without operator authorization. - No secrets in commits, logs, or lock files.
- No feature→GitHub-
mainin consumers; kit merge tomainremains Tier 3 (SD-21 land hygiene may apply after BVpasswith no live flips). - Do not change default overwrite behavior when the flag is absent.
§PSA.8 — Seven-tier test matrix
| Tier | Cases |
|---|---|
| unit | Classification table rows; argparse accepts flag; unknown flag still exit 1; living-doc path unchanged with flag set; KN-R2 still updates under flag |
| integration | init --migrate --preserve-shared-assets keeps hand-tuned muse-bridge-deploy.sh + workflow; lock origin: preserved; --migrate --force --preserve-shared-assets same; without flag --migrate --force still overwrites |
| e2e | Fixture muse+git-mirror tree: migrate+force+preserve → status --check-footprint exit 0; default sync retains preserved bridge bytes |
| stress | Many differing shared assets (policy + cursor + bridge) all preserved in one migrate |
| data-integrity | Lock sha256 equals on-disk for preserved shared; kit-only digest excludes them; run-twice migrate identical |
| performance | Preserve path migrate completes under 5s on pilot footprint |
| security | Preserve path does not log file contents; path confinement unchanged; no secret tokens in report JSON |
§PSA.9 — Definition of Done
- Flag implemented per §PSA.3–§PSA.4
- Seven-tier §PSA.8 green
- Freeze review
pass+ build verificationpass - Kit
docs/ROADMAP.md+docs/OVERSEER-HANDOVER.mdupdated together - No live consumer re-init; no secrets
Review record
| Round | Reviewer | Verdict | Resolution |
|---|---|---|---|
| PSA-r1 | Freeze checklist + thinking (thinking-high) |
pass | Stamp sha256:c8f1eacc… (2026-07-30). C8 file+line discipline present; §PSA.0–§PSA.9 complete; no security/irreversible/real_money/gates_tier3 escalation. |
| PSA-BV-r1 | Build verification (thinking-high) |
pass | Flag + classify + greenfield preserve match §PSA.3–§PSA.4; seven-tier §PSA.8 28 green; evidence test_output sha256 b4f5cde617a78e2c95c9bcb1ebd17b273bf84a6841661ad30f6976d25f2d05b7. No live consumer re-init. |
Evidence (PSA-BV-r1)
| type | sha256 | ref | notes |
|---|---|---|---|
| test_output | b4f5cde617a78e2c95c9bcb1ebd17b273bf84a6841661ad30f6976d25f2d05b7 | §PSA.8 seven-tier (28 passed) | unit+integration+e2e+stress+data-integrity+performance+security |