agentera 3.0.0-dev.32 → 3.0.0-dev.39

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 (196) hide show
  1. package/bundle/CHANGELOG.md +75 -5
  2. package/bundle/references/adapters/package-publication.json +43 -0
  3. package/bundle/references/adapters/package-surface-characterization.md +12 -0
  4. package/bundle/references/analysis/evidence-tier-authority.yaml +23 -21
  5. package/bundle/references/analysis/verification-policy.yaml +1 -0
  6. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +11 -2
  7. package/bundle/references/artifacts/glossary-entry-contract.yaml +1241 -0
  8. package/bundle/references/artifacts/state-storage-authority.yaml +149 -80
  9. package/bundle/references/cli/agent-ready-state-contract.yaml +84 -2
  10. package/bundle/references/cli/audience-namespace-cli-migration.yaml +12 -1
  11. package/bundle/references/cli/prime-consumer-compatibility.yaml +7 -1
  12. package/bundle/skills/agentera/SKILL.md +26 -26
  13. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +26 -8
  14. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +21 -4
  15. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +5 -4
  16. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +67 -3
  17. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +3 -2
  18. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +64 -0
  19. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +4 -1
  20. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +30 -0
  21. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +5 -2
  22. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +3 -2
  23. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +30 -0
  24. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  25. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +19 -4
  26. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +92 -0
  27. package/dist/analytics/extractCorpus/evidenceTiers.js +46 -3
  28. package/dist/analytics/extractCorpus/evidenceTiers.js.map +1 -1
  29. package/dist/analytics/extractCorpus/tierReader.js +1 -1
  30. package/dist/analytics/extractCorpus/tierReader.js.map +1 -1
  31. package/dist/analytics/glossaryAdviceResolution.js +167 -0
  32. package/dist/analytics/glossaryAdviceResolution.js.map +1 -0
  33. package/dist/analytics/glossaryInputAcquisition.js +320 -0
  34. package/dist/analytics/glossaryInputAcquisition.js.map +1 -0
  35. package/dist/analytics/personalGlossaryAdmission.js +134 -0
  36. package/dist/analytics/personalGlossaryAdmission.js.map +1 -0
  37. package/dist/analytics/personalGlossaryProfile.js +219 -0
  38. package/dist/analytics/personalGlossaryProfile.js.map +1 -0
  39. package/dist/audit/terminologyDrift.js +282 -0
  40. package/dist/audit/terminologyDrift.js.map +1 -0
  41. package/dist/capabilities/audit/instructions.js +2 -1
  42. package/dist/capabilities/audit/instructions.js.map +1 -1
  43. package/dist/capabilities/build/instructions.js +41 -2
  44. package/dist/capabilities/build/instructions.js.map +1 -1
  45. package/dist/capabilities/discuss/instructions.js +14 -1
  46. package/dist/capabilities/discuss/instructions.js.map +1 -1
  47. package/dist/capabilities/index.js +1 -1
  48. package/dist/capabilities/index.js.map +1 -1
  49. package/dist/capabilities/orchestrate/instructions.js +2 -2
  50. package/dist/capabilities/plan/instructions.js +19 -2
  51. package/dist/capabilities/plan/instructions.js.map +1 -1
  52. package/dist/capabilities/profile/instructions.js +67 -1
  53. package/dist/capabilities/profile/instructions.js.map +1 -1
  54. package/dist/cli/capabilityContext/bespoke.js +4 -3
  55. package/dist/cli/capabilityContext/bespoke.js.map +1 -1
  56. package/dist/cli/capabilityContext/build.js +77 -24
  57. package/dist/cli/capabilityContext/build.js.map +1 -1
  58. package/dist/cli/capabilityContext/closeout.js +2 -2
  59. package/dist/cli/capabilityContext/closeout.js.map +1 -1
  60. package/dist/cli/capabilityContext/evidence.js +2 -6
  61. package/dist/cli/capabilityContext/evidence.js.map +1 -1
  62. package/dist/cli/capabilityContext/planState.js +59 -78
  63. package/dist/cli/capabilityContext/planState.js.map +1 -1
  64. package/dist/cli/capabilityContext/projectVerification.js +410 -0
  65. package/dist/cli/capabilityContext/projectVerification.js.map +1 -0
  66. package/dist/cli/capabilityContext/startup.js +21 -4
  67. package/dist/cli/capabilityContext/startup.js.map +1 -1
  68. package/dist/cli/commands/glossaryAdvice.js +139 -0
  69. package/dist/cli/commands/glossaryAdvice.js.map +1 -0
  70. package/dist/cli/commands/personalGlossary.js +177 -0
  71. package/dist/cli/commands/personalGlossary.js.map +1 -0
  72. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  73. package/dist/cli/commands/prime/buildExecutionRequest.js.map +1 -0
  74. package/dist/cli/commands/prime/collectEntityOrientation.js +18 -2
  75. package/dist/cli/commands/prime/collectEntityOrientation.js.map +1 -1
  76. package/dist/cli/commands/prime/collectOrientationState.js +7 -1
  77. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
  78. package/dist/cli/commands/prime/orientationOutput.js +12 -2
  79. package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
  80. package/dist/cli/commands/prime.js +37 -2
  81. package/dist/cli/commands/prime.js.map +1 -1
  82. package/dist/cli/commands/profileGrounding.js +77 -0
  83. package/dist/cli/commands/profileGrounding.js.map +1 -0
  84. package/dist/cli/commands/query.js +14 -4
  85. package/dist/cli/commands/query.js.map +1 -1
  86. package/dist/cli/commands/schema.js +10 -0
  87. package/dist/cli/commands/schema.js.map +1 -1
  88. package/dist/cli/commands/state/write.js +4 -1
  89. package/dist/cli/commands/state/write.js.map +1 -1
  90. package/dist/cli/dispatch/lifecycle.js +45 -0
  91. package/dist/cli/dispatch/lifecycle.js.map +1 -1
  92. package/dist/cli/dispatch/prime.js +22 -1
  93. package/dist/cli/dispatch/prime.js.map +1 -1
  94. package/dist/cli/dispatch/shared.js +1 -1
  95. package/dist/cli/dispatch/shared.js.map +1 -1
  96. package/dist/cli/help.js +23 -1
  97. package/dist/cli/help.js.map +1 -1
  98. package/dist/cli/migrationRequired.js +2 -0
  99. package/dist/cli/migrationRequired.js.map +1 -1
  100. package/dist/cli/orientation/attention.js +3 -1
  101. package/dist/cli/orientation/attention.js.map +1 -1
  102. package/dist/cli/orientation.js +2 -2
  103. package/dist/cli/orientation.js.map +1 -1
  104. package/dist/registries/artifactProtocolIds.js +2 -0
  105. package/dist/registries/artifactProtocolIds.js.map +1 -1
  106. package/dist/registries/artifactRegistry.js +2 -0
  107. package/dist/registries/artifactRegistry.js.map +1 -1
  108. package/dist/registries/evidenceTierContract.js +26 -16
  109. package/dist/registries/evidenceTierContract.js.map +1 -1
  110. package/dist/registries/glossaryAdviceContract.js +79 -0
  111. package/dist/registries/glossaryAdviceContract.js.map +1 -0
  112. package/dist/registries/glossaryCaveatContract.js +68 -0
  113. package/dist/registries/glossaryCaveatContract.js.map +1 -0
  114. package/dist/registries/glossaryConsumerContractValidation.js +792 -0
  115. package/dist/registries/glossaryConsumerContractValidation.js.map +1 -0
  116. package/dist/registries/glossaryEntryContract.js +747 -0
  117. package/dist/registries/glossaryEntryContract.js.map +1 -0
  118. package/dist/registries/glossaryTermIdentity.js +18 -0
  119. package/dist/registries/glossaryTermIdentity.js.map +1 -0
  120. package/dist/registries/glossaryTermOccurrence.js +21 -0
  121. package/dist/registries/glossaryTermOccurrence.js.map +1 -0
  122. package/dist/state/changelog.js +222 -0
  123. package/dist/state/changelog.js.map +1 -0
  124. package/dist/state/decisionEntities.js +18 -11
  125. package/dist/state/decisionEntities.js.map +1 -1
  126. package/dist/state/decisionMigrationProvenance.js +84 -1
  127. package/dist/state/decisionMigrationProvenance.js.map +1 -1
  128. package/dist/state/decisionOverlay.js +9 -32
  129. package/dist/state/decisionOverlay.js.map +1 -1
  130. package/dist/state/decisionRevision.js +69 -444
  131. package/dist/state/decisionRevision.js.map +1 -1
  132. package/dist/state/decisionRevisionMigration.js +90 -0
  133. package/dist/state/decisionRevisionMigration.js.map +1 -0
  134. package/dist/state/directRetrieval.js +3 -52
  135. package/dist/state/directRetrieval.js.map +1 -1
  136. package/dist/state/entityCutover.js +6 -6
  137. package/dist/state/entityCutover.js.map +1 -1
  138. package/dist/state/entityGlossaryAuthority.js +14 -0
  139. package/dist/state/entityGlossaryAuthority.js.map +1 -0
  140. package/dist/state/entityMigrationIdentity.js +6 -0
  141. package/dist/state/entityMigrationIdentity.js.map +1 -0
  142. package/dist/state/entityMigrationPreview.js +14 -23
  143. package/dist/state/entityMigrationPreview.js.map +1 -1
  144. package/dist/state/entityPublicationContext.js +374 -71
  145. package/dist/state/entityPublicationContext.js.map +1 -1
  146. package/dist/state/entityStorage.js +45 -29
  147. package/dist/state/entityStorage.js.map +1 -1
  148. package/dist/state/healthEntities.js +2 -4
  149. package/dist/state/healthEntities.js.map +1 -1
  150. package/dist/state/listRetrieval.js +7 -38
  151. package/dist/state/listRetrieval.js.map +1 -1
  152. package/dist/state/migrationSourceBinding.js +1 -1
  153. package/dist/state/migrationSourceBinding.js.map +1 -1
  154. package/dist/state/objectiveExperimentEntities.js +9 -9
  155. package/dist/state/objectiveExperimentEntities.js.map +1 -1
  156. package/dist/state/planEntities.js +57 -16
  157. package/dist/state/planEntities.js.map +1 -1
  158. package/dist/state/progressEntities.js +177 -39
  159. package/dist/state/progressEntities.js.map +1 -1
  160. package/dist/state/progressGlossaryCaveat.js +169 -0
  161. package/dist/state/progressGlossaryCaveat.js.map +1 -0
  162. package/dist/state/progressPublicationOrder.js +20 -0
  163. package/dist/state/progressPublicationOrder.js.map +1 -0
  164. package/dist/state/safeProjectFile.js +4 -1
  165. package/dist/state/safeProjectFile.js.map +1 -1
  166. package/dist/state/startupProjection.js +2 -70
  167. package/dist/state/startupProjection.js.map +1 -1
  168. package/dist/state/stateStorageAuthority.js +48 -0
  169. package/dist/state/stateStorageAuthority.js.map +1 -0
  170. package/dist/state/summarySourceRowAuthority.js +1 -1
  171. package/dist/state/summarySourceRowAuthority.js.map +1 -1
  172. package/dist/state/todoDocsEntities.js +8 -9
  173. package/dist/state/todoDocsEntities.js.map +1 -1
  174. package/dist/state/write/explain.js +101 -92
  175. package/dist/state/write/explain.js.map +1 -1
  176. package/dist/state/write/glossaryPublication.js +264 -0
  177. package/dist/state/write/glossaryPublication.js.map +1 -0
  178. package/dist/state/write/index.js +1 -0
  179. package/dist/state/write/index.js.map +1 -1
  180. package/dist/state/write/operations.js +25 -27
  181. package/dist/state/write/operations.js.map +1 -1
  182. package/dist/state/write/planEvaluation.js +6 -2
  183. package/dist/state/write/planEvaluation.js.map +1 -1
  184. package/dist/state/write/transaction.js +7 -4
  185. package/dist/state/write/transaction.js.map +1 -1
  186. package/dist/upgrade/upgradeOrchestrator.js +15 -10
  187. package/dist/upgrade/upgradeOrchestrator.js.map +1 -1
  188. package/dist/validate/crossCapability.js +3 -0
  189. package/dist/validate/crossCapability.js.map +1 -1
  190. package/dist/validate/v1LegacyCruft.js +141 -0
  191. package/dist/validate/v1LegacyCruft.js.map +1 -0
  192. package/dist/validate/vocabularyAuthority.js +2 -0
  193. package/dist/validate/vocabularyAuthority.js.map +1 -1
  194. package/package.json +4 -3
  195. package/dist/state/decisionRevisionPublication.js +0 -532
  196. package/dist/state/decisionRevisionPublication.js.map +0 -1
@@ -0,0 +1,1241 @@
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
+ provenance_variants:
61
+ personal_explicit_definition:
62
+ owner: personal
63
+ evidence_count: 1
64
+ required_evidence_fields: [source_id, evidence_anchor, signal_type]
65
+ additional_evidence_fields: forbidden
66
+ allowed_signal_types: [correction, decision, instruction]
67
+ resolution_rule: >-
68
+ evidence_anchor resolves to source_id of exactly one retained
69
+ full-evidence shard through the bounded signal tier. One such distinct
70
+ retained record is sufficient; unanchored or unresolved evidence fails.
71
+ personal_inferred_usage:
72
+ owner: personal
73
+ evidence_count: 2
74
+ required_evidence_fields: [source_id, evidence_anchor, source_kind]
75
+ additional_evidence_fields: forbidden
76
+ allowed_source_kinds: [instruction_document, project_config_signal]
77
+ resolution_rule: >-
78
+ Each evidence_anchor resolves to its source_id in retained full evidence.
79
+ Both source_id and evidence_anchor must be pairwise distinct, so two
80
+ signals or anchors resolving to one retained record fail. Both anchors
81
+ remain exposed on the entry.
82
+ project_file:
83
+ owner: project
84
+ evidence_count: 1
85
+ required_evidence_fields: [source_path, source_record_sha256]
86
+ additional_evidence_fields: forbidden
87
+ resolution_rule: >-
88
+ source_path is a safe project-relative path and source_record_sha256 is
89
+ the lowercase SHA-256 of the cited parsed source record. These reuse the
90
+ repository source-path and record-digest provenance vocabulary from
91
+ references/artifacts/state-storage-authority.yaml.
92
+
93
+ ownership_contracts:
94
+ personal:
95
+ scope: user
96
+ implementation:
97
+ status: active_partial
98
+ active:
99
+ - bounded_admission
100
+ - explicit_classification
101
+ - inferred_evidence_check
102
+ - profile_full_rendering
103
+ - profile_persistence
104
+ inactive: [lookup]
105
+ allowed_provenance:
106
+ - personal_explicit_definition
107
+ - personal_inferred_usage
108
+ input:
109
+ tier: signal
110
+ authority: references/analysis/evidence-tier-authority.yaml
111
+ bounded_rule: >-
112
+ Admit only bounded personal-history signals and resolve qualifying
113
+ evidence one anchor at a time to retained full-evidence shards. Never
114
+ scan unbounded history or load a monolithic corpus.
115
+ excluded_categories:
116
+ - project_glossary_artifact_identity
117
+ - project_glossary_path
118
+ - project_glossary_record
119
+ - project_file_provenance
120
+ admission:
121
+ explicit:
122
+ candidate_signal_types: [correction, decision]
123
+ language_rule: >-
124
+ Admit only a quoted or code-delimited term followed by explicit
125
+ `means` language, or clarification language that combines `to clarify`
126
+ with `prefer` and `to mean`. The classifier returns the stated term
127
+ and meaning; unrelated correction or decision language abstains.
128
+ evidence_count: 1
129
+ inferred:
130
+ candidate_signal_types: [instruction, configuration]
131
+ source_kinds: [instruction_document, project_config_signal]
132
+ identity_rule: >-
133
+ A requested term must occur as a complete case-insensitive token in
134
+ two pairwise-distinct retained source identities and anchors. Duplicate
135
+ identities or anchors fail and successful admission exposes both.
136
+ evidence_count: 2
137
+ read_rule: >-
138
+ Read the bounded signal tier once, select only authority-declared signal
139
+ types and source kinds, and resolve each selected evidence_anchor through
140
+ direct single-shard retrieval. Never iterate full history or read legacy
141
+ corpus.json. Missing, legacy, corrupt, or insufficient evidence returns
142
+ deterministic recovery without a candidate.
143
+ insufficient_recovery: >-
144
+ Refresh bounded local-history evidence or provide another distinct
145
+ qualifying record; no personal glossary candidate was admitted.
146
+ isolation_rule: >-
147
+ Admission accepts only the personal tiers directory and optional legacy
148
+ corpus location. It has no project-glossary identity, path, or record
149
+ input, and its result is invariant to project-glossary presence.
150
+ retention_and_decay:
151
+ retention: Retained entries decay rather than disappearing solely because evidence ages.
152
+ confidence: Apply the existing profile permanence decay class to integer confidence.
153
+ permanence: Remains independently classified and is not changed by evidence age or confidence decay.
154
+ authority: packages/cli/src/capabilities/profile/instructions.ts#Profile-format
155
+ profile_output:
156
+ owner: profile_full
157
+ lifecycle_callable: packages/cli/src/analytics/personalGlossaryProfile.ts#updatePersonalGlossaryProfile
158
+ command:
159
+ canonical: agentera report profile-glossary
160
+ namespace: report
161
+ input_flag: --input
162
+ stdin_value: "-"
163
+ format: json
164
+ dry_run_flag: --dry-run
165
+ project_checkout: not_required
166
+ request:
167
+ schema_version: agentera.personalGlossaryUpdateRequest.v1
168
+ required_fields: [schema_version, profile_path, as_of, fresh_entries, retained_history]
169
+ additional_fields: forbidden
170
+ profile_path_rule: >-
171
+ Pass exactly profile_context.profile.path returned by
172
+ agentera prime --context profile --format json. The command never
173
+ discovers a profile, project root, or project glossary.
174
+ retained_history_shape: >-
175
+ A list of source_id, evidence_anchor, source_kind, and signal_type
176
+ records sufficient to validate fresh admitted entries. It may be
177
+ empty when regeneration supplies no fresh entries because retained
178
+ entries carry persisted provenance.
179
+ output_statuses: [changed, unchanged_replay, dry_run_candidate]
180
+ rule: >-
181
+ The packaged headless command validates the complete request before
182
+ effects and invokes the lifecycle_callable without duplicating merge,
183
+ decay, replacement, or persistence behavior. JSON is written to
184
+ stdout; diagnostics use the shared invalid-input envelope. Dry-run
185
+ computes the candidate without writing PROFILE.md.
186
+ section:
187
+ heading: "## Glossary"
188
+ start_marker: "<!-- agentera:personal-glossary:start -->"
189
+ end_marker: "<!-- agentera:personal-glossary:end -->"
190
+ encoding: deterministic_json_fence
191
+ document_schema_version: agentera.personalGlossarySection.v1
192
+ entry_shape: shared_primitive
193
+ lifecycle_metadata: [as_of, confidence_basis]
194
+ boundary_rule: >-
195
+ Add one owned section when absent or replace exactly the bytes from its
196
+ start marker through its end marker. Reject unmatched markers,
197
+ duplicate owned sections, or an unowned Glossary heading before any
198
+ write. Preserve every other profile byte exactly.
199
+ merge_identity:
200
+ normalization: unicode_caseless_exact_no_normalization
201
+ rule: >-
202
+ One locale-independent Unicode caseless-exact term identity may occur
203
+ once. Identity performs no Unicode normalization, accent folding, or
204
+ compatibility folding; canonically distinct strings remain distinct.
205
+ Preserve the established spelling and observed_at date. Fresh
206
+ qualifying evidence may refresh an entry only when meaning and
207
+ provenance kind are unchanged; divergent meaning or provenance kind is
208
+ a conflict rather than an implicit overwrite.
209
+ refresh_rule: >-
210
+ For matching fresh qualifying evidence, set confidence and its
211
+ confidence_basis to the fresh evidence-based integer, replace only the
212
+ same-kind personal evidence anchors, and set last_confirmed_at to the
213
+ injected as_of date. Preserve observed_at and permanence. This rule is
214
+ stable for identical input and as_of.
215
+ decay_rule: >-
216
+ Without matching fresh evidence, retain the entry and permanence. Derive
217
+ confidence from its unchanged confidence_basis, its permanence-class
218
+ lambda, and calendar days from last_confirmed_at to injected as_of using
219
+ the Profile formula; round to the nearest integer after applying the
220
+ existing floor. The section-level basis prevents same-date drift and
221
+ repeated compounding from already-decayed confidence. Age alone never
222
+ removes an entry.
223
+ isolation_rule: >-
224
+ The command and callable accept only a PROFILE.md path, fresh personal
225
+ entries, retained personal-history evidence, and an injected ISO date.
226
+ They have no project root, project glossary parameter, artifact lookup,
227
+ or project file read.
228
+ project:
229
+ scope: repository
230
+ implementation:
231
+ status: active
232
+ active: [audit_proposal_digest, build_publication, confirmed_variant_guard]
233
+ inactive: [lookup, precedence, semantic_equivalence_review]
234
+ allowed_provenance: [project_file]
235
+ input:
236
+ authority: repository_files
237
+ bounded_rule: Admit only the cited project-relative record bound by its record SHA-256.
238
+ excluded_categories: [personal_history_record, personal_history_anchor]
239
+ proposal_digest:
240
+ algorithm: sha256
241
+ encoding: lowercase_hex
242
+ canonicalization: >-
243
+ Hash the complete terminology finding except proposal_digest as canonical
244
+ JSON with mapping keys sorted recursively. Sort canonical_evidence and
245
+ each variant evidence by source_path, line, then source_record_sha256;
246
+ sort variants by case-insensitive term and then exact term. The digest
247
+ therefore changes when any proposal, confidence, severity, divergence,
248
+ term, source path, line identity, or source-record digest changes, but not
249
+ when equivalent evidence or variant arrays arrive in a different order.
250
+ Locale-independent lowercase ordering is only a deterministic sort key;
251
+ it does not define term identity.
252
+ proposal_validation:
253
+ owner: audit
254
+ shared_runtime: packages/cli/src/audit/terminologyDrift.ts#validateTerminologyProposal
255
+ required_rules:
256
+ - safe_distinct_evidence_identities_per_term
257
+ - unicode_caseless_exact_unique_term_identities
258
+ - best_supported_canonical_term_with_lexicographic_tie_break
259
+ - authority_confidence_floor_and_range
260
+ - confidence_below_70_forces_info_severity
261
+ - canonical_evidence_and_variant_order
262
+ - canonical_proposal_digest
263
+ publication_rule: >-
264
+ Build publication accepts only the complete canonical finding that this
265
+ Audit-owned validator can emit. Publication reuses this validator and
266
+ must not duplicate or weaken Audit proposal semantics.
267
+ entry_derivation:
268
+ term: proposal.proposed_canonical_term
269
+ meaning: proposal.concept
270
+ confidence: proposal.confidence
271
+ permanence: stable
272
+ temporal.observed_at: confirmation.confirmed_at calendar date
273
+ temporal.last_confirmed_at: confirmation.confirmed_at calendar date
274
+ provenance.kind: project_file
275
+ provenance.evidence: >-
276
+ Exactly the first canonical_evidence record after proposal-digest
277
+ canonical ordering, projected to source_path and source_record_sha256.
278
+ Line identifies and revalidates the source record during publication but
279
+ is not persisted because it is not part of the shared project_file
280
+ provenance variant.
281
+ rejection_rule: >-
282
+ Reject before effects when any required proposal or derived entry value
283
+ is absent or invalid; never invent a field or extend the shared entry.
284
+ publication:
285
+ owner: build
286
+ command: agentera state glossary publish --input REQUEST --format json
287
+ request:
288
+ schema_version: agentera.glossaryPublicationRequest.v1
289
+ required_fields: [schema_version, proposal, confirmation]
290
+ additional_fields: forbidden
291
+ proposal_shape: complete_terminology_drift_finding_with_proposal_digest
292
+ confirmation:
293
+ required_fields: [proposal_digest, confirmed_by, confirmed_at]
294
+ additional_fields: forbidden
295
+ confirmed_by: user
296
+ confirmed_at: iso_8601_timestamp
297
+ binding: >-
298
+ proposal_digest must equal the digest recomputed from proposal and
299
+ therefore binds the exact finding, every cited source record, and
300
+ the user's timestamped confirmation.
301
+ persisted_document:
302
+ schema_version: agentera.projectGlossary.v1
303
+ required_fields: [schema_version, approvals, entries]
304
+ additional_fields: forbidden
305
+ approvals:
306
+ type: list
307
+ immutable_record_fields: [proposal_digest, proposal, confirmation]
308
+ additional_record_fields: forbidden
309
+ entries:
310
+ type: list
311
+ item: shared_primitive
312
+ approval_fields: forbidden
313
+ terminology_set_identity:
314
+ normalization: unicode_caseless_exact_no_normalization
315
+ members: [paired_entry.term, paired_approval.proposal.variants.term]
316
+ uniqueness: global_across_complete_document
317
+ rule: >-
318
+ Every Unicode caseless-exact canonical or variant term belongs to
319
+ exactly one approval-entry pair. Identity performs no Unicode
320
+ normalization, accent folding, or compatibility folding. Reject
321
+ duplicate variants and every cross-set canonical/variant collision
322
+ before effects. An exact replay compares against its existing pair
323
+ and remains a no-op.
324
+ transaction: >-
325
+ Under the established project writer lock, resolve the registered
326
+ project path, safely re-read every cited project-relative source line,
327
+ recompute its SHA-256 and the proposal digest, validate the complete
328
+ candidate bytes, then atomically replace the single glossary document.
329
+ Creation follows the same path. Dry-run performs all validation without
330
+ publication.
331
+ merge_and_replay: >-
332
+ Preserve unrelated valid approvals and entries semantically unchanged.
333
+ Canonical and variant identity is case-insensitive and globally unique
334
+ across confirmed canonical sets. An exact approval and derived-entry
335
+ replay is a no-op. An approval without its matching entry, a matching
336
+ term with changed entry or proposal, reuse of an old confirmation for
337
+ changed proposal content, duplicate identity, cross-set terminology
338
+ collision, or malformed existing state is a conflict and must never be
339
+ repaired or overwritten implicitly.
340
+ confirmed_variant_guard:
341
+ owner: packages/cli/src/validate/v1LegacyCruft.ts#scanPost30CruftViolations
342
+ validation_surface: packages/cli/test/cli/v1LegacyCruft.test.ts
343
+ loader: packages/cli/src/state/write/glossaryPublication.ts#loadProjectGlossaryDocument
344
+ source_rule: >-
345
+ Resolve the glossary through the canonical artifact registry and consume
346
+ only complete validated approval-entry pairs. Derive each forbidden
347
+ variant from approval.proposal.variants and its canonical replacement
348
+ from the paired entry.term; never infer equivalence or consume personal
349
+ glossary state.
350
+ matching: exact_case_sensitive_boundary_aware_literal
351
+ approved_evidence_rule: >-
352
+ The exact source_path, line, and source_record_sha256 retained by the
353
+ immutable proposal is historical evidence and does not self-trigger.
354
+ Changed bytes at that location or a matching variant elsewhere fail.
355
+ exclusions:
356
+ - generated_output
357
+ - vendor_and_dependency_state
358
+ - cache_state
359
+ - repository_metadata
360
+ - historical_agentera_state
361
+ - project_glossary_document
362
+ - unrelated_agentera_state
363
+ excluded_directory_names:
364
+ - .agentera
365
+ - .agentera-generated
366
+ - .cache
367
+ - .git
368
+ - .next
369
+ - .pnpm
370
+ - .turbo
371
+ - .venv
372
+ - .vite
373
+ - build
374
+ - bundle
375
+ - coverage
376
+ - dist
377
+ - node_modules
378
+ - target
379
+ - vendor
380
+ exclusion_rule: >-
381
+ Skip a directory only when its basename exactly equals one declared
382
+ name. The validator and fixtures consume this list directly; prefixes,
383
+ suffixes, substrings, and nearby ordinary source names remain scanned.
384
+ failure_rule: >-
385
+ Emit one deterministic violation per variant location with the canonical
386
+ term, confirmed proposal evidence, offending source location, and the
387
+ runnable validation command. A malformed present glossary fails closed;
388
+ an absent glossary leaves the pre-existing legacy checks unchanged.
389
+
390
+ consumer_boundary:
391
+ contract_status: active
392
+ implementation:
393
+ acquisition: active
394
+ advice_resolution: active
395
+ capability_integrations:
396
+ build: active
397
+ discuss: active
398
+ plan: active
399
+ prime: active
400
+ forbidden_persisted_entry_fields: [precedence, collision, review]
401
+ deterministic_judgments:
402
+ term_identity: unicode_caseless_exact_no_normalization
403
+ term_identity_runtime: packages/cli/src/registries/glossaryTermIdentity.ts#unicodeCaselessExact
404
+ meaning_identity: exact_string
405
+ project_state_validity: schema_and_bound_validation
406
+ project_gap: valid_project_state_without_exact_term_identity
407
+ forbidden_semantic_heuristics: [scores, thresholds, embeddings, automatic_merge]
408
+ host_reviewed_judgments:
409
+ inferred_semantic_equivalence: >-
410
+ The host may identify a possible equivalence only from the current
411
+ meaning-sensitive input and bounded candidate meanings. It never selects
412
+ authority, merges entries, or resolves the review itself.
413
+ project_state:
414
+ gap_proving_states: [canonically_absent, valid_empty, valid_nonmatching]
415
+ invalid_states: [malformed, unreadable, ambiguous_path, over_bound]
416
+ invalid_rule: >-
417
+ An invalid project state cannot prove a project gap. Abstain rather than
418
+ falling back to a personal meaning, repairing state, or guessing authority.
419
+ acquisition:
420
+ implementation: active
421
+ runtime: packages/cli/src/analytics/glossaryInputAcquisition.ts#acquireGlossaryInputs
422
+ mutation: forbidden
423
+ bounds:
424
+ authority: consumer_boundary.profile_grounding.max_profile_utf8_bytes
425
+ max_source_utf8_bytes: 65536
426
+ max_entries: 100
427
+ rule: >-
428
+ Apply the existing bounded profile-read byte ceiling to each source and
429
+ admit at most 100 entries from either owned glossary. The entry ceiling
430
+ is declared only here and consumed by the runtime and schema validator.
431
+ Reject raw bytes above the source ceiling before decoding, decode UTF-8
432
+ fatally, and reject a parsed document above the entry ceiling; never
433
+ replacement-decode, truncate, or partially admit input. Exactly 65,536
434
+ raw bytes and 100 entries are permitted.
435
+ availability:
436
+ states:
437
+ - absent
438
+ - valid_empty
439
+ - valid_present
440
+ - malformed
441
+ - unreadable
442
+ - ambiguous
443
+ - over_bound
444
+ valid: [absent, valid_empty, valid_present]
445
+ invalid: [malformed, unreadable, ambiguous, over_bound]
446
+ project_gap_proving: [absent, valid_empty]
447
+ rule: >-
448
+ Classify the two sources independently. Project absence means the
449
+ canonical artifact does not exist; personal absence means PROFILE.md or
450
+ its owned Glossary section does not exist. A present empty owned document
451
+ is valid_empty. Invalid states expose no entries and cannot prove a
452
+ project gap. Dual invalid or absent input exposes no glossary entries;
453
+ valid project entries remain available when personal input is invalid.
454
+ project:
455
+ identity: glossary
456
+ discovery: packages/cli/src/registries/artifactRegistry.ts#loadArtifactRecord
457
+ path_resolution: packages/cli/src/registries/artifactRegistry.ts#resolveArtifactPath
458
+ docs_override: canonical_GLOSSARY.md_mapping_only
459
+ docs_override_read: bounded_no_follow_regular_file
460
+ project_root: packages/cli/src/state/projectRoot.ts#validateRealProjectRoot
461
+ boundary_rule: >-
462
+ Resolve only the registered glossary identity and its canonical docs
463
+ override under one validated real project root. Missing canonical
464
+ artifacts are absent. Unsafe overrides, path escapes, symlink ambiguity,
465
+ or unavailable registry identity classify ambiguous; malformed present
466
+ docs mappings or glossary documents fail closed and never fall back to a
467
+ default path.
468
+ filesystem_guarantee: >-
469
+ Open the canonical .agentera/docs.yaml and resolved glossary target with
470
+ O_NOFOLLOW after lstat snapshots of every existing project-relative path
471
+ component. Match the opened regular-file descriptor to the snapshotted
472
+ device and inode, read raw bytes from that descriptor, and require its
473
+ size, mtime, ctime, device, and inode plus every snapshotted parent path
474
+ identity to remain unchanged through the read. For an absent target,
475
+ require the first missing component to remain missing while all existing
476
+ parent identities remain unchanged. The descriptor pins accepted bytes;
477
+ a symlink, parent swap, changed identity, unsupported no-follow boundary,
478
+ or failed stability check is ambiguous. This does not claim detection of
479
+ an identity swapped away and restored between observations, because such
480
+ a swap cannot change bytes already pinned to the verified descriptor.
481
+ external_docs_rule: >-
482
+ A symlinked, escaped, changed, unreadable, malformed, over-bound, or
483
+ non-UTF-8 docs mapping is ambiguous and never selects a glossary target.
484
+ document_validation: ownership_contracts.project.publication
485
+ approval_output: forbidden
486
+ raw_source_provenance_output: forbidden
487
+ personal:
488
+ owner: ownership_contracts.personal.profile_output.owner
489
+ profile_path_input: >-
490
+ The caller passes exactly the profile path already returned by canonical
491
+ profile context. Acquisition does not discover or return that path and
492
+ accepts no project identity, root, glossary path, or project record.
493
+ section: ownership_contracts.personal.profile_output.section
494
+ parser: packages/cli/src/analytics/personalGlossaryProfile.ts#personalGlossaryConsumerEntries
495
+ grounding_parser_isolation: >-
496
+ profile-grounding continues to remove the owned section and never
497
+ exposes it. Consumer acquisition separately parses exactly the existing
498
+ single owned marker range and returns no bytes outside that range.
499
+ provenance_output: forbidden
500
+ producer_invariance: >-
501
+ Personal parsing accepts only profile bytes and therefore returns the
502
+ same result regardless of project glossary presence.
503
+ output:
504
+ entry_fields: [term, meaning, owner]
505
+ owners: [personal, project]
506
+ source_fields: [owner, availability, entries, gap_proving, diagnostic]
507
+ diagnostic_fields: [class, recovery]
508
+ diagnostic_rule: >-
509
+ Diagnostics name only the availability class and a public recovery.
510
+ They never contain profile paths, artifact paths, raw bytes, sections,
511
+ definitions, entries, anchors, approval records, or provenance.
512
+ entry_rule: >-
513
+ Return only validated term and meaning plus source ownership. Do not
514
+ return confidence, permanence, temporal metadata, personal anchors,
515
+ profile paths, unrelated profile sections, project approval records, or
516
+ project source provenance. Acquisition does not select precedence,
517
+ fallback, tension, review, or a primary outcome.
518
+ advice_resolution:
519
+ implementation: active
520
+ runtime: packages/cli/src/analytics/glossaryAdviceResolution.ts#resolveGlossaryAdvice
521
+ mutation: forbidden
522
+ invocation:
523
+ command: agentera report glossary-advice --input REQUEST --format json
524
+ request_schema_version: agentera.glossaryAdviceRequest.v1
525
+ request_fields: [schema_version, requested_term, host_review]
526
+ max_request_utf8_bytes: 131072
527
+ acquisition: internal_bounded_owned_sources
528
+ project_root: current_working_directory
529
+ profile_path: canonical_registry_resolution
530
+ output_envelope_fields: [schemaVersion, command, status, advice]
531
+ rule: >-
532
+ Consumers send the requested term and optional host review through one
533
+ structured stdin or file request. The CLI acquires both owned sources;
534
+ callers never read raw project glossary or profile files. The command is
535
+ read-only, headless, JSON-only, and never refreshes either source.
536
+ input:
537
+ fields: [requested_term, acquired, host_review]
538
+ requested_term_utf8_bound: consumer_boundary.acquisition.bounds.max_source_utf8_bytes
539
+ acquired_contract: consumer_boundary.acquisition.output
540
+ host_review:
541
+ optional: true
542
+ fields: [relation, candidate_owner, candidate_term]
543
+ relations: [inferred_equivalence]
544
+ candidate_owners: [personal]
545
+ rule: >-
546
+ A host may report only one explicit inferred-equivalence relation to
547
+ one differently named, valid acquired personal candidate. Omission
548
+ means no inferred candidate. Unknown relations, owners, fields, or
549
+ candidates fail before selection and never echo input content.
550
+ additional_fields: forbidden
551
+ output:
552
+ schema_version: agentera.glossaryAdvice.v1
553
+ fields: [outcome, applicable_meaning, applicable_owner, review, tension, advisory]
554
+ owners: [personal, project]
555
+ advisory_fields: [reason, ownership_state]
556
+ advisory_reasons: [personal_input_unavailable, inferred_equivalence]
557
+ advisory_ownership_states: [project_governs_exact]
558
+ rule: >-
559
+ Return exactly one matrix outcome and its authority-declared semantics.
560
+ Include only the selected meaning and owner. An orthogonal advisory may
561
+ expose only its bounded reason and ownership state. Never return the
562
+ requested or candidate term, acquisition diagnostics, source content,
563
+ paths, anchors, approvals, provenance, unrelated entries, or conflict
564
+ state.
565
+ failure:
566
+ classes: [invalid_request, invalid_acquisition, invalid_host_review]
567
+ rule: >-
568
+ Fail once before selection with only a bounded class and public recovery;
569
+ never quote or serialize an input term, meaning, diagnostic, path, raw
570
+ entry, profile or project content, approval, anchor, or provenance.
571
+ primary_selection:
572
+ dimensions:
573
+ project_input: [invalid, valid_gap, valid_exact]
574
+ personal_input: [invalid, valid_without_exact, valid_exact]
575
+ exact_meaning: [not_applicable, equivalent, divergent]
576
+ inferred_candidate: [absent, present]
577
+ valid_state_rule: >-
578
+ exact_meaning is equivalent or divergent exactly when both inputs have an
579
+ exact term; otherwise it is not_applicable. inferred_candidate is
580
+ considered only when no personal exact term exists.
581
+ order:
582
+ - invalid_or_unavailable_project
583
+ - equivalent_exact_collision
584
+ - divergent_exact_collision
585
+ - project_only
586
+ - proven_project_gap
587
+ - inferred_equivalence
588
+ - invalid_or_unavailable_personal
589
+ - no_applicable_entry
590
+ rule: >-
591
+ Evaluate rows in this order and select exactly the first matching primary
592
+ outcome. The declared valid input state space must match exactly one row;
593
+ availability and inferred-equivalence advisories never compete with a
594
+ usable exact project meaning.
595
+ outcome_matrix:
596
+ invalid_or_unavailable_project:
597
+ when: project input is malformed, unreadable, ambiguous, or over bound
598
+ match:
599
+ project_input: [invalid]
600
+ personal_input: [invalid, valid_without_exact, valid_exact]
601
+ exact_meaning: [not_applicable]
602
+ inferred_candidate: [absent, present]
603
+ judgment: deterministic
604
+ selected_owner: none
605
+ selected_meaning: none
606
+ review: unavailable
607
+ tension: authority_unavailable
608
+ equivalent_exact_collision:
609
+ when: valid personal and project entries have exact term identity and exact meaning identity
610
+ match:
611
+ project_input: [valid_exact]
612
+ personal_input: [valid_exact]
613
+ exact_meaning: [equivalent]
614
+ inferred_candidate: [absent, present]
615
+ judgment: deterministic
616
+ selected_owner: project
617
+ selected_meaning: project
618
+ review: none
619
+ tension: none
620
+ divergent_exact_collision:
621
+ when: valid personal and project entries have exact term identity but not exact meaning identity
622
+ match:
623
+ project_input: [valid_exact]
624
+ personal_input: [valid_exact]
625
+ exact_meaning: [divergent]
626
+ inferred_candidate: [absent, present]
627
+ judgment: deterministic
628
+ selected_owner: project
629
+ selected_meaning: project
630
+ review: none
631
+ tension: divergent_exact_collision
632
+ project_only:
633
+ when: >-
634
+ valid project input has an exact term and personal input is invalid,
635
+ unavailable, valid without an exact term, or only a differently named
636
+ inferred-equivalence candidate
637
+ match:
638
+ project_input: [valid_exact]
639
+ personal_input: [invalid, valid_without_exact]
640
+ exact_meaning: [not_applicable]
641
+ inferred_candidate: [absent, present]
642
+ judgment: deterministic
643
+ selected_owner: project
644
+ selected_meaning: project
645
+ review: none_for_primary
646
+ tension: none
647
+ proven_project_gap:
648
+ when: project state is gap-proving and one valid personal exact term exists
649
+ match:
650
+ project_input: [valid_gap]
651
+ personal_input: [valid_exact]
652
+ exact_meaning: [not_applicable]
653
+ inferred_candidate: [absent, present]
654
+ judgment: deterministic
655
+ selected_owner: personal
656
+ selected_meaning: personal
657
+ review: none
658
+ tension: none
659
+ inferred_equivalence:
660
+ when: >-
661
+ project state is gap-proving, personal input is valid without an exact
662
+ term, and the host identifies a possible semantic-equivalence candidate
663
+ match:
664
+ project_input: [valid_gap]
665
+ personal_input: [valid_without_exact]
666
+ exact_meaning: [not_applicable]
667
+ inferred_candidate: [present]
668
+ judgment: host_reviewed
669
+ selected_owner: none_until_review
670
+ selected_meaning: none_until_review
671
+ review: required_when_meaning_sensitive
672
+ tension: inferred_equivalence
673
+ invalid_or_unavailable_personal:
674
+ when: >-
675
+ project state is gap-proving and personal input is malformed,
676
+ unavailable, or over bound, so no fallback can be proven
677
+ match:
678
+ project_input: [valid_gap]
679
+ personal_input: [invalid]
680
+ exact_meaning: [not_applicable]
681
+ inferred_candidate: [absent, present]
682
+ judgment: deterministic
683
+ selected_owner: none
684
+ selected_meaning: none
685
+ review: unavailable
686
+ tension: input_unavailable
687
+ no_applicable_entry:
688
+ when: >-
689
+ project state is gap-proving, personal input is valid without an exact
690
+ term, and no inferred-equivalence candidate is present
691
+ match:
692
+ project_input: [valid_gap]
693
+ personal_input: [valid_without_exact]
694
+ exact_meaning: [not_applicable]
695
+ inferred_candidate: [absent]
696
+ judgment: deterministic
697
+ selected_owner: none
698
+ selected_meaning: none
699
+ review: none
700
+ tension: none
701
+ orthogonal_advisories:
702
+ personal_input_unavailable_with_project_exact:
703
+ primary_outcome: project_only
704
+ when: personal_input is invalid and project_input is valid_exact
705
+ match:
706
+ project_input: [valid_exact]
707
+ personal_input: [invalid]
708
+ exact_meaning: [not_applicable]
709
+ inferred_candidate: [absent, present]
710
+ caveat_reason: personal_input_unavailable
711
+ ownership_state: project_governs_exact
712
+ rule: >-
713
+ Preserve the exact project meaning. The bounded availability caveat may
714
+ report only reason and ownership state; it never becomes another primary
715
+ outcome or exposes personal content.
716
+ inferred_equivalence_with_project_exact:
717
+ primary_outcome: project_only
718
+ when: >-
719
+ personal_input is valid_without_exact, project_input is valid_exact, and
720
+ inferred_candidate is present
721
+ match:
722
+ project_input: [valid_exact]
723
+ personal_input: [valid_without_exact]
724
+ exact_meaning: [not_applicable]
725
+ inferred_candidate: [present]
726
+ review: required_when_the_inferred_relation_is_meaning_sensitive
727
+ caveat_reason: inferred_equivalence
728
+ ownership_state: project_governs_exact
729
+ rule: >-
730
+ Project authority remains the usable primary meaning. Host review governs
731
+ only the possible differently named relation and cannot displace, merge,
732
+ or suppress the exact project entry.
733
+ refresh_events:
734
+ required:
735
+ - initial_meaning_sensitive_input
736
+ - later_user_requirement_change_that_can_change_meaning
737
+ - later_user_intent_change_that_can_change_meaning
738
+ - later_acceptance_change_that_can_change_meaning
739
+ - later_deliberation_premise_change_that_can_change_meaning
740
+ - later_cycle_intent_change_that_can_change_meaning
741
+ - clarification_answer_for_a_reviewed_term
742
+ not_required:
743
+ - unrelated_conversation_turn
744
+ - unchanged_input_replay
745
+ - background_state_reread
746
+ - status_or_progress_render
747
+ - tool_output_without_requirement_or_intent_change
748
+ - artifact_rendering
749
+ - evaluator_text_without_user_change
750
+ - control_only_continuation
751
+ rule: >-
752
+ Refresh only at a governed event whose changed input can alter the meaning
753
+ used by the capability. Rereads and incidental turns do not refresh advice.
754
+ discuss_integration:
755
+ implementation: active
756
+ invocation: consumer_boundary.advice_resolution.invocation
757
+ governed_events: consumer_boundary.refresh_events
758
+ outcome_authority: consumer_boundary.outcome_matrix
759
+ disclosure: consumer_boundary.disclosure.transient_advice
760
+ interaction:
761
+ scope: current_user_authored_meaning_sensitive_input
762
+ transcript_scan: forbidden
763
+ done_only_control: no_refresh
764
+ review_rule: >-
765
+ Before meaning-sensitive reasoning or decision framing relies on an
766
+ inferred relation, ask one focused clarification question under the
767
+ existing one-question-per-turn and Done contract. The clarification may
768
+ identify a host-reviewed relation for a fresh advice request but is not
769
+ decision confirmation, approval, or publication consent.
770
+ exact_collision_rule: >-
771
+ Use an applicable project meaning for a divergent exact collision and
772
+ surface the bounded divergence as a concise scratchpad tension or Crux.
773
+ Never ask the user to choose project versus personal authority.
774
+ unavailable_rule: >-
775
+ Continue without glossary grounding when advice is unavailable, invalid,
776
+ or has no applicable entry. Ask ordinary clarification only when the term
777
+ is necessary and ambiguous, without fabricating glossary facts.
778
+ output_rule: >-
779
+ Use only the transient applicable meaning and owner needed for the current
780
+ deliberation, and never quote unrelated glossary content.
781
+ mutation: forbidden
782
+ forbidden_effects:
783
+ - glossary_write
784
+ - glossary_approval
785
+ - publication_consent
786
+ - progress_caveat
787
+ - plan_conflict
788
+ - decision_conflict
789
+ plan_integration:
790
+ implementation: active
791
+ invocation: consumer_boundary.advice_resolution.invocation
792
+ governed_events: consumer_boundary.refresh_events
793
+ outcome_authority: consumer_boundary.outcome_matrix
794
+ disclosure: consumer_boundary.disclosure.transient_advice
795
+ mode:
796
+ precedence:
797
+ - explicit_delegated_or_orchestrated_no_pause
798
+ - direct_user_invocation_with_available_clarification_turn
799
+ - unknown_or_ambiguous
800
+ signals:
801
+ explicit_delegated_or_orchestrated_no_pause:
802
+ result: autonomous
803
+ direct_user_invocation_with_available_clarification_turn:
804
+ result: interactive
805
+ unknown_or_ambiguous:
806
+ result: interactive_waiting
807
+ silence_or_timeout: never_autonomous
808
+ rule: >-
809
+ Use the first matching signal. Unknown or conflicting mode evidence waits
810
+ for interactive clarification; silence and elapsed time never imply
811
+ autonomous execution.
812
+ interaction:
813
+ scope: current_user_authored_meaning_sensitive_input
814
+ transcript_scan: forbidden
815
+ control_only_continuation: no_refresh
816
+ review:
817
+ interactive_sequence:
818
+ - emit_one_focused_clarification
819
+ - wait_for_user_answer
820
+ - refresh_advice_for_affected_term
821
+ - finalize_affected_scope_requirements_tasks_acceptance
822
+ autonomous_sequence:
823
+ - abstain_from_disputed_meaning
824
+ - defer_affected_scope_requirements_tasks_acceptance
825
+ - emit_transient_handoff_intent
826
+ clarification_effects:
827
+ - not_plan_approval
828
+ - not_decision_confirmation
829
+ - not_glossary_approval
830
+ - not_publication_consent
831
+ exact_collision_rule: >-
832
+ Use an applicable project meaning for a divergent exact collision. Where
833
+ the divergence materially affects planning, represent only the bounded
834
+ tension and never disclose the personal definition.
835
+ unavailable_rule: >-
836
+ Continue without glossary grounding when advice is unavailable, invalid,
837
+ or has no applicable entry. In interactive Plan, ask ordinary focused
838
+ clarification only when the term is necessary and meaning-critical.
839
+ autonomous_handoff_intent:
840
+ status: transient_emitted_not_delivered
841
+ caller_fields: [event, reason, ownership_state]
842
+ fixed_values:
843
+ event: current
844
+ accepted_writer_flags:
845
+ [--glossary-caveat-event, --glossary-caveat-reason, --glossary-caveat-ownership-state]
846
+ writer_owned_fields: [caveat_id, capability, transition_id]
847
+ forbidden_fields: [caveat_id, capability, transition_id]
848
+ forbidden_claims: [delivered, stored, persisted, published, durable_envelope]
849
+ durable_writer: build
850
+ writer_interface: agentera state progress explain --verb append --format json
851
+ writer_result: authoritative_identity_and_six_field_envelope
852
+ allowed_reason_state_pairs: consumer_boundary.autonomous_caveat.allowed_current_pairs
853
+ rule: >-
854
+ Emit one intent only when autonomous meaning-sensitive work has unresolved
855
+ review or unavailable authority. The emitted-only intent contains exactly
856
+ event=current, reason, and ownership_state, the three caller inputs accepted
857
+ by the Build writer. It is not delivered, stored, persisted, or published.
858
+ The writer creates caveat_id, capability=build, and transition_id=null to
859
+ complete the authoritative current envelope.
860
+ exact_project_personal_unavailable:
861
+ primary_outcome: project_only
862
+ advisory_reason: personal_input_unavailable
863
+ advisory_ownership_state: project_governs_exact
864
+ plan_action: ground_exact_project_meaning
865
+ autonomous_handoff_intent: none
866
+ durable_unresolved_caveat: none
867
+ rule: >-
868
+ Unavailable personal input does not make exact project authority
869
+ unresolved. Keep the advisory transient and never emit or publish it as
870
+ an autonomous unresolved handoff.
871
+ unavailable:
872
+ invalid_project:
873
+ interactive: clarify_or_wait_when_meaning_critical
874
+ autonomous: abstain_defer_and_emit_authority_unavailable
875
+ handoff_pair: [authority_unavailable, authority_unavailable]
876
+ invalid_personal_after_project_gap:
877
+ interactive: clarify_or_wait_when_meaning_critical
878
+ autonomous: abstain_defer_and_emit_personal_input_unavailable
879
+ handoff_pair: [personal_input_unavailable, authority_unavailable]
880
+ behavior_matrix:
881
+ interactive_review_required:
882
+ mode: interactive
883
+ plan_action: clarify_refresh_then_finalize
884
+ handoff_intent: none
885
+ autonomous_review_required:
886
+ mode: autonomous
887
+ plan_action: abstain_and_defer
888
+ handoff_intent: emitted
889
+ exact_project_personal_unavailable:
890
+ mode: any
891
+ plan_action: ground_exact_project_meaning
892
+ handoff_intent: none
893
+ unavailable_unresolved:
894
+ mode: autonomous
895
+ plan_action: abstain_and_defer
896
+ handoff_intent: emitted
897
+ divergent_exact_collision:
898
+ mode: any
899
+ plan_action: ground_project_and_bound_tension
900
+ handoff_intent: none
901
+ irrelevant_or_no_applicable_entry:
902
+ mode: any
903
+ plan_action: leave_unaffected_planning_unchanged
904
+ handoff_intent: none
905
+ output_rule: >-
906
+ Use only the transient applicable meaning and owner needed for affected
907
+ planning. An autonomous handoff intent is emitted, not delivered or stored,
908
+ and contains exactly event=current, reason, and ownership_state for a later
909
+ Build write.
910
+ handoff: consumer_boundary.autonomous_caveat.handoff.plan
911
+ mutation: forbidden
912
+ forbidden_effects:
913
+ - glossary_write
914
+ - glossary_approval
915
+ - publication_consent
916
+ - progress_caveat
917
+ - plan_conflict
918
+ - decision_conflict
919
+ disclosure:
920
+ transient_advice:
921
+ allowed: [outcome, applicable_meaning, applicable_owner, review, tension, advisory]
922
+ minimum_rule: >-
923
+ Include a meaning only when that meaning is selected by the matrix and
924
+ needed for the current meaning-sensitive work. Never include unrelated entries.
925
+ forbidden:
926
+ - personal_evidence_anchor
927
+ - personal_profile_path
928
+ - raw_personal_glossary_section
929
+ - unrelated_entry
930
+ - provenance
931
+ - project_source_path
932
+ durable_surfaces:
933
+ surfaces: [progress_evidence, prime_attention, diagnostics, errors]
934
+ allowed: [caveat_id, event, capability, reason, ownership_state, transition_id]
935
+ forbidden:
936
+ - personal_definition
937
+ - project_definition
938
+ - personal_evidence_anchor
939
+ - personal_profile_path
940
+ - raw_personal_glossary_section
941
+ - raw_project_glossary_section
942
+ - unrelated_entry
943
+ - provenance
944
+ - project_source_path
945
+ failure_rule: >-
946
+ Errors identify only the invalid input class and a public recovery command;
947
+ they never quote private bytes, definitions, paths, anchors, or provenance.
948
+ plan_artifacts:
949
+ surfaces:
950
+ [
951
+ scope,
952
+ requirements,
953
+ constraints,
954
+ tasks,
955
+ task_acceptance,
956
+ overall_acceptance,
957
+ diagnostics,
958
+ handoff,
959
+ ]
960
+ allowed_sources:
961
+ [user_authored_term, user_authored_clarification, derived_behavioral_requirement]
962
+ forbidden_content:
963
+ - profile_derived_definition
964
+ - personal_glossary_definition
965
+ - personal_evidence_anchor
966
+ - personal_profile_path
967
+ - raw_personal_glossary_section
968
+ - raw_project_glossary_section
969
+ - unrelated_entry
970
+ - provenance
971
+ - project_source_path
972
+ user_term_rule: >-
973
+ A term already supplied by the user may remain in the plan. Never copy or
974
+ quote a profile-derived or personal glossary definition; express only the
975
+ derived behavioral requirement needed by the plan.
976
+ autonomous_caveat:
977
+ durable_owner: build
978
+ durable_channel: progress
979
+ authority: skills/agentera/schemas/artifacts/progress.yaml#ENTITY_AUTHORITY
980
+ publication_command: agentera state progress append
981
+ publication_boundary: progress_cycle.glossary_caveat
982
+ publication_status: active_build
983
+ writer_runtime: packages/cli/src/state/progressEntities.ts#appendProgressEntity
984
+ writer_interface: agentera state progress explain --verb append --format json
985
+ envelope_validator: packages/cli/src/state/progressGlossaryCaveat.ts#validateProgressGlossaryCaveat
986
+ lifecycle_validator: packages/cli/src/state/progressGlossaryCaveat.ts#glossaryCaveatLifecycleInvalidEntities
987
+ allowed_current_pairs:
988
+ - reason: inferred_equivalence
989
+ ownership_state: review_required
990
+ - reason: inferred_equivalence
991
+ ownership_state: project_governs_exact
992
+ - reason: authority_unavailable
993
+ ownership_state: authority_unavailable
994
+ - reason: personal_input_unavailable
995
+ ownership_state: authority_unavailable
996
+ identity:
997
+ field: caveat_id
998
+ type: opaque_non_content_id
999
+ alphabet: abcdefghijklmnopqrstuvwxyz
1000
+ length: 10
1001
+ pattern: "^[a-z]{10}$"
1002
+ rule: >-
1003
+ Assign a fresh opaque ID for a current caveat and carry it unchanged to
1004
+ its matching terminal event. The ID must not encode a term, meaning,
1005
+ anchor, path, provenance, or project identity.
1006
+ envelope:
1007
+ schema_version: agentera.glossaryConsumerCaveat.v1
1008
+ fields: [caveat_id, event, capability, reason, ownership_state, transition_id]
1009
+ additional_fields: forbidden
1010
+ max_string_utf8_bytes: 64
1011
+ events: [current, resolved, superseded]
1012
+ capabilities: [build]
1013
+ reasons: [inferred_equivalence, authority_unavailable, personal_input_unavailable]
1014
+ ownership_states: [project_governs_exact, review_required, authority_unavailable]
1015
+ transition_rule: >-
1016
+ current and resolved require null transition_id. Superseded requires one
1017
+ different opaque successor caveat_id. Every field is required; only
1018
+ transition_id may be null.
1019
+ current_append:
1020
+ caller_fields: [event, reason, ownership_state]
1021
+ caller_fixed_values:
1022
+ event: current
1023
+ writer_fields: [caveat_id, capability, transition_id]
1024
+ writer_fixed_values:
1025
+ capability: build
1026
+ transition_id: null
1027
+ rule: >-
1028
+ A current append requires the caller to submit event=current, reason,
1029
+ and ownership_state. The writer creates the opaque identity, Build
1030
+ capability, and null current-transition field; it never defaults event.
1031
+ lifecycle:
1032
+ current: >-
1033
+ Append current once when autonomous meaning-sensitive work cannot pause
1034
+ and review or authority remains unresolved.
1035
+ resolved: >-
1036
+ Append resolved with the same caveat_id after explicit clarification or
1037
+ a governed refresh proves the caveat no longer applies.
1038
+ superseded: >-
1039
+ Append superseded with the old caveat_id and the fresh successor ID as
1040
+ transition_id when a governed refresh replaces, rather than resolves,
1041
+ the caveat.
1042
+ matching_rule: >-
1043
+ The latest valid event for one caveat_id determines whether it is current.
1044
+ A terminal event affects only its matching identity. Supersession is valid
1045
+ only when a matching current successor event also exists.
1046
+ expiration: none
1047
+ expiration_rule: >-
1048
+ Time alone never resolves or hides a caveat. Only an explicit matching
1049
+ resolved or valid superseded transition makes it noncurrent.
1050
+ prime_projection:
1051
+ status: active
1052
+ runtime: packages/cli/src/state/progressGlossaryCaveat.ts#projectCurrentGlossaryCaveats
1053
+ retrieval: canonical_validated_progress_entities
1054
+ attention_text: "normal: glossary review required before meaning-sensitive work"
1055
+ max_attention_entries: 1
1056
+ source:
1057
+ artifact: progress
1058
+ boundary: progress_cycle
1059
+ capability: build
1060
+ capacity:
1061
+ public_attention_limit: 6
1062
+ reserved_glossary_slots: 1
1063
+ policy: reserve_final_slot_when_current
1064
+ unrelated_retention: first_five_in_existing_order
1065
+ insertion: reserved_final_slot_when_current
1066
+ rule: >-
1067
+ Reconstruct current caveats by opaque identity from validated canonical
1068
+ progress entities. A matching resolved event or valid superseded event
1069
+ removes only that identity. Invalid, orphan, mismatched, or duplicate
1070
+ terminal evidence is omitted and cannot suppress a valid current event.
1071
+ Emit at most the declared generic attention text when one or more current
1072
+ caveats remain; preserve the relative order of every unrelated attention
1073
+ entry and do not change next-action selection.
1074
+ expiration: none
1075
+ forbidden_sources:
1076
+ - timestamp
1077
+ - recency
1078
+ - plan_state
1079
+ - transient_plan_handoff
1080
+ - profile_presence
1081
+ - unrelated_progress
1082
+ forbidden_output:
1083
+ - caveat_id
1084
+ - transition_id
1085
+ - reason
1086
+ - ownership_state
1087
+ - definition
1088
+ - meaning
1089
+ - anchor
1090
+ - path
1091
+ - raw_section
1092
+ - provenance
1093
+ - source_bytes
1094
+ malformed_evidence:
1095
+ prime: omit
1096
+ direct_progress_retrieval: fail_closed_generic_corrupt_entity
1097
+ allowed_diagnostic: canonical progress evidence is corrupt; run state validation
1098
+ forbidden_diagnostic_content:
1099
+ [stored_filename, stored_path, parser_text, raw_value, raw_bytes, provenance]
1100
+ handoff:
1101
+ plan: >-
1102
+ Plan cannot write progress. In autonomous mode it emits at most one
1103
+ transient intent containing exactly event=current, reason, and
1104
+ ownership_state and stores no caveat or conflict in plan state. It never
1105
+ emits identity, capability, transition_id, or a purported complete or
1106
+ delivered durable envelope.
1107
+ discuss: >-
1108
+ Discuss pauses for clarification; it does not persist caveat evidence or
1109
+ turn review into decision approval.
1110
+ build: >-
1111
+ Build is the sole durable writer and may later pass all three emitted
1112
+ intent inputs to the typed progress writer. The writer preserves the
1113
+ caller-owned event, reason, and ownership_state and creates authoritative
1114
+ identity, capability, and transition_id fields. Advice never invokes
1115
+ glossary publication.
1116
+ publication_isolation:
1117
+ rule: >-
1118
+ Advice, tension, review, clarification, caveat publication, resolution, and
1119
+ supersession never invoke glossary publication, authorize a proposal, reuse
1120
+ confirmation, satisfy a decision, or approve plan state.
1121
+ project_publication_authority: ownership_contracts.project.publication
1122
+ downstream_gate:
1123
+ status: blocked_until_contract_valid
1124
+ validator: packages/cli/src/registries/glossaryEntryContract.ts#validateGlossaryEntryContract
1125
+ command: agentera check validate vocabularyAuthority --format json
1126
+ required_sections:
1127
+ - consumer_boundary.acquisition
1128
+ - consumer_boundary.advice_resolution
1129
+ - consumer_boundary.primary_selection
1130
+ - consumer_boundary.outcome_matrix
1131
+ - consumer_boundary.orthogonal_advisories
1132
+ - consumer_boundary.refresh_events
1133
+ - consumer_boundary.discuss_integration
1134
+ - consumer_boundary.plan_integration
1135
+ - consumer_boundary.disclosure
1136
+ - consumer_boundary.autonomous_caveat
1137
+ - consumer_boundary.publication_isolation
1138
+ failure_rule: >-
1139
+ Discuss, Plan, Build, advice, and prime integration remain blocked when
1140
+ validation reports a missing or contradictory section. Acquisition itself
1141
+ fails closed. Each issue names the invalid section and required correction.
1142
+ profile_grounding:
1143
+ implementation: active_exclusion_only
1144
+ capabilities: [discuss, plan, build]
1145
+ command: agentera report profile-grounding --format json
1146
+ schema_version: agentera.profileGrounding.v1
1147
+ parser: packages/cli/src/analytics/personalGlossaryProfile.ts#personalProfileGrounding
1148
+ max_profile_utf8_bytes: 65536
1149
+ raw_profile_read: forbidden
1150
+ content_rule: >-
1151
+ Return the complete profile with exactly the validated owned personal
1152
+ Glossary marker range removed. Preserve every byte outside that range.
1153
+ This is profile grounding only and performs no glossary lookup, project
1154
+ glossary read, precedence, matching, review, collision, or advisory work.
1155
+ Profile Full retains access to the complete stored profile for regeneration.
1156
+ failure_rule: >-
1157
+ Missing profiles return structured unavailable state. Oversized profiles
1158
+ and malformed, duplicate, unmatched, or unowned ambiguous Glossary
1159
+ sections fail closed with actionable recovery and no profile content.
1160
+ exact_collision:
1161
+ behavior: project_precedence_at_consumption
1162
+ persistence: forbidden
1163
+ personal_entry_suppression: forbidden
1164
+ inferred_semantic_equivalence:
1165
+ behavior: user_review
1166
+ automatic_merge: forbidden
1167
+ suppression: forbidden
1168
+ precedence: forbidden
1169
+ rule: >-
1170
+ Audit remains mutation-free and Build project-glossary publication is active.
1171
+ Build, Discuss, Plan, and prime bounded glossary consumption are active, and
1172
+ Build progress caveat publication is active. Personal Profile Full rendering
1173
+ and persistence are active. Project-driven personal-profile mutation and
1174
+ docs-mapping mutation remain deferred.
1175
+
1176
+ deferred_capability_contracts:
1177
+ profile:
1178
+ capabilities: [profile]
1179
+ implementation: active_partial
1180
+ intended_behavior: personal_glossary_synthesis
1181
+ active_behavior:
1182
+ - ownership_contracts.personal.admission
1183
+ - ownership_contracts.personal.profile_output
1184
+ inactive_behavior: [lookup]
1185
+ contracts:
1186
+ admission: ownership_contracts.personal.input
1187
+ provenance: ownership_contracts.personal.allowed_provenance
1188
+ confidence: shared_primitive.fields.confidence
1189
+ retention_and_decay: ownership_contracts.personal.retention_and_decay
1190
+ forbidden_current_claims: [lookup, project_glossary_consumption]
1191
+ audit:
1192
+ capabilities: [audit]
1193
+ implementation: active_partial
1194
+ active_behavior: terminology_drift_finding_generation
1195
+ finding_family:
1196
+ status: implemented
1197
+ mutation: forbidden
1198
+ evidence: ownership_contracts.project.input
1199
+ confidence: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
1200
+ filtering: skills/agentera/capabilities/audit/schemas/validation.yaml
1201
+ canonical_proposal_rule: >-
1202
+ Propose the term with the most distinct verified project-file anchors;
1203
+ break ties lexicographically. A proposal is an audit finding, never a
1204
+ decision or persisted glossary entry.
1205
+ personal_comparison_rule: >-
1206
+ A supplied personal-profile term may annotate divergence for the same
1207
+ assessed concept. Missing profile evidence adds no divergence and never
1208
+ invents a personal term.
1209
+ proposal_output:
1210
+ implementation: active
1211
+ intended_output: read_only_terminology_drift_finding
1212
+ digest: ownership_contracts.project.proposal_digest
1213
+ inputs:
1214
+ personal_history: ownership_contracts.personal.input
1215
+ project_file: ownership_contracts.project.input
1216
+ project_file_history_classification: forbidden
1217
+ forbidden_current_claims: [persistence, approval, docs_mapping_mutation, lookup]
1218
+ build_publication:
1219
+ capabilities: [build]
1220
+ implementation: active
1221
+ active_behavior: ownership_contracts.project.publication
1222
+ output: skills/agentera/schemas/artifacts/glossary.yaml
1223
+ inactive_behavior:
1224
+ [
1225
+ lookup,
1226
+ precedence,
1227
+ semantic_equivalence_review,
1228
+ personal_profile_mutation,
1229
+ docs_mapping_mutation,
1230
+ ]
1231
+ forbidden_current_claims:
1232
+ [lookup, precedence, review, personal_profile_mutation, docs_mapping_mutation]
1233
+ consumers:
1234
+ capabilities: [discuss, plan, build, prime]
1235
+ implementation:
1236
+ build: active
1237
+ discuss: active
1238
+ plan: active
1239
+ prime: active
1240
+ behavior: consumer_boundary
1241
+ forbidden_current_claims: []