agentera 3.0.0-dev.4 → 3.0.0-dev.46

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 (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  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/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  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/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  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/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,234 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { publishImmutableFile, publishNumberedArchive, } from "../archivePublication.js";
4
+ import { assertValidatedProjectRoot } from "../projectRoot.js";
5
+ import { acquireWriterLock } from "./lock.js";
6
+ export const MUTATION_FAILURE_BOUNDARIES = [
7
+ "staged-write",
8
+ "archive-directory-publication",
9
+ "archive-publication",
10
+ "backup-publication",
11
+ "revision-publication",
12
+ "projection-consistency",
13
+ "projection-publication",
14
+ "directory-sync",
15
+ ];
16
+ export class InjectedMutationFailure extends Error {
17
+ boundary;
18
+ constructor(boundary) {
19
+ super(`injected state mutation failure after ${boundary}`);
20
+ this.name = "InjectedMutationFailure";
21
+ this.boundary = boundary;
22
+ }
23
+ }
24
+ let stageSequence = 0;
25
+ function fsyncDirectory(directory) {
26
+ const fd = fs.openSync(directory, "r");
27
+ try {
28
+ fs.fsyncSync(fd);
29
+ }
30
+ finally {
31
+ fs.closeSync(fd);
32
+ }
33
+ }
34
+ function stagePath(target) {
35
+ stageSequence += 1;
36
+ return path.join(path.dirname(target), `.${path.basename(target)}.writer.${process.pid}.${stageSequence}.tmp`);
37
+ }
38
+ function isMutationStage(name) {
39
+ return /\.writer\.\d+\.\d+\.tmp$/.test(name);
40
+ }
41
+ function removeStaleStages(directory) {
42
+ if (!fs.existsSync(directory))
43
+ return;
44
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
45
+ const candidate = path.join(directory, entry.name);
46
+ if (entry.isDirectory() && !entry.isSymbolicLink()) {
47
+ removeStaleStages(candidate);
48
+ continue;
49
+ }
50
+ if (!entry.isFile() || !isMutationStage(entry.name))
51
+ continue;
52
+ try {
53
+ fs.unlinkSync(candidate);
54
+ }
55
+ catch (error) {
56
+ if (error.code !== "ENOENT")
57
+ throw error;
58
+ }
59
+ }
60
+ }
61
+ export class StateMutationTransaction {
62
+ projectRoot;
63
+ options;
64
+ stages = new Set();
65
+ failureInjected = false;
66
+ constructor(projectRoot, options = {}) {
67
+ this.projectRoot = projectRoot;
68
+ this.options = options;
69
+ }
70
+ stageProjection(target, bytes) {
71
+ const directory = path.dirname(target);
72
+ fs.mkdirSync(directory, { recursive: true });
73
+ removeStaleStages(directory);
74
+ const stage = stagePath(target);
75
+ let fd;
76
+ try {
77
+ fd = fs.openSync(stage, "wx");
78
+ fs.writeFileSync(fd, bytes, "utf8");
79
+ fs.fsyncSync(fd);
80
+ fs.closeSync(fd);
81
+ fd = undefined;
82
+ this.stages.add(stage);
83
+ return stage;
84
+ }
85
+ finally {
86
+ if (fd !== undefined)
87
+ fs.closeSync(fd);
88
+ if (!this.stages.has(stage)) {
89
+ try {
90
+ fs.unlinkSync(stage);
91
+ }
92
+ catch {
93
+ /* stage was never created or cleanup is already complete */
94
+ }
95
+ }
96
+ }
97
+ }
98
+ syncStaged(stage) {
99
+ const fd = fs.openSync(stage, "r");
100
+ try {
101
+ fs.fsyncSync(fd);
102
+ }
103
+ finally {
104
+ fs.closeSync(fd);
105
+ }
106
+ this.failAfter("staged-write");
107
+ }
108
+ publishArchive(artifact, entryNumber, record) {
109
+ const archive = publishNumberedArchive(this.projectRoot, artifact, entryNumber, record, {
110
+ afterDirectorySync: () => this.failAfter("directory-sync"),
111
+ });
112
+ this.failAfter("archive-publication");
113
+ return archive;
114
+ }
115
+ publishExperimentArchive(publication, onExisting) {
116
+ const published = publishImmutableFile(publication.target, publication.bytes, {
117
+ directoryDurabilityRoot: publication.directoryDurabilityRoot,
118
+ onExisting,
119
+ afterDirectoryEntrySync: () => this.failAfter("archive-directory-publication"),
120
+ afterDirectorySync: () => this.failAfter("directory-sync"),
121
+ });
122
+ this.failAfter("archive-publication");
123
+ return published;
124
+ }
125
+ publishBackup(target, bytes, onExisting) {
126
+ const published = publishImmutableFile(target, bytes, {
127
+ onExisting,
128
+ afterDirectorySync: () => this.failAfter("directory-sync"),
129
+ });
130
+ this.failAfter("backup-publication");
131
+ return published;
132
+ }
133
+ /**
134
+ * Atomically stage, fsync, and rename a decision revision document. The
135
+ * revision document is keyed-by-stable-id immutable evidence: a publication
136
+ * renames a fully-staged replacement into place, then fsyncs the directory.
137
+ * `expectedBytes` (the bytes read before staging) guards against a concurrent
138
+ * change to the revision document between preparation and publication.
139
+ *
140
+ * Boundaries (in order): `staged-write`, `revision-publication`,
141
+ * `directory-sync`. A `projection-consistency` checkpoint follows in the
142
+ * amendment handler, after the immutable evidence is durable.
143
+ */
144
+ publishRevisionDocument(target, bytes, expectedBytes) {
145
+ const stage = this.stageProjection(target, bytes);
146
+ try {
147
+ this.syncStaged(stage);
148
+ if (expectedBytes !== undefined) {
149
+ const currentBytes = fs.existsSync(target) ? fs.readFileSync(target, "utf8") : "";
150
+ if (currentBytes !== expectedBytes) {
151
+ throw new Error(`revision document '${target}' changed before publication; existing bytes were preserved`);
152
+ }
153
+ }
154
+ fs.renameSync(stage, target);
155
+ this.stages.delete(stage);
156
+ this.failAfter("revision-publication");
157
+ fsyncDirectory(path.dirname(target));
158
+ this.failAfter("directory-sync");
159
+ }
160
+ finally {
161
+ this.removeStage(stage);
162
+ }
163
+ }
164
+ /**
165
+ * A read-only recovery checkpoint. The amendment handler verifies the
166
+ * decisions projection base still agrees with the published revision's
167
+ * `base_sha256`, then marks the checkpoint so a recovery test can inject a
168
+ * failure after verification but before the operation returns success.
169
+ */
170
+ revisionConsistencyCheckpoint() {
171
+ this.failAfter("projection-consistency");
172
+ }
173
+ publishProjection(stage, target, expectedBytes) {
174
+ if (expectedBytes !== undefined) {
175
+ const currentBytes = fs.existsSync(target) ? fs.readFileSync(target, "utf8") : "";
176
+ if (currentBytes !== expectedBytes) {
177
+ throw new Error(`projection target '${target}' changed before publication; existing bytes were preserved`);
178
+ }
179
+ }
180
+ fs.renameSync(stage, target);
181
+ this.stages.delete(stage);
182
+ this.failAfter("projection-publication");
183
+ fsyncDirectory(path.dirname(target));
184
+ this.failAfter("directory-sync");
185
+ }
186
+ mutateProjection(target, mutation) {
187
+ const stage = this.stageProjection(target, fs.readFileSync(target, "utf8"));
188
+ try {
189
+ const result = mutation(stage);
190
+ if (result.changed) {
191
+ this.syncStaged(stage);
192
+ this.publishProjection(stage, target);
193
+ }
194
+ return result;
195
+ }
196
+ finally {
197
+ this.removeStage(stage);
198
+ }
199
+ }
200
+ removeStage(stage) {
201
+ this.stages.delete(stage);
202
+ try {
203
+ fs.unlinkSync(stage);
204
+ }
205
+ catch {
206
+ /* published or already removed */
207
+ }
208
+ }
209
+ cleanup() {
210
+ for (const stage of this.stages)
211
+ this.removeStage(stage);
212
+ this.stages.clear();
213
+ }
214
+ failAfter(boundary) {
215
+ if (this.failureInjected || this.options.failAfter !== boundary)
216
+ return;
217
+ this.failureInjected = true;
218
+ throw new InjectedMutationFailure(boundary);
219
+ }
220
+ }
221
+ export function withStateMutation(projectRoot, operation, options = {}, validatedRoot) {
222
+ const lock = acquireWriterLock(projectRoot, options.lockTimeoutMs, validatedRoot);
223
+ const transaction = new StateMutationTransaction(projectRoot, options);
224
+ try {
225
+ if (validatedRoot)
226
+ assertValidatedProjectRoot(validatedRoot);
227
+ removeStaleStages(path.join(projectRoot, ".agentera"));
228
+ return operation(transaction);
229
+ }
230
+ finally {
231
+ transaction.cleanup();
232
+ lock.release();
233
+ }
234
+ }
@@ -0,0 +1,169 @@
1
+ import crypto from "node:crypto";
2
+ import { canonicalJson, loadMutationGrammar, } from "./grammar.js";
3
+ import { RUNTIME_WRITABLE_ARTIFACTS, RUNTIME_WRITE_VERBS, runtimeOperationSpec, runtimeOperationSpecs, } from "./runtimeOperations.js";
4
+ import { structuredInputDescriptor, structuredInputSchemaProjection } from "./input.js";
5
+ export const WRITABLE_ARTIFACTS = RUNTIME_WRITABLE_ARTIFACTS;
6
+ export const WRITE_VERBS = RUNTIME_WRITE_VERBS;
7
+ let runtimeCache;
8
+ function codeOwnedSpecs() {
9
+ if (!runtimeCache)
10
+ runtimeCache = runtimeOperationSpecs();
11
+ return runtimeCache;
12
+ }
13
+ /**
14
+ * Runtime behavior is deliberately code-owned. The authority is loaded only
15
+ * to prove that its discovery projection still describes these executable
16
+ * operations; it never supplies parser fields or accepted verbs.
17
+ */
18
+ export function assertMutationGrammarParity() {
19
+ loadMutationGrammar();
20
+ }
21
+ export function operationSpec(artifact, verb) {
22
+ const spec = runtimeOperationSpec(artifact, verb);
23
+ return spec ? { ...spec, fields: spec.fields.map((field) => ({ ...field })) } : null;
24
+ }
25
+ export function verbsForArtifact(artifact) {
26
+ if (!isWritableArtifact(artifact))
27
+ return [];
28
+ return [...codeOwnedSpecs().filter((spec) => spec.artifact === artifact).map((spec) => spec.verb), "explain"];
29
+ }
30
+ export function isWriteVerb(value) {
31
+ return Boolean(value && WRITE_VERBS.includes(value));
32
+ }
33
+ export function isWritableArtifact(value) {
34
+ return WRITABLE_ARTIFACTS.includes(value);
35
+ }
36
+ export function writerOwnedFields(artifact) {
37
+ return [...new Set(codeOwnedSpecs().filter((spec) => spec.artifact === artifact).flatMap((spec) => spec.ownedFields))];
38
+ }
39
+ function declarationFor(grammar, artifact, verb) {
40
+ const declaration = grammar.operations.find((operation) => operation.artifact === artifact && operation.verb === verb);
41
+ if (!declaration)
42
+ throw new Error(`mutation grammar is missing code-owned operation '${artifact}.${verb}'`);
43
+ return declaration;
44
+ }
45
+ function operationProjection(operation) {
46
+ const structured = structuredInputDescriptor(operation.artifact, operation.verb);
47
+ return {
48
+ verb: operation.verb,
49
+ class: operation.mutationClass,
50
+ selectors: operation.selectors,
51
+ preconditions: operation.preconditions,
52
+ owned_fields: operation.ownedFields,
53
+ input: {
54
+ mode: operation.input.mode,
55
+ ...(operation.input.root ? { root: operation.input.root } : {}),
56
+ sources: operation.input.sources,
57
+ structured_sources: operation.input.structuredSources ?? [],
58
+ cli_owned_fields: operation.input.cliOwnedFields,
59
+ ...(structured ? { schema: structuredInputSchemaProjection(structured) } : {}),
60
+ },
61
+ recovery: operation.recovery,
62
+ examples: operation.examples,
63
+ bounds: operation.bounds,
64
+ fields: operation.fields.map((field) => ({
65
+ flag: field.flag,
66
+ field: field.field,
67
+ kind: field.kind,
68
+ required: field.required === true,
69
+ ...(field.repeatable ? { repeatable: true } : {}),
70
+ ...(field.validValues ? { valid_values: field.validValues } : {}),
71
+ ...(field.validValuesSource ? { valid_values_source: field.validValuesSource } : {}),
72
+ ...(field.description ? { description: field.description } : {}),
73
+ })),
74
+ allow_force: operation.allowForce,
75
+ compacts: operation.compacts,
76
+ };
77
+ }
78
+ export function mutationParityMatrix(targets = WRITABLE_ARTIFACTS) {
79
+ const selected = new Set(targets);
80
+ const grammar = loadMutationGrammar();
81
+ const rows = codeOwnedSpecs()
82
+ .filter((spec) => selected.has(spec.artifact))
83
+ .map((spec) => {
84
+ const declaration = declarationFor(grammar, spec.artifact, spec.verb);
85
+ const operationDigest = cryptoDigest(canonicalJson(operationProjection(declaration)));
86
+ return {
87
+ artifact: spec.artifact,
88
+ verb: spec.verb,
89
+ class: declaration.mutationClass,
90
+ contract_digest: grammar.contractDigest,
91
+ operation_digest: operationDigest,
92
+ surfaces: {
93
+ authority: `references/artifacts/state-storage-authority.yaml#mutation_grammar.${spec.artifact}.${spec.verb}`,
94
+ runtime: `agentera state ${spec.artifact} ${spec.verb}`,
95
+ explain: `agentera state ${spec.artifact} explain --verb ${spec.verb} --format json`,
96
+ schema: "agentera schema --format json",
97
+ help: `agentera state ${spec.artifact} --help`,
98
+ },
99
+ success: { command: declaration.examples[0], expected: "pass", evidence: "class-level runtime regression" },
100
+ rejection: { command: `${declaration.examples[0]} --retired-content-flag`, expected: "fail", before_effects: true, evidence: "generic parser rejection regression" },
101
+ compare: ["authority", "runtime", "explain", "schema", "help"],
102
+ };
103
+ });
104
+ return {
105
+ schemaVersion: "agentera.stateMutationParity.v1",
106
+ contract_digest: grammar.contractDigest,
107
+ rows,
108
+ counts: {
109
+ operations: rows.length,
110
+ classes: Object.fromEntries(["record_payload", "simple_transition", "batch_transaction"].map((kind) => [kind, rows.filter((row) => row.class === kind).length])),
111
+ },
112
+ };
113
+ }
114
+ function cryptoDigest(value) {
115
+ // Kept local to make the parity projection independent from authority bytes.
116
+ return createSha256(value);
117
+ }
118
+ function createSha256(value) {
119
+ return crypto.createHash("sha256").update(value).digest("hex");
120
+ }
121
+ export function stateWriterArtifactContract(artifact, mode = "full") {
122
+ if (!isWritableArtifact(artifact))
123
+ return null;
124
+ const grammar = loadMutationGrammar();
125
+ const specs = codeOwnedSpecs().filter((spec) => spec.artifact === artifact);
126
+ const mutations = specs.map((spec) => spec.verb);
127
+ const result = {
128
+ artifact,
129
+ contract_digest: grammar.contractDigest,
130
+ mutations,
131
+ operation_count: specs.length,
132
+ explain_command: `agentera state ${artifact} explain --format json`,
133
+ explain_all_command: `agentera state ${artifact} explain --all --format json`,
134
+ explain_by_verb: Object.fromEntries(mutations.map((verb) => [verb, `agentera state ${artifact} explain --verb ${verb} --format json`])),
135
+ ...(writerOwnedFields(artifact).length ? { writer_owned_fields: writerOwnedFields(artifact) } : {}),
136
+ };
137
+ if (mode === "full") {
138
+ result.operations = specs.map((spec) => operationProjection(declarationFor(grammar, artifact, spec.verb)));
139
+ result.parity_matrix = mutationParityMatrix([artifact]);
140
+ }
141
+ return result;
142
+ }
143
+ export function stateWriterContract(targets = WRITABLE_ARTIFACTS, mode = "full") {
144
+ const uniqueTargets = [...new Set(targets)];
145
+ const artifacts = uniqueTargets.map((target) => stateWriterArtifactContract(target, mode)).filter((entry) => entry !== null);
146
+ const grammar = loadMutationGrammar();
147
+ const fullParity = mutationParityMatrix(uniqueTargets);
148
+ const parity = mode === "full"
149
+ ? fullParity
150
+ : {
151
+ schemaVersion: fullParity.schemaVersion,
152
+ contract_digest: fullParity.contract_digest,
153
+ counts: fullParity.counts,
154
+ row_count: fullParity.rows.length,
155
+ detail: "agentera state <artifact> explain --all --format json",
156
+ };
157
+ return {
158
+ schemaVersion: "agentera.stateWriterDiscovery.v1",
159
+ namespace: "agentera state",
160
+ authority: grammar.authority,
161
+ contract_digest: grammar.contractDigest,
162
+ policy: "Use the state writer for supported artifact mutations; do not hand-edit those artifacts during normal capability execution.",
163
+ discovery_command: "agentera schema --format json",
164
+ mutation_grammar: `agentera state <artifact> explain --all --format json`,
165
+ artifacts,
166
+ parity_matrix: parity,
167
+ unsupported_targets: uniqueTargets.filter((target) => stateWriterArtifactContract(target, mode) === null),
168
+ };
169
+ }
@@ -0,0 +1,128 @@
1
+ import { localTimestamp } from "./assign.js";
2
+ import { reject } from "./errors.js";
3
+ function mapping(value) {
4
+ return value !== null && typeof value === "object" && !Array.isArray(value)
5
+ ? value
6
+ : {};
7
+ }
8
+ export function mutatePlanTaskEvaluation(task, inputValue, taskLabel, allowCompletedReplacementRecovery = false) {
9
+ const input = mapping(inputValue);
10
+ const attemptId = String(input.attempt_id ?? "").trim();
11
+ const verdict = String(input.verdict ?? "");
12
+ const provenance = String(input.provenance ?? "").trim();
13
+ const failureEvidence = String(input.failure_evidence ?? "").trim();
14
+ if (!attemptId || !provenance)
15
+ reject({ class: "schema_violation", message: "evaluation requires non-empty --attempt-id and --provenance" });
16
+ if (verdict === "fail" && !failureEvidence)
17
+ reject({ class: "schema_violation", message: "a failed evaluation requires non-empty --failure-evidence" });
18
+ if (verdict === "pass" && failureEvidence)
19
+ reject({ class: "schema_violation", message: "--failure-evidence applies only to a failed evaluation" });
20
+ const prior = mapping(task.evaluation);
21
+ const priorProvenance = mapping(prior.provenance);
22
+ if (priorProvenance.attempt_id === attemptId) {
23
+ const replay = prior.last_verdict === verdict
24
+ && priorProvenance.source === provenance
25
+ && (verdict !== "fail" || prior.last_failure_evidence === failureEvidence);
26
+ if (!replay)
27
+ reject({ class: "conflict", message: `evaluation attempt '${attemptId}' already exists with different result data` });
28
+ return { replay: true, attemptCount: Number(prior.attempt_count ?? 0), failureCount: Number(prior.failure_count ?? 0) };
29
+ }
30
+ const completedReplacementRecovery = allowCompletedReplacementRecovery
31
+ && task.status === "complete"
32
+ && task.evaluation === undefined
33
+ && verdict === "pass";
34
+ if (["complete", "blocked", "superseded"].includes(String(task.status ?? "")) && !completedReplacementRecovery)
35
+ reject({ class: "conflict", message: `${taskLabel} is ${task.status} and cannot accept another evaluation` });
36
+ const attemptCount = Number(prior.attempt_count ?? 0);
37
+ const failureCount = Number(prior.failure_count ?? 0);
38
+ if (!Number.isInteger(attemptCount) || attemptCount < 0 || !Number.isInteger(failureCount) || failureCount < 0)
39
+ reject({ class: "schema_violation", message: `${taskLabel} has malformed evaluation state` });
40
+ if (verdict === "fail" && failureCount >= 2)
41
+ reject({ class: "conflict", message: `${taskLabel} has exhausted its evaluation retry budget` });
42
+ const nextFailureCount = failureCount + (verdict === "fail" ? 1 : 0);
43
+ task.evaluation = {
44
+ attempt_count: attemptCount + 1,
45
+ failure_count: nextFailureCount,
46
+ last_verdict: verdict,
47
+ last_failure_evidence: verdict === "fail" ? failureEvidence : prior.last_failure_evidence ?? null,
48
+ provenance: {
49
+ attempt_id: attemptId,
50
+ source: provenance,
51
+ recorded_at: localTimestamp(),
52
+ writer_command: "agentera state plan record-evaluation",
53
+ },
54
+ };
55
+ if (nextFailureCount >= 2)
56
+ task.status = "blocked";
57
+ return { replay: false, attemptCount: attemptCount + 1, failureCount: nextFailureCount };
58
+ }
59
+ export function planEvaluationMetadataViolations(value, prefix, taskStatus) {
60
+ if (value === undefined)
61
+ return [];
62
+ if (value === null || typeof value !== "object" || Array.isArray(value))
63
+ return [`plan: '${prefix}' must be a mapping`];
64
+ const evaluation = value;
65
+ const violations = [];
66
+ const allowed = new Set(["attempt_count", "failure_count", "last_verdict", "last_failure_evidence", "provenance"]);
67
+ for (const field of Object.keys(evaluation))
68
+ if (!allowed.has(field))
69
+ violations.push(`plan: unsupported field '${prefix}.${field}'`);
70
+ const attemptCount = evaluation.attempt_count;
71
+ const failureCount = evaluation.failure_count;
72
+ if (!Number.isInteger(attemptCount) || Number(attemptCount) < 1)
73
+ violations.push(`plan: '${prefix}.attempt_count' must be a positive integer`);
74
+ if (!Number.isInteger(failureCount) || Number(failureCount) < 0)
75
+ violations.push(`plan: '${prefix}.failure_count' must be a non-negative integer`);
76
+ if (Number.isInteger(attemptCount) && Number.isInteger(failureCount) && Number(failureCount) > Number(attemptCount))
77
+ violations.push(`plan: '${prefix}.failure_count' cannot exceed attempt_count`);
78
+ const verdict = evaluation.last_verdict;
79
+ if (verdict !== "pass" && verdict !== "fail")
80
+ violations.push(`plan: '${prefix}.last_verdict' must be pass or fail`);
81
+ const evidence = evaluation.last_failure_evidence;
82
+ if (evidence !== null && typeof evidence !== "string")
83
+ violations.push(`plan: '${prefix}.last_failure_evidence' must be a string or null`);
84
+ if (verdict === "fail" && (typeof evidence !== "string" || !evidence.trim()))
85
+ violations.push(`plan: '${prefix}.last_failure_evidence' is required for a failed evaluation`);
86
+ const provenance = mapping(evaluation.provenance);
87
+ if (Object.keys(provenance).length === 0)
88
+ violations.push(`plan: '${prefix}.provenance' must be a mapping`);
89
+ else {
90
+ for (const field of ["attempt_id", "source", "recorded_at", "writer_command"])
91
+ if (typeof provenance[field] !== "string" || !String(provenance[field]).trim())
92
+ violations.push(`plan: '${prefix}.provenance.${field}' must be a non-empty string`);
93
+ if (provenance.writer_command !== "agentera state plan record-evaluation")
94
+ violations.push(`plan: '${prefix}.provenance.writer_command' must identify the evaluation writer`);
95
+ }
96
+ if (Number(failureCount) >= 2 && !["blocked", "superseded"].includes(String(taskStatus)))
97
+ violations.push(`plan: '${prefix}' with two failed evaluations requires task status blocked or superseded`);
98
+ return violations;
99
+ }
100
+ export function planTaskRecordViolations(task, prefix = "plan task") {
101
+ const violations = [];
102
+ if (typeof task.plan !== "string" || !/^[a-z]{10}$/.test(task.plan))
103
+ violations.push(`${prefix}: plan must be a bare ten-letter plan ID`);
104
+ if (typeof task.name !== "string" || !task.name.trim())
105
+ violations.push(`${prefix}: name must be a non-empty string`);
106
+ const status = String(task.status);
107
+ if (!["pending", "in_progress", "complete", "blocked", "superseded", "skipped"].includes(status))
108
+ violations.push(`${prefix}: status must be pending, in_progress, complete, blocked, superseded, or skipped`);
109
+ for (const field of ["depends_on", "acceptance"])
110
+ if (!Array.isArray(task[field]) || !task[field].every((value) => typeof value === "string"))
111
+ violations.push(`${prefix}: ${field} must be a string list`);
112
+ if (Array.isArray(task.depends_on) && task.depends_on.some((value) => typeof value !== "string" || !/^[a-z]{10}$/.test(value)))
113
+ violations.push(`${prefix}: depends_on must contain only bare ten-letter task IDs`);
114
+ const hasSupersession = task.superseded_by !== undefined || task.superseded_reason !== undefined;
115
+ if (status !== "superseded" && hasSupersession)
116
+ violations.push(`${prefix}: superseded_by and superseded_reason are only valid when status is superseded`);
117
+ if (status === "superseded") {
118
+ const replacements = task.superseded_by;
119
+ if (!Array.isArray(replacements) || replacements.length === 0 || !replacements.every((value) => typeof value === "string" && /^[a-z]{10}$/.test(value)))
120
+ violations.push(`${prefix}: superseded_by must be a non-empty list of bare task IDs`);
121
+ else if (new Set(replacements).size !== replacements.length)
122
+ violations.push(`${prefix}: superseded_by must not contain duplicate task IDs`);
123
+ const reason = task.superseded_reason;
124
+ if (typeof reason !== "string" || !reason.trim() || reason.length > 500)
125
+ violations.push(`${prefix}: superseded_reason must be a non-empty explanation of at most 500 characters`);
126
+ }
127
+ return [...violations, ...planEvaluationMetadataViolations(task.evaluation, `${prefix}.evaluation`, task.status)];
128
+ }