agentera 3.0.0-dev.23 → 3.0.0-dev.26

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 (376) hide show
  1. package/README.md +18 -22
  2. package/bundle/CHANGELOG.md +25 -27
  3. package/bundle/README.md +22 -42
  4. package/bundle/UPGRADE.md +71 -179
  5. package/bundle/references/adapters/package-manifest-interface-model.yaml +41 -240
  6. package/bundle/references/adapters/package-registry.yaml +9 -145
  7. package/bundle/references/adapters/package-surface-characterization.md +13 -38
  8. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +5 -219
  9. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +2 -29
  10. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +1 -1
  11. package/bundle/references/artifacts/state-storage-authority.yaml +729 -412
  12. package/bundle/references/cli/agent-ready-state-contract.yaml +12 -12
  13. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  14. package/bundle/references/cli/bundle-skill-vocabulary.yaml +9 -18
  15. package/bundle/references/cli/capability-tool-classification.yaml +2 -2
  16. package/bundle/references/cli/prime-consumer-compatibility.yaml +28 -98
  17. package/bundle/references/cli/routing-execution-vocabulary.yaml +4 -22
  18. package/bundle/references/cli/update-channels.yaml +4 -2
  19. package/bundle/references/cli/upgrade-repair-wording.md +8 -28
  20. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +2 -3
  21. package/bundle/references/cli/vocabulary.md +22 -27
  22. package/bundle/references/meta/documentation-inventory.md +1 -1
  23. package/bundle/skills/agentera/SKILL.md +28 -14
  24. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +12 -12
  25. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +2 -2
  26. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +12 -12
  27. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +8 -8
  28. package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
  29. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +7 -7
  30. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +12 -12
  31. package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +9 -9
  32. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +11 -11
  33. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +9 -9
  34. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +2 -2
  35. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +3 -3
  36. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +11 -11
  37. package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
  38. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +15 -2
  39. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -12
  40. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +21 -21
  41. package/bundle/skills/agentera/schemas/artifacts/health.yaml +15 -2
  42. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +36 -15
  43. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +15 -2
  44. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +4 -4
  45. package/dist/capabilities/audit/instructions.js +13 -1
  46. package/dist/capabilities/audit/instructions.js.map +1 -1
  47. package/dist/capabilities/build/instructions.js +14 -1
  48. package/dist/capabilities/build/instructions.js.map +1 -1
  49. package/dist/capabilities/discuss/instructions.js +11 -1
  50. package/dist/capabilities/discuss/instructions.js.map +1 -1
  51. package/dist/capabilities/document/instructions.js +9 -1
  52. package/dist/capabilities/document/instructions.js.map +1 -1
  53. package/dist/capabilities/index.js +7 -7
  54. package/dist/capabilities/index.js.map +1 -1
  55. package/dist/capabilities/optimize/instructions.js +10 -1
  56. package/dist/capabilities/optimize/instructions.js.map +1 -1
  57. package/dist/capabilities/orchestrate/instructions.js +13 -2
  58. package/dist/capabilities/orchestrate/instructions.js.map +1 -1
  59. package/dist/capabilities/plan/instructions.js +10 -1
  60. package/dist/capabilities/plan/instructions.js.map +1 -1
  61. package/dist/cli/capabilityContext/bespoke.js +8 -2
  62. package/dist/cli/capabilityContext/bespoke.js.map +1 -1
  63. package/dist/cli/capabilityContext/closeout.js +3 -3
  64. package/dist/cli/capabilityContext/closeout.js.map +1 -1
  65. package/dist/cli/capabilityContext/contract.js +10 -15
  66. package/dist/cli/capabilityContext/contract.js.map +1 -1
  67. package/dist/cli/capabilityContext/evidence.js +55 -43
  68. package/dist/cli/capabilityContext/evidence.js.map +1 -1
  69. package/dist/cli/capabilityContext/planState.js +5 -5
  70. package/dist/cli/capabilityContext/planState.js.map +1 -1
  71. package/dist/cli/capabilityContext/progress.js +1 -1
  72. package/dist/cli/capabilityContext/progress.js.map +1 -1
  73. package/dist/cli/capabilityContext/shared.js +8 -2
  74. package/dist/cli/capabilityContext/shared.js.map +1 -1
  75. package/dist/cli/capabilityContext/slim.js +2 -1
  76. package/dist/cli/capabilityContext/slim.js.map +1 -1
  77. package/dist/cli/capabilityContext/startup.js +19 -8
  78. package/dist/cli/capabilityContext/startup.js.map +1 -1
  79. package/dist/cli/capabilityContext/types.js +4 -4
  80. package/dist/cli/capabilityContext/types.js.map +1 -1
  81. package/dist/cli/commands/doctor.js +6 -64
  82. package/dist/cli/commands/doctor.js.map +1 -1
  83. package/dist/cli/commands/durability.js +27 -30
  84. package/dist/cli/commands/durability.js.map +1 -1
  85. package/dist/cli/commands/entityMigrate.js +128 -0
  86. package/dist/cli/commands/entityMigrate.js.map +1 -0
  87. package/dist/cli/commands/prime/briefOrientation.js +7 -22
  88. package/dist/cli/commands/prime/briefOrientation.js.map +1 -1
  89. package/dist/cli/commands/prime/bundleStatus.js +8 -2
  90. package/dist/cli/commands/prime/bundleStatus.js.map +1 -1
  91. package/dist/cli/commands/prime/collectEntityOrientation.js +161 -0
  92. package/dist/cli/commands/prime/collectEntityOrientation.js.map +1 -0
  93. package/dist/cli/commands/prime/collectOrientationState.js +32 -59
  94. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
  95. package/dist/cli/commands/prime/orientationOutput.js +4 -12
  96. package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
  97. package/dist/cli/commands/prime.js +2 -5
  98. package/dist/cli/commands/prime.js.map +1 -1
  99. package/dist/cli/commands/query.js +43 -49
  100. package/dist/cli/commands/query.js.map +1 -1
  101. package/dist/cli/commands/schema.js +26 -83
  102. package/dist/cli/commands/schema.js.map +1 -1
  103. package/dist/cli/commands/state/decisions.js +14 -47
  104. package/dist/cli/commands/state/decisions.js.map +1 -1
  105. package/dist/cli/commands/state/docs.js +58 -84
  106. package/dist/cli/commands/state/docs.js.map +1 -1
  107. package/dist/cli/commands/state/experimentRecords.js +27 -44
  108. package/dist/cli/commands/state/experimentRecords.js.map +1 -1
  109. package/dist/cli/commands/state/experiments.js +11 -64
  110. package/dist/cli/commands/state/experiments.js.map +1 -1
  111. package/dist/cli/commands/state/get.js +74 -88
  112. package/dist/cli/commands/state/get.js.map +1 -1
  113. package/dist/cli/commands/state/health.js +11 -112
  114. package/dist/cli/commands/state/health.js.map +1 -1
  115. package/dist/cli/commands/state/index.js +11 -2
  116. package/dist/cli/commands/state/index.js.map +1 -1
  117. package/dist/cli/commands/state/list.js +30 -13
  118. package/dist/cli/commands/state/list.js.map +1 -1
  119. package/dist/cli/commands/state/objective.js +21 -64
  120. package/dist/cli/commands/state/objective.js.map +1 -1
  121. package/dist/cli/commands/state/plan.js +11 -376
  122. package/dist/cli/commands/state/plan.js.map +1 -1
  123. package/dist/cli/commands/state/planTasks.js +58 -80
  124. package/dist/cli/commands/state/planTasks.js.map +1 -1
  125. package/dist/cli/commands/state/plans.js +27 -38
  126. package/dist/cli/commands/state/plans.js.map +1 -1
  127. package/dist/cli/commands/state/progress.js +11 -44
  128. package/dist/cli/commands/state/progress.js.map +1 -1
  129. package/dist/cli/commands/state/shared.js.map +1 -1
  130. package/dist/cli/commands/state/todo.js +27 -106
  131. package/dist/cli/commands/state/todo.js.map +1 -1
  132. package/dist/cli/commands/state/write.js +57 -4
  133. package/dist/cli/commands/state/write.js.map +1 -1
  134. package/dist/cli/commands/upgrade.js +99 -35
  135. package/dist/cli/commands/upgrade.js.map +1 -1
  136. package/dist/cli/commands/upgradeVerify.js +52 -14
  137. package/dist/cli/commands/upgradeVerify.js.map +1 -1
  138. package/dist/cli/commands/validate.js +66 -9
  139. package/dist/cli/commands/validate.js.map +1 -1
  140. package/dist/cli/dispatch/check.js +13 -13
  141. package/dist/cli/dispatch/check.js.map +1 -1
  142. package/dist/cli/dispatch/index.js +35 -28
  143. package/dist/cli/dispatch/index.js.map +1 -1
  144. package/dist/cli/dispatch/lifecycle.js +23 -43
  145. package/dist/cli/dispatch/lifecycle.js.map +1 -1
  146. package/dist/cli/dispatch/prime.js +15 -0
  147. package/dist/cli/dispatch/prime.js.map +1 -1
  148. package/dist/cli/dispatch/state.js +7 -1
  149. package/dist/cli/dispatch/state.js.map +1 -1
  150. package/dist/cli/help.js +90 -112
  151. package/dist/cli/help.js.map +1 -1
  152. package/dist/cli/migrationRequired.js +87 -0
  153. package/dist/cli/migrationRequired.js.map +1 -0
  154. package/dist/cli/orientation/attention.js +3 -99
  155. package/dist/cli/orientation/attention.js.map +1 -1
  156. package/dist/cli/orientation.js +10 -7
  157. package/dist/cli/orientation.js.map +1 -1
  158. package/dist/cli/planArtifacts.js +192 -42
  159. package/dist/cli/planArtifacts.js.map +1 -1
  160. package/dist/cli/prime-blob.js +5 -5
  161. package/dist/cli/prime-blob.js.map +1 -1
  162. package/dist/cli/stateQuery.js +6 -7
  163. package/dist/cli/stateQuery.js.map +1 -1
  164. package/dist/core/skillIdentity.js +24 -0
  165. package/dist/core/skillIdentity.js.map +1 -0
  166. package/dist/hooks/common.js +1 -1
  167. package/dist/hooks/common.js.map +1 -1
  168. package/dist/hooks/compaction/status.js +27 -2
  169. package/dist/hooks/compaction/status.js.map +1 -1
  170. package/dist/hooks/cursorSessionStart.js +4 -19
  171. package/dist/hooks/cursorSessionStart.js.map +1 -1
  172. package/dist/hooks/projectHookInput.js +26 -0
  173. package/dist/hooks/projectHookInput.js.map +1 -0
  174. package/dist/hooks/sessionStart.js +58 -212
  175. package/dist/hooks/sessionStart.js.map +1 -1
  176. package/dist/hooks/sessionStop.js +4 -12
  177. package/dist/hooks/sessionStop.js.map +1 -1
  178. package/dist/hooks/validateArtifact/traversal.js +1 -1
  179. package/dist/hooks/validateArtifact/traversal.js.map +1 -1
  180. package/dist/registries/artifactRegistry.js +24 -14
  181. package/dist/registries/artifactRegistry.js.map +1 -1
  182. package/dist/registries/packageRegistry.js +58 -232
  183. package/dist/registries/packageRegistry.js.map +1 -1
  184. package/dist/release/releaseMetadata.js +1 -13
  185. package/dist/release/releaseMetadata.js.map +1 -1
  186. package/dist/runtime/lifecycleAdapterContract.js +4 -4
  187. package/dist/runtime/lifecycleAdapterContract.js.map +1 -1
  188. package/dist/runtime/lifecycleAdapters.js +14 -2
  189. package/dist/runtime/lifecycleAdapters.js.map +1 -1
  190. package/dist/runtime/lifecycleAuthority.js +5 -43
  191. package/dist/runtime/lifecycleAuthority.js.map +1 -1
  192. package/dist/runtime/lifecycleOperationContract.js +3 -2
  193. package/dist/runtime/lifecycleOperationContract.js.map +1 -1
  194. package/dist/runtime/lifecyclePublication.js +21 -0
  195. package/dist/runtime/lifecyclePublication.js.map +1 -1
  196. package/dist/setup/opencode.js +20 -12
  197. package/dist/setup/opencode.js.map +1 -1
  198. package/dist/setup/sharedSkill.js +46 -0
  199. package/dist/setup/sharedSkill.js.map +1 -0
  200. package/dist/setup/smokeChecks.js +16 -43
  201. package/dist/setup/smokeChecks.js.map +1 -1
  202. package/dist/state/archivePublication.js +3 -2
  203. package/dist/state/archivePublication.js.map +1 -1
  204. package/dist/state/decisionEntities.js +282 -0
  205. package/dist/state/decisionEntities.js.map +1 -0
  206. package/dist/state/decisionOverlay.js +2 -2
  207. package/dist/state/decisionOverlay.js.map +1 -1
  208. package/dist/state/decisionRevision.js +44 -34
  209. package/dist/state/decisionRevision.js.map +1 -1
  210. package/dist/state/directRetrieval.js.map +1 -1
  211. package/dist/state/durability.js +81 -226
  212. package/dist/state/durability.js.map +1 -1
  213. package/dist/state/entityCutover.js +294 -0
  214. package/dist/state/entityCutover.js.map +1 -0
  215. package/dist/state/entityCutoverGit.js +128 -0
  216. package/dist/state/entityCutoverGit.js.map +1 -0
  217. package/dist/state/entityMigrationPreview.js +803 -0
  218. package/dist/state/entityMigrationPreview.js.map +1 -0
  219. package/dist/state/entityPublicationContext.js +612 -0
  220. package/dist/state/entityPublicationContext.js.map +1 -0
  221. package/dist/state/entityStorage.js +826 -0
  222. package/dist/state/entityStorage.js.map +1 -0
  223. package/dist/state/experimentIdentity.js +23 -11
  224. package/dist/state/experimentIdentity.js.map +1 -1
  225. package/dist/state/healthEntities.js +230 -0
  226. package/dist/state/healthEntities.js.map +1 -0
  227. package/dist/state/healthEntityValidation.js +6 -0
  228. package/dist/state/healthEntityValidation.js.map +1 -0
  229. package/dist/state/legacyEntityCutoverEvidence.js +66 -0
  230. package/dist/state/legacyEntityCutoverEvidence.js.map +1 -0
  231. package/dist/state/listRetrieval.js.map +1 -1
  232. package/dist/state/objectiveExperimentEntities.js +323 -0
  233. package/dist/state/objectiveExperimentEntities.js.map +1 -0
  234. package/dist/state/planEntities.js +362 -0
  235. package/dist/state/planEntities.js.map +1 -0
  236. package/dist/state/progressEntities.js +384 -0
  237. package/dist/state/progressEntities.js.map +1 -0
  238. package/dist/state/projectRoot.js +63 -0
  239. package/dist/state/projectRoot.js.map +1 -0
  240. package/dist/state/retrievalAuthority.js +13 -6
  241. package/dist/state/retrievalAuthority.js.map +1 -1
  242. package/dist/state/safeProjectFile.js +153 -0
  243. package/dist/state/safeProjectFile.js.map +1 -0
  244. package/dist/state/startupProjection.js +3 -2
  245. package/dist/state/startupProjection.js.map +1 -1
  246. package/dist/state/stateMode.js +83 -0
  247. package/dist/state/stateMode.js.map +1 -0
  248. package/dist/state/todoDocsEntities.js +225 -0
  249. package/dist/state/todoDocsEntities.js.map +1 -0
  250. package/dist/state/todoDocsEntityValidation.js +26 -0
  251. package/dist/state/todoDocsEntityValidation.js.map +1 -0
  252. package/dist/state/write/candidateMutation.js +5 -55
  253. package/dist/state/write/candidateMutation.js.map +1 -1
  254. package/dist/state/write/explain.js +119 -28
  255. package/dist/state/write/explain.js.map +1 -1
  256. package/dist/state/write/lock.js +794 -87
  257. package/dist/state/write/lock.js.map +1 -1
  258. package/dist/state/write/mutation.js +5 -2
  259. package/dist/state/write/mutation.js.map +1 -1
  260. package/dist/state/write/operations.js +52 -7
  261. package/dist/state/write/operations.js.map +1 -1
  262. package/dist/state/write/planEvaluation.js +107 -0
  263. package/dist/state/write/planEvaluation.js.map +1 -0
  264. package/dist/state/write/planPublication.js +11 -55
  265. package/dist/state/write/planPublication.js.map +1 -1
  266. package/dist/state/write/transaction.js +32 -455
  267. package/dist/state/write/transaction.js.map +1 -1
  268. package/dist/upgrade/appContentRefresh.js +43 -28
  269. package/dist/upgrade/appContentRefresh.js.map +1 -1
  270. package/dist/upgrade/compatibility.js +4 -4
  271. package/dist/upgrade/compatibility.js.map +1 -1
  272. package/dist/upgrade/doctor.js +5 -1
  273. package/dist/upgrade/doctor.js.map +1 -1
  274. package/dist/upgrade/installedHooksRetirement.js +46 -39
  275. package/dist/upgrade/installedHooksRetirement.js.map +1 -1
  276. package/dist/upgrade/legacyAgentCleanup.js +132 -32
  277. package/dist/upgrade/legacyAgentCleanup.js.map +1 -1
  278. package/dist/upgrade/lifecycleUpgrade.js +65 -378
  279. package/dist/upgrade/lifecycleUpgrade.js.map +1 -1
  280. package/dist/upgrade/migrateArtifactsV2ToV3.js +164 -66
  281. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +1 -1
  282. package/dist/upgrade/migrationPublication.js +123 -0
  283. package/dist/upgrade/migrationPublication.js.map +1 -0
  284. package/dist/upgrade/projectIntegration.js +46 -113
  285. package/dist/upgrade/projectIntegration.js.map +1 -1
  286. package/dist/upgrade/projectIntegrationDecision.js +6 -96
  287. package/dist/upgrade/projectIntegrationDecision.js.map +1 -1
  288. package/dist/upgrade/runtimeMigration.js +222 -402
  289. package/dist/upgrade/runtimeMigration.js.map +1 -1
  290. package/dist/upgrade/upgradeCommands.js +5 -4
  291. package/dist/upgrade/upgradeCommands.js.map +1 -1
  292. package/dist/upgrade/upgradeLock.js +73 -41
  293. package/dist/upgrade/upgradeLock.js.map +1 -1
  294. package/dist/upgrade/upgradeOrchestrator.js +181 -145
  295. package/dist/upgrade/upgradeOrchestrator.js.map +1 -1
  296. package/dist/upgrade/v3CapabilitySurface.js +2 -2
  297. package/dist/validate/appHomeContract.js +0 -4
  298. package/dist/validate/appHomeContract.js.map +1 -1
  299. package/dist/validate/crossCapability.js +2 -2
  300. package/dist/validate/crossCapability.js.map +1 -1
  301. package/package.json +8 -6
  302. package/bundle/.codex-plugin/plugin.json +0 -92
  303. package/bundle/.cursor/agents/agentera.md +0 -7
  304. package/bundle/.cursor/hooks.json +0 -32
  305. package/bundle/.cursor-plugin/plugin.json +0 -34
  306. package/bundle/.github/hooks/postToolUse.json +0 -9
  307. package/bundle/.github/hooks/preToolUse.json +0 -8
  308. package/bundle/.github/hooks/sessionEnd.json +0 -8
  309. package/bundle/.github/hooks/sessionStart.json +0 -8
  310. package/bundle/.github/plugin/plugin.json +0 -7
  311. package/bundle/.opencode/agents/agentera.md +0 -12
  312. package/bundle/.opencode/commands/agentera.md +0 -5
  313. package/bundle/.opencode/package.json +0 -31
  314. package/bundle/.opencode/plugins/agentera.js +0 -820
  315. package/bundle/agents/openai.yaml +0 -87
  316. package/bundle/hooks/codex-hooks.json +0 -31
  317. package/bundle/hooks/codex-plugin-hooks.json +0 -31
  318. package/bundle/plugin.json +0 -13
  319. package/bundle/references/adapters/cursor.md +0 -224
  320. package/bundle/references/adapters/opencode.md +0 -529
  321. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -44
  322. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  323. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -387
  324. package/bundle/references/adapters/runtime-feature-parity.md +0 -129
  325. package/dist/cli/commands/backfill.js +0 -194
  326. package/dist/cli/commands/backfill.js.map +0 -1
  327. package/dist/cli/commands/migrate.js +0 -677
  328. package/dist/cli/commands/migrate.js.map +0 -1
  329. package/dist/registries/runtimeAdapterRegistry.js +0 -324
  330. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  331. package/dist/setup/copilot.js +0 -227
  332. package/dist/setup/copilot.js.map +0 -1
  333. package/dist/setup/cursor.js +0 -129
  334. package/dist/setup/cursor.js.map +0 -1
  335. package/dist/setup/cursorSurfaces.js +0 -67
  336. package/dist/setup/cursorSurfaces.js.map +0 -1
  337. package/dist/setup/doctor/core.js +0 -296
  338. package/dist/setup/doctor/core.js.map +0 -1
  339. package/dist/setup/doctor/diagnostics.js +0 -201
  340. package/dist/setup/doctor/diagnostics.js.map +0 -1
  341. package/dist/setup/doctor/opencode.js +0 -301
  342. package/dist/setup/doctor/opencode.js.map +0 -1
  343. package/dist/setup/doctor/report.js +0 -425
  344. package/dist/setup/doctor/report.js.map +0 -1
  345. package/dist/setup/doctor.js +0 -10
  346. package/dist/setup/doctor.js.map +0 -1
  347. package/dist/state/gitBackfill.js +0 -561
  348. package/dist/state/gitBackfill.js.map +0 -1
  349. package/dist/state/gitBackfillAuthority.js +0 -141
  350. package/dist/state/gitBackfillAuthority.js.map +0 -1
  351. package/dist/state/gitBackfillHistory.js +0 -278
  352. package/dist/state/gitBackfillHistory.js.map +0 -1
  353. package/dist/state/gitBackfillOutput.js +0 -209
  354. package/dist/state/gitBackfillOutput.js.map +0 -1
  355. package/dist/state/legacyMigration.js +0 -516
  356. package/dist/state/legacyMigration.js.map +0 -1
  357. package/dist/state/legacyMigrationParser.js +0 -489
  358. package/dist/state/legacyMigrationParser.js.map +0 -1
  359. package/dist/state/migrationAuthority.js +0 -413
  360. package/dist/state/migrationAuthority.js.map +0 -1
  361. package/dist/state/migrationEnrichment.js +0 -35
  362. package/dist/state/migrationEnrichment.js.map +0 -1
  363. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -568
  364. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  365. package/dist/upgrade/upgradeSnapshot.js +0 -93
  366. package/dist/upgrade/upgradeSnapshot.js.map +0 -1
  367. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  368. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  369. package/dist/validate/lifecycleAdapters/lifecycleMain.js +0 -154
  370. package/dist/validate/lifecycleAdapters/lifecycleMain.js.map +0 -1
  371. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -481
  372. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  373. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  374. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  375. package/dist/validate/lifecycleAdapters.js +0 -10
  376. package/dist/validate/lifecycleAdapters.js.map +0 -1
@@ -1,12 +1,10 @@
1
1
  schema_version: agentera.stateStorageAuthority.v1
2
2
  status: active_authority
3
3
  purpose: >-
4
- Define the public bounded-retrieval vocabulary for every state collection
5
- while keeping each collection's storage authority explicit. It also defines
6
- the lossless numbered-archive, project path, direct state API, compatibility,
7
- projection, and serialized-output contracts for progress, decisions, and
8
- health, plus objective-scoped immutable archival for newly published
9
- experiments.
4
+ Define both the implemented bounded-retrieval contracts for current state and
5
+ the Decision 94 target entity and cutover contracts. The target declaration is
6
+ authoritative before its storage, writer, retrieval, and migration behavior is
7
+ implemented; implementation status is explicit at each boundary.
10
8
  authority:
11
9
  source: references/artifacts/state-storage-authority.yaml
12
10
  single_source_rule: >-
@@ -16,10 +14,721 @@ authority:
16
14
  amendment revision paths, legacy label coexistence rules, failure classes,
17
15
  or byte limits.
18
16
  implementation_boundary: >-
19
- This contract does not migrate legacy state or change existing plan and
20
- vision archive behavior. The maintenance-only Git backfill surface declared
21
- by api.backfill may inventory reachable local history and publish only an
22
- exact immutable archive record after explicit apply intent.
17
+ Shared entity storage plus the progress, decisions, health, plan, objective,
18
+ experiment, TODO-item, and documentation-inventory family writers and retrieval,
19
+ plus one-way forward import, are implemented but activate entity authority only
20
+ from the durable cutover marker. The preserved
21
+ singleton families remain legacy files. The
22
+ current numbered archive and retrieval groups remain migration input while
23
+ that marker is absent; no independent legacy repair mutation remains.
24
+
25
+ entity_target:
26
+ status: progress_decisions_health_plan_objective_experiment_todo_and_docs_implemented_other_families_declared
27
+ decision: 94
28
+ activation: >-
29
+ This target becomes active persisted and structured state authority only
30
+ after entity_migration publishes a validated entity graph and writes the marker
31
+ last. Before then, legacy aggregates
32
+ remain migration input and explicitly labelled migration-evidence writer state;
33
+ ordinary public reads fail with migration_required instead of exposing them.
34
+ implementation_status:
35
+ progress: implemented
36
+ decisions: implemented
37
+ health: implemented
38
+ plan: implemented
39
+ objective: implemented
40
+ experiments: implemented
41
+ todo: implemented
42
+ docs: implemented
43
+ remaining_families: declared_not_implemented
44
+ rule: >-
45
+ Every implemented family selects entity behavior only when the durable
46
+ cutover marker is valid. Marker-absent ordinary consumers fail with
47
+ migration_required; the read-only migration preview and readiness checks do
48
+ not create entity state or write both authorities.
49
+ public_schema:
50
+ canonical_identity_field: id
51
+ canonical_classification_field: artifact
52
+ identity_and_classification_fields: [id, artifact]
53
+ entity_envelope:
54
+ required_fields: [id, artifact, record]
55
+ additional_identity_or_classification_fields: forbidden
56
+ forbidden_canonical_aliases:
57
+ - stable_id
58
+ - artifact_id
59
+ - entry_number
60
+ - number
61
+ - task_number
62
+ - experiment_number
63
+ - plan_id
64
+ - objective_id
65
+ - type_prefixed_id
66
+ exemptions:
67
+ - historical prose and immutable historical evidence
68
+ - internal TypeScript variable names that are not persisted or public structured output
69
+ - current pre-cutover contracts explicitly marked as implemented legacy authority
70
+ public_retrieval:
71
+ schema_version: agentera.entityPublicRetrieval.v1
72
+ status: final
73
+ commands:
74
+ progress:
75
+ list: agentera state progress list [--limit N] [--cursor TOKEN] --format json
76
+ get: agentera state progress get --id ID --format json
77
+ decisions:
78
+ list: agentera state decisions list [--limit N] [--cursor TOKEN] --format json
79
+ get: agentera state decisions get --id ID --format json
80
+ health:
81
+ list: agentera state health list [--limit N] [--cursor TOKEN] --format json
82
+ get: agentera state health get --id ID --format json
83
+ plans:
84
+ list: agentera state plan list [--status open|complete|archived] [--limit N] [--cursor TOKEN] --format json
85
+ get: agentera state plan get --id ID --format json
86
+ plan_tasks:
87
+ list: agentera state plan tasks list [--limit N] [--cursor TOKEN] --format json
88
+ get: agentera state plan tasks get --id ID --format json
89
+ objective:
90
+ list: agentera state objective list [--limit N] [--cursor TOKEN] --format json
91
+ get: agentera state objective get --id ID --format json
92
+ experiments:
93
+ list: agentera state experiments list --objective ID [--limit N] [--cursor TOKEN] --format json
94
+ get: agentera state experiments get --id ID --format json
95
+ todo:
96
+ list: agentera state todo list [--limit N] [--cursor TOKEN] --format json
97
+ get: agentera state todo get --id ID --format json
98
+ docs:
99
+ list: agentera state docs list [--limit N] [--cursor TOKEN] --format json
100
+ get: agentera state docs get --id ID --format json
101
+ collections:
102
+ - { artifact: progress, identity: id, classification: artifact }
103
+ - { artifact: decisions, identity: id, classification: artifact }
104
+ - { artifact: health, identity: id, classification: artifact }
105
+ - { artifact: plan, boundary: plan, identity: id, classification: artifact }
106
+ - { artifact: plan, boundary: plan_task, identity: id, classification: artifact }
107
+ - { artifact: objective, identity: id, classification: artifact }
108
+ - { artifact: experiments, identity: id, classification: artifact }
109
+ - { artifact: todo, identity: id, classification: artifact }
110
+ - { artifact: docs, identity: id, classification: artifact }
111
+ identity:
112
+ scope: project_wide_across_all_entity_artifacts
113
+ alphabet: abcdefghijklmnopqrstuvwxyz
114
+ length: 10
115
+ accepted_pattern: '^[a-z]{10}$'
116
+ example: qjtrmnpvka
117
+ allocation: random_from_declared_alphabet
118
+ collision_rule: retry before publication; an existing ID is never reassigned or overwritten
119
+ prohibited_components: [prefix, sequence, timestamp, branch, writer, git_reference]
120
+ meaning_rule: >-
121
+ The ID is opaque and carries no artifact or entity-boundary information;
122
+ artifact is the sole public classification field.
123
+ storage_boundary:
124
+ rule: one independently mutable entity per writer-owned canonical file
125
+ aggregate_authority: forbidden
126
+ shared_primitives:
127
+ status: implemented
128
+ canonical_root: .agentera/entities
129
+ canonical_path_template: .agentera/entities/<artifact>/<boundary>/<id>.yaml
130
+ path_components: [artifact, boundary, id]
131
+ extension: .yaml
132
+ publication: exclusive_immutable_file
133
+ publication_context:
134
+ scope: shared_by_all_entity_families
135
+ binding: validated_project_root_and_exact_cutover_marker_snapshot
136
+ lifetime: mode_detection_through_writer_lock_and_final_publication_validation
137
+ pathname_race_contract: >-
138
+ Entity publication is rooted through held directory descriptors. The
139
+ root and exact valid marker identity and bytes are revalidated before
140
+ each directory, stage, and immutable-link boundary and after durable
141
+ publication before success. Because Node cannot make pathname
142
+ validation and mutation one kernel operation, a detected substitution
143
+ rolls back only attempt-owned links, stages, and empty directories by
144
+ pinned identity; final failure retains no attempt-owned entity state.
145
+ marker_change_after_detection: conflict_without_legacy_fallback
146
+ successor_preservation: never_remove_unmatched_or_unrelated_identity
147
+ allocation: provisional_candidate_until_publication
148
+ project_wide_id_claim:
149
+ synchronization: .agentera/.writer.lock
150
+ critical_section: final_project_wide_scan_through_durable_publication
151
+ interrupted_writer_recovery: dead_process_lock_reclamation
152
+ persistent_reservation: none
153
+ identical_replay: idempotent
154
+ replay_equality: recursive_key_sorted_logical_content_with_array_order_preserved
155
+ divergent_same_id: reject_without_overwrite
156
+ state_validation:
157
+ canonical_command: agentera check validate state
158
+ mutates: false
159
+ failure_exit: nonzero
160
+ diagnostics: bounded_structured_with_exact_recovery
161
+ same_entity_conflict: >-
162
+ Concurrent divergent edits to one entity remain an ordinary explicit file
163
+ conflict or validation conflict; no runtime silently selects a winner.
164
+ unrelated_entity_merge: >-
165
+ Independently created or changed entities occupy distinct canonical files
166
+ so ordinary Git can preserve both changes.
167
+ entities:
168
+ - boundary: progress_cycle
169
+ artifact: progress
170
+ independently_mutable: true
171
+ relationships: []
172
+ implementation: implemented
173
+ record:
174
+ required_fields: [timestamp, type, phase, what, context]
175
+ required_paths: [context.intent]
176
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number]
177
+ temporal_fields: [timestamp]
178
+ timestamp_format: 'YYYY-MM-DD HH:MM'
179
+ retrieval:
180
+ exact: agentera state progress get --id ID --format json
181
+ list: agentera state progress list [--limit N] [--cursor TOKEN] --format json
182
+ ordering: timestamp_desc_then_id_asc
183
+ default_limit: 20
184
+ maximum_limit: 100
185
+ max_utf8_bytes: 32768
186
+ cursor: opaque_snapshot_cursor
187
+ mutation_after_snapshot: cursor_snapshot_unavailable
188
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
189
+ scalar_truncation: forbidden
190
+ - boundary: decision
191
+ artifact: decisions
192
+ independently_mutable: true
193
+ relationships: []
194
+ implementation: implemented
195
+ publication: immutable
196
+ record:
197
+ required_fields: [date, question, context, alternatives, choice, reasoning, confidence]
198
+ required_paths: []
199
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number, satisfaction]
200
+ retrieval:
201
+ exact: agentera state decisions get --id ID --format json
202
+ list: agentera state decisions list [--limit N] [--cursor TOKEN] --format json
203
+ ordering: date_desc_then_id_asc
204
+ default_limit: 20
205
+ maximum_limit: 100
206
+ max_utf8_bytes: 32768
207
+ cursor: opaque_snapshot_cursor
208
+ mutation_after_snapshot: cursor_snapshot_unavailable
209
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
210
+ scalar_truncation: forbidden
211
+ - boundary: decision_satisfaction
212
+ artifact: decisions
213
+ independently_mutable: true
214
+ relationships: [decision]
215
+ implementation: implemented
216
+ publication: replace_owned_entity
217
+ ownership: { fields: [decision], cardinality: zero_or_one }
218
+ record:
219
+ required_fields: [decision, state]
220
+ required_paths: []
221
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number]
222
+ - boundary: decision_revision
223
+ artifact: decisions
224
+ independently_mutable: true
225
+ includes: [amendment]
226
+ relationships: [decision]
227
+ implementation: implemented
228
+ publication: immutable
229
+ ownership: { fields: [decision, base_sha256], cardinality: zero_or_one }
230
+ record:
231
+ required_fields: [decision, date, provenance, base_sha256, changes]
232
+ required_paths: []
233
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number, satisfaction]
234
+ - boundary: health_audit
235
+ artifact: health
236
+ independently_mutable: true
237
+ relationships: []
238
+ implementation: implemented
239
+ publication: immutable
240
+ record:
241
+ required_fields: [date, dimensions, findings_summary, trajectory, grades]
242
+ required_paths: []
243
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number]
244
+ retrieval:
245
+ exact: agentera state health get --id ID --format json
246
+ list: agentera state health list [--limit N] [--cursor TOKEN] --format json
247
+ ordering: date_desc_then_id_asc
248
+ default_limit: 20
249
+ maximum_limit: 100
250
+ max_utf8_bytes: 32768
251
+ cursor: opaque_snapshot_cursor
252
+ mutation_after_snapshot: cursor_snapshot_unavailable
253
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
254
+ scalar_truncation: forbidden
255
+ repair: >-
256
+ Canonical health audit entities are immutable and cannot be row-deduplicated.
257
+ Malformed envelopes, duplicate IDs, or conflicting ownership fail before effects
258
+ and recover through agentera check validate state; no repair event is fabricated.
259
+ - boundary: plan
260
+ artifact: plan
261
+ independently_mutable: true
262
+ relationships: []
263
+ implementation: implemented
264
+ publication: replace_owned_entity
265
+ record:
266
+ required_fields: [header, what, why, scope]
267
+ required_paths: [header.title, header.created, header.status]
268
+ forbidden_fields: [id, artifact, stable_id, plan_id, tasks, previous_plan_archived]
269
+ field_shapes:
270
+ scope:
271
+ type: mapping
272
+ required_fields:
273
+ included: string_list
274
+ excluded: string_list
275
+ optional_fields:
276
+ deferred: string_list
277
+ additional_fields: forbidden
278
+ legacy_source_normalization: >-
279
+ A block-style, non-flow, exactly-one-pair mapping used directly as
280
+ an included, excluded, or deferred sequence item is the historical
281
+ block-colon string encoding and normalizes to one `key: value`
282
+ string only when both source nodes are string scalars. Explicit
283
+ flow mapping syntax never normalizes and remains invalid under the
284
+ canonical validator. A deliberate block single-pair mapping is
285
+ syntactically indistinguishable from the legacy encoding and falls
286
+ under this source-form rule; no semantic intent is inferred.
287
+ retrieval:
288
+ exact: agentera state plan get --id ID --format json
289
+ list: agentera state plan list [--limit N] [--cursor TOKEN] --format json
290
+ ordering: created_desc_then_id_asc
291
+ default_limit: 20
292
+ maximum_limit: 100
293
+ max_utf8_bytes: 32768
294
+ cursor: opaque_snapshot_cursor
295
+ mutation_after_snapshot: cursor_snapshot_unavailable
296
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
297
+ scalar_truncation: forbidden
298
+ - boundary: plan_task
299
+ artifact: plan
300
+ independently_mutable: true
301
+ relationships: [plan, depends_on_tasks]
302
+ implementation: implemented
303
+ publication: replace_owned_entity
304
+ record:
305
+ required_fields: [plan, name, status, depends_on, acceptance]
306
+ required_paths: []
307
+ forbidden_fields: [id, artifact, number, task_number, stable_id, plan_id]
308
+ - boundary: objective
309
+ artifact: objective
310
+ independently_mutable: true
311
+ relationships: []
312
+ implementation: implemented
313
+ publication: replace_owned_entity
314
+ record:
315
+ required_fields: [header, objective, metric, baseline, scope]
316
+ required_paths: [header.title, header.status, objective.description, objective.measurement]
317
+ forbidden_fields: [id, artifact, stable_id, objective_id]
318
+ retrieval:
319
+ exact: agentera state objective get --id ID --format json
320
+ list: agentera state objective list [--limit N] [--cursor TOKEN] --format json
321
+ ordering: created_desc_then_id_asc
322
+ default_limit: 20
323
+ maximum_limit: 100
324
+ max_utf8_bytes: 32768
325
+ cursor: opaque_snapshot_cursor
326
+ mutation_after_snapshot: cursor_snapshot_unavailable
327
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
328
+ scalar_truncation: forbidden
329
+ - boundary: experiment
330
+ artifact: experiments
331
+ independently_mutable: true
332
+ relationships: [objective]
333
+ implementation: implemented
334
+ publication: immutable
335
+ baseline:
336
+ field: status
337
+ value: baseline
338
+ cardinality: exactly_one_when_experiments_exist
339
+ record:
340
+ required_fields: [objective, date, label, hypothesis, method, change, metric, regression, status, conclusion]
341
+ required_paths: [objective, date, label, status]
342
+ forbidden_fields: [id, artifact, number, experiment_number, stable_id, objective_id]
343
+ retrieval:
344
+ exact: agentera state experiments get --id ID --format json
345
+ list: agentera state experiments list --objective ID [--limit N] [--cursor TOKEN] --format json
346
+ ordering: date_desc_then_id_asc
347
+ default_limit: 20
348
+ maximum_limit: 100
349
+ max_utf8_bytes: 32768
350
+ cursor: opaque_snapshot_cursor
351
+ mutation_after_snapshot: cursor_snapshot_unavailable
352
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
353
+ scalar_truncation: forbidden
354
+ - boundary: todo_item
355
+ artifact: todo
356
+ independently_mutable: true
357
+ relationships: []
358
+ implementation: implemented
359
+ publication: replace_owned_entity
360
+ record:
361
+ required_fields: [severity, status, description]
362
+ required_paths: []
363
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number, path]
364
+ retrieval:
365
+ exact: agentera state todo get --id ID --format json
366
+ list: agentera state todo list [--limit N] [--cursor TOKEN] --format json
367
+ ordering: severity_then_status_then_id
368
+ default_limit: 20
369
+ maximum_limit: 100
370
+ max_utf8_bytes: 32768
371
+ cursor: opaque_snapshot_cursor
372
+ mutation_after_snapshot: cursor_snapshot_unavailable
373
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
374
+ scalar_truncation: forbidden
375
+ - boundary: documentation_inventory_entry
376
+ artifact: docs
377
+ independently_mutable: true
378
+ relationships: []
379
+ implementation: implemented
380
+ publication: replace_owned_entity
381
+ record:
382
+ required_fields: [document, path, last_updated, status]
383
+ required_paths: []
384
+ forbidden_fields: [id, artifact, number, stable_id, artifact_id, entry_number]
385
+ retrieval:
386
+ exact: agentera state docs get --id ID --format json
387
+ list: agentera state docs list [--limit N] [--cursor TOKEN] --format json
388
+ ordering: path_then_id
389
+ default_limit: 20
390
+ maximum_limit: 100
391
+ max_utf8_bytes: 32768
392
+ cursor: opaque_snapshot_cursor
393
+ mutation_after_snapshot: cursor_snapshot_unavailable
394
+ omission: whole_entries_only_with_count_reason_continuation_and_exact_get
395
+ scalar_truncation: forbidden
396
+ relationships:
397
+ representation: bare target entity ID in the named record field
398
+ integrity: every non-null target must resolve to exactly one entity with the declared target boundary
399
+ unresolved_behavior: whole-state validation and migration cutover fail without creating a target
400
+ declarations:
401
+ - source: decision_satisfaction
402
+ field: decision
403
+ target: decision
404
+ cardinality: exactly_one
405
+ - source: decision_revision
406
+ field: decision
407
+ target: decision
408
+ cardinality: exactly_one
409
+ - source: plan_task
410
+ field: plan
411
+ target: plan
412
+ cardinality: exactly_one
413
+ - source: plan_task
414
+ field: depends_on
415
+ target: plan_task
416
+ cardinality: zero_or_many_same_plan
417
+ - source: experiment
418
+ field: objective
419
+ target: objective
420
+ cardinality: exactly_one
421
+ views:
422
+ authority: non_authoritative_cli_rendering
423
+ mutation: forbidden
424
+ source: canonical entity files only after cutover
425
+ requirements:
426
+ - bounded lists expose id and artifact and provide exact get by id
427
+ - ordering and cursors bind to an explicit snapshot and never imply identity
428
+ - omissions expose counts, reasons, and exact retrieval commands
429
+ - nested plan/task and objective/experiment views are relationship projections
430
+ - startup views use the same entities and may omit detail only under declared budgets
431
+ intentional_singletons:
432
+ exhaustive: true
433
+ additions_require_authority_amendment: true
434
+ boundaries:
435
+ - boundary: vision
436
+ reason: one project north star; excluded from execution-cycle mutation
437
+ - boundary: design
438
+ reason: one project visual identity editorial artifact
439
+ - boundary: changelog
440
+ reason: one ordered release-history editorial artifact
441
+ - boundary: profile
442
+ reason: one reusable decision-profile document per selected profile
443
+ - boundary: runtime_local_session_state
444
+ reason: runtime-local and not canonical project entity state
445
+ - boundary: docs_mapping
446
+ reason: one project path and documentation-policy mapping, distinct from documentation inventory entries
447
+ conflict_rule: concurrent edits remain explicit whole-document conflicts
448
+ excluded_from_entity_migration:
449
+ - all intentional_singletons
450
+ - immutable historical prose and evidence, except structured references explicitly declared for rewrite
451
+ - genuinely singleton editorial artifacts added by an authority amendment
452
+ measurement_contract:
453
+ status: implemented
454
+ environment: Linux, Node.js 22 or newer, one cold CLI process per sample
455
+ fixtures:
456
+ small: 100 valid entities distributed across every declared entity boundary
457
+ large: 1000 valid entities distributed across every declared entity boundary
458
+ relationship_rule: every declared relationship has at least one valid fixture edge
459
+ sampling:
460
+ repetitions: 5
461
+ pass_rule: every repetition stays within every applicable limit
462
+ elapsed: wall-clock milliseconds from process start through complete serialized output
463
+ heap: process heapUsed peak minus heapUsed before fixture discovery
464
+ bytes: UTF-8 byte length of stdout including the trailing newline
465
+ targets:
466
+ exact_get:
467
+ max_latency_ms: 1000
468
+ max_heap_delta_bytes: 67108864
469
+ max_utf8_bytes: 1048576
470
+ bounded_list_small:
471
+ max_latency_ms: 5000
472
+ max_heap_delta_bytes: 67108864
473
+ max_utf8_bytes: 32768
474
+ bounded_list_large:
475
+ max_latency_ms: 15000
476
+ max_heap_delta_bytes: 268435456
477
+ max_utf8_bytes: 32768
478
+ startup_small:
479
+ max_latency_ms: 5000
480
+ max_heap_delta_bytes: 67108864
481
+ serialized_limits: budgets.startup.surfaces
482
+ startup_large:
483
+ max_latency_ms: 15000
484
+ max_heap_delta_bytes: 268435456
485
+ serialized_limits: budgets.startup.surfaces
486
+ failure_rule: >-
487
+ Over-budget results fail the target gate. They may return a measured
488
+ degraded envelope only where the referenced budget permits omission; they
489
+ never truncate bytes, omit required identity, or fabricate detail.
490
+
491
+ entity_migration:
492
+ status: one_way_forward_import_implemented
493
+ decision: 94
494
+ kind: single_full_upgrade_cutover
495
+ cutover_marker:
496
+ path: .agentera/state-mode.yaml
497
+ schema_version: agentera.stateMode.v1
498
+ entity_mode:
499
+ schemaVersion: agentera.stateMode.v1
500
+ mode: entities
501
+ absent_mode: legacy
502
+ invalid_behavior: fail_without_fallback
503
+ detection: read_only
504
+ publication_owner: development_channel_v2_to_v3_upgrade
505
+ selection: >-
506
+ Project state and CLI installation state are independent dimensions. A v3
507
+ CLI selects this cutover for recognized marker-absent v2 aggregate state
508
+ whether the CLI runs from a self-contained npm package or a source
509
+ checkout. Pending v1 Markdown state and marker-absent state with no
510
+ recognized v2 entity input are rejected with manual recovery instructions.
511
+ invocation:
512
+ explicit_apply: full_upgrade_yes_only
513
+ dry_run: optional_read_only_preview
514
+ ordinary_reads_migrate: false
515
+ ordinary_writes_migrate: false
516
+ apply_invokes_git: true
517
+ read_only_command: >-
518
+ npx -y agentera@next upgrade --channel development --project "$PWD" --dry-run
519
+ apply_command: >-
520
+ npx -y agentera@next upgrade --channel development --project "$PWD" --yes
521
+ apply_boundary: >-
522
+ Full upgrade serializes through the project writer lock, validates the
523
+ deterministic conversion, writes each missing canonical entity or accepts
524
+ an exact existing match, validates the complete graph, and writes the
525
+ authority marker last. There is no direct
526
+ entity apply, public operation ID, resume, rollback, or cross-major restore.
527
+ git_preflight:
528
+ required: true
529
+ project_root: exact_worktree_root
530
+ source: HEAD_commit
531
+ checkout: no_staged_modified_renamed_or_untracked_paths_except_exact_cutover_outputs
532
+ migration_inputs: regular_tracked_files_whose_bytes_and_executable_mode_match_HEAD
533
+ absent_input: absent_from_HEAD_and_worktree
534
+ ignored_or_untracked_input: refuse
535
+ verification: >-
536
+ Planning and apply resolve the current HEAD commit and prove every present
537
+ migration input is a safe regular tracked path whose bytes and executable
538
+ mode match that commit. Apply repeats the proof under the writer lock
539
+ before its first effect. Non-Git projects and dirty or unsupported source
540
+ state are refused before any selected upgrade effect.
541
+ upgrade_composition:
542
+ owner: development_channel_v2_to_v3_upgrade
543
+ selected_with: [full]
544
+ apply_consent: >-
545
+ The upgrade --yes consent derives all source and target bindings in
546
+ process. Users provide no hashes, approval files, migration IDs, --force,
547
+ or additional cutover consent. Any --only apply is rejected at this
548
+ cross-major boundary.
549
+ interruption: >-
550
+ A rerun recomputes the deterministic conversion from unchanged Git-bound
551
+ source, accepts existing canonical targets only when their bytes match,
552
+ writes the first missing target, validates the complete graph, and finishes
553
+ the marker forward. It never deletes or replaces canonical entities.
554
+ completed: >-
555
+ A valid entity marker makes legacy authority permanently inactive.
556
+ Repeated upgrade validates current entity state and reports a no-op;
557
+ normal entity writes may evolve records without reopening cutover.
558
+ preflight: >-
559
+ Upgrade plans artifact normalization, entity readiness, runtime work,
560
+ and cleanup read-only before any selected apply function runs. A detect,
561
+ artifact, or entity blocker prevents entity publication and activation.
562
+ Runtime or cleanup blockers do not prevent valid entity activation; their
563
+ resources remain untouched and are reported after the marker as
564
+ action-required work.
565
+ phase_filters: >-
566
+ Every --only apply is invalid during a v2-to-v3 boundary. Read-only
567
+ filtered preview may remain available.
568
+ legacy_projection: >-
569
+ Canonical v2 YAML and already-resolved v1 conversions are inventoried
570
+ directly. A pending v1 Markdown conversion is not projected through a
571
+ prerequisite write during planning and therefore blocks the composed
572
+ apply before effects.
573
+ lifecycle_normalization: >-
574
+ Deterministic legacy plan lifecycle normalization is part of entity
575
+ projection during cutover. Upgrade retains the original legacy YAML as
576
+ source and recovery evidence instead of rewriting it first.
577
+ empty_state: unsupported_unknown_source_with_manual_handoff
578
+ existing_entity_state: validate_then_no_op
579
+ source_scope:
580
+ included_entities: entity_target.entities
581
+ included_structured_relationships: entity_target.relationships.declarations
582
+ preserved_singletons: entity_target.intentional_singletons.boundaries
583
+ sources: >-
584
+ Current canonical files, verified immutable archives, overlays, revisions,
585
+ and validated source evidence are inventoried together without changing
586
+ their pre-cutover authority. Every present input must be recoverable from
587
+ the pinned Git commit.
588
+ recovered_projection_correlation: >-
589
+ Every archive carrying recovery_provenance must match the immutable
590
+ .agentera/archive/recovery/projection-correlation.yaml recovery set by
591
+ identity, archive bytes, final record SHA-256, parent/child Git proof or
592
+ legacy converter/source proof, current projection bytes, and overlay.
593
+ Missing, changed, new, replaced, or unlisted recovery evidence blocks.
594
+ internal_migration_diagnostic: true
595
+ read_only_preview:
596
+ implementation: implemented
597
+ ordering: artifact_then_boundary_then_source_identity_then_source_path
598
+ filter: complete_declared_inventory
599
+ source_fingerprint: >-
600
+ SHA-256 over canonical JSON containing every declared source path's
601
+ project-relative name, presence, byte length, byte SHA-256, permission
602
+ mode, regular-file type, device, and inode from one verified open
603
+ descriptor. Missing declared roots are represented explicitly with null
604
+ identity. No mtime, Git value, or cache participates.
605
+ project_root: >-
606
+ The selected root must exist, be a directory, and resolve without a
607
+ symbolic-link root or symbolic-link traversal. Failure is structured and
608
+ occurs before inventory or effects.
609
+ recursive_roots: >-
610
+ Every declared archive and objective inventory root is lstat-validated
611
+ before traversal and again when recursion enters it. Existing symbolic
612
+ links and non-directories are project-bound inventory failures; their
613
+ targets are never inventoried.
614
+ authority_binding: >-
615
+ The preview records the active state-storage authority schema version and
616
+ byte SHA-256. The complete preview digest includes both values, so any
617
+ authority-only change invalidates approval before an apply effect.
618
+ proposed_id: >-
619
+ Preview-only ten-letter candidates are deterministically allocated from a
620
+ domain-separated SHA-256 of the complete source fingerprint and canonical
621
+ source key. This is allocation of a new opaque target candidate, not
622
+ reconstruction of a missing source ID. A collision is a blocker. Apply
623
+ preserves the deterministic mapping in each canonical target path.
624
+ preview_digest: >-
625
+ SHA-256 over canonical JSON of the complete unbounded inventory, proposed
626
+ mapping, authority-validated final envelope byte SHA-256 values,
627
+ relationship rewrite map, counts, blockers, and source
628
+ fingerprint plus the project selector, complete-source filter, declared
629
+ order, and migration-authority binding before output omission.
630
+ target_validation: >-
631
+ Before preview can be ready or produce an approvable digest, every proposed
632
+ final envelope, record, public field vocabulary, and relationship graph is
633
+ validated through the same authority-backed canonical target validator used
634
+ defensively by upgrade apply and forward retry. A target failure is a corrupt blocker tied
635
+ to its source identity and recovery action; preserved nonentity residues are
636
+ excluded from target validation and publication.
637
+ output:
638
+ max_utf8_bytes: 32768
639
+ default_limit: 100
640
+ maximum_limit: 1000
641
+ omission: whole entries and diagnostics only
642
+ scalar_truncation: forbidden
643
+ required_omission_fields: [omitted, omitted_count, omission_reason, retrieval]
644
+ recovery: >-
645
+ --after SOURCE_IDENTITY advances from the last whole logical identity
646
+ returned only when accompanied by that page's --source-fingerprint and
647
+ --preview-digest. The digest binds the project selector, complete-source
648
+ filter, authority-declared order, migration authority, and complete
649
+ source snapshot. Any mismatch refuses continuation with a command that
650
+ omits --after and restarts from the current snapshot. Diagnostics travel
651
+ with their owning entry, so repeated use of retrieval.command recovers
652
+ every later omitted entry and diagnostic.
653
+ counts:
654
+ physical_records: every observed record before identity grouping
655
+ logical_identities: every source identity after grouping
656
+ mirrors: excess canonical-identical physical records grouped under one logical identity
657
+ duplicates: excess divergent physical records claiming one logical identity
658
+ conflicts: logical identities with divergent candidates plus proposed-target collisions
659
+ zero_write: >-
660
+ Inventory, preview, malformed-input handling, and source-binding checks
661
+ open no writer or upgrade lock and create no directory, temporary file,
662
+ mapping, snapshot, journal, cache, or state file.
663
+ binding: >-
664
+ Before any apply effect, recompute the complete preview and require its
665
+ source fingerprint and preview digest to match the Git-pinned preparation.
666
+ A mismatch refuses every selected effect.
667
+ source_outcomes:
668
+ valid_full:
669
+ outcome: ready
670
+ rule: map one complete validated source entity and every relationship exactly once
671
+ canonical_mirror:
672
+ outcome: ready_with_mirrored_provenance
673
+ rule: group canonical-identical physical records as one logical identity and retain every provenance class
674
+ degraded_recoverable:
675
+ outcome: ready_with_provenance
676
+ rule: admit only independently validated full detail and record its recovery provenance
677
+ summary_only_or_missing_detail:
678
+ outcome: blocked
679
+ rule: retain evidence and stop before publication; never reconstruct omitted fields
680
+ ambiguous_or_duplicate_identity:
681
+ outcome: blocked
682
+ rule: retain every candidate and require explicit disposition; never choose by order or recency
683
+ proposed_target_conflict:
684
+ outcome: blocked
685
+ rule: retain every colliding logical identity and allocate no winner
686
+ corrupt_or_unresolved_relationship:
687
+ outcome: blocked
688
+ rule: report the exact source and recovery action; never publish a partial graph
689
+ unsupported:
690
+ outcome: blocked
691
+ rule: preserve bytes and report the unsupported source contract
692
+ non_fabrication:
693
+ forbidden:
694
+ - synthetic entities for missing source detail
695
+ - inferred IDs from order, numbers, paths, timestamps, branches, writers, or Git references
696
+ - guessed relationship targets
697
+ - silent dropping, deduplication, or winner selection
698
+ partial_cutover_success: forbidden
699
+ forward_state:
700
+ persisted_recovery_state: none
701
+ publication_order: exact_or_missing_entities_then_graph_validation_then_marker
702
+ retry_rule: accept_exact_targets_and_continue_at_first_missing_path
703
+ divergent_target: stop_without_replacement_and_name_first_unresolved_path
704
+ forbidden_fields: [operation_id, migration_id, snapshots, source_bytes, inode_receipts, rollback_state]
705
+ historical_evidence: >-
706
+ Already committed .agentera/migrations content is inert and remains
707
+ byte-for-byte untouched. Read-only legacy manifest parsing is retained only
708
+ for public validation of entity markers created by the former cutover.
709
+ fault_test_hook: >-
710
+ Tests may set NODE_ENV=test and
711
+ AGENTERA_FAULT_INJECT_ENTITY_MIGRATION_AFTER_PHASE to one declared publication
712
+ phase. Other environments ignore the variable.
713
+ lifecycle:
714
+ - phase: inventory
715
+ mutates: false
716
+ exit: every source entity and relationship is classified
717
+ - phase: preview
718
+ mutates: false
719
+ exit: proposed graph, mapping, outcomes, blockers, and digest are complete
720
+ - phase: git_preflight
721
+ mutates: false
722
+ exit: project root, HEAD, clean checkout, source bytes, types, and modes match
723
+ - phase: publishing_entities
724
+ mutates: true
725
+ exit: every canonical target is an exact match or is published once
726
+ - phase: entities_published
727
+ mutates: false
728
+ exit: canonical source-to-target parity, uniqueness, ownership, relationships, and budgets pass
729
+ - phase: marker
730
+ mutates: true
731
+ exit: one durable marker activates entity_target and retires writable legacy authority
23
732
 
24
733
  scope:
25
734
  supported_artifacts:
@@ -422,7 +1131,7 @@ consumer_matrix:
422
1131
  access_contract:
423
1132
  startup: agentera prime --context <capability> --format json
424
1133
  list: agentera state <artifact-id> list --limit 20 --format json
425
- get: agentera state <artifact-id> get --number N --format json
1134
+ get: agentera state <artifact> get --id ID --format json
426
1135
  policy: >-
427
1136
  Use the bounded prime context first, then the bounded state list for
428
1137
  discovery and exact state get for requested detail. Raw artifact or Git
@@ -601,7 +1310,7 @@ identity:
601
1310
  accepted_pattern: '^(progress|decisions|health):[1-9][0-9]*$'
602
1311
  example: decisions:53
603
1312
  components:
604
- artifact_id: one of scope.supported_artifacts.artifact_id
1313
+ artifact_id: one of the supported artifact values declared by scope
605
1314
  entry_number: positive integer from the artifact's entry_number_field
606
1315
  uniqueness: stable_id is unique within one project archive
607
1316
  ordering:
@@ -879,10 +1588,12 @@ api:
879
1588
  empty_result: status=ok with entries=[] and counts.total=0; absence is not an error
880
1589
  durability:
881
1590
  command: agentera check durability [--project PATH] [--artifact ARTIFACT] [--number N] [--limit N] --format json
1591
+ entity_command: agentera check durability --project PATH --artifact ARTIFACT --id ID --format json
882
1592
  formats: [text, json, yaml]
883
1593
  selectors:
884
1594
  artifact: optional supported numbered archive artifact ID
885
1595
  number: optional positive entry number; requires artifact
1596
+ id: entity-mode bare entity ID; requires artifact and replaces number after cutover
886
1597
  limit: optional bounded result count
887
1598
  default_limit: 100
888
1599
  maximum_limit: 100
@@ -902,406 +1613,12 @@ api:
902
1613
  deterministic: >-
903
1614
  With unchanged local files and reachable refs, repeated checks emit the
904
1615
  same ordered result and do not create state or contact a remote.
905
- backfill:
906
- command: >-
907
- agentera state backfill [--project PATH] [--artifact ARTIFACT]
908
- [--number N] [--commit HASH] [--path PATH] [--limit N]
909
- [--dry-run|--apply --force] --format {text,json,yaml}
910
- formats: [text, json, yaml]
911
- default_limit: 100
912
- maximum_limit: 100
913
- maximum_commits: 500
914
- maximum_history_bytes: 16777216
915
- supported_artifacts: [progress, decisions, health]
916
- reachable_refs: [HEAD, refs/heads, refs/tags]
917
- excluded_refs: [refs/remotes, custom_refs]
918
- apply_requires: [--apply, --force, --project PATH, --artifact ARTIFACT, --number N]
919
- status_values: [complete, degraded, blocked, unavailable]
920
- response:
921
- required_fields: [command, mode, status, project, read_only, remote_contact, head, scan, counts, active_projections_unchanged, active_projection_hashes, omitted, omitted_count, omission_reason, continuation, entries, diagnostics, source_contract]
922
- entry_fields: [entry_id, artifact_id, entry_number, commit, path, blob_id, content_hash, ambiguity_reason, eligible, reachable, provenance, operation, refusal]
923
- modes:
924
- inventory: >-
925
- The default read-only mode reports up to maximum_limit final rows after
926
- combining reachable and rewritten-history occurrences. Omitted rows
927
- carry explicit omission metadata; returned rows include commit, path,
928
- blob identity, stable entry ID, canonical content hash, and an explicit
929
- ambiguity reason.
930
- preview: >-
931
- --dry-run is read-only and shows proposed immutable archive bytes only
932
- for a returned exact unique candidate, together with every matching
933
- provenance.
934
- apply: >-
935
- --apply --force is the only mutation mode. It requires one project,
936
- artifact, and entry number. A prior --dry-run is optional. Apply
937
- independently revalidates the selected project, current HEAD, allowed
938
- ref reachability, candidate path/blob/content, and immutable archive
939
- target immediately before publication, and never overwrites conflicts.
940
- ambiguity_reasons:
941
- - none
942
- - conflicting_versions
943
- - shallow_history
944
- - history_rewritten
945
- - missing_history
946
- - corrupt_history
947
- - changed_head
948
- - scan_bounded
949
- - git_unavailable
950
- - immutable_conflict
951
- - candidate_changed
952
- - no_matching_pin
953
- guarantees:
954
- read_only_inventory_and_preview: true
955
- apply_requires_force: true
956
- preview_optional: true
957
- apply_revalidation: >-
958
- Apply repeats project, HEAD, allowed-ref reachability, candidate
959
- provenance/content, and immutable-target checks immediately before
960
- publication; a failed check preserves active projections and archives.
961
- remote_contact: forbidden
962
- custom_refs: forbidden
963
- commit_fields_in_archive_records: forbidden
964
- projection_writes: forbidden
965
- immutable_conflicts: refuse_without_overwrite
966
- retry: identical_publication_is_idempotent
967
- failure_projection_rule: active_projections_remain_byte_identical
968
- omission:
969
- fields: [omitted, omitted_count, omission_reason, continuation]
970
- complete_reason: none
971
- bounded_reason: result_limit
972
- continuation: >-
973
- No cursor is issued. Use --artifact ARTIFACT --number N to retrieve an
974
- omitted entry because --limit cannot exceed maximum_limit (100).
975
- traceability:
976
- provenance_fields: [commit, path, blob_id, entry_id, content_hash, reachable]
977
- archive_record_forbids: [commit, commit_hash, git_commit, git_ref]
978
- recovery: >-
979
- Resolve the reported ambiguity, unavailable Git state, changed candidate,
980
- or immutable conflict and retry the same exact selectors. A refused
981
- operation leaves active projections and existing archives unchanged;
982
- identical publication is an idempotent replay.
983
- migrate:
984
- namespace: agentera state migrate
985
- command: >-
986
- agentera state migrate [--project PATH] [--artifact ARTIFACT]
987
- [--number N] [--path PATH] [--limit N]
988
- [--dry-run|--apply --force] --format {text,json,yaml}
989
- purpose: >-
990
- Inventory bounded, project-local legacy state and define the only
991
- authority for a later non-Git migration apply. This surface does not
992
- infer missing records, contact Git, contact a remote, or remove legacy
993
- source files.
994
- implementation_boundary: >-
995
- The runtime owns bounded, project-local candidate inventory and the
996
- explicit archive, backup, projection, and mutation flow described here.
997
- Inventory never reads Git or writes archives, backups, or projections;
998
- migration remains independent of the optional Git backfill surface.
999
- formats: [text, json, yaml]
1000
- default_limit: 20
1001
- maximum_limit: 100
1002
- supported_artifacts: [progress, decisions, health]
1003
- selectors:
1004
- project:
1005
- flag: --project PATH
1006
- default: current_working_directory
1007
- resolution: >-
1008
- Resolve the selected directory to a real project root before any
1009
- candidate is considered. The project root is selected explicitly or
1010
- is the caller's current working directory; AGENTERA_HOME, profile
1011
- paths, docs.yaml overrides, and Git worktrees do not replace it.
1012
- artifact:
1013
- flag: --artifact ARTIFACT
1014
- required_for_apply: true
1015
- valid_values: [progress, decisions, health]
1016
- number:
1017
- flag: --number N
1018
- pattern: '^[1-9][0-9]*$'
1019
- required_with: --artifact
1020
- meaning: exact positive legacy entry number; never a positional offset
1021
- path:
1022
- flag: --path PATH
1023
- pattern: '^[A-Za-z0-9][A-Za-z0-9._-]{0,63}\.(md|yaml|yml)$'
1024
- relative_to: selected_project_root
1025
- required_for_custom_apply: true
1026
- meaning: exact candidate path pin; inventory may omit it to enumerate candidates
1027
- limit:
1028
- flag: --limit N
1029
- default: 20
1030
- minimum: 1
1031
- maximum: 100
1032
- meaning: maximum returned candidate summaries, not a scan escape hatch
1033
- format:
1034
- flag: --format FORMAT
1035
- valid_values: [text, json, yaml]
1036
- modes:
1037
- inventory:
1038
- selector: default when neither --dry-run nor --apply is present
1039
- read_only: true
1040
- writes: forbidden
1041
- preview:
1042
- selector: --dry-run
1043
- read_only: true
1044
- writes: forbidden
1045
- output: exact proposed archive, backup, and projection operations only for addressable candidates
1046
- apply:
1047
- selector: --apply --force
1048
- read_only: false
1049
- mutation_intent: explicit_apply_and_force
1050
- selectors_required: [--artifact, --number]
1051
- mutation: >-
1052
- The runtime publishes only after revalidating the selected candidate,
1053
- project boundary, backup identity, and immutable archive identity.
1054
- invalid_combinations:
1055
- - flags: [--apply, --dry-run]
1056
- failure_class: invalid_selector
1057
- message: --apply and --dry-run are mutually exclusive
1058
- - flags: [--apply]
1059
- requires: --force
1060
- failure_class: invalid_selector
1061
- message: --apply requires explicit --force intent
1062
- - flags: [--force]
1063
- requires: --apply
1064
- failure_class: invalid_selector
1065
- message: --force requires --apply
1066
- inventory:
1067
- project_local: true
1068
- bounded_scan:
1069
- roots:
1070
- - path: .
1071
- maximum_depth: 1
1072
- - path: .agentera
1073
- maximum_depth: 1
1074
- excluded_relative_paths:
1075
- - .git
1076
- - .agentera/archive
1077
- - .agentera/overlays
1078
- - .agentera/migration-backups
1079
- maximum_candidate_files: 256
1080
- maximum_file_bytes: 1048576
1081
- maximum_total_bytes: 16777216
1082
- ordering: normalized_relative_path_ascending
1083
- candidate_rule: >-
1084
- A candidate is a regular, non-symlink file directly under one declared
1085
- scan root whose basename is ASCII and matches
1086
- ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}\.(md|yaml|yml)$. Fixed legacy names
1087
- are recognized first; every other accepted name is a custom candidate
1088
- and remains project-local.
1089
- fixed_names:
1090
- - path: .agentera/PROGRESS.md
1091
- artifact: progress
1092
- - path: .agentera/DECISIONS.md
1093
- artifact: decisions
1094
- - path: .agentera/HEALTH.md
1095
- artifact: health
1096
- custom_name_rule: >-
1097
- Custom names are discovered only within the declared roots and are
1098
- never mapped from their basename alone. A custom candidate is
1099
- addressable only when --path pins it, --artifact identifies the
1100
- numbered artifact, and parsing yields exactly one supported stable
1101
- identity for the requested --number. A candidate with zero, multiple,
1102
- conflicting, or unsupported identities is inventory-visible but not
1103
- apply-eligible.
1104
- deterministic_rejections:
1105
- unsafe_path: absolute paths, traversal segments, encoded traversal, URI paths, or symlink components
1106
- escaping_path: realpath is outside the selected project root
1107
- ambiguous_candidate: one candidate yields multiple artifact or entry identities, or identities conflict
1108
- unsupported_candidate: unsupported extension, non-regular file, invalid encoding, or unsupported artifact shape
1109
- scan_bounded: candidate or byte limits are exceeded; omitted candidates are reported, never silently dropped
1110
- project_boundary:
1111
- selected_root: resolved_realpath_of_project_selector
1112
- candidate_rule: >-
1113
- The candidate realpath and every existing parent must remain strictly
1114
- beneath selected_root. The project root itself is not a candidate.
1115
- reject: [absolute_candidate_path, traversal, encoded_traversal, uri_path, symlink_escape, outside_project]
1116
- docs_mapping: forbidden
1117
- remote_access: forbidden
1118
- compatibility_window:
1119
- name: v2_to_v3_local_state
1120
- scope: numbered_progress_decisions_health_only
1121
- supported_sources: [legacy_markdown, legacy_yaml, current_yaml_projection]
1122
- classifications: [complete, degraded, blocked, unsupported]
1123
- cases:
1124
- new:
1125
- classification: complete
1126
- behavior: preserve current archive and projection authority
1127
- legacy_full:
1128
- classification: degraded
1129
- behavior: archive exact parsed records and retain source provenance
1130
- legacy_summary:
1131
- classification: degraded
1132
- behavior: preserve summary-only detail and never reconstruct absent fields
1133
- non_git:
1134
- classification: complete
1135
- behavior: local inventory and publication do not require Git
1136
- ambiguous:
1137
- classification: blocked
1138
- behavior: never choose between candidates; preserve all diagnostics
1139
- corrupt:
1140
- classification: blocked
1141
- behavior: preserve source bytes and do not archive or project invalid records
1142
- unsupported:
1143
- classification: unsupported
1144
- behavior: report a deterministic candidate diagnostic without mutation
1145
- no_reconstruction: >-
1146
- Missing, ambiguous, compacted, summary-only, and satisfaction-incomplete
1147
- state remains explicitly classified. No fields, identity, satisfaction,
1148
- provenance, or history are inferred from names, summaries, Git, or
1149
- profile state. Decision 53 remains governed by overlays.decision_53_rules.
1150
- backups:
1151
- required_for_apply: true
1152
- project_local: true
1153
- root: .agentera/migration-backups
1154
- path_template: .agentera/migration-backups/<sha256-relative-source>.bak
1155
- bytes: exact_source_bytes_before_projection
1156
- identity: sha256(relative_source_path + NUL + source_bytes)
1157
- publication: exclusive_immutable_file
1158
- existing_backup: >-
1159
- An identical backup is an idempotent replay. Different bytes at the
1160
- same backup identity are backup_conflict and block without overwrite.
1161
- cleanup: forbidden
1162
- required_before_projection: true
1163
- publication:
1164
- order:
1165
- - validate_candidate_and_selector
1166
- - publish_immutable_archive_record
1167
- - publish_immutable_backup
1168
- - publish_current_projection
1169
- archive_before_projection: true
1170
- archive_immutability: storage.archive.mutation_policy
1171
- projection_failure: >-
1172
- Leave archive, backup, and the pre-existing projection bytes unchanged
1173
- except for successfully published immutable artifacts; retry must replay
1174
- identical artifacts rather than restart or synthesize a new identity.
1175
- monotonic_states: [inventory, previewed, archive_published, backup_published, projection_published]
1176
- retry: >-
1177
- Repeating the same project, selector, source bytes, and canonical record
1178
- is an idempotent replay. The same stable identity with different bytes
1179
- is immutable_conflict; no existing archive, backup, or projection bytes
1180
- may be overwritten.
1181
- git:
1182
- required: false
1183
- reads: forbidden
1184
- remote_contact: forbidden
1185
- completion_independent: true
1186
- provenance: local_source_path_and_content_hash_only
1187
- result:
1188
- schema_version: agentera.stateMigrationResult.v1
1189
- statuses: [complete, degraded, blocked, unavailable]
1190
- required_fields: [schemaVersion, command, status, mode, project, read_only, mutation_intent, mutation_performed, remote_contact, inventory_performed, entries, counts, diagnostics, source_contract, omitted, omitted_count, omission_reason, retrieval]
1191
- entry_fields: [candidate_id, path, artifact_id, entry_number, classification, detail_availability, compatibility, source, addressable, size_bytes, rejection, provenance]
1192
- count_fields: [physical, addressable, addressable_ids, unaddressable, ambiguous, mirrored, duplicate, conflict, omitted]
1193
- count_rules:
1194
- physical:
1195
- source: all_candidates
1196
- operation: count
1197
- addressable:
1198
- source: visible_entries
1199
- operation: count
1200
- predicates: [{field: addressable, equals: true}]
1201
- addressable_ids:
1202
- source: visible_entries
1203
- operation: distinct
1204
- field: candidate_id
1205
- unaddressable:
1206
- source: visible_entries
1207
- operation: count
1208
- predicates:
1209
- - {field: addressable, equals: false}
1210
- - {field: classification, not_equals: ambiguous}
1211
- ambiguous:
1212
- source: visible_entries
1213
- operation: count
1214
- predicates: [{field: classification, equals: ambiguous}]
1215
- mirrored:
1216
- source: visible_entries
1217
- operation: count
1218
- predicates: [{field: classification, equals: mirrored}]
1219
- duplicate:
1220
- source: visible_entries
1221
- operation: count
1222
- predicates: [{field: classification, equals: duplicate}]
1223
- conflict:
1224
- source: visible_entries
1225
- operation: count
1226
- predicates: [{field: classification, equals: conflict}]
1227
- omitted:
1228
- source: omitted_count
1229
- operation: value
1230
- omission:
1231
- fields: [omitted, omitted_count, omission_reason, retrieval]
1232
- field_sources:
1233
- omitted: has_omissions
1234
- omitted_count: omitted_count
1235
- omission_reason: omission_reason
1236
- retrieval: retrieval
1237
- complete_reason: none
1238
- bounded_reason: scan_bounded
1239
- output_bounded_reason: serialized_output_byte_budget
1240
- retry: >-
1241
- Retry with narrower project or selectors, or use the bounded list
1242
- pointer to continue from the same normalized snapshot.
1243
- output_retry: >-
1244
- Retry with a smaller --limit or narrower selectors; use --path with
1245
- --artifact and --number to address one omitted candidate. The omitted
1246
- records remain accounted for and no state was changed by output bounding.
1247
- retrieval: >-
1248
- agentera state migrate --project PATH [selectors] --limit N
1249
- semantics: >-
1250
- Omitted candidates are represented by omitted=true, omitted_count,
1251
- omission_reason, and a bounded retry/list pointer. Text, JSON, and YAML
1252
- are projections of the same envelope and never contain unbounded records.
1253
- failures:
1254
- schema_version: agentera.stateFailure.v1
1255
- deterministic: >-
1256
- The same authority, project bytes, selectors, and local filesystem
1257
- state produce the same failure class, syntax, example, and recovery.
1258
- classes:
1259
- - class: invalid_selector
1260
- message: selector is missing, duplicated, malformed, or not allowed for the selected mode
1261
- example: agentera state migrate --number 1 --format json
1262
- recovery: add one supported --artifact selector and retry; no state was changed
1263
- - class: project_boundary
1264
- message: selected project or candidate path escapes the project boundary
1265
- example: agentera state migrate --path ../secrets.yaml --format json
1266
- recovery: select a project-local relative path; no state was changed
1267
- - class: unsupported_candidate
1268
- message: candidate is not a supported regular file or artifact shape
1269
- example: agentera state migrate --path .agentera/state.txt --format json
1270
- recovery: use a supported Markdown or YAML candidate; no state was changed
1271
- - class: ambiguous_candidate
1272
- message: candidate has multiple or conflicting supported identities
1273
- example: agentera state migrate --artifact progress --number 1 --path CUSTOM.md --dry-run --format json
1274
- recovery: resolve the candidate ambiguity before retrying; no state was changed
1275
- - class: corrupt_candidate
1276
- message: candidate bytes or parsed record fail the declared artifact schema
1277
- example: agentera state migrate --artifact decisions --number 53 --dry-run --format json
1278
- recovery: repair or preserve the source and retry only after validation; no state was changed
1279
- - class: backup_conflict
1280
- message: immutable backup identity already contains different source bytes
1281
- example: agentera state migrate --artifact progress --number 1 --apply --force --format json
1282
- recovery: preserve the existing backup and resolve the source conflict; no projection was changed
1283
- - class: immutable_conflict
1284
- message: immutable archive identity already contains different canonical content
1285
- example: agentera state migrate --artifact progress --number 1 --apply --force --format json
1286
- recovery: preserve the existing archive and resolve the identity conflict; no projection was changed
1287
- - class: changed_candidate
1288
- message: candidate changed between inventory, preview, and apply
1289
- example: agentera state migrate --artifact health --number 1 --apply --force --format json
1290
- recovery: rerun inventory and preview against the current local bytes; no projection was changed
1291
- - class: scan_bounded
1292
- message: bounded candidate or byte limit was exceeded
1293
- example: agentera state migrate --limit 100 --format json
1294
- recovery: narrow the project or selectors; omitted candidates remain reported
1295
- guarantees:
1296
- read_only_inventory_and_preview: true
1297
- apply_requires_force: true
1298
- archive_before_projection: true
1299
- backups_before_projection: true
1300
- monotonic_retry: true
1301
- archive_immutability: true
1302
- project_local: true
1303
- remote_contact: forbidden
1304
- git_independent: true
1616
+ entity_migration_discovery:
1617
+ command: agentera state migrate entities --project PATH --dry-run --format json
1618
+ implementation: implemented
1619
+ read_only: true
1620
+ writes: forbidden
1621
+ authority: entity_migration.read_only_preview
1305
1622
  cursor:
1306
1623
  syntax: opaque TOKEN returned as response.next_cursor
1307
1624
  first_page: omit --cursor to establish a snapshot