agentera 3.0.0-dev.6 → 3.0.0-dev.69

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 (696) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -22
  3. package/bundle/CHANGELOG.md +1361 -0
  4. package/bundle/DESIGN.md +229 -0
  5. package/bundle/LICENSE +201 -0
  6. package/bundle/README.md +143 -0
  7. package/bundle/UPGRADE.md +252 -0
  8. package/bundle/extract-corpus-parity.json +21 -0
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +488 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -188
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -34
  13. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  14. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  15. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  16. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  17. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  18. package/bundle/references/analysis/verification-policy.yaml +266 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  24. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  25. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  26. package/bundle/references/cli/routing-model.md +155 -0
  27. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  28. package/bundle/references/cli/update-channels.yaml +19 -2
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +325 -362
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/registry.json +13 -13
  33. package/bundle/skills/agentera/SKILL.md +226 -422
  34. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  35. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  36. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  37. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  38. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +103 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +8 -6
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +184 -0
  42. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  44. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  45. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  47. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  50. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  52. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  53. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  56. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  58. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  61. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  62. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  63. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  64. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  65. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  66. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  67. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  68. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  69. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  71. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  72. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  73. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  74. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  75. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  78. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
  80. package/bundle/skills/agentera/protocol.yaml +31 -31
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +461 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +133 -20
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
  93. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  94. package/dist/analytics/extractCorpus/cli.js +101 -12
  95. package/dist/analytics/extractCorpus/copilotSessions.js +53 -9
  96. package/dist/analytics/extractCorpus/core.js +59 -24
  97. package/dist/analytics/extractCorpus/corpus.js +58 -23
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +12 -7
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  102. package/dist/analytics/extractCorpus/filesystemSources.js +1 -5
  103. package/dist/analytics/extractCorpus/index.js +6 -1
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +24 -5
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +98 -6
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +0 -1
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  112. package/dist/analytics/personalGlossaryProfile.js +219 -0
  113. package/dist/analytics/profileSignals.js +211 -0
  114. package/dist/analytics/usageStats.js +169 -42
  115. package/dist/audit/terminologyDrift.js +281 -0
  116. package/dist/bin/agentera.js +3 -2
  117. package/dist/capabilities/audit/instructions.js +16 -0
  118. package/dist/capabilities/build/instructions.js +59 -0
  119. package/dist/capabilities/design/instructions.js +4 -0
  120. package/dist/capabilities/discuss/instructions.js +29 -0
  121. package/dist/capabilities/document/instructions.js +11 -0
  122. package/dist/capabilities/index.js +29 -27
  123. package/dist/capabilities/optimize/instructions.js +14 -0
  124. package/dist/capabilities/orchestrate/instructions.js +42 -0
  125. package/dist/capabilities/plan/instructions.js +33 -0
  126. package/dist/capabilities/profile/instructions.js +70 -0
  127. package/dist/capabilities/research/instructions.js +5 -0
  128. package/dist/capabilities/status/instructions.js +15 -0
  129. package/dist/capabilities/status/startupInstructions.js +34 -0
  130. package/dist/capabilities/vision/instructions.js +4 -0
  131. package/dist/cli/appContext.js +30 -24
  132. package/dist/cli/argvalidate.js +0 -1
  133. package/dist/cli/capabilityContext/benchmark.js +25 -17
  134. package/dist/cli/capabilityContext/bespoke.js +31 -12
  135. package/dist/cli/capabilityContext/build.js +251 -0
  136. package/dist/cli/capabilityContext/closeout.js +33 -30
  137. package/dist/cli/capabilityContext/contract.js +39 -46
  138. package/dist/cli/capabilityContext/evidence.js +90 -73
  139. package/dist/cli/capabilityContext/index.js +1 -2
  140. package/dist/cli/capabilityContext/orchestration.js +45 -21
  141. package/dist/cli/capabilityContext/planState.js +93 -100
  142. package/dist/cli/capabilityContext/progress.js +60 -14
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +9 -20
  145. package/dist/cli/capabilityContext/slim.js +56 -10
  146. package/dist/cli/capabilityContext/startup.js +57 -115
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +37 -24
  149. package/dist/cli/capabilityContext.js +1 -2
  150. package/dist/cli/commands/appHome.js +22 -0
  151. package/dist/cli/commands/capability.js +4 -4
  152. package/dist/cli/commands/compact.js +163 -13
  153. package/dist/cli/commands/doctor.js +122 -114
  154. package/dist/cli/commands/durability.js +81 -0
  155. package/dist/cli/commands/glossaryAdvice.js +138 -0
  156. package/dist/cli/commands/lint.js +22 -8
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +746 -0
  159. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  160. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  161. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  162. package/dist/cli/commands/prime/collectOrientationState.js +219 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +421 -0
  164. package/dist/cli/commands/prime/types.js +1 -0
  165. package/dist/cli/commands/prime/v1Migration.js +38 -0
  166. package/dist/cli/commands/prime.js +80 -558
  167. package/dist/cli/commands/profileGrounding.js +55 -0
  168. package/dist/cli/commands/query.js +77 -52
  169. package/dist/cli/commands/report.js +88 -26
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -142
  172. package/dist/cli/commands/state/decisions.js +51 -61
  173. package/dist/cli/commands/state/docs.js +63 -86
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +11 -64
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +11 -111
  178. package/dist/cli/commands/state/index.js +6 -41
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +21 -64
  181. package/dist/cli/commands/state/plan.js +11 -169
  182. package/dist/cli/commands/state/planTasks.js +154 -0
  183. package/dist/cli/commands/state/plans.js +154 -0
  184. package/dist/cli/commands/state/progress.js +11 -45
  185. package/dist/cli/commands/state/shared.js +0 -1
  186. package/dist/cli/commands/state/todo.js +29 -108
  187. package/dist/cli/commands/state/write.js +433 -0
  188. package/dist/cli/commands/upgrade.js +146 -5
  189. package/dist/cli/commands/upgradeVerify.js +118 -0
  190. package/dist/cli/commands/validate.js +246 -211
  191. package/dist/cli/commands/verify.js +24 -9
  192. package/dist/cli/contracts/bundleStatus.js +1 -0
  193. package/dist/cli/contracts/orientationState.js +1 -0
  194. package/dist/cli/dispatch/argvParser.js +32 -0
  195. package/dist/cli/dispatch/check.js +94 -50
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +82 -52
  198. package/dist/cli/dispatch/lifecycle.js +268 -108
  199. package/dist/cli/dispatch/prime.js +68 -29
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +1 -2
  202. package/dist/cli/dispatch/state.js +68 -77
  203. package/dist/cli/dispatch.js +0 -1
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +395 -41
  206. package/dist/cli/migrationRequired.js +122 -0
  207. package/dist/cli/orientation/attention.js +61 -0
  208. package/dist/cli/orientation/corpusCoverage.js +102 -0
  209. package/dist/cli/orientation.js +438 -170
  210. package/dist/cli/planArtifacts.js +350 -0
  211. package/dist/cli/planEvidence.js +157 -0
  212. package/dist/cli/planLifecycleState.js +36 -0
  213. package/dist/cli/planTaskIndex.js +11 -0
  214. package/dist/cli/preCutoverCommand.js +32 -0
  215. package/dist/cli/prime-blob.js +71 -3
  216. package/dist/cli/profileAcquisition.js +167 -0
  217. package/dist/cli/startupCompletenessContract.js +59 -0
  218. package/dist/cli/stateQuery.js +56 -14
  219. package/dist/cli/structured.js +0 -1
  220. package/dist/cli/todoMarkdown.js +25 -12
  221. package/dist/cli/todoReadinessSelection.js +192 -0
  222. package/dist/cli/todoSeverity.js +18 -0
  223. package/dist/core/atomicWriter.js +20 -0
  224. package/dist/core/developmentChannel.js +1 -0
  225. package/dist/core/developmentInvocation.js +374 -0
  226. package/dist/core/difflib.js +0 -1
  227. package/dist/core/envPaths.js +20 -0
  228. package/dist/core/jsonValue.js +5 -0
  229. package/dist/core/paths.js +0 -1
  230. package/dist/core/pyjson.js +67 -3
  231. package/dist/core/shell.js +4 -0
  232. package/dist/core/skillIdentity.js +23 -0
  233. package/dist/core/sourceRoot.js +9 -12
  234. package/dist/core/text.js +10 -0
  235. package/dist/core/toml.js +0 -1
  236. package/dist/core/yaml.js +8 -1
  237. package/dist/eval/evalSkills.js +30 -26
  238. package/dist/eval/hybridRouteEvaluation.js +155 -0
  239. package/dist/eval/semanticEval.js +43 -20
  240. package/dist/eval/semanticFixtures.js +16 -5
  241. package/dist/hooks/common.js +3 -56
  242. package/dist/hooks/compaction/apply.js +252 -50
  243. package/dist/hooks/compaction/dryRun.js +7 -4
  244. package/dist/hooks/compaction/index.js +5 -6
  245. package/dist/hooks/compaction/parse.js +201 -5
  246. package/dist/hooks/compaction/retention.js +30 -25
  247. package/dist/hooks/compaction/status.js +149 -32
  248. package/dist/hooks/compaction/types.js +0 -1
  249. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  250. package/dist/hooks/validateArtifact/index.js +7 -64
  251. package/dist/hooks/validateArtifact/markdown.js +57 -7
  252. package/dist/hooks/validateArtifact/schema.js +110 -19
  253. package/dist/hooks/validateArtifact/traversal.js +13 -11
  254. package/dist/hooks/validateArtifact/violations.js +7 -5
  255. package/dist/migrate/v2HandoffManifest.js +127 -8
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +108 -0
  258. package/dist/registries/artifactProtocolIds.js +2 -1
  259. package/dist/registries/artifactRegistry.js +224 -63
  260. package/dist/registries/artifactSchemaProjection.js +45 -0
  261. package/dist/registries/capabilityContract.js +129 -2
  262. package/dist/registries/evaluatorHandoffContract.js +2 -3
  263. package/dist/registries/evidenceTierContract.js +371 -0
  264. package/dist/registries/glossaryAdviceContract.js +79 -0
  265. package/dist/registries/glossaryCaveatContract.js +67 -0
  266. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  267. package/dist/registries/glossaryEntryContract.js +757 -0
  268. package/dist/registries/glossaryTermIdentity.js +17 -0
  269. package/dist/registries/glossaryTermOccurrence.js +20 -0
  270. package/dist/registries/hybridRoute.js +274 -0
  271. package/dist/registries/hybridRouteReceipt.js +221 -0
  272. package/dist/registries/packagePublication.js +273 -0
  273. package/dist/registries/packageRegistry.js +187 -211
  274. package/dist/registries/todoReadinessContract.js +448 -0
  275. package/dist/registries/triggerLoader.js +174 -0
  276. package/dist/registries/verbosityBudgetContract.js +205 -0
  277. package/dist/release/releaseMetadata.js +156 -6
  278. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  279. package/dist/runtime/lifecycleAdapters.js +777 -0
  280. package/dist/runtime/lifecycleAuthority.js +453 -0
  281. package/dist/runtime/lifecycleOperationContract.js +123 -0
  282. package/dist/runtime/lifecycleOperations.js +634 -0
  283. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  284. package/dist/runtime/lifecyclePublication.js +415 -0
  285. package/dist/runtime/lifecycleSnapshot.js +438 -0
  286. package/dist/runtime/nativeResourceCleanup.js +502 -0
  287. package/dist/setup/opencode.js +20 -13
  288. package/dist/setup/opencodeConstants.js +1 -0
  289. package/dist/setup/sharedSkill.js +45 -0
  290. package/dist/setup/smokeChecks.js +21 -82
  291. package/dist/state/archiveDiscovery.js +580 -0
  292. package/dist/state/archivePublication.js +225 -0
  293. package/dist/state/archiveRecovery.js +237 -0
  294. package/dist/state/archiveReplay.js +53 -0
  295. package/dist/state/canonicalMigrationRecord.js +36 -0
  296. package/dist/state/changelog.js +221 -0
  297. package/dist/state/decisionEntities.js +367 -0
  298. package/dist/state/decisionLegacyValidation.js +215 -0
  299. package/dist/state/decisionMigrationProvenance.js +199 -0
  300. package/dist/state/decisionOverlay.js +254 -0
  301. package/dist/state/decisionRevision.js +256 -0
  302. package/dist/state/decisionRevisionMigration.js +89 -0
  303. package/dist/state/directRetrieval.js +323 -0
  304. package/dist/state/durability.js +324 -0
  305. package/dist/state/entityCutover.js +459 -0
  306. package/dist/state/entityCutoverGit.js +127 -0
  307. package/dist/state/entityGlossaryAuthority.js +13 -0
  308. package/dist/state/entityListProjection.js +187 -0
  309. package/dist/state/entityListRuntimeRegistry.js +85 -0
  310. package/dist/state/entityMigrationCausality.js +97 -0
  311. package/dist/state/entityMigrationIdentity.js +5 -0
  312. package/dist/state/entityMigrationPreview.js +840 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +859 -0
  315. package/dist/state/entityRetrievalHelp.js +506 -0
  316. package/dist/state/entityStorage.js +899 -0
  317. package/dist/state/exactReplacementRecovery.js +18 -0
  318. package/dist/state/experimentArchive.js +63 -0
  319. package/dist/state/experimentIdentity.js +202 -0
  320. package/dist/state/healthEntities.js +262 -0
  321. package/dist/state/healthEntityValidation.js +18 -0
  322. package/dist/state/healthRepair.js +69 -0
  323. package/dist/state/installRoot.js +64 -25
  324. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  325. package/dist/state/legacyIdentity.js +47 -0
  326. package/dist/state/legacySummaryRecord.js +6 -0
  327. package/dist/state/listAccounting.js +54 -0
  328. package/dist/state/listClassification.js +17 -0
  329. package/dist/state/listCursor.js +42 -0
  330. package/dist/state/listRetrieval.js +781 -0
  331. package/dist/state/migrationSourceBinding.js +30 -0
  332. package/dist/state/objectiveExperimentEntities.js +322 -0
  333. package/dist/state/planEntities.js +1027 -0
  334. package/dist/state/planIdentity.js +47 -0
  335. package/dist/state/planLineageValidation.js +52 -0
  336. package/dist/state/planReplacementTransaction.js +475 -0
  337. package/dist/state/planRetrieval.js +313 -0
  338. package/dist/state/planTaskRetrieval.js +294 -0
  339. package/dist/state/progressEntities.js +512 -0
  340. package/dist/state/progressGlossaryCaveat.js +168 -0
  341. package/dist/state/progressPublicationOrder.js +19 -0
  342. package/dist/state/progressWritePolicy.js +33 -0
  343. package/dist/state/projectRoot.js +62 -0
  344. package/dist/state/projectionPolicy.js +190 -0
  345. package/dist/state/retrievalAuthority.js +156 -0
  346. package/dist/state/safeProjectFile.js +155 -0
  347. package/dist/state/startupAnalysis/benchmark.js +92 -27
  348. package/dist/state/startupAnalysis/contract.js +48 -10
  349. package/dist/state/startupAnalysis/helpers.js +27 -73
  350. package/dist/state/startupAnalysis/index.js +0 -1
  351. package/dist/state/startupAnalysis/metrics.js +25 -19
  352. package/dist/state/startupAnalysis/records.js +13 -10
  353. package/dist/state/startupAnalysis/report.js +26 -38
  354. package/dist/state/startupAnalysis/threshold.js +19 -7
  355. package/dist/state/startupAnalysis.js +0 -1
  356. package/dist/state/startupProjection.js +499 -0
  357. package/dist/state/stateMode.js +222 -0
  358. package/dist/state/stateStorageAuthority.js +47 -0
  359. package/dist/state/summaryEntityRead.js +25 -0
  360. package/dist/state/summaryMigrationProvenance.js +66 -0
  361. package/dist/state/summarySourceRowAuthority.js +36 -0
  362. package/dist/state/todoActivationSafety.js +58 -0
  363. package/dist/state/todoDocsEntities.js +1124 -0
  364. package/dist/state/todoDocsEntityValidation.js +158 -0
  365. package/dist/state/todoMarkdownProjection.js +51 -0
  366. package/dist/state/todoReconciliationActivation.js +182 -0
  367. package/dist/state/todoReconciliationInspection.js +171 -0
  368. package/dist/state/todoReconciliationRepair.js +318 -0
  369. package/dist/state/todoReconciliationTransaction.js +595 -0
  370. package/dist/state/write/assign.js +20 -0
  371. package/dist/state/write/candidateMutation.js +269 -0
  372. package/dist/state/write/errors.js +11 -0
  373. package/dist/state/write/experimentPublication.js +192 -0
  374. package/dist/state/write/explain.js +377 -0
  375. package/dist/state/write/fields.js +61 -0
  376. package/dist/state/write/glossaryPublication.js +263 -0
  377. package/dist/state/write/grammar.js +285 -0
  378. package/dist/state/write/helpers.js +29 -0
  379. package/dist/state/write/index.js +12 -0
  380. package/dist/state/write/input.js +391 -0
  381. package/dist/state/write/lock.js +837 -0
  382. package/dist/state/write/mutation.js +234 -0
  383. package/dist/state/write/operations.js +170 -0
  384. package/dist/state/write/planEvaluation.js +128 -0
  385. package/dist/state/write/planPublication.js +179 -0
  386. package/dist/state/write/runtimeOperations.js +146 -0
  387. package/dist/state/write/serialize.js +1 -0
  388. package/dist/state/write/transaction.js +57 -0
  389. package/dist/state/write/validate.js +7 -0
  390. package/dist/upgrade/appContentRefresh.js +383 -0
  391. package/dist/upgrade/appModel.js +8 -7
  392. package/dist/upgrade/atomicWriter.js +1 -0
  393. package/dist/upgrade/bundleEvidence.js +33 -0
  394. package/dist/upgrade/channels.js +12 -8
  395. package/dist/upgrade/compatibility.js +56 -21
  396. package/dist/upgrade/doctor.js +165 -199
  397. package/dist/upgrade/doctorClassifier.js +187 -0
  398. package/dist/upgrade/installedHooksRetirement.js +196 -0
  399. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  400. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  401. package/dist/upgrade/migrateArtifactsV2ToV3.js +375 -79
  402. package/dist/upgrade/migrationPublication.js +122 -0
  403. package/dist/upgrade/nextMajorDoctor.js +29 -10
  404. package/dist/upgrade/npxPlatformStatus.js +22 -0
  405. package/dist/upgrade/projectIntegration.js +145 -189
  406. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  407. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  408. package/dist/upgrade/runtimeMigration.js +272 -373
  409. package/dist/upgrade/upgradeCommands.js +14 -1
  410. package/dist/upgrade/upgradeLock.js +85 -0
  411. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  412. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  413. package/dist/upgrade/versionResolution.js +2 -3
  414. package/dist/validate/activationArtifactEvidence.js +852 -0
  415. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  416. package/dist/validate/activationConjunction.js +816 -0
  417. package/dist/validate/activationEvidenceManifest.js +531 -0
  418. package/dist/validate/activationPackageSemantics.js +29 -0
  419. package/dist/validate/appHomeContract.js +2 -8
  420. package/dist/validate/bootstrapAuthority.js +44 -0
  421. package/dist/validate/capability.js +133 -12
  422. package/dist/validate/crossCapability.js +15 -10
  423. package/dist/validate/retainedReferenceAuthority.js +879 -0
  424. package/dist/validate/selfAudit.js +39 -45
  425. package/dist/validate/v1LegacyCruft.js +131 -0
  426. package/dist/validate/vocabularyAuthority.js +18 -13
  427. package/package.json +60 -29
  428. package/bundle/references/adapters/cursor.md +0 -213
  429. package/bundle/references/adapters/opencode.md +0 -530
  430. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  431. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  432. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  433. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  434. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  435. package/bundle/references/analysis/benchmark.md +0 -267
  436. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  437. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  438. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  439. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  440. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  441. package/bundle/references/cli/coexistence-probe.yaml +0 -9
  442. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  443. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  444. package/bundle/references/cli/upgrade-repair-wording.md +0 -31
  445. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  446. package/bundle/references/meta/documentation-inventory.md +0 -49
  447. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  448. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  449. package/bundle/skills/agentera/agents/hej.toml +0 -6
  450. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  451. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  452. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  453. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  454. package/bundle/skills/agentera/agents/planera.toml +0 -6
  455. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  456. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  457. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  458. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  459. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  460. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  461. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  462. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  463. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  464. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  465. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  466. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  467. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  468. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  471. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  472. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  473. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  474. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  475. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  478. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  479. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  481. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  482. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  483. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  484. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  485. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  486. package/bundle/skills/agentera/references/contract.md +0 -1039
  487. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  488. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  489. package/dist/analytics/extractCorpus/core.js.map +0 -1
  490. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  491. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  492. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  493. package/dist/analytics/extractCorpus/index.js.map +0 -1
  494. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  495. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  496. package/dist/analytics/extractCorpus.js.map +0 -1
  497. package/dist/analytics/usageStats.js.map +0 -1
  498. package/dist/bin/agentera.js.map +0 -1
  499. package/dist/capabilities/dokumentera/instructions.js +0 -6
  500. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  501. package/dist/capabilities/hej/instructions.js +0 -6
  502. package/dist/capabilities/hej/instructions.js.map +0 -1
  503. package/dist/capabilities/index.js.map +0 -1
  504. package/dist/capabilities/inspektera/instructions.js +0 -6
  505. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  506. package/dist/capabilities/inspirera/instructions.js +0 -6
  507. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  508. package/dist/capabilities/optimera/instructions.js +0 -6
  509. package/dist/capabilities/optimera/instructions.js.map +0 -1
  510. package/dist/capabilities/orkestrera/instructions.js +0 -6
  511. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  512. package/dist/capabilities/planera/instructions.js +0 -6
  513. package/dist/capabilities/planera/instructions.js.map +0 -1
  514. package/dist/capabilities/profilera/instructions.js +0 -6
  515. package/dist/capabilities/profilera/instructions.js.map +0 -1
  516. package/dist/capabilities/realisera/instructions.js +0 -6
  517. package/dist/capabilities/realisera/instructions.js.map +0 -1
  518. package/dist/capabilities/resonera/instructions.js +0 -6
  519. package/dist/capabilities/resonera/instructions.js.map +0 -1
  520. package/dist/capabilities/visionera/instructions.js +0 -6
  521. package/dist/capabilities/visionera/instructions.js.map +0 -1
  522. package/dist/capabilities/visualisera/instructions.js +0 -6
  523. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  524. package/dist/cli/appContext.js.map +0 -1
  525. package/dist/cli/argvalidate.js.map +0 -1
  526. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  527. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  528. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  529. package/dist/cli/capabilityContext/contract.js.map +0 -1
  530. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  531. package/dist/cli/capabilityContext/index.js.map +0 -1
  532. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  533. package/dist/cli/capabilityContext/planState.js.map +0 -1
  534. package/dist/cli/capabilityContext/progress.js.map +0 -1
  535. package/dist/cli/capabilityContext/realisera.js +0 -174
  536. package/dist/cli/capabilityContext/realisera.js.map +0 -1
  537. package/dist/cli/capabilityContext/shared.js.map +0 -1
  538. package/dist/cli/capabilityContext/slim.js.map +0 -1
  539. package/dist/cli/capabilityContext/startup.js.map +0 -1
  540. package/dist/cli/capabilityContext/types.js.map +0 -1
  541. package/dist/cli/capabilityContext.js.map +0 -1
  542. package/dist/cli/commands/backfill.js +0 -84
  543. package/dist/cli/commands/backfill.js.map +0 -1
  544. package/dist/cli/commands/capability.js.map +0 -1
  545. package/dist/cli/commands/compact.js.map +0 -1
  546. package/dist/cli/commands/doctor.js.map +0 -1
  547. package/dist/cli/commands/lint.js.map +0 -1
  548. package/dist/cli/commands/prime.js.map +0 -1
  549. package/dist/cli/commands/query.js.map +0 -1
  550. package/dist/cli/commands/report.js.map +0 -1
  551. package/dist/cli/commands/schema.js.map +0 -1
  552. package/dist/cli/commands/state/decisions.js.map +0 -1
  553. package/dist/cli/commands/state/docs.js.map +0 -1
  554. package/dist/cli/commands/state/experiments.js.map +0 -1
  555. package/dist/cli/commands/state/health.js.map +0 -1
  556. package/dist/cli/commands/state/index.js.map +0 -1
  557. package/dist/cli/commands/state/objective.js.map +0 -1
  558. package/dist/cli/commands/state/plan.js.map +0 -1
  559. package/dist/cli/commands/state/progress.js.map +0 -1
  560. package/dist/cli/commands/state/shared.js.map +0 -1
  561. package/dist/cli/commands/state/todo.js.map +0 -1
  562. package/dist/cli/commands/state.js +0 -1023
  563. package/dist/cli/commands/state.js.map +0 -1
  564. package/dist/cli/commands/upgrade.js.map +0 -1
  565. package/dist/cli/commands/validate.js.map +0 -1
  566. package/dist/cli/commands/verify.js.map +0 -1
  567. package/dist/cli/dispatch/check.js.map +0 -1
  568. package/dist/cli/dispatch/index.js.map +0 -1
  569. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  570. package/dist/cli/dispatch/prime.js.map +0 -1
  571. package/dist/cli/dispatch/shared.js.map +0 -1
  572. package/dist/cli/dispatch/state.js.map +0 -1
  573. package/dist/cli/dispatch.js.map +0 -1
  574. package/dist/cli/errors.js.map +0 -1
  575. package/dist/cli/help.js.map +0 -1
  576. package/dist/cli/orientation.js.map +0 -1
  577. package/dist/cli/prime-blob.js.map +0 -1
  578. package/dist/cli/stateQuery.js.map +0 -1
  579. package/dist/cli/structured.js.map +0 -1
  580. package/dist/cli/todoMarkdown.js.map +0 -1
  581. package/dist/core/difflib.js.map +0 -1
  582. package/dist/core/git.js +0 -43
  583. package/dist/core/git.js.map +0 -1
  584. package/dist/core/paths.js.map +0 -1
  585. package/dist/core/pyjson.js.map +0 -1
  586. package/dist/core/sourceRoot.js.map +0 -1
  587. package/dist/core/toml.js.map +0 -1
  588. package/dist/core/yaml.js.map +0 -1
  589. package/dist/eval/evalSkills.js.map +0 -1
  590. package/dist/eval/semanticEval.js.map +0 -1
  591. package/dist/eval/semanticFixtures.js.map +0 -1
  592. package/dist/hooks/common.js.map +0 -1
  593. package/dist/hooks/compaction/apply.js.map +0 -1
  594. package/dist/hooks/compaction/dryRun.js.map +0 -1
  595. package/dist/hooks/compaction/index.js.map +0 -1
  596. package/dist/hooks/compaction/parse.js.map +0 -1
  597. package/dist/hooks/compaction/retention.js.map +0 -1
  598. package/dist/hooks/compaction/status.js.map +0 -1
  599. package/dist/hooks/compaction/types.js.map +0 -1
  600. package/dist/hooks/compaction.js +0 -935
  601. package/dist/hooks/compaction.js.map +0 -1
  602. package/dist/hooks/cursorPreToolUse.js +0 -19
  603. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  604. package/dist/hooks/cursorSessionStart.js +0 -71
  605. package/dist/hooks/cursorSessionStart.js.map +0 -1
  606. package/dist/hooks/sessionStart.js +0 -209
  607. package/dist/hooks/sessionStart.js.map +0 -1
  608. package/dist/hooks/sessionStop.js +0 -203
  609. package/dist/hooks/sessionStop.js.map +0 -1
  610. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  611. package/dist/hooks/validateArtifact/index.js.map +0 -1
  612. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  613. package/dist/hooks/validateArtifact/runtime.js +0 -83
  614. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  615. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  616. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  617. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  618. package/dist/hooks/validateArtifact.js +0 -924
  619. package/dist/hooks/validateArtifact.js.map +0 -1
  620. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  621. package/dist/registries/artifactProtocolIds.js.map +0 -1
  622. package/dist/registries/artifactRegistry.js.map +0 -1
  623. package/dist/registries/capabilityContract.js.map +0 -1
  624. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  625. package/dist/registries/packageRegistry.js.map +0 -1
  626. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  627. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  628. package/dist/release/releaseMetadata.js.map +0 -1
  629. package/dist/setup/codex/agents.js +0 -96
  630. package/dist/setup/codex/agents.js.map +0 -1
  631. package/dist/setup/codex/cli.js +0 -161
  632. package/dist/setup/codex/cli.js.map +0 -1
  633. package/dist/setup/codex/configToml.js +0 -644
  634. package/dist/setup/codex/configToml.js.map +0 -1
  635. package/dist/setup/codex/constants.js +0 -29
  636. package/dist/setup/codex/constants.js.map +0 -1
  637. package/dist/setup/codex/installRoot.js +0 -64
  638. package/dist/setup/codex/installRoot.js.map +0 -1
  639. package/dist/setup/codex/state.js +0 -270
  640. package/dist/setup/codex/state.js.map +0 -1
  641. package/dist/setup/codex.js +0 -12
  642. package/dist/setup/codex.js.map +0 -1
  643. package/dist/setup/copilot.js +0 -227
  644. package/dist/setup/copilot.js.map +0 -1
  645. package/dist/setup/cursor.js +0 -127
  646. package/dist/setup/cursor.js.map +0 -1
  647. package/dist/setup/doctor/core.js +0 -300
  648. package/dist/setup/doctor/core.js.map +0 -1
  649. package/dist/setup/doctor/diagnostics.js +0 -247
  650. package/dist/setup/doctor/diagnostics.js.map +0 -1
  651. package/dist/setup/doctor/opencode.js +0 -281
  652. package/dist/setup/doctor/opencode.js.map +0 -1
  653. package/dist/setup/doctor/report.js +0 -474
  654. package/dist/setup/doctor/report.js.map +0 -1
  655. package/dist/setup/doctor.js +0 -10
  656. package/dist/setup/doctor.js.map +0 -1
  657. package/dist/setup/opencode.js.map +0 -1
  658. package/dist/setup/smokeChecks.js.map +0 -1
  659. package/dist/state/installRoot.js.map +0 -1
  660. package/dist/state/progressCommit.js +0 -289
  661. package/dist/state/progressCommit.js.map +0 -1
  662. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  663. package/dist/state/startupAnalysis/contract.js.map +0 -1
  664. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  665. package/dist/state/startupAnalysis/index.js.map +0 -1
  666. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  667. package/dist/state/startupAnalysis/records.js.map +0 -1
  668. package/dist/state/startupAnalysis/report.js.map +0 -1
  669. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  670. package/dist/state/startupAnalysis.js.map +0 -1
  671. package/dist/upgrade/appModel.js.map +0 -1
  672. package/dist/upgrade/channels.js.map +0 -1
  673. package/dist/upgrade/coexistenceProbe.js +0 -83
  674. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  675. package/dist/upgrade/compatibility.js.map +0 -1
  676. package/dist/upgrade/doctor.js.map +0 -1
  677. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  678. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  679. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  680. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  681. package/dist/upgrade/projectIntegration.js.map +0 -1
  682. package/dist/upgrade/runtimeMigration.js.map +0 -1
  683. package/dist/upgrade/upgradeCommands.js.map +0 -1
  684. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  685. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  686. package/dist/upgrade/versionResolution.js.map +0 -1
  687. package/dist/validate/appHomeContract.js.map +0 -1
  688. package/dist/validate/capability.js.map +0 -1
  689. package/dist/validate/crossCapability.js.map +0 -1
  690. package/dist/validate/lifecycleAdapters.js +0 -772
  691. package/dist/validate/lifecycleAdapters.js.map +0 -1
  692. package/dist/validate/selfAudit.js.map +0 -1
  693. package/dist/validate/vocabularyAuthority.js.map +0 -1
  694. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  695. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  696. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -4,9 +4,29 @@
4
4
  * Splits a markdown artifact into "full" and "oneline" entries by
5
5
  * walking the spec's heading regex, then collects the trailing
6
6
  * detail body up to the next heading. The TODO-resolved section
7
- * uses indented detail lines as the body delimiter.
7
+ * uses indented detail lines as the body delimiter; open items stay
8
+ * in severity bands and resolved items belong only under
9
+ * `## ✓ Resolved`.
8
10
  */
9
- import { escapeRe } from "./dryRun.js";
11
+ import { parseTodoMarkdownListItem } from "../../cli/todoMarkdown.js";
12
+ import { MAX_FULL_ENTRIES, MAX_TOTAL_ENTRIES } from "../common.js";
13
+ import { SPECS, escapeRe, formatTodoOneline } from "./dryRun.js";
14
+ const SEVERITY_HEADING_RE = /^##\s*(⇶|⇉|→|⇢)\s/m;
15
+ const STRIKETHROUGH_ITEM_RE = /^(\s*)-\s+~~(.+?)~~\s*(.*)$/;
16
+ // Shared case-insensitive resolved-heading matcher. Duplicate detection
17
+ // (countTodoResolvedSectionHeadings), validation (markdown.ts), classification
18
+ // (isTodoResolvedSectionHeading), and extraction (extractResolvedSection) all
19
+ // use these so they accept the same variants: `## ✓ Resolved`, `## Resolved`,
20
+ // `## resolved`, `## RESOLVED`. Formerly extractResolvedSection used `\s+`
21
+ // (requiring a space after ##) without the `i` flag, silently rejecting
22
+ // case variants and `##Resolved`; now unified.
23
+ const TODO_RESOLVED_HEADING_RE = /^##\s*(?:✓\s+)?Resolved\s*$/im;
24
+ const TODO_RESOLVED_HEADING_GLOBAL_RE = /^##\s*(?:✓\s+)?Resolved\s*$/gim;
25
+ // TODO.md is a bounded human-facing queue, not a lossless numbered archive:
26
+ // dropped resolved entries are recoverable only via project history (Git),
27
+ // and only if previously committed. Surfaced in compaction diagnostics
28
+ // alongside the `dropped` count.
29
+ export const TODO_DROPPED_RECOVERY_GUIDANCE = "dropped resolved entries are not retained in a lossless archive; recover previously committed content via Git: `git log -p -- :/TODO.md` (non-Git projects have no historical recovery)";
10
30
  export function splitArchive(text, archiveHeading) {
11
31
  if (!archiveHeading)
12
32
  return [text, ""];
@@ -65,7 +85,7 @@ export function parseOnelineEntries(text, spec) {
65
85
  return entries;
66
86
  }
67
87
  export function extractResolvedSection(text) {
68
- const m = /^##\s+(?:✓\s+)?Resolved\s*$/m.exec(text);
88
+ const m = TODO_RESOLVED_HEADING_RE.exec(text);
69
89
  if (!m)
70
90
  return [-1, -1, ""];
71
91
  const bodyStart = m.index + m[0].length + 1;
@@ -115,6 +135,184 @@ export function parseTodoResolved(text, spec) {
115
135
  }
116
136
  return entries;
117
137
  }
138
+ export function isTodoSeveritySectionHeading(line) {
139
+ return SEVERITY_HEADING_RE.test(line.trim());
140
+ }
141
+ export function isTodoResolvedSectionHeading(line) {
142
+ return TODO_RESOLVED_HEADING_RE.test(line.trim());
143
+ }
144
+ /**
145
+ * Count `## ✓ Resolved` section headings in a TODO.md. A well-formed queue has
146
+ * exactly one; duplicates make parsing silently process only the first and
147
+ * hide the remaining entries from the compaction budget. Callers (validation,
148
+ * compaction status, compaction apply) refuse when this returns a value > 1.
149
+ */
150
+ export function countTodoResolvedSectionHeadings(text) {
151
+ const matches = text.match(TODO_RESOLVED_HEADING_GLOBAL_RE);
152
+ return matches ? matches.length : 0;
153
+ }
154
+ export function classifyTodoSectionHeading(line) {
155
+ if (isTodoSeveritySectionHeading(line))
156
+ return "severity";
157
+ if (isTodoResolvedSectionHeading(line))
158
+ return "resolved";
159
+ if (/^##\s/.test(line.trim()))
160
+ return "other";
161
+ return "other";
162
+ }
163
+ export function strikethroughTodoLineToCheckbox(line) {
164
+ const m = STRIKETHROUGH_ITEM_RE.exec(line);
165
+ if (!m)
166
+ return null;
167
+ const tail = m[3]?.trim();
168
+ const body = m[2].trim();
169
+ return `${m[1]}- [x] ${body}${tail ? (tail.startsWith("·") ? ` ${tail}` : ` ${tail}`) : ""}`;
170
+ }
171
+ export function isLegacyStrikethroughTodoLine(line) {
172
+ return /^(\s*)-\s+~~/.test(line);
173
+ }
174
+ export function countTodoResolvedInSeverityBands(content) {
175
+ let count = 0;
176
+ let section = "other";
177
+ for (const line of content.split(/\r\n|\r|\n/)) {
178
+ const kind = classifyTodoSectionHeading(line);
179
+ if (kind !== "other" || /^##\s/.test(line.trim())) {
180
+ section = kind;
181
+ continue;
182
+ }
183
+ if (section !== "severity")
184
+ continue;
185
+ const trimmed = line.trim();
186
+ if (!trimmed.startsWith("-"))
187
+ continue;
188
+ const parsed = parseTodoMarkdownListItem(trimmed);
189
+ if (parsed?.status === "resolved" || isLegacyStrikethroughTodoLine(trimmed)) {
190
+ count += 1;
191
+ }
192
+ }
193
+ return count;
194
+ }
195
+ export function countTodoResolvedEntries(content) {
196
+ const spec = SPECS["todo-resolved"];
197
+ const resolvedSection = parseTodoResolved(content, spec);
198
+ const misplaced = countTodoResolvedInSeverityBands(content);
199
+ const total = resolvedSection.length + misplaced;
200
+ // Positional tiering per TC9: the first ten resolved rows are the
201
+ // recent/full-detail tier even when they have no indented body; rows
202
+ // 11+ are the summary tier. This keeps status reporting consistent
203
+ // with how compactTodoEntries assigns tiers (positional, not
204
+ // body-presence-based), so a compacted file with 10 header-only rows
205
+ // + 40 summaries reports 10/40 (not 0/50).
206
+ return {
207
+ full: Math.min(total, MAX_FULL_ENTRIES),
208
+ oneline: Math.max(0, total - MAX_FULL_ENTRIES),
209
+ };
210
+ }
211
+ /**
212
+ * Count resolved entries in positions 11-50 that need ≤15-word summarization
213
+ * but are not yet summaries. An entry needs summarization when:
214
+ * - it has an indented body (should be stripped), or
215
+ * - its kind is "full" (should be demoted to the summary tier), or
216
+ * - its header differs from what `formatTodoOneline` would produce (i.e.
217
+ * it is a long verbatim header, not a ≤15-word summary).
218
+ *
219
+ * Returns 0 when the Resolved section is already compacted (idempotent).
220
+ * `check compact` uses this to detect in-budget (≤50) TODOs that still need
221
+ * a formatting rewrite, so `--mode fix` is triggered before entries overflow.
222
+ */
223
+ export function countTodoPendingSummarization(content) {
224
+ const spec = SPECS["todo-resolved"];
225
+ const entries = parseTodoResolved(content, spec);
226
+ if (entries.length <= MAX_FULL_ENTRIES)
227
+ return 0;
228
+ const summaryTier = entries.slice(MAX_FULL_ENTRIES, MAX_TOTAL_ENTRIES);
229
+ let count = 0;
230
+ for (const entry of summaryTier) {
231
+ if (entry.body) {
232
+ count++;
233
+ continue;
234
+ }
235
+ if (entry.kind === "full") {
236
+ count++;
237
+ continue;
238
+ }
239
+ // kind=oneline, no body: check if header matches the summary format
240
+ // by forcing kind="full" through formatTodoOneline (truncation path).
241
+ const expected = formatTodoOneline({ ...entry, kind: "full" });
242
+ if (entry.header.trim() !== expected.trim())
243
+ count++;
244
+ }
245
+ return count;
246
+ }
247
+ /**
248
+ * Move resolved rows from severity bands into `## ✓ Resolved`, creating the
249
+ * section when absent. Newly migrated rows are prepended (newest-first folds).
250
+ */
251
+ export function normalizeTodoResolvedLayout(content) {
252
+ const lines = content.split(/\r\n|\r|\n/);
253
+ const beforeResolved = [];
254
+ const migratedResolved = [];
255
+ const existingResolved = [];
256
+ const afterResolved = [];
257
+ let section = "other";
258
+ let seenResolvedHeading = false;
259
+ for (const line of lines) {
260
+ const headingKind = classifyTodoSectionHeading(line);
261
+ if (headingKind === "resolved") {
262
+ seenResolvedHeading = true;
263
+ section = "resolved";
264
+ continue;
265
+ }
266
+ if (headingKind === "severity") {
267
+ section = "severity";
268
+ if (!seenResolvedHeading)
269
+ beforeResolved.push(line);
270
+ else
271
+ afterResolved.push(line);
272
+ continue;
273
+ }
274
+ if (/^##\s/.test(line.trim())) {
275
+ section = "other";
276
+ if (!seenResolvedHeading)
277
+ beforeResolved.push(line);
278
+ else
279
+ afterResolved.push(line);
280
+ continue;
281
+ }
282
+ const trimmed = line.trim();
283
+ if (section === "resolved") {
284
+ if (trimmed)
285
+ existingResolved.push(line);
286
+ continue;
287
+ }
288
+ if (section === "severity" && trimmed.startsWith("-")) {
289
+ const converted = strikethroughTodoLineToCheckbox(line) ?? line;
290
+ const parsed = parseTodoMarkdownListItem(converted.trim());
291
+ if (parsed?.status === "resolved" || isLegacyStrikethroughTodoLine(trimmed)) {
292
+ migratedResolved.push(converted.trim());
293
+ continue;
294
+ }
295
+ }
296
+ if (!seenResolvedHeading)
297
+ beforeResolved.push(line);
298
+ else
299
+ afterResolved.push(line);
300
+ }
301
+ if (migratedResolved.length === 0) {
302
+ return { text: content, changed: false };
303
+ }
304
+ const rebuilt = [...beforeResolved];
305
+ if (rebuilt.length > 0 && rebuilt[rebuilt.length - 1]?.trim() !== "")
306
+ rebuilt.push("");
307
+ rebuilt.push("## ✓ Resolved");
308
+ rebuilt.push(...migratedResolved, ...existingResolved);
309
+ if (afterResolved.length > 0) {
310
+ rebuilt.push("");
311
+ rebuilt.push(...afterResolved);
312
+ }
313
+ const text = rebuilt.join("\n").replace(/\n*$/, "\n");
314
+ return { text, changed: text !== content };
315
+ }
118
316
  export function parseEntries(text, specName) {
119
317
  const spec = SPECS[specName];
120
318
  if (spec.name === "todo-resolved") {
@@ -125,5 +323,3 @@ export function parseEntries(text, specName) {
125
323
  const onelineEntries = parseOnelineEntries(archiveBody, spec);
126
324
  return [...fullEntries, ...onelineEntries];
127
325
  }
128
- import { SPECS } from "./dryRun.js";
129
- //# sourceMappingURL=parse.js.map
@@ -5,11 +5,11 @@
5
5
  * by `apply.ts` (which writes the compacted result back to disk)
6
6
  * and by `status.ts` (which counts overflow without writing).
7
7
  */
8
- import { MAX_FULL_ENTRIES, MAX_ONELINE_ENTRIES, applyRetentionCaps } from "../common.js";
8
+ import { MAX_FULL_ENTRIES, MAX_ONELINE_ENTRIES, MAX_TOTAL_ENTRIES, applyRetentionCaps } from "../common.js";
9
9
  import { truncateWords } from "./dryRun.js";
10
10
  export function overLimitCount(activeCount, archiveCount) {
11
11
  const totalCount = activeCount + archiveCount;
12
- return Math.max(Math.max(activeCount - MAX_FULL_ENTRIES, 0), Math.max(archiveCount - MAX_ONELINE_ENTRIES, 0), Math.max(totalCount - 50, 0));
12
+ return Math.max(Math.max(activeCount - MAX_FULL_ENTRIES, 0), Math.max(archiveCount - MAX_ONELINE_ENTRIES, 0), Math.max(totalCount - MAX_TOTAL_ENTRIES, 0));
13
13
  }
14
14
  export function stableSortBy(arr, key, reverse = false) {
15
15
  return arr
@@ -100,13 +100,16 @@ export function yamlArchiveEntry(specName, entry) {
100
100
  const summary = yamlSummaryText(e, "trajectory", "grades");
101
101
  return { summary: `Audit ${number}${datePart}: ${summary}` };
102
102
  }
103
+ if (specName === "experiments") {
104
+ return { number: e.number, summary: yamlSummaryText(e, "conclusion", "label") };
105
+ }
103
106
  if (specName === "session") {
104
107
  return { timestamp: String(e.timestamp ?? ""), summary: yamlSummaryText(e, "summary") };
105
108
  }
106
109
  return { summary: yamlSummaryText(e, "summary") };
107
110
  }
108
111
  export function yamlSortEntries(entries, specName) {
109
- if (specName === "decisions" || specName === "health") {
112
+ if (specName === "decisions" || specName === "health" || specName === "experiments") {
110
113
  return stableSortBy(entries, yamlEntryNumber);
111
114
  }
112
115
  if (specName === "session") {
@@ -114,12 +117,12 @@ export function yamlSortEntries(entries, specName) {
114
117
  }
115
118
  return stableSortBy(entries, yamlEntryNumber, true);
116
119
  }
117
- export function yamlRecentFullAndOlder(entries, specName) {
120
+ export function yamlRecentFullAndOlder(entries, specName, fullCapacity = MAX_FULL_ENTRIES) {
118
121
  const newestFirst = specName === "session"
119
122
  ? stableSortBy(entries, yamlEntryTimestamp, true)
120
123
  : stableSortBy(entries, yamlEntryNumber, true);
121
- const recent = newestFirst.slice(0, MAX_FULL_ENTRIES);
122
- const older = newestFirst.slice(MAX_FULL_ENTRIES);
124
+ const recent = newestFirst.slice(0, fullCapacity);
125
+ const older = newestFirst.slice(fullCapacity);
123
126
  return [yamlSortEntries(recent, specName), older];
124
127
  }
125
128
  function yamlArchiveSortKey(entry) {
@@ -148,50 +151,52 @@ export function yamlArchiveEntries(entries) {
148
151
  function decisionSatisfactionState(entry) {
149
152
  if (!entry || typeof entry !== "object")
150
153
  return null;
154
+ // cast: decision record fields read from parsed decisions.yaml
151
155
  const satisfaction = entry.satisfaction;
152
156
  if (!satisfaction || typeof satisfaction !== "object")
153
157
  return null;
154
158
  const state = satisfaction.state;
155
159
  return typeof state === "string" ? state : null;
156
160
  }
157
- function decisionRequiresUserReview(entry) {
161
+ export function decisionRequiresUserReview(entry) {
158
162
  if (!entry || typeof entry !== "object")
159
163
  return true;
164
+ // cast: decision record fields read from parsed decisions.yaml
160
165
  const satisfaction = entry.satisfaction;
161
166
  if (!satisfaction || typeof satisfaction !== "object")
162
167
  return true;
163
168
  const confirmation = satisfaction.user_confirmation;
169
+ const confirmedBy = confirmation && typeof confirmation === "object" ? confirmation.confirmed_by : null;
170
+ const confirmedAt = confirmation && typeof confirmation === "object" ? confirmation.confirmed_at : null;
164
171
  return (decisionSatisfactionState(entry) !== "user_confirmed_satisfied" ||
165
172
  !confirmation ||
166
173
  typeof confirmation !== "object" ||
167
- Object.keys(confirmation).length === 0);
174
+ typeof confirmedBy !== "string" ||
175
+ confirmedBy.trim() === "" ||
176
+ typeof confirmedAt !== "string" ||
177
+ confirmedAt.trim() === "");
178
+ }
179
+ export function decisionSatisfiedActiveCount(active) {
180
+ return active.filter((e) => !decisionRequiresUserReview(e)).length;
168
181
  }
169
182
  export function decisionProtectedOverflowCount(active, archive) {
170
183
  const protectedActive = active.filter((e) => decisionRequiresUserReview(e)).length;
171
184
  const protectedArchive = archive.filter((e) => decisionRequiresUserReview(e)).length;
172
- return Math.max(protectedActive - MAX_FULL_ENTRIES, protectedArchive - MAX_ONELINE_ENTRIES, protectedActive + protectedArchive - 50, 0);
185
+ return Math.max(protectedActive - MAX_FULL_ENTRIES, protectedArchive - MAX_ONELINE_ENTRIES, protectedActive + protectedArchive - MAX_TOTAL_ENTRIES, 0);
173
186
  }
174
- export function selectDecisionActiveEntries(active) {
187
+ export function selectDecisionActiveEntries(active, fullCapacity = MAX_FULL_ENTRIES) {
175
188
  const protectedEntries = active.filter((e) => decisionRequiresUserReview(e));
176
- if (protectedEntries.length > MAX_FULL_ENTRIES) {
177
- throw new Error("decisions: protected-overflow review pressure; " +
178
- `${protectedEntries.length} protected active decision(s) exceed ${MAX_FULL_ENTRIES} full-detail slots`);
179
- }
180
189
  const satisfied = active.filter((e) => !decisionRequiresUserReview(e));
181
190
  const newestSatisfied = stableSortBy(satisfied, yamlEntryNumber, true);
182
- const keepSatisfied = newestSatisfied.slice(0, MAX_FULL_ENTRIES - protectedEntries.length);
183
- const compactSatisfied = newestSatisfied.slice(MAX_FULL_ENTRIES - protectedEntries.length);
191
+ const satisfiedCapacity = Math.max(fullCapacity - protectedEntries.length, 0);
192
+ const keepSatisfied = newestSatisfied.slice(0, satisfiedCapacity);
193
+ const compactSatisfied = newestSatisfied.slice(satisfiedCapacity);
184
194
  return [yamlSortEntries([...protectedEntries, ...keepSatisfied], "decisions"), compactSatisfied];
185
195
  }
186
196
  export function selectDecisionArchiveEntries(archiveCandidates) {
187
- const protectedEntries = archiveCandidates.filter((e) => decisionRequiresUserReview(e));
188
- if (protectedEntries.length > MAX_ONELINE_ENTRIES) {
189
- throw new Error("decisions: protected-overflow review pressure; " +
190
- `${protectedEntries.length} protected archived decision(s) exceed ${MAX_ONELINE_ENTRIES} archive slots`);
191
- }
192
- const satisfied = archiveCandidates.filter((e) => !decisionRequiresUserReview(e));
193
- const keepSatisfied = yamlArchiveEntries(satisfied).slice(0, MAX_ONELINE_ENTRIES - protectedEntries.length);
194
- return yamlArchiveEntries([...protectedEntries, ...keepSatisfied]);
197
+ // Review pressure is a projection concern, not a write failure. Capacity
198
+ // selection happens after archive recovery so protected records are never
199
+ // discarded merely because they are unresolved.
200
+ return yamlSortEntries(archiveCandidates, "decisions");
195
201
  }
196
202
  export { applyRetentionCaps };
197
- //# sourceMappingURL=retention.js.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Compaction status reporting (read-only).
2
+ * Compaction status reporting and projection repair.
3
3
  *
4
4
  * Walks each tracked artifact path, counts active/archive entries, and
5
5
  * builds a `CompactionStatus` per artifact plus a per-status operation
@@ -11,13 +11,19 @@ import path from "node:path";
11
11
  import { DEFAULT_ARTIFACT_PATHS, parseDocsYamlMapping } from "../common.js";
12
12
  import { loadYamlMapping } from "../../core/yaml.js";
13
13
  import { COMPACTABLE_YAML_ARTIFACTS, NON_COMPACTABLE_ARTIFACTS } from "./dryRun.js";
14
- import { decisionProtectedOverflowCount, overLimitCount, yamlArchiveEntries, } from "./retention.js";
15
- import { compactFile, compactYamlFile } from "./apply.js";
16
- import { parseEntries } from "./parse.js";
14
+ import { detectStateMode } from "../../state/stateMode.js";
15
+ import { discoverEntities } from "../../state/entityStorage.js";
16
+ import { decisionProtectedOverflowCount, decisionSatisfiedActiveCount, overLimitCount, yamlArchiveEntries, } from "./retention.js";
17
+ import { compactFile, compactYamlBytes, compactYamlFile } from "./apply.js";
18
+ import { countTodoResolvedEntries, countTodoResolvedSectionHeadings, countTodoPendingSummarization, TODO_DROPPED_RECOVERY_GUIDANCE, } from "./parse.js";
17
19
  import { YAML_SPEC_BY_ARTIFACT } from "./dryRun.js";
20
+ import { InjectedMutationFailure, withStateMutation, } from "../../state/write/mutation.js";
21
+ import { hydrateDecisionRecords } from "../../state/decisionOverlay.js";
22
+ import { loadProjectionPolicy } from "../../state/projectionPolicy.js";
23
+ import { ARTIFACT_PROTOCOL_PATHS } from "../../registries/artifactProtocolIds.js";
18
24
  function artifactPaths(projectRoot) {
19
25
  const paths = { ...DEFAULT_ARTIFACT_PATHS };
20
- const docsPath = path.join(projectRoot, ".agentera", "docs.yaml");
26
+ const docsPath = path.join(projectRoot, ARTIFACT_PROTOCOL_PATHS.docs);
21
27
  if (fs.existsSync(docsPath)) {
22
28
  Object.assign(paths, parseDocsYamlMapping(fs.readFileSync(docsPath, "utf8")));
23
29
  }
@@ -71,8 +77,9 @@ function yamlLists(p, activeKey, archiveKey) {
71
77
  const archive = data[archiveKey] || [];
72
78
  return [Array.isArray(active) ? active : [], Array.isArray(archive) ? archive : []];
73
79
  }
74
- function countStatus(artifact, p, activeCount, archiveCount, protectedOverflowCount = 0) {
80
+ function countStatus(artifact, p, activeCount, archiveCount, protectedOverflowCount = 0, budgetActiveCount, projectionRecovery, projectionState) {
75
81
  const totalCount = activeCount + archiveCount;
82
+ const budgetActive = budgetActiveCount ?? activeCount;
76
83
  return {
77
84
  artifact,
78
85
  path: p,
@@ -80,21 +87,100 @@ function countStatus(artifact, p, activeCount, archiveCount, protectedOverflowCo
80
87
  active_count: activeCount,
81
88
  archive_count: archiveCount,
82
89
  total_count: totalCount,
83
- over_limit_count: overLimitCount(activeCount, archiveCount),
84
- reason: protectedOverflowCount ? "protected-overflow review pressure" : "uniform_10_40_50",
90
+ over_limit_count: projectionState ? 0 : overLimitCount(budgetActive, archiveCount),
91
+ reason: projectionState
92
+ ? projectionState === "over_defaults"
93
+ ? "lossless projection exceeds display defaults; numbered archives remain authoritative"
94
+ : "lossless projection is within display defaults"
95
+ : protectedOverflowCount
96
+ ? "protected-overflow review pressure"
97
+ : "uniform_10_40_50",
85
98
  protected_overflow_count: protectedOverflowCount,
86
99
  exists: true,
100
+ ...(projectionState ? { projection_state: projectionState } : {}),
101
+ ...(projectionRecovery ? { projection_recovery: projectionRecovery } : {}),
87
102
  };
88
103
  }
104
+ function projectionRecoveryFor(projectRoot, artifact, p) {
105
+ try {
106
+ return compactYamlBytes(fs.readFileSync(p, "utf8"), artifact, projectRoot).result.recovery;
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
89
112
  export function computeCompactionStatus(projectRoot) {
113
+ if (detectStateMode(projectRoot) === "entities") {
114
+ const discovered = discoverEntities(projectRoot);
115
+ const issueCount = discovered.issues.length;
116
+ return [{
117
+ artifact: "entity_state",
118
+ path: path.join(projectRoot, ".agentera", "entities"),
119
+ classification: issueCount ? "error" : "canonical_entities",
120
+ active_count: discovered.entities.length,
121
+ archive_count: 0,
122
+ total_count: discovered.entities.length,
123
+ over_limit_count: 0,
124
+ reason: issueCount
125
+ ? `${issueCount} canonical entity validation issue(s); run agentera check validate state --format json`
126
+ : "canonical entity state is independently stored and is not compacted",
127
+ protected_overflow_count: 0,
128
+ exists: true,
129
+ }];
130
+ }
90
131
  const paths = artifactPaths(projectRoot);
132
+ const projectionPolicy = loadProjectionPolicy();
91
133
  const statuses = [];
92
134
  const todoPath = paths.todo;
93
135
  if (fs.existsSync(todoPath)) {
94
- const entries = parseEntries(fs.readFileSync(todoPath, "utf8"), "todo-resolved");
95
- const activeCount = entries.filter((e) => e.kind === "full").length;
96
- const archiveCount = entries.filter((e) => e.kind === "oneline").length;
97
- statuses.push(countStatus("todo#Resolved", todoPath, activeCount, archiveCount));
136
+ const todoText = fs.readFileSync(todoPath, "utf8");
137
+ const headingCount = countTodoResolvedSectionHeadings(todoText);
138
+ if (headingCount > 1) {
139
+ // Refuse rather than silently process only the first `## ✓ Resolved`
140
+ // section: duplicates hide the trailing entries from the budget and
141
+ // from fix-mode migration. TODO has no lossless numbered archive, so
142
+ // recovery once entries are dropped is Git-only.
143
+ statuses.push({
144
+ artifact: "todo#Resolved",
145
+ path: todoPath,
146
+ classification: "error",
147
+ active_count: null,
148
+ archive_count: null,
149
+ total_count: null,
150
+ over_limit_count: null,
151
+ reason: `TODO.md has ${headingCount} '## ✓ Resolved' sections; merge into exactly one before compacting. ` +
152
+ `Compaction drops oldest resolved entries and is destructive (no lossless archive); ` +
153
+ TODO_DROPPED_RECOVERY_GUIDANCE,
154
+ protected_overflow_count: 0,
155
+ exists: true,
156
+ });
157
+ }
158
+ else if (headingCount === 0) {
159
+ statuses.push({
160
+ artifact: "todo#Resolved",
161
+ path: todoPath,
162
+ classification: "error",
163
+ active_count: null,
164
+ archive_count: null,
165
+ total_count: null,
166
+ over_limit_count: null,
167
+ reason: "TODO.md has no required '## ✓ Resolved' section; add exactly one before compacting.",
168
+ protected_overflow_count: 0,
169
+ exists: true,
170
+ });
171
+ }
172
+ else {
173
+ const counts = countTodoResolvedEntries(todoText);
174
+ const status = countStatus("todo#Resolved", todoPath, counts.full, counts.oneline);
175
+ // Detect in-budget (≤50) TODOs that still need a formatting rewrite:
176
+ // rows 11-50 that are long verbatim headers instead of ≤15-word
177
+ // summaries. This triggers `--mode fix` before entries overflow.
178
+ const pendingSummarization = countTodoPendingSummarization(todoText);
179
+ if (pendingSummarization > 0) {
180
+ status.pending_summarization_count = pendingSummarization;
181
+ }
182
+ statuses.push(status);
183
+ }
98
184
  }
99
185
  else {
100
186
  statuses.push(missingStatus("todo#Resolved", todoPath, "compactable"));
@@ -111,8 +197,17 @@ export function computeCompactionStatus(projectRoot) {
111
197
  statuses.push(yamlErrorStatus(artifact, p, exc.message));
112
198
  continue;
113
199
  }
114
- const protectedOverflowCount = artifact === "decisions" ? decisionProtectedOverflowCount(active, archive) : 0;
115
- statuses.push(countStatus(artifact, p, active.length, archive.length, protectedOverflowCount));
200
+ const protectedOverflowCount = artifact === "decisions"
201
+ ? decisionProtectedOverflowCount(hydrateDecisionRecords(active, projectRoot), hydrateDecisionRecords(archive, projectRoot))
202
+ : 0;
203
+ const budgetActiveCount = artifact === "decisions"
204
+ ? decisionSatisfiedActiveCount(hydrateDecisionRecords(active, projectRoot))
205
+ : undefined;
206
+ statuses.push(countStatus(artifact, p, active.length, archive.length, protectedOverflowCount, budgetActiveCount, projectionRecoveryFor(projectRoot, artifact, p), active.length > projectionPolicy.activeEntries ||
207
+ archive.length > projectionPolicy.summaryEntries ||
208
+ active.length + archive.length > projectionPolicy.totalEntries
209
+ ? "over_defaults"
210
+ : "within_defaults"));
116
211
  }
117
212
  else {
118
213
  statuses.push(missingStatus(artifact, p, "compactable"));
@@ -133,11 +228,11 @@ export function computeCompactionStatus(projectRoot) {
133
228
  exists: fs.existsSync(p),
134
229
  });
135
230
  }
136
- const optimeraDir = path.join(projectRoot, ".agentera", "optimera");
137
- if (fs.existsSync(optimeraDir) && fs.statSync(optimeraDir).isDirectory()) {
231
+ const optimizeDir = path.join(projectRoot, ".agentera", "optimize");
232
+ if (fs.existsSync(optimizeDir) && fs.statSync(optimizeDir).isDirectory()) {
138
233
  const experimentPaths = [];
139
- for (const sub of fs.readdirSync(optimeraDir).sort()) {
140
- const expPath = path.join(optimeraDir, sub, "experiments.yaml");
234
+ for (const sub of fs.readdirSync(optimizeDir).sort()) {
235
+ const expPath = path.join(optimizeDir, sub, "experiments.yaml");
141
236
  if (fs.existsSync(expPath))
142
237
  experimentPaths.push(expPath);
143
238
  }
@@ -184,21 +279,35 @@ function operationForStatus(status, mode) {
184
279
  return base("error", status.reason);
185
280
  if (status.classification !== "compactable")
186
281
  return base("skipped", status.reason);
187
- if (status.protected_overflow_count) {
188
- return base("protected_overflow", `protected-overflow review pressure by ${status.protected_overflow_count}`);
282
+ if (status.projection_recovery?.refused_count) {
283
+ return base("refused", `projection retained ${status.projection_recovery.retained_full} full entr${status.projection_recovery.retained_full === 1 ? "y" : "ies"}; archive recovery is required before summarization`);
189
284
  }
190
- if (!status.over_limit_count)
191
- return base("ok", "within uniform_10_40_50 limits");
192
- return base(mode === "check" ? "over_limit" : "pending_fix", `over uniform_10_40_50 limit by ${status.over_limit_count}`);
285
+ if (status.projection_state === "over_defaults") {
286
+ return base(mode === "fix" ? "pending_projection" : "projection", "projection exceeds display defaults; archive history remains lossless");
287
+ }
288
+ if (!status.over_limit_count && !status.pending_summarization_count) {
289
+ return base("ok", status.projection_state === "within_defaults"
290
+ ? "within configured lossless projection defaults"
291
+ : "within uniform_10_40_50 limits");
292
+ }
293
+ if (status.over_limit_count) {
294
+ return base(mode === "check" ? "over_limit" : "pending_fix", `over uniform_10_40_50 limit by ${status.over_limit_count}`);
295
+ }
296
+ // pending_summarization_count > 0 but within budget: rows 11-50 need
297
+ // ≤15-word summary formatting, not entry removal.
298
+ const n = status.pending_summarization_count;
299
+ return base(mode === "check" ? "formatting" : "pending_formatting", `${n} resolved entr${n === 1 ? "y" : "ies"} in summary tier need ≤15-word summarization`);
193
300
  }
194
301
  export function checkCompaction(projectRoot) {
195
302
  return computeCompactionStatus(projectRoot).map((status) => operationForStatus(status, "check"));
196
303
  }
197
- export function fixCompaction(projectRoot) {
304
+ function fixCompactionUnlocked(projectRoot, transaction) {
198
305
  const operations = [];
199
306
  for (const status of computeCompactionStatus(projectRoot)) {
200
307
  const baseline = operationForStatus(status, "fix");
201
- if (baseline.action !== "pending_fix") {
308
+ if (baseline.action !== "pending_fix" &&
309
+ baseline.action !== "pending_projection" &&
310
+ baseline.action !== "pending_formatting") {
202
311
  operations.push(baseline);
203
312
  continue;
204
313
  }
@@ -206,10 +315,10 @@ export function fixCompaction(projectRoot) {
206
315
  let result;
207
316
  try {
208
317
  if (status.artifact === "todo#Resolved") {
209
- result = compactFile(p, "todo-resolved");
318
+ result = transaction.mutateProjection(p, (stage) => compactFile(stage, "todo-resolved"));
210
319
  }
211
320
  else if (status.artifact in YAML_SPEC_BY_ARTIFACT) {
212
- result = compactYamlFile(p, status.artifact);
321
+ result = transaction.mutateProjection(p, (stage) => compactYamlFile(stage, status.artifact, projectRoot));
213
322
  }
214
323
  else {
215
324
  operations.push({ status, mode: "fix", action: "skipped", changed: false, result: null, message: `no fixer registered for ${status.artifact}` });
@@ -217,6 +326,8 @@ export function fixCompaction(projectRoot) {
217
326
  }
218
327
  }
219
328
  catch (exc) {
329
+ if (exc instanceof InjectedMutationFailure)
330
+ throw exc;
220
331
  operations.push({ status, mode: "fix", action: "error", changed: false, result: null, message: exc.message });
221
332
  continue;
222
333
  }
@@ -228,16 +339,22 @@ export function fixCompaction(projectRoot) {
228
339
  result,
229
340
  message: `full ${result.full_before}->${result.full_after}; ` +
230
341
  `archive ${result.oneline_before}->${result.oneline_after}; ` +
231
- `dropped ${result.dropped}`,
342
+ `omitted ${result.omitted_count ?? 0}; dropped ${result.dropped}`,
232
343
  });
233
344
  }
234
345
  return operations;
235
346
  }
236
- export function runCompaction(projectRoot, mode = "check") {
347
+ export function fixCompaction(projectRoot, options = {}) {
348
+ return withStateMutation(projectRoot, (transaction) => fixCompactionUnlocked(projectRoot, transaction), options);
349
+ }
350
+ export function runCompaction(projectRoot, mode = "check", options = {}) {
237
351
  if (mode === "check")
238
352
  return checkCompaction(projectRoot);
239
- if (mode === "fix")
240
- return fixCompaction(projectRoot);
353
+ if (mode === "fix") {
354
+ if (detectStateMode(projectRoot) === "entities") {
355
+ return computeCompactionStatus(projectRoot).map((status) => operationForStatus(status, "fix"));
356
+ }
357
+ return fixCompaction(projectRoot, options);
358
+ }
241
359
  throw new Error(`unknown compaction mode: ${mode}`);
242
360
  }
243
- //# sourceMappingURL=status.js.map
@@ -3,4 +3,3 @@
3
3
  * status reporting, the apply writers, and the CLI consumers.
4
4
  */
5
5
  export {};
6
- //# sourceMappingURL=types.js.map
@@ -7,4 +7,3 @@
7
7
  import { ARTIFACT_PROTOCOL_PATHS, HUMAN_FACING_ARTIFACT_IDS } from "../../registries/artifactProtocolIds.js";
8
8
  export { ARTIFACT_PROTOCOL_PATHS, HUMAN_FACING_ARTIFACT_IDS };
9
9
  export const AGENT_FACING_ARTIFACT_IDS = new Set(Object.keys(ARTIFACT_PROTOCOL_PATHS).filter((id) => !HUMAN_FACING_ARTIFACT_IDS.has(id)));
10
- //# sourceMappingURL=agentFacing.js.map