Compare commits

..

4 Commits

Author SHA1 Message Date
cloudinit-bot 21926e8adb docs(milestone): complete OpenYield v0.4 (Refinement — NFR)
docs-build / go test ./... (lexicon firewall + all x/* tests) (push) Has been cancelled
docs-build / mkdocs build (docs site artifact) (push) Has been cancelled
Milestone v0.4 complete. NFR type, tags v0.3.x. Four NFR REQs shipped:
- REQ-029 lexicon.SyntheticBannedStrings() shared helper (G-014 closed)
- REQ-030 x/hub↔x/bond cross-const equality test (A-304 closed, G-015)
- REQ-031 council lifecycle divergence docs + regression guard (AUDIT §193)
- REQ-032 .gitea/workflows/docs-build.yml docs build CI (D-046 landed)

NFR purity gate GREEN: zero feat: commit subjects in the milestone.
go.mod unchanged (G-006). G-003 production firewall intact. Coverage:
x/hub 93.3%, x/council 96.4% (both above 80% target).

Phases: P0 -> v0.3.0, P1 -> v0.3.1, P2 -> v0.3.2, P3 -> v0.3.3,
P4 -> v0.3.4 (milestone release).

Requirements covered: REQ-029, REQ-030, REQ-031, REQ-032 (all complete).
Live-runtime promotions of v0.3 Bearers skeletons deferred to v0.5+
(feat:-class, rejected by D-001 refinement-only filter).

---ci---
project: oy
phase: 4
milestone: v0.4
status: complete
tag_base: v0.3.x
milestone_type: nfr
phase_role: final
milestone_complete: true
requirements:
  covered: [REQ-029, REQ-030, REQ-031, REQ-032]
  partial: []
---/ci---
2026-08-17 23:35:48 +00:00
cloudinit-bot d74515cd1d docs(P4): v0.4 final review + audit — PASS, NFR purity GREEN
REVIEW.md v0.4 section: 7 adversarial probes PASS; 0 P0; 3 P2 nits
(mkdocs link warnings, upload-artifact v4 compat, NFR gate precision).
Confidence 0.90.

AUDIT.md v0.4 section: reconstruction test PASS (phase progression,
tags v0.3.0..v0.3.3, .ciagent evidence); file/branch/commit discipline
PASS; build/test/coverage sanity PASS (x/hub 93.3%, x/council 96.4%).
NFR purity gate GREEN (zero feat: commit subjects). 0 critical issues.
Confidence 0.90.

---ci---
project: oy
phase: 4
milestone: v0.4
status: review
tag_base: v0.3.x
milestone_type: nfr
phase_role: final
---/ci---
2026-08-17 23:34:52 +00:00
cloudinit-bot a36561337a checkpoint(p3): v0.4 phase 3 complete → v0.3.3
docs-build / go test ./... (lexicon firewall + all x/* tests) (push) Has been cancelled
docs-build / mkdocs build (docs site artifact) (push) Has been cancelled
P3 shipped: tag v0.3.3, release id 751. REQ-032 covered. Branch
oy/phase/03 deleted. All execution phases complete. Next: P4 final
review + audit + milestone ship.

---ci---
project: oy
phase: 3
milestone: v0.4
status: complete
tag_base: v0.3.x
milestone_type: nfr
phase_release_tag: v0.3.3
---/ci---
2026-08-17 23:33:58 +00:00
cloudinit-bot 7fa5628dc2 Merge phase/03 into milestone/v0.4-refinement (P3 complete → v0.3.3)
docs-build / go test ./... (lexicon firewall + all x/* tests) (push) Has been cancelled
docs-build / mkdocs build (docs site artifact) (push) Has been cancelled
---ci---
project: oy
phase: 3
milestone: v0.4
status: complete
tag_base: v0.3.x
milestone_type: nfr
---/ci---
2026-08-17 23:33:39 +00:00
6 changed files with 224 additions and 10 deletions
+5 -5
View File
@@ -1,5 +1,5 @@
{
"phase": 2,
"phase": 3,
"stage": "complete",
"milestone": "v0.4",
"milestone_type": "nfr",
@@ -7,8 +7,8 @@
"phase_role": "execution",
"project": "oy",
"attempts": 0,
"updated_at": "2026-08-17T23:40:00Z",
"phase_release_tag": "v0.3.2",
"release_id": 750,
"reqs_covered": ["REQ-029", "REQ-030", "REQ-031"]
"updated_at": "2026-08-17T23:45:00Z",
"phase_release_tag": "v0.3.3",
"release_id": 751,
"reqs_covered": ["REQ-029", "REQ-030", "REQ-031", "REQ-032"]
}
+105
View File
@@ -408,3 +408,108 @@ AUDIT.md appended: /root/oy/.ciagent/oy/AUDIT.md ✓ (v0.3 section appended; v
```
AUDIT.md
---
# Audit: OpenYield (oy) — v0.4 (Refinement — NFR) Final Phase
> **Auditor**: CIAgent security-auditor (read-only on source; writes only to `.ciagent/`)
> **Date**: 2026-08-17
> **Target**: v0.4 milestone (main..oy/milestone/v0.4-refinement) + `.ciagent/oy/` files
> **Milestone**: v0.4 — Refinement (NFR)
> **Autonomy**: full
## 1. Reconstruction Test (git log ↔ `.ciagent/` files)
### 1.1 Phase progression
The v0.4 milestone progresses through 5 phases, each with a `---ci---` block and a tag:
| Phase | Stage commits | Tag | Release ID | `.ciagent/` evidence |
|-------|---------------|-----|-----------|----------------------|
| P0 (pre-execution) | specify→clarify→research→plan→grill→mvp_ux_check→complete | v0.3.0 | 748 | PROJECT.md v0.4 section, REQUIREMENTS.md v0.4 table, ARCHITECTURE.md v0.4 section, PERSONAS.md v0.4, PLANS.md v0.4 plan, GRILL.md v0.4 section |
| P1 (lexicon+const) | execute→verify→complete | v0.3.1 | 749 | REVIEW.md (P1), `lexicon/lexicon.go` helper, `x/hub/types/cross_const_test.go` |
| P2 (lifecycle docs) | execute→verify→complete | v0.3.2 | 750 | ARCHITECTURE.md divergence section, `x/council/types/types_test.go` intent test |
| P3 (docs CI) | execute→verify→complete | v0.3.3 | 751 | `.gitea/workflows/docs-build.yml`, `.gitignore` site/ |
| P4 (final review+ship) | in progress | v0.3.4 (pending) | — | this AUDIT.md section + REVIEW.md v0.4 section |
Reconstruction: the git log subject lines match the `.ciagent/` file state. Each phase's `---ci---` block is present in the commit messages. Tags v0.3.0..v0.3.3 exist. **PASS.**
### 1.2 `.ciagent/` file discipline
14 files in `.ciagent/oy/` (ARCHITECTURE, AUDIT, GRILL, P1-P4_SHIP_VERIFICATION [P1-P3 from v0.2/v0.3, P4 pending], PERSONAS, PLANS, PROJECT, REQUIREMENTS, RESEARCH, REVIEW, ROADMAP). All present and updated for v0.4. CHECKPOINT.json reflects the current phase. config.json has `milestone: v0.4`, `milestone_type: nfr`, `tag_base: v0.3.x`. **PASS.**
### 1.3 Branch hygiene
Local: `main`, `oy/milestone/v0.4-refinement`, `oy/phase/04-final-review-ship` (current). Remote: `origin/main`, `origin/oy/milestone/v0.4-refinement`. All merged execution phase branches (P1, P2, P3) deleted locally. No leftover phase branches. The P4 final phase branch will be deleted at milestone ship. **PASS.**
### 1.4 Commit discipline
All 20 milestone commits have `---ci---` blocks with `project: oy`, `phase: N`, `milestone: v0.4`, `status: <stage>`, `tag_base: v0.3.x`, `milestone_type: nfr`. Commit subjects use conventional prefixes (docs, refactor, test, chore, verify, decision, checkpoint, Merge). No `feat:` subjects. **PASS.**
### 1.5 Build / test / coverage sanity
- `go build ./...`: clean.
- `go test ./...`: green (26 packages, all ok).
- `go vet ./...`: clean on touched packages.
- Coverage: `x/hub/types` 93.3% (v0.3 floor preserved; new cross-const test adds coverage). `x/council/types` 96.4% (improved from v0.3). Both above the 80% target (D-033). `go.mod` unchanged (zero deps, G-006). **PASS.**
## 2. NFR Purity Gate (v0.4 mandatory)
The NFR purity gate (D-047, D-001 filter) requires zero `feat:` commits in the v0.4 milestone range. The gate is checked on COMMIT SUBJECTS (not bodies), because `git log --grep` over-matches commit bodies that mention "feat:" in prose (e.g., the verify commits say "zero feat: commits in P2" in the body).
**Gate command**: `git log --format="%s" main..HEAD | grep -E "^feat:"`
**Result**: exit 1 (zero matches). The 20 commit subjects are: `docs(init)`, `docs(P00)` ×3, `docs(P00)` grill, `decision(P00)`, `Merge` ×3, `refactor(lexicon)`, `verify(P1)`, `checkpoint(p1)` ×3, `docs(arch)`, `verify(P2)`, `checkpoint(p2)`, `chore(ci)`, `verify(P3)`, `checkpoint(p3)`. None start with `feat:`.
**NFR purity gate: GREEN.**
## 3. Non-Critical Observations (P1+ flags, not blocking)
### P2-1: mkdocs build warnings (pre-existing v0.3 docs links)
- **Files**: `docs/index.md`, `docs/shared/vision.md` (link to `../README.md` / `../../README.md`)
- **Note**: `mkdocs build` produces 2 warnings about README.md not being in the docs tree. The build SUCCEEDS (warnings, not errors). These are pre-existing v0.3 docs content links, NOT introduced by v0.4. v0.4's REQ-032 is the CI workflow (which runs `mkdocs build` and succeeds despite the warnings), not the docs content.
- **Recommendation**: post-hoc fix in v0.5+ (either include README.md in mkdocs nav, or fix the relative links). Not a v0.4 ship blocker.
### P2-2: Gitea Actions `actions/upload-artifact@v4` compatibility
- **File**: `.gitea/workflows/docs-build.yml`
- **Note**: the workflow uses `actions/upload-artifact@v4`. Gitea Actions (which reimplements GitHub Actions) supports most `actions/*` but v4 of upload-artifact has had compatibility quirks. If the upload step fails, the `mkdocs build` step (the higher-priority check) would still have succeeded.
- **Recommendation**: post-hoc verify on the first real CI run; downgrade to v3 or use Gitea-native upload if needed. Not a ship blocker (the build is the gate, the artifact is a bonus).
### P2-3: NFR purity gate precision (documented in REVIEW.md P1+ #3)
- **Note**: `git log --grep "^feat:"` over-matches commit bodies. The audit uses the subject-only gate (`--format="%s" | grep -E "^feat:"`). This is documented for future milestones.
- **Recommendation**: bake the subject-only gate into the next milestone's PLAN. Not a ship blocker.
## 4. Overall Audit Verdict
### **PASS**
The v0.4 (Refinement — NFR) milestone is **shippable**.
**Per-check summary:**
| # | Check | Verdict |
|---|-------|---------|
| 1.1 | Reconstruction (phase progression, tags, `.ciagent` evidence) | PASS |
| 1.2 | `.ciagent` file discipline (14 files, CHECKPOINT, config.json) | PASS |
| 1.3 | Branch hygiene (no leftover phase branches; P4 final pending) | PASS |
| 1.4 | Commit discipline (`---ci---` blocks; conventional subjects; no feat:) | PASS |
| 1.5 | Build / test / coverage sanity (build, test, ≥80%, lexicon, G-006) | PASS |
| 2 | **NFR purity gate** (zero `feat:` commit subjects) | **GREEN** |
**Critical issues: 0.**
**Non-critical observations: 3** (all P2, post-hoc, non-blocking).
**Confidence in overall verdict: 0.90.**
## STRIDE security summary (per ci-auditor role, read-only)
| Category | Finding | Severity | Disposition |
|---|---|---|---|
| Spoofing | No auth surface added (v0.4 is refactor+test+docs+CI; no new identity logic) | Low | Accept |
| Tampering | The cross-const test (REQ-030) HARDENS tamper-resistance: a future change to `x/bond.CouponCapBps` or `x/hub.LendingCouponCapBps` is now detected by an automated test (was comment-only before v0.4). The absolute-value assertion (G-015) catches paired drift. Mission Lock (8%/0%) is MORE defended after v0.4. | Low (improved) | Accept |
| Repudiation | No audit-log changes in v0.4 | Low | Accept |
| Info Disclosure | The CI workflow (REQ-032) does NOT publish (build+artifact only, D-051); no secret exposure in the workflow YAML; `GITEA_TOKEN` is resolved via `resolveSecret()` from `.ciagent/.env.secrets` for release creation, never via shell-env `curl` | Low | Accept |
| Denial of Service | No network surface added; the CI workflow runs on push but does not expose a service | Low | Accept |
| Elevation of Privilege | No privilege surface added; the lexicon helper is a pure function; the regression guard only asserts existing consts | Low | Accept |
No threat exceeds the low/accept threshold. No escalations. v0.4 hardens the mission-locked const firewall (REQ-030) and the lexicon firewall (REQ-029) without introducing any new attack surface.
+1 -1
View File
@@ -61,7 +61,7 @@ OpenYield (OY) is a durable, anti-greed, jurisdiction-light financial layer —
- D-009: Rebased history to fix v1.0 → v0.1 in ---ci--- blocks
## Milestone
v0.4 — Refinement (active milestone; NFR type; tags run on the v0.3.x patch line)
v0.4 — Refinement (complete; NFR type; tags ran on the v0.3.x patch line)
### v0.4 Scope (Refinement-only NFR — v0.3 post-hoc forward-references)
+16 -4
View File
@@ -52,15 +52,27 @@ refinement-only filter applies to any IDEATE stage.
| ID | Requirement | Source | Class | Priority | Status | Phase |
|----|-------------|--------|-------|----------|--------|-------|
| REQ-029 | Lexicon firewall: shared `lexicon.SyntheticBannedStrings()` helper — dedupe the synthetic self-test table between `lexicon_meta_test.go` and `lexicon_meta_docs_test.go`; both meta-tests derive count + strings from the single source so a future banned-term addition updates both firewalls from one place | GRILL G-014 | refactor/test | High | Pending | v0.4/P1 |
| REQ-030 | Cross-package const-equality test: `x/hub.LendingCouponCapBps == x/bond.CouponCapBps` (and Floor) — test-only import (G-003 exempt), catches silent mission-lock drift between hub LOCAL consts and bond D-028 consts | REVIEW.md P2 / A-304 | test | High | Pending | v0.4/P1 |
| REQ-031 | x/* lifecycle type shape-divergence review + alignment fixes — audit non-must-have lifecycle types across modules flagged by AUDIT §193; align shapes where divergent (no behavioral change) | AUDIT.md §193 | refactor/quality | Medium | Pending | v0.4/P2 |
| REQ-032 | Docs build CI — Gitea Actions workflow that runs `go test ./...` (lexicon firewall) + `mkdocs build` on every push; upload the built `site/` as a CI artifact. Full Gitea Pages publishing deferred if no hosting target is configured (chore, not feat) | D-046 | chore/ci | Medium | Pending | v0.4/P3 |
| REQ-029 | Lexicon firewall: shared `lexicon.SyntheticBannedStrings()` helper — dedupe the synthetic self-test table between `lexicon_meta_test.go` and `lexicon_meta_docs_test.go`; both meta-tests derive count + strings from the single source so a future banned-term addition updates both firewalls from one place | GRILL G-014 | refactor/test | High | Complete | v0.4/P1 |
| REQ-030 | Cross-package const-equality test: `x/hub.LendingCouponCapBps == x/bond.CouponCapBps` (and Floor) — test-only import (G-003 exempt), catches silent mission-lock drift between hub LOCAL consts and bond D-028 consts | REVIEW.md P2 / A-304 | test | High | Complete | v0.4/P1 |
| REQ-031 | x/* lifecycle type shape-divergence review + alignment fixes — audit non-must-have lifecycle types across modules flagged by AUDIT §193; align shapes where divergent (no behavioral change) | AUDIT.md §193 | refactor/quality | Medium | Complete | v0.4/P2 |
| REQ-032 | Docs build CI — Gitea Actions workflow that runs `go test ./...` (lexicon firewall) + `mkdocs build` on every push; upload the built `site/` as a CI artifact. Full Gitea Pages publishing deferred if no hosting target is configured (chore, not feat) | D-046 | chore/ci | Medium | Complete | v0.4/P3 |
> REQ-029..REQ-032 are NEW in v0.4. All are NFR classes (refactor/test/quality/
> chore) — zero `feat:` phases by construction. The final-phase audit enforces
> the NFR purity gate (zero `feat:` commits in the milestone).
## Milestone v0.4 Summary (Refinement — NFR) — COMPLETE
- 4 v0.4-scope REQs shipped as NFR (refactor/test/docs/chore): REQ-029, REQ-030, REQ-031, REQ-032
- Closes 3 real v0.3 forward-references: GRILL G-014 (lexicon drift), REVIEW P2/A-304 (const drift), AUDIT §193 (council divergence docs)
- Lands the D-046 docs-CI forward-reference (.gitea/workflows/docs-build.yml, build+artifact, no Pages publish per D-051)
- NFR purity gate GREEN: zero `feat:` commit subjects in the milestone (20 commits, all docs/refactor/test/chore/verify/decision/checkpoint/Merge)
- `go.mod` unchanged (G-006 — zero Go deps; Python deps isolated to CI docs-build job)
- G-003 production firewall intact (no production import of `x/bond/types` in `x/hub/types`; cross-const test is test-only)
- Coverage: x/hub/types 93.3% (v0.3 floor preserved), x/council/types 96.4% (improved); both above 80% target
- Tags: v0.3.0 (P0) -> v0.3.1 (P1) -> v0.3.2 (P2) -> v0.3.3 (P3) -> v0.3.4 (P4 = v0.4 milestone release)
- Tag-line note: v0.4 (NFR) ships on the v0.3.x patch line (config tag_base). The v0.3.4 milestone release IS the deliverable (D-008 — final phase patch IS the milestone release; no separate minor tag).
## IDEATE Traceability (Phase 0 — IDEATE stage, autonomy=full)
The IDEATE stage ran the three ideation tiers (mechanical, backend-enriched,
+56
View File
@@ -365,3 +365,59 @@ All verification commands pass. All locked-const invariants enforced and tested.
**P0 fixes auto-applied: 0**
**P1+ findings: 0 P1, 3 P2 (all nits, post-hoc, non-blocking)**
**Confidence in overall verdict: 0.91**
---
# Review: OpenYield (oy) — v0.4 (Refinement — NFR) Final Phase
> **Reviewer**: CIAgent multi-persona code review (lead-developer + backend-engineer lenses)
> **Date**: 2026-08-17
> **Target**: All v0.4 milestone commits (main..oy/milestone/v0.4-refinement) across P1..P3
> **Milestone**: v0.4 — Refinement (NFR)
> **Autonomy**: full
## Scope Reviewed
The v0.4 milestone ships 4 REQs across 3 execution phases (P1..P3) + phase 0 (pre-execution). 20 commits, 15 files changed (+764 / -157). The review covers the execution-phase deliverables:
- **P1** (v0.3.1): REQ-029 lexicon shared helper, REQ-030 cross-const test
- **P2** (v0.3.2): REQ-031 lifecycle divergence docs + regression guard
- **P3** (v0.3.3): REQ-032 docs build CI
## Adversarial Probes
1. **Does the shared helper actually dedupe?** Probe: `grep -rn 'open a.*here\|make a.*now\|compounding.*rate' lexicon_meta_test.go lexicon_meta_docs/` — returns ZERO matches (the old duplicated table is gone; both meta-tests now call `lexicon.SyntheticBannedStrings()`). Verified at `lexicon_meta_test.go:93` and `lexicon_meta_docs/lexicon_meta_docs_test.go:155` (both consume the helper). ✓
2. **Does the cross-const test fail closed on drift?** Probe: the test imports `bondtypes "github.com/oy/openyield/x/bond/types"` in `x/hub/types/cross_const_test.go:28` and asserts `LendingCouponCapBps != bondtypes.CouponCapBps` would fail the test. The absolute-value test `TestConstsAreMissionLocked800And0` (G-015) catches paired drift (both consts → 900). Both paths verified by reading the test. ✓
3. **Does the regression guard lock the 4-signal shape?** Probe: `TestSignalKindShapeIntentional` at `x/council/types/types_test.go` asserts `SignalKindCount == 4` with a `t.Fatalf` (not `t.Errorf`) and checks `AllSignalKinds()` returns `[SignalStash, SignalStanding, SignalVouch, SignalCapital]` in order. The doc comment includes the AUDIT §193 P1-2 rationale. Changing `SignalKindCount` to 5 fails this test AND `TestSignalKindCountLockedConst`. ✓
4. **Does the CI workflow YAML parse and enforce G-016?** Probe: `python3 -c "import yaml; doc=yaml.safe_load(open('.gitea/workflows/docs-build.yml')); assert doc['jobs']['docs-build']['needs'] == 'go-test'"` — passes. The `needs: go-test` line is present at `.gitea/workflows/docs-build.yml` in the `docs-build` job. ✓
5. **Is `go.mod` really unchanged across the whole milestone?** Probe: `git diff main..HEAD -- go.mod` — empty. The CI workflow's Python deps are in a separate job; the lexicon helper adds no Go deps; the cross-const test adds no Go deps (test-only import of an internal package). G-006 intact. ✓
6. **NFR purity gate — zero `feat:` commit SUBJECTS?** Probe: `git log --format="%s" main..HEAD | grep -E "^feat:"` — exit 1 (no matches). All 20 subjects are `docs(`, `refactor(`, `test(`, `chore(`, `verify(`, `decision(`, `checkpoint(`, or `Merge`. NOTE: `git log --grep "^feat:"` matches commit BODIES too (the v0.4 verify commits mention "feat:" in prose like "zero feat: commits in P2"); the correct gate uses subject-only check via `--format="%s"`. This is a documented refinement for the audit. ✓
7. **Does G-003 hold — no production cross-module struct imports added?** Probe: `grep -rn "x/bond/types" x/hub/types/ --include="*.go" | grep -v "_test.go"` — zero matches. The only import of `x/bond/types` in `x/hub/types/` is in `cross_const_test.go` (a `_test.go` file, G-003 test-exempt). Production firewall intact. ✓
## P0 fixes auto-applied
**0.** No P0 (critical) issues found. The milestone ships clean.
## P1+ flags (post-hoc review — do NOT block ship)
**1.** [P2 nit, maintainability] The `mkdocs build` local run produced 2 warnings about README.md links (`docs/index.md` links to `../README.md`, `docs/shared/vision.md` links to `../../README.md`). These are pre-existing v0.3 docs links (not introduced by v0.4); the warnings are non-blocking (mkdocs builds successfully). Recommend post-hoc: either configure `mkdocs.yml` to include README.md in the nav, or fix the relative links. Not a v0.4 ship blocker (the docs site builds; v0.4's REQ-032 is the CI workflow, not the docs content).
**2.** [P2 nit, CI] The `docs-build.yml` workflow uses `actions/upload-artifact@v4` with `retention-days: 14`. Gitea Actions may have a different artifact retention default; the explicit `retention-days: 14` is defensive. If Gitea Actions does not support v4 of the upload-artifact action, the workflow would fail at the upload step (the `mkdocs build` itself would have succeeded). Recommend post-hoc: verify Gitea Actions supports `actions/upload-artifact@v4`; if not, downgrade to v3 or use the Gitea-native artifact upload. Not a ship blocker (the build itself is the higher-priority check; the artifact upload is a bonus).
**3.** [P2 nit, audit-gate precision] The NFR purity gate (`git log --grep "^feat:"`) over-matches commit bodies. The correct gate is subject-only (`git log --format="%s" | grep -E "^feat:"`). The P4 audit uses the subject-only check. Recommend post-hoc: document the subject-only gate in the next milestone's PLAN so future audits do not over-count. Not a ship blocker (the subject-only gate is green).
## Overall verdict
**SHIP.**
All four REQs (REQ-029..REQ-032) delivered. The three real v0.3 forward-references (G-014 lexicon drift, A-304 const drift, AUDIT §193 council divergence) are closed; the D-046 docs-CI forward-reference is landed. `go test ./...` green across all 26 packages. `go.mod` unchanged (G-006). G-003 production firewall intact. NFR purity gate GREEN (zero `feat:` commit subjects). No P0 issues. Three P2 nits flagged for post-hoc review (none blocking).
**P0 fixes auto-applied: 0**
**P1+ findings: 0 P1, 3 P2 (all nits, post-hoc, non-blocking)**
**Confidence in overall verdict: 0.90**
+41
View File
@@ -69,6 +69,47 @@ Target: Bearers skeleton (ROADMAP Phase 3 subset) + docs site for nomads and fre
> (= the v0.3 milestone release, per D-008 — final phase patch IS the
> milestone release; no separate minor tag).
## Milestone v0.4 — Refinement (COMPLETE; NFR type; tags v0.3.x)
Target: Close the v0.3 post-hoc forward-references (lexicon firewall drift,
hub↔bond const drift, council lifecycle type divergence) + land the deferred
docs build CI. Refinement-only NFR milestone: zero `feat:` phases.
- [x] P0: Pre-Execution (spec/clarify/research/plan/grill/mvp-ux) → v0.3.0
- [x] P1: Lexicon + const hardening (REQ-029, REQ-030) → v0.3.1
- [x] P2: Lifecycle divergence docs + regression guard (REQ-031) → v0.3.2
- [x] P3: Docs build CI (REQ-032) → v0.3.3
- [x] P4: Final Review + Audit + Ship → v0.3.4 (milestone release)
- Status: COMPLETE — 4 NFR REQs shipped; NFR purity gate GREEN (zero feat: commits); go.mod unchanged
> v0.4 closes three real v0.3 forward-references (GRILL G-014 lexicon helper,
> REVIEW P2/A-304 cross-const test, AUDIT §193 council divergence docs) and
> lands the D-046 docs-CI forward-reference. Live-runtime promotions of the
> v0.3 Bearers skeletons are deferred to v0.5+ (feat:-class, rejected by the
> D-001 refinement-only filter).
| Phase | Type | Scope | Patch |
|---|---|---|---|
| P0 | docs | Pre-Execution (spec/clarify/research/plan/grill/mvp-ux) | v0.3.0 |
| P1 | refactor+test | Lexicon shared helper (REQ-029) + cross-const test (REQ-030) | v0.3.1 |
| P2 | docs+test | Council lifecycle divergence docs (REQ-031) + regression guard | v0.3.2 |
| P3 | chore+ci | Docs build CI workflow (REQ-032) | v0.3.3 |
| P4 | final | REVIEW + AUDIT + milestone SHIP | v0.3.4 (milestone release) |
### v0.4 Component mapping
| Component | Deliverable | v0.4 Change | Phase |
|---|---|---|---|
| Lexicon firewall | Shared `SyntheticBannedStrings()` helper | `lexicon/lexicon.go` + both meta-tests refactored | v0.4/P1 |
| Mission-locked const firewall | Cross-package const-equality test | `x/hub/types/cross_const_test.go` (NEW) | v0.4/P1 |
| Council Voice/Council interface | Lifecycle divergence documentation + regression guard | ARCHITECTURE.md section + `x/council/types/types_test.go` intent test | v0.4/P2 |
| Docs CI | Gitea Actions workflow (build + artifact) | `.gitea/workflows/docs-build.yml` (NEW) | v0.4/P3 |
> **Tag-line note (G-010 continuation)**: v0.4 (NFR) ships on the `v0.3.x`
> patch line (config.json `tag_base: v0.3.x`): P0 -> `v0.3.0`, P1..P3 ->
> `v0.3.1..v0.3.3`, P4 -> `v0.3.4` (= the v0.4 milestone release, per D-008 —
> final phase patch IS the milestone release; no separate minor tag).
## Phase 3 — The Bearers (Year 3) — v0.3 PARTIAL SKELETON
**Target**: $10B annual volume → fee auto-declines to 0.07%