agentera 0.0.0 → 3.0.0-dev.0
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.
- package/README.md +6 -45
- package/bundle/.agentera-npx-bundle.json +4 -0
- package/bundle/references/adapters/cursor.md +213 -0
- package/bundle/references/adapters/opencode.md +530 -0
- package/bundle/references/adapters/package-manifest-interface-model.yaml +337 -0
- package/bundle/references/adapters/package-registry.yaml +247 -0
- package/bundle/references/adapters/package-surface-characterization.md +48 -0
- package/bundle/references/adapters/runtime-adapter-characterization.md +79 -0
- package/bundle/references/adapters/runtime-adapter-interface-model.yaml +200 -0
- package/bundle/references/adapters/runtime-adapter-registry.yaml +548 -0
- package/bundle/references/adapters/runtime-feature-parity.md +189 -0
- package/bundle/references/analysis/benchmark.md +267 -0
- package/bundle/references/analysis/startup-measurement-contract.yaml +424 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +288 -0
- package/bundle/references/cli/agent-ready-state-contract.yaml +950 -0
- package/bundle/references/cli/app-lifecycle-vocabulary.yaml +233 -0
- package/bundle/references/cli/audience-namespace-cli-migration.yaml +355 -0
- package/bundle/references/cli/bundle-skill-vocabulary.yaml +278 -0
- package/bundle/references/cli/capability-instruction-contract.yaml +123 -0
- package/bundle/references/cli/capability-tool-classification.yaml +53 -0
- package/bundle/references/cli/routing-execution-vocabulary.yaml +281 -0
- package/bundle/references/cli/update-channels.yaml +120 -0
- package/bundle/references/cli/vocabulary-index.yaml +160 -0
- package/bundle/references/cli/vocabulary.md +562 -0
- package/bundle/references/meta/documentation-inventory.md +43 -0
- package/bundle/references/v1-section-mapping.md +47 -0
- package/bundle/registry.json +39 -0
- package/bundle/skills/agentera/.claude-plugin/plugin.json +27 -0
- package/bundle/skills/agentera/SKILL.md +470 -0
- package/bundle/skills/agentera/agents/dokumentera.toml +6 -0
- package/bundle/skills/agentera/agents/hej.toml +6 -0
- package/bundle/skills/agentera/agents/inspektera.toml +6 -0
- package/bundle/skills/agentera/agents/inspirera.toml +6 -0
- package/bundle/skills/agentera/agents/optimera.toml +6 -0
- package/bundle/skills/agentera/agents/orkestrera.toml +6 -0
- package/bundle/skills/agentera/agents/planera.toml +6 -0
- package/bundle/skills/agentera/agents/profilera.toml +6 -0
- package/bundle/skills/agentera/agents/realisera.toml +6 -0
- package/bundle/skills/agentera/agents/resonera.toml +6 -0
- package/bundle/skills/agentera/agents/visionera.toml +6 -0
- package/bundle/skills/agentera/agents/visualisera.toml +6 -0
- package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +428 -0
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +73 -0
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/exit.yaml +35 -0
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +35 -0
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/validation.yaml +139 -0
- package/bundle/skills/agentera/capabilities/hej/instructions.md +331 -0
- package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +69 -0
- package/bundle/skills/agentera/capabilities/hej/schemas/exit.yaml +32 -0
- package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +58 -0
- package/bundle/skills/agentera/capabilities/hej/schemas/validation.yaml +55 -0
- package/bundle/skills/agentera/capabilities/inspektera/instructions.md +514 -0
- package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +76 -0
- package/bundle/skills/agentera/capabilities/inspektera/schemas/exit.yaml +36 -0
- package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +38 -0
- package/bundle/skills/agentera/capabilities/inspektera/schemas/validation.yaml +113 -0
- package/bundle/skills/agentera/capabilities/inspirera/instructions.md +280 -0
- package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +24 -0
- package/bundle/skills/agentera/capabilities/inspirera/schemas/exit.yaml +33 -0
- package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +34 -0
- package/bundle/skills/agentera/capabilities/inspirera/schemas/validation.yaml +58 -0
- package/bundle/skills/agentera/capabilities/optimera/instructions.md +437 -0
- package/bundle/skills/agentera/capabilities/optimera/schemas/artifacts.yaml +69 -0
- package/bundle/skills/agentera/capabilities/optimera/schemas/exit.yaml +35 -0
- package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +39 -0
- package/bundle/skills/agentera/capabilities/optimera/schemas/validation.yaml +91 -0
- package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +433 -0
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +64 -0
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/exit.yaml +34 -0
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +42 -0
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +107 -0
- package/bundle/skills/agentera/capabilities/planera/instructions.md +368 -0
- package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +62 -0
- package/bundle/skills/agentera/capabilities/planera/schemas/exit.yaml +33 -0
- package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +34 -0
- package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +61 -0
- package/bundle/skills/agentera/capabilities/profilera/instructions.md +419 -0
- package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +18 -0
- package/bundle/skills/agentera/capabilities/profilera/schemas/exit.yaml +34 -0
- package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +45 -0
- package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +57 -0
- package/bundle/skills/agentera/capabilities/realisera/instructions.md +403 -0
- package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +80 -0
- package/bundle/skills/agentera/capabilities/realisera/schemas/exit.yaml +35 -0
- package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +39 -0
- package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +110 -0
- package/bundle/skills/agentera/capabilities/resonera/instructions.md +329 -0
- package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +47 -0
- package/bundle/skills/agentera/capabilities/resonera/schemas/exit.yaml +35 -0
- package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +46 -0
- package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +77 -0
- package/bundle/skills/agentera/capabilities/visionera/instructions.md +309 -0
- package/bundle/skills/agentera/capabilities/visionera/schemas/artifacts.yaml +57 -0
- package/bundle/skills/agentera/capabilities/visionera/schemas/exit.yaml +35 -0
- package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +41 -0
- package/bundle/skills/agentera/capabilities/visionera/schemas/validation.yaml +74 -0
- package/bundle/skills/agentera/capabilities/visualisera/instructions.md +400 -0
- package/bundle/skills/agentera/capabilities/visualisera/schemas/artifacts.yaml +44 -0
- package/bundle/skills/agentera/capabilities/visualisera/schemas/exit.yaml +34 -0
- package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +33 -0
- package/bundle/skills/agentera/capabilities/visualisera/schemas/validation.yaml +80 -0
- package/bundle/skills/agentera/capability_schema_contract.yaml +385 -0
- package/bundle/skills/agentera/protocol.yaml +463 -0
- package/bundle/skills/agentera/references/contract.md +1039 -0
- package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +60 -0
- package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +461 -0
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +55 -0
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +402 -0
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +373 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +484 -0
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +399 -0
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +342 -0
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +325 -0
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +110 -0
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +262 -0
- package/bundle/skills/hej/.claude-plugin/plugin.json +6 -0
- package/bundle/skills/hej/SKILL.md +69 -0
- package/bundle/skills/hej/agents/hej.toml +11 -0
- package/bundle/skills/hej/agents/openai.yaml +8 -0
- package/dist/analytics/extractCorpus.js +1791 -0
- package/dist/analytics/extractCorpus.js.map +1 -0
- package/dist/analytics/usageStats.js +487 -0
- package/dist/analytics/usageStats.js.map +1 -0
- package/dist/bin/agentera.js +4 -0
- package/dist/bin/agentera.js.map +1 -0
- package/dist/cli/appContext.js +226 -0
- package/dist/cli/appContext.js.map +1 -0
- package/dist/cli/argvalidate.js +41 -0
- package/dist/cli/argvalidate.js.map +1 -0
- package/dist/cli/capabilityContext.js +2421 -0
- package/dist/cli/capabilityContext.js.map +1 -0
- package/dist/cli/commands/backfill.js +84 -0
- package/dist/cli/commands/backfill.js.map +1 -0
- package/dist/cli/commands/capability.js +44 -0
- package/dist/cli/commands/capability.js.map +1 -0
- package/dist/cli/commands/compact.js +148 -0
- package/dist/cli/commands/compact.js.map +1 -0
- package/dist/cli/commands/doctor.js +180 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/lint.js +179 -0
- package/dist/cli/commands/lint.js.map +1 -0
- package/dist/cli/commands/prime.js +545 -0
- package/dist/cli/commands/prime.js.map +1 -0
- package/dist/cli/commands/query.js +346 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/report.js +210 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/schema.js +306 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/state.js +1012 -0
- package/dist/cli/commands/state.js.map +1 -0
- package/dist/cli/commands/upgrade.js +49 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/commands/validate.js +519 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/verify.js +204 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/dispatch.js +962 -0
- package/dist/cli/dispatch.js.map +1 -0
- package/dist/cli/orientation.js +595 -0
- package/dist/cli/orientation.js.map +1 -0
- package/dist/cli/prime-blob.js +3 -0
- package/dist/cli/prime-blob.js.map +1 -0
- package/dist/cli/stateQuery.js +292 -0
- package/dist/cli/stateQuery.js.map +1 -0
- package/dist/cli/structured.js +18 -0
- package/dist/cli/structured.js.map +1 -0
- package/dist/core/difflib.js +274 -0
- package/dist/core/difflib.js.map +1 -0
- package/dist/core/git.js +43 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/paths.js +50 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/pyjson.js +101 -0
- package/dist/core/pyjson.js.map +1 -0
- package/dist/core/sourceRoot.js +72 -0
- package/dist/core/sourceRoot.js.map +1 -0
- package/dist/core/toml.js +11 -0
- package/dist/core/toml.js.map +1 -0
- package/dist/core/yaml.js +25 -0
- package/dist/core/yaml.js.map +1 -0
- package/dist/eval/evalSkills.js +258 -0
- package/dist/eval/evalSkills.js.map +1 -0
- package/dist/eval/semanticEval.js +148 -0
- package/dist/eval/semanticEval.js.map +1 -0
- package/dist/eval/semanticFixtures.js +227 -0
- package/dist/eval/semanticFixtures.js.map +1 -0
- package/dist/hooks/common.js +160 -0
- package/dist/hooks/common.js.map +1 -0
- package/dist/hooks/compaction.js +935 -0
- package/dist/hooks/compaction.js.map +1 -0
- package/dist/hooks/cursorPreToolUse.js +19 -0
- package/dist/hooks/cursorPreToolUse.js.map +1 -0
- package/dist/hooks/cursorSessionStart.js +71 -0
- package/dist/hooks/cursorSessionStart.js.map +1 -0
- package/dist/hooks/sessionStart.js +209 -0
- package/dist/hooks/sessionStart.js.map +1 -0
- package/dist/hooks/sessionStop.js +212 -0
- package/dist/hooks/sessionStop.js.map +1 -0
- package/dist/hooks/validateArtifact.js +933 -0
- package/dist/hooks/validateArtifact.js.map +1 -0
- package/dist/registries/artifactRegistry.js +206 -0
- package/dist/registries/artifactRegistry.js.map +1 -0
- package/dist/registries/capabilityContract.js +310 -0
- package/dist/registries/capabilityContract.js.map +1 -0
- package/dist/registries/packageRegistry.js +641 -0
- package/dist/registries/packageRegistry.js.map +1 -0
- package/dist/registries/runtimeAdapterRegistry.js +315 -0
- package/dist/registries/runtimeAdapterRegistry.js.map +1 -0
- package/dist/setup/codex.js +1052 -0
- package/dist/setup/codex.js.map +1 -0
- package/dist/setup/copilot.js +227 -0
- package/dist/setup/copilot.js.map +1 -0
- package/dist/setup/cursor.js +127 -0
- package/dist/setup/cursor.js.map +1 -0
- package/dist/setup/doctor.js +1269 -0
- package/dist/setup/doctor.js.map +1 -0
- package/dist/state/installRoot.js +279 -0
- package/dist/state/installRoot.js.map +1 -0
- package/dist/state/progressCommit.js +289 -0
- package/dist/state/progressCommit.js.map +1 -0
- package/dist/state/startupAnalysis.js +1953 -0
- package/dist/state/startupAnalysis.js.map +1 -0
- package/dist/upgrade/appModel.js +189 -0
- package/dist/upgrade/appModel.js.map +1 -0
- package/dist/upgrade/channels.js +197 -0
- package/dist/upgrade/channels.js.map +1 -0
- package/dist/upgrade/compatibility.js +197 -0
- package/dist/upgrade/compatibility.js.map +1 -0
- package/dist/upgrade/doctor.js +368 -0
- package/dist/upgrade/doctor.js.map +1 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +412 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js.map +1 -0
- package/dist/upgrade/upgradeCommands.js +40 -0
- package/dist/upgrade/upgradeCommands.js.map +1 -0
- package/dist/upgrade/upgradeOrchestrator.js +280 -0
- package/dist/upgrade/upgradeOrchestrator.js.map +1 -0
- package/dist/validate/appHomeContract.js +150 -0
- package/dist/validate/appHomeContract.js.map +1 -0
- package/dist/validate/capability.js +412 -0
- package/dist/validate/capability.js.map +1 -0
- package/dist/validate/crossCapability.js +145 -0
- package/dist/validate/crossCapability.js.map +1 -0
- package/dist/validate/lifecycleAdapters.js +772 -0
- package/dist/validate/lifecycleAdapters.js.map +1 -0
- package/dist/validate/selfAudit.js +107 -0
- package/dist/validate/selfAudit.js.map +1 -0
- package/package.json +28 -8
- package/LICENSE +0 -201
- package/bin/agentera.mjs +0 -50
- package/lib/exec.mjs +0 -116
- package/lib/resolve.mjs +0 -129
|
@@ -0,0 +1,1039 @@
|
|
|
1
|
+
<!-- contract: agentera -->
|
|
2
|
+
<!-- source: SPEC.md (sha256: 4e1b7d31ab585371fb404917d800dc68e9e98b7deb218a9852bfebbc724968d7) -->
|
|
3
|
+
<!-- sections: 1, 2, 3, 4, 5, 6, 11, 13, 18, 19, 20, 22, 23 -->
|
|
4
|
+
<!-- generated: 2026-05-04T10:26:45Z -->
|
|
5
|
+
<!-- do not edit manually -->
|
|
6
|
+
<!-- validate: npx -y agentera check validate capability-contract -->
|
|
7
|
+
|
|
8
|
+
## 1. Confidence Scale
|
|
9
|
+
|
|
10
|
+
Canonical scale: **0-100 integer**.
|
|
11
|
+
|
|
12
|
+
Five tiers with shared boundaries. Each skill defines its own domain-specific labels describing what the tier means in its context.
|
|
13
|
+
|
|
14
|
+
| Tier | Range | Semantic |
|
|
15
|
+
|------|-------|----------|
|
|
16
|
+
| 1 (highest) | 90-100 | Verified / near-certain |
|
|
17
|
+
| 2 | 70-89 | Strong evidence / established |
|
|
18
|
+
| 3 | 50-69 | Moderate evidence / emerging |
|
|
19
|
+
| 4 | 30-49 | Weak evidence / uncertain |
|
|
20
|
+
| 5 (lowest) | 0-29 | Speculative / extrapolated |
|
|
21
|
+
|
|
22
|
+
**Rules**:
|
|
23
|
+
|
|
24
|
+
- Skills producing confidence scores MUST use integer 0-100
|
|
25
|
+
- Skills consuming confidence scores MUST interpret them against these tier boundaries
|
|
26
|
+
- Temporal decay is opt-in: skills with a temporal dimension (e.g., profilera) may apply exponential decay; skills without one (e.g., inspektera) use static scores
|
|
27
|
+
- When referencing profile consumption thresholds, use 65+ for "strong constraint" and <45 for "suggestion" (integer equivalents of the 0.0-1.0 thresholds)
|
|
28
|
+
|
|
29
|
+
**Linter check**: Deterministic. Regex for tier boundaries in SKILL.md text.
|
|
30
|
+
|
|
31
|
+
## 2. Severity Levels
|
|
32
|
+
|
|
33
|
+
Two severity vocabularies serve different purposes in the suite.
|
|
34
|
+
|
|
35
|
+
### Finding severity (audit output)
|
|
36
|
+
|
|
37
|
+
Used by skills that produce audit findings (inspektera, dokumentera, visualisera).
|
|
38
|
+
|
|
39
|
+
| Level | Meaning |
|
|
40
|
+
|-------|---------|
|
|
41
|
+
| **critical** | Broken functionality, security issue, data loss risk |
|
|
42
|
+
| **warning** | Works but poorly: fragile, confusing, or degraded |
|
|
43
|
+
| **info** | Minor: cosmetic, style, low-impact improvement |
|
|
44
|
+
|
|
45
|
+
### Issue severity (TODO.md)
|
|
46
|
+
|
|
47
|
+
Used by all skills that file to TODO.md.
|
|
48
|
+
|
|
49
|
+
| Level | Glyph | Meaning |
|
|
50
|
+
|-------|-------|---------|
|
|
51
|
+
| **critical** | ⇶ | Broken functionality, blocks progress |
|
|
52
|
+
| **degraded** | ⇉ | Works but poorly: slow, fragile, ugly |
|
|
53
|
+
| **normal** | → | Standard work: features, improvements, routine tasks |
|
|
54
|
+
| **annoying** | ⇢ | Cosmetic, minor friction, style nit |
|
|
55
|
+
|
|
56
|
+
### Mapping
|
|
57
|
+
|
|
58
|
+
When filing audit findings to TODO.md, map as follows:
|
|
59
|
+
|
|
60
|
+
| Finding severity | → | Issue severity |
|
|
61
|
+
|-----------------|---|----------------|
|
|
62
|
+
| critical | → | critical |
|
|
63
|
+
| warning | → | degraded or normal |
|
|
64
|
+
| info | → | annoying |
|
|
65
|
+
|
|
66
|
+
### TODO.md format convention
|
|
67
|
+
|
|
68
|
+
TODO.md uses a conventional checkbox format grouped by severity. Skills write items as Markdown checkboxes under severity headings:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
# TODO
|
|
72
|
+
|
|
73
|
+
## ⇶ Critical
|
|
74
|
+
- [ ] ISS-N: [type] Description
|
|
75
|
+
|
|
76
|
+
## ⇉ Degraded
|
|
77
|
+
- [ ] ISS-N: [type] Description
|
|
78
|
+
|
|
79
|
+
## → Normal
|
|
80
|
+
- [ ] ISS-N: [type] Description
|
|
81
|
+
|
|
82
|
+
## ⇢ Annoying
|
|
83
|
+
- [ ] ISS-N: [type] Description
|
|
84
|
+
|
|
85
|
+
## Resolved
|
|
86
|
+
- [x] ~~ISS-N: [type] Description~~ · resolved in commit hash
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Type tags use the conventional commit vocabulary: feat, fix, docs, refactor, chore, test, perf.
|
|
90
|
+
|
|
91
|
+
The severity vocabulary (critical/degraded/annoying) is preserved as section headings with severity glyphs. Checkboxes indicate completion state. Resolved items move to the Resolved section with strikethrough and commit reference.
|
|
92
|
+
|
|
93
|
+
**Linter check**: Deterministic. Exact string matching for severity terms in context.
|
|
94
|
+
|
|
95
|
+
## 3. Decision Confidence Labels
|
|
96
|
+
|
|
97
|
+
Used in DECISIONS.md entries (produced by resonera, consumed by realisera, planera, inspektera, profilera).
|
|
98
|
+
|
|
99
|
+
| Label | Meaning | How consuming skills treat it |
|
|
100
|
+
|-------|---------|-------------------------------|
|
|
101
|
+
| **firm** | User is committed | Treat as a hard constraint |
|
|
102
|
+
| **provisional** | Best current answer, open to revision | Treat as a strong default |
|
|
103
|
+
| **exploratory** | Direction to try, expected to be revisited | Treat as a suggestion |
|
|
104
|
+
|
|
105
|
+
**Linter check**: Deterministic. Enum values in DECISIONS.md format definition.
|
|
106
|
+
|
|
107
|
+
## 4. Artifact Format Contracts
|
|
108
|
+
|
|
109
|
+
Each skill-maintained artifact has an expected structure. Producing skills define the format; consuming skills depend on it.
|
|
110
|
+
|
|
111
|
+
### Default layout
|
|
112
|
+
|
|
113
|
+
Three project-facing files at the project root; nine operational files in `.agentera/`.
|
|
114
|
+
|
|
115
|
+
**Root (project-facing)**:
|
|
116
|
+
|
|
117
|
+
| File | Purpose |
|
|
118
|
+
|------|---------|
|
|
119
|
+
| VISION.md | Project north star |
|
|
120
|
+
| TODO.md | Actionable items with priority and checkboxes |
|
|
121
|
+
| CHANGELOG.md | Version-level change summaries (keep-a-changelog) |
|
|
122
|
+
|
|
123
|
+
**.agentera/ (operational)**:
|
|
124
|
+
|
|
125
|
+
| File | Purpose |
|
|
126
|
+
|------|---------|
|
|
127
|
+
| PROGRESS.md | Cycle-by-cycle operational log |
|
|
128
|
+
| DECISIONS.md | Reasoning trail |
|
|
129
|
+
| PLAN.md | Active work plan |
|
|
130
|
+
| HEALTH.md | Audit grades and findings |
|
|
131
|
+
| OBJECTIVE.md | Optimization target (per-objective, under `.agentera/optimera/<name>/`) |
|
|
132
|
+
| EXPERIMENTS.md | Experiment log (per-objective, under `.agentera/optimera/<name>/`) |
|
|
133
|
+
| DESIGN.md | Visual identity |
|
|
134
|
+
| DOCS.md | Documentation contract + optional artifact path overrides |
|
|
135
|
+
| archive/ | Completed plans, superseded visions and designs |
|
|
136
|
+
|
|
137
|
+
**PROFILE.md** is global. Profilera determines the platform-appropriate data directory: `$PROFILERA_PROFILE_DIR/PROFILE.md` (defaulting to `$XDG_DATA_HOME/agentera/PROFILE.md` on Linux, `~/Library/Application Support/agentera/PROFILE.md` on macOS, `%APPDATA%/agentera/PROFILE.md` on Windows). <!-- platform: profile-path --> Skills read it from the profilera-determined path directly. PROFILERA_PROFILE_DIR is the sibling of AGENTERA_HOME (Section 7): both are adapter-injected env vars. PROFILERA_PROFILE_DIR scopes to profile data; AGENTERA_HOME scopes to the Agentera app home. User data such as PROFILE.md, USAGE.md, history, and intermediate corpus data stays at the app-home root; managed app code lives separately under `$AGENTERA_HOME/app`.
|
|
138
|
+
|
|
139
|
+
### Format contracts
|
|
140
|
+
|
|
141
|
+
| Artifact | Path | Producer | Consumers | Key structural elements |
|
|
142
|
+
|----------|------|----------|-----------|------------------------|
|
|
143
|
+
| VISION.md | .agentera/vision.yaml | visionera, realisera | realisera, planera, inspektera, dokumentera, visualisera, orkestrera | north_star, personas, principles, direction, identity |
|
|
144
|
+
| TODO.md | TODO.md | realisera, inspektera | realisera, planera, orkestrera | ## ⇶ Critical, ## ⇉ Degraded, ## → Normal, ## ⇢ Annoying, ## Resolved |
|
|
145
|
+
| CHANGELOG.md | CHANGELOG.md | realisera | project contributors | ## [Unreleased], ### Added/Changed/Fixed |
|
|
146
|
+
| DECISIONS.md | .agentera/decisions.yaml | resonera | planera, realisera, inspektera, profilera, optimera, orkestrera | ## Decision N · date, **Question/Context/Alternatives/Choice/Reasoning/Confidence/Feeds into** |
|
|
147
|
+
| PLAN.md | .agentera/plan.yaml | planera | realisera, inspektera, orkestrera | <!-- Level/Created/Status -->, ## Tasks with ### Task N, **Status/Depends on/Acceptance** |
|
|
148
|
+
| PROGRESS.md | .agentera/progress.yaml | realisera | planera, inspektera, dokumentera, visionera, orkestrera | ## Cycle N · date, **Phase/What/Commit/Inspiration/Discovered/Next/Context** |
|
|
149
|
+
| HEALTH.md | .agentera/health.yaml | inspektera | realisera, planera, orkestrera | ## Audit N · date, **Dimensions/Findings/Overall/Grades**, per-dimension sections |
|
|
150
|
+
| OBJECTIVE.md | .agentera/optimera/<name>/objective.yaml | optimera | optimera | ## Metric, ## Target, ## Baseline, ## Constraints, **Status** |
|
|
151
|
+
| EXPERIMENTS.md | .agentera/optimera/<name>/experiments.yaml | optimera | optimera | ## Experiment N · date, **Hypothesis/Method/Result/Conclusion**; ## Closure · date, **Final value/Target/Reason** |
|
|
152
|
+
| DESIGN.md | DESIGN.md | visualisera | realisera, visionera | Standard design sections with embedded `design:` YAML blocks |
|
|
153
|
+
| DOCS.md | .agentera/docs.yaml | dokumentera | all skills (path resolution) | conventions, mapping, index |
|
|
154
|
+
| PROFILE.md | (profile-path capability) <!-- platform: profile-path --> | profilera | all skills (directly when present) | ## Category, ### Decision, inline conf metadata |
|
|
155
|
+
|
|
156
|
+
**Dual-write**: realisera writes both CHANGELOG.md (public, version-level summaries for project contributors) AND `.agentera/progress.yaml` (operational cycle-level detail for consuming skills). Consuming skills that need cycle detail read `.agentera/progress.yaml`; project contributors read CHANGELOG.md.
|
|
157
|
+
|
|
158
|
+
**Per-objective layout (optimera)**: OBJECTIVE.md and EXPERIMENTS.md are canonical artifact names, not fixed filenames. Each named optimization objective gets its own subdirectory under `.agentera/optimera/<name>/`, where `<name>` is the slugified objective name, with `objective.yaml` and `experiments.yaml` inside it. Optimera manages this layout; other skills do not read or write these artifacts directly.
|
|
159
|
+
|
|
160
|
+
**Objective closure contract (optimera)**: When an objective reaches its target, optimera closes that objective inside its own directory. `objective.yaml` records canonical closed state with `status: closed`, `closed_at`, `final_value`, `target`, and `reason`. `experiments.yaml` appends one `closure` entry with the same final evidence. Closure never creates a registry, symlink, root-level objective artifact, or DOCS.md fixed mapping.
|
|
161
|
+
|
|
162
|
+
### HEALTH.md audit dimensions
|
|
163
|
+
|
|
164
|
+
Inspektera assesses codebases across these dimensions, selecting applicable ones per audit. Each dimension produces an A-F grade, confidence-scored findings, and trend tracking.
|
|
165
|
+
|
|
166
|
+
| Dimension | What it evaluates |
|
|
167
|
+
|-----------|-------------------|
|
|
168
|
+
| Architecture alignment | Code vs stated architecture: pattern mismatches, boundary violations, layering breaks |
|
|
169
|
+
| Pattern consistency | Naming, error handling, structure, abstractions used consistently |
|
|
170
|
+
| Coupling health | Hidden dependencies, circular imports, god modules, inappropriate intimacy |
|
|
171
|
+
| Complexity hotspots | Long functions, deep nesting, high fan-out, accumulated conditionals |
|
|
172
|
+
| Test health | Coverage gaps, test quality, test-to-code ratio, behavior vs implementation testing |
|
|
173
|
+
| Dependency health | Outdated deps, security advisories, unused deps, pinning discipline |
|
|
174
|
+
| Version health | Unreleased feat/fix commits since last version bump |
|
|
175
|
+
| Artifact freshness | State artifacts current relative to plan activity or recent development |
|
|
176
|
+
| Security hygiene | Hardcoded secrets, dangerous function calls, basic injection patterns (lightweight regex scan; recommends dedicated tools for comprehensive analysis) |
|
|
177
|
+
|
|
178
|
+
### CHANGELOG.md format convention
|
|
179
|
+
|
|
180
|
+
CHANGELOG.md follows the [Keep a Changelog](https://keepachangelog.com/) convention:
|
|
181
|
+
|
|
182
|
+
```markdown
|
|
183
|
+
# Changelog
|
|
184
|
+
|
|
185
|
+
## [Unreleased]
|
|
186
|
+
|
|
187
|
+
### Added
|
|
188
|
+
- description
|
|
189
|
+
|
|
190
|
+
### Changed
|
|
191
|
+
- description
|
|
192
|
+
|
|
193
|
+
### Fixed
|
|
194
|
+
- description
|
|
195
|
+
|
|
196
|
+
## [version] · YYYY-MM-DD
|
|
197
|
+
|
|
198
|
+
### Added
|
|
199
|
+
- description
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Realisera appends entries under `## [Unreleased]` in the appropriate subsection (Added/Changed/Fixed) based on the conventional commit type (feat → Added, refactor → Changed, fix → Fixed). On version bumps, the Unreleased section is promoted to a versioned heading.
|
|
203
|
+
|
|
204
|
+
**Linter check**: Advisory. Flags missing structural elements as warnings, not errors.
|
|
205
|
+
|
|
206
|
+
### Token budgets
|
|
207
|
+
|
|
208
|
+
Per-artifact word limits. Producing skills check approximate word count before writing. If a write would exceed the budget, compact first (see Compaction thresholds below).
|
|
209
|
+
|
|
210
|
+
| Artifact | Scope | Budget |
|
|
211
|
+
|----------|-------|--------|
|
|
212
|
+
| PROGRESS.md | Per-cycle entry | ≤500 words |
|
|
213
|
+
| PROGRESS.md | Full file | ≤3,000 words |
|
|
214
|
+
| EXPERIMENTS.md | Per-experiment entry | ≤300 words |
|
|
215
|
+
| EXPERIMENTS.md | Full file | ≤2,500 words |
|
|
216
|
+
| HEALTH.md | Per-dimension assessment | ≤150 words |
|
|
217
|
+
| HEALTH.md | Full file | ≤2,000 words |
|
|
218
|
+
| DECISIONS.md | Per-decision entry | ≤200 words |
|
|
219
|
+
| TODO.md | Per-item entry | ≤100 words |
|
|
220
|
+
| CHANGELOG.md | Per-version section | ≤300 words |
|
|
221
|
+
| PLAN.md | Per-task entry | ≤100 words |
|
|
222
|
+
| PLAN.md | Full file | ≤2,500 words |
|
|
223
|
+
| VISION.md | Full file | ≤1,500 words |
|
|
224
|
+
| DESIGN.md | Full file | ≤2,000 words |
|
|
225
|
+
| DOCS.md | Full file | ≤2,000 words |
|
|
226
|
+
|
|
227
|
+
Budgets are guidelines, not hard blockers. A 510-word cycle entry is fine; a 1,200-word entry signals the write step lacks output constraints.
|
|
228
|
+
|
|
229
|
+
### Content exclusion
|
|
230
|
+
|
|
231
|
+
Artifacts store judgments, intent, reasoning, and context that would be lost without them: the non-derivable residue. Do not duplicate state retrievable from the project's files or history with a deterministic command.
|
|
232
|
+
|
|
233
|
+
| Exclude from artifacts | Retrieve from |
|
|
234
|
+
|------------------------|---------------|
|
|
235
|
+
| Files modified in a cycle | `git log --stat` |
|
|
236
|
+
| Function signatures from audits | `Grep` against source code |
|
|
237
|
+
| Dependency versions | Manifest files (package.json, go.mod, etc.) |
|
|
238
|
+
| Lines of code per module | `wc -l` or Glob + Read |
|
|
239
|
+
| Code snippets in PROGRESS.md | Commit diffs (`git show`) |
|
|
240
|
+
| Test names enumerated in findings | `Grep` against test files |
|
|
241
|
+
|
|
242
|
+
The test: if a reader can reconstruct the information from the project's current state or git history, it does not belong in the artifact.
|
|
243
|
+
|
|
244
|
+
### Compaction thresholds
|
|
245
|
+
|
|
246
|
+
Growing artifacts are compacted to cap read cost for consuming skills. Compaction runs when the producing skill writes a new entry. All growing artifacts follow a uniform 10/40/50 rule: 10 full-detail entries, 40 one-line archive entries, drop beyond 50 total.
|
|
247
|
+
|
|
248
|
+
**CHANGELOG.md is exempt**: it is the public version-level history and is not compacted.
|
|
249
|
+
|
|
250
|
+
**PROGRESS.md**, compacted by realisera when writing a new cycle entry:
|
|
251
|
+
|
|
252
|
+
| Tier | Entries | Format |
|
|
253
|
+
|------|---------|--------|
|
|
254
|
+
| Full detail | 10 most recent cycles | Standard cycle entry format |
|
|
255
|
+
| One-line archive | Cycles 11 through 50 | `Cycle N (YYYY-MM-DD): ≤15-word summary` |
|
|
256
|
+
| Dropped | Cycles older than 50 | Removed entirely |
|
|
257
|
+
|
|
258
|
+
When writing a new cycle: if >10 full-detail entries exist, collapse the oldest to one-line format under an `## Archived Cycles` heading (below the recent cycles). If >40 one-line entries exist, drop the oldest. One-line summaries preserve cycle number, date, and work-type, enough for trend analysis by consuming skills.
|
|
259
|
+
|
|
260
|
+
Active cycle entries are stored newest-first: descending by cycle number. Insert the newest full-detail cycle before older active cycles so `agentera progress --limit 1` reads the current cycle without scanning the full file.
|
|
261
|
+
|
|
262
|
+
**EXPERIMENTS.md**, compacted by optimera when writing a new experiment:
|
|
263
|
+
|
|
264
|
+
| Tier | Entries | Format |
|
|
265
|
+
|------|---------|--------|
|
|
266
|
+
| Full detail | 10 most recent experiments | Standard experiment entry format |
|
|
267
|
+
| One-line archive | Experiments 11 through 50 | `EXP-N: ≤15-word result summary` |
|
|
268
|
+
| Dropped | Experiments older than 50 | Removed entirely |
|
|
269
|
+
|
|
270
|
+
Same logic: collapse oldest full-detail to one-line when >10 exist. Drop oldest one-line when >40 one-line entries exist. Archive section sits below recent experiments under an `## Archived Experiments` heading.
|
|
271
|
+
|
|
272
|
+
**DECISIONS.md**, compacted by resonera when writing a new decision:
|
|
273
|
+
|
|
274
|
+
| Tier | Entries | Format |
|
|
275
|
+
|------|---------|--------|
|
|
276
|
+
| Full detail | 10 most recent decisions | Standard decision entry format |
|
|
277
|
+
| One-line archive | Decisions 11 through 50 | `Decision N (YYYY-MM-DD): [Choice] — ≤15-word summary` |
|
|
278
|
+
| Dropped | Decisions older than 50 | Removed entirely |
|
|
279
|
+
|
|
280
|
+
Same logic: collapse oldest full-detail to one-line when >10 exist. Drop oldest one-line when >40 one-line entries exist. Archive section sits below recent decisions under an `## Archived Decisions` heading. One-line summaries preserve decision number, date, and the chosen alternative.
|
|
281
|
+
|
|
282
|
+
When writing a new decision, choose `N` as one greater than the highest decision number in active and archived entries. Insert the new full entry in the active section immediately before `## Archived Decisions`; if no archive exists, append it at the end of the file. Active decision entries must have unique numbers and remain ascending by decision number. Do not reuse or renumber decisions except when repairing artifact corruption.
|
|
283
|
+
|
|
284
|
+
**Linter check**: Deterministic. Artifact validation rejects duplicate decision numbers and descending active decision order.
|
|
285
|
+
|
|
286
|
+
**HEALTH.md**, compacted by inspektera when writing a new audit:
|
|
287
|
+
|
|
288
|
+
| Tier | Entries | Format |
|
|
289
|
+
|------|---------|--------|
|
|
290
|
+
| Full detail | 10 most recent audits | Standard audit entry format |
|
|
291
|
+
| One-line archive | Audits 11 through 50 | `Audit N (YYYY-MM-DD): [grade] — ≤15-word summary` |
|
|
292
|
+
| Dropped | Audits older than 50 | Removed entirely |
|
|
293
|
+
|
|
294
|
+
Same logic: collapse oldest full-detail to one-line when >10 exist. Drop oldest one-line when >40 one-line entries exist. Archive section sits below recent audits under an `## Archived Audits` heading. One-line summaries preserve audit number, date, overall grade, and trajectory.
|
|
295
|
+
|
|
296
|
+
**TODO.md Resolved section**, compacted by realisera when marking an item resolved:
|
|
297
|
+
|
|
298
|
+
| Tier | Entries | Format |
|
|
299
|
+
|------|---------|--------|
|
|
300
|
+
| Full detail | 10 most recent resolved items | Standard resolved entry format |
|
|
301
|
+
| One-line archive | Items 11 through 50 | `- [x] ~~[ISS-NN]: ≤15-word resolution summary~~` |
|
|
302
|
+
| Dropped | Items older than 50 | Removed entirely |
|
|
303
|
+
|
|
304
|
+
Same logic: collapse oldest full-detail to one-line when >10 exist. Drop oldest one-line when >40 one-line entries exist. Compaction applies only within the `## Resolved` section; active severity sections are not affected.
|
|
305
|
+
|
|
306
|
+
## 5. Artifact Path Resolution
|
|
307
|
+
|
|
308
|
+
The default artifact layout is deterministic (see Section 4, Default layout). Skills know where artifacts live by convention, so no discovery step is required for the default case.
|
|
309
|
+
|
|
310
|
+
`.agentera/docs.yaml` is checked ONLY for path overrides. If a project needs artifacts in non-default locations, dokumentera writes an Artifact Mapping section to `.agentera/docs.yaml` with custom paths. Skills use those paths instead of the defaults.
|
|
311
|
+
|
|
312
|
+
Every skill that reads or writes artifacts MUST include the artifact path resolution instruction. The canonical template:
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
### Artifact path resolution
|
|
316
|
+
|
|
317
|
+
Before reading or writing any artifact, check if .agentera/docs.yaml exists. If it has an
|
|
318
|
+
Artifact Mapping section, use the path specified for each canonical filename ({OWN_ARTIFACTS},
|
|
319
|
+
etc.). If .agentera/docs.yaml doesn't exist or has no mapping for a given artifact, use the
|
|
320
|
+
default layout: TODO.md, CHANGELOG.md, and DESIGN.md at the project root; canonical VISION.md
|
|
321
|
+
resolves to .agentera/vision.yaml; other agent-facing artifacts resolve to YAML files in .agentera/.
|
|
322
|
+
This applies to all artifact references in this skill, including cross-skill
|
|
323
|
+
{reads_or_writes} ({CROSS_ARTIFACTS}).
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Where:
|
|
327
|
+
|
|
328
|
+
- `{OWN_ARTIFACTS}` = the skill's own artifact filenames
|
|
329
|
+
- `{reads_or_writes}` = "reads", "writes", or "reads and writes" as appropriate
|
|
330
|
+
- `{CROSS_ARTIFACTS}` = artifacts from other skills that this skill accesses
|
|
331
|
+
|
|
332
|
+
The section MUST appear under "## State artifacts" (not under cross-skill integration or elsewhere).
|
|
333
|
+
|
|
334
|
+
**Linter check**: Deterministic. Section presence under correct parent heading, core sentence pattern matching.
|
|
335
|
+
|
|
336
|
+
## 6. Profile Consumption
|
|
337
|
+
|
|
338
|
+
Skills that read the decision profile use one of two patterns:
|
|
339
|
+
|
|
340
|
+
### Script pattern (for skills that need confidence-weighted summaries)
|
|
341
|
+
|
|
342
|
+
```
|
|
343
|
+
Read `$PROFILERA_PROFILE_DIR/PROFILE.md` directly
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Run from the profilera skill directory. Mentioned skills: realisera, optimera, inspektera, planera, inspirera.
|
|
347
|
+
|
|
348
|
+
Standard threshold language (after migration to 0-100):
|
|
349
|
+
|
|
350
|
+
- "high effective confidence entries (65+) are strong constraints"
|
|
351
|
+
- "low effective confidence entries (<45) are suggestions"
|
|
352
|
+
|
|
353
|
+
### Direct read pattern (for skills that need qualitative profile context)
|
|
354
|
+
|
|
355
|
+
Read PROFILE.md from the profilera-determined profile path (`$PROFILERA_PROFILE_DIR/PROFILE.md`, defaulting to `$XDG_DATA_HOME/agentera/PROFILE.md` on Linux). <!-- platform: profile-path --> Mentioned skills: resonera, visionera, dokumentera, visualisera.
|
|
356
|
+
|
|
357
|
+
Both patterns MUST include a fallback instruction:
|
|
358
|
+
"If the script or PROFILE.md is missing, proceed without persona grounding."
|
|
359
|
+
|
|
360
|
+
**Linter check**: Deterministic. Script invocation syntax, threshold values, fallback instruction presence.
|
|
361
|
+
|
|
362
|
+
PROFILERA_PROFILE_DIR is the sibling of AGENTERA_HOME (Section 7): both are adapter-injected env vars, but they scope to different surfaces. PROFILERA_PROFILE_DIR names the profile data directory where PROFILE.md lives; AGENTERA_HOME names the Agentera app home. User data remains at the app-home root; helper scripts referenced by skill prose live in the managed app under `$AGENTERA_HOME/app`.
|
|
363
|
+
|
|
364
|
+
## 11. Exit Signals
|
|
365
|
+
|
|
366
|
+
Every skill MUST report a completion status at the end of its workflow. This enables downstream skills, orchestration layers, and the user to determine what happened without parsing natural language.
|
|
367
|
+
|
|
368
|
+
### Statuses
|
|
369
|
+
|
|
370
|
+
| Status | Meaning | When to use |
|
|
371
|
+
|--------|---------|-------------|
|
|
372
|
+
| **complete** | All steps completed successfully | The skill's workflow ran to completion and all acceptance criteria (if any) were met |
|
|
373
|
+
| **flagged** | Completed, but with issues the user should know about | The workflow completed but discovered problems, made compromises, or has caveats worth surfacing |
|
|
374
|
+
| **stuck** | Cannot proceed | A hard blocker prevents completion: missing dependency, permission issue, ambiguous requirement too consequential to resolve autonomously |
|
|
375
|
+
| **waiting** | Missing information required to continue | The skill needs input, clarification, or a decision from the user or another skill before it can proceed |
|
|
376
|
+
|
|
377
|
+
### Rules
|
|
378
|
+
|
|
379
|
+
- Skills MUST report exactly one status at workflow completion
|
|
380
|
+
- The status MUST appear in a `## Exit signals` section in each SKILL.md, defining when the skill reports each status with skill-specific guidance
|
|
381
|
+
- `flagged` MUST list each concern. A bare status without details is not acceptable
|
|
382
|
+
- `stuck` and `waiting` MUST state what is blocking / what is needed and what was attempted
|
|
383
|
+
- The `## Exit signals` section is a peer to `## Safety rails` (not nested inside it)
|
|
384
|
+
|
|
385
|
+
### SKILL.md structural requirement
|
|
386
|
+
|
|
387
|
+
Each SKILL.md MUST contain a `## Exit signals` section with:
|
|
388
|
+
|
|
389
|
+
1. All four status terms (complete, flagged, stuck, waiting)
|
|
390
|
+
2. Skill-specific guidance on when each status applies in that skill's context
|
|
391
|
+
|
|
392
|
+
**Linter check**: Deterministic. `## Exit signals` heading presence, all four status terms present in the section content (`exit-signals`).
|
|
393
|
+
|
|
394
|
+
## 13. Visual Identity
|
|
395
|
+
|
|
396
|
+
The suite has a shared visual vocabulary defined in DESIGN.md (the project-level visual identity, maintained by visualisera). This section defines the conventions that all SKILL.md files follow when formatting output and artifact content.
|
|
397
|
+
|
|
398
|
+
DESIGN.md is the source of truth for token definitions. This spec defines how skills use those tokens: introduction patterns, semantic roles, and composition rules. Skills include actual glyph characters inline in their output format examples (they run in target projects without access to this repo's DESIGN.md).
|
|
399
|
+
|
|
400
|
+
### Skill glyphs
|
|
401
|
+
|
|
402
|
+
Each skill has a unique Unicode glyph used as a subtle signature in output.
|
|
403
|
+
|
|
404
|
+
| Skill | Glyph | Code | Meaning |
|
|
405
|
+
|-------|-------|------|---------|
|
|
406
|
+
| hej | ⌂ | U+2302 | home base |
|
|
407
|
+
| realisera | ⧉ | U+29C9 | joined building blocks |
|
|
408
|
+
| inspektera | ⛶ | U+26F6 | viewfinder frame |
|
|
409
|
+
| resonera | ❈ | U+2748 | spark of insight |
|
|
410
|
+
| planera | ≡ | U+2261 | structured layers |
|
|
411
|
+
| visionera | ⛥ | U+26E5 | guiding star |
|
|
412
|
+
| optimera | ⎘ | U+2398 | measurement |
|
|
413
|
+
| dokumentera | ▤ | U+25A4 | text on page |
|
|
414
|
+
| profilera | ♾ | U+267E | permanent mark |
|
|
415
|
+
| inspirera | ⬚ | U+2B1A | frame to fill |
|
|
416
|
+
| visualisera | ◰ | U+25F0 | design grid |
|
|
417
|
+
| orkestrera | ⎈ | U+2388 | helm, steering |
|
|
418
|
+
|
|
419
|
+
### Semantic tokens
|
|
420
|
+
|
|
421
|
+
Six token families express status, urgency, certainty, and direction.
|
|
422
|
+
|
|
423
|
+
**Status** (task/item completion, square fill progression):
|
|
424
|
+
|
|
425
|
+
| State | Glyph | Code |
|
|
426
|
+
|-------|-------|------|
|
|
427
|
+
| complete | ■ | U+25A0 |
|
|
428
|
+
| in-progress | ▣ | U+25A3 |
|
|
429
|
+
| open | □ | U+25A1 |
|
|
430
|
+
| blocked | ▨ | U+25A8 |
|
|
431
|
+
|
|
432
|
+
**Severity** (issue priority, rightward arrows, more arrows = higher priority):
|
|
433
|
+
|
|
434
|
+
| Level | Glyph | Code |
|
|
435
|
+
|-------|-------|------|
|
|
436
|
+
| critical | ⇶ | U+21F6 |
|
|
437
|
+
| degraded | ⇉ | U+21C9 |
|
|
438
|
+
| normal | → | U+2192 |
|
|
439
|
+
| annoying | ⇢ | U+21E2 |
|
|
440
|
+
|
|
441
|
+
**Confidence** (decision certainty, box-drawing line weight):
|
|
442
|
+
|
|
443
|
+
| Level | Glyph | Code |
|
|
444
|
+
|-------|-------|------|
|
|
445
|
+
| firm | ━ | U+2501 |
|
|
446
|
+
| provisional | ─ | U+2500 |
|
|
447
|
+
| exploratory | ┄ | U+2504 |
|
|
448
|
+
|
|
449
|
+
**Trends** (direction of change):
|
|
450
|
+
|
|
451
|
+
| Direction | Glyph | Code |
|
|
452
|
+
|-----------|-------|------|
|
|
453
|
+
| improving | ⮉ | U+2B89 |
|
|
454
|
+
| degrading | ⮋ | U+2B8B |
|
|
455
|
+
|
|
456
|
+
**Structural** (layout primitives):
|
|
457
|
+
|
|
458
|
+
| Element | Glyph/Pattern | Code |
|
|
459
|
+
|---------|---------------|------|
|
|
460
|
+
| section divider | `─── label ───────` | U+2500 |
|
|
461
|
+
| list item | ▸ | U+25B8 |
|
|
462
|
+
| inline separator | · | U+00B7 |
|
|
463
|
+
| flow / target | → | U+2192 |
|
|
464
|
+
| progress bar | █▓░ | U+2588/2593/2591 |
|
|
465
|
+
|
|
466
|
+
### Composition rules
|
|
467
|
+
|
|
468
|
+
- **Skill introduction**: every skill opens with `─── glyph skillname · context ───`.
|
|
469
|
+
SKILL.md files reference this with the canonical instruction: `Skill introduction:` followed by the pattern with the skill's glyph and context word. Exception: hej uses the agentera logo instead of the standard opener.
|
|
470
|
+
- **Skill exit**: every skill closes with the same divider pattern, replacing the context word with the exit status: `─── glyph skillname · status ───`. See Exit signal format below.
|
|
471
|
+
- **Step progress**: skills with 4+ workflow steps show `── step N/M: verb` markers between steps. See Step markers below.
|
|
472
|
+
- **Logo placement**: the agentera logo (box-drawing characters) appears at key moments only: hej dashboard, major completions. Not every skill invocation.
|
|
473
|
+
- **Open structure**: no outer frames except the logo. Breathing room (blank lines) between sections. Section headers are clean labels: no glyphs in `##` Markdown headers.
|
|
474
|
+
- **Narrative position**: summaries close sections, not open them.
|
|
475
|
+
- **Markdown layering**: all artifacts stay valid standard Markdown. Visual tokens layer within sections alongside existing `##` headers, `**bold**` labels, and tables.
|
|
476
|
+
|
|
477
|
+
### Divider hierarchy
|
|
478
|
+
|
|
479
|
+
Three levels of visual dividers create a consistent hierarchy across skill output.
|
|
480
|
+
|
|
481
|
+
| Level | Pattern | Use |
|
|
482
|
+
|-------|---------|-----|
|
|
483
|
+
| Skill boundary | `─── glyph skillname · context ───` | Session opener, exit signal |
|
|
484
|
+
| Step boundary | `── step N/M: verb` | Workflow progress between steps |
|
|
485
|
+
| Container | `── label` | Mid-session blocks (scratchpad, etc.) |
|
|
486
|
+
|
|
487
|
+
Step and container dividers share the same visual weight (2-dash), differentiated by label content: step boundaries use `step N/M: verb`, containers use a descriptive label.
|
|
488
|
+
|
|
489
|
+
### Exit signal format
|
|
490
|
+
|
|
491
|
+
The exit signal's visual output matches the status reported. All four statuses use the skill boundary divider, followed by a summary and (for non-complete statuses) bullet details.
|
|
492
|
+
|
|
493
|
+
**complete**:
|
|
494
|
+
|
|
495
|
+
```
|
|
496
|
+
─── glyph skillname · complete ───
|
|
497
|
+
|
|
498
|
+
Summary sentence.
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
**flagged**:
|
|
502
|
+
|
|
503
|
+
```
|
|
504
|
+
─── glyph skillname · flagged ───
|
|
505
|
+
|
|
506
|
+
Summary sentence.
|
|
507
|
+
|
|
508
|
+
▸ concern one
|
|
509
|
+
▸ concern two
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
**stuck**:
|
|
513
|
+
|
|
514
|
+
```
|
|
515
|
+
─── glyph skillname · stuck ───
|
|
516
|
+
|
|
517
|
+
Summary sentence.
|
|
518
|
+
|
|
519
|
+
▸ blocked: what is blocking
|
|
520
|
+
▸ tried: what was attempted
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**waiting**:
|
|
524
|
+
|
|
525
|
+
```
|
|
526
|
+
─── glyph skillname · waiting ───
|
|
527
|
+
|
|
528
|
+
Summary sentence.
|
|
529
|
+
|
|
530
|
+
▸ needs: what is required to proceed
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
### Step markers
|
|
534
|
+
|
|
535
|
+
Skills with 4+ workflow steps display progress markers between steps:
|
|
536
|
+
|
|
537
|
+
```
|
|
538
|
+
── step N/M: verb
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
N is the current step number, M is the total step count for the current mode, and verb is the step's bare-verb name (lowercase).
|
|
542
|
+
|
|
543
|
+
Rules:
|
|
544
|
+
|
|
545
|
+
- Step 0 (mode detection/gates) is excluded from the count: markers start at Step 1
|
|
546
|
+
- Skills with multiple modes use per-mode N/M counts (e.g., Create mode 1/4, Refine mode 1/4)
|
|
547
|
+
- Excluded skills: hej (uses dashboard format), resonera (interactive Q&A with scratchpad)
|
|
548
|
+
|
|
549
|
+
### Token-to-artifact mapping
|
|
550
|
+
|
|
551
|
+
| Artifact | Token families used |
|
|
552
|
+
|----------|---------------------|
|
|
553
|
+
| PLAN.md | Status (■/▣/□/▨) for task states |
|
|
554
|
+
| TODO.md | Severity (⇶/⇉/→/⇢) in section headings, Status (□/■) via checkboxes |
|
|
555
|
+
| DECISIONS.md | Confidence (━/─/┄) alongside confidence labels |
|
|
556
|
+
| HEALTH.md | Trends (⮉/⮋) for trajectory, severity for findings |
|
|
557
|
+
| PROGRESS.md | Status (■) for cycle completion markers |
|
|
558
|
+
| VISION.md | Structural (▸, ·) for principles and direction |
|
|
559
|
+
| DOCS.md | Structural (▸, ·) for index, status tokens for coverage |
|
|
560
|
+
|
|
561
|
+
### Rules
|
|
562
|
+
|
|
563
|
+
- Skills producing formatted output MUST use their assigned glyph in the skill introduction pattern
|
|
564
|
+
- Skills producing or consuming artifacts SHOULD use the token families specified in the token-to-artifact mapping
|
|
565
|
+
- Semantic tokens augment existing text labels, they do not replace them
|
|
566
|
+
(`⇶ critical` not just `⇶`)
|
|
567
|
+
- New skills MUST be assigned a glyph in DESIGN.md before their SKILL.md is finalized
|
|
568
|
+
|
|
569
|
+
**Linter check**: Advisory. Presence of skill glyph in SKILL.md output format sections.
|
|
570
|
+
|
|
571
|
+
## 18. Phase Tracking
|
|
572
|
+
|
|
573
|
+
Every realisera cycle operates in one of five phases. Phases map the suite's skills to a lifecycle model, making it possible for consuming skills to reason about what kind of work a cycle performed and whether phase transitions follow a coherent sequence.
|
|
574
|
+
|
|
575
|
+
### Phases
|
|
576
|
+
|
|
577
|
+
| Phase | Skills | Purpose |
|
|
578
|
+
|-------|--------|---------|
|
|
579
|
+
| **envision** | visionera | Define or refine the project's north star |
|
|
580
|
+
| **deliberate** | resonera | Reason through decisions before committing to a direction |
|
|
581
|
+
| **plan** | planera | Structure work into tasks with dependencies and acceptance criteria |
|
|
582
|
+
| **build** | realisera, optimera, dokumentera, visualisera | Implement, optimize, document, or design |
|
|
583
|
+
| **audit** | inspektera | Evaluate structural health and alignment |
|
|
584
|
+
|
|
585
|
+
### Transitions
|
|
586
|
+
|
|
587
|
+
Phases have valid successors. A cycle's phase is determined by the primary skill performing work, not by the phase of the previous cycle (phases are not a strict pipeline).
|
|
588
|
+
|
|
589
|
+
| From | Valid successors |
|
|
590
|
+
|------|-----------------|
|
|
591
|
+
| envision | deliberate, plan, build |
|
|
592
|
+
| deliberate | plan, build, envision |
|
|
593
|
+
| plan | build, deliberate |
|
|
594
|
+
| build | build, audit, plan |
|
|
595
|
+
| audit | build, plan, deliberate, envision |
|
|
596
|
+
|
|
597
|
+
**Terminal states**: audit and build are terminal in the sense that a project can remain in either phase indefinitely (continuous building, periodic auditing). envision, deliberate, and plan are transitional: they produce artifacts consumed by downstream phases.
|
|
598
|
+
|
|
599
|
+
**Self-transitions**: only build allows self-transition (consecutive build cycles are the normal case). Other phases produce a discrete output (a vision, a decision, a plan) and transition out.
|
|
600
|
+
|
|
601
|
+
### PROGRESS.md phase field
|
|
602
|
+
|
|
603
|
+
Each cycle entry in PROGRESS.md includes a `phase` field. The value is one of the five phase names: `envision`, `deliberate`, `plan`, `build`, `audit`.
|
|
604
|
+
|
|
605
|
+
```yaml
|
|
606
|
+
cycles:
|
|
607
|
+
- number: N
|
|
608
|
+
timestamp: YYYY-MM-DD HH:MM
|
|
609
|
+
phase: build
|
|
610
|
+
what: one-line summary of what shipped
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
Consuming skills use the phase field for trend analysis (e.g., ratio of build to audit cycles, whether deliberation precedes major architectural changes).
|
|
614
|
+
|
|
615
|
+
**Linter check**: None. Phase tracking is defined here for producing and consuming skills. SKILL.md integration is handled per-skill, not by the spec linter.
|
|
616
|
+
|
|
617
|
+
## 19. Staleness Detection
|
|
618
|
+
|
|
619
|
+
Stale artifacts mislead routing decisions and cause skills to act on outdated context. This section defines how staleness is detected and which artifacts each skill is expected to update.
|
|
620
|
+
|
|
621
|
+
### Skill-to-expected-artifact mapping
|
|
622
|
+
|
|
623
|
+
Each skill produces specific artifacts as part of its workflow. When a skill is dispatched (directly or via orkestrera), the artifacts listed here are the ones it is expected to have updated upon completion. This table is the authoritative lookup for staleness checks.
|
|
624
|
+
|
|
625
|
+
| Skill | Expected artifact outputs |
|
|
626
|
+
|-------|--------------------------|
|
|
627
|
+
| visionera | .agentera/vision.yaml |
|
|
628
|
+
| resonera | .agentera/decisions.yaml |
|
|
629
|
+
| planera | .agentera/plan.yaml |
|
|
630
|
+
| realisera | .agentera/progress.yaml, TODO.md, CHANGELOG.md |
|
|
631
|
+
| optimera | .agentera/optimera/<name>/experiments.yaml, .agentera/optimera/<name>/objective.yaml (paths are per-objective; staleness check uses glob `.agentera/optimera/*/experiments.yaml` and `.agentera/optimera/*/objective.yaml`) |
|
|
632
|
+
| inspektera | .agentera/health.yaml, TODO.md |
|
|
633
|
+
| dokumentera | .agentera/docs.yaml |
|
|
634
|
+
| visualisera | DESIGN.md |
|
|
635
|
+
| profilera | (profile-path capability) <!-- platform: profile-path --> |
|
|
636
|
+
| inspirera | (no owned artifact; findings are filed to TODO.md or fed into other skills) |
|
|
637
|
+
| orkestrera | (orchestrator; updates .agentera/plan.yaml task statuses and delegates to other skills) |
|
|
638
|
+
| hej | (router; reads artifacts but produces none) |
|
|
639
|
+
|
|
640
|
+
Skills that share an artifact (e.g., realisera and inspektera both write to TODO.md) are each expected to update it independently when dispatched. Staleness is checked per-skill, not per-artifact.
|
|
641
|
+
|
|
642
|
+
### Plan-relative staleness convention
|
|
643
|
+
|
|
644
|
+
When a plan exists (.agentera/plan.yaml with an active status), staleness is measured relative to the plan's creation date (the `Created` field in the plan's HTML comment metadata).
|
|
645
|
+
|
|
646
|
+
**Detection rule**: after a plan completes (all tasks `■ complete` or `skipped`), compare each dispatched skill against its expected artifacts. An artifact is **stale** if its last modification date (via `git log -1 --format=%aI -- <path>`) predates the plan's creation date AND the skill was dispatched at least once during the plan.
|
|
647
|
+
|
|
648
|
+
**What counts as delegated**: a skill appears in at least one task's execution history during the plan. For orkestrera-driven plans, the delegation log in PROGRESS.md cycle entries identifies which skills ran.
|
|
649
|
+
|
|
650
|
+
**Scope**: only artifacts listed in the mapping above are checked. Artifacts that a skill reads but does not produce (e.g., realisera reads VISION.md) are not staleness candidates for that skill.
|
|
651
|
+
|
|
652
|
+
**Handling stale findings**: stale artifacts are surfaced as context for the next plan cycle, not as errors. The consuming skill (orkestrera, inspektera) reports which artifacts are stale and which dispatched skills were expected to update them. This informs the next plan's task selection without blocking execution.
|
|
653
|
+
|
|
654
|
+
### Fallback: no plan context
|
|
655
|
+
|
|
656
|
+
When no active or recently completed plan exists (standalone skill invocation, ad-hoc inspektera audit, or hej session orientation), plan-relative detection is unavailable. The fallback heuristic applies:
|
|
657
|
+
|
|
658
|
+
**Fallback rule**: an artifact is considered potentially stale if it was not modified since the most recent PROGRESS.md cycle entry. If PROGRESS.md has no entries (fresh project), no staleness check applies.
|
|
659
|
+
|
|
660
|
+
The fallback is advisory, not authoritative. It surfaces artifacts that may need attention but does not carry the same signal strength as plan-relative detection (where the dispatched-skill relationship provides causal evidence of staleness).
|
|
661
|
+
|
|
662
|
+
**Linter check**: None. Staleness detection is a runtime convention consumed by orkestrera and inspektera, not a SKILL.md structural requirement.
|
|
663
|
+
|
|
664
|
+
## 20. Behavioral Verification Gate
|
|
665
|
+
|
|
666
|
+
Passing tests are necessary but not sufficient evidence that a cycle's work is real. A feature can be structurally correct (tests green, build clean, lint clean) and still be behaviorally broken against real project state: stale fixtures, mocked dependencies, or test doubles can hide regressions that only surface when the primary entrypoint runs against production-shaped inputs. The behavioral verification gate closes this gap by requiring every cycle to observe its own behavior before declaring completion.
|
|
667
|
+
|
|
668
|
+
This gate is orthogonal to Section 19 Staleness Detection. Section 19 asks: did the dispatched skill update the artifacts it owns? Section 20 asks: did the cycle's new behavior actually run against real state? The two gates enforce different invariants and must both hold for a cycle to be considered verified.
|
|
669
|
+
|
|
670
|
+
### Evidence format
|
|
671
|
+
|
|
672
|
+
Every cycle entry in PROGRESS.md carries a `verified` field alongside phase, what, commit, inspiration, discovered, next, and context fields. The field is mandatory: no cycle is considered closed without it. The field accepts exactly one of three shapes:
|
|
673
|
+
|
|
674
|
+
| Shape | Content |
|
|
675
|
+
|-------|---------|
|
|
676
|
+
| Observed output | A short transcript (or summary) of the primary entrypoint running against real project state, with the observable result recorded verbatim. The transcript should be concrete enough that a reader can tell whether the behavior actually happened |
|
|
677
|
+
| Allowlisted N/A tag | `N/A: <tag>` where `<tag>` is drawn from the enumerated allowlist below |
|
|
678
|
+
| Free-form N/A rationale | A prose sentence of at least 8 words explaining specifically why the change has no observable behavior. Shorter rationales fail the gate |
|
|
679
|
+
|
|
680
|
+
Observed output is always preferred when the change is runnable. The N/A paths exist only for genuinely unrunnable work; they are not an escape hatch for "I didn't feel like running it."
|
|
681
|
+
|
|
682
|
+
### N/A allowlist
|
|
683
|
+
|
|
684
|
+
Exactly five tags are recognized. Any other shorthand must fall through to the free-form rationale path.
|
|
685
|
+
|
|
686
|
+
| Tag | Meaning |
|
|
687
|
+
|-----|---------|
|
|
688
|
+
| `docs-only` | The change touched only documentation files (README, spec, skill instructions, templates) with no code path affected |
|
|
689
|
+
| `refactor-no-behavior-change` | The change restructured code but preserved observable behavior exactly; the existing test suite is the verification surface |
|
|
690
|
+
| `chore-dep-bump` | The change updated a dependency version without modifying any project code that calls that dependency differently |
|
|
691
|
+
| `chore-build-config` | The change modified build tooling, linter configuration, or packaging metadata without altering runtime behavior |
|
|
692
|
+
| `test-only` | The change added or adjusted tests without modifying the code under test |
|
|
693
|
+
|
|
694
|
+
A cycle that bundles runnable work with an N/A-tagged change still requires observed output for the runnable portion. The tag covers only the non-runnable slice.
|
|
695
|
+
|
|
696
|
+
### Project-archetype taxonomy
|
|
697
|
+
|
|
698
|
+
"Primary entrypoint" is defined per project archetype, not asserted per cycle. When a cycle touches multiple subsystems, the primary entrypoint is the one most closely tied to the change under verification.
|
|
699
|
+
|
|
700
|
+
| Archetype | Canonical entrypoint form |
|
|
701
|
+
|-----------|---------------------------|
|
|
702
|
+
| CLI tool | Invoke the binary with realistic arguments that exercise the changed path, capturing stdout/stderr and exit code |
|
|
703
|
+
| Library / SDK | Run a smoke driver (a short script or REPL session) that exercises the public API surface touched by the change |
|
|
704
|
+
| Web service | Send a request to a production-shaped endpoint (local server with production configuration or a staging instance) and record the response |
|
|
705
|
+
| Skill repo | Dispatch the skill via the eval mechanism capability (Section 21) against a representative prompt and capture the observed skill output <!-- platform: eval-mechanism --> |
|
|
706
|
+
| Design system | Render a representative component against the real design tokens and visually inspect (screenshot or DOM snapshot) against the expected output |
|
|
707
|
+
| Data pipeline | Run the pipeline against a real input sample (not synthetic fixtures) and record the observed output or side effects |
|
|
708
|
+
|
|
709
|
+
Projects with an archetype not listed here document their canonical entrypoint form in `.agentera/docs.yaml` under a `verification_entrypoint` key. The taxonomy is extensible; the table above is the minimum coverage.
|
|
710
|
+
|
|
711
|
+
### Optional verification budget
|
|
712
|
+
|
|
713
|
+
Some cycles touch slow subsystems (full data pipeline runs, long-running integration scenarios) where a complete reality check exceeds a reasonable per-cycle time budget. Projects that need a cap set a `verification_budget` key in `.agentera/docs.yaml` specifying the maximum wall-clock time per cycle. When a cycle's verification step exceeds the configured budget, the cycle MAY downgrade to a partial verification rather than blocking indefinitely.
|
|
714
|
+
|
|
715
|
+
Partial verifications record `verified: "partial (budget hit): ..."` with a short note capturing what was attempted, what was observed before the budget was hit, and which portions of the behavior remain unverified. Partial verifications are valid cycle closures but are visible to consuming skills as weaker signal: inspektera audits treat a string of partial verifications as a health finding requiring attention.
|
|
716
|
+
|
|
717
|
+
Projects without a `verification_budget` key have no time cap. The default is: take as long as verification honestly requires.
|
|
718
|
+
|
|
719
|
+
### Skill-to-gate mapping
|
|
720
|
+
|
|
721
|
+
The gate is enforced independently by two skills; each holds a different phase and a different slice of the enforcement contract.
|
|
722
|
+
|
|
723
|
+
| Skill | Role | Phase | What it enforces |
|
|
724
|
+
|-------|------|-------|------------------|
|
|
725
|
+
| realisera | Primary enforcer | Cycle close | Runs the primary entrypoint against real project state and writes the observed output into the cycle's `verified` field. Blocks cycle completion if the field cannot be populated with observed output, an allowlisted tag, or a qualifying free-form rationale |
|
|
726
|
+
| orkestrera | Secondary enforcer | Task evaluation | Reads the latest PROGRESS.md cycle entry for the delegated task, confirms the `verified` field is present and non-empty (artifact read only; no source code read), and extends its inspektera delegation prompt to include the Section 20 evidence-format snippet so inspektera audits whether the recorded content corresponds to the task's acceptance criteria |
|
|
727
|
+
|
|
728
|
+
Realisera holds the primary enforcement contract because it is the skill that actually produces cycle entries. Orkestrera holds a lighter presence-and-quality check because it reads artifacts but never touches code; the full content audit is delegated to inspektera via the delegation prompt.
|
|
729
|
+
|
|
730
|
+
**Linter check**: Deterministic. Realisera and orkestrera SKILL.md files must reference Section 20 by name and include the `verified` field in any PROGRESS.md cycle format examples they carry.
|
|
731
|
+
|
|
732
|
+
## 22. Session Corpus Contract
|
|
733
|
+
|
|
734
|
+
Profilera mines decision patterns from host session data to produce PROFILE.md. The extraction currently depends on Claude Code's internal storage layout (JSONL files, memory directories, project-scoped configs). This section defines the normalized data model that any host adapter can produce, decoupling profilera's behavioral contract from a specific runtime's file layout.
|
|
735
|
+
|
|
736
|
+
The contract is a data model, not a path model. It specifies what profilera needs to observe, not where the host stores it. Claude Code continues to derive this corpus from its native paths; other runtimes produce the same normalized records from their own storage.
|
|
737
|
+
|
|
738
|
+
### Record types
|
|
739
|
+
|
|
740
|
+
Four canonical record families capture the decision-relevant signals profilera consumes. Each record is a JSON object with provenance metadata at top level and domain fields nested under `data`. Adapters MAY define additional runtime-specific record types (see Runtime extensions below).
|
|
741
|
+
|
|
742
|
+
#### Provenance metadata
|
|
743
|
+
|
|
744
|
+
Every record includes these fields regardless of type:
|
|
745
|
+
|
|
746
|
+
| Field | Required | Type | Purpose |
|
|
747
|
+
|-------|----------|------|---------|
|
|
748
|
+
| `source_id` | Yes | string | Stable identifier for deduplication across extractions |
|
|
749
|
+
| `timestamp` | Yes | string (ISO 8601) | When the record was created or observed |
|
|
750
|
+
| `project_id` | Yes | string | Project this record belongs to; `"global"` for non-project-scoped data |
|
|
751
|
+
| `project_path` | No | string | Filesystem path to the project, when available |
|
|
752
|
+
| `session_id` | No | string | Host session identifier, when applicable |
|
|
753
|
+
| `source_kind` | Yes | string | Which record family this record belongs to (one of the four portable names below, or a runtime extension name) |
|
|
754
|
+
| `runtime` | Yes | string | Host runtime that produced this record (e.g., `"claude-code"`, `"opencode"`) |
|
|
755
|
+
| `adapter_version` | Yes | string | Version of the adapter that extracted this record |
|
|
756
|
+
| `data` | Yes | object | Type-specific payload for this record |
|
|
757
|
+
|
|
758
|
+
The `source_id` field enables idempotent re-extraction: the same logical record produces the same `source_id` regardless of when extraction runs. The `runtime` and `adapter_version` fields enable profilera to handle schema variations across runtimes.
|
|
759
|
+
|
|
760
|
+
All fields listed in the record family tables below live inside `data`, not beside provenance fields. This keeps provenance stable across runtimes while allowing each source family to carry its own payload shape.
|
|
761
|
+
|
|
762
|
+
#### instruction_document
|
|
763
|
+
|
|
764
|
+
Global or project-scoped instruction files the host exposes to agents. These encode recurring preferences, constraints, and standards.
|
|
765
|
+
|
|
766
|
+
| Field | Required | Type | Purpose |
|
|
767
|
+
|-------|----------|------|---------|
|
|
768
|
+
| `doc_type` | Yes | string | Kind of instruction document (e.g., `"claude_md"`, `"agents_md"`) |
|
|
769
|
+
| `name` | Yes | string | Canonical name for this document |
|
|
770
|
+
| `description` | No | string | Human-readable summary |
|
|
771
|
+
| `content` | Yes | string | Full text content |
|
|
772
|
+
| `scope` | Yes | string | `"global"` or `"project"` |
|
|
773
|
+
|
|
774
|
+
Claude Code source: `~/.claude/CLAUDE.md`, `~/git/*/CLAUDE.md`, `~/git/*/AGENTS.md` <!-- platform: artifact-resolution -->
|
|
775
|
+
|
|
776
|
+
#### history_prompt
|
|
777
|
+
|
|
778
|
+
Decision-rich prompts from the host's command history. These capture what the user asked, when, and in what project context.
|
|
779
|
+
|
|
780
|
+
| Field | Required | Type | Purpose |
|
|
781
|
+
|-------|----------|------|---------|
|
|
782
|
+
| `prompt` | Yes | string | The user's prompt text |
|
|
783
|
+
| `signal_type` | Yes | string | Classification: `"decision"`, `"correction"`, or `"question"` |
|
|
784
|
+
|
|
785
|
+
Claude Code source: `~/.claude/history.jsonl`, filtered by decision-pattern regex <!-- platform: artifact-resolution -->
|
|
786
|
+
|
|
787
|
+
#### conversation_turn
|
|
788
|
+
|
|
789
|
+
Normalized user or assistant turns from host conversation sessions. Profilera uses paired user-assistant exchanges to identify how decisions were made and corrected in context.
|
|
790
|
+
|
|
791
|
+
| Field | Required | Type | Purpose |
|
|
792
|
+
|-------|----------|------|---------|
|
|
793
|
+
| `actor` | Yes | string | `"user"` or `"assistant"` |
|
|
794
|
+
| `content` | Yes | string | Turn text content |
|
|
795
|
+
| `preceding_context` | No | string | Prior assistant proposal (for user turns that respond to a proposal) |
|
|
796
|
+
| `signal_type` | No | string | Classification of the user's response: `"decision"`, `"correction"`, or `"question"` |
|
|
797
|
+
|
|
798
|
+
Claude Code source: `~/.claude/projects/**/*.jsonl`, filtered for decision-rich exchanges <!-- platform: artifact-resolution -->
|
|
799
|
+
|
|
800
|
+
#### project_config_signal
|
|
801
|
+
|
|
802
|
+
Recurring configuration or toolchain patterns associated with a project. These are objective evidence of technology choices, linting standards, and build conventions.
|
|
803
|
+
|
|
804
|
+
| Field | Required | Type | Purpose |
|
|
805
|
+
|-------|----------|------|---------|
|
|
806
|
+
| `config_type` | Yes | string | Kind of configuration file (e.g., `"gomod"`, `"golangci"`, `"package_json"`) |
|
|
807
|
+
| `file_path` | No | string | Path to the config file within the project |
|
|
808
|
+
| `signals` | Yes | array of string | Extracted key-value signals (dependencies, linters, targets, etc.) |
|
|
809
|
+
|
|
810
|
+
Claude Code source: `~/git/*/` config files scanned per known config type list <!-- platform: artifact-resolution -->
|
|
811
|
+
|
|
812
|
+
### Source families
|
|
813
|
+
|
|
814
|
+
The four portable record types group into four source families for profilera's consumption. The "Crystallized decisions" family is powered by instruction_document alone (durable, explicitly authored decisions). Runtime extensions may contribute additional record types to this family.
|
|
815
|
+
|
|
816
|
+
| Family | Record types | Signal character |
|
|
817
|
+
|--------|-------------|-----------------|
|
|
818
|
+
| Crystallized decisions | instruction_document | Highest signal: explicitly authored preferences and standards |
|
|
819
|
+
| Decision history | history_prompt | Broad coverage: what the user asked across all sessions |
|
|
820
|
+
| Conversation exchanges | conversation_turn | Most nuanced: how decisions were made and corrected in context |
|
|
821
|
+
| Config patterns | project_config_signal | Most objective: what technology and standards actually shipped |
|
|
822
|
+
|
|
823
|
+
### Degradation
|
|
824
|
+
|
|
825
|
+
Profilera operates in two modes: full (all four source families) and partial (one or more families missing). The degradation rules specify what profilera can produce given incomplete corpus availability.
|
|
826
|
+
|
|
827
|
+
| Available families | Profilera mode | Profile quality |
|
|
828
|
+
|--------------------|---------------|-----------------|
|
|
829
|
+
| All four | Full | Complete profile: all 12 categories, cross-validated confidence scores |
|
|
830
|
+
| Crystallized only | Partial | Instruction-heavy profile: strong in architecture/tooling standards, weak in process/workflow and meta-decision patterns |
|
|
831
|
+
| Crystallized + one other | Partial | Substantially complete: most categories populated, confidence scores may be lower for categories that depend on the missing family |
|
|
832
|
+
| History or conversations only (no crystallized) | Partial | Behavior-only profile: can infer patterns from actions but lacks explicit preferences. Confidence scores capped at 60 |
|
|
833
|
+
| Config patterns only | Minimal | Technology fingerprint only: tooling and dependency patterns, no behavioral decisions. Profilera should warn the user this is not a full profile |
|
|
834
|
+
|
|
835
|
+
**Degradation surface rule**: when a source family is missing, profilera MUST note which families were absent in the profile's source metadata comment. This lets consuming skills weight profile entries appropriately: a profile built from config patterns only should not be treated as authoritative for workflow decisions.
|
|
836
|
+
|
|
837
|
+
**Adapter responsibility**: the host adapter documents which source families it can produce. A minimal adapter that only provides instruction_document (reading a global config file) is valid; profilera produces the best profile it can with what is available. The adapter does not need to implement all four portable record types.
|
|
838
|
+
|
|
839
|
+
### Runtime extensions
|
|
840
|
+
|
|
841
|
+
Adapters MAY define additional record types beyond the four portable ones to capture runtime-specific data that enriches profilera's output. These extensions are documented in the adapter's design and are not required for profilera to operate.
|
|
842
|
+
|
|
843
|
+
**Claude Code extension: memory_entry**
|
|
844
|
+
|
|
845
|
+
Claude Code provides a built-in memory system that persists user and project memory as Markdown files with optional frontmatter at `~/.claude/projects/*/memory/*.md`. The Claude Code adapter extracts these as instruction_document records with `doc_type: "claude_memory"` rather than as a separate record type, keeping the portable corpus contract clean.
|
|
846
|
+
|
|
847
|
+
| Field | Required | Type | Purpose |
|
|
848
|
+
|-------|----------|------|---------|
|
|
849
|
+
| `name` | Yes | string | Entry name or title |
|
|
850
|
+
| `description` | No | string | Summary from frontmatter |
|
|
851
|
+
| `memory_type` | No | string | Host-specific categorization |
|
|
852
|
+
| `content` | Yes | string | Full text content (body after frontmatter) |
|
|
853
|
+
|
|
854
|
+
When the Claude Code adapter encounters memory files, it emits them as instruction_document records with these additional conventions:
|
|
855
|
+
|
|
856
|
+
- `doc_type`: `"claude_memory"`
|
|
857
|
+
- `scope`: `"project"` (memory files are project-scoped)
|
|
858
|
+
- `name`: derived from the memory file's frontmatter or filename
|
|
859
|
+
|
|
860
|
+
### Corpus envelope format
|
|
861
|
+
|
|
862
|
+
The extraction pipeline produces a single `corpus.json` file containing all extracted records and their metadata. This is the canonical output of any adapter's corpus extraction, replacing any prior multi-file output layout.
|
|
863
|
+
|
|
864
|
+
#### Top-level structure
|
|
865
|
+
|
|
866
|
+
```json
|
|
867
|
+
{
|
|
868
|
+
"metadata": { ... },
|
|
869
|
+
"records": [ ... ]
|
|
870
|
+
}
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
Both fields are required. A valid corpus file always contains exactly these two top-level keys.
|
|
874
|
+
|
|
875
|
+
#### Metadata object
|
|
876
|
+
|
|
877
|
+
The metadata object describes the extraction run, not the records themselves. It provides enough context for consumers to understand what runtimes contributed, how many records were produced, and whether any errors occurred.
|
|
878
|
+
|
|
879
|
+
| Field | Required | Type | Purpose |
|
|
880
|
+
|-------|----------|------|---------|
|
|
881
|
+
| `extracted_at` | Yes | string (ISO 8601) | When the extraction ran |
|
|
882
|
+
| `runtimes` | Yes | array of string | Runtime identifiers that were probed and found available (e.g., `["claude-code"]`) |
|
|
883
|
+
| `adapter_version` | Yes | string | Version of the corpus builder that produced this file |
|
|
884
|
+
| `families` | Yes | object | Per-source-family extraction summary (see below) |
|
|
885
|
+
| `total_records` | Yes | integer | Total number of records in the `records` array |
|
|
886
|
+
| `errors` | No | array of string | Human-readable error messages from extraction failures; omitted when empty |
|
|
887
|
+
|
|
888
|
+
The `families` object has one key per source family name (matching the four portable family names from the Source families table: `instruction_document`, `history_prompt`, `conversation_turn`, `project_config_signal`). Each value is an object:
|
|
889
|
+
|
|
890
|
+
| Field | Required | Type | Purpose |
|
|
891
|
+
|-------|----------|------|---------|
|
|
892
|
+
| `count` | Yes | integer | Number of records extracted for this family |
|
|
893
|
+
| `status` | Yes | string | `"ok"`, `"partial"`, or `"missing"` |
|
|
894
|
+
| `error` | No | string | Explanation when status is `"partial"` or `"missing"`; omitted when `"ok"` |
|
|
895
|
+
|
|
896
|
+
A family with status `"ok"` extracted all records successfully. `"partial"` means some records were extracted but errors occurred during extraction. `"missing"` means the family could not be extracted at all (e.g., the runtime data directory was not found).
|
|
897
|
+
|
|
898
|
+
#### Records array
|
|
899
|
+
|
|
900
|
+
The `records` array contains all extracted records in no guaranteed order. Each element is a JSON object with the provenance fields from the table above plus a `data` object. The `data` object conforms to one of the four portable record payloads, or to a documented runtime extension payload.
|
|
901
|
+
|
|
902
|
+
Consumers filter and group records by `source_kind` to access specific families. The `runtime` field on each record identifies which adapter produced it, enabling cross-runtime corpus aggregation.
|
|
903
|
+
|
|
904
|
+
#### Envelope example
|
|
905
|
+
|
|
906
|
+
```json
|
|
907
|
+
{
|
|
908
|
+
"metadata": {
|
|
909
|
+
"extracted_at": "2026-04-11T14:30:00Z",
|
|
910
|
+
"runtimes": ["claude-code"],
|
|
911
|
+
"adapter_version": "2.7.0",
|
|
912
|
+
"families": {
|
|
913
|
+
"instruction_document": {"count": 12, "status": "ok"},
|
|
914
|
+
"history_prompt": {"count": 87, "status": "ok"},
|
|
915
|
+
"conversation_turn": {"count": 234, "status": "ok"},
|
|
916
|
+
"project_config_signal": {"count": 5, "status": "ok"}
|
|
917
|
+
},
|
|
918
|
+
"total_records": 338,
|
|
919
|
+
"errors": []
|
|
920
|
+
},
|
|
921
|
+
"records": [
|
|
922
|
+
{
|
|
923
|
+
"source_id": "claude-md-global-abc123",
|
|
924
|
+
"timestamp": "2026-04-10T09:00:00Z",
|
|
925
|
+
"project_id": "global",
|
|
926
|
+
"source_kind": "instruction_document",
|
|
927
|
+
"runtime": "claude-code",
|
|
928
|
+
"adapter_version": "2.7.0",
|
|
929
|
+
"data": {
|
|
930
|
+
"doc_type": "claude_md",
|
|
931
|
+
"name": "CLAUDE.md (global)",
|
|
932
|
+
"content": "...",
|
|
933
|
+
"scope": "global"
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
]
|
|
937
|
+
}
|
|
938
|
+
```
|
|
939
|
+
|
|
940
|
+
### Runtime probing convention
|
|
941
|
+
|
|
942
|
+
Before extracting records, the corpus builder probes for available runtimes by checking known filesystem paths. This probe-then-extract pattern decouples runtime detection from record extraction: the prober identifies which runtimes have data on the current system, then the builder dispatches the appropriate adapter for each detected runtime.
|
|
943
|
+
|
|
944
|
+
#### Probe mechanism
|
|
945
|
+
|
|
946
|
+
Each runtime registers a probe function that checks for the existence of its data directory. The probe returns a boolean indicating whether that runtime's data is available on the current system.
|
|
947
|
+
|
|
948
|
+
| Runtime | Probe path | What it checks |
|
|
949
|
+
|---------|-----------|----------------|
|
|
950
|
+
| Claude Code | `~/.claude/` | Directory exists and contains session data (e.g., `projects/` subdirectory or `history.jsonl`) |
|
|
951
|
+
|
|
952
|
+
Future runtimes add their own probe entries. The corpus builder iterates all registered probes, collects the list of available runtimes, and runs their extractors. Runtimes that are not detected are skipped without error.
|
|
953
|
+
|
|
954
|
+
#### Multi-runtime aggregation
|
|
955
|
+
|
|
956
|
+
When multiple runtimes are detected, the corpus builder runs each runtime's extractor independently and merges all records into a single `records` array. The `runtime` field on each record identifies its origin. The `metadata.runtimes` array lists all runtimes that contributed records.
|
|
957
|
+
|
|
958
|
+
This aggregation is additive: records from different runtimes coexist in the same corpus without deduplication across runtimes. The `source_id` field ensures idempotent re-extraction within a single runtime; cross-runtime deduplication is not performed because the same logical signal (e.g., a user preference) may appear in different forms across runtimes and both forms carry signal value.
|
|
959
|
+
|
|
960
|
+
#### No-runtime behavior
|
|
961
|
+
|
|
962
|
+
When no registered runtime is detected (all probes return false), the corpus builder produces no output and exits with an informative message. It does not produce an empty corpus file: an empty corpus has no consumers and would mask a configuration problem.
|
|
963
|
+
|
|
964
|
+
### Relation to Section 21
|
|
965
|
+
|
|
966
|
+
Section 21 defines the six host adapter capabilities for the portable core. Section 22 defines the data contract that lifts profilera from a host-specific extension to a capability-gated skill. Once a host adapter implements corpus extraction that produces the normalized record types above, profilera can run on that runtime without depending on Claude Code's internal storage layout.
|
|
967
|
+
|
|
968
|
+
Profilera's portability status in the Section 21 table moves from "Host-specific extension" to "Capability-gated" when the adapter provides the corpus. The contract itself (this section) is what enables that transition; the adapter is what implements it.
|
|
969
|
+
|
|
970
|
+
**Linter check**: None. This section defines a runtime data contract for adapters, not a SKILL.md structural requirement. The existing linter checks for profilera's SKILL.md continue to apply independently.
|
|
971
|
+
|
|
972
|
+
## 23. Pre-spawn Git Commit
|
|
973
|
+
|
|
974
|
+
Git worktrees branch from HEAD (the last commit), not the working tree. When a spawning skill writes artifacts during its orient or plan steps and then spawns a subagent in a worktree without committing, the subagent receives a stale snapshot missing those artifacts. The Pre-spawn Git Commit closes this gap by requiring a checkpoint commit before any `isolation: "worktree"` spawn.
|
|
975
|
+
|
|
976
|
+
This gate is the entry-side complement to Section 20 (Behavioral Verification Gate). Section 20 gates the exit from a cycle: did the work actually run against real state? Section 23 gates the entry to a worktree: does the subagent start from current state? The two gates enforce different invariants at different boundaries and must both hold for worktree-spawned cycles.
|
|
977
|
+
|
|
978
|
+
### Applicability
|
|
979
|
+
|
|
980
|
+
The gate applies to any skill that spawns a subagent with `isolation: "worktree"`. Currently two skills do this:
|
|
981
|
+
|
|
982
|
+
| Skill | Spawn point | What it writes before spawn |
|
|
983
|
+
|-------|----------------|-------------------------------|
|
|
984
|
+
| realisera | Step 5 (implementation spawn) | PLAN.md status updates, PROGRESS.md cycle start, context files from orient/plan steps |
|
|
985
|
+
| optimera | Experiment spawn step | EXPERIMENTS.md updates, OBJECTIVE.md refinements, harness configuration changes |
|
|
986
|
+
|
|
987
|
+
orkestrera delegates skills without worktree isolation (it runs realisera or other skills as background subagents in the same working directory). orkestrera is covered transitively: when realisera creates a worktree at its Step 5, the gate commits everything in the working tree, including any uncommitted changes orkestrera wrote before spawning realisera.
|
|
988
|
+
|
|
989
|
+
Skills that do not spawn to worktrees are unaffected. The gate is invisible to them.
|
|
990
|
+
|
|
991
|
+
### Gate procedure
|
|
992
|
+
|
|
993
|
+
Before executing the `isolation: "worktree"` spawn, the spawning skill runs this procedure:
|
|
994
|
+
|
|
995
|
+
1. **Check working tree status.** If `git status --porcelain` returns empty output, the working tree is clean. The gate is a no-op: skip to spawn.
|
|
996
|
+
|
|
997
|
+
2. **Stage artifact paths only.** Add only the files the skill wrote or modified during the current session. Use explicit paths (e.g., `git add .agentera/plan.yaml .agentera/progress.yaml`), not `git add -A` or `git add .`. This scoping prevents committing editor temp files, secrets, or unrelated changes.
|
|
998
|
+
|
|
999
|
+
3. **Commit with checkpoint message.** Use the conventional commit format:
|
|
1000
|
+
|
|
1001
|
+
```
|
|
1002
|
+
chore(<skill>): checkpoint before worktree dispatch
|
|
1003
|
+
```
|
|
1004
|
+
|
|
1005
|
+
Where `<skill>` is the spawning skill's name (e.g., `chore(realisera): checkpoint before worktree dispatch`). The `chore` type triggers no version bump per the semver_policy convention.
|
|
1006
|
+
|
|
1007
|
+
4. **Respect hook results.** Do not pass `--no-verify`. If pre-commit hooks reject the commit, the spawn is blocked. Fix the issue (typically an artifact validation error) and retry the commit. Invalid artifacts must not be spawned to a worktree where they would mislead the subagent.
|
|
1008
|
+
|
|
1009
|
+
5. **Proceed with spawn.** After the checkpoint commit succeeds (or was skipped as a no-op), the worktree branches from a HEAD that includes all current artifacts.
|
|
1010
|
+
|
|
1011
|
+
### Failure handling
|
|
1012
|
+
|
|
1013
|
+
When a hook rejects the checkpoint commit, the spawning skill must:
|
|
1014
|
+
|
|
1015
|
+
1. Report the hook failure in its output (the specific error from the hook).
|
|
1016
|
+
2. Attempt to fix the issue (correct the artifact that failed validation).
|
|
1017
|
+
3. Re-stage and retry the checkpoint commit.
|
|
1018
|
+
4. If the retry also fails, abort the spawn and report the failure. Do not proceed with a worktree that would branch from stale state.
|
|
1019
|
+
|
|
1020
|
+
The skill does not silently skip the commit or bypass hooks. A blocked spawn is preferable to a worktree operating on incorrect context.
|
|
1021
|
+
|
|
1022
|
+
### Identifying checkpoint commits
|
|
1023
|
+
|
|
1024
|
+
Checkpoint commits are identifiable in git history by their message format: `chore(<skill>): checkpoint before worktree dispatch`. Consuming tools (CHANGELOG generators, version bump scripts, inspektera audits) can filter these commits by the `chore` type and `checkpoint before worktree dispatch` description. They carry no behavioral change and should not appear in user-facing changelogs.
|
|
1025
|
+
|
|
1026
|
+
This rule applies to all commits produced by any skill: checkpoint commits, realisera cycle commits, optimera experiment commits, and any other git operation the suite performs.
|
|
1027
|
+
|
|
1028
|
+
### Relation to Section 20
|
|
1029
|
+
|
|
1030
|
+
The two gates form a coherent pair bracketing the worktree lifecycle:
|
|
1031
|
+
|
|
1032
|
+
| Gate | Section | Boundary | Question it answers |
|
|
1033
|
+
|------|---------|----------|---------------------|
|
|
1034
|
+
| Pre-spawn Git Commit | 23 | Entry: before worktree creation | Does the subagent start from current state? |
|
|
1035
|
+
| Behavioral Verification Gate | 20 | Exit: after implementation | Did the work actually run against real state? |
|
|
1036
|
+
|
|
1037
|
+
Both gates are mandatory for worktree-spawned cycles. A cycle that passes Section 20 verification but skipped the Section 23 gate may have verified behavior built on stale context. A cycle that passes the Section 23 gate but skips Section 20 verification has current context but unverified output.
|
|
1038
|
+
|
|
1039
|
+
**Linter check**: None. This section defines a runtime convention for spawning skills. Enforcement is per-skill: each spawning skill's SKILL.md must include the gate procedure at its worktree spawn point. The linter validates this through skill-specific checks, not a spec-level structural check.
|