@msn-control/liftoff 0.11.1 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/DEVELOPER.md +28 -10
  2. package/README.md +11 -6
  3. package/dist/adapters/filesystem/project-transaction.d.ts +2 -1
  4. package/dist/adapters/filesystem/project-transaction.js +25 -6
  5. package/dist/adapters/filesystem/project-transaction.js.map +1 -1
  6. package/dist/adapters/filesystem/reviewed-update-transaction.d.ts +53 -0
  7. package/dist/adapters/filesystem/reviewed-update-transaction.js +864 -0
  8. package/dist/adapters/filesystem/reviewed-update-transaction.js.map +1 -0
  9. package/dist/adapters/filesystem/update-previews.d.ts +50 -0
  10. package/dist/adapters/filesystem/update-previews.js +613 -0
  11. package/dist/adapters/filesystem/update-previews.js.map +1 -0
  12. package/dist/adapters/process/shell-command.d.ts +1 -0
  13. package/dist/adapters/process/shell-command.js +7 -1
  14. package/dist/adapters/process/shell-command.js.map +1 -1
  15. package/dist/application/context.d.ts +5 -0
  16. package/dist/application/diagnose/doctor.js +9 -15
  17. package/dist/application/diagnose/doctor.js.map +1 -1
  18. package/dist/application/update/approval.d.ts +39 -0
  19. package/dist/application/update/approval.js +54 -0
  20. package/dist/application/update/approval.js.map +1 -0
  21. package/dist/application/update/command-guidance.d.ts +2 -0
  22. package/dist/application/update/command-guidance.js +14 -0
  23. package/dist/application/update/command-guidance.js.map +1 -0
  24. package/dist/application/update/inspection.d.ts +37 -0
  25. package/dist/application/update/inspection.js +235 -0
  26. package/dist/application/update/inspection.js.map +1 -0
  27. package/dist/application/update/migration-runtime.d.ts +14 -0
  28. package/dist/application/update/migration-runtime.js +178 -0
  29. package/dist/application/update/migration-runtime.js.map +1 -0
  30. package/dist/application/update/output.d.ts +134 -0
  31. package/dist/application/update/output.js +182 -0
  32. package/dist/application/update/output.js.map +1 -0
  33. package/dist/application/update/preview.d.ts +49 -0
  34. package/dist/application/update/preview.js +220 -0
  35. package/dist/application/update/preview.js.map +1 -0
  36. package/dist/application/update/protected-source.d.ts +25 -0
  37. package/dist/application/update/protected-source.js +81 -0
  38. package/dist/application/update/protected-source.js.map +1 -0
  39. package/dist/application/update/reporting.d.ts +4 -4
  40. package/dist/application/update/reporting.js +14 -13
  41. package/dist/application/update/reporting.js.map +1 -1
  42. package/dist/application/update/revalidation-plan.d.ts +22 -0
  43. package/dist/application/update/revalidation-plan.js +108 -0
  44. package/dist/application/update/revalidation-plan.js.map +1 -0
  45. package/dist/application/update/revalidation.d.ts +70 -0
  46. package/dist/application/update/revalidation.js +337 -0
  47. package/dist/application/update/revalidation.js.map +1 -0
  48. package/dist/application/update/review-plan.d.ts +25 -0
  49. package/dist/application/update/review-plan.js +89 -0
  50. package/dist/application/update/review-plan.js.map +1 -0
  51. package/dist/application/update/transaction-approval.d.ts +29 -0
  52. package/dist/application/update/transaction-approval.js +82 -0
  53. package/dist/application/update/transaction-approval.js.map +1 -0
  54. package/dist/application/update/use-case.d.ts +1 -0
  55. package/dist/application/update/use-case.js +240 -569
  56. package/dist/application/update/use-case.js.map +1 -1
  57. package/dist/application/update/write-plan.d.ts +15 -0
  58. package/dist/application/update/write-plan.js +115 -0
  59. package/dist/application/update/write-plan.js.map +1 -0
  60. package/dist/cli/args/definitions.js +5 -4
  61. package/dist/cli/args/definitions.js.map +1 -1
  62. package/dist/cli/args/help.js +13 -1
  63. package/dist/cli/args/help.js.map +1 -1
  64. package/dist/cli/args/parser.js +22 -7
  65. package/dist/cli/args/parser.js.map +1 -1
  66. package/dist/cli/commands/update.js +1 -0
  67. package/dist/cli/commands/update.js.map +1 -1
  68. package/dist/domain/governance/policy/identity.d.ts +1 -1
  69. package/dist/domain/governance/policy/identity.js +2 -2
  70. package/dist/domain/governance/policy/identity.js.map +1 -1
  71. package/dist/domain/project/infrastructure-layout.d.ts +1 -1
  72. package/dist/domain/project/infrastructure-layout.js +2 -1
  73. package/dist/domain/project/infrastructure-layout.js.map +1 -1
  74. package/dist/domain/project/reviewed-update-artifacts.d.ts +2 -0
  75. package/dist/domain/project/reviewed-update-artifacts.js +3 -0
  76. package/dist/domain/project/reviewed-update-artifacts.js.map +1 -0
  77. package/dist/generators/common/base.js +5 -1
  78. package/dist/generators/common/base.js.map +1 -1
  79. package/dist/governance-activation/activation-state.js +4 -1
  80. package/dist/governance-activation/activation-state.js.map +1 -1
  81. package/dist/governance-activation/commands.d.ts +5 -0
  82. package/dist/governance-activation/commands.js +65 -3
  83. package/dist/governance-activation/commands.js.map +1 -1
  84. package/dist/governance-activation/compatibility.d.ts +21 -4
  85. package/dist/governance-activation/compatibility.js +47 -8
  86. package/dist/governance-activation/compatibility.js.map +1 -1
  87. package/dist/governance-activation/doctor.js +32 -5
  88. package/dist/governance-activation/doctor.js.map +1 -1
  89. package/dist/governance-activation/historical-state.d.ts +81 -0
  90. package/dist/governance-activation/historical-state.js +817 -0
  91. package/dist/governance-activation/historical-state.js.map +1 -0
  92. package/dist/governance-activation/history-contracts.d.ts +109 -0
  93. package/dist/governance-activation/history-contracts.js +303 -0
  94. package/dist/governance-activation/history-contracts.js.map +1 -0
  95. package/dist/governance-activation/inputs.d.ts +2 -0
  96. package/dist/governance-activation/inputs.js +13 -1
  97. package/dist/governance-activation/inputs.js.map +1 -1
  98. package/dist/governance-activation/migration-history.d.ts +97 -0
  99. package/dist/governance-activation/migration-history.js +388 -0
  100. package/dist/governance-activation/migration-history.js.map +1 -0
  101. package/dist/governance-activation/migration.js +1 -1
  102. package/dist/governance-activation/migration.js.map +1 -1
  103. package/dist/governance-activation/proof-records.d.ts +3 -0
  104. package/dist/governance-activation/proof-records.js +78 -0
  105. package/dist/governance-activation/proof-records.js.map +1 -0
  106. package/dist/governance-activation/read-only.d.ts +4 -4
  107. package/dist/governance-activation/read-only.js +9 -69
  108. package/dist/governance-activation/read-only.js.map +1 -1
  109. package/dist/governance-activation/seed-lifecycle.d.ts +28 -6
  110. package/dist/governance-activation/seed-lifecycle.js +258 -25
  111. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  112. package/dist/governance-activation/transition-planning.d.ts +2 -0
  113. package/dist/governance-activation/transition-planning.js +12 -3
  114. package/dist/governance-activation/transition-planning.js.map +1 -1
  115. package/dist/governance-activation/transitions.d.ts +8 -2
  116. package/dist/governance-activation/transitions.js +36 -11
  117. package/dist/governance-activation/transitions.js.map +1 -1
  118. package/dist/governance-assessment/engine.js +30 -3
  119. package/dist/governance-assessment/engine.js.map +1 -1
  120. package/dist/governance-assessment/project.d.ts +7 -0
  121. package/dist/governance-assessment/project.js +44 -4
  122. package/dist/governance-assessment/project.js.map +1 -1
  123. package/dist/repository-governance.js +25 -12
  124. package/dist/repository-governance.js.map +1 -1
  125. package/docs/cli-reference.md +101 -28
  126. package/docs/configuration-and-manifests.md +27 -15
  127. package/docs/existing-repositories.md +19 -10
  128. package/docs/repository-governance.md +9 -5
  129. package/docs/safety-and-consent.md +27 -18
  130. package/docs/troubleshooting.md +9 -7
  131. package/docs/workloads.md +5 -4
  132. package/package.json +1 -1
@@ -119,11 +119,21 @@ Governance JSON uses versioned objects and includes the complete activation
119
119
  version vector: creating Liftoff version, manifest artifact version 7, policy
120
120
  version 6, activation-contract version 2, state/evidence-header/approval schema
121
121
  versions 2, graph/supersession/credential schema versions 1, and the phase-graph
122
- hash. Compatibility metadata is version 2. It never
122
+ hash. Compatibility metadata is version 3. It never
123
123
  emits a setup-skill version. Future identities, unsupported compatibility
124
124
  tuples, and unrecognized graph hashes block without rewriting state; the remedy
125
125
  names the exact field and required Liftoff upgrade. Known v1 history is
126
- diagnostic-only and byte-preserved; no automatic reconciliation command exists.
126
+ diagnostic-only and byte-preserved; a supported successor requires
127
+ `liftoff update --check` and explicit approval, not automatic reconciliation.
128
+
129
+ Status, resume, and verify JSON include `migration` (the validated journal, or
130
+ `null`) and `migrationSummary`. The summary separates `localCommit`, validated
131
+ snapshot/index/successor linkage, recorded `revalidation`, `nextRecordedPhase`,
132
+ and a project-bound fresh-preview remedy. `currentProofRequired` is always
133
+ true: recorded completion is audit history, not current evidence or provider
134
+ authority. Human output presents the same migration progress separately from
135
+ readiness; stale current proof still blocks even when the journal says complete.
136
+ These inspection commands neither advance phases nor create preview receipts.
127
137
 
128
138
  `/liftoff-setup` calls these commands instead of inferring phase completion from
129
139
  prose or task checkboxes.
@@ -256,16 +266,28 @@ object.
256
266
  ## Update modes
257
267
 
258
268
  ```bash
269
+ liftoff update --check
259
270
  liftoff update
260
271
  liftoff update --force
261
- liftoff update --json
262
- liftoff update --check
263
272
  liftoff update --check --json
273
+ liftoff update --approve-plan <fingerprint> --json
264
274
  ```
265
275
 
266
- Plain `liftoff update` is imperative and prompt-free. It applies safe new,
267
- missing, untouched-upgrade, clean-move, and recorded-state changes only for
268
- explicit `managed-core` artifacts. For manifest v7 this includes governance
276
+ `liftoff update --check` is the human-first compatibility and migration preview.
277
+ It changes no project bytes, but saves and discloses a project-bound preview
278
+ receipt in user-local storage outside the repository. A receipt is not approval.
279
+ `liftoff update` requires a matching preview, recomputes its effective plan, and
280
+ asks for explicit approval with a negative default. Missing or stale previews
281
+ stop with instructions to rerun check. No-op inspection requires no approval.
282
+
283
+ Noninteractive apply additionally requires the exact full plan fingerprint
284
+ through `--approve-plan`. Check and apply must share the same materialized
285
+ checkout and user-local storage; another runner, worktree, or moved project
286
+ needs a fresh check and approval. `--force`, `--json`, and a generic yes do not
287
+ waive these gates. The force variant has its own preview and fingerprint.
288
+
289
+ Approved apply retains safe new, missing, untouched-upgrade, clean-move, and
290
+ recorded-state changes only for explicit `managed-core` artifacts. For manifest v7 this includes governance
269
291
  policy, context, guide, phase graph, compatibility metadata, credential-policy
270
292
  schema, and selected-agent `/liftoff-setup` integrations. Core conflicts are
271
293
  skipped and core orphans are reported without deletion. During legacy governance
@@ -288,22 +310,71 @@ recreates or deletes project files.
288
310
  New environments also require recorded independent-root infrastructure and safe
289
311
  existing shared-module files. Legacy/shared or unknown layout produces a
290
312
  component-level migration-required result; other safe managed-core work may
291
- continue. Force cannot migrate state or rewrite shared infrastructure.
313
+ continue. Force cannot migrate infrastructure state or rewrite shared infrastructure.
314
+ New component provisioning is deferred during activation-v1 migration and needs
315
+ a fresh post-migration preview.
292
316
 
293
317
  Use `--check` whenever no project bytes may change. Human check mode prints
294
318
  managed-core drift, ownership-only manifest v2-v7 migration, activation-identity
295
- compatibility, reconciliation-required state, and authorized provisioning. It
296
- recommends `--force` only for core conflicts. `--check --force` is invalid
297
- because check mode never authorizes writes.
298
-
299
- `--json` selects output format, not safety. `liftoff update --json` applies safe
300
- changes and emits the versioned apply result. `liftoff update --check --json`
301
- is the read-only automation gate.
302
-
303
- Update never installs dependencies. Transaction snapshots restore a failed
304
- core update, but Liftoff retains no backup after a successful core overwrite.
305
- Force cannot bypass the ownership, project-boundary, symlink, structural,
306
- identity, or manifest guards.
319
+ compatibility, history preservation, revalidation gaps, and authorized
320
+ provisioning. It recommends `--force` only for eligible owned core conflicts
321
+ and displays the additional exact changes and fingerprint separately.
322
+ `--check --force` remains invalid because check mode never authorizes overwrites.
323
+
324
+ `--json` selects output format, not safety or consent. Update JSON uses schema 3
325
+ with project-update scope and separate core, provisioning, activation-migration,
326
+ and revalidation outcomes. Prompts and progress use stderr; stdout remains one
327
+ JSON result. Check exits 0 for no actionable work, 2 for differences, and 1 for
328
+ errors. Apply exits 0 for completed scope, 2 when migration committed but
329
+ revalidation is incomplete, and 1 for rejected approval or an error.
330
+
331
+ Update never installs dependencies. Ordinary transaction backups are for failure
332
+ recovery; activation migration additionally retains durable original history.
333
+ Force cannot bypass preview, approval, ownership, project-boundary, symlink,
334
+ structural, identity, or manifest guards.
335
+
336
+ ### Preview receipt storage
337
+
338
+ Check reports the exact native receipt path. Receipts and separate transaction
339
+ approval records use user-local storage, never the project or its containing
340
+ repository:
341
+
342
+ | Platform | Receipt directory |
343
+ | --- | --- |
344
+ | Linux | `$XDG_STATE_HOME/liftoff/update-previews` when `XDG_STATE_HOME` is set to an absolute path; otherwise, when unset, `$HOME/.local/state/liftoff/update-previews` |
345
+ | macOS | `~/Library/Application Support/liftoff/update-previews` |
346
+ | Windows | `%LOCALAPPDATA%\liftoff\update-previews` when `LOCALAPPDATA` is set to an absolute drive or UNC path; otherwise, when unset, `%USERPROFILE%\AppData\Local\liftoff\update-previews` |
347
+
348
+ An empty or relative override is an error, not a request to use the fallback.
349
+ Unsafe paths, links/junctions, or storage inside the project or repository also
350
+ block the update; repair the reported storage issue rather than moving a receipt
351
+ into the project. Commands containing spaces or shell metacharacters use literal
352
+ native-shell quoting and retain the selected project path.
353
+
354
+ The immutable history snapshot travels inside the project. Preview receipts and
355
+ approval records do not: another machine, checkout, worktree, or moved project
356
+ needs its own fresh check and approval. A receipt stores digests, not project
357
+ source bodies, and is never portable blanket authorization.
358
+
359
+ ### Reviewed activation-v1 migration
360
+
361
+ An exact supported v1 source can be previewed with `liftoff update --check`.
362
+ Approved update verifies an immutable in-project history snapshot before
363
+ replacing active records, then creates a linked strict v2 activation. Historical
364
+ state, evidence, plans, approvals, and source metadata retain their original
365
+ bytes under the dedicated governance history directory. History is not managed
366
+ core and is never automatically committed, pushed, or cleaned with receipts.
367
+
368
+ Fresh local revalidation does not translate old success flags or approvals.
369
+ It uses only the finite reviewed local operations and stops before provider
370
+ access, dependency installation, publication, or other independently approved
371
+ work. Validation commands execute project-controlled code, not a sandbox;
372
+ unexpected protected-input edits are preserved and reported.
373
+
374
+ A failed local transaction uses bounded recovery. A failure after commit keeps
375
+ v2 blocked and resumable: repair the named cause, rerun check, then approve the
376
+ remaining work. Do not reset state to v1, change identity fields manually, or
377
+ recreate live resources to silence readiness diagnostics.
307
378
 
308
379
  New dependency, runtime, container, database, application, and infrastructure
309
380
  templates apply to newly generated projects. Existing
@@ -330,10 +401,10 @@ All current writes use v7. Supported historical reads are normalized through an
330
401
  explicit compatibility map; future versions, individually known but unsupported
331
402
  tuples, and unknown phase-graph hashes block and report an upgrade or
332
403
  reconciliation remedy instead of downgrading or fabricating evidence.
333
- Exact known activation-v1 identity is readable for diagnostics. A
334
- `diagnosticOnly` historical-state result can coexist with managed-core maintenance,
335
- which preserves the historical identity, state, and receipts and does not make
336
- them executable.
404
+ Exact known activation-v1 identity remains non-executable. The explicitly
405
+ supported reviewed successor lane preserves that original history while
406
+ establishing new v2 state and fresh proof; merely reading a historical identity
407
+ or updating a core file does not perform or authorize the migration.
337
408
 
338
409
  ## Development and infrastructure helpers
339
410
 
@@ -370,8 +441,9 @@ liftoff update --check --json
370
441
  ```
371
442
 
372
443
  Each JSON object has a top-level numeric `schemaVersion`. Update JSON uses
373
- schema version 2 and includes `scope: "managed-core"`, ownership-migration
374
- state, activation compatibility, and a separate provisioning collection.
444
+ schema version 3 and `scope: "project-update"`, with separate managed-core,
445
+ provisioning, activation-migration, and revalidation outcomes plus preview and
446
+ approval status. A committed migration does not imply governance readiness.
375
447
  Operational warnings, such as a dirty-worktree warning before JSON apply, are
376
448
  written to stderr so stdout remains one parseable JSON object.
377
449
 
@@ -379,8 +451,9 @@ Exit codes:
379
451
 
380
452
  - `0`: success or a clean check.
381
453
  - `1`: invalid input, unsafe state, or command failure.
382
- - `2`: an explicit update check found core maintenance or provisioning, or upgrade check found an
383
- installable CLI release.
454
+ - `2`: update check found differences, update committed a migration but local
455
+ revalidation is incomplete, or upgrade check found an installable CLI release.
456
+ Governance assessment also uses 2 for partial or excepted results.
384
457
 
385
458
  Raw installer, framework, and dependency child stdout and stderr are forwarded
386
459
  unchanged.
@@ -197,7 +197,8 @@ policy, contract, schema, or graph identities remain invalid or blocked without
197
197
  rewrite.
198
198
 
199
199
  `liftoff update --check`, including `--check --json`, leaves an old manifest
200
- byte-for-byte unchanged. A successful plain update writes v7 only after the
200
+ byte-for-byte unchanged while disclosing an external preview receipt. An
201
+ explicitly approved update writes v7 only after the
201
202
  transaction succeeds. V2-v6 backend, frontend, database, dependency, container,
202
203
  environment, documentation, and infrastructure entries become
203
204
  project provenance without reading or changing current production bytes.
@@ -209,27 +210,38 @@ comparisons to infer execution safety.
209
210
 
210
211
  | Contract | Current version |
211
212
  | --- | --- |
212
- | CLI package version | 0.11.1 |
213
+ | CLI package version | 0.11.2 |
213
214
  | Activation package identity | 0.11.0 |
214
215
  | Manifest write / supported reads | 7 / 2-7 for API and GenAI |
215
216
  | Normative policy | 6 |
216
- | Activation contract, state, evidence header, approval envelope, compatibility metadata | 2 |
217
+ | Activation contract, state, evidence header, approval envelope | 2 |
218
+ | Compatibility metadata / supported historical input | 3 / 2 |
219
+ | Update report | 3 |
220
+ | Preview receipt, transaction approval, history index, migration journal | 1 |
217
221
  | Phase graph, supersession, credential policy | 1 |
218
222
  | Assessment report and control catalog | 1 |
219
223
 
220
- The 0.11.1 CLI patch retains the 0.11.0 activation identity because its phase
224
+ The 0.11.2 CLI patch retains the 0.11.0 activation identity because its phase
221
225
  semantics and graph are unchanged. Independent infrastructure provenance
222
- explicitly recognizes both generation versions; unknown releases are not
223
- automatically trusted or treated as compatible.
224
-
225
- Known activation-v1 history remains readable but **diagnostic-only**, not
226
- executable proof. Managed-core maintenance can continue without rewriting user-owned
227
- historical identity, state, or receipts. A readable historical manifest cannot
228
- bootstrap current activation or authorize provider scope, even when no state
229
- file exists or a separate current state is supplied. No automatic conversion, reset, or public
230
- historical reconciliation workflow is provided. Future/mixed tuples, ad hoc
231
- state, and unknown graph hashes remain blocked. No reader converts prose,
232
- filenames, checked tasks, or old placeholder digests into current evidence.
226
+ explicitly recognizes generation versions 0.11.0, 0.11.1, and 0.11.2, including
227
+ mixed component histories; unknown releases are not automatically trusted or
228
+ treated as compatible. The mandatory preview/approval workflow and schema-3
229
+ update reports are breaking CLI behavior despite the patch version.
230
+
231
+ Known activation-v1 history remains **diagnostic-only**, not executable proof.
232
+ Compatibility metadata v3 separately declares the exact history-preserving
233
+ successor lane available through `liftoff update --check` and explicitly
234
+ approved update. Schema-2 metadata remains readable input, not authority to
235
+ invent a migration. Future/mixed tuples, ad hoc state, and unknown graphs remain
236
+ blocked.
237
+
238
+ Migration preserves the original manifest, historical state and evidence, creates
239
+ strict v2 state, and links it through `governance/migration-state.json` to its
240
+ immutable `governance/history` snapshot. No required field is added to manifest
241
+ v7 or the v2 proof schemas. Original generation provenance remains intact.
242
+ A readable historical record never authorizes current provider scope; old
243
+ approvals and checked tasks do not become fresh evidence. Revalidation failure
244
+ after local commit leaves the linked v2 activation blocked and resumable.
233
245
 
234
246
  ## Artifact ownership
235
247
 
@@ -70,11 +70,16 @@ liftoff update --check
70
70
  liftoff update
71
71
  ```
72
72
 
73
- Use `--check` first when the invocation must be read-only. Plain update applies
74
- safe managed-core changes immediately and preserves core conflicts and orphans.
75
- `--force` can replace only listed core conflicts. Project-owned production
76
- files are not compared and remain unreachable from every update mode. For CI
73
+ Always run `--check` before a write-capable update. Check leaves project bytes
74
+ unchanged and discloses a user-local preview receipt outside the repository.
75
+ Plain update requires a matching preview and explicit approval of the exact
76
+ plan before applying safe managed-core changes; core conflicts and orphans stay
77
+ protected. `--force` requires separate approval of its previewed variant and
78
+ can replace only listed, owned core conflicts. Project-owned production
79
+ files are not compared with new templates or overwritten by update. For CI
77
80
  core-maintenance gates, use `liftoff update --check --json`.
81
+ See [preview receipt storage](cli-reference.md#preview-receipt-storage) for
82
+ platform-specific locations and checkout portability.
78
83
 
79
84
  OpenSpec skills and commands remain framework-owned. To give an existing
80
85
  project all 12 workflows as both skills and commands, run:
@@ -90,8 +95,9 @@ hosted Copilot agent later, update `githubCopilot.cloudAgent` through OpenSpec
90
95
  and run `openspec update`.
91
96
 
92
97
  Projects created before manifest artifact version 7 automatically preview the
93
- default deterministic setup handoff as new named drift. Plain update safely
94
- adopts collision-free policy, context, guide, phase graph, compatibility
98
+ default deterministic setup handoff as new named drift. After a matching check
99
+ and explicit approval, update safely adopts collision-free policy, context,
100
+ guide, phase graph, compatibility
95
101
  metadata, credential-policy schema, and selected-agent setup integrations
96
102
  without rewriting a configuration that omitted `governanceProfile`.
97
103
  Existing different files remain unowned conflicts and the v7 manifest records
@@ -107,10 +113,13 @@ canonical phase graph, private-runner credential contract, bootstrap-state
107
113
  retention/disposal contract, and active-change reconciliation before
108
114
  replacement. Updating the handoff never provisions Azure or GitHub resources;
109
115
  active downstream work must have supported identity and current evidence before
110
- it can execute. The CLI provides no public identity-acknowledgment or historical
111
- reconciliation workflow.
112
- Historical activation-v1 state and receipts are diagnostic-only, not
113
- automatically migrated or made executable by updating core files.
116
+ it can execute. Exact supported activation-v1 migration is previewed through
117
+ `liftoff update --check` and requires approval of that plan. Original state,
118
+ receipts, plans, approvals, and source metadata are retained in in-project
119
+ history before a linked v2 successor is created. Historical records stay
120
+ non-executable; updating a core file does not make them current proof.
121
+ Post-commit revalidation failure leaves v2 blocked and resumable. Unsupported
122
+ source formats and independent infrastructure migrations remain separate blockers.
114
123
 
115
124
  The manifest-v7 transition releases every legacy non-core artifact into project
116
125
  provenance without writing, restoring, moving, or deleting its path.
@@ -342,14 +342,18 @@ seed blocks Phase 0. Exactly one compatible active governance change is resumed.
342
342
  Multiple overlapping changes require a schema-valid supersession or archive
343
343
  record before any phase advances.
344
344
 
345
- Managed updates install new policy, graph, schema, compatibility metadata, and
346
- setup and assessment integrations without touching user-owned state. Forced update can remove
345
+ Reviewed managed updates install new policy, graph, schema, compatibility metadata,
346
+ and setup/assessment integrations without acquiring general state ownership.
347
+ Forced update can remove
347
348
  exact retired generated setup-alias entries from older manifests. When a policy,
348
349
  activation-contract, schema, or graph-hash change affects active work, status
349
350
  reports `reconciliation-required` and identifies affected descendants. Historical
350
- activation-v1 state and evidence stay byte-preserved and diagnostic-only under
351
- activation v2. This release has no automatic historical-state reconciliation,
352
- reset, or conversion workflow; do not acknowledge a new identity by editing JSON.
351
+ activation-v1 state and evidence remain byte-preserved and non-executable.
352
+ `liftoff update --check` can preview an exact supported successor migration;
353
+ explicitly approved apply preserves original history and creates linked v2 state.
354
+ Fresh local revalidation stops at unsupported or independently authorized work.
355
+ Failure after commit leaves v2 blocked/resumable, not reset to v1. Never
356
+ acknowledge an identity by editing JSON or treat old approvals as current consent.
353
357
 
354
358
  ## Private staging and bootstrap retention
355
359
 
@@ -117,10 +117,15 @@ Existing destination modes are preserved where supported, including POSIX 0600
117
117
  files. Windows does not provide equivalent POSIX mode-bit guarantees; this is
118
118
  not a promise to preserve all Windows ACLs or filesystem metadata.
119
119
 
120
- Plain `liftoff update` preflights every eligible managed-core or authorized
121
- create-only provisioning path and applies those writes, managed-core moves or
122
- deletes, and the manifest as one rollback-capable transaction. Schema upgrades
123
- are committed only after the other mutations succeed.
120
+ `liftoff update --check` presents compatibility and the exact proposed changes,
121
+ then discloses its external preview receipt without changing project bytes.
122
+ Apply requires that matching preview and explicit exact-plan approval. It
123
+ rechecks protected inputs under the project lock before writing. Noninteractive
124
+ approval uses `--approve-plan <fingerprint>`, not a generic yes.
125
+
126
+ The approved transaction preflights exact managed-core and create-only
127
+ provisioning paths separately from any explicitly authorized activation migration.
128
+ Schema/successor changes commit consistently with their manifest and history link.
124
129
 
125
130
  Managed update may install manifest v7, policy v6, activation-contract v2,
126
131
  phase graph, compatibility metadata, credential-policy schema, setup
@@ -130,17 +135,21 @@ immutable evidence, credential policies, active OpenSpec changes, and bootstrap
130
135
  retention/disposal records. If the current activation identity is future,
131
136
  unsupported, or graph-incompatible, update and setup block with a remedy instead
132
137
  of downgrading or rewriting state.
133
- Exact known historical v1 identity is a separate diagnostic-only case:
134
- safe managed-core maintenance may continue while preserving the recorded
135
- historical identity, state, and receipts. That maintenance never makes history
136
- executable or supplies a missing reconciliation workflow.
138
+ Exact known historical v1 can use the reviewed successor lane, not in-place
139
+ retagging. Original records are copied byte-for-byte into immutable in-project
140
+ history before their exact active paths are retired or replaced. A linked v2
141
+ activation obtains fresh evidence; historical approvals never become current
142
+ permission. Unavailable revalidation remains an explicit blocker.
137
143
 
138
144
  If automatic rollback itself cannot safely restore a path because another
139
145
  process changed it, Liftoff reports the incomplete rollback rather than
140
146
  overwriting unknown bytes.
141
147
 
142
- Update snapshots exist only for rollback after a failed transaction. Liftoff
143
- does not retain them as backups after success.
148
+ Ordinary transaction backups are for failed-write recovery. Activation history
149
+ is different: it remains after success and is never removed with disposable
150
+ preview receipts. A durable recovery journal must match a separately persisted
151
+ external transaction approval; a project-local claim alone cannot authorize
152
+ recovery. Post-commit revalidation failure preserves v2 and its historical link.
144
153
 
145
154
  Dependency execution has a different recovery boundary: installer scripts can
146
155
  write arbitrary project files, and a concurrent developer edit cannot be
@@ -154,12 +163,12 @@ literal-path recipe. This does not claim the entire scaffold was unchanged.
154
163
  Update mode is selected explicitly rather than from terminal interactivity:
155
164
 
156
165
  - Existing project artifacts are never compared with current template bytes.
157
- - Plain `liftoff update` immediately applies safe new, missing,
158
- untouched-upgrade, clean-move, and recorded-state changes only for exact
159
- managed-core artifacts.
160
- - `liftoff update --check` is read-only and performs no preflight or mutation.
161
- - `liftoff update --json` applies safe changes and returns an apply result;
162
- `liftoff update --check --json` is the read-only machine drift gate.
166
+ - Plain `liftoff update` applies the matching explicitly approved plan, retaining
167
+ safe managed-core classification and the separate migration/provisioning lanes.
168
+ - `liftoff update --check` changes no project bytes but saves and discloses a
169
+ preview receipt outside the repository.
170
+ - `--json` changes output formatting only; machine apply still requires the
171
+ matching preview and exact plan-fingerprint approval.
163
172
  - Managed-core developer edits are conflicts. Project edits are outside update.
164
173
  - Default update skips core conflicts and lists them by portable relative path.
165
174
  `liftoff update --force` extends authority only to those guarded core
@@ -179,8 +188,8 @@ Update mode is selected explicitly rather than from terminal interactivity:
179
188
  - Dependency definitions and locks are project-owned; update neither changes
180
189
  nor installs them.
181
190
 
182
- `--force` cannot be combined with `--check` and cannot weaken project-boundary,
183
- symlink, collision, manifest, or transaction guards.
191
+ `--force` cannot be combined with `--check` and cannot weaken preview, approval,
192
+ compatibility, project-boundary, symlink, collision, manifest, or transaction guards.
184
193
 
185
194
  Power Apps support is retired. Its manifests are rejected without fetching
186
195
  starter source, changing application files, or treating force as conversion
@@ -148,11 +148,12 @@ hand-edited unsafe path.
148
148
 
149
149
  ## Update reports managed-core conflicts or orphans
150
150
 
151
- `liftoff update` applies safe managed-core changes immediately and skips core
152
- conflicts.
151
+ Run `liftoff update --check` before apply. `liftoff update` requires the matching
152
+ preview and explicit approval, then applies its safe scope and skips core
153
+ conflicts. A missing or stale receipt requires a fresh check, not force.
153
154
 
154
- - Use `liftoff update --check` for a read-only human report or
155
- `liftoff update --check --json` for an automation drift gate.
155
+ - Use `liftoff update --check` for a project-read-only human report or add
156
+ `--json` for automation. Both disclose an external preview receipt.
156
157
  - Project-owned application files never enter the report or mutation set.
157
158
  - Managed-core conflicts remain untouched by default.
158
159
  - Use `liftoff update --force` only after reviewing every listed path and
@@ -162,7 +163,8 @@ conflicts.
162
163
  - Update neither changes nor installs project dependencies.
163
164
 
164
165
  Commit or copy local work before overwriting. Transaction rollback protects a
165
- failed update, but Liftoff keeps no backup after success.
166
+ failed ordinary update. Activation migration additionally retains original
167
+ history after success; failed revalidation retains blocked/resumable v2.
166
168
 
167
169
  For a new governance policy or launcher conflict, review that exact local file
168
170
  before considering `liftoff update --force`; do not delete it or activate remote
@@ -258,8 +260,8 @@ or allow TCP and UDP 53 to exact custom resolver addresses.
258
260
  | `phase-blocked` | Read the phase, proof, and authority blocker; unavailable production or enrollment capabilities remain blocked. |
259
261
  | `evidence-stale` | Obtain fresh proof through supported, authorized execution from current inputs; never edit receipts or reuse stale headers as current inputs. |
260
262
  | `credential-expiring` | Rotate before the recorded lead time using the same App or PAT policy. |
261
- | `reconciliation-required` | Review the precise identity/input diagnostic. Historical v1 has no public reconciliation workflow; preserve its bytes rather than acknowledging a new identity by editing JSON. |
262
- | `identity-incompatible` | Upgrade when the supported tuple requires a newer CLI. Unknown or historical tuples cannot be made executable with force or invented mappings. |
263
+ | `reconciliation-required` | Review `liftoff update --check`. An exact supported v1 source can use the approved history-preserving successor lane; unknown formats remain blocked. Never edit JSON to acknowledge identity. |
264
+ | `identity-incompatible` | Upgrade when the supported tuple requires a newer CLI. A historical receipt never becomes executable through force, retagging, or an invented mapping. |
263
265
  | `enforcement-incomplete` | Prove exact required contexts green and deliberately red, then approve final enforcement before ruleset mutation. |
264
266
  | `disposal-pending` | Review retention, exact imported paths, destructive scope, and proof. Execution requires valid authority; there is no public approval-entry shortcut. |
265
267
 
package/docs/workloads.md CHANGED
@@ -138,7 +138,8 @@ It does not convert workloads, change API stacks or GenAI patterns,
138
138
  or modernize production project templates. Retired workloads have no update or
139
139
  automatic migration path.
140
140
 
141
- Plain update applies safe core changes immediately. Use `liftoff update
142
- --check` for read-only inspection. `--force` applies only to listed
143
- managed-core conflicts; project-owned source, dependencies, schemas,
144
- containers, environments, documentation, and infrastructure remain untouched.
141
+ Start with `liftoff update --check`, which changes no project bytes and discloses
142
+ an external preview receipt. Plain update requires that matching preview and
143
+ explicit approval. `--force` applies only to its separately reviewed core
144
+ conflicts; project-owned source, dependencies, schemas, containers, environments,
145
+ documentation, and infrastructure remain outside replacement authority.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msn-control/liftoff",
3
- "version": "0.11.1",
3
+ "version": "0.11.2",
4
4
  "description": "Interactive CLI for governed GenAI applications and APIs.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-only",