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,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,170 @@
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
+ ...(operation.input.optional ? { optional: true } : {}),
57
+ sources: operation.input.sources,
58
+ structured_sources: operation.input.structuredSources ?? [],
59
+ cli_owned_fields: operation.input.cliOwnedFields,
60
+ ...(structured ? { schema: structuredInputSchemaProjection(structured) } : {}),
61
+ },
62
+ recovery: operation.recovery,
63
+ examples: operation.examples,
64
+ bounds: operation.bounds,
65
+ fields: operation.fields.map((field) => ({
66
+ flag: field.flag,
67
+ field: field.field,
68
+ kind: field.kind,
69
+ required: field.required === true,
70
+ ...(field.repeatable ? { repeatable: true } : {}),
71
+ ...(field.validValues ? { valid_values: field.validValues } : {}),
72
+ ...(field.validValuesSource ? { valid_values_source: field.validValuesSource } : {}),
73
+ ...(field.description ? { description: field.description } : {}),
74
+ })),
75
+ allow_force: operation.allowForce,
76
+ compacts: operation.compacts,
77
+ };
78
+ }
79
+ export function mutationParityMatrix(targets = WRITABLE_ARTIFACTS) {
80
+ const selected = new Set(targets);
81
+ const grammar = loadMutationGrammar();
82
+ const rows = codeOwnedSpecs()
83
+ .filter((spec) => selected.has(spec.artifact))
84
+ .map((spec) => {
85
+ const declaration = declarationFor(grammar, spec.artifact, spec.verb);
86
+ const operationDigest = cryptoDigest(canonicalJson(operationProjection(declaration)));
87
+ return {
88
+ artifact: spec.artifact,
89
+ verb: spec.verb,
90
+ class: declaration.mutationClass,
91
+ contract_digest: grammar.contractDigest,
92
+ operation_digest: operationDigest,
93
+ surfaces: {
94
+ authority: `references/artifacts/state-storage-authority.yaml#mutation_grammar.${spec.artifact}.${spec.verb}`,
95
+ runtime: `agentera state ${spec.artifact} ${spec.verb}`,
96
+ explain: `agentera state ${spec.artifact} explain --verb ${spec.verb} --format json`,
97
+ schema: "agentera schema --format json",
98
+ help: `agentera state ${spec.artifact} --help`,
99
+ },
100
+ success: { command: declaration.examples[0], expected: "pass", evidence: "class-level runtime regression" },
101
+ rejection: { command: `${declaration.examples[0]} --retired-content-flag`, expected: "fail", before_effects: true, evidence: "generic parser rejection regression" },
102
+ compare: ["authority", "runtime", "explain", "schema", "help"],
103
+ };
104
+ });
105
+ return {
106
+ schemaVersion: "agentera.stateMutationParity.v1",
107
+ contract_digest: grammar.contractDigest,
108
+ rows,
109
+ counts: {
110
+ operations: rows.length,
111
+ classes: Object.fromEntries(["record_payload", "simple_transition", "batch_transaction"].map((kind) => [kind, rows.filter((row) => row.class === kind).length])),
112
+ },
113
+ };
114
+ }
115
+ function cryptoDigest(value) {
116
+ // Kept local to make the parity projection independent from authority bytes.
117
+ return createSha256(value);
118
+ }
119
+ function createSha256(value) {
120
+ return crypto.createHash("sha256").update(value).digest("hex");
121
+ }
122
+ export function stateWriterArtifactContract(artifact, mode = "full") {
123
+ if (!isWritableArtifact(artifact))
124
+ return null;
125
+ const grammar = loadMutationGrammar();
126
+ const specs = codeOwnedSpecs().filter((spec) => spec.artifact === artifact);
127
+ const mutations = specs.map((spec) => spec.verb);
128
+ const result = {
129
+ artifact,
130
+ contract_digest: grammar.contractDigest,
131
+ mutations,
132
+ operation_count: specs.length,
133
+ explain_command: `agentera state ${artifact} explain --format json`,
134
+ explain_all_command: `agentera state ${artifact} explain --all --format json`,
135
+ explain_by_verb: Object.fromEntries(mutations.map((verb) => [verb, `agentera state ${artifact} explain --verb ${verb} --format json`])),
136
+ ...(writerOwnedFields(artifact).length ? { writer_owned_fields: writerOwnedFields(artifact) } : {}),
137
+ };
138
+ if (mode === "full") {
139
+ result.operations = specs.map((spec) => operationProjection(declarationFor(grammar, artifact, spec.verb)));
140
+ result.parity_matrix = mutationParityMatrix([artifact]);
141
+ }
142
+ return result;
143
+ }
144
+ export function stateWriterContract(targets = WRITABLE_ARTIFACTS, mode = "full") {
145
+ const uniqueTargets = [...new Set(targets)];
146
+ const artifacts = uniqueTargets.map((target) => stateWriterArtifactContract(target, mode)).filter((entry) => entry !== null);
147
+ const grammar = loadMutationGrammar();
148
+ const fullParity = mutationParityMatrix(uniqueTargets);
149
+ const parity = mode === "full"
150
+ ? fullParity
151
+ : {
152
+ schemaVersion: fullParity.schemaVersion,
153
+ contract_digest: fullParity.contract_digest,
154
+ counts: fullParity.counts,
155
+ row_count: fullParity.rows.length,
156
+ detail: "agentera state <artifact> explain --all --format json",
157
+ };
158
+ return {
159
+ schemaVersion: "agentera.stateWriterDiscovery.v1",
160
+ namespace: "agentera state",
161
+ authority: grammar.authority,
162
+ contract_digest: grammar.contractDigest,
163
+ policy: "Use the state writer for supported artifact mutations; do not hand-edit those artifacts during normal capability execution.",
164
+ discovery_command: "agentera schema --format json",
165
+ mutation_grammar: `agentera state <artifact> explain --all --format json`,
166
+ artifacts,
167
+ parity_matrix: parity,
168
+ unsupported_targets: uniqueTargets.filter((target) => stateWriterArtifactContract(target, mode) === null),
169
+ };
170
+ }
@@ -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
+ }