<< All versions

Skill v1.0.0

currentAutomated scan100/100
nagiliant/genesis-legacy-v2/genesis-accept
──Details
PublishedSeptember 28, 2026 at 04:33 PM
Content Hashsha256:8b22d41378c8c7a6...
Git SHA
──Files
Files (1 file, 9.8 KB)
SKILL.md9.8 KBactive
SKILL.md · 227 lines · 9.8 KB

version: "1.0.0" name: "Accept" description: The boundary ritual — review what just landed, record an approval, journal it, and advance the phase. The ONLY step that writes approvals, and it does NO git. argument-hint: "[phase] [--force] [--exclude <item>]"


Accept — The Boundary Ritual

Accept fires after every pipeline step. It is the only step that writes approval records — every other step reads them. It reviews what just happened, records a disposition, writes a journal entry, and advances the phase in project-state.md.

Accept does NO git. No commit, no push, no PR, no branch operations. Git lives entirely in /genesis-closure. This separation is load-bearing: Accept records what landed; Closure moves what landed. If Accept committed, uncommitted work could masquerade as approved.

Inference

Accept infers what it is approving from context — the most recent un-approved artifact — so it usually needs no argument. Always print an inference trace so the decision is explainable:

Approving: {phase} — most recent un-approved action in {file}

If a phase is given as an argument, approve that phase explicitly.

Routing — which file gets written

Two approval layers live under .genesis/features/{feature}/approvals/:

  • `master.json` — spec-level and feature-level phases (brainstorm, design, specify, clarify, northstar, group-accept, final audits, review).
  • `group-N.json` — per-group work (the micro specs for group N, each spec's implementation, and the per-group audits A1–A5).
Phase being approvedTarget fileRecorded phase
brainstorm / design / specify / clarify / northstarmaster.jsonbrainstorm / design / …
micro specs for group Ngroup-N.jsonmicro
implement specgroup-N.jsonimplement-{spec-id}
audit AX for group Ngroup-N.jsonaudit-aX
group accept for group Nmaster.jsongroup-accept (with group: N)
final audit FXmaster.jsonaudit-fX
feature reviewmaster.jsonreview

Rule of thumb: spec-level phases → master.json; per-spec implementation and per-group audits → group-N.json; group-accept closes the group but is itself a spec-level gate, so it writes to master.json.

What Accept checks before approving

1. Clean working tree

Before recording anything, verify the tree is clean:

git diff --quiet # no unstaged changes
git diff --cached --quiet # no staged-but-uncommitted changes

If either reports changes, refuse:

Cannot accept — working tree is dirty.
{N} files with unstaged changes, {M} files staged but uncommitted.
Accept records what landed. A dirty tree means uncommitted work is not
captured by the commit you are about to approve. Commit or stash first,
then re-run accept.
Override: --force (records the variance in the approval note).

This is the central guardrail and it is enforced by this skill itself — there is no external daemon. The rationale is the Accept/Closure split: if the tree is dirty, the thing you are approving is not what is actually committed.

2. Quality gates

If the constitution defines quality gates, run them — typically lint and tests (and a type-check or build where applicable) — and record each result. A failing gate does not auto-block: record it as fail in the gates field and let the user decide. With --force, note the failure and proceed. If the constitution defines no gates, gates is null.

3. Group-accept completeness

For a group-level accept, all in-scope audit types (A1–A5) must show clean passes in group-N.json before the group can close.

4. The Standard (rejection-default posture)

Accept does not ask "is this good enough to pass?" It asks "is there any reason NOT to accept?" The default is rejection; approval is earned by actively disproving each reason:

#Rejection reasonHow to disprove it
1Incomplete implementationevery file operation in the spec is satisfied
2Failing quality gatesall constitution gates pass
3Unresolved audit findingszero open findings from A1–A5 (or the final audits at feature scope)
4Missing acceptance criteriaevery AC in the spec is checked
5Drift from the North Starimplementation aligns with the stated direction
6Undocumented decisionskey decisions are recorded in the journal / decision log

If any reason cannot be disproven, return revise naming the specific unmet criterion. The default holds.

The approval record

Append a record to the flat JSON array in the target file:

json
{
"phase": "implement-spec-3",
"version": "1.0",
"status": "approved",
"disposition": "pass",
"timestamp": "2026-06-18T14:32:00Z",
"approvedBy": "user",
"gates": { "lint": "pass", "tests": "pass" },
"group": null,
"scope": null,
"note": "",
"conviction": null,
"exclusions": []
}
FieldMeaning
phasewhat was approved (from the routing table)
versionrecord schema version ("1.0")
statusderived from disposition (mapping below)
dispositionthe verdict: pass \revise \conditional \reject
timestampISO 8601
approvedBywho approved (e.g. "user")
gates`{ "lint": "pass"\"fail", "tests": "pass"\"fail" }, or null` if no gates defined
groupgroup number for group-scoped records; null otherwise
scopeoptional finer scope (a spec id/title) or null
notefree text — findings reference, conditions, or a recorded variance
convictioninteger 0–100 for audit phases; null for non-audit phases
exclusionsitems excluded under a conditional accept

Disposition → status:

DispositionstatusBehavior
passapprovedadvance to next phase
reviserevisereturn to the previous stage; note must reference findings
conditionalconditionaladvance with documented exceptions; exclusions populated
rejectrejectedreturn to an earlier phase; note must give the reason

Skipped stage — when a stage is deliberately skipped, carry the justification rather than silently omitting it:

json
"variance": { "skippedStage": "clarify", "reason": "spec is trivial, no open questions" }

The clean-tree override (--force)

--force proceeds past a dirty tree or a failing gate. There is no enforcement daemon — the override is simply a recorded variance in the `note` field:

clean-tree override — 2 dirty files at accept time: src/foo.ts, README.md

The legitimate use case is parallel work: a second editing session can make the tree look dirty to the one running Accept. The override closes the loop while the note keeps the trail honest. Without --force, Accept exits before writing anything.

Conviction

Conviction is an integer (0–100) attached to audit-phase approvals only — how confident the review is that the work is genuinely ready, not merely that no findings are open.

  • Applies only to audit phases (A1–A5, final audits, feature review). Other phases leave conviction: null.
  • Computed as the mean conviction across all findings in scope (each audit finding carries its own score). Zero findings ⇒ conviction 100.
  • An optional .genesis/features/{feature}/conviction/policy.yaml defines thresholds. If absent, skip this step entirely (graceful degradation):
Mean convictionBehavior
≥ auto-pass (default 80)recommend pass; proceed, record the score
prompt ≤ … < auto-pass (default 60–79)show breakdown, recommend reviewing low-conviction findings, ask before proceeding
< stop (default 60)stop; list the lowest-conviction findings; require explicit --force

When prompting or stopping, show a per-audit breakdown:

Conviction Breakdown:
A1 (design+master): 3 findings, mean 88 [OK]
A2 (spec review): 2 findings, mean 72 [REVIEW]
A3 (polish): 0 findings [CLEAN]
A4 (north star): 1 finding, mean 65 [LOW]
A5 (web): 0 findings [CLEAN]
Aggregate: 76 (below auto-pass threshold of 80)

Journal

After recording, write a plain markdown entry to .genesis/features/{feature}/journal/{date}_{time}.md:

markdown
---
feature: "{feature}"
phase: "{phase}"
scope: "{group/spec if applicable}"
date: "{ISO date}"
---
## {Phase}: {Feature}
{2–3 sentence summary of what was done}
### Decisions
-{key decision made during this phase}
### Next
{what comes next in the pipeline}

The journal is the durable record of why. It is written here, never by an automatic hook.

Advance the phase

After journaling, update project-state.md and present the next pipeline action:

  • brainstorm → feature doc / specify · specify → clarify · clarify → northstar · northstar → first group's micro specs
  • micro group N → next group's micro specs (if more) or implement (when all groups are written)
  • implement spec → next spec, or A1 when the group's specs are done
  • audit AX clean → next audit type, or group-accept after A5 is clean
  • group-accept → if all groups are now accepted, the mandatory next step is F1 (never skip straight to closure); otherwise run group closure (push + PR) and move to the next group
  • final audits run F1 → F2 → … in sequence; after the last, feature review, then the final closure PR

Disposition routing: revise re-runs the stage sent back; reject re-runs from an earlier phase; conditional advances like pass but exclusions stay visible.

Finally, scan the accepted artifact for actionable ideas and ingest them into the furnace (see /genesis-brainstorm and docs/concepts.md): update a matching F-NNN entry, or append a new one with status: seed.

Natural language triggers

- "accept"
- "approve this"
- "looks good, advance"
- "lock it in"
All versions