193 lines
6.8 KiB
Markdown
193 lines
6.8 KiB
Markdown
# GOALS.yaml Schema
|
|
|
|
```yaml
|
|
version: 1
|
|
mission: "What this repo does"
|
|
|
|
goals:
|
|
- id: unique-identifier
|
|
description: "Human-readable description"
|
|
check: "shell command — exit 0 = pass, non-zero = fail"
|
|
weight: 1-10 # Higher = fix first
|
|
```
|
|
|
|
Goals are checked in weight order (highest first). The first failing goal with the highest weight is selected for improvement.
|
|
|
|
## Fitness Snapshot Format
|
|
|
|
Each cycle writes a fitness snapshot with **continuous values** (not just pass/fail):
|
|
|
|
```json
|
|
{
|
|
"cycle": 1,
|
|
"timestamp": "2026-02-12T15:45:00-05:00",
|
|
"cycle_start_sha": "abc1234",
|
|
"goals": [
|
|
{
|
|
"id": "go-coverage-floor",
|
|
"result": "pass",
|
|
"weight": 2,
|
|
"value": 86.1,
|
|
"threshold": 80
|
|
},
|
|
{
|
|
"id": "doc-coverage",
|
|
"result": "pass",
|
|
"weight": 2,
|
|
"value": 20,
|
|
"threshold": 16
|
|
},
|
|
{
|
|
"id": "go-cli-builds",
|
|
"result": "pass",
|
|
"weight": 5,
|
|
"value": null,
|
|
"threshold": null
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
- **value**: The continuous metric extracted from the check command (null for binary-only goals)
|
|
- **threshold**: The pass/fail threshold (null for binary-only goals)
|
|
- **cycle_start_sha**: Git SHA at cycle start, used for multi-commit revert on regression
|
|
|
|
Pre-cycle snapshot: `fitness-latest.json` (rolling, overwritten each cycle)
|
|
Post-cycle snapshot: `fitness-latest-post.json` (rolling, for regression comparison)
|
|
|
|
## Cycle-0 Baseline
|
|
|
|
Before the first improvement cycle in a goal era runs, evolve captures a baseline fitness snapshot under `.agents/evolve/fitness-baselines/goals-<hash>/`, where `<hash>` is derived from the active GOALS.md or GOALS.yaml content. This serves as the comparison anchor for measuring session-wide progress.
|
|
|
|
The baseline includes:
|
|
- **All goals** from GOALS.yaml, measured in their initial state
|
|
- **Cycle-0 report** (`cycle-0-report.md`) — summary of which goals are failing and their weights
|
|
- **No regression comparisons** — this is the starting point
|
|
|
|
When the session ends (at Teardown), the system computes the **session fitness trajectory** by comparing the baseline against the final cycle snapshot. This produces `session-fitness-delta.md`, which shows which goals improved, regressed, or stayed unchanged over the entire /evolve session.
|
|
|
|
## Meta-Goals
|
|
|
|
Meta-goals validate the validation system itself. Use them to prevent exception lists (allowlists, skip lists) from accumulating stale entries unnoticed.
|
|
|
|
```yaml
|
|
# Meta-goals validate the validation system itself
|
|
goals:
|
|
- id: allowlist-hygiene
|
|
description: "Every dead-code allowlist entry should have 0 non-test callers"
|
|
check: "bash scripts/check-allowlist-hygiene.sh"
|
|
weight: 7
|
|
|
|
- id: skip-list-hygiene
|
|
description: "Every skip-list entry should still reference an existing test"
|
|
check: "bash scripts/check-skip-list-hygiene.sh"
|
|
weight: 5
|
|
```
|
|
|
|
**When to add a meta-goal:** After pruning any allowlist or exception list, always add a corresponding meta-goal that fails if entries have callers/references. Allowlists without meta-goals are technical debt magnets — they grow silently across epics.
|
|
|
|
## Maintaining GOALS.yaml
|
|
|
|
Use `/goals` to maintain the fitness specification:
|
|
- `/goals` — run all checks, report pass/fail by pillar
|
|
- `/goals generate` — scan repo for uncovered areas, propose new goals
|
|
- `/goals prune` — find stale/broken goals, propose removals or updates
|
|
|
|
## GOALS.md Format (Version 4)
|
|
|
|
GOALS.md extends the YAML format with strategic intent sections:
|
|
|
|
```markdown
|
|
# Goals
|
|
|
|
<Mission statement — one sentence. Describes outcomes, not features.>
|
|
|
|
## North Stars
|
|
|
|
- <Outcome-focused aspiration — what improves for users if this is achieved>
|
|
- <At least one star should describe a measurable user outcome>
|
|
|
|
## Anti Stars
|
|
|
|
- <What we explicitly avoid — best when derived from proven failure modes>
|
|
- <Each anti-star should reference a real failure pattern if .agents/ data exists>
|
|
|
|
## Directives
|
|
|
|
### 1. <Title — evidence-grounded>
|
|
|
|
<Description citing specific metrics or findings that motivated this directive.
|
|
Good: "Close the multi-runtime promise gap — 8 test dirs quarantined in tests/_quarantine/"
|
|
Bad: "Improve test coverage">
|
|
|
|
**Steer:** increase | decrease | hold | explore
|
|
<Steer target should name the specific metric being steered, e.g., "increase (install scripts with smoke tests)">
|
|
|
|
### 2. <Title>
|
|
|
|
<Description — mix of engineering AND product/growth directives>
|
|
|
|
**Steer:** <direction> (<metric being steered>)
|
|
|
|
## Gates
|
|
|
|
| ID | Check | Weight | Description |
|
|
|----|-------|--------|-------------|
|
|
| build-passing | `cd cli && make build` | 8 | CLI builds without errors |
|
|
| test-passing | `cd cli && make test` | 7 | All unit tests pass |
|
|
```
|
|
|
|
### Directive Dimensions
|
|
|
|
A healthy GOALS.md includes directives across multiple dimensions:
|
|
|
|
| Dimension | Focus | Example |
|
|
|-----------|-------|---------|
|
|
| Engineering | Code quality, test coverage, complexity | "Keep complexity regressions at zero" |
|
|
| Product | User experience, onboarding, gaps | "Gate the install path" |
|
|
| Growth | Adoption, retention, community | "Restructure quickstart for under 5 min" |
|
|
| Knowledge | Flywheel health, learning compounding | "Verify knowledge lifecycle end-to-end" |
|
|
|
|
If all directives fall in one dimension, the goals file is incomplete.
|
|
|
|
### Gate Dimensions
|
|
|
|
Similarly, gates should cover both code health and product health:
|
|
|
|
| Type | Examples |
|
|
|------|----------|
|
|
| Code health | `go-cli-builds`, `go-cli-tests`, `go-vet-clean`, `security-gate` |
|
|
| Product health | `flywheel-compounding`, `quickstart-under-5min`, `competitive-freshness` |
|
|
| Knowledge health | `compile-freshness`, `compile-no-oscillation`, `flywheel-proof` |
|
|
|
|
### Key Differences from YAML
|
|
|
|
| Feature | YAML (v1-3) | Markdown (v4) |
|
|
|---------|-------------|---------------|
|
|
| Goals/Gates | `goals:` array | `## Gates` table |
|
|
| Mission | `mission:` field | First paragraph after `# Goals` |
|
|
| Directives | Not supported | `## Directives` section |
|
|
| North/Anti Stars | Not supported | `## North Stars` / `## Anti Stars` |
|
|
| Version | `version: N` | Implicit (always 4) |
|
|
|
|
### CLI Commands
|
|
|
|
```bash
|
|
ao goals measure # Measure gates (both formats)
|
|
ao goals measure --directives # Output directives as JSON
|
|
ao goals validate # Validate structure
|
|
ao goals init # Bootstrap GOALS.md interactively
|
|
ao goals steer add <title> # Add directive
|
|
ao goals steer remove <number> # Remove directive
|
|
ao goals steer prioritize <n> <p> # Reorder directive
|
|
ao goals migrate --to-md # Convert YAML → Markdown
|
|
ao goals prune # Remove stale gates
|
|
```
|
|
|
|
### Format Auto-Detection
|
|
|
|
`LoadGoals()` auto-detects format:
|
|
1. `.md` extension → markdown parser
|
|
2. `.yaml`/`.yml` extension → check if `GOALS.md` exists alongside → prefer markdown
|
|
3. Default `GOALS.yaml` path → check if `GOALS.md` exists → prefer markdown
|