agentera 3.0.0-dev.8 → 3.0.0-dev.80

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 (724) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +252 -22
  3. package/bundle/.agentera-build-source.json +8 -0
  4. package/bundle/CHANGELOG.md +1387 -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 +271 -0
  9. package/bundle/extract-corpus-parity.json +2 -4
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +484 -0
  12. package/bundle/references/adapters/package-registry.yaml +443 -188
  13. package/bundle/references/adapters/package-surface-characterization.md +68 -34
  14. package/bundle/references/adapters/product-v1-reset.yaml +101 -0
  15. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  16. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  17. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  18. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  19. package/bundle/references/analysis/evidence-tier-authority.yaml +559 -0
  20. package/bundle/references/analysis/personal-glossary-evaluation-authority.yaml +175 -0
  21. package/bundle/references/analysis/personal-glossary-evaluation-corpus.yaml +291 -0
  22. package/bundle/references/analysis/personal-glossary-holdout.yaml +192 -0
  23. package/bundle/references/analysis/verification-policy.yaml +261 -0
  24. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
  25. package/bundle/references/artifacts/glossary-entry-contract.yaml +2906 -0
  26. package/bundle/references/artifacts/state-storage-authority.yaml +3065 -0
  27. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  28. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  29. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  30. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  31. package/bundle/references/cli/routing-model.md +152 -93
  32. package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
  33. package/bundle/references/cli/update-channels.yaml +7 -5
  34. package/bundle/references/cli/vocabulary-index.yaml +7 -9
  35. package/bundle/references/cli/vocabulary.md +54 -97
  36. package/bundle/references/meta/retained-reference-authority.yaml +171 -0
  37. package/bundle/skills/agentera/SKILL.md +183 -63
  38. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
  39. package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
  40. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
  41. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
  42. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
  43. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
  44. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
  45. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
  46. package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
  47. package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
  48. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
  49. package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
  51. package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
  52. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
  53. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
  54. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
  55. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
  56. package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
  57. package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
  58. package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
  59. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
  60. package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
  62. package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
  63. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
  64. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
  65. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
  66. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
  67. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
  68. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +13 -4
  69. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +8 -5
  70. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
  71. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +67 -3
  72. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
  73. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
  74. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
  75. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
  76. package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
  77. package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
  79. package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
  81. package/bundle/skills/agentera/protocol.yaml +4 -4
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +29 -30
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -43
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -34
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +87 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +53 -51
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -35
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +453 -55
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -39
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +305 -7
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +0 -19
  95. package/dist/.agentera-build-source.json +8 -0
  96. package/dist/analytics/extractCorpus/cli.js +52 -11
  97. package/dist/analytics/extractCorpus/copilotSessions.js +19 -8
  98. package/dist/analytics/extractCorpus/core.js +262 -14
  99. package/dist/analytics/extractCorpus/corpus.js +57 -18
  100. package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
  101. package/dist/analytics/extractCorpus/cursorSessions.js +28 -8
  102. package/dist/analytics/extractCorpus/evidenceTiers.js +709 -0
  103. package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
  104. package/dist/analytics/extractCorpus/filesystemSources.js +5 -5
  105. package/dist/analytics/extractCorpus/index.js +4 -2
  106. package/dist/analytics/extractCorpus/jsonlSessions.js +76 -8
  107. package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
  108. package/dist/analytics/extractCorpus/sqliteSessions.js +12 -4
  109. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  110. package/dist/analytics/extractCorpus.js +0 -1
  111. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  112. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  113. package/dist/analytics/personalGlossaryAdmission.js +113 -0
  114. package/dist/analytics/personalGlossaryCandidateProjection.js +788 -0
  115. package/dist/analytics/personalGlossaryCandidateProjectionExcerpts.js +144 -0
  116. package/dist/analytics/personalGlossaryCandidateProjectionModel.js +1 -0
  117. package/dist/analytics/personalGlossaryCandidateReadView.js +23 -0
  118. package/dist/analytics/personalGlossaryCurrentGeneration.js +25 -0
  119. package/dist/analytics/personalGlossaryDecision.js +203 -0
  120. package/dist/analytics/personalGlossaryExplicit.js +788 -0
  121. package/dist/analytics/personalGlossaryExplicitMining.js +285 -0
  122. package/dist/analytics/personalGlossaryExplicitScope.js +41 -0
  123. package/dist/analytics/personalGlossaryExplicitSegments.js +418 -0
  124. package/dist/analytics/personalGlossaryExplicitTypes.js +26 -0
  125. package/dist/analytics/personalGlossaryLexicalClassifier.js +175 -0
  126. package/dist/analytics/personalGlossaryProfile.js +229 -0
  127. package/dist/analytics/personalGlossaryRecurrence.js +618 -0
  128. package/dist/analytics/personalGlossaryRefreshProjection.js +351 -0
  129. package/dist/analytics/personalGlossaryReviewRecordStorage.js +428 -0
  130. package/dist/analytics/personalGlossaryReviewRecords.js +332 -0
  131. package/dist/analytics/profileSignals.js +211 -0
  132. package/dist/analytics/usageStats.js +150 -23
  133. package/dist/audit/terminologyDrift.js +281 -0
  134. package/dist/bin/agentera.js +3 -2
  135. package/dist/capabilities/audit/instructions.js +16 -6
  136. package/dist/capabilities/build/instructions.js +59 -6
  137. package/dist/capabilities/design/instructions.js +3 -4
  138. package/dist/capabilities/discuss/instructions.js +29 -6
  139. package/dist/capabilities/document/instructions.js +11 -6
  140. package/dist/capabilities/index.js +20 -14
  141. package/dist/capabilities/optimize/instructions.js +14 -6
  142. package/dist/capabilities/orchestrate/instructions.js +42 -6
  143. package/dist/capabilities/plan/instructions.js +30 -3
  144. package/dist/capabilities/profile/instructions.js +104 -5
  145. package/dist/capabilities/research/instructions.js +4 -5
  146. package/dist/capabilities/status/instructions.js +15 -6
  147. package/dist/capabilities/status/startupInstructions.js +34 -0
  148. package/dist/capabilities/vision/instructions.js +3 -5
  149. package/dist/cli/appContext.js +14 -7
  150. package/dist/cli/argvalidate.js +0 -1
  151. package/dist/cli/capabilityContext/benchmark.js +5 -4
  152. package/dist/cli/capabilityContext/bespoke.js +14 -6
  153. package/dist/cli/capabilityContext/build.js +116 -42
  154. package/dist/cli/capabilityContext/closeout.js +30 -27
  155. package/dist/cli/capabilityContext/contract.js +18 -27
  156. package/dist/cli/capabilityContext/evidence.js +84 -77
  157. package/dist/cli/capabilityContext/index.js +0 -1
  158. package/dist/cli/capabilityContext/orchestration.js +42 -18
  159. package/dist/cli/capabilityContext/planState.js +89 -96
  160. package/dist/cli/capabilityContext/progress.js +52 -12
  161. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  162. package/dist/cli/capabilityContext/shared.js +9 -20
  163. package/dist/cli/capabilityContext/slim.js +52 -8
  164. package/dist/cli/capabilityContext/startup.js +51 -114
  165. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  166. package/dist/cli/capabilityContext/types.js +26 -10
  167. package/dist/cli/capabilityContext.js +0 -1
  168. package/dist/cli/commands/appHome.js +0 -1
  169. package/dist/cli/commands/capability.js +2 -2
  170. package/dist/cli/commands/compact.js +163 -13
  171. package/dist/cli/commands/doctor.js +118 -11
  172. package/dist/cli/commands/durability.js +81 -0
  173. package/dist/cli/commands/glossaryAdvice.js +138 -0
  174. package/dist/cli/commands/lint.js +22 -8
  175. package/dist/cli/commands/personalGlossaryCandidateReads.js +755 -0
  176. package/dist/cli/commands/personalGlossaryDecision.js +349 -0
  177. package/dist/cli/commands/personalGlossaryPublish.js +484 -0
  178. package/dist/cli/commands/personalGlossaryReviewRecordReads.js +209 -0
  179. package/dist/cli/commands/personalGlossaryReviewRecords.js +623 -0
  180. package/dist/cli/commands/prime/briefOrientation.js +845 -0
  181. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  182. package/dist/cli/commands/prime/bundleStatus.js +54 -4
  183. package/dist/cli/commands/prime/collectEntityOrientation.js +338 -0
  184. package/dist/cli/commands/prime/collectOrientationState.js +124 -68
  185. package/dist/cli/commands/prime/orientationOutput.js +271 -59
  186. package/dist/cli/commands/prime/types.js +0 -1
  187. package/dist/cli/commands/prime.js +89 -11
  188. package/dist/cli/commands/profileGrounding.js +55 -0
  189. package/dist/cli/commands/query.js +74 -52
  190. package/dist/cli/commands/report.js +187 -27
  191. package/dist/cli/commands/route.js +142 -0
  192. package/dist/cli/commands/schema.js +436 -138
  193. package/dist/cli/commands/state/decisions.js +40 -56
  194. package/dist/cli/commands/state/docs.js +58 -85
  195. package/dist/cli/commands/state/experimentRecords.js +151 -0
  196. package/dist/cli/commands/state/experiments.js +11 -65
  197. package/dist/cli/commands/state/get.js +129 -0
  198. package/dist/cli/commands/state/health.js +11 -113
  199. package/dist/cli/commands/state/index.js +6 -41
  200. package/dist/cli/commands/state/list.js +194 -0
  201. package/dist/cli/commands/state/objective.js +21 -65
  202. package/dist/cli/commands/state/plan.js +11 -170
  203. package/dist/cli/commands/state/planTasks.js +154 -0
  204. package/dist/cli/commands/state/plans.js +154 -0
  205. package/dist/cli/commands/state/progress.js +11 -45
  206. package/dist/cli/commands/state/shared.js +0 -1
  207. package/dist/cli/commands/state/todo.js +28 -107
  208. package/dist/cli/commands/state/write.js +459 -0
  209. package/dist/cli/commands/upgrade.js +176 -5
  210. package/dist/cli/commands/upgradeVerify.js +118 -0
  211. package/dist/cli/commands/validate.js +235 -136
  212. package/dist/cli/commands/verify.js +73 -16
  213. package/dist/cli/contracts/bundleStatus.js +0 -1
  214. package/dist/cli/contracts/orientationState.js +0 -1
  215. package/dist/cli/dispatch/argvParser.js +0 -1
  216. package/dist/cli/dispatch/check.js +84 -40
  217. package/dist/cli/dispatch/commands.js +3 -3
  218. package/dist/cli/dispatch/index.js +84 -52
  219. package/dist/cli/dispatch/lifecycle.js +182 -62
  220. package/dist/cli/dispatch/prime.js +37 -2
  221. package/dist/cli/dispatch/projections.js +17 -0
  222. package/dist/cli/dispatch/shared.js +1 -2
  223. package/dist/cli/dispatch/state.js +62 -66
  224. package/dist/cli/dispatch.js +0 -1
  225. package/dist/cli/errors.js +16 -17
  226. package/dist/cli/help.js +419 -41
  227. package/dist/cli/migrationRequired.js +125 -0
  228. package/dist/cli/orientation/attention.js +19 -22
  229. package/dist/cli/orientation/corpusCoverage.js +32 -1
  230. package/dist/cli/orientation.js +346 -129
  231. package/dist/cli/planArtifacts.js +350 -0
  232. package/dist/cli/planEvidence.js +157 -0
  233. package/dist/cli/planLifecycleState.js +36 -0
  234. package/dist/cli/planTaskIndex.js +11 -0
  235. package/dist/cli/preCutoverCommand.js +32 -0
  236. package/dist/cli/prime-blob.js +71 -3
  237. package/dist/cli/productV1Eol.js +55 -0
  238. package/dist/cli/profileAcquisition.js +167 -0
  239. package/dist/cli/startupCompletenessContract.js +11 -9
  240. package/dist/cli/stateQuery.js +47 -12
  241. package/dist/cli/structured.js +0 -1
  242. package/dist/cli/todoMarkdown.js +25 -12
  243. package/dist/cli/todoReadinessSelection.js +192 -0
  244. package/dist/cli/todoSeverity.js +0 -1
  245. package/dist/core/atomicWriter.js +23 -0
  246. package/dist/core/developmentChannel.js +1 -0
  247. package/dist/core/developmentInvocation.js +377 -0
  248. package/dist/core/difflib.js +0 -1
  249. package/dist/core/envPaths.js +0 -1
  250. package/dist/core/jsonValue.js +0 -1
  251. package/dist/core/paths.js +0 -1
  252. package/dist/core/pyjson.js +0 -1
  253. package/dist/core/shell.js +4 -0
  254. package/dist/core/skillIdentity.js +23 -0
  255. package/dist/core/sourceRoot.js +9 -12
  256. package/dist/core/text.js +10 -0
  257. package/dist/core/toml.js +0 -1
  258. package/dist/core/yaml.js +61 -2
  259. package/dist/eval/evalSkills.js +13 -14
  260. package/dist/eval/glossaryEvaluation.js +751 -0
  261. package/dist/eval/glossaryEvaluationProcess.js +29 -0
  262. package/dist/eval/glossaryEvaluationRunner.js +571 -0
  263. package/dist/eval/glossaryEvaluationSuccessReport.js +297 -0
  264. package/dist/eval/hybridRouteEvaluation.js +155 -0
  265. package/dist/eval/semanticEval.js +0 -1
  266. package/dist/eval/semanticFixtures.js +0 -1
  267. package/dist/hooks/common.js +3 -56
  268. package/dist/hooks/compaction/apply.js +224 -47
  269. package/dist/hooks/compaction/dryRun.js +2 -1
  270. package/dist/hooks/compaction/index.js +5 -6
  271. package/dist/hooks/compaction/parse.js +73 -6
  272. package/dist/hooks/compaction/retention.js +28 -25
  273. package/dist/hooks/compaction/status.js +145 -26
  274. package/dist/hooks/compaction/types.js +0 -1
  275. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  276. package/dist/hooks/validateArtifact/index.js +6 -65
  277. package/dist/hooks/validateArtifact/markdown.js +9 -10
  278. package/dist/hooks/validateArtifact/schema.js +96 -9
  279. package/dist/hooks/validateArtifact/traversal.js +12 -11
  280. package/dist/hooks/validateArtifact/violations.js +5 -3
  281. package/dist/migrate/v2HandoffManifest.js +8 -3
  282. package/dist/registries/activationContract.js +2 -0
  283. package/dist/registries/activationTuples.js +145 -0
  284. package/dist/registries/artifactProtocolIds.js +2 -1
  285. package/dist/registries/artifactRegistry.js +207 -60
  286. package/dist/registries/artifactSchemaProjection.js +45 -0
  287. package/dist/registries/capabilityContract.js +5 -21
  288. package/dist/registries/evaluatorHandoffContract.js +0 -1
  289. package/dist/registries/evidenceTierContract.js +375 -0
  290. package/dist/registries/explicitSegmentGrammarContract.js +619 -0
  291. package/dist/registries/glossaryAdviceContract.js +79 -0
  292. package/dist/registries/glossaryCandidateContractPaths.js +6 -0
  293. package/dist/registries/glossaryCandidateContracts.js +820 -0
  294. package/dist/registries/glossaryCandidateDecisionAuthority.js +119 -0
  295. package/dist/registries/glossaryCandidateDecisionContract.js +62 -0
  296. package/dist/registries/glossaryCandidateProjectionAuthority.js +345 -0
  297. package/dist/registries/glossaryCandidateProjectionContract.js +108 -0
  298. package/dist/registries/glossaryCaveatContract.js +67 -0
  299. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  300. package/dist/registries/glossaryEntryContract.js +759 -0
  301. package/dist/registries/glossaryEntryTemporal.js +12 -0
  302. package/dist/registries/glossaryMiningAuthority.js +764 -0
  303. package/dist/registries/glossaryProfileFullContract.js +24 -0
  304. package/dist/registries/glossaryReviewRecordsAuthority.js +426 -0
  305. package/dist/registries/glossaryReviewRecordsContract.js +129 -0
  306. package/dist/registries/glossaryTermIdentity.js +139 -0
  307. package/dist/registries/glossaryTermOccurrence.js +20 -0
  308. package/dist/registries/hybridRoute.js +274 -0
  309. package/dist/registries/hybridRouteReceipt.js +221 -0
  310. package/dist/registries/packagePublication.js +273 -0
  311. package/dist/registries/packageRegistry.js +184 -209
  312. package/dist/registries/personalGlossaryContracts.js +1 -0
  313. package/dist/registries/todoReadinessContract.js +448 -0
  314. package/dist/registries/triggerLoader.js +7 -44
  315. package/dist/registries/verbosityBudgetContract.js +205 -0
  316. package/dist/release/releaseMetadata.js +168 -11
  317. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  318. package/dist/runtime/lifecycleAdapters.js +777 -0
  319. package/dist/runtime/lifecycleAuthority.js +453 -0
  320. package/dist/runtime/lifecycleOperationContract.js +123 -0
  321. package/dist/runtime/lifecycleOperations.js +634 -0
  322. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  323. package/dist/runtime/lifecyclePublication.js +415 -0
  324. package/dist/runtime/lifecycleSnapshot.js +438 -0
  325. package/dist/runtime/nativeResourceCleanup.js +503 -0
  326. package/dist/setup/opencode.js +20 -13
  327. package/dist/setup/opencodeConstants.js +1 -0
  328. package/dist/setup/sharedSkill.js +45 -0
  329. package/dist/setup/smokeChecks.js +14 -75
  330. package/dist/state/archiveDiscovery.js +580 -0
  331. package/dist/state/archivePublication.js +225 -0
  332. package/dist/state/archiveRecovery.js +237 -0
  333. package/dist/state/archiveReplay.js +53 -0
  334. package/dist/state/canonicalMigrationRecord.js +36 -0
  335. package/dist/state/changelog.js +221 -0
  336. package/dist/state/decisionEntities.js +367 -0
  337. package/dist/state/decisionLegacyValidation.js +215 -0
  338. package/dist/state/decisionMigrationProvenance.js +199 -0
  339. package/dist/state/decisionOverlay.js +254 -0
  340. package/dist/state/decisionRevision.js +256 -0
  341. package/dist/state/decisionRevisionMigration.js +89 -0
  342. package/dist/state/directRetrieval.js +323 -0
  343. package/dist/state/durability.js +324 -0
  344. package/dist/state/entityCutover.js +459 -0
  345. package/dist/state/entityCutoverGit.js +127 -0
  346. package/dist/state/entityGlossaryAuthority.js +13 -0
  347. package/dist/state/entityListProjection.js +187 -0
  348. package/dist/state/entityListRuntimeRegistry.js +85 -0
  349. package/dist/state/entityMigrationCausality.js +97 -0
  350. package/dist/state/entityMigrationIdentity.js +5 -0
  351. package/dist/state/entityMigrationPreview.js +840 -0
  352. package/dist/state/entityMigrationTodo.js +133 -0
  353. package/dist/state/entityPublicationContext.js +859 -0
  354. package/dist/state/entityRetrievalHelp.js +506 -0
  355. package/dist/state/entityStorage.js +899 -0
  356. package/dist/state/exactReplacementRecovery.js +18 -0
  357. package/dist/state/experimentArchive.js +63 -0
  358. package/dist/state/experimentIdentity.js +202 -0
  359. package/dist/state/healthEntities.js +262 -0
  360. package/dist/state/healthEntityValidation.js +18 -0
  361. package/dist/state/healthRepair.js +69 -0
  362. package/dist/state/installRoot.js +15 -7
  363. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  364. package/dist/state/legacyIdentity.js +47 -0
  365. package/dist/state/legacySummaryRecord.js +6 -0
  366. package/dist/state/listAccounting.js +54 -0
  367. package/dist/state/listClassification.js +17 -0
  368. package/dist/state/listCursor.js +42 -0
  369. package/dist/state/listRetrieval.js +781 -0
  370. package/dist/state/migrationSourceBinding.js +30 -0
  371. package/dist/state/objectiveExperimentEntities.js +322 -0
  372. package/dist/state/planEntities.js +1027 -0
  373. package/dist/state/planIdentity.js +47 -0
  374. package/dist/state/planLineageValidation.js +52 -0
  375. package/dist/state/planReplacementTransaction.js +475 -0
  376. package/dist/state/planRetrieval.js +313 -0
  377. package/dist/state/planTaskRetrieval.js +294 -0
  378. package/dist/state/progressEntities.js +512 -0
  379. package/dist/state/progressGlossaryCaveat.js +168 -0
  380. package/dist/state/progressPublicationOrder.js +19 -0
  381. package/dist/state/progressWritePolicy.js +33 -0
  382. package/dist/state/projectRoot.js +62 -0
  383. package/dist/state/projectionPolicy.js +190 -0
  384. package/dist/state/retrievalAuthority.js +156 -0
  385. package/dist/state/safeProjectFile.js +155 -0
  386. package/dist/state/startupAnalysis/benchmark.js +70 -9
  387. package/dist/state/startupAnalysis/contract.js +44 -10
  388. package/dist/state/startupAnalysis/helpers.js +1 -2
  389. package/dist/state/startupAnalysis/index.js +0 -1
  390. package/dist/state/startupAnalysis/metrics.js +0 -1
  391. package/dist/state/startupAnalysis/records.js +0 -1
  392. package/dist/state/startupAnalysis/report.js +0 -1
  393. package/dist/state/startupAnalysis/threshold.js +13 -1
  394. package/dist/state/startupAnalysis.js +0 -1
  395. package/dist/state/startupProjection.js +499 -0
  396. package/dist/state/stateMode.js +222 -0
  397. package/dist/state/stateStorageAuthority.js +47 -0
  398. package/dist/state/summaryEntityRead.js +25 -0
  399. package/dist/state/summaryMigrationProvenance.js +66 -0
  400. package/dist/state/summarySourceRowAuthority.js +36 -0
  401. package/dist/state/todoActivationSafety.js +58 -0
  402. package/dist/state/todoCreateBatch.js +69 -0
  403. package/dist/state/todoDocsEntities.js +1339 -0
  404. package/dist/state/todoDocsEntityValidation.js +158 -0
  405. package/dist/state/todoMarkdownProjection.js +63 -0
  406. package/dist/state/todoReconciliationActivation.js +182 -0
  407. package/dist/state/todoReconciliationInspection.js +184 -0
  408. package/dist/state/todoReconciliationRepair.js +320 -0
  409. package/dist/state/todoReconciliationTransaction.js +628 -0
  410. package/dist/state/todoSeverityHeadings.js +71 -0
  411. package/dist/state/todoTransitionBatch.js +65 -0
  412. package/dist/state/todoUpdateBatch.js +50 -0
  413. package/dist/state/write/assign.js +20 -0
  414. package/dist/state/write/candidateMutation.js +269 -0
  415. package/dist/state/write/errors.js +11 -0
  416. package/dist/state/write/experimentPublication.js +192 -0
  417. package/dist/state/write/explain.js +380 -0
  418. package/dist/state/write/fields.js +61 -0
  419. package/dist/state/write/glossaryPublication.js +263 -0
  420. package/dist/state/write/grammar.js +285 -0
  421. package/dist/state/write/helpers.js +29 -0
  422. package/dist/state/write/index.js +12 -0
  423. package/dist/state/write/input.js +391 -0
  424. package/dist/state/write/lock.js +837 -0
  425. package/dist/state/write/mutation.js +234 -0
  426. package/dist/state/write/operations.js +170 -0
  427. package/dist/state/write/planEvaluation.js +128 -0
  428. package/dist/state/write/planPublication.js +179 -0
  429. package/dist/state/write/runtimeOperations.js +146 -0
  430. package/dist/state/write/serialize.js +1 -0
  431. package/dist/state/write/transaction.js +57 -0
  432. package/dist/state/write/validate.js +7 -0
  433. package/dist/upgrade/appContentRefresh.js +77 -36
  434. package/dist/upgrade/appModel.js +0 -1
  435. package/dist/upgrade/atomicWriter.js +1 -0
  436. package/dist/upgrade/bundleEvidence.js +0 -1
  437. package/dist/upgrade/channels.js +6 -9
  438. package/dist/upgrade/compatibility.js +43 -17
  439. package/dist/upgrade/doctor.js +55 -32
  440. package/dist/upgrade/doctorClassifier.js +11 -1
  441. package/dist/upgrade/installedHooksRetirement.js +46 -40
  442. package/dist/upgrade/legacyAgentCleanup.js +133 -34
  443. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  444. package/dist/upgrade/migrateArtifactsV2ToV3.js +325 -82
  445. package/dist/upgrade/migrationPublication.js +122 -0
  446. package/dist/upgrade/nextMajorDoctor.js +0 -22
  447. package/dist/upgrade/npxPlatformStatus.js +2 -2
  448. package/dist/upgrade/productV1Reset.js +515 -0
  449. package/dist/upgrade/productV1ResetAuthority.js +139 -0
  450. package/dist/upgrade/projectIntegration.js +126 -134
  451. package/dist/upgrade/projectIntegrationDecision.js +21 -13
  452. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  453. package/dist/upgrade/runtimeMigration.js +210 -430
  454. package/dist/upgrade/upgradeCommands.js +14 -1
  455. package/dist/upgrade/upgradeLock.js +85 -0
  456. package/dist/upgrade/upgradeOrchestrator.js +253 -48
  457. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  458. package/dist/upgrade/versionResolution.js +0 -1
  459. package/dist/validate/activationArtifactEvidence.js +866 -0
  460. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  461. package/dist/validate/activationConjunction.js +816 -0
  462. package/dist/validate/activationEvidenceManifest.js +610 -0
  463. package/dist/validate/activationPackageSemantics.js +29 -0
  464. package/dist/validate/appHomeContract.js +1 -7
  465. package/dist/validate/bootstrapAuthority.js +44 -0
  466. package/dist/validate/capability.js +11 -3
  467. package/dist/validate/crossCapability.js +14 -9
  468. package/dist/validate/glossaryVariantGuard.js +96 -0
  469. package/dist/validate/retainedReferenceAuthority.js +879 -0
  470. package/dist/validate/selfAudit.js +39 -45
  471. package/dist/validate/vocabularyAuthority.js +8 -8
  472. package/package.json +39 -13
  473. package/bundle/references/adapters/cursor.md +0 -214
  474. package/bundle/references/adapters/opencode.md +0 -530
  475. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  476. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  477. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  478. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -554
  479. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  480. package/bundle/references/analysis/benchmark.md +0 -267
  481. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  482. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  483. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  484. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  485. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  486. package/bundle/references/cli/coexistence-probe.yaml +0 -13
  487. package/bundle/references/cli/parity-expected-actual-template.md +0 -30
  488. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  489. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  490. package/bundle/references/cli/upgrade-repair-wording.md +0 -45
  491. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  492. package/bundle/references/meta/documentation-inventory.md +0 -49
  493. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  494. package/bundle/skills/agentera/agents/audit.toml +0 -6
  495. package/bundle/skills/agentera/agents/build.toml +0 -6
  496. package/bundle/skills/agentera/agents/design.toml +0 -6
  497. package/bundle/skills/agentera/agents/discuss.toml +0 -6
  498. package/bundle/skills/agentera/agents/document.toml +0 -6
  499. package/bundle/skills/agentera/agents/optimize.toml +0 -6
  500. package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
  501. package/bundle/skills/agentera/agents/plan.toml +0 -6
  502. package/bundle/skills/agentera/agents/profile.toml +0 -6
  503. package/bundle/skills/agentera/agents/research.toml +0 -6
  504. package/bundle/skills/agentera/agents/status.toml +0 -6
  505. package/bundle/skills/agentera/agents/vision.toml +0 -6
  506. package/bundle/skills/agentera/references/contract.md +0 -1048
  507. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  508. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  509. package/dist/analytics/extractCorpus/core.js.map +0 -1
  510. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  511. package/dist/analytics/extractCorpus/coverageAudit.js.map +0 -1
  512. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  513. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +0 -1
  514. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  515. package/dist/analytics/extractCorpus/index.js.map +0 -1
  516. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  517. package/dist/analytics/extractCorpus/sqliteCaps.js.map +0 -1
  518. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  519. package/dist/analytics/extractCorpus.js.map +0 -1
  520. package/dist/analytics/usageStats.js.map +0 -1
  521. package/dist/bin/agentera.js.map +0 -1
  522. package/dist/capabilities/audit/instructions.js.map +0 -1
  523. package/dist/capabilities/build/instructions.js.map +0 -1
  524. package/dist/capabilities/design/instructions.js.map +0 -1
  525. package/dist/capabilities/discuss/instructions.js.map +0 -1
  526. package/dist/capabilities/document/instructions.js.map +0 -1
  527. package/dist/capabilities/index.js.map +0 -1
  528. package/dist/capabilities/optimize/instructions.js.map +0 -1
  529. package/dist/capabilities/orchestrate/instructions.js.map +0 -1
  530. package/dist/capabilities/plan/instructions.js.map +0 -1
  531. package/dist/capabilities/profile/instructions.js.map +0 -1
  532. package/dist/capabilities/research/instructions.js.map +0 -1
  533. package/dist/capabilities/status/instructions.js.map +0 -1
  534. package/dist/capabilities/vision/instructions.js.map +0 -1
  535. package/dist/cli/appContext.js.map +0 -1
  536. package/dist/cli/argvalidate.js.map +0 -1
  537. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  538. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  539. package/dist/cli/capabilityContext/build.js.map +0 -1
  540. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  541. package/dist/cli/capabilityContext/contract.js.map +0 -1
  542. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  543. package/dist/cli/capabilityContext/index.js.map +0 -1
  544. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  545. package/dist/cli/capabilityContext/planState.js.map +0 -1
  546. package/dist/cli/capabilityContext/progress.js.map +0 -1
  547. package/dist/cli/capabilityContext/shared.js.map +0 -1
  548. package/dist/cli/capabilityContext/slim.js.map +0 -1
  549. package/dist/cli/capabilityContext/startup.js.map +0 -1
  550. package/dist/cli/capabilityContext/types.js.map +0 -1
  551. package/dist/cli/capabilityContext.js.map +0 -1
  552. package/dist/cli/commands/appHome.js.map +0 -1
  553. package/dist/cli/commands/capability.js.map +0 -1
  554. package/dist/cli/commands/compact.js.map +0 -1
  555. package/dist/cli/commands/doctor.js.map +0 -1
  556. package/dist/cli/commands/lint.js.map +0 -1
  557. package/dist/cli/commands/prime/bundleStatus.js.map +0 -1
  558. package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
  559. package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
  560. package/dist/cli/commands/prime/types.js.map +0 -1
  561. package/dist/cli/commands/prime/v1Migration.js +0 -39
  562. package/dist/cli/commands/prime/v1Migration.js.map +0 -1
  563. package/dist/cli/commands/prime.js.map +0 -1
  564. package/dist/cli/commands/query.js.map +0 -1
  565. package/dist/cli/commands/report.js.map +0 -1
  566. package/dist/cli/commands/schema.js.map +0 -1
  567. package/dist/cli/commands/state/decisions.js.map +0 -1
  568. package/dist/cli/commands/state/docs.js.map +0 -1
  569. package/dist/cli/commands/state/experiments.js.map +0 -1
  570. package/dist/cli/commands/state/health.js.map +0 -1
  571. package/dist/cli/commands/state/index.js.map +0 -1
  572. package/dist/cli/commands/state/objective.js.map +0 -1
  573. package/dist/cli/commands/state/plan.js.map +0 -1
  574. package/dist/cli/commands/state/progress.js.map +0 -1
  575. package/dist/cli/commands/state/shared.js.map +0 -1
  576. package/dist/cli/commands/state/todo.js.map +0 -1
  577. package/dist/cli/commands/upgrade.js.map +0 -1
  578. package/dist/cli/commands/validate.js.map +0 -1
  579. package/dist/cli/commands/verify.js.map +0 -1
  580. package/dist/cli/contracts/bundleStatus.js.map +0 -1
  581. package/dist/cli/contracts/orientationState.js.map +0 -1
  582. package/dist/cli/dispatch/argvParser.js.map +0 -1
  583. package/dist/cli/dispatch/check.js.map +0 -1
  584. package/dist/cli/dispatch/commands.js.map +0 -1
  585. package/dist/cli/dispatch/index.js.map +0 -1
  586. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  587. package/dist/cli/dispatch/prime.js.map +0 -1
  588. package/dist/cli/dispatch/shared.js.map +0 -1
  589. package/dist/cli/dispatch/state.js.map +0 -1
  590. package/dist/cli/dispatch.js.map +0 -1
  591. package/dist/cli/errors.js.map +0 -1
  592. package/dist/cli/help.js.map +0 -1
  593. package/dist/cli/orientation/attention.js.map +0 -1
  594. package/dist/cli/orientation/corpusCoverage.js.map +0 -1
  595. package/dist/cli/orientation.js.map +0 -1
  596. package/dist/cli/prime-blob.js.map +0 -1
  597. package/dist/cli/startupCompletenessContract.js.map +0 -1
  598. package/dist/cli/stateQuery.js.map +0 -1
  599. package/dist/cli/structured.js.map +0 -1
  600. package/dist/cli/todoMarkdown.js.map +0 -1
  601. package/dist/cli/todoSeverity.js.map +0 -1
  602. package/dist/core/difflib.js.map +0 -1
  603. package/dist/core/envPaths.js.map +0 -1
  604. package/dist/core/jsonValue.js.map +0 -1
  605. package/dist/core/paths.js.map +0 -1
  606. package/dist/core/pyjson.js.map +0 -1
  607. package/dist/core/sourceRoot.js.map +0 -1
  608. package/dist/core/toml.js.map +0 -1
  609. package/dist/core/yaml.js.map +0 -1
  610. package/dist/eval/evalSkills.js.map +0 -1
  611. package/dist/eval/semanticEval.js.map +0 -1
  612. package/dist/eval/semanticFixtures.js.map +0 -1
  613. package/dist/hooks/common.js.map +0 -1
  614. package/dist/hooks/compaction/apply.js.map +0 -1
  615. package/dist/hooks/compaction/dryRun.js.map +0 -1
  616. package/dist/hooks/compaction/index.js.map +0 -1
  617. package/dist/hooks/compaction/parse.js.map +0 -1
  618. package/dist/hooks/compaction/retention.js.map +0 -1
  619. package/dist/hooks/compaction/status.js.map +0 -1
  620. package/dist/hooks/compaction/types.js.map +0 -1
  621. package/dist/hooks/cursorPreToolUse.js +0 -19
  622. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  623. package/dist/hooks/cursorSessionStart.js +0 -79
  624. package/dist/hooks/cursorSessionStart.js.map +0 -1
  625. package/dist/hooks/sessionStart.js +0 -216
  626. package/dist/hooks/sessionStart.js.map +0 -1
  627. package/dist/hooks/sessionStop.js +0 -206
  628. package/dist/hooks/sessionStop.js.map +0 -1
  629. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  630. package/dist/hooks/validateArtifact/index.js.map +0 -1
  631. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  632. package/dist/hooks/validateArtifact/runtime.js +0 -86
  633. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  634. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  635. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  636. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  637. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  638. package/dist/registries/artifactProtocolIds.js.map +0 -1
  639. package/dist/registries/artifactRegistry.js.map +0 -1
  640. package/dist/registries/capabilityContract.js.map +0 -1
  641. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  642. package/dist/registries/packageRegistry.js.map +0 -1
  643. package/dist/registries/runtimeAdapterRegistry.js +0 -316
  644. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  645. package/dist/registries/triggerLoader.js.map +0 -1
  646. package/dist/release/releaseMetadata.js.map +0 -1
  647. package/dist/setup/codex/agents.js +0 -96
  648. package/dist/setup/codex/agents.js.map +0 -1
  649. package/dist/setup/codex/cli.js +0 -161
  650. package/dist/setup/codex/cli.js.map +0 -1
  651. package/dist/setup/codex/configToml.js +0 -639
  652. package/dist/setup/codex/configToml.js.map +0 -1
  653. package/dist/setup/codex/constants.js +0 -29
  654. package/dist/setup/codex/constants.js.map +0 -1
  655. package/dist/setup/codex/installRoot.js +0 -64
  656. package/dist/setup/codex/installRoot.js.map +0 -1
  657. package/dist/setup/codex/state.js +0 -270
  658. package/dist/setup/codex/state.js.map +0 -1
  659. package/dist/setup/codex.js +0 -12
  660. package/dist/setup/codex.js.map +0 -1
  661. package/dist/setup/copilot.js +0 -227
  662. package/dist/setup/copilot.js.map +0 -1
  663. package/dist/setup/cursor.js +0 -129
  664. package/dist/setup/cursor.js.map +0 -1
  665. package/dist/setup/cursorSurfaces.js +0 -67
  666. package/dist/setup/cursorSurfaces.js.map +0 -1
  667. package/dist/setup/doctor/core.js +0 -300
  668. package/dist/setup/doctor/core.js.map +0 -1
  669. package/dist/setup/doctor/diagnostics.js +0 -240
  670. package/dist/setup/doctor/diagnostics.js.map +0 -1
  671. package/dist/setup/doctor/opencode.js +0 -313
  672. package/dist/setup/doctor/opencode.js.map +0 -1
  673. package/dist/setup/doctor/report.js +0 -425
  674. package/dist/setup/doctor/report.js.map +0 -1
  675. package/dist/setup/doctor.js +0 -10
  676. package/dist/setup/doctor.js.map +0 -1
  677. package/dist/setup/opencode.js.map +0 -1
  678. package/dist/setup/smokeChecks.js.map +0 -1
  679. package/dist/state/installRoot.js.map +0 -1
  680. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  681. package/dist/state/startupAnalysis/contract.js.map +0 -1
  682. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  683. package/dist/state/startupAnalysis/index.js.map +0 -1
  684. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  685. package/dist/state/startupAnalysis/records.js.map +0 -1
  686. package/dist/state/startupAnalysis/report.js.map +0 -1
  687. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  688. package/dist/state/startupAnalysis.js.map +0 -1
  689. package/dist/upgrade/appContentRefresh.js.map +0 -1
  690. package/dist/upgrade/appModel.js.map +0 -1
  691. package/dist/upgrade/bundleEvidence.js.map +0 -1
  692. package/dist/upgrade/channels.js.map +0 -1
  693. package/dist/upgrade/coexistenceProbe.js +0 -107
  694. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  695. package/dist/upgrade/compatibility.js.map +0 -1
  696. package/dist/upgrade/doctor.js.map +0 -1
  697. package/dist/upgrade/doctorClassifier.js.map +0 -1
  698. package/dist/upgrade/installedHooksRetirement.js.map +0 -1
  699. package/dist/upgrade/legacyAgentCleanup.js.map +0 -1
  700. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  701. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  702. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  703. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  704. package/dist/upgrade/npxPlatformStatus.js.map +0 -1
  705. package/dist/upgrade/projectIntegration.js.map +0 -1
  706. package/dist/upgrade/projectIntegrationDecision.js.map +0 -1
  707. package/dist/upgrade/runtimeMigration.js.map +0 -1
  708. package/dist/upgrade/upgradeCommands.js.map +0 -1
  709. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  710. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  711. package/dist/upgrade/versionResolution.js.map +0 -1
  712. package/dist/validate/appHomeContract.js.map +0 -1
  713. package/dist/validate/capability.js.map +0 -1
  714. package/dist/validate/crossCapability.js.map +0 -1
  715. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  716. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  717. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
  718. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  719. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  720. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  721. package/dist/validate/lifecycleAdapters.js +0 -62
  722. package/dist/validate/lifecycleAdapters.js.map +0 -1
  723. package/dist/validate/selfAudit.js.map +0 -1
  724. package/dist/validate/vocabularyAuthority.js.map +0 -1
@@ -0,0 +1,2906 @@
1
+ schema_version: agentera.glossaryEntryContract.v1
2
+ status: active_authority
3
+ purpose: >-
4
+ Define glossary entry semantics once, specialize evidence ownership for
5
+ personal and project entries, and declare one consumer-semantics and caveat
6
+ lifecycle contract with bounded acquisition and shared advice resolution.
7
+ Build, Discuss, Plan, and prime consumption are active. Build alone owns
8
+ durable caveat publication; prime projects only bounded review attention.
9
+
10
+ authority:
11
+ source: references/artifacts/glossary-entry-contract.yaml
12
+ confidence: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
13
+ personal_history: references/analysis/evidence-tier-authority.yaml
14
+ permanence_decay: packages/cli/src/capabilities/profile/instructions.ts#Profile-format
15
+ single_source_rule: >-
16
+ Producers and consumers derive entry shape from shared_primitive and must
17
+ not restate confidence bands, decay constants, or provenance variants.
18
+
19
+ shared_primitive:
20
+ required_fields: [term, meaning, confidence, permanence, temporal, provenance]
21
+ fields:
22
+ term:
23
+ type: non_empty_string
24
+ meaning:
25
+ type: non_empty_string
26
+ confidence:
27
+ type: integer
28
+ range_from: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
29
+ permanence:
30
+ type: enum
31
+ values: [stable, durable, situational]
32
+ classification_rule: >-
33
+ Classify expected persistence independently from evidence strength.
34
+ Confidence changes never reclassify permanence.
35
+ temporal:
36
+ type: object
37
+ required_fields: [observed_at, last_confirmed_at]
38
+ field_type: iso_date
39
+ provenance:
40
+ type: discriminated_union
41
+ discriminator: kind
42
+ evidence_field: evidence
43
+ variants_from: provenance_variants
44
+
45
+ term_occurrence:
46
+ runtime: packages/cli/src/registries/glossaryTermOccurrence.ts#containsGlossaryTerm
47
+ consumers: [audit_evidence, project_publication_revalidation, confirmed_variant_guard]
48
+ comparison: exact_case_sensitive_literal
49
+ normalization: none
50
+ identifier_continuation: unicode_ID_Continue_plus_dollar_ZWNJ_ZWJ
51
+ rule: >-
52
+ Match one escaped literal without case folding or Unicode normalization.
53
+ When a term edge is an identifier-continuation character, reject an
54
+ occurrence adjacent to Unicode ID_Continue, dollar sign, U+200C ZERO WIDTH
55
+ NON-JOINER, or U+200D ZERO WIDTH JOINER. These are the ECMAScript identifier
56
+ continuation characters relevant to source-line terminology boundaries.
57
+ Literal escaping and fixed-width boundary assertions prevent regex syntax,
58
+ partial identifier matches, and input-dependent backtracking.
59
+
60
+ personal_mining_authority:
61
+ status: active_partial
62
+ design_proposal_reconciliation:
63
+ proposal: docs/notes/personal-glossary-mining-design.md
64
+ proposal_authority: non_authoritative_external_note_not_tracked_in_this_checkout
65
+ implementation_status: shipped_with_inferred_admission_deferred
66
+ shipped:
67
+ - consented_refresh_produces_generation_bound_candidate_projection
68
+ - fixed_key_aggregate_candidate_and_abstention_explanations
69
+ - profile_full_preserves_existing_glossary_before_authorized_publication
70
+ deferred:
71
+ - inferred_automatic_admission
72
+ canonical_status: this_contract
73
+ implementation_boundary: >-
74
+ This section settles personal glossary mining identity, evidence provenance,
75
+ consent, privacy, lifecycle, bounded explicit-discovery, public receipt construction,
76
+ and deterministic decision authority. The runtime performs bounded discovery,
77
+ candidate projection, private candidate retrieval, deterministic CLI
78
+ validation of host semantic evidence, explicit authorized personal
79
+ publication, and Profile Full integration. It does not perform host
80
+ semantic classification, project or public-state candidate reads, or
81
+ project glossary integration. The consented refresh command is the shipped
82
+ projection producer. Inferred candidates remain review-required or abstain;
83
+ they are not automatically admitted.
84
+ preserved_decisions: [prmnztjytv, mcsmqqitnm, zyvgyvjnsv]
85
+ replacement:
86
+ shared_primitive: shared_primitive
87
+ personal_owner: ownership_contracts.personal
88
+ project_owner: ownership_contracts.project
89
+ consumer_precedence: consumer_boundary.primary_selection
90
+ project_publication: ownership_contracts.project.publication
91
+ allowed_effects: [personal_profile_output]
92
+ forbidden_effects:
93
+ - project_glossary_read
94
+ - project_glossary_mutation
95
+ - project_publication_replacement
96
+ - consumer_precedence_change
97
+ - personal_project_merge
98
+ rule: >-
99
+ Mining may replace only the user-owned personal profile glossary through
100
+ the existing personal profile output lifecycle. It never reads or writes
101
+ project glossary state, changes consumer precedence, or changes the
102
+ Build-owned digest-confirmed project publication operation.
103
+ explicit_discovery:
104
+ status: active
105
+ runtime: packages/cli/src/analytics/personalGlossaryExplicit.ts#discoverExplicitGlossaryCues
106
+ mining_runtime: packages/cli/src/analytics/personalGlossaryExplicitMining.ts#mineExplicitGlossaryCandidates
107
+ input: bounded_signal_tier_plus_direct_single_anchor_resolution
108
+ output: evidence_capsule_plus_exact_source_spans_only
109
+ scope_window: current_sentence_and_one_adjacent_sentence_each_side
110
+ scope_binding: explicit_scope_marker_must_contain_the_term_or_be_a_direct_qualifier
111
+ span_encoding: utf8_byte_offsets
112
+ strings: preserve_exact_source_bytes_without_unicode_normalization
113
+ adjacent_direct_reference_exclusion:
114
+ references:
115
+ - this_definition
116
+ - this_term
117
+ - this_meaning
118
+ - following_definition
119
+ - following_term
120
+ - following_meaning
121
+ qualifiers: [question, example, future, hypothetical]
122
+ binding:
123
+ preceding_sentence: following_reference_only
124
+ following_sentence: this_reference_only
125
+ exact_literal_term: either_direction
126
+ grammar:
127
+ forms:
128
+ - id: quoted_means
129
+ segment_class: explicit_cue_segment
130
+ entry: outside_approved_cue
131
+ termination: shared_bounded_termination
132
+ output: shared_cue_segment_output
133
+ syntax: quoted_or_code_delimited_term_means_meaning
134
+ term: one_balanced_supported_quote_or_backtick_delimited_span
135
+ - id: definition_list_colon
136
+ segment_class: explicit_cue_segment
137
+ entry: outside_approved_cue
138
+ termination: shared_bounded_termination
139
+ output: shared_cue_segment_output
140
+ syntax: standalone_safe_definition_list_term_colon_meaning
141
+ prefix: sentence_or_line_start_with_optional_markdown_list_bullet
142
+ unmarked_terms:
143
+ - quoted_or_code_delimited_term
144
+ - uppercase_acronym_with_exact_expansion_initials
145
+ markers: [definition, term]
146
+ marked_term: bounded_nonempty_term
147
+ bare_multiword_term_without_marker: reject
148
+ meaning_start: nonempty_same_physical_line
149
+ continuation: after_nonempty_inline_meaning_within_maximum_meaning_bound_only
150
+ empty_marker_structure: reject_immediately_following_colon_line
151
+ exclusions: yaml_config_labels_times_urls_headings_citations_and_labels
152
+ - id: acronym_stands_for
153
+ segment_class: explicit_cue_segment
154
+ entry: outside_approved_cue
155
+ termination: shared_bounded_termination
156
+ output: shared_cue_segment_output
157
+ syntax: bounded_acronym_stands_for_expansion
158
+ validation: expansion_initials_must_match_acronym_exactly
159
+ - id: acronym_parenthetical
160
+ segment_class: explicit_cue_segment
161
+ entry: outside_approved_cue
162
+ termination: shared_bounded_termination
163
+ output: shared_cue_segment_output
164
+ syntax: bounded_acronym_parenthesized_expansion_or_reverse
165
+ validation: expansion_initials_must_match_acronym_exactly
166
+ - id: by_i_mean
167
+ segment_class: explicit_cue_segment
168
+ entry: outside_approved_cue
169
+ termination: shared_bounded_termination
170
+ output: shared_cue_segment_output
171
+ syntax: by_term_i_mean_meaning
172
+ - id: use_for
173
+ segment_class: explicit_cue_segment
174
+ entry: outside_approved_cue
175
+ termination: shared_bounded_termination
176
+ output: shared_cue_segment_output
177
+ syntax: use_term_for_meaning
178
+ - id: use_to_mean
179
+ segment_class: explicit_cue_segment
180
+ entry: outside_approved_cue
181
+ termination: shared_bounded_termination
182
+ output: shared_cue_segment_output
183
+ syntax: use_term_to_mean_meaning
184
+ - id: refers_to
185
+ segment_class: explicit_cue_segment
186
+ entry: outside_approved_cue
187
+ termination: shared_bounded_termination
188
+ output: shared_cue_segment_output
189
+ syntax: term_refers_to_meaning
190
+ - id: clarification_prefer_to_mean
191
+ segment_class: explicit_cue_segment
192
+ entry: outside_approved_cue
193
+ termination: shared_bounded_termination
194
+ output: shared_cue_segment_output
195
+ syntax: to_clarify_i_prefer_term_to_mean_meaning
196
+ - id: correction_means
197
+ segment_class: explicit_cue_segment
198
+ entry: outside_approved_cue
199
+ termination: shared_bounded_termination
200
+ output: shared_cue_segment_output
201
+ syntax: approved_correction_prefix_quoted_or_code_term_means_meaning
202
+ prefixes: [actually, correction, not_quite, instead, rather]
203
+ bounds:
204
+ maximum_term_utf8_bytes: 256
205
+ maximum_meaning_utf8_bytes: 4096
206
+ maximum_acronym_utf8_bytes: 32
207
+ maximum_acronym_words: 32
208
+ segment_grammar:
209
+ schema_version: agentera.personalGlossarySegmentGrammar.v1
210
+ segment_class: explicit_cue_segment
211
+ states: [outside, cue, inline_meaning, continuation, structural_config, terminated, rejected]
212
+ input_classes:
213
+ - approved_cue
214
+ - non_empty_inline_meaning
215
+ - continuation_line
216
+ - blank_line
217
+ - next_cue
218
+ - structural_fragment
219
+ - comment
220
+ - list_boundary
221
+ - indentation
222
+ - nested_marker
223
+ - block_scalar
224
+ - prose
225
+ - unsupported
226
+ - eof
227
+ initial_state: outside
228
+ terminal_states: [terminated, rejected]
229
+ entry:
230
+ from: outside
231
+ input: approved_cue
232
+ to: cue
233
+ accepted_forms:
234
+ - quoted_means
235
+ - definition_list_colon
236
+ - acronym_stands_for
237
+ - acronym_parenthetical
238
+ - by_i_mean
239
+ - use_for
240
+ - use_to_mean
241
+ - refers_to
242
+ - clarification_prefer_to_mean
243
+ - correction_means
244
+ unsupported_reason: unsupported_transition
245
+ termination:
246
+ start_state: inline_meaning
247
+ continuation_state: continuation
248
+ terminal_state: terminated
249
+ required: non_empty_inline_meaning
250
+ boundary_inputs: [blank_line, next_cue, structural_fragment, comment, list_boundary]
251
+ maximum_meaning_utf8_bytes: 4096
252
+ limit: inclusive
253
+ over_limit_reason: meaning_bound_exceeded
254
+ output:
255
+ fields: [term, meaning, term_span, meaning_span]
256
+ span_encoding: utf8_byte_offsets
257
+ source_semantics: exact_source_bytes_without_unicode_normalization
258
+ continuation:
259
+ starts_after: non_empty_inline_meaning
260
+ preserves: exact_source_newlines_and_utf8_bytes
261
+ stops_on: [blank_line, next_cue, structural_fragment, comment, list_boundary]
262
+ maximum_utf8_bytes: 4096
263
+ limit: inclusive
264
+ over_limit: reject
265
+ over_limit_reason: meaning_bound_exceeded
266
+ structural_configuration:
267
+ state: structural_config
268
+ entry_inputs: [structural_fragment, list_boundary]
269
+ persist_inputs: [comment, blank_line, indentation, nested_marker, block_scalar, structural_fragment, list_boundary]
270
+ reject_inputs: [comment, blank_line, indentation, nested_marker, block_scalar, structural_fragment, list_boundary, approved_cue]
271
+ exit:
272
+ input: prose
273
+ condition: top_level_nonempty_noncomment_nonmarker_nonstructural_line
274
+ action: reject_fragment_then_exit
275
+ next_state: outside
276
+ definition_allowed: next_physical_line_only
277
+ reference_binding:
278
+ following: nearest_next_cue
279
+ this: nearest_previous_cue
280
+ exact_term: nearest_matching_cue
281
+ matching: unicode_caseless_exact_no_normalization
282
+ duplicate_target_reason: ambiguous_reference
283
+ missing_target_reason: ambiguous_reference
284
+ duplicate_target_outcome: exclude_bound_cue_only
285
+ missing_target_outcome: exclude_bound_cue_only
286
+ unrelated_cue_outcome: retain
287
+ deduplication:
288
+ identity: personal_mining_authority.term_identity.stable_term_identity
289
+ same_identity_same_meaning: retain_one_earliest_source_span
290
+ same_identity_different_meaning: reject_all_conflicting_meaning
291
+ unrelated_cue_outcome: retain
292
+ canonical_order:
293
+ fields: [term, meaning, term_span.start, meaning_span.start]
294
+ comparator: unicode_scalar_code_point_ascending
295
+ direction: ascending
296
+ transitions:
297
+ - {from: outside, input: approved_cue, to: cue, action: enter_cue_segment}
298
+ - {from: outside, input: structural_fragment, to: structural_config, action: enter_structural_config, reason: structural_fragment}
299
+ - {from: outside, input: list_boundary, to: structural_config, action: enter_structural_config, reason: structural_fragment}
300
+ - {from: outside, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
301
+ - {from: cue, input: non_empty_inline_meaning, to: inline_meaning, action: capture_inline_meaning}
302
+ - {from: cue, input: blank_line, to: rejected, action: reject, reason: empty_meaning}
303
+ - {from: cue, input: next_cue, to: rejected, action: reject, reason: empty_meaning}
304
+ - {from: cue, input: structural_fragment, to: rejected, action: reject, reason: empty_meaning}
305
+ - {from: cue, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
306
+ - {from: inline_meaning, input: continuation_line, to: continuation, action: append_original_newline}
307
+ - {from: inline_meaning, input: blank_line, to: terminated, action: finish_before_boundary}
308
+ - {from: inline_meaning, input: next_cue, to: terminated, action: finish_before_boundary}
309
+ - {from: inline_meaning, input: structural_fragment, to: terminated, action: finish_before_boundary}
310
+ - {from: inline_meaning, input: comment, to: terminated, action: finish_before_boundary}
311
+ - {from: inline_meaning, input: list_boundary, to: terminated, action: finish_before_boundary}
312
+ - {from: inline_meaning, input: prose, to: continuation, action: append_original_newline}
313
+ - {from: inline_meaning, input: eof, to: terminated, action: finish_at_eof}
314
+ - {from: inline_meaning, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
315
+ - {from: continuation, input: continuation_line, to: continuation, action: append_original_newline}
316
+ - {from: continuation, input: prose, to: continuation, action: append_original_newline}
317
+ - {from: continuation, input: blank_line, to: terminated, action: finish_before_boundary}
318
+ - {from: continuation, input: next_cue, to: terminated, action: finish_before_boundary}
319
+ - {from: continuation, input: structural_fragment, to: terminated, action: finish_before_boundary}
320
+ - {from: continuation, input: comment, to: terminated, action: finish_before_boundary}
321
+ - {from: continuation, input: list_boundary, to: terminated, action: finish_before_boundary}
322
+ - {from: continuation, input: eof, to: terminated, action: finish_at_eof}
323
+ - {from: continuation, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
324
+ - {from: structural_config, input: approved_cue, to: rejected, action: reject, reason: structural_fragment}
325
+ - {from: structural_config, input: structural_fragment, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
326
+ - {from: structural_config, input: comment, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
327
+ - {from: structural_config, input: blank_line, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
328
+ - {from: structural_config, input: indentation, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
329
+ - {from: structural_config, input: nested_marker, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
330
+ - {from: structural_config, input: block_scalar, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
331
+ - {from: structural_config, input: list_boundary, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
332
+ - {from: structural_config, input: prose, to: outside, action: reject_fragment_then_exit, reason: structural_fragment}
333
+ - {from: structural_config, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
334
+ - {from: structural_config, input: eof, to: rejected, action: reject, reason: structural_fragment}
335
+ - {from: terminated, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
336
+ - {from: rejected, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
337
+ fallback_transitions:
338
+ outside: {from: outside, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
339
+ cue: {from: cue, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
340
+ inline_meaning: {from: inline_meaning, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
341
+ continuation: {from: continuation, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
342
+ structural_config: {from: structural_config, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
343
+ terminated: {from: terminated, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
344
+ rejected: {from: rejected, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
345
+ reasons:
346
+ unsupported_transition: unsupported_transition
347
+ structural_fragment: structural_fragment
348
+ empty_meaning: empty_meaning
349
+ meaning_bound_exceeded: meaning_bound_exceeded
350
+ ambiguous_reference: ambiguous_reference
351
+ conflicting_meaning: conflicting_meaning
352
+ invalid_exit_boundary: invalid_exit_boundary
353
+ exclusions:
354
+ - examples
355
+ - mere_mentions
356
+ - direct_or_indirect_questions
357
+ - negations
358
+ - hypotheticals_conditionals
359
+ - future_language
360
+ - deterministic_sarcasm_markers
361
+ - quotations_attributed_to_others
362
+ - retractions_or_replacements_bound_to_the_same_term
363
+ - project_qualified_scope
364
+ - malformed_empty_or_oversized_spans
365
+ - incomplete_or_invalid_source_provenance
366
+ provenance:
367
+ required_source_fields:
368
+ - source_id
369
+ - evidence_anchor
370
+ - source_kind
371
+ - signal_type
372
+ - origin_id
373
+ - content_fingerprint
374
+ - author_class
375
+ - session_id
376
+ - project_id
377
+ allowed_source_kinds: [conversation_turn]
378
+ identity_fields_must_match_full_record: true
379
+ user_author_class: user
380
+ unresolved_or_invalid: stable_provenance_abstention
381
+ term_identity:
382
+ equality:
383
+ runtime: packages/cli/src/registries/glossaryTermIdentity.ts#unicodeCaselessExact
384
+ semantics: unicode_caseless_exact_no_normalization
385
+ rule: >-
386
+ Equality remains the existing locale-independent ECMAScript Unicode
387
+ caseless-exact matcher. Canonical, compatibility, accent, and locale
388
+ normalization are not added to equality.
389
+ stable_term_identity:
390
+ schema_version: agentera.personalGlossaryTermIdentity.v1
391
+ runtime: packages/cli/src/registries/glossaryTermIdentity.ts#stableGlossaryTermIdentity
392
+ algorithm: sha256
393
+ encoding: lowercase_hex
394
+ canonical_input: ecmascript_simple_case_fold_key
395
+ no_unicode_normalization: true
396
+ key_rule: >-
397
+ For each Unicode scalar, use its one-scalar locale-independent lowercase
398
+ mapping. Also derive the lowercase mapping of its one-scalar uppercase
399
+ mapping, but use that alternate only when unicodeCaselessExact confirms
400
+ the original scalar and alternate are equal. Concatenate those selected
401
+ scalars without normalization, then hash the resulting UTF-8 key with the
402
+ versioned schema name. This follows the exact matcher, including keeping
403
+ ASCII I and dotless ı distinct.
404
+ invariant: >-
405
+ Stable identity is an identifier for the existing equality class, not a
406
+ new comparison rule. It never lowercases, normalizes, trims, or changes
407
+ the term stored in a shared entry.
408
+ candidate_revision:
409
+ schema_version: agentera.personalGlossaryCandidateRevision.v1
410
+ runtime: packages/cli/src/registries/glossaryTermIdentity.ts#glossaryCandidateRevision
411
+ algorithm: sha256
412
+ encoding: lowercase_hex
413
+ canonicalization: >-
414
+ Hash canonical UTF-8 JSON with recursively code-point-sorted object keys,
415
+ preserved string bytes, and evidence records sorted by their canonical
416
+ JSON. The schema name, stable_term_identity, meaning, scope, complete
417
+ evidence identity set, policy_version, and generation are all included.
418
+ No field may be omitted, reordered semantically, normalized, or replaced
419
+ by a display label.
420
+ bound_fields:
421
+ - stable_term_identity
422
+ - meaning
423
+ - scope
424
+ - evidence
425
+ - policy_version
426
+ - generation
427
+ policy_version: agentera.personalGlossaryMiningPolicy.v1
428
+ generation: content_addressed_candidate_projection_generation
429
+ evidence: complete_source_id_anchor_identity_set
430
+ replay_rule: >-
431
+ A changed meaning, scope, evidence identity set, policy version, or
432
+ candidate generation creates a new revision. Identical canonical inputs
433
+ create the same revision and do not imply a second candidate.
434
+ provenance:
435
+ existing_inferred_variant: provenance_variants.personal_inferred_usage
436
+ conversation_variant: provenance_variants.personal_inferred_conversation
437
+ evolution:
438
+ status: explicit_append_only_extension
439
+ shared_primitive: unchanged
440
+ existing_variant_rule: >-
441
+ The firm two-independent-record instruction/configuration route remains
442
+ exactly two records with both anchors exposed.
443
+ conversation_rule: >-
444
+ Conversation inference uses the explicit conversation provenance variant
445
+ and retains every qualifying evidence record. It never projects a longer
446
+ evidence set into the two-record variant.
447
+ audit_rule: >-
448
+ The provenance kind, complete-evidence marker, source identities, anchors,
449
+ session identities, project identities, author class, and content
450
+ fingerprints remain inspectable by the later validator. Missing metadata,
451
+ unresolved anchors, or incomplete evidence fail closed.
452
+ consent_lifecycle:
453
+ authority: references/analysis/evidence-tier-authority.yaml
454
+ operation: Profile_Full
455
+ policy: reuse_existing_generation
456
+ refresh: forbidden_during_profile_full
457
+ reuse: >-
458
+ Profile Full may consume one existing local-history generation only when a
459
+ valid local-history consent binding and a readable current generation are
460
+ already present. Profile Full never refreshes, discovers, or rereads local
461
+ history to obtain consent.
462
+ discriminator:
463
+ inputs: [consent_status, generation_status, coverage_status, signal_tier_bounded]
464
+ order: [absent, stale, degraded, present]
465
+ values:
466
+ consent_status: [absent, valid, stale]
467
+ generation_status: [absent, current, stale]
468
+ coverage_status: [complete, cap_selected, truncated, flagged_incomplete]
469
+ signal_tier_bounded: [true, false]
470
+ predicates:
471
+ absent: consent_absent_or_generation_absent
472
+ stale: after_absent_consent_or_generation_stale
473
+ degraded: valid_current_actual_cap_truncation_or_flagged_incomplete
474
+ present: valid_current_complete_any_boundedness
475
+ exclusivity: >-
476
+ Evaluate the ordered predicates exactly once and select the first match.
477
+ Absent wins over stale, stale wins over degraded, and degraded wins over
478
+ present. No input tuple may select two states.
479
+ boundedness_rule: >-
480
+ A signal tier being inherently bounded does not make a generation
481
+ degraded. Degraded requires actual cap selection, truncation, or flagged
482
+ incomplete coverage.
483
+ states:
484
+ present:
485
+ condition: valid_current_complete_any_boundedness
486
+ action: reuse_generation_once_for_bounded_mining
487
+ result: mining_authorized
488
+ absent:
489
+ condition: consent_absent_or_generation_absent
490
+ action: skip_mining_without_read_or_refresh
491
+ result: degraded_consent_required
492
+ stale:
493
+ condition: after_absent_consent_or_generation_stale
494
+ action: reject_generation_for_new_mining_and_preserve_existing_entries
495
+ result: degraded_refresh_required
496
+ degraded:
497
+ condition: valid_current_actual_cap_truncation_or_flagged_incomplete
498
+ action: reuse_only_as_degraded_evidence_without_automatic_admission
499
+ result: degraded_coverage
500
+ recovery:
501
+ command: npx -y agentera@next report refresh --consent local-history
502
+ explicit_consent: required
503
+ after_refresh: retry_profile_full_with_the_new_generation
504
+ forbidden: [live_extraction_without_consent, silent_refresh, stale_generation_reuse]
505
+ rule: >-
506
+ Absent, stale, and degraded states expose the same explicit refresh
507
+ recovery without inspecting raw history. Recovery never changes project
508
+ state or project glossary publication.
509
+ profile_full:
510
+ status: active
511
+ entrypoint: Profile_Full
512
+ base_profile_order: write_base_profile_before_personal_glossary
513
+ existing_generation:
514
+ source: existing_consent_bound_user_local_candidate_projection
515
+ generation_count: 1
516
+ binding_fields: [generation, policy_version, candidate_projection_sha256]
517
+ list_limit: 20
518
+ continuation: forbidden
519
+ degraded: explicit_refresh_required_without_candidate_classification_or_publication
520
+ forbidden_effects:
521
+ - history_refresh
522
+ - history_collection
523
+ - candidate_discovery
524
+ - candidate_projection_write
525
+ - new_generation
526
+ - project_glossary_read
527
+ unavailable: preserve_base_profile_and_owned_section
528
+ deterministic_admission:
529
+ host_classification: semantic_evidence_not_admission_authority
530
+ command: candidate_contracts.layers.cli_decision
531
+ automatic: explicit_current_authorized_only
532
+ inferred: review_or_abstain
533
+ review:
534
+ queue_before_question: true
535
+ question_channel_maximum: 3
536
+ no_question_channel: durable_queue
537
+ output: bounded_review_cards_and_summary
538
+ publication:
539
+ command: ownership_contracts.personal.profile_output
540
+ automatic: explicit_current_authorized_only
541
+ no_decision_synthesis: true
542
+ failure: preserve_base_profile_and_owned_section
543
+ output:
544
+ profile_path: canonical_user_profile_authority
545
+ terminal: compact_bounded_summary
546
+ privacy:
547
+ owner: current_user
548
+ scope: user_local
549
+ storage:
550
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
551
+ project_storage: forbidden
552
+ records: [candidate_metadata, safe_excerpts, review_metadata, review_dispositions]
553
+ project_state: unchanged
554
+ filesystem:
555
+ authority: host_filesystem
556
+ configured_path: use_as_provided
557
+ outcomes: ordinary_permissions_and_io
558
+ same_user_path_manipulation: outside_agentera_threat_model
559
+ symlink_confinement: not_claimed
560
+ malformed_candidate_projection_replacement_exception:
561
+ scope: malformed_candidate_projection_replacement_only
562
+ authorization: explicit_consented_refresh_only
563
+ precondition: existing_owned_regular_file_is_malformed
564
+ target: exact_configured_candidate_projection_file
565
+ inspection: lstat_exact_target_without_following_symlinks
566
+ required_type: regular_file
567
+ reject: [symlink, non_regular_file, configured_path_mismatch, path_escape]
568
+ operation: atomic_regular_file_replacement
569
+ outside_scope: configured_path_use_as_provided
570
+ rule: >-
571
+ Agentera uses the configured profile path as provided. The host
572
+ filesystem owns permissions, symlink behavior, and same-user path
573
+ manipulation. Agentera does not add realpath or no-follow confinement
574
+ except when an explicit consented refresh replaces its malformed
575
+ candidate projection. That operation inspects only the exact configured
576
+ target without following a final symlink, requires a regular file, and
577
+ rejects symlinks, non-files, target mismatches, and path escapes. All
578
+ other operations keep the configured-path behavior above.
579
+ rule: >-
580
+ Agentera deliberately selects only the configured user profile path for
581
+ mining records. It never selects .agentera, TODO.md, progress, the
582
+ project glossary, or another project path as projection storage. A user
583
+ configuration or same-user filesystem change does not become an
584
+ Agentera path-confinement claim.
585
+ content_exclusion:
586
+ owner: glossary_content_policy
587
+ classification: actual_secret_or_sensitive_value
588
+ conceptual_terminology: eligible
589
+ candidate_fields: [term, meaning]
590
+ candidate_action: reject_before_projection
591
+ candidate_reason: secret_content
592
+ excerpt_action: omit_complete_excerpt_before_projection
593
+ secret_classes:
594
+ - api_keys
595
+ - access_tokens
596
+ - passwords
597
+ - cookies
598
+ - private_keys
599
+ - authorization_headers
600
+ - personal_contact_data
601
+ - session_identifiers
602
+ - runtime_store_paths
603
+ rule: >-
604
+ A term or meaning containing an actual credential, session, or other
605
+ sensitive value is not a glossary candidate and is rejected with the
606
+ stable secret_content reason. Field names and ordinary conceptual
607
+ terminology remain eligible. If candidate-adjacent context contains an
608
+ actual secret or sensitive value, omit the complete excerpt. Never redact
609
+ and retain part of that excerpt.
610
+ excerpts:
611
+ purpose: bounded_review_context_only
612
+ max_utf8_bytes: 500
613
+ forbidden_content:
614
+ - raw_transcript
615
+ - raw_tool_arguments
616
+ - raw_runtime_store_paths
617
+ - raw_session_identifiers
618
+ - secret_or_sensitive_content
619
+ - unrelated_conversation
620
+ failure: omit_complete_excerpt_before_persistence
621
+ reviews:
622
+ owner: current_user
623
+ required_fields:
624
+ - candidate_id
625
+ - candidate_revision
626
+ - semantic_fingerprint
627
+ - generation
628
+ - policy_version
629
+ - disposition
630
+ - disposed_at
631
+ dispositions: [accept, correct, reject, defer]
632
+ trusted_disposition_authority: current_user
633
+ authentication:
634
+ receipt_schema_version: agentera.personalGlossaryReviewApproval.v1
635
+ issuer: agentera-local-host
636
+ subject: current_user
637
+ trusted_channel: agentera-local-host-ipc
638
+ required_fields:
639
+ - schema_version
640
+ - issuer
641
+ - subject
642
+ - trusted_channel
643
+ - review_id
644
+ - candidate_id
645
+ - candidate_revision
646
+ - candidate_projection_sha256
647
+ - semantic_fingerprint
648
+ - generation
649
+ - policy_version
650
+ - disposition
651
+ - corrected_meaning
652
+ - corrected_scope
653
+ - disposed_at
654
+ - expires_at
655
+ - nonce
656
+ - signature
657
+ proof: >-
658
+ The local host signs an explicit current-user action. The verifier
659
+ checks the trusted host public key before accepting the receipt; a
660
+ model, agent, imported transcript, or unbound text field cannot create
661
+ proof by asserting issuer or subject values.
662
+ binding_fields: [review_id, candidate_id, candidate_revision, candidate_projection_sha256, semantic_fingerprint, generation, policy_version, disposition, corrected_meaning, corrected_scope, disposed_at]
663
+ forbidden_principals: [agent, model, imported_record, generic_consent]
664
+ correction:
665
+ correct_fields: [corrected_meaning, corrected_scope]
666
+ non_correct_values: null
667
+ corrected_scope_values: [personal]
668
+ corrected_meaning_max_utf8_bytes: 4096
669
+ rule: >-
670
+ Only a signed correct action may carry a complete bounded corrected
671
+ meaning and the personal scope. Other dispositions carry null correction
672
+ fields. Corrected content remains user-local review metadata and must
673
+ pass the same secret and sensitive-content exclusion as a candidate.
674
+ signature:
675
+ algorithm: ed25519
676
+ encoding: base64url
677
+ key_source: user_local_trusted_host_key
678
+ signed_fields:
679
+ - schema_version
680
+ - issuer
681
+ - subject
682
+ - trusted_channel
683
+ - review_id
684
+ - candidate_id
685
+ - candidate_revision
686
+ - candidate_projection_sha256
687
+ - semantic_fingerprint
688
+ - generation
689
+ - policy_version
690
+ - disposition
691
+ - corrected_meaning
692
+ - corrected_scope
693
+ - disposed_at
694
+ - expires_at
695
+ - nonce
696
+ verification: trusted_host_public_key_signature_check
697
+ freshness:
698
+ max_age_seconds: 300
699
+ disposed_at: trusted_host_clock
700
+ expires_at_required: true
701
+ rule: disposed_at_must_not_be_future_and_expires_at_must_be_after_now
702
+ replay:
703
+ nonce: required_unique_receipt_nonce
704
+ index: user_local_consumed_receipt_digest_index
705
+ exact_replay: no_op_only_when_nonce_and_receipt_digest_match
706
+ conflicting_replay: reject_reused_nonce_with_changed_bindings_or_signature
707
+ terminal_disposition:
708
+ terminal: [accept, correct, reject]
709
+ pending: [defer]
710
+ retention:
711
+ pending_excerpt_days: 30
712
+ terminal_excerpt_days: 0
713
+ review_metadata_days_after_terminal: 90
714
+ accepted_entry: ownership_contracts.personal.retention_and_decay
715
+ pending_review_metadata: retained_until_terminal_or_purge
716
+ terminal_review_metadata: retained_for_90_days_after_disposition
717
+ rule: >-
718
+ Safe excerpts expire after 30 days and are removed immediately when a
719
+ review becomes terminal. Disposition metadata remains for 90 days after
720
+ a terminal disposition to suppress the same revision, then expires.
721
+ Accepted glossary entries follow the existing personal profile decay
722
+ authority and never retain an excerpt.
723
+ purge:
724
+ authority: current_user
725
+ trigger: explicit_authenticated_user_request_or_retention_expiry
726
+ removes: [candidate_metadata, safe_excerpts, review_metadata, review_dispositions]
727
+ behavior: atomic_remove_user_local_records_before_next_read
728
+ project_state: untouched
729
+ profile_entry: not_implicitly_deleted
730
+ boundaries:
731
+ pending: purge_removes_excerpt_and_metadata_immediately
732
+ terminal: purge_removes_excerpt_and_metadata_before_next_read
733
+ accepted_profile_entry: purge_does_not_implicitly_delete_profile_entry
734
+ recovery: >-
735
+ A purge is local and irreversible to the mining records. A later run
736
+ requires fresh consent-bound evidence and creates no project-side record.
737
+ candidate_projection:
738
+ status: active
739
+ runtime: packages/cli/src/analytics/personalGlossaryCandidateProjection.ts#projectPersonalGlossaryCandidates
740
+ schema_version: agentera.personalGlossaryCandidateProjection.v1
741
+ owner: deterministic_discovery_projection
742
+ input: validated_completed_explicit_and_recurring_capsules_with_transient_source_project_ids_and_candidate_adjacent_excerpts
743
+ output: bounded_user_local_candidate_projection_with_safe_excerpts_and_selection_report
744
+ implementation_boundary: >-
745
+ This runtime selects and persists only bounded candidate metadata and safe
746
+ review context. Candidate retrieval is the separate private
747
+ candidate_retrieval operation. It does not add project or public-state
748
+ candidate reads, host classification, CLI admission, review-disposition
749
+ writes, profile publication, project-glossary access, or project-state
750
+ effects.
751
+ refresh_production:
752
+ status: active
753
+ runtime: packages/cli/src/analytics/personalGlossaryRefreshProjection.ts#produceCurrentPersonalGlossaryProjection
754
+ trigger: explicit_consented_evidence_refresh_success
755
+ projection:
756
+ count: exactly_one
757
+ generation_binding: exact_published_evidence_generation
758
+ policy_binding: exact_personal_mining_policy_version
759
+ concurrency:
760
+ serialization: profile_local_exclusive_refresh_commit
761
+ lock_lifetime: before_evidence_publication_through_projection_binding_verification
762
+ ownership:
763
+ record: exact_regular_file_with_pid_random_token_and_creation_time
764
+ publication: prewritten_record_hard_linked_to_exclusive_canonical_path
765
+ inspection: no_follow_regular_file_with_stable_filesystem_identity
766
+ liveness: only_esrch_proves_owner_death
767
+ pid_reuse: live_or_indeterminate_pid_fails_closed
768
+ reclaim: one_exclusive_identity_checked_claim_replaces_only_a_proven_dead_owner
769
+ release: matching_token_record_and_filesystem_identity_only
770
+ unsafe: [malformed, foreign, symlink, non_file, changed_identity, indeterminate_owner]
771
+ recovery: inspect_exact_profile_local_lock_and_remove_only_after_verifying_no_refresh_owns_it_then_rerun_consented_refresh
772
+ contender:
773
+ refresh_outcome: failure
774
+ process_exit: nonzero
775
+ local_history_read: false
776
+ tier_write: false
777
+ projection_status: failed
778
+ projection_write: false
779
+ evidence_status: current_generation_remains_readable
780
+ recovery: npx -y agentera@next report refresh --consent local-history
781
+ partial_failure:
782
+ refresh_outcome: failure
783
+ process_exit: nonzero
784
+ evidence_status: published
785
+ projection_status: failed
786
+ tier_write_reporting: evidence_published_projection_not_written
787
+ current_generation: published_evidence_remains_current
788
+ safe_replacement:
789
+ authorization: explicit_consented_refresh_only
790
+ target: exact_configured_candidate_projection_file
791
+ precondition: existing_owned_regular_file_is_malformed
792
+ operation: atomic_regular_file_replacement
793
+ reject: [symlink, non_regular_file, configured_path_mismatch, path_escape]
794
+ filesystem_exception: personal_mining_authority.privacy.storage.filesystem.malformed_candidate_projection_replacement_exception
795
+ replaceable_state: [candidate_projection]
796
+ preserved_state:
797
+ - current_evidence_generation
798
+ - review_records
799
+ - personal_profile
800
+ - project_state
801
+ - project_glossary
802
+ rule: >-
803
+ A successful consented evidence refresh requires one projection bound to
804
+ that exact published generation and mining policy. Projection failure is
805
+ a nonzero refresh result but does not roll back the published evidence.
806
+ Authorized refreshes serialize evidence and projection commit; a
807
+ contender fails without reading history or writing evidence or projection.
808
+ The documented consented refresh reclaims a valid orphan only after owner
809
+ death is proven. Unknown ownership fails closed, and release removes only
810
+ the caller's unchanged token and filesystem identity.
811
+ A retry may replace only the exact configured owned regular projection
812
+ file; it rejects symlinks, non-files, path mismatches, and path escapes.
813
+ The refresh runtime mines and publishes this projection after evidence
814
+ publication succeeds.
815
+ selection:
816
+ candidates_max: 50
817
+ project_ids_max_per_candidate: 100
818
+ source_families:
819
+ explicit: [personal_explicit_definition]
820
+ recurring: [personal_inferred_usage, personal_inferred_conversation]
821
+ algorithm: least_retained_source_family_then_project_then_canonical_candidate
822
+ tie_break: candidate_id_then_candidate_revision_then_capsule_sha256
823
+ project_identity:
824
+ schema_version: agentera.personalGlossaryProjectionProjectIdentity.v1
825
+ algorithm: sha256
826
+ input: canonical_utf8_json_of_exact_transient_project_id
827
+ output: lowercase_hex
828
+ rule: >-
829
+ Projection-only project labels are used transiently to allocate
830
+ diversity. Persisted allocation fields and reports contain only this
831
+ exact-byte, no-normalization project identity. The validated capsule
832
+ keeps its separately authority-required provenance unchanged.
833
+ coverage: >-
834
+ Each selection round prefers the represented source family with the
835
+ fewest retained candidates, then the candidate whose represented project
836
+ has the fewest retained candidates. A capped or uncovered family or
837
+ project reports degraded coverage with retained and dropped counts.
838
+ mining_summary:
839
+ schema_version: agentera.personalGlossaryMiningSummary.v1
840
+ location: report.mining_summary
841
+ family_fields: [candidate_count, abstention_count, abstentions_by_reason]
842
+ explicit_abstention_keys:
843
+ - attributed_quotation
844
+ - ambiguous_reference
845
+ - conflicting_meaning
846
+ - empty_meaning
847
+ - empty_term
848
+ - example_context
849
+ - hypothetical_definition
850
+ - malformed_span
851
+ - meaning_bound_exceeded
852
+ - negated_definition
853
+ - indirect_question
854
+ - future_definition
855
+ - project_only_scope
856
+ - question_definition
857
+ - retracted_definition
858
+ - sarcasm_marker
859
+ - stale_anchor
860
+ - structural_fragment
861
+ - term_bound_exceeded
862
+ - unsafe_syntax
863
+ - uncertain_scope
864
+ - unresolved_anchor
865
+ - provenance_incomplete
866
+ - user_authorship_required
867
+ recurring_abstention_keys:
868
+ - agent_only_evidence
869
+ - copied_content
870
+ - provenance_missing
871
+ - insufficient_independent_origins
872
+ - insufficient_projects
873
+ - insufficient_sessions
874
+ - conversation_evidence_incomplete
875
+ - conversation_evidence_bound_exceeded
876
+ - project_only_scope
877
+ - noise_term
878
+ - too_many_qualifying_origins
879
+ - user_authorship_required
880
+ reconciliation:
881
+ fixed_keys: all_keys_present_as_nonnegative_integers
882
+ family_abstentions: abstention_count_equals_sum_of_reason_counts
883
+ total_candidates: total_equals_explicit_plus_recurring_candidate_counts
884
+ total_abstentions: total_equals_explicit_plus_recurring_abstention_counts
885
+ projection_input: report_input_count_equals_total_candidate_count
886
+ forbidden_content:
887
+ - terms
888
+ - source_ids
889
+ - evidence_anchors
890
+ - project_ids
891
+ - project_keys
892
+ - paths
893
+ - excerpts
894
+ rule: >-
895
+ Persist the fixed explicit and recurring keys even when their count is
896
+ zero. Reconcile family and total counts before publication. This summary
897
+ contains counts only and never retains candidate, source, project, path,
898
+ anchor, or content identity.
899
+ excerpts:
900
+ source_max_utf8_bytes: 4096
901
+ max_per_candidate: 1
902
+ authority: personal_mining_authority.privacy.excerpts
903
+ input_rule: candidate_adjacent_text_must_contain_the_exact_candidate_term
904
+ output_fields: [text, expires_at, redacted]
905
+ compatibility:
906
+ redacted_field: retained_for_v1_consumers
907
+ new_projection_value: false
908
+ omission_reasons: [no_excerpt, unrelated_context, source_bound_exceeded, unsafe_tool_arguments, unsafe_content]
909
+ rule: >-
910
+ Sort transient excerpts canonically, retain at most one complete safe
911
+ excerpt, and omit secret-bearing, sensitive, unsafe, or unrelated text
912
+ without echoing it. The v1 redacted field remains for schema compatibility,
913
+ but new projections set it to false and never persist partial redactions.
914
+ retention:
915
+ authority: personal_mining_authority.privacy.retention
916
+ purge: personal_mining_authority.privacy.purge
917
+ rule: >-
918
+ Pending candidate excerpts expire after the authority's thirty-day
919
+ period. Retention maintenance may remove only expired safe excerpts;
920
+ a current-user-authorized purge removes the complete user-local
921
+ projection before the next read. Review-disposition persistence remains
922
+ outside this runtime.
923
+ persistence:
924
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
925
+ file: candidate-projection.json
926
+ canonicalization: candidate_contracts.canonicalization
927
+ fields: [schema_version, owner, generation, policy_version, retained_at, candidates, report, projection_sha256]
928
+ replay: byte_identical_projection_is_unchanged_replay
929
+ project_storage: forbidden
930
+ public_reads: forbidden
931
+ private_machine_reads: [candidate_retrieval, cli_decision]
932
+ review_disposition_writes: forbidden
933
+ rule: >-
934
+ Write one private canonical projection file at the configured user
935
+ profile path using ordinary filesystem I/O. The file contains validated
936
+ capsules, hashed project identities, safe excerpts, and a bounded report
937
+ only. Never serialize a raw project path, .agentera state, raw excerpt
938
+ source, or review disposition, and never deliberately select project
939
+ storage.
940
+ candidate_retrieval:
941
+ status: active
942
+ owner: private_user_local_candidate_retrieval
943
+ runtime: packages/cli/src/cli/commands/personalGlossaryCandidateReads.ts#runPersonalGlossaryCandidateReadsCommand
944
+ input: current_validated_user_local_candidate_projection_bound_to_current_tier_generation
945
+ current_generation:
946
+ source: current.json_readable_bounded_evidence_tier_generation
947
+ projection_generation: exact_match_required
948
+ unavailable_behavior: current_generation_unavailable
949
+ stale_projection_behavior: projection_stale
950
+ command:
951
+ canonical: npx -y agentera@next report personal-glossary-candidates
952
+ namespace: report
953
+ format: json
954
+ project_checkout: not_required
955
+ list:
956
+ schema_version: agentera.personalGlossaryCandidateRetrieval.v1
957
+ default_limit: 20
958
+ maximum_limit: 50
959
+ max_serialized_utf8_bytes: 32768
960
+ order: candidate_id_then_candidate_revision_then_capsule_sha256
961
+ projection_binding_field: candidate_projection_sha256
962
+ filters:
963
+ source_family: [explicit, recurring]
964
+ provenance_kind_from: candidate_projection.selection.source_families
965
+ scope: [personal, ambiguous]
966
+ cursor:
967
+ authority: references/artifacts/state-storage-authority.yaml#entity_target.public_retrieval.policy.cursor
968
+ vocabulary: opaque_snapshot_cursor
969
+ binding: [collection, generation, policy_version, filters, limit, order, snapshot]
970
+ invalid_behavior: cursor_invalid
971
+ unavailable_behavior: cursor_snapshot_unavailable
972
+ summaries: >-
973
+ List returns only bounded candidate summaries, projection-local selection
974
+ abstention counts, derived safe-context availability and omission or
975
+ expiry counts, and the current coverage report. It never returns a
976
+ meaning, project label, project key, raw evidence identity, excerpt text,
977
+ or a per-row expanded command.
978
+ abstentions: >-
979
+ The projection retains only the reconciled fixed-key aggregate mining
980
+ summary from candidate_projection.mining_summary. It never retains or
981
+ reconstructs individual upstream abstentions. Reads may return those
982
+ counts with projection-local selection and safe-context omission counts.
983
+ coverage: >-
984
+ Coverage remains the validated current projection report and is not
985
+ recomputed from a list filter or page.
986
+ safe_context_view:
987
+ authority: personal_mining_authority.privacy.retention
988
+ retention_days: 30
989
+ expiry: expires_at_lte_read_time_is_unavailable
990
+ mutation: forbidden
991
+ snapshot: effective_availability_bound_to_opaque_cursor_snapshot
992
+ rule: >-
993
+ Candidate retrieval derives current safe-context availability from the
994
+ persisted projection at read time. An excerpt at or after its expiry is
995
+ omitted from list and exact output without writing the projection. The
996
+ derived availability contributes to the opaque cursor snapshot, so a
997
+ continuation from a prior availability view is unavailable.
998
+ exact:
999
+ schema_version: agentera.personalGlossaryCandidateRetrieval.v1
1000
+ required_bindings: [candidate_id, candidate_revision, generation, policy_version]
1001
+ projection_binding_field: candidate_projection_sha256
1002
+ occurrences_max: 100
1003
+ safe_context_max_utf8_bytes: 500
1004
+ max_serialized_utf8_bytes: 32768
1005
+ occurrence:
1006
+ schema_version: agentera.personalGlossaryCandidateOccurrence.v1
1007
+ identity: opaque_sha256_of_validated_evidence_and_candidate_binding
1008
+ allowed_fields: [occurrence_id, source_kind, signal_type, author_class]
1009
+ rule: >-
1010
+ Exact read first validates the readable current tier generation, the
1011
+ projection's exact generation binding, and every requested candidate
1012
+ binding. It returns only the bounded validated occurrence
1013
+ projection, its candidate_projection_sha256 binding, and a currently
1014
+ available validated safe excerpt context.
1015
+ Raw source, anchor, session, project, fingerprint, project-key, and
1016
+ filesystem values are never emitted.
1017
+ rule: >-
1018
+ Candidate retrieval is read-only, non-interactive, and user-local. It never
1019
+ refreshes or purges evidence, acquires consent, records review state, reads
1020
+ a project glossary, selects project storage, or changes the persisted
1021
+ projection. It derives an expiry-aware safe-context read view, reuses the
1022
+ canonical opaque snapshot cursor construction, and fails closed before
1023
+ emitting candidate data when the current generation is unavailable, the
1024
+ projection is stale, or a continuation or exact binding is malformed,
1025
+ unavailable, or mismatched.
1026
+ review_records:
1027
+ status: active
1028
+ owner: user_local_review_lifecycle
1029
+ runtime: packages/cli/src/analytics/personalGlossaryReviewRecords.ts#queuePersonalGlossaryReviewRecord
1030
+ input: current_validated_review_required_cli_decision_and_host_receipt
1031
+ trusted_host_key:
1032
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
1033
+ file: trusted-local-host.json
1034
+ schema_version: agentera.personalGlossaryTrustedLocalHost.v1
1035
+ fields: [schema_version, owner, subject, public_key_spki_base64url]
1036
+ owner: current_user
1037
+ public_key_algorithm: ed25519
1038
+ max_serialized_utf8_bytes: 4096
1039
+ rule: >-
1040
+ The configured user-local host key names the current-user subject and one
1041
+ Ed25519 SPKI public key. It is read only to verify a local-host IPC receipt;
1042
+ it is never accepted from command input, project state, agent text, or output.
1043
+ persistence:
1044
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
1045
+ file: review-records.json
1046
+ schema_version: agentera.personalGlossaryReviewStore.v2
1047
+ record_schema_version: agentera.personalGlossaryReviewRecord.v2
1048
+ owner: current_user
1049
+ fields: [schema_version, owner, records, replay_index, store_sha256]
1050
+ record_fields:
1051
+ - schema_version
1052
+ - owner
1053
+ - review_id
1054
+ - candidate_id
1055
+ - candidate_revision
1056
+ - candidate_capsule_sha256
1057
+ - candidate_projection_sha256
1058
+ - host_receipt_sha256
1059
+ - cli_decision_sha256
1060
+ - semantic_fingerprint
1061
+ - generation
1062
+ - policy_version
1063
+ - scope
1064
+ - reason
1065
+ - status
1066
+ - disposition
1067
+ - review_record
1068
+ - reopen_reason
1069
+ - queued_at
1070
+ - terminal_at
1071
+ - expires_at
1072
+ - record_sha256
1073
+ records_max: 100
1074
+ replay_index_fields: [nonce_sha256, receipt_sha256, expires_at]
1075
+ replay_entries_max: 100
1076
+ record_max_serialized_utf8_bytes: 8192
1077
+ max_serialized_utf8_bytes: 1048576
1078
+ canonicalization: candidate_contracts.canonicalization
1079
+ order: review_id_asc
1080
+ replay: exact_current_binding_is_unchanged_replay_and_exact_receipt_is_idempotent
1081
+ conflict: changed_receipt_nonce_binding_or_signature_fails_before_effects
1082
+ suppression_binding: [candidate_id, semantic_fingerprint, scope, policy_version]
1083
+ suppression_dispositions: [reject, defer]
1084
+ reopen_reasons: [policy_changed, scope_changed, meaning_changed]
1085
+ project_storage: forbidden
1086
+ forbidden_fields:
1087
+ - term
1088
+ - meaning
1089
+ - excerpt
1090
+ - raw_evidence
1091
+ - source_id
1092
+ - evidence_anchor
1093
+ - session_id
1094
+ - project_id
1095
+ - source_path
1096
+ - tool_content
1097
+ - review_approval
1098
+ - signature
1099
+ - nonce
1100
+ rule: >-
1101
+ Persist only bounded current-user review metadata. Generation and policy
1102
+ bindings must be non-secret, non-path metadata identifiers; the current
1103
+ content-addressed tier generation is an allowed opaque digest. A record contains
1104
+ opaque candidate and receipt bindings, a safe scope, deterministic review
1105
+ reason, lifecycle status, disposition, optional canonical review record,
1106
+ visible reopening reason, and canonical digests. Only a correct canonical
1107
+ review record may retain its authority-approved corrected meaning. It never
1108
+ persists a term, excerpt, raw evidence identity, host proof, profile content,
1109
+ project identity, path, or tool content. The bounded replay index stores only
1110
+ nonce and receipt digests until receipt expiry. Exact current queue replay or
1111
+ exact receipt replay is idempotent; changed nonce content fails before a write.
1112
+ compatibility:
1113
+ accepted_store_schema_versions:
1114
+ - agentera.personalGlossaryReviewStore.v1
1115
+ - agentera.personalGlossaryReviewStore.v2
1116
+ accepted_record_schema_versions:
1117
+ - agentera.personalGlossaryPendingReviewRecord.v1
1118
+ - agentera.personalGlossaryReviewRecord.v2
1119
+ read_mutation: forbidden
1120
+ migration_operation: disposition_only
1121
+ scope_derivation: current_validated_host_receipt_only
1122
+ invalid_behavior: fail_before_effects
1123
+ preserved_bindings:
1124
+ - review_id
1125
+ - candidate_id
1126
+ - candidate_revision
1127
+ - candidate_capsule_sha256
1128
+ - candidate_projection_sha256
1129
+ - host_receipt_sha256
1130
+ - cli_decision_sha256
1131
+ - semantic_fingerprint
1132
+ - generation
1133
+ - policy_version
1134
+ - reason
1135
+ legacy_digest: validate_before_migration
1136
+ migrated_digest: reseal_v2_lifecycle_record
1137
+ rule: >-
1138
+ Canonical v1 pending review stores remain readable without a write. Only
1139
+ disposition may compat-decode one valid v1 record after it revalidates the
1140
+ current receipt and projection. It derives the missing scope only from that
1141
+ current validated receipt, preserves the listed immutable bindings and review
1142
+ identity, and atomically writes the v2 store and replay state. Invalid or
1143
+ ambiguous v1 input fails before effects. Untouched valid v1 records remain
1144
+ byte-for-byte v1 records inside the v2 store until their own disposition.
1145
+ queue:
1146
+ command:
1147
+ canonical: npx -y agentera@next report personal-glossary-reviews
1148
+ namespace: report
1149
+ input_flag: --input
1150
+ stdin_value: '-'
1151
+ format: json
1152
+ project_checkout: not_required
1153
+ request:
1154
+ schema_version: agentera.personalGlossaryReviewQueueRequest.v1
1155
+ required_fields: [schema_version, receipt]
1156
+ additional_fields: forbidden
1157
+ max_utf8_bytes: 16384
1158
+ decision_outcome: review_required
1159
+ current_bindings:
1160
+ - candidate_id
1161
+ - candidate_revision
1162
+ - candidate_capsule_sha256
1163
+ - candidate_projection_sha256
1164
+ - host_receipt_sha256
1165
+ - cli_decision_sha256
1166
+ - semantic_fingerprint
1167
+ - generation
1168
+ - policy_version
1169
+ - reason
1170
+ result:
1171
+ schema_version: agentera.personalGlossaryReviewQueueResult.v1
1172
+ statuses: [queued, unchanged_replay, suppressed, reopened]
1173
+ max_utf8_bytes: 4096
1174
+ no_question_channel: queue_without_prompt_or_disposition
1175
+ rule: >-
1176
+ Queue revalidates one bounded host receipt through the current deterministic
1177
+ CLI decision before a write. Only a current review_required decision may
1178
+ create pending metadata. The command does not prompt, accept a disposition,
1179
+ write a profile entry, read or change project state, or mutate the candidate
1180
+ projection.
1181
+ disposition:
1182
+ command:
1183
+ canonical: npx -y agentera@next report personal-glossary-reviews
1184
+ namespace: report
1185
+ input_flag: --input
1186
+ stdin_value: '-'
1187
+ format: json
1188
+ project_checkout: not_required
1189
+ request:
1190
+ schema_version: agentera.personalGlossaryReviewDispositionRequest.v1
1191
+ required_fields: [schema_version, review_id, receipt, approval]
1192
+ additional_fields: forbidden
1193
+ max_utf8_bytes: 16384
1194
+ result:
1195
+ schema_version: agentera.personalGlossaryReviewDispositionResult.v1
1196
+ statuses: [disposed, unchanged_replay]
1197
+ max_utf8_bytes: 4096
1198
+ publication_authorization:
1199
+ dispositions: [accept, correct]
1200
+ fields: [review_id, review_record_sha256]
1201
+ rule: >-
1202
+ Disposition accepts only a current queued review and a complete signed
1203
+ current-user local-host approval. It verifies the configured trusted public
1204
+ key, exact receipt fields and bindings, current clock freshness, replay index,
1205
+ current projection, policy, and semantic fingerprint before a user-local write.
1206
+ Accept and correct create an opaque authorization for the existing personal
1207
+ publish command. Reject and defer never publish. The operation does not read
1208
+ project state, mutate the candidate projection, or change PROFILE.md.
1209
+ retrieval:
1210
+ command:
1211
+ canonical: npx -y agentera@next report personal-glossary-reviews
1212
+ namespace: report
1213
+ format: json
1214
+ project_checkout: not_required
1215
+ owner: current_user
1216
+ schema_version: agentera.personalGlossaryReviewRetrieval.v1
1217
+ list:
1218
+ default_limit: 20
1219
+ maximum_limit: 50
1220
+ max_serialized_utf8_bytes: 32768
1221
+ order: queued_at_desc_then_review_id_asc
1222
+ filters:
1223
+ status: [pending, terminal]
1224
+ cursor:
1225
+ authority: references/artifacts/state-storage-authority.yaml#entity_target.public_retrieval.policy.cursor
1226
+ vocabulary: opaque_snapshot_cursor
1227
+ binding: [collection, owner, filters, limit, order, snapshot]
1228
+ invalid_behavior: cursor_invalid
1229
+ unavailable_behavior: cursor_snapshot_unavailable
1230
+ summaries: >-
1231
+ List returns only opaque identity and binding digests, stable reason,
1232
+ lifecycle status and dates, and bounded current, stale, or expired counts.
1233
+ It never returns candidate content, source identity, user identity, or
1234
+ approval material.
1235
+ exact:
1236
+ required_bindings: [review_id, candidate_id, candidate_revision, generation, policy_version]
1237
+ current_binding_field: candidate_projection_sha256
1238
+ max_serialized_utf8_bytes: 8192
1239
+ rule: >-
1240
+ Exact retrieval validates every selector, including a current
1241
+ content-addressed generation or non-secret, non-path generation and policy
1242
+ metadata bindings, the record digest, the current
1243
+ store owner, and the record's current candidate projection binding before
1244
+ emitting one private metadata record.
1245
+ rule: >-
1246
+ Reads are structured, non-interactive, private to the configured current-user
1247
+ profile, bounded, and mutation-free. They cannot select another owner or
1248
+ return stale, malformed, expired, or owner-mismatched metadata.
1249
+ maintenance:
1250
+ entrypoint: packages/cli/src/analytics/personalGlossaryReviewRecords.ts#maintainPersonalGlossaryReviewRecords
1251
+ exposure: authenticated_review_owner_only
1252
+ terminal_metadata_days: 90
1253
+ pending_metadata: retained_until_terminal_or_purge
1254
+ cache: replay_index_until_receipt_expiry
1255
+ purge: current_user_authorized_review_records_only
1256
+ forbidden_effects:
1257
+ - profile_entry
1258
+ - project_state
1259
+ - candidate_projection
1260
+ - publication
1261
+ rule: >-
1262
+ Separate maintenance removes only expired terminal review metadata and expired
1263
+ replay-index entries, or the complete review-record file after a
1264
+ current-user-authorized purge. It never creates a record during a read and
1265
+ never deletes or changes a profile entry, project state, candidate projection,
1266
+ or publication result.
1267
+ admission:
1268
+ inferred_automatic_admission: disabled
1269
+ inferred_review: allowed
1270
+ quality_threshold: references/analysis/personal-glossary-evaluation-authority.yaml#gates.release_authorizing_gate
1271
+ holdout: references/analysis/personal-glossary-evaluation-authority.yaml#holdout
1272
+ rule: >-
1273
+ The separate evaluation authority defines the frozen holdout, metric
1274
+ thresholds, and fail-closed release gate. Inferred meanings remain
1275
+ review-only, and no measured result enables inferred automatic admission.
1276
+
1277
+ candidate_contracts:
1278
+ schema_version: agentera.personalGlossaryCandidateContracts.v1
1279
+ status: active_partial
1280
+ implementation_boundary: receipt_validation_deterministic_decision_and_explicit_personal_publication_runtime
1281
+ purpose: >-
1282
+ Define five distinct, content-addressed boundaries for one personal glossary
1283
+ candidate. Discovery and projection own evidence, the semantic host owns only
1284
+ bounded classification, the CLI owns deterministic admission validation, the
1285
+ user owns review lifecycle, and one explicit personal publication operation
1286
+ owns the personal publication result. Candidate retrieval alone exposes
1287
+ private reads; personal publication alone changes the owned profile section.
1288
+ Neither replaces shared consumer or project publication contracts.
1289
+ canonicalization:
1290
+ algorithm: sha256
1291
+ encoding: lowercase_hex
1292
+ input: canonical_utf8_json
1293
+ object_keys: unicode_code_point_sorted
1294
+ evidence_records: canonical_json_sorted
1295
+ digest_field_rule: exclude_digest_field_from_body
1296
+ arrays: preserve_declared_order
1297
+ rule: >-
1298
+ Every digest hashes canonical UTF-8 JSON with recursively sorted object keys.
1299
+ Evidence records are sorted by their canonical JSON before capsule creation.
1300
+ A layer digest excludes only its own digest field. Strings are preserved
1301
+ exactly; no Unicode normalization or display-label substitution is allowed.
1302
+ identity:
1303
+ stable_term_identity: personal_mining_authority.term_identity.stable_term_identity
1304
+ candidate_revision: personal_mining_authority.term_identity.candidate_revision
1305
+ rule: >-
1306
+ candidate_id is the settled stable term identity. candidate_revision is
1307
+ produced only by the current revision helper, so meaning, evidence, policy,
1308
+ or generation changes produce a new revision while an unchanged equality
1309
+ class keeps the same stable identity.
1310
+ bounds:
1311
+ term_max_utf8_bytes: 256
1312
+ meaning_max_utf8_bytes: 4096
1313
+ binding_max_utf8_bytes: 256
1314
+ evidence_records_max: 100
1315
+ reason_max_utf8_bytes: 512
1316
+ corrected_meaning_max_utf8_bytes: 4096
1317
+ digest_bytes: 32
1318
+ rule: >-
1319
+ These limits apply before downstream effects. Candidate evidence remains a
1320
+ complete bounded projection, not a preview that can silently omit records.
1321
+ layers:
1322
+ evidence_capsule:
1323
+ owner: deterministic_discovery_projection
1324
+ schema_version: agentera.personalGlossaryCandidateCapsule.v1
1325
+ required_fields:
1326
+ - schema_version
1327
+ - owner
1328
+ - candidate_id
1329
+ - candidate_revision
1330
+ - term
1331
+ - meaning
1332
+ - scope
1333
+ - provenance_kind
1334
+ - evidence
1335
+ - evidence_complete
1336
+ - evidence_set_sha256
1337
+ - policy_version
1338
+ - generation
1339
+ - capsule_sha256
1340
+ additional_fields: forbidden
1341
+ binding_fields: [candidate_id, candidate_revision, generation, policy_version]
1342
+ body_digest: capsule_sha256
1343
+ evidence_owner: deterministic_discovery_projection
1344
+ evidence_source: personal_mining_authority.provenance
1345
+ evidence_required_fields: provenance_variant_required_fields
1346
+ evidence_complete: true
1347
+ forbidden_fields:
1348
+ - admission
1349
+ - decision
1350
+ - review
1351
+ - publication
1352
+ - mutation
1353
+ - trusted_publication_effect
1354
+ rule: >-
1355
+ The capsule contains only the bounded candidate projection and complete
1356
+ qualifying evidence identities. It has no host judgment, admission result,
1357
+ review disposition, or publication effect.
1358
+ host_classification_receipt:
1359
+ owner: semantic_host_classification
1360
+ schema_version: agentera.personalGlossaryHostClassificationReceipt.v1
1361
+ required_fields:
1362
+ - schema_version
1363
+ - owner
1364
+ - candidate_id
1365
+ - candidate_revision
1366
+ - candidate_capsule_sha256
1367
+ - candidate_projection_sha256
1368
+ - generation
1369
+ - policy_version
1370
+ - classification
1371
+ - semantic_fingerprint
1372
+ - receipt_sha256
1373
+ additional_fields: forbidden
1374
+ binding_fields:
1375
+ - candidate_id
1376
+ - candidate_revision
1377
+ - candidate_capsule_sha256
1378
+ - candidate_projection_sha256
1379
+ - generation
1380
+ - policy_version
1381
+ body_digest: receipt_sha256
1382
+ classification:
1383
+ fields: [term, meaning, scope, permanence, consistency, confidence]
1384
+ term: shared_primitive.fields.term
1385
+ meaning: shared_primitive.fields.meaning
1386
+ scope: packages/cli/src/registries/glossaryTermIdentity.ts#GlossaryCandidateScope
1387
+ permanence: shared_primitive.fields.permanence
1388
+ confidence: shared_primitive.fields.confidence
1389
+ consistency_values: [consistent, inconsistent, uncertain]
1390
+ forbidden_fields:
1391
+ - admission
1392
+ - decision
1393
+ - mutation
1394
+ - publication
1395
+ - review_bypass
1396
+ - trusted_publication_effect
1397
+ - project_glossary
1398
+ - project_publication
1399
+ rule: >-
1400
+ The host may classify only term, meaning, scope, permanence, consistency,
1401
+ and confidence. The receipt binds the exact capsule, current projection,
1402
+ revision, generation, and policy. It cannot choose admission, authorize
1403
+ mutation, bypass review, or supply a trusted publication effect.
1404
+ cli_decision:
1405
+ owner: deterministic_cli_admission_validation
1406
+ schema_version: agentera.personalGlossaryAdmissionDecision.v1
1407
+ required_fields:
1408
+ - schema_version
1409
+ - owner
1410
+ - candidate_id
1411
+ - candidate_revision
1412
+ - candidate_capsule_sha256
1413
+ - candidate_projection_sha256
1414
+ - host_receipt_sha256
1415
+ - classification_contract_version
1416
+ - semantic_fingerprint
1417
+ - generation
1418
+ - policy_version
1419
+ - outcome
1420
+ - reason
1421
+ - decision_sha256
1422
+ additional_fields: forbidden
1423
+ binding_fields:
1424
+ - candidate_id
1425
+ - candidate_revision
1426
+ - candidate_capsule_sha256
1427
+ - candidate_projection_sha256
1428
+ - host_receipt_sha256
1429
+ - classification_contract_version
1430
+ - semantic_fingerprint
1431
+ - generation
1432
+ - policy_version
1433
+ body_digest: decision_sha256
1434
+ outcomes: [automatic_admission, review_required, abstain]
1435
+ reason_codes:
1436
+ - explicit_current_authorized
1437
+ - inferred_requires_review
1438
+ - scope_ambiguous
1439
+ - classification_inconsistent
1440
+ - classification_changed
1441
+ - entry_conflict
1442
+ - evidence_retracted_or_conflicted
1443
+ - quality_gate_not_authorizing
1444
+ - scope_project
1445
+ - evidence_unavailable
1446
+ - evidence_changed
1447
+ reason_codes_by_outcome:
1448
+ automatic_admission: [explicit_current_authorized]
1449
+ review_required:
1450
+ - inferred_requires_review
1451
+ - scope_ambiguous
1452
+ - classification_inconsistent
1453
+ - classification_changed
1454
+ - entry_conflict
1455
+ - evidence_retracted_or_conflicted
1456
+ - quality_gate_not_authorizing
1457
+ abstain: [scope_project, evidence_unavailable, evidence_changed]
1458
+ automatic_admission:
1459
+ owner: deterministic_cli_admission_validation
1460
+ allowed_provenance: provenance_variants.personal_explicit_definition
1461
+ inferred_automatic_admission: disabled
1462
+ required_classification:
1463
+ scope: personal
1464
+ consistency: consistent
1465
+ term: exact_capsule_term
1466
+ meaning: exact_capsule_meaning
1467
+ current_evidence: required
1468
+ quality_gate: personal_mining_authority.admission.quality_threshold
1469
+ command:
1470
+ canonical: npx -y agentera@next report personal-glossary-decision
1471
+ namespace: report
1472
+ input_flag: --input
1473
+ stdin_value: '-'
1474
+ format: json
1475
+ project_checkout: not_required
1476
+ request:
1477
+ schema_version: agentera.personalGlossaryAdmissionRequest.v1
1478
+ required_fields: [schema_version, receipt]
1479
+ additional_fields: forbidden
1480
+ max_utf8_bytes: 16384
1481
+ result:
1482
+ schema_version: agentera.personalGlossaryAdmissionResult.v1
1483
+ fields: [schemaVersion, command, status, decision, reason, effects]
1484
+ statuses: [automatic_admission, review_required, abstain]
1485
+ max_utf8_bytes: 4096
1486
+ effects: []
1487
+ receipt_construction:
1488
+ schema_version: agentera.personalGlossaryAdmissionRequest.v2
1489
+ required_fields: [schema_version, candidate_id, candidate_revision, candidate_capsule_sha256, candidate_projection_sha256, generation, policy_version, classification]
1490
+ additional_fields: forbidden
1491
+ max_utf8_bytes: 16384
1492
+ result:
1493
+ schema_version: agentera.personalGlossaryAdmissionResult.v2
1494
+ fields: [schemaVersion, command, status, receipt, decision, reason, effects]
1495
+ statuses: [automatic_admission, review_required, abstain]
1496
+ max_utf8_bytes: 16384
1497
+ effects: []
1498
+ rule: >-
1499
+ The command accepts either one existing host receipt or one bounded host
1500
+ classification with every exact candidate binding through a structured
1501
+ file or stdin request. For the classification request, the CLI reads the
1502
+ current private projection, constructs the receipt including its semantic
1503
+ fingerprint and receipt digest, computes one deterministic outcome, and
1504
+ returns both receipt and decision. It emits JSON without changing a
1505
+ projection, review record, profile, project glossary, or project state.
1506
+ forbidden_fields: [host_authority, host_override, mutation, publication]
1507
+ rule: >-
1508
+ Only the deterministic CLI validator may emit an admission outcome. It
1509
+ validates the capsule and host receipt bindings before any later workflow;
1510
+ it does not itself write a profile, project glossary, or review record.
1511
+ review_record:
1512
+ owner: user_local_review_lifecycle
1513
+ schema_version: agentera.personalGlossaryReviewRecord.v1
1514
+ required_fields:
1515
+ - schema_version
1516
+ - owner
1517
+ - candidate_id
1518
+ - candidate_revision
1519
+ - candidate_capsule_sha256
1520
+ - host_receipt_sha256
1521
+ - cli_decision_sha256
1522
+ - semantic_fingerprint
1523
+ - generation
1524
+ - policy_version
1525
+ - disposition
1526
+ - corrected_meaning
1527
+ - corrected_scope
1528
+ - disposed_at
1529
+ - expires_at
1530
+ - record_sha256
1531
+ additional_fields: forbidden
1532
+ binding_fields:
1533
+ - candidate_id
1534
+ - candidate_revision
1535
+ - candidate_capsule_sha256
1536
+ - host_receipt_sha256
1537
+ - cli_decision_sha256
1538
+ - semantic_fingerprint
1539
+ - generation
1540
+ - policy_version
1541
+ body_digest: record_sha256
1542
+ storage: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
1543
+ dispositions_from: [personal_mining_authority.privacy.reviews.dispositions]
1544
+ authentication: personal_mining_authority.privacy.reviews.authentication
1545
+ forbidden_fields:
1546
+ - project_glossary
1547
+ - project_publication
1548
+ - profile_entry_mutation
1549
+ - trusted_host_authority
1550
+ rule: >-
1551
+ A review record is user-local lifecycle state bound to the exact candidate,
1552
+ semantic classification, generation, policy, and CLI decision. It is not a
1553
+ host classification receipt and cannot mutate project or profile state by
1554
+ itself.
1555
+ publication_result:
1556
+ owner: personal_profile_publication
1557
+ schema_version: agentera.personalGlossaryPublicationResult.v1
1558
+ required_fields:
1559
+ - schema_version
1560
+ - owner
1561
+ - candidate_id
1562
+ - candidate_revision
1563
+ - candidate_capsule_sha256
1564
+ - decision_sha256
1565
+ - review_record_sha256
1566
+ - generation
1567
+ - policy_version
1568
+ - status
1569
+ - profile_section_sha256
1570
+ - published_at
1571
+ - result_sha256
1572
+ additional_fields: forbidden
1573
+ binding_fields:
1574
+ - candidate_id
1575
+ - candidate_revision
1576
+ - candidate_capsule_sha256
1577
+ - decision_sha256
1578
+ - generation
1579
+ - policy_version
1580
+ body_digest: result_sha256
1581
+ command: ownership_contracts.personal.profile_output.command.canonical
1582
+ status_values_from: [ownership_contracts.personal.profile_output.command.output_statuses]
1583
+ forbidden_fields:
1584
+ - project_glossary
1585
+ - project_publication
1586
+ - consumer_precedence
1587
+ - review_authorization
1588
+ rule: >-
1589
+ This is the bounded result of explicit personal-profile publication only. It binds
1590
+ the validated decision and optional review record, reports the existing
1591
+ personal output status, and never changes Build-owned project publication.
1592
+ shared_invariance:
1593
+ shared_primitive: shared_primitive
1594
+ consumer_precedence: consumer_boundary.primary_selection
1595
+ project_publication: ownership_contracts.project.publication
1596
+ personal_project_isolation: ownership_contracts.personal.admission.isolation_rule
1597
+ rule: >-
1598
+ Candidate contracts add evidence and identity bindings without adding fields
1599
+ to the shared glossary entry. Consumers keep project precedence and Build
1600
+ publication unchanged; personal mining has no project glossary input.
1601
+ recovery:
1602
+ stale_or_mismatch: fail_closed_no_effects
1603
+ retry: >-
1604
+ Reject the layer before effects, reread the current bounded source contract,
1605
+ recompute the capsule and settled identities, and retry the downstream
1606
+ operation with all exact bindings. Never repair a stale receipt in place.
1607
+
1608
+ provenance_variants:
1609
+ personal_explicit_definition:
1610
+ owner: personal
1611
+ evidence_count: 1
1612
+ required_evidence_fields: [source_id, evidence_anchor, signal_type]
1613
+ additional_evidence_fields: forbidden
1614
+ source_provenance:
1615
+ required_fields: [source_id, evidence_anchor, source_kind, signal_type, origin_id, content_fingerprint, author_class, session_id, project_id]
1616
+ allowed_source_kinds: [conversation_turn]
1617
+ identity_fields_must_match_full_record: true
1618
+ allowed_signal_types: [correction, decision, instruction]
1619
+ resolution_rule: >-
1620
+ evidence_anchor resolves to source_id of exactly one retained
1621
+ full-evidence shard through the bounded signal tier. One such distinct
1622
+ retained record is sufficient; unanchored or unresolved evidence fails.
1623
+ personal_inferred_usage:
1624
+ owner: personal
1625
+ evidence_count: 2
1626
+ required_evidence_fields: [source_id, evidence_anchor, source_kind]
1627
+ additional_evidence_fields: forbidden
1628
+ distinctness:
1629
+ source_ids: 2
1630
+ evidence_anchors: 2
1631
+ allowed_source_kinds: [instruction_document, project_config_signal]
1632
+ resolution_rule: >-
1633
+ Each evidence_anchor resolves to its source_id in retained full evidence.
1634
+ Both source_id and evidence_anchor must be pairwise distinct, so two
1635
+ signals or anchors resolving to one retained record fail. Both anchors
1636
+ remain exposed on the entry.
1637
+ personal_inferred_conversation:
1638
+ owner: personal
1639
+ evidence_count: variable
1640
+ minimum_evidence_count: 3
1641
+ required_evidence_fields:
1642
+ - source_id
1643
+ - evidence_anchor
1644
+ - source_kind
1645
+ - signal_type
1646
+ - session_id
1647
+ - project_id
1648
+ - content_fingerprint
1649
+ - author_class
1650
+ additional_evidence_fields: forbidden
1651
+ allowed_signal_types: [correction, decision, question, instruction, configuration]
1652
+ allowed_source_kinds: [conversation_turn]
1653
+ allowed_author_classes: [user]
1654
+ distinctness:
1655
+ source_ids: 3
1656
+ evidence_anchors: 3
1657
+ session_ids: 2
1658
+ project_ids: 2
1659
+ content_fingerprints: 3
1660
+ completeness_field: provenance.evidence_complete
1661
+ completeness_value: true
1662
+ completeness_authority: expected_qualifying_anchor_set_exact_match
1663
+ expected_evidence:
1664
+ binding: generation_bound
1665
+ context_fields: [generation, qualifying_evidence_anchors, qualifying_evidence_set_sha256]
1666
+ exact_set: required
1667
+ set_digest:
1668
+ algorithm: sha256
1669
+ encoding: lowercase_hex
1670
+ canonicalization: >-
1671
+ Hash canonical UTF-8 JSON containing the schema name, generation, and
1672
+ lexicographically code-point-sorted qualifying evidence anchors. The
1673
+ expected set digest is authoritative; list order is not.
1674
+ duplicate_rule: >-
1675
+ Reject duplicate source_id, evidence_anchor, or content_fingerprint at
1676
+ every list length, even when the list still meets the minimum count.
1677
+ admission: review_only
1678
+ resolution_rule: >-
1679
+ Retain every qualifying user-authored conversation record. At least three
1680
+ pairwise-distinct source identities, anchors, and content fingerprints must
1681
+ span at least two sessions and two projects. Agent-authored text may
1682
+ corroborate a later review but cannot satisfy this variant. The evidence
1683
+ list is complete, not a bounded preview; any unresolved, duplicated, or
1684
+ missing identity fails.
1685
+ project_file:
1686
+ owner: project
1687
+ evidence_count: 1
1688
+ required_evidence_fields: [source_path, source_record_sha256]
1689
+ additional_evidence_fields: forbidden
1690
+ resolution_rule: >-
1691
+ source_path is a safe project-relative path and source_record_sha256 is
1692
+ the lowercase SHA-256 of the cited parsed source record. These reuse the
1693
+ repository source-path and record-digest provenance vocabulary from
1694
+ references/artifacts/state-storage-authority.yaml.
1695
+
1696
+ ownership_contracts:
1697
+ personal:
1698
+ scope: user
1699
+ implementation:
1700
+ status: active_partial
1701
+ active:
1702
+ - bounded_admission
1703
+ - bounded_explicit_discovery
1704
+ - bounded_candidate_projection
1705
+ - bounded_candidate_retrieval
1706
+ - public_receipt_construction
1707
+ - host_classification_receipt_validation
1708
+ - deterministic_cli_admission_decision
1709
+ - explicit_classification
1710
+ - inferred_evidence_check
1711
+ - authorized_personal_publication
1712
+ - profile_section_persistence
1713
+ inactive: [lookup]
1714
+ allowed_provenance:
1715
+ - personal_explicit_definition
1716
+ - personal_inferred_usage
1717
+ - personal_inferred_conversation
1718
+ input:
1719
+ tier: signal
1720
+ authority: references/analysis/evidence-tier-authority.yaml
1721
+ bounded_rule: >-
1722
+ Admit only bounded personal-history signals and resolve qualifying
1723
+ evidence one anchor at a time to retained full-evidence shards. Never
1724
+ scan unbounded history or load a monolithic corpus.
1725
+ excluded_categories:
1726
+ - project_glossary_artifact_identity
1727
+ - project_glossary_path
1728
+ - project_glossary_record
1729
+ - project_file_provenance
1730
+ admission:
1731
+ explicit:
1732
+ candidate_signal_types: [correction, decision]
1733
+ language_rule: >-
1734
+ The bounded explicit discovery grammar accepts only the ten forms in
1735
+ personal_mining_authority.explicit_discovery. Quoted or code-delimited
1736
+ means, standalone safe definition-list colons, exact acronym expansions,
1737
+ By X I mean Y, Use X for/to mean Y, To clarify X refers to Y, the
1738
+ clarification prefer form, and approved correction means forms are
1739
+ recognized. YAML/config labels, times, URLs, headings, citations,
1740
+ indirect questions, future language, and unbound prose are rejected.
1741
+ evidence_count: 1
1742
+ inferred:
1743
+ candidate_signal_types: [instruction, configuration]
1744
+ source_kinds: [instruction_document, project_config_signal]
1745
+ identity_rule: >-
1746
+ A requested term must occur as a complete case-insensitive token in
1747
+ two pairwise-distinct retained source identities and anchors. Duplicate
1748
+ identities or anchors fail and successful admission exposes both.
1749
+ evidence_count: 2
1750
+ read_rule: >-
1751
+ Read the bounded signal tier once, select only authority-declared signal
1752
+ types and source kinds, and resolve each selected evidence_anchor through
1753
+ direct single-shard retrieval. Never iterate full history or read legacy
1754
+ corpus.json. Missing, legacy, corrupt, or insufficient evidence returns
1755
+ deterministic recovery without a candidate.
1756
+ insufficient_recovery: >-
1757
+ Refresh bounded local-history evidence or provide another distinct
1758
+ qualifying record; no personal glossary candidate was admitted.
1759
+ isolation_rule: >-
1760
+ Admission accepts only the personal tiers directory and optional legacy
1761
+ corpus location. It has no project-glossary identity, path, or record
1762
+ input, and its result is invariant to project-glossary presence.
1763
+ retention_and_decay:
1764
+ retention: Retained entries decay rather than disappearing solely because evidence ages.
1765
+ confidence: Apply the existing profile permanence decay class to integer confidence.
1766
+ permanence: Remains independently classified and is not changed by evidence age or confidence decay.
1767
+ authority: packages/cli/src/capabilities/profile/instructions.ts#Profile-format
1768
+ profile_output:
1769
+ owner: personal_profile_publication
1770
+ lifecycle_callable: packages/cli/src/analytics/personalGlossaryProfile.ts#updatePersonalGlossaryProfile
1771
+ command:
1772
+ canonical: npx -y agentera@next report personal-glossary-publish
1773
+ namespace: report
1774
+ input_flag: --input
1775
+ stdin_value: "-"
1776
+ format: json
1777
+ dry_run_flag: --dry-run
1778
+ project_checkout: not_required
1779
+ request:
1780
+ schema_version: agentera.personalGlossaryPublishRequest.v1
1781
+ required_fields: [schema_version, receipt, decision, as_of]
1782
+ optional_fields: [review_authorization]
1783
+ additional_fields: forbidden
1784
+ max_utf8_bytes: 16384
1785
+ profile_path_rule: >-
1786
+ Resolve only $AGENTERA_PROFILE_DIR/PROFILE.md through the canonical
1787
+ user-profile authority. The request cannot select a path, project
1788
+ root, project glossary, or other artifact.
1789
+ current_decision_rule: >-
1790
+ Accept either a complete CLI-owned automatic_admission decision with
1791
+ explicit_current_authorized reason and no review authorization, or one
1792
+ current review_required decision with an exact stored accept or correct
1793
+ authorization. Before effects, revalidate the current projection,
1794
+ capsule, receipt, generation, policy, semantic fingerprint, current
1795
+ meaning and revision, scope, conflict, retraction, secret content, and
1796
+ the existing decision rules. A review authorization never skips current
1797
+ evidence validation and does not permit project scope.
1798
+ review_authorization:
1799
+ required_fields: [review_id, review_record_sha256]
1800
+ additional_fields: forbidden
1801
+ dispositions: [accept, correct]
1802
+ source: personal_mining_authority.review_records.disposition.publication_authorization
1803
+ rule: >-
1804
+ The command rereads one current user-local review record, validates its
1805
+ canonical record hash and all receipt, decision, projection, policy,
1806
+ semantic-fingerprint, and revision bindings, then uses its approved
1807
+ corrected meaning and personal scope only for correct. No direct review
1808
+ record, correction, key, nonce, signature, profile path, or project path
1809
+ is accepted from publication input.
1810
+ date_rule: >-
1811
+ as_of is one injected ISO calendar date. Use it for lifecycle
1812
+ rendering and derive published_at as UTC midnight of that exact date;
1813
+ never read the wall clock for publication content or replay.
1814
+ result:
1815
+ schema_version: agentera.personalGlossaryPublicationResult.v1
1816
+ fields: [schema_version, owner, candidate_id, candidate_revision, candidate_capsule_sha256, decision_sha256, review_record_sha256, generation, policy_version, status, profile_section_sha256, published_at, result_sha256]
1817
+ max_utf8_bytes: 4096
1818
+ output_statuses: [changed, unchanged_replay, dry_run_candidate]
1819
+ rule: >-
1820
+ The packaged headless command accepts only one bounded structured
1821
+ receipt and CLI decision, revalidates authorization immediately before
1822
+ effects, and invokes the lifecycle_callable without duplicating merge,
1823
+ decay, replacement, or persistence behavior. It changes only the owned
1824
+ PROFILE.md Glossary section. JSON output contains opaque bindings only;
1825
+ diagnostics use stable generic envelopes. Dry-run computes a candidate
1826
+ without writing PROFILE.md.
1827
+ section:
1828
+ heading: "## Glossary"
1829
+ start_marker: "<!-- agentera:personal-glossary:start -->"
1830
+ end_marker: "<!-- agentera:personal-glossary:end -->"
1831
+ encoding: deterministic_json_fence
1832
+ document_schema_version: agentera.personalGlossarySection.v1
1833
+ entry_shape: shared_primitive
1834
+ lifecycle_metadata: [as_of, confidence_basis]
1835
+ boundary_rule: >-
1836
+ Add one owned section when absent or replace exactly the bytes from its
1837
+ start marker through its end marker. Reject unmatched markers,
1838
+ duplicate owned sections, or an unowned Glossary heading before any
1839
+ write. Preserve every other profile byte exactly.
1840
+ merge_identity:
1841
+ normalization: unicode_caseless_exact_no_normalization
1842
+ rule: >-
1843
+ One locale-independent Unicode caseless-exact term identity may occur
1844
+ once. Identity performs no Unicode normalization, accent folding, or
1845
+ compatibility folding; canonically distinct strings remain distinct.
1846
+ Preserve the established spelling and observed_at date. Fresh
1847
+ qualifying evidence may refresh an entry only when meaning and
1848
+ provenance kind are unchanged; divergent meaning or provenance kind is
1849
+ a conflict rather than an implicit overwrite.
1850
+ refresh_rule: >-
1851
+ For matching fresh qualifying evidence, set confidence and its
1852
+ confidence_basis to the fresh evidence-based integer, replace only the
1853
+ same-kind personal evidence anchors, and set last_confirmed_at to the
1854
+ injected as_of date. Preserve observed_at and permanence. This rule is
1855
+ stable for identical input and as_of.
1856
+ decay_rule: >-
1857
+ Without matching fresh evidence, retain the entry and permanence. Derive
1858
+ confidence from its unchanged confidence_basis, its permanence-class
1859
+ lambda, and calendar days from last_confirmed_at to injected as_of using
1860
+ the Profile formula; round to the nearest integer after applying the
1861
+ existing floor. The section-level basis prevents same-date drift and
1862
+ repeated compounding from already-decayed confidence. Age alone never
1863
+ removes an entry.
1864
+ isolation_rule: >-
1865
+ The command accepts only one receipt, one CLI decision, and an injected
1866
+ ISO date. It resolves the canonical user PROFILE.md path itself and has
1867
+ no project root, project glossary parameter, artifact lookup, or project
1868
+ file read.
1869
+ filesystem:
1870
+ authority: host_filesystem
1871
+ configured_path: canonical_user_profile_authority
1872
+ outcomes: ordinary_permissions_and_io
1873
+ same_user_path_manipulation: outside_agentera_threat_model
1874
+ symlink_confinement: not_claimed
1875
+ rule: >-
1876
+ Profile storage uses ordinary current-user filesystem permissions and
1877
+ atomic replacement. This contract does not claim symlink confinement.
1878
+ project:
1879
+ scope: repository
1880
+ implementation:
1881
+ status: active
1882
+ active: [audit_proposal_digest, build_publication, confirmed_variant_guard]
1883
+ inactive: [lookup, precedence, semantic_equivalence_review]
1884
+ allowed_provenance: [project_file]
1885
+ input:
1886
+ authority: repository_files
1887
+ bounded_rule: Admit only the cited project-relative record bound by its record SHA-256.
1888
+ excluded_categories: [personal_history_record, personal_history_anchor]
1889
+ proposal_digest:
1890
+ algorithm: sha256
1891
+ encoding: lowercase_hex
1892
+ canonicalization: >-
1893
+ Hash the complete terminology finding except proposal_digest as canonical
1894
+ JSON with mapping keys sorted recursively. Sort canonical_evidence and
1895
+ each variant evidence by source_path, line, then source_record_sha256;
1896
+ sort variants by case-insensitive term and then exact term. The digest
1897
+ therefore changes when any proposal, confidence, severity, divergence,
1898
+ term, source path, line identity, or source-record digest changes, but not
1899
+ when equivalent evidence or variant arrays arrive in a different order.
1900
+ Locale-independent lowercase ordering is only a deterministic sort key;
1901
+ it does not define term identity.
1902
+ proposal_validation:
1903
+ owner: audit
1904
+ shared_runtime: packages/cli/src/audit/terminologyDrift.ts#validateTerminologyProposal
1905
+ required_rules:
1906
+ - safe_distinct_evidence_identities_per_term
1907
+ - unicode_caseless_exact_unique_term_identities
1908
+ - best_supported_canonical_term_with_lexicographic_tie_break
1909
+ - authority_confidence_floor_and_range
1910
+ - confidence_below_70_forces_info_severity
1911
+ - canonical_evidence_and_variant_order
1912
+ - canonical_proposal_digest
1913
+ publication_rule: >-
1914
+ Build publication accepts only the complete canonical finding that this
1915
+ Audit-owned validator can emit. Publication reuses this validator and
1916
+ must not duplicate or weaken Audit proposal semantics.
1917
+ entry_derivation:
1918
+ term: proposal.proposed_canonical_term
1919
+ meaning: proposal.concept
1920
+ confidence: proposal.confidence
1921
+ permanence: stable
1922
+ temporal.observed_at: confirmation.confirmed_at calendar date
1923
+ temporal.last_confirmed_at: confirmation.confirmed_at calendar date
1924
+ provenance.kind: project_file
1925
+ provenance.evidence: >-
1926
+ Exactly the first canonical_evidence record after proposal-digest
1927
+ canonical ordering, projected to source_path and source_record_sha256.
1928
+ Line identifies and revalidates the source record during publication but
1929
+ is not persisted because it is not part of the shared project_file
1930
+ provenance variant.
1931
+ rejection_rule: >-
1932
+ Reject before effects when any required proposal or derived entry value
1933
+ is absent or invalid; never invent a field or extend the shared entry.
1934
+ publication:
1935
+ owner: build
1936
+ command: npx -y agentera@next state glossary publish --input REQUEST --format json
1937
+ request:
1938
+ schema_version: agentera.glossaryPublicationRequest.v1
1939
+ required_fields: [schema_version, proposal, confirmation]
1940
+ additional_fields: forbidden
1941
+ proposal_shape: complete_terminology_drift_finding_with_proposal_digest
1942
+ confirmation:
1943
+ required_fields: [proposal_digest, confirmed_by, confirmed_at]
1944
+ additional_fields: forbidden
1945
+ confirmed_by: user
1946
+ confirmed_at: iso_8601_timestamp
1947
+ binding: >-
1948
+ proposal_digest must equal the digest recomputed from proposal and
1949
+ therefore binds the exact finding, every cited source record, and
1950
+ the user's timestamped confirmation.
1951
+ persisted_document:
1952
+ schema_version: agentera.projectGlossary.v1
1953
+ required_fields: [schema_version, approvals, entries]
1954
+ additional_fields: forbidden
1955
+ approvals:
1956
+ type: list
1957
+ immutable_record_fields: [proposal_digest, proposal, confirmation]
1958
+ additional_record_fields: forbidden
1959
+ entries:
1960
+ type: list
1961
+ item: shared_primitive
1962
+ approval_fields: forbidden
1963
+ terminology_set_identity:
1964
+ normalization: unicode_caseless_exact_no_normalization
1965
+ members: [paired_entry.term, paired_approval.proposal.variants.term]
1966
+ uniqueness: global_across_complete_document
1967
+ rule: >-
1968
+ Every Unicode caseless-exact canonical or variant term belongs to
1969
+ exactly one approval-entry pair. Identity performs no Unicode
1970
+ normalization, accent folding, or compatibility folding. Reject
1971
+ duplicate variants and every cross-set canonical/variant collision
1972
+ before effects. An exact replay compares against its existing pair
1973
+ and remains a no-op.
1974
+ transaction: >-
1975
+ Under the established project writer lock, resolve the registered
1976
+ project path, safely re-read every cited project-relative source line,
1977
+ recompute its SHA-256 and the proposal digest, validate the complete
1978
+ candidate bytes, then atomically replace the single glossary document.
1979
+ Creation follows the same path. Dry-run performs all validation without
1980
+ publication.
1981
+ merge_and_replay: >-
1982
+ Preserve unrelated valid approvals and entries semantically unchanged.
1983
+ Canonical and variant identity is case-insensitive and globally unique
1984
+ across confirmed canonical sets. An exact approval and derived-entry
1985
+ replay is a no-op. An approval without its matching entry, a matching
1986
+ term with changed entry or proposal, reuse of an old confirmation for
1987
+ changed proposal content, duplicate identity, cross-set terminology
1988
+ collision, or malformed existing state is a conflict and must never be
1989
+ repaired or overwritten implicitly.
1990
+ confirmed_variant_guard:
1991
+ owner: packages/cli/src/validate/glossaryVariantGuard.ts#scanConfirmedVariantViolations
1992
+ validation_surface: packages/cli/test/cli/glossaryVariantGuard.test.ts
1993
+ loader: packages/cli/src/state/write/glossaryPublication.ts#loadProjectGlossaryDocument
1994
+ source_rule: >-
1995
+ Resolve the glossary through the canonical artifact registry and consume
1996
+ only complete validated approval-entry pairs. Derive each forbidden
1997
+ variant from approval.proposal.variants and its canonical replacement
1998
+ from the paired entry.term; never infer equivalence or consume personal
1999
+ glossary state.
2000
+ matching: exact_case_sensitive_boundary_aware_literal
2001
+ approved_evidence_rule: >-
2002
+ The exact source_path, line, and source_record_sha256 retained by the
2003
+ immutable proposal is historical evidence and does not self-trigger.
2004
+ Changed bytes at that location or a matching variant elsewhere fail.
2005
+ exclusions:
2006
+ - generated_output
2007
+ - vendor_and_dependency_state
2008
+ - cache_state
2009
+ - repository_metadata
2010
+ - historical_agentera_state
2011
+ - project_glossary_document
2012
+ - unrelated_agentera_state
2013
+ excluded_directory_names:
2014
+ - .agentera
2015
+ - .agentera-generated
2016
+ - .cache
2017
+ - .git
2018
+ - .next
2019
+ - .pnpm
2020
+ - .turbo
2021
+ - .venv
2022
+ - .vite
2023
+ - build
2024
+ - bundle
2025
+ - coverage
2026
+ - dist
2027
+ - node_modules
2028
+ - target
2029
+ - vendor
2030
+ exclusion_rule: >-
2031
+ Skip a directory only when its basename exactly equals one declared
2032
+ name. The validator and fixtures consume this list directly; prefixes,
2033
+ suffixes, substrings, and nearby ordinary source names remain scanned.
2034
+ failure_rule: >-
2035
+ Emit one deterministic violation per variant location with the canonical
2036
+ term, confirmed proposal evidence, offending source location, and the
2037
+ runnable validation command. A malformed present glossary fails closed;
2038
+ an absent glossary leaves the pre-existing legacy checks unchanged.
2039
+
2040
+ consumer_boundary:
2041
+ contract_status: active
2042
+ implementation:
2043
+ acquisition: active
2044
+ advice_resolution: active
2045
+ capability_integrations:
2046
+ build: active
2047
+ discuss: active
2048
+ plan: active
2049
+ prime: active
2050
+ forbidden_persisted_entry_fields: [precedence, collision, review]
2051
+ deterministic_judgments:
2052
+ term_identity: unicode_caseless_exact_no_normalization
2053
+ term_identity_runtime: packages/cli/src/registries/glossaryTermIdentity.ts#unicodeCaselessExact
2054
+ meaning_identity: exact_string
2055
+ project_state_validity: schema_and_bound_validation
2056
+ project_gap: valid_project_state_without_exact_term_identity
2057
+ forbidden_semantic_heuristics: [scores, thresholds, embeddings, automatic_merge]
2058
+ host_reviewed_judgments:
2059
+ inferred_semantic_equivalence: >-
2060
+ The host may identify a possible equivalence only from the current
2061
+ meaning-sensitive input and bounded candidate meanings. It never selects
2062
+ authority, merges entries, or resolves the review itself.
2063
+ project_state:
2064
+ gap_proving_states: [canonically_absent, valid_empty, valid_nonmatching]
2065
+ invalid_states: [malformed, unreadable, ambiguous_path, over_bound]
2066
+ invalid_rule: >-
2067
+ An invalid project state cannot prove a project gap. Abstain rather than
2068
+ falling back to a personal meaning, repairing state, or guessing authority.
2069
+ acquisition:
2070
+ implementation: active
2071
+ runtime: packages/cli/src/analytics/glossaryInputAcquisition.ts#acquireGlossaryInputs
2072
+ mutation: forbidden
2073
+ bounds:
2074
+ authority: consumer_boundary.profile_grounding.max_profile_utf8_bytes
2075
+ max_source_utf8_bytes: 65536
2076
+ max_entries: 100
2077
+ rule: >-
2078
+ Apply the existing bounded profile-read byte ceiling to each source and
2079
+ admit at most 100 entries from either owned glossary. The entry ceiling
2080
+ is declared only here and consumed by the runtime and schema validator.
2081
+ Reject raw bytes above the source ceiling before decoding, decode UTF-8
2082
+ fatally, and reject a parsed document above the entry ceiling; never
2083
+ replacement-decode, truncate, or partially admit input. Exactly 65,536
2084
+ raw bytes and 100 entries are permitted.
2085
+ availability:
2086
+ states:
2087
+ - absent
2088
+ - valid_empty
2089
+ - valid_present
2090
+ - malformed
2091
+ - unreadable
2092
+ - ambiguous
2093
+ - over_bound
2094
+ valid: [absent, valid_empty, valid_present]
2095
+ invalid: [malformed, unreadable, ambiguous, over_bound]
2096
+ project_gap_proving: [absent, valid_empty]
2097
+ rule: >-
2098
+ Classify the two sources independently. Project absence means the
2099
+ canonical artifact does not exist; personal absence means PROFILE.md or
2100
+ its owned Glossary section does not exist. A present empty owned document
2101
+ is valid_empty. Invalid states expose no entries and cannot prove a
2102
+ project gap. Dual invalid or absent input exposes no glossary entries;
2103
+ valid project entries remain available when personal input is invalid.
2104
+ project:
2105
+ identity: glossary
2106
+ discovery: packages/cli/src/registries/artifactRegistry.ts#loadArtifactRecord
2107
+ path_resolution: packages/cli/src/registries/artifactRegistry.ts#resolveArtifactPath
2108
+ docs_override: canonical_GLOSSARY.md_mapping_only
2109
+ docs_override_read: bounded_no_follow_regular_file
2110
+ project_root: packages/cli/src/state/projectRoot.ts#validateRealProjectRoot
2111
+ boundary_rule: >-
2112
+ Resolve only the registered glossary identity and its canonical docs
2113
+ override under one validated real project root. Missing canonical
2114
+ artifacts are absent. Unsafe overrides, path escapes, symlink ambiguity,
2115
+ or unavailable registry identity classify ambiguous; malformed present
2116
+ docs mappings or glossary documents fail closed and never fall back to a
2117
+ default path.
2118
+ filesystem_guarantee: >-
2119
+ Open the canonical .agentera/docs.yaml and resolved glossary target with
2120
+ O_NOFOLLOW after lstat snapshots of every existing project-relative path
2121
+ component. Match the opened regular-file descriptor to the snapshotted
2122
+ device and inode, read raw bytes from that descriptor, and require its
2123
+ size, mtime, ctime, device, and inode plus every snapshotted parent path
2124
+ identity to remain unchanged through the read. For an absent target,
2125
+ require the first missing component to remain missing while all existing
2126
+ parent identities remain unchanged. The descriptor pins accepted bytes;
2127
+ a symlink, parent swap, changed identity, unsupported no-follow boundary,
2128
+ or failed stability check is ambiguous. This does not claim detection of
2129
+ an identity swapped away and restored between observations, because such
2130
+ a swap cannot change bytes already pinned to the verified descriptor.
2131
+ external_docs_rule: >-
2132
+ A symlinked, escaped, changed, unreadable, malformed, over-bound, or
2133
+ non-UTF-8 docs mapping is ambiguous and never selects a glossary target.
2134
+ document_validation: ownership_contracts.project.publication
2135
+ approval_output: forbidden
2136
+ raw_source_provenance_output: forbidden
2137
+ personal:
2138
+ owner: ownership_contracts.personal.profile_output.owner
2139
+ profile_path_input: >-
2140
+ The caller passes exactly the profile path already returned by canonical
2141
+ profile context. Acquisition does not discover or return that path and
2142
+ accepts no project identity, root, glossary path, or project record.
2143
+ section: ownership_contracts.personal.profile_output.section
2144
+ parser: packages/cli/src/analytics/personalGlossaryProfile.ts#personalGlossaryConsumerEntries
2145
+ grounding_parser_isolation: >-
2146
+ profile-grounding continues to remove the owned section and never
2147
+ exposes it. Consumer acquisition separately parses exactly the existing
2148
+ single owned marker range and returns no bytes outside that range.
2149
+ provenance_output: forbidden
2150
+ producer_invariance: >-
2151
+ Personal parsing accepts only profile bytes and therefore returns the
2152
+ same result regardless of project glossary presence.
2153
+ output:
2154
+ entry_fields: [term, meaning, owner]
2155
+ owners: [personal, project]
2156
+ source_fields: [owner, availability, entries, gap_proving, diagnostic]
2157
+ diagnostic_fields: [class, recovery]
2158
+ diagnostic_rule: >-
2159
+ Diagnostics name only the availability class and a public recovery.
2160
+ They never contain profile paths, artifact paths, raw bytes, sections,
2161
+ definitions, entries, anchors, approval records, or provenance.
2162
+ entry_rule: >-
2163
+ Return only validated term and meaning plus source ownership. Do not
2164
+ return confidence, permanence, temporal metadata, personal anchors,
2165
+ profile paths, unrelated profile sections, project approval records, or
2166
+ project source provenance. Acquisition does not select precedence,
2167
+ fallback, tension, review, or a primary outcome.
2168
+ advice_resolution:
2169
+ implementation: active
2170
+ runtime: packages/cli/src/analytics/glossaryAdviceResolution.ts#resolveGlossaryAdvice
2171
+ mutation: forbidden
2172
+ invocation:
2173
+ command: npx -y agentera@next report glossary-advice --input REQUEST --format json
2174
+ request_schema_version: agentera.glossaryAdviceRequest.v1
2175
+ request_fields: [schema_version, requested_term, host_review]
2176
+ max_request_utf8_bytes: 131072
2177
+ acquisition: internal_bounded_owned_sources
2178
+ project_root: current_working_directory
2179
+ profile_path: canonical_registry_resolution
2180
+ output_envelope_fields: [schemaVersion, command, status, advice]
2181
+ rule: >-
2182
+ Consumers send the requested term and optional host review through one
2183
+ structured stdin or file request. The CLI acquires both owned sources;
2184
+ callers never read raw project glossary or profile files. The command is
2185
+ read-only, headless, JSON-only, and never refreshes either source.
2186
+ input:
2187
+ fields: [requested_term, acquired, host_review]
2188
+ requested_term_utf8_bound: consumer_boundary.acquisition.bounds.max_source_utf8_bytes
2189
+ acquired_contract: consumer_boundary.acquisition.output
2190
+ host_review:
2191
+ optional: true
2192
+ fields: [relation, candidate_owner, candidate_term]
2193
+ relations: [inferred_equivalence]
2194
+ candidate_owners: [personal]
2195
+ rule: >-
2196
+ A host may report only one explicit inferred-equivalence relation to
2197
+ one differently named, valid acquired personal candidate. Omission
2198
+ means no inferred candidate. Unknown relations, owners, fields, or
2199
+ candidates fail before selection and never echo input content.
2200
+ additional_fields: forbidden
2201
+ output:
2202
+ schema_version: agentera.glossaryAdvice.v1
2203
+ fields: [outcome, applicable_meaning, applicable_owner, review, tension, advisory]
2204
+ owners: [personal, project]
2205
+ advisory_fields: [reason, ownership_state]
2206
+ advisory_reasons: [personal_input_unavailable, inferred_equivalence]
2207
+ advisory_ownership_states: [project_governs_exact]
2208
+ rule: >-
2209
+ Return exactly one matrix outcome and its authority-declared semantics.
2210
+ Include only the selected meaning and owner. An orthogonal advisory may
2211
+ expose only its bounded reason and ownership state. Never return the
2212
+ requested or candidate term, acquisition diagnostics, source content,
2213
+ paths, anchors, approvals, provenance, unrelated entries, or conflict
2214
+ state.
2215
+ failure:
2216
+ classes: [invalid_request, invalid_acquisition, invalid_host_review]
2217
+ rule: >-
2218
+ Fail once before selection with only a bounded class and public recovery;
2219
+ never quote or serialize an input term, meaning, diagnostic, path, raw
2220
+ entry, profile or project content, approval, anchor, or provenance.
2221
+ primary_selection:
2222
+ dimensions:
2223
+ project_input: [invalid, valid_gap, valid_exact]
2224
+ personal_input: [invalid, valid_without_exact, valid_exact]
2225
+ exact_meaning: [not_applicable, equivalent, divergent]
2226
+ inferred_candidate: [absent, present]
2227
+ valid_state_rule: >-
2228
+ exact_meaning is equivalent or divergent exactly when both inputs have an
2229
+ exact term; otherwise it is not_applicable. inferred_candidate is
2230
+ considered only when no personal exact term exists.
2231
+ order:
2232
+ - invalid_or_unavailable_project
2233
+ - equivalent_exact_collision
2234
+ - divergent_exact_collision
2235
+ - project_only
2236
+ - proven_project_gap
2237
+ - inferred_equivalence
2238
+ - invalid_or_unavailable_personal
2239
+ - no_applicable_entry
2240
+ rule: >-
2241
+ Evaluate rows in this order and select exactly the first matching primary
2242
+ outcome. The declared valid input state space must match exactly one row;
2243
+ availability and inferred-equivalence advisories never compete with a
2244
+ usable exact project meaning.
2245
+ outcome_matrix:
2246
+ invalid_or_unavailable_project:
2247
+ when: project input is malformed, unreadable, ambiguous, or over bound
2248
+ match:
2249
+ project_input: [invalid]
2250
+ personal_input: [invalid, valid_without_exact, valid_exact]
2251
+ exact_meaning: [not_applicable]
2252
+ inferred_candidate: [absent, present]
2253
+ judgment: deterministic
2254
+ selected_owner: none
2255
+ selected_meaning: none
2256
+ review: unavailable
2257
+ tension: authority_unavailable
2258
+ equivalent_exact_collision:
2259
+ when: valid personal and project entries have exact term identity and exact meaning identity
2260
+ match:
2261
+ project_input: [valid_exact]
2262
+ personal_input: [valid_exact]
2263
+ exact_meaning: [equivalent]
2264
+ inferred_candidate: [absent, present]
2265
+ judgment: deterministic
2266
+ selected_owner: project
2267
+ selected_meaning: project
2268
+ review: none
2269
+ tension: none
2270
+ divergent_exact_collision:
2271
+ when: valid personal and project entries have exact term identity but not exact meaning identity
2272
+ match:
2273
+ project_input: [valid_exact]
2274
+ personal_input: [valid_exact]
2275
+ exact_meaning: [divergent]
2276
+ inferred_candidate: [absent, present]
2277
+ judgment: deterministic
2278
+ selected_owner: project
2279
+ selected_meaning: project
2280
+ review: none
2281
+ tension: divergent_exact_collision
2282
+ project_only:
2283
+ when: >-
2284
+ valid project input has an exact term and personal input is invalid,
2285
+ unavailable, valid without an exact term, or only a differently named
2286
+ inferred-equivalence candidate
2287
+ match:
2288
+ project_input: [valid_exact]
2289
+ personal_input: [invalid, valid_without_exact]
2290
+ exact_meaning: [not_applicable]
2291
+ inferred_candidate: [absent, present]
2292
+ judgment: deterministic
2293
+ selected_owner: project
2294
+ selected_meaning: project
2295
+ review: none_for_primary
2296
+ tension: none
2297
+ proven_project_gap:
2298
+ when: project state is gap-proving and one valid personal exact term exists
2299
+ match:
2300
+ project_input: [valid_gap]
2301
+ personal_input: [valid_exact]
2302
+ exact_meaning: [not_applicable]
2303
+ inferred_candidate: [absent, present]
2304
+ judgment: deterministic
2305
+ selected_owner: personal
2306
+ selected_meaning: personal
2307
+ review: none
2308
+ tension: none
2309
+ inferred_equivalence:
2310
+ when: >-
2311
+ project state is gap-proving, personal input is valid without an exact
2312
+ term, and the host identifies a possible semantic-equivalence candidate
2313
+ match:
2314
+ project_input: [valid_gap]
2315
+ personal_input: [valid_without_exact]
2316
+ exact_meaning: [not_applicable]
2317
+ inferred_candidate: [present]
2318
+ judgment: host_reviewed
2319
+ selected_owner: none_until_review
2320
+ selected_meaning: none_until_review
2321
+ review: required_when_meaning_sensitive
2322
+ tension: inferred_equivalence
2323
+ invalid_or_unavailable_personal:
2324
+ when: >-
2325
+ project state is gap-proving and personal input is malformed,
2326
+ unavailable, or over bound, so no fallback can be proven
2327
+ match:
2328
+ project_input: [valid_gap]
2329
+ personal_input: [invalid]
2330
+ exact_meaning: [not_applicable]
2331
+ inferred_candidate: [absent, present]
2332
+ judgment: deterministic
2333
+ selected_owner: none
2334
+ selected_meaning: none
2335
+ review: unavailable
2336
+ tension: input_unavailable
2337
+ no_applicable_entry:
2338
+ when: >-
2339
+ project state is gap-proving, personal input is valid without an exact
2340
+ term, and no inferred-equivalence candidate is present
2341
+ match:
2342
+ project_input: [valid_gap]
2343
+ personal_input: [valid_without_exact]
2344
+ exact_meaning: [not_applicable]
2345
+ inferred_candidate: [absent]
2346
+ judgment: deterministic
2347
+ selected_owner: none
2348
+ selected_meaning: none
2349
+ review: none
2350
+ tension: none
2351
+ orthogonal_advisories:
2352
+ personal_input_unavailable_with_project_exact:
2353
+ primary_outcome: project_only
2354
+ when: personal_input is invalid and project_input is valid_exact
2355
+ match:
2356
+ project_input: [valid_exact]
2357
+ personal_input: [invalid]
2358
+ exact_meaning: [not_applicable]
2359
+ inferred_candidate: [absent, present]
2360
+ caveat_reason: personal_input_unavailable
2361
+ ownership_state: project_governs_exact
2362
+ rule: >-
2363
+ Preserve the exact project meaning. The bounded availability caveat may
2364
+ report only reason and ownership state; it never becomes another primary
2365
+ outcome or exposes personal content.
2366
+ inferred_equivalence_with_project_exact:
2367
+ primary_outcome: project_only
2368
+ when: >-
2369
+ personal_input is valid_without_exact, project_input is valid_exact, and
2370
+ inferred_candidate is present
2371
+ match:
2372
+ project_input: [valid_exact]
2373
+ personal_input: [valid_without_exact]
2374
+ exact_meaning: [not_applicable]
2375
+ inferred_candidate: [present]
2376
+ review: required_when_the_inferred_relation_is_meaning_sensitive
2377
+ caveat_reason: inferred_equivalence
2378
+ ownership_state: project_governs_exact
2379
+ rule: >-
2380
+ Project authority remains the usable primary meaning. Host review governs
2381
+ only the possible differently named relation and cannot displace, merge,
2382
+ or suppress the exact project entry.
2383
+ refresh_events:
2384
+ required:
2385
+ - initial_meaning_sensitive_input
2386
+ - later_user_requirement_change_that_can_change_meaning
2387
+ - later_user_intent_change_that_can_change_meaning
2388
+ - later_acceptance_change_that_can_change_meaning
2389
+ - later_deliberation_premise_change_that_can_change_meaning
2390
+ - later_cycle_intent_change_that_can_change_meaning
2391
+ - clarification_answer_for_a_reviewed_term
2392
+ not_required:
2393
+ - unrelated_conversation_turn
2394
+ - unchanged_input_replay
2395
+ - background_state_reread
2396
+ - status_or_progress_render
2397
+ - tool_output_without_requirement_or_intent_change
2398
+ - artifact_rendering
2399
+ - evaluator_text_without_user_change
2400
+ - control_only_continuation
2401
+ rule: >-
2402
+ Refresh only at a governed event whose changed input can alter the meaning
2403
+ used by the capability. Rereads and incidental turns do not refresh advice.
2404
+ discuss_integration:
2405
+ implementation: active
2406
+ invocation: consumer_boundary.advice_resolution.invocation
2407
+ governed_events: consumer_boundary.refresh_events
2408
+ outcome_authority: consumer_boundary.outcome_matrix
2409
+ disclosure: consumer_boundary.disclosure.transient_advice
2410
+ interaction:
2411
+ scope: current_user_authored_meaning_sensitive_input
2412
+ transcript_scan: forbidden
2413
+ done_only_control: no_refresh
2414
+ review_rule: >-
2415
+ Before meaning-sensitive reasoning or decision framing relies on an
2416
+ inferred relation, ask one focused clarification question under the
2417
+ existing one-question-per-turn and Done contract. The clarification may
2418
+ identify a host-reviewed relation for a fresh advice request but is not
2419
+ decision confirmation, approval, or publication consent.
2420
+ exact_collision_rule: >-
2421
+ Use an applicable project meaning for a divergent exact collision and
2422
+ surface the bounded divergence as a concise scratchpad tension or Crux.
2423
+ Never ask the user to choose project versus personal authority.
2424
+ unavailable_rule: >-
2425
+ Continue without glossary grounding when advice is unavailable, invalid,
2426
+ or has no applicable entry. Ask ordinary clarification only when the term
2427
+ is necessary and ambiguous, without fabricating glossary facts.
2428
+ output_rule: >-
2429
+ Use only the transient applicable meaning and owner needed for the current
2430
+ deliberation, and never quote unrelated glossary content.
2431
+ mutation: forbidden
2432
+ forbidden_effects:
2433
+ - glossary_write
2434
+ - glossary_approval
2435
+ - publication_consent
2436
+ - progress_caveat
2437
+ - plan_conflict
2438
+ - decision_conflict
2439
+ plan_integration:
2440
+ implementation: active
2441
+ invocation: consumer_boundary.advice_resolution.invocation
2442
+ governed_events: consumer_boundary.refresh_events
2443
+ outcome_authority: consumer_boundary.outcome_matrix
2444
+ disclosure: consumer_boundary.disclosure.transient_advice
2445
+ mode:
2446
+ precedence:
2447
+ - explicit_delegated_or_orchestrated_no_pause
2448
+ - direct_user_invocation_with_available_clarification_turn
2449
+ - unknown_or_ambiguous
2450
+ signals:
2451
+ explicit_delegated_or_orchestrated_no_pause:
2452
+ result: autonomous
2453
+ direct_user_invocation_with_available_clarification_turn:
2454
+ result: interactive
2455
+ unknown_or_ambiguous:
2456
+ result: interactive_waiting
2457
+ silence_or_timeout: never_autonomous
2458
+ rule: >-
2459
+ Use the first matching signal. Unknown or conflicting mode evidence waits
2460
+ for interactive clarification; silence and elapsed time never imply
2461
+ autonomous execution.
2462
+ interaction:
2463
+ scope: current_user_authored_meaning_sensitive_input
2464
+ transcript_scan: forbidden
2465
+ control_only_continuation: no_refresh
2466
+ review:
2467
+ interactive_sequence:
2468
+ - emit_one_focused_clarification
2469
+ - wait_for_user_answer
2470
+ - refresh_advice_for_affected_term
2471
+ - finalize_affected_scope_requirements_tasks_acceptance
2472
+ autonomous_sequence:
2473
+ - abstain_from_disputed_meaning
2474
+ - defer_affected_scope_requirements_tasks_acceptance
2475
+ - emit_transient_handoff_intent
2476
+ clarification_effects:
2477
+ - not_plan_approval
2478
+ - not_decision_confirmation
2479
+ - not_glossary_approval
2480
+ - not_publication_consent
2481
+ exact_collision_rule: >-
2482
+ Use an applicable project meaning for a divergent exact collision. Where
2483
+ the divergence materially affects planning, represent only the bounded
2484
+ tension and never disclose the personal definition.
2485
+ unavailable_rule: >-
2486
+ Continue without glossary grounding when advice is unavailable, invalid,
2487
+ or has no applicable entry. In interactive Plan, ask ordinary focused
2488
+ clarification only when the term is necessary and meaning-critical.
2489
+ autonomous_handoff_intent:
2490
+ status: transient_emitted_not_delivered
2491
+ caller_fields: [event, reason, ownership_state]
2492
+ fixed_values:
2493
+ event: current
2494
+ accepted_writer_flags:
2495
+ [--input]
2496
+ input: one progress cycle YAML/JSON mapping whose glossary_caveat contains the three caller fields
2497
+ writer_owned_fields: [caveat_id, capability, transition_id]
2498
+ forbidden_fields: [caveat_id, capability, transition_id]
2499
+ forbidden_claims: [delivered, stored, persisted, published, durable_envelope]
2500
+ durable_writer: build
2501
+ writer_interface: npx -y agentera@next state progress explain --verb append --format json
2502
+ writer_result: authoritative_identity_and_six_field_envelope
2503
+ allowed_reason_state_pairs: consumer_boundary.autonomous_caveat.allowed_current_pairs
2504
+ rule: >-
2505
+ Emit one intent only when autonomous meaning-sensitive work has unresolved
2506
+ review or unavailable authority. The emitted-only intent contains exactly
2507
+ event=current, reason, and ownership_state, the three caller inputs accepted
2508
+ by the Build writer in one bounded structured record input. It is not delivered, stored, persisted, or published.
2509
+ The writer creates caveat_id, capability=build, and transition_id=null to
2510
+ complete the authoritative current envelope.
2511
+ exact_project_personal_unavailable:
2512
+ primary_outcome: project_only
2513
+ advisory_reason: personal_input_unavailable
2514
+ advisory_ownership_state: project_governs_exact
2515
+ plan_action: ground_exact_project_meaning
2516
+ autonomous_handoff_intent: none
2517
+ durable_unresolved_caveat: none
2518
+ rule: >-
2519
+ Unavailable personal input does not make exact project authority
2520
+ unresolved. Keep the advisory transient and never emit or publish it as
2521
+ an autonomous unresolved handoff.
2522
+ unavailable:
2523
+ invalid_project:
2524
+ interactive: clarify_or_wait_when_meaning_critical
2525
+ autonomous: abstain_defer_and_emit_authority_unavailable
2526
+ handoff_pair: [authority_unavailable, authority_unavailable]
2527
+ invalid_personal_after_project_gap:
2528
+ interactive: clarify_or_wait_when_meaning_critical
2529
+ autonomous: abstain_defer_and_emit_personal_input_unavailable
2530
+ handoff_pair: [personal_input_unavailable, authority_unavailable]
2531
+ behavior_matrix:
2532
+ interactive_review_required:
2533
+ mode: interactive
2534
+ plan_action: clarify_refresh_then_finalize
2535
+ handoff_intent: none
2536
+ autonomous_review_required:
2537
+ mode: autonomous
2538
+ plan_action: abstain_and_defer
2539
+ handoff_intent: emitted
2540
+ exact_project_personal_unavailable:
2541
+ mode: any
2542
+ plan_action: ground_exact_project_meaning
2543
+ handoff_intent: none
2544
+ unavailable_unresolved:
2545
+ mode: autonomous
2546
+ plan_action: abstain_and_defer
2547
+ handoff_intent: emitted
2548
+ divergent_exact_collision:
2549
+ mode: any
2550
+ plan_action: ground_project_and_bound_tension
2551
+ handoff_intent: none
2552
+ irrelevant_or_no_applicable_entry:
2553
+ mode: any
2554
+ plan_action: leave_unaffected_planning_unchanged
2555
+ handoff_intent: none
2556
+ output_rule: >-
2557
+ Use only the transient applicable meaning and owner needed for affected
2558
+ planning. An autonomous handoff intent is emitted, not delivered or stored,
2559
+ and contains exactly event=current, reason, and ownership_state for a later
2560
+ Build write.
2561
+ handoff: consumer_boundary.autonomous_caveat.handoff.plan
2562
+ mutation: forbidden
2563
+ forbidden_effects:
2564
+ - glossary_write
2565
+ - glossary_approval
2566
+ - publication_consent
2567
+ - progress_caveat
2568
+ - plan_conflict
2569
+ - decision_conflict
2570
+ disclosure:
2571
+ transient_advice:
2572
+ allowed: [outcome, applicable_meaning, applicable_owner, review, tension, advisory]
2573
+ minimum_rule: >-
2574
+ Include a meaning only when that meaning is selected by the matrix and
2575
+ needed for the current meaning-sensitive work. Never include unrelated entries.
2576
+ forbidden:
2577
+ - personal_evidence_anchor
2578
+ - personal_profile_path
2579
+ - raw_personal_glossary_section
2580
+ - unrelated_entry
2581
+ - provenance
2582
+ - project_source_path
2583
+ durable_surfaces:
2584
+ surfaces: [progress_evidence, prime_attention, diagnostics, errors]
2585
+ allowed: [caveat_id, event, capability, reason, ownership_state, transition_id]
2586
+ forbidden:
2587
+ - personal_definition
2588
+ - project_definition
2589
+ - personal_evidence_anchor
2590
+ - personal_profile_path
2591
+ - raw_personal_glossary_section
2592
+ - raw_project_glossary_section
2593
+ - unrelated_entry
2594
+ - provenance
2595
+ - project_source_path
2596
+ failure_rule: >-
2597
+ Errors identify only the invalid input class and a public recovery command;
2598
+ they never quote private bytes, definitions, paths, anchors, or provenance.
2599
+ plan_artifacts:
2600
+ surfaces:
2601
+ [
2602
+ scope,
2603
+ requirements,
2604
+ constraints,
2605
+ tasks,
2606
+ task_acceptance,
2607
+ overall_acceptance,
2608
+ diagnostics,
2609
+ handoff,
2610
+ ]
2611
+ allowed_sources:
2612
+ [user_authored_term, user_authored_clarification, derived_behavioral_requirement]
2613
+ forbidden_content:
2614
+ - profile_derived_definition
2615
+ - personal_glossary_definition
2616
+ - personal_evidence_anchor
2617
+ - personal_profile_path
2618
+ - raw_personal_glossary_section
2619
+ - raw_project_glossary_section
2620
+ - unrelated_entry
2621
+ - provenance
2622
+ - project_source_path
2623
+ user_term_rule: >-
2624
+ A term already supplied by the user may remain in the plan. Never copy or
2625
+ quote a profile-derived or personal glossary definition; express only the
2626
+ derived behavioral requirement needed by the plan.
2627
+ autonomous_caveat:
2628
+ durable_owner: build
2629
+ durable_channel: progress
2630
+ authority: skills/agentera/schemas/artifacts/progress.yaml#ENTITY_AUTHORITY
2631
+ publication_command: npx -y agentera@next state progress append
2632
+ publication_boundary: progress_cycle.glossary_caveat
2633
+ publication_status: active_build
2634
+ writer_runtime: packages/cli/src/state/progressEntities.ts#appendProgressEntity
2635
+ writer_interface: npx -y agentera@next state progress explain --verb append --format json
2636
+ envelope_validator: packages/cli/src/state/progressGlossaryCaveat.ts#validateProgressGlossaryCaveat
2637
+ lifecycle_validator: packages/cli/src/state/progressGlossaryCaveat.ts#glossaryCaveatLifecycleInvalidEntities
2638
+ allowed_current_pairs:
2639
+ - reason: inferred_equivalence
2640
+ ownership_state: review_required
2641
+ - reason: inferred_equivalence
2642
+ ownership_state: project_governs_exact
2643
+ - reason: authority_unavailable
2644
+ ownership_state: authority_unavailable
2645
+ - reason: personal_input_unavailable
2646
+ ownership_state: authority_unavailable
2647
+ identity:
2648
+ field: caveat_id
2649
+ type: opaque_non_content_id
2650
+ alphabet: abcdefghijklmnopqrstuvwxyz
2651
+ length: 10
2652
+ pattern: "^[a-z]{10}$"
2653
+ rule: >-
2654
+ Assign a fresh opaque ID for a current caveat and carry it unchanged to
2655
+ its matching terminal event. The ID must not encode a term, meaning,
2656
+ anchor, path, provenance, or project identity.
2657
+ envelope:
2658
+ schema_version: agentera.glossaryConsumerCaveat.v1
2659
+ fields: [caveat_id, event, capability, reason, ownership_state, transition_id]
2660
+ additional_fields: forbidden
2661
+ max_string_utf8_bytes: 64
2662
+ events: [current, resolved, superseded]
2663
+ capabilities: [build]
2664
+ reasons: [inferred_equivalence, authority_unavailable, personal_input_unavailable]
2665
+ ownership_states: [project_governs_exact, review_required, authority_unavailable]
2666
+ transition_rule: >-
2667
+ current and resolved require null transition_id. Superseded requires one
2668
+ different opaque successor caveat_id. Every field is required; only
2669
+ transition_id may be null.
2670
+ current_append:
2671
+ caller_fields: [event, reason, ownership_state]
2672
+ caller_fixed_values:
2673
+ event: current
2674
+ writer_fields: [caveat_id, capability, transition_id]
2675
+ writer_fixed_values:
2676
+ capability: build
2677
+ transition_id: null
2678
+ rule: >-
2679
+ A current append requires the caller to submit event=current, reason,
2680
+ and ownership_state. The writer creates the opaque identity, Build
2681
+ capability, and null current-transition field; it never defaults event.
2682
+ lifecycle:
2683
+ current: >-
2684
+ Append current once when autonomous meaning-sensitive work cannot pause
2685
+ and review or authority remains unresolved.
2686
+ resolved: >-
2687
+ Append resolved with the same caveat_id after explicit clarification or
2688
+ a governed refresh proves the caveat no longer applies.
2689
+ superseded: >-
2690
+ Append superseded with the old caveat_id and the fresh successor ID as
2691
+ transition_id when a governed refresh replaces, rather than resolves,
2692
+ the caveat.
2693
+ matching_rule: >-
2694
+ The latest valid event for one caveat_id determines whether it is current.
2695
+ A terminal event affects only its matching identity. Supersession is valid
2696
+ only when a matching current successor event also exists.
2697
+ expiration: none
2698
+ expiration_rule: >-
2699
+ Time alone never resolves or hides a caveat. Only an explicit matching
2700
+ resolved or valid superseded transition makes it noncurrent.
2701
+ prime_projection:
2702
+ status: active
2703
+ runtime: packages/cli/src/state/progressGlossaryCaveat.ts#projectCurrentGlossaryCaveats
2704
+ retrieval: canonical_validated_progress_entities
2705
+ attention_text: "normal: glossary review required before meaning-sensitive work"
2706
+ max_attention_entries: 1
2707
+ source:
2708
+ artifact: progress
2709
+ boundary: progress_cycle
2710
+ capability: build
2711
+ capacity:
2712
+ public_attention_limit: 6
2713
+ reserved_glossary_slots: 1
2714
+ policy: reserve_final_slot_when_current
2715
+ unrelated_retention: first_five_in_existing_order
2716
+ insertion: reserved_final_slot_when_current
2717
+ rule: >-
2718
+ Reconstruct current caveats by opaque identity from validated canonical
2719
+ progress entities. A matching resolved event or valid superseded event
2720
+ removes only that identity. Invalid, orphan, mismatched, or duplicate
2721
+ terminal evidence is omitted and cannot suppress a valid current event.
2722
+ Emit at most the declared generic attention text when one or more current
2723
+ caveats remain; preserve the relative order of every unrelated attention
2724
+ entry and do not change next-action selection.
2725
+ expiration: none
2726
+ forbidden_sources:
2727
+ - timestamp
2728
+ - recency
2729
+ - plan_state
2730
+ - transient_plan_handoff
2731
+ - profile_presence
2732
+ - unrelated_progress
2733
+ forbidden_output:
2734
+ - caveat_id
2735
+ - transition_id
2736
+ - reason
2737
+ - ownership_state
2738
+ - definition
2739
+ - meaning
2740
+ - anchor
2741
+ - path
2742
+ - raw_section
2743
+ - provenance
2744
+ - source_bytes
2745
+ malformed_evidence:
2746
+ prime: omit
2747
+ direct_progress_retrieval: fail_closed_generic_corrupt_entity
2748
+ allowed_diagnostic: canonical progress evidence is corrupt; run state validation
2749
+ forbidden_diagnostic_content:
2750
+ [stored_filename, stored_path, parser_text, raw_value, raw_bytes, provenance]
2751
+ handoff:
2752
+ plan: >-
2753
+ Plan cannot write progress. In autonomous mode it emits at most one
2754
+ transient intent containing exactly event=current, reason, and
2755
+ ownership_state and stores no caveat or conflict in plan state. It never
2756
+ emits identity, capability, transition_id, or a purported complete or
2757
+ delivered durable envelope.
2758
+ discuss: >-
2759
+ Discuss pauses for clarification; it does not persist caveat evidence or
2760
+ turn review into decision approval.
2761
+ build: >-
2762
+ Build is the sole durable writer and may later pass all three emitted
2763
+ intent inputs to the typed progress writer. The writer preserves the
2764
+ caller-owned event, reason, and ownership_state and creates authoritative
2765
+ identity, capability, and transition_id fields. Advice never invokes
2766
+ glossary publication.
2767
+ publication_isolation:
2768
+ rule: >-
2769
+ Advice, tension, review, clarification, caveat publication, resolution, and
2770
+ supersession never invoke glossary publication, authorize a proposal, reuse
2771
+ confirmation, satisfy a decision, or approve plan state.
2772
+ project_publication_authority: ownership_contracts.project.publication
2773
+ downstream_gate:
2774
+ status: blocked_until_contract_valid
2775
+ validator: packages/cli/src/registries/glossaryEntryContract.ts#validateGlossaryEntryContract
2776
+ command: npx -y agentera@next check validate vocabularyAuthority --format json
2777
+ required_sections:
2778
+ - consumer_boundary.acquisition
2779
+ - consumer_boundary.advice_resolution
2780
+ - consumer_boundary.primary_selection
2781
+ - consumer_boundary.outcome_matrix
2782
+ - consumer_boundary.orthogonal_advisories
2783
+ - consumer_boundary.refresh_events
2784
+ - consumer_boundary.discuss_integration
2785
+ - consumer_boundary.plan_integration
2786
+ - consumer_boundary.disclosure
2787
+ - consumer_boundary.autonomous_caveat
2788
+ - consumer_boundary.publication_isolation
2789
+ failure_rule: >-
2790
+ Discuss, Plan, Build, advice, and prime integration remain blocked when
2791
+ validation reports a missing or contradictory section. Acquisition itself
2792
+ fails closed. Each issue names the invalid section and required correction.
2793
+ profile_grounding:
2794
+ implementation: active_exclusion_only
2795
+ capabilities: [discuss, plan, build]
2796
+ command: npx -y agentera@next report profile-grounding --format json
2797
+ schema_version: agentera.profileGrounding.v1
2798
+ parser: packages/cli/src/analytics/personalGlossaryProfile.ts#personalProfileGrounding
2799
+ max_profile_utf8_bytes: 65536
2800
+ validity:
2801
+ statuses: [absent, valid, repair_needed]
2802
+ classes: [absent, valid, malformed, ambiguous, unreadable, unsafe, oversized, invalid_utf8]
2803
+ freshness:
2804
+ states: [current, stale, unknown]
2805
+ rule: Freshness is computed only after one source passes validity and never changes validity.
2806
+ recovery:
2807
+ repair: >-
2808
+ Use the Profile capability to repair or regenerate PROFILE.md, then retry `npx -y agentera@next report profile-grounding --format json`; no profile bytes were changed.
2809
+ absent: >-
2810
+ Use the Profile capability to generate PROFILE.md, then retry npx -y agentera@next report profile-grounding --format json.
2811
+ raw_profile_read: forbidden
2812
+ content_rule: >-
2813
+ Return the complete profile with exactly the validated owned personal
2814
+ Glossary marker range removed. Preserve every byte outside that range.
2815
+ This is profile grounding only and performs no glossary lookup, project
2816
+ glossary read, precedence, matching, review, collision, or advisory work.
2817
+ Profile Full retains access to the complete stored profile for regeneration.
2818
+ failure_rule: >-
2819
+ Absent and repair-needed profiles return nonzero with the shared validity
2820
+ object, exact advancing recovery, unknown freshness, and no profile
2821
+ content. Oversized, unsafe, unreadable, invalid UTF-8, and malformed or
2822
+ ambiguous owned Glossary sources fail closed without path or byte leaks.
2823
+ exact_collision:
2824
+ behavior: project_precedence_at_consumption
2825
+ persistence: forbidden
2826
+ personal_entry_suppression: forbidden
2827
+ inferred_semantic_equivalence:
2828
+ behavior: user_review
2829
+ automatic_merge: forbidden
2830
+ suppression: forbidden
2831
+ precedence: forbidden
2832
+ rule: >-
2833
+ Audit remains mutation-free and Build project-glossary publication is active.
2834
+ Build, Discuss, Plan, and prime bounded glossary consumption are active, and
2835
+ Build progress caveat publication and explicit personal publication are active.
2836
+ Profile Full preserves an existing owned section, then uses only the current
2837
+ consent-bound personal generation and canonical authorized personal publication.
2838
+ Project-driven personal-profile mutation and docs-mapping mutation remain deferred.
2839
+
2840
+ deferred_capability_contracts:
2841
+ profile:
2842
+ capabilities: [profile]
2843
+ implementation: active_partial
2844
+ intended_behavior: personal_glossary_synthesis
2845
+ active_behavior:
2846
+ - ownership_contracts.personal.admission
2847
+ - personal_mining_authority.profile_full
2848
+ inactive_behavior: [lookup]
2849
+ contracts:
2850
+ admission: ownership_contracts.personal.input
2851
+ provenance: ownership_contracts.personal.allowed_provenance
2852
+ confidence: shared_primitive.fields.confidence
2853
+ retention_and_decay: ownership_contracts.personal.retention_and_decay
2854
+ profile_full: personal_mining_authority.profile_full
2855
+ forbidden_current_claims: [lookup, project_glossary_consumption]
2856
+ audit:
2857
+ capabilities: [audit]
2858
+ implementation: active_partial
2859
+ active_behavior: terminology_drift_finding_generation
2860
+ finding_family:
2861
+ status: implemented
2862
+ mutation: forbidden
2863
+ evidence: ownership_contracts.project.input
2864
+ confidence: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
2865
+ filtering: skills/agentera/capabilities/audit/schemas/validation.yaml
2866
+ canonical_proposal_rule: >-
2867
+ Propose the term with the most distinct verified project-file anchors;
2868
+ break ties lexicographically. A proposal is an audit finding, never a
2869
+ decision or persisted glossary entry.
2870
+ personal_comparison_rule: >-
2871
+ A supplied personal-profile term may annotate divergence for the same
2872
+ assessed concept. Missing profile evidence adds no divergence and never
2873
+ invents a personal term.
2874
+ proposal_output:
2875
+ implementation: active
2876
+ intended_output: read_only_terminology_drift_finding
2877
+ digest: ownership_contracts.project.proposal_digest
2878
+ inputs:
2879
+ personal_history: ownership_contracts.personal.input
2880
+ project_file: ownership_contracts.project.input
2881
+ project_file_history_classification: forbidden
2882
+ forbidden_current_claims: [persistence, approval, docs_mapping_mutation, lookup]
2883
+ build_publication:
2884
+ capabilities: [build]
2885
+ implementation: active
2886
+ active_behavior: ownership_contracts.project.publication
2887
+ output: skills/agentera/schemas/artifacts/glossary.yaml
2888
+ inactive_behavior:
2889
+ [
2890
+ lookup,
2891
+ precedence,
2892
+ semantic_equivalence_review,
2893
+ personal_profile_mutation,
2894
+ docs_mapping_mutation,
2895
+ ]
2896
+ forbidden_current_claims:
2897
+ [lookup, precedence, review, personal_profile_mutation, docs_mapping_mutation]
2898
+ consumers:
2899
+ capabilities: [discuss, plan, build, prime]
2900
+ implementation:
2901
+ build: active
2902
+ discuss: active
2903
+ plan: active
2904
+ prime: active
2905
+ behavior: consumer_boundary
2906
+ forbidden_current_claims: []