agentera 3.0.0-dev.5 → 3.0.0-dev.51

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 (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -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 +236 -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 +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  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 +191 -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 +3022 -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 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  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 +224 -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 +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -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 +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  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 +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  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 +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  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 +56 -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 +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  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 +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  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 +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -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 +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -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 +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  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 +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -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 +272 -223
  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 +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -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 +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  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 +229 -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 +385 -0
  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 -0
  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 +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -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 +982 -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/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,167 @@
1
+ import fs from "node:fs";
2
+ import { TextDecoder } from "node:util";
3
+ import { personalProfileGrounding, PersonalGlossaryBoundaryError, } from "../analytics/personalGlossaryProfile.js";
4
+ import { personalProfileGroundingContract } from "../registries/glossaryEntryContract.js";
5
+ import { discoverSchemasDir } from "./appContext.js";
6
+ import { parseProfileHeaderDates, registryArtifactPath } from "./orientation.js";
7
+ const DEFAULT_STALE_DAYS = 7;
8
+ const STALE_DAYS_ENV = "AGENTERA_PROFILE_MAX_AGE_DAYS";
9
+ function errorCode(error) {
10
+ return typeof error === "object" && error !== null && "code" in error
11
+ ? String(error.code)
12
+ : undefined;
13
+ }
14
+ function sameIdentity(left, right) {
15
+ return left.dev === right.dev && left.ino === right.ino && left.mode === right.mode;
16
+ }
17
+ function sameSnapshot(left, right) {
18
+ return sameIdentity(left, right)
19
+ && left.size === right.size
20
+ && left.mtimeNs === right.mtimeNs
21
+ && left.ctimeNs === right.ctimeNs;
22
+ }
23
+ /** Read one path without following a final symlink and reject source changes. */
24
+ export function readProfileSourceSafely(profilePath, maxBytes, hooks = {}) {
25
+ let pathSnapshot;
26
+ try {
27
+ pathSnapshot = fs.lstatSync(profilePath, { bigint: true });
28
+ }
29
+ catch (error) {
30
+ return { status: errorCode(error) === "ENOENT" ? "absent" : "unreadable" };
31
+ }
32
+ if (!pathSnapshot.isFile() || pathSnapshot.isSymbolicLink())
33
+ return { status: "unsafe" };
34
+ hooks.afterPathSnapshot?.();
35
+ let fd;
36
+ try {
37
+ const noFollow = hooks.noFollowFlag ?? (fs.constants.O_NOFOLLOW ?? 0);
38
+ fd = fs.openSync(profilePath, fs.constants.O_RDONLY | noFollow);
39
+ }
40
+ catch (error) {
41
+ return { status: errorCode(error) === "ELOOP" ? "unsafe" : "unreadable" };
42
+ }
43
+ try {
44
+ const opened = fs.fstatSync(fd, { bigint: true });
45
+ if (!opened.isFile() || !sameIdentity(pathSnapshot, opened))
46
+ return { status: "unsafe" };
47
+ if (opened.size > BigInt(maxBytes))
48
+ return { status: "oversized" };
49
+ hooks.afterOpen?.();
50
+ const bytes = Buffer.alloc(maxBytes + 1);
51
+ let offset = 0;
52
+ while (offset < bytes.length) {
53
+ const read = fs.readSync(fd, bytes, offset, bytes.length - offset, offset);
54
+ if (read === 0)
55
+ break;
56
+ offset += read;
57
+ }
58
+ hooks.afterRead?.();
59
+ const afterRead = fs.fstatSync(fd, { bigint: true });
60
+ let currentPath;
61
+ try {
62
+ currentPath = fs.lstatSync(profilePath, { bigint: true });
63
+ }
64
+ catch {
65
+ return { status: "unsafe" };
66
+ }
67
+ if (!sameSnapshot(opened, afterRead) || !sameSnapshot(afterRead, currentPath)) {
68
+ return { status: "unsafe" };
69
+ }
70
+ if (offset > maxBytes)
71
+ return { status: "oversized" };
72
+ return { status: "ok", bytes: bytes.subarray(0, offset) };
73
+ }
74
+ catch {
75
+ return { status: "unreadable" };
76
+ }
77
+ finally {
78
+ try {
79
+ fs.closeSync(fd);
80
+ }
81
+ catch {
82
+ // The acquisition already has a bounded result; close diagnostics are private.
83
+ }
84
+ }
85
+ }
86
+ function staleThreshold(env) {
87
+ const parsed = Number.parseInt(env[STALE_DAYS_ENV] ?? String(DEFAULT_STALE_DAYS), 10);
88
+ return Number.isNaN(parsed) || parsed < 0 ? DEFAULT_STALE_DAYS : parsed;
89
+ }
90
+ function unknownFreshness(env) {
91
+ return {
92
+ state: "unknown",
93
+ days_since_generated: null,
94
+ stale_threshold_days: staleThreshold(env),
95
+ generated_date: null,
96
+ validated_date: null,
97
+ };
98
+ }
99
+ function freshness(text, env) {
100
+ const dates = parseProfileHeaderDates(text);
101
+ const anchor = dates.generatedUtc === null
102
+ ? dates.validatedUtc
103
+ : dates.validatedUtc === null
104
+ ? dates.generatedUtc
105
+ : Math.max(dates.generatedUtc, dates.validatedUtc);
106
+ const threshold = staleThreshold(env);
107
+ if (anchor === null) {
108
+ return { ...unknownFreshness(env), generated_date: dates.generatedDate, validated_date: dates.validatedDate };
109
+ }
110
+ const now = new Date();
111
+ const today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());
112
+ const days = Math.round((today - anchor) / 86_400_000);
113
+ return {
114
+ state: days >= threshold ? "stale" : "current",
115
+ days_since_generated: days,
116
+ stale_threshold_days: threshold,
117
+ generated_date: dates.generatedDate,
118
+ validated_date: dates.validatedDate,
119
+ };
120
+ }
121
+ function result(profilePath, env, status, validityClass, recovery) {
122
+ return {
123
+ validity: { status, class: validityClass, recovery },
124
+ freshness: unknownFreshness(env),
125
+ profilePath,
126
+ groundingContent: null,
127
+ };
128
+ }
129
+ export function acquireProfile(schemasDir, env = process.env, hooks = {}) {
130
+ const contract = personalProfileGroundingContract();
131
+ let profilePath;
132
+ try {
133
+ profilePath = registryArtifactPath("profile", schemasDir ?? discoverSchemasDir(), env, { warn: false });
134
+ }
135
+ catch {
136
+ return result(null, env, "repair_needed", "unsafe", contract.repairRecovery);
137
+ }
138
+ const source = readProfileSourceSafely(profilePath, contract.maxProfileUtf8Bytes, hooks);
139
+ if (source.status === "absent") {
140
+ return result(profilePath, env, "absent", "absent", contract.absentRecovery);
141
+ }
142
+ if (source.status !== "ok") {
143
+ return result(profilePath, env, "repair_needed", source.status, contract.repairRecovery);
144
+ }
145
+ let decoded;
146
+ try {
147
+ decoded = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(source.bytes);
148
+ }
149
+ catch {
150
+ return result(profilePath, env, "repair_needed", "invalid_utf8", contract.repairRecovery);
151
+ }
152
+ try {
153
+ const groundingContent = personalProfileGrounding(decoded);
154
+ return {
155
+ validity: { status: "valid", class: "valid", recovery: null },
156
+ freshness: freshness(decoded, env),
157
+ profilePath,
158
+ groundingContent,
159
+ };
160
+ }
161
+ catch (error) {
162
+ const validityClass = error instanceof PersonalGlossaryBoundaryError
163
+ ? error.availability
164
+ : "malformed";
165
+ return result(profilePath, env, "repair_needed", validityClass, contract.repairRecovery);
166
+ }
167
+ }
@@ -0,0 +1,59 @@
1
+ import { STATE_FAMILY_FALLBACK_COMMANDS, STATE_FAMILY_LIST_COMMANDS } from "./capabilityContext/types.js";
2
+ export const STARTUP_AVAILABLE_STATE_FIELDS = [
3
+ "app_home",
4
+ "mode",
5
+ "profile",
6
+ "v1_migration",
7
+ "health",
8
+ "todo",
9
+ "plan",
10
+ "docs",
11
+ "progress",
12
+ "objective",
13
+ "state_presence",
14
+ "project_integration",
15
+ "attention",
16
+ "decision_attention",
17
+ "next_action",
18
+ "orchestration_context",
19
+ "closeout_context",
20
+ "evidence_context",
21
+ "benchmark_context",
22
+ "execution_context",
23
+ ];
24
+ export const STARTUP_COMPLETENESS_CONFIDENCE_CAVEATS = [
25
+ "representative benchmark evidence exists, but some source products remain degraded by schema divergence",
26
+ "Audit evidence context uses existing status, plan, progress, docs, health, TODO, and decisions state outputs",
27
+ ];
28
+ export const STARTUP_COMPLETENESS_CLI_FALLBACK = [
29
+ STATE_FAMILY_FALLBACK_COMMANDS.plan,
30
+ STATE_FAMILY_FALLBACK_COMMANDS.docs,
31
+ STATE_FAMILY_LIST_COMMANDS.progress,
32
+ ];
33
+ export function startupCompletenessContract(input = {}) {
34
+ const missingState = [];
35
+ const schemaError = input.schemaError ?? null;
36
+ if (schemaError) {
37
+ missingState.push(schemaError);
38
+ }
39
+ if (input.profileStatus === "not found")
40
+ missingState.push("profile not found");
41
+ if (input.profileStatus === "absent")
42
+ missingState.push("profile absent");
43
+ if (input.profileStatus === "repair_needed")
44
+ missingState.push("profile repair needed");
45
+ const complete = missingState.length === 0;
46
+ return {
47
+ complete_for_capability_startup: complete,
48
+ raw_artifact_reads_required: false,
49
+ raw_artifact_read_policy: "Do not read raw artifacts when complete_for_capability_startup is true. " +
50
+ "When incomplete, try cli_fallback first; raw reads are permitted only for a named corruption or CLI-defect diagnostic.",
51
+ available_state: [...STARTUP_AVAILABLE_STATE_FIELDS],
52
+ missing_state: missingState,
53
+ confidence_caveats: [...STARTUP_COMPLETENESS_CONFIDENCE_CAVEATS],
54
+ cli_fallback: [...STARTUP_COMPLETENESS_CLI_FALLBACK],
55
+ };
56
+ }
57
+ export function capabilityStartupComplete(input = {}) {
58
+ return Boolean(startupCompletenessContract(input).complete_for_capability_startup);
59
+ }
@@ -5,7 +5,11 @@ import { loadYamlMapping } from "../core/yaml.js";
5
5
  import { activeAppModel, discoverSchemasDir } from "./appContext.js";
6
6
  import { validateAgentString, validateIdentifier } from "./argvalidate.js";
7
7
  import { emitStructured } from "./structured.js";
8
- export const REQUIRED_SPARSE_CONTEXT_FIELDS = ["command", "status"];
8
+ import { truncateCodePoints } from "../core/text.js";
9
+ import { boundStructuredProjection } from "../state/projectionPolicy.js";
10
+ import { preCutoverCommand } from "./preCutoverCommand.js";
11
+ /** Shared state-query infrastructure ported from scripts/agentera. */
12
+ export const REQUIRED_SPARSE_CONTEXT_FIELDS = ["command", "outcome"];
9
13
  export const ROUTINE_STRUCTURED_FIELDS = [
10
14
  "command",
11
15
  "status",
@@ -14,18 +18,51 @@ export const ROUTINE_STRUCTURED_FIELDS = [
14
18
  "source",
15
19
  "filters",
16
20
  "summary",
21
+ "plans",
17
22
  "source_contract",
18
23
  ];
24
+ /** Canonical structured field set for the bare prime orientation briefing.
25
+ * `agentera schema` discovery, the emitted prime JSON `source_contract.fields`,
26
+ * and the text-mode source-contract line derive from this list. The shared skill
27
+ * is the permanent host integration authority. The published bare-prime shape
28
+ * stays stable: omission of default-only conditional payload is governed by
29
+ * `state_presence` (missing-vs-empty) and named recovery commands, not by
30
+ * trimming this set. */
31
+ export const PRIME_STRUCTURED_FIELDS = [
32
+ "command", "outcome", "app_home", "app", "mode", "v1_migration", "health",
33
+ "todo", "plan", "docs", "progress", "objective", "state_presence", "shared_skill", "project_integration", "attention",
34
+ "history",
35
+ "decision_attention", "next_action", "orchestration_context", "closeout_context",
36
+ "evidence_context", "benchmark_context", "execution_context", "startup", "source", "source_contract",
37
+ ];
38
+ /** Retired prime fields that receive one structured correction instead of
39
+ * falling through to the generic unsupported-field error. */
40
+ export const RETIRED_PRIME_FIELD_CORRECTIONS = {
41
+ issues: "todo",
42
+ };
43
+ /** Field declared available on the prime selector but emitted only by the
44
+ * `prime --context <capability>` surface, not by the bare default briefing.
45
+ * The bare briefing carries it as a `source_contract.capability_context`
46
+ * pointer with a `fetch_command`. */
47
+ export const PRIME_CONTEXT_ONLY_FIELDS = ["capability_context"];
48
+ /** Fields selectable via `prime [--context <cap>] --fields`. Derives the
49
+ * canonical structured set and the context-only `capability_context` pointer
50
+ * from one authority, so schema discovery and the prime selector cannot drift. */
51
+ export function availablePrimeFields(command) {
52
+ return command === "prime"
53
+ ? [...PRIME_STRUCTURED_FIELDS, ...PRIME_CONTEXT_ONLY_FIELDS]
54
+ : [...PRIME_STRUCTURED_FIELDS];
55
+ }
19
56
  export const COMMAND_FILTERS = {
20
- hej: [],
21
- plan: ["status"],
22
- progress: ["topic", "status", "limit"],
23
- health: ["dimension"],
57
+ prime: [],
58
+ plan: ["status", "limit", "cursor"],
59
+ progress: ["topic", "status", "limit", "cursor"],
60
+ health: ["dimension", "limit", "cursor"],
24
61
  todo: ["severity", "status"],
25
- decisions: ["topic"],
62
+ decisions: ["topic", "limit", "cursor"],
26
63
  docs: ["topic", "status"],
27
64
  objective: ["status"],
28
- experiments: ["topic", "status", "limit"],
65
+ experiments: ["topic", "status", "limit", "cursor", "objective"],
29
66
  query: ["list_artifacts", "topic", "severity", "dimension", "status", "limit"],
30
67
  };
31
68
  export function appModelPayload(model = activeAppModel()) {
@@ -39,8 +76,8 @@ export function surfaceMissingMessage(surface, p, model = activeAppModel()) {
39
76
  return (`${surface} is missing. Agentera cannot find it at ${p}. ` +
40
77
  `Agentera directory: ${payload.appHome}. ` +
41
78
  `App files directory: ${payload.managedAppRoot}. ` +
42
- "Run `agentera doctor` to preview the repair; run " +
43
- "`agentera doctor --format json` for structured details. " +
79
+ `Run \`${preCutoverCommand("doctor")}\` to preview the repair; run ` +
80
+ `\`${preCutoverCommand("doctor --format json")}\` for structured details. ` +
44
81
  `Technical details: appHome=${payload.appHome} managedAppRoot=${payload.managedAppRoot} ` +
45
82
  `skillRoot=${payload.skillRoot} runtimeRoot=${payload.runtimeRoot}.`);
46
83
  }
@@ -72,13 +109,16 @@ export function extractEntries(data) {
72
109
  if (Array.isArray(data))
73
110
  return data.filter((e) => e && typeof e === "object" && !Array.isArray(e));
74
111
  if (typeof data === "object") {
112
+ // cast: data is the parsed artifact body from loadArtifact (YAML/JSON IO boundary)
75
113
  for (const [key, val] of Object.entries(data)) {
76
114
  if (key === "archive")
77
115
  continue;
78
116
  if (Array.isArray(val) && val.length > 0 && val[0] && typeof val[0] === "object" && !Array.isArray(val[0])) {
117
+ // cast: val is an entries array selected from the parsed artifact (IO boundary)
79
118
  return val;
80
119
  }
81
120
  }
121
+ // cast: single-object artifact body from loadArtifact (IO boundary)
82
122
  return [data];
83
123
  }
84
124
  return [];
@@ -94,6 +134,7 @@ function pyStr(val) {
94
134
  if (Array.isArray(val))
95
135
  return "[" + val.map((v) => pyReprInner(v)).join(", ") + "]";
96
136
  if (typeof val === "object") {
137
+ // cast: val is an artifact-scalar object being rendered for display (IO boundary)
97
138
  return "{" + Object.entries(val).map(([k, v]) => `${pyReprInner(k)}: ${pyReprInner(v)}`).join(", ") + "}";
98
139
  }
99
140
  return String(val);
@@ -106,13 +147,13 @@ function pyReprInner(val) {
106
147
  export function formatScalar(val) {
107
148
  if (Array.isArray(val) || (val !== null && typeof val === "object")) {
108
149
  const s = pyStr(val);
109
- return s.length > 80 ? s.slice(0, 80) + "..." : s;
150
+ return truncateCodePoints(s, 80, "...");
110
151
  }
111
152
  return pyStr(val);
112
153
  }
113
154
  export function truncate(value, limit = 110) {
114
155
  const text = formatScalar(value).replace(/\n/g, " ");
115
- return text.length > limit ? text.slice(0, limit - 3) + "..." : text;
156
+ return truncateCodePoints(text, limit, "...");
116
157
  }
117
158
  export function asList(value) {
118
159
  return Array.isArray(value) ? value : [];
@@ -137,6 +178,7 @@ export function printStatusCounts(prefix, counts, out) {
137
178
  }
138
179
  export function stringFieldNames(fields) {
139
180
  return Object.entries(fields)
181
+ // cast: field descriptor read from a parsed artifact schema (YAML IO boundary)
140
182
  .filter(([, d]) => d?.type === "string")
141
183
  .map(([n]) => n);
142
184
  }
@@ -162,6 +204,7 @@ export function filterByFieldValue(entries, fieldName, value, substring = false)
162
204
  result.push(e);
163
205
  }
164
206
  else if (v && typeof v === "object") {
207
+ // cast: v is a field value drawn from a parsed artifact entry (IO boundary)
165
208
  const keys = Object.keys(v);
166
209
  if (keys.includes(value) || (substring && keys.some((k) => k.toLowerCase().includes(vl))))
167
210
  result.push(e);
@@ -257,7 +300,7 @@ export function requestedFields(fieldsArg) {
257
300
  return fields;
258
301
  }
259
302
  function availableStructuredFields(command) {
260
- // State commands only; prime/hej/capability handled by their own commands.
303
+ // State commands only; prime/capability handled by their own commands.
261
304
  return ROUTINE_STRUCTURED_FIELDS;
262
305
  }
263
306
  export function selectStructuredFields(command, value, fieldsArg, err) {
@@ -282,7 +325,7 @@ export function emitStateStructured(command, value, format, fieldsArg, out, err)
282
325
  const selected = selectStructuredFields(command, value, fieldsArg, err);
283
326
  if (selected === null)
284
327
  return 1;
285
- emitStructured(selected, format, out);
328
+ emitStructured(boundStructuredProjection(selected, command, format), format, out);
286
329
  return 0;
287
330
  }
288
331
  export function validateFilterValues(args, names) {
@@ -296,4 +339,3 @@ export function validateFilterValues(args, names) {
296
339
  }
297
340
  }
298
341
  }
299
- //# sourceMappingURL=stateQuery.js.map
@@ -15,4 +15,3 @@ export function emitStructured(value, outputFormat, out) {
15
15
  out(YAML.stringify(value, { sortMapEntries: false }));
16
16
  }
17
17
  }
18
- //# sourceMappingURL=structured.js.map
@@ -2,10 +2,9 @@
2
2
  * Markdown TODO list-item parsing for GitHub checkboxes and Agentera type tags.
3
3
  */
4
4
  const TODO_LIST_ITEM_RE = /^- \[([^\]]+)\]\s+(.*)/;
5
- /** GitHub task-list checkbox tokens (inner bracket content). */
6
- function isGithubCheckboxOpen(token) {
7
- return token === " ";
8
- }
5
+ const TODO_TYPE_TAG_RE = /^\[([a-z][a-z0-9_-]*)(?::([^\]\s]+))?\]\s+(.*)$/;
6
+ const TODO_LEGACY_ID_RE = /^(?:(\[[a-z][a-z0-9_-]*(?::[^\]\s]+)?\]\s+))?`([a-z]{10})`\s+(.*)$/;
7
+ const TODO_ID_TAG_RE = /^\[id:([a-z]{10})\]\s+(.*)$/;
9
8
  function isGithubCheckboxResolved(token) {
10
9
  return token.toLowerCase() === "x";
11
10
  }
@@ -19,15 +18,29 @@ export function parseTodoMarkdownListItem(line) {
19
18
  return null;
20
19
  const token = m[1];
21
20
  const rest = m[2].trim();
22
- if (isGithubCheckboxResolved(token)) {
23
- return { status: "resolved", description: rest };
24
- }
25
- if (isGithubCheckboxOpen(token)) {
26
- return { status: "open", description: rest };
27
- }
28
- return { status: "open", description: rest };
21
+ const explicitId = TODO_ID_TAG_RE.exec(rest);
22
+ const legacyId = explicitId ? null : TODO_LEGACY_ID_RE.exec(rest);
23
+ const id = explicitId?.[1] ?? legacyId?.[2];
24
+ const publicRest = explicitId?.[2]?.trim()
25
+ ?? (legacyId ? `${legacyId[1] ?? ""}${legacyId[3]}`.trim() : rest);
26
+ const typed = TODO_TYPE_TAG_RE.exec(publicRest) ?? TODO_TYPE_TAG_RE.exec(`[${token}] ${publicRest}`);
27
+ const status = isGithubCheckboxResolved(token) ? "resolved" : "open";
28
+ return {
29
+ status,
30
+ description: rest,
31
+ ...(typed ? { kind: typed[1], target_version: typed[2] ?? null, title: typed[3].trim() } : { title: publicRest }),
32
+ ...(id ? { id } : {}),
33
+ ...(publicRest !== rest ? { public_description: publicRest } : {}),
34
+ };
29
35
  }
30
36
  export function isResolvedTodoMarkdownStatus(status) {
31
37
  return status === "resolved";
32
38
  }
33
- //# sourceMappingURL=todoMarkdown.js.map
39
+ export function renderTodoPublicRecord(record) {
40
+ if (typeof record.title === "string" && record.title.trim()) {
41
+ const kind = typeof record.kind === "string" && record.kind.trim() ? record.kind : "task";
42
+ const target = typeof record.target_version === "string" && record.target_version.trim() ? `:${record.target_version}` : "";
43
+ return `[${kind}${target}] ${record.title.trim()}`;
44
+ }
45
+ return String(record.description ?? "");
46
+ }
@@ -0,0 +1,192 @@
1
+ import path from "node:path";
2
+ import { preCutoverCommand } from "./preCutoverCommand.js";
3
+ import { loadTodoReadinessContract } from "../registries/todoReadinessContract.js";
4
+ import { TODO_SEVERITY_ORDER } from "./todoSeverity.js";
5
+ import { renderTodoPublicRecord } from "./todoMarkdown.js";
6
+ function mapping(value) {
7
+ return value !== null && typeof value === "object" && !Array.isArray(value);
8
+ }
9
+ function validProjectedOrder(value) {
10
+ if (!mapping(value))
11
+ return false;
12
+ if (value.kind === "absent")
13
+ return Object.keys(value).length === 1;
14
+ return value.kind === "managed"
15
+ && Object.keys(value).sort().join(",") === "kind,markdownOrder"
16
+ && Number.isSafeInteger(value.markdownOrder)
17
+ && Number(value.markdownOrder) > 0;
18
+ }
19
+ function projectedMode(entities) {
20
+ const declared = entities.filter((entity) => Object.hasOwn(entity, "projectedOrder"));
21
+ if (!declared.length)
22
+ return false;
23
+ if (declared.length !== entities.length || declared.some((entity) => !validProjectedOrder(entity.projectedOrder))) {
24
+ throw new Error("projected TODO readiness requires one valid projectedOrder for every entity");
25
+ }
26
+ return true;
27
+ }
28
+ function compareProjectedOrder(left, right) {
29
+ const a = left.projectedOrder;
30
+ const b = right.projectedOrder;
31
+ if (a.kind !== b.kind)
32
+ return a.kind === "managed" ? -1 : 1;
33
+ if (a.kind === "managed" && b.kind === "managed")
34
+ return a.markdownOrder - b.markdownOrder || left.id.localeCompare(right.id);
35
+ return (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER) || left.id.localeCompare(right.id);
36
+ }
37
+ function dependencies(readiness) {
38
+ return Array.isArray(readiness.dependencies)
39
+ ? readiness.dependencies.filter(mapping)
40
+ : [];
41
+ }
42
+ function hasDependencyCycle(itemId, byId) {
43
+ const visit = (id, visiting, visited) => {
44
+ if (visiting.has(id))
45
+ return true;
46
+ if (visited.has(id))
47
+ return false;
48
+ const entity = byId.get(id);
49
+ const readiness = mapping(entity?.record.readiness) ? entity.record.readiness : null;
50
+ if (!readiness)
51
+ return false;
52
+ visiting.add(id);
53
+ for (const dependency of dependencies(readiness)) {
54
+ if (dependency.artifact === "todo" && typeof dependency.id === "string") {
55
+ if (visit(dependency.id, visiting, visited))
56
+ return true;
57
+ }
58
+ }
59
+ visiting.delete(id);
60
+ visited.add(id);
61
+ return false;
62
+ };
63
+ return visit(itemId, new Set(), new Set());
64
+ }
65
+ export function evaluateTodoReadinessQueue(entities, sourceRoot) {
66
+ if (entities.length === 0) {
67
+ return {
68
+ selected: null,
69
+ evaluations: [],
70
+ triage: { count: 0, bounded: true, recovery: null },
71
+ abstainRecovery: null,
72
+ };
73
+ }
74
+ const contract = sourceRoot
75
+ ? loadTodoReadinessContract(path.join(sourceRoot, "skills/agentera/schemas/artifacts/todo.yaml"), path.join(sourceRoot, "skills/agentera/protocol.yaml"), path.join(sourceRoot, "skills/agentera/capability_schema_contract.yaml"))
76
+ : loadTodoReadinessContract();
77
+ const projected = projectedMode(entities);
78
+ const byId = new Map(entities.map((entity) => [entity.id, entity]));
79
+ const evaluate = (entity) => {
80
+ const { record } = entity;
81
+ const readiness = mapping(record.readiness) ? record.readiness : null;
82
+ const dependencyList = readiness ? dependencies(readiness) : [];
83
+ let outcome = "actionable";
84
+ let declaredRecovery = null;
85
+ if (record.status === "resolved")
86
+ outcome = "todo_resolved";
87
+ else if (!readiness)
88
+ outcome = "readiness_absent";
89
+ else if (readiness.blocked !== null) {
90
+ outcome = "blocked";
91
+ declaredRecovery = mapping(readiness.blocked) && typeof readiness.blocked.recovery === "string"
92
+ ? readiness.blocked.recovery
93
+ : null;
94
+ }
95
+ else if (mapping(readiness.gate) && readiness.gate.state === "pending") {
96
+ outcome = "gate_pending";
97
+ declaredRecovery = typeof readiness.gate.recovery === "string" ? readiness.gate.recovery : null;
98
+ }
99
+ else if (dependencyList.some((dependency) => dependency.artifact !== "todo")) {
100
+ outcome = "dependency_cross_artifact";
101
+ }
102
+ else if (dependencyList.some((dependency) => typeof dependency.id !== "string" || !byId.has(dependency.id))) {
103
+ outcome = "dependency_missing";
104
+ }
105
+ else if (hasDependencyCycle(entity.id, byId)) {
106
+ outcome = "dependency_cycle";
107
+ }
108
+ else if (dependencyList.some((dependency) => byId.get(String(dependency.id))?.record.status !== "resolved")) {
109
+ outcome = "dependency_open";
110
+ }
111
+ const authority = contract.outcomes[outcome];
112
+ const capability = readiness && typeof readiness.capability === "string" ? readiness.capability : undefined;
113
+ const queueRank = readiness && Number.isInteger(readiness.queue_rank) ? Number(readiness.queue_rank) : undefined;
114
+ return {
115
+ id: entity.id,
116
+ artifact: entity.artifact,
117
+ severity: String(record.severity ?? "normal"),
118
+ description: renderTodoPublicRecord(record),
119
+ outcome,
120
+ result: String(authority.result),
121
+ eligible: authority.eligible === true,
122
+ attention: String(authority.attention),
123
+ recovery: declaredRecovery ?? (typeof authority.recovery === "string" ? authority.recovery : null),
124
+ retrieval: { exact: preCutoverCommand(`state todo get --id ${entity.id} --format json`) },
125
+ ...(capability ? {
126
+ capability,
127
+ phase: contract.phaseByCapability.get(capability),
128
+ reason: typeof readiness?.reason === "string" ? readiness.reason : "",
129
+ } : {}),
130
+ ...(queueRank === undefined ? {} : { queueRank }),
131
+ ...(projected ? { projectedOrder: entity.projectedOrder } : {}),
132
+ };
133
+ };
134
+ const evaluations = entities.map(evaluate);
135
+ const actionable = evaluations.filter((entry) => entry.eligible);
136
+ if (!projected) {
137
+ const ranks = new Map();
138
+ for (const entry of actionable) {
139
+ const key = `${entry.severity}\0${String(entry.queueRank)}`;
140
+ ranks.set(key, [...(ranks.get(key) ?? []), entry]);
141
+ }
142
+ for (const conflicts of ranks.values()) {
143
+ if (conflicts.length < 2)
144
+ continue;
145
+ const authority = contract.outcomes.ordering_conflict;
146
+ for (const entry of conflicts) {
147
+ entry.outcome = "ordering_conflict";
148
+ entry.result = String(authority.result);
149
+ entry.eligible = false;
150
+ entry.attention = String(authority.attention);
151
+ entry.recovery = typeof authority.recovery === "string" ? authority.recovery : null;
152
+ }
153
+ }
154
+ }
155
+ const selected = evaluations
156
+ .filter((entry) => entry.eligible)
157
+ .sort((left, right) => (TODO_SEVERITY_ORDER[left.severity] ?? TODO_SEVERITY_ORDER.normal)
158
+ - (TODO_SEVERITY_ORDER[right.severity] ?? TODO_SEVERITY_ORDER.normal)
159
+ || (projected
160
+ ? compareProjectedOrder(left, right)
161
+ : (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER) || left.id.localeCompare(right.id)))[0] ?? null;
162
+ const triageCount = evaluations.filter((entry) => entry.attention === "item").length;
163
+ const mixedRecovery = contract.queueOutcomes.mixed_actionable_and_triage?.recovery;
164
+ const queueRecovery = contract.queueOutcomes.all_non_actionable?.recovery;
165
+ const nonActionable = evaluations
166
+ .filter((entry) => !entry.eligible && entry.result !== "resolved")
167
+ .sort((left, right) => (TODO_SEVERITY_ORDER[left.severity] ?? TODO_SEVERITY_ORDER.normal)
168
+ - (TODO_SEVERITY_ORDER[right.severity] ?? TODO_SEVERITY_ORDER.normal)
169
+ || contract.precedence.indexOf(left.outcome) - contract.precedence.indexOf(right.outcome)
170
+ || (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER));
171
+ const recoveryCandidate = nonActionable[0];
172
+ const equallyRankedRecoveries = recoveryCandidate
173
+ ? new Set(nonActionable
174
+ .filter((entry) => entry.severity === recoveryCandidate.severity
175
+ && entry.outcome === recoveryCandidate.outcome
176
+ && entry.queueRank === recoveryCandidate.queueRank)
177
+ .map((entry) => entry.recovery))
178
+ : new Set();
179
+ const abstainRecovery = equallyRankedRecoveries.size === 1
180
+ ? recoveryCandidate?.recovery ?? null
181
+ : typeof queueRecovery === "string" ? queueRecovery : null;
182
+ return {
183
+ selected,
184
+ evaluations,
185
+ triage: {
186
+ count: triageCount,
187
+ bounded: true,
188
+ recovery: triageCount > 0 && typeof mixedRecovery === "string" ? mixedRecovery : null,
189
+ },
190
+ abstainRecovery: !selected ? abstainRecovery : null,
191
+ };
192
+ }
@@ -0,0 +1,18 @@
1
+ /** Severity band keys for TODO.md sections — shared by state todo, prime, and orientation. */
2
+ export const TODO_SEVERITY_ORDER_KEYS = [
3
+ "critical",
4
+ "degraded",
5
+ "warning",
6
+ "normal",
7
+ "info",
8
+ "annoying",
9
+ ];
10
+ /** Sort priority for TODO severity bands (lower = higher priority). */
11
+ export const TODO_SEVERITY_ORDER = {
12
+ critical: 0,
13
+ degraded: 1,
14
+ warning: 1,
15
+ normal: 2,
16
+ info: 3,
17
+ annoying: 3,
18
+ };