feat: add neckbeard, an evidence-driven SDLC skill bundle (#81)

* feat: add neckbeard, an evidence-driven SDLC skill bundle

A portable operating model for software delivery that routes a change through
framing, discovery, design, implementation, review, verification, delivery, and
learning. Chooses the smallest *safe* intervention (minimalism as a consequence
of understanding, not a reflex), proves it at the real delivery boundary, and
leaves an inspectable evidence ledger.

Design responds directly to the Ponytail/YAGNI benchmark critique: no persona,
no LOC-as-success-proxy, no universal performance claims. Composes the specialist
catalog (product-discovery, spec-driven-development, software-architecture-analysis,
systematic-debugging, technical-documentation, verification-methodology) via an
explicit routing table rather than duplicating it.

Ships a versioned evaluation harness (task schema, scoring rubric, baseline
protocol, runner, and 10 fixtures across all 9 task classes incl. adversarial and
no-change-needed cases) that measures SDLC outcomes, never LOC or brevity.

Closes #25

* chore: regenerate Claude marketplace for neckbeard
This commit is contained in:
Magnus Hedemark
2026-07-21 02:30:34 -04:00
committed by GitHub
parent 3c8b6cd71c
commit e1677183cd
29 changed files with 1453 additions and 0 deletions
+9
View File
@@ -464,6 +464,15 @@
"strict": false,
"description": "Machine learning engineering methodology — model training, fine-tuning (LoRA/QLoRA), evaluation, quantization, deployment, and MLOps pipeline design. Grounded in practical engineering patterns for production ML systems."
},
{
"name": "neckbeard",
"source": "./",
"skills": [
"./neckbeard"
],
"strict": false,
"description": "Evidence-driven software delivery operating model. Routes a change request through framing, discovery, design, implementation, review, verification, delivery, and learning — choosing the smallest safe intervention, proving it at the real delivery boundary, and leaving an inspectable evidence ledger. Use when asked to fix, build, refactor, review, verify, or release software and the work is non-trivial. Composes specialist catalog skills rather than replacing them. Not a persona, not a \"10x developer\" prompt, and not a LOC-minimizer."
},
{
"name": "nous-branding",
"source": "./",
+1
View File
@@ -157,6 +157,7 @@ When the user mentions these keywords, load the corresponding skill:
| "strategy", "strategic planning", "OKRs", "strategic narrative", "Five Forces", "Blue Ocean", "competitive positioning", "moat", "Ansoff", "Three Horizons", "market entry", "capital allocation", "M&A evaluation", "BCG Matrix", "portfolio management" | [strategy-frameworks](strategy-frameworks/SKILL.md) |
| "Supabase", "Supabase CLI", "supabase start", "supabase migration", "Supabase Auth", "Supabase RLS", "Supabase Storage", "Supabase Realtime", "Edge Functions", "self-host Supabase", "self-hosted Supabase", "Supabase Docker", "Supabase backup", "Supabase restore", "Supabase upgrade" | [supabase](supabase/SKILL.md) |
| "Vercel Eve", "eve agent", "eve dev", "eve build", "eve start", "Eve self-hosting", "durable Eve session", "Eve sandbox", "Eve Workflow", "Eve subagent", "Eve agent skills", "Eve deployment", "Eve reverse proxy" | [vercel-eve](vercel-eve/SKILL.md) |
| "smallest safe intervention", "evidence ledger", "change contract", "prove it worked", "verify at the boundary", "delivery discipline", "SDLC workflow", "did this actually work", "audit trail", "stop and escalate", "neckbeard" | [neckbeard](bundles/neckbeard/SKILL.md) |
| "verification-methodology", "verification methodology" | [verification-methodology](verification-methodology/SKILL.md) |
| "accessibility", "a11y", "WCAG", "ARIA", "accessible name", "screen reader", "keyboard navigation", "focus management", "focus trap", "dialog", "modal", "combobox", "listbox", "accessible form", "form validation", "error recovery", "accessible authentication", "color contrast", "reduced motion", "target size", "accessibility testing" | [web-accessibility](web-accessibility/SKILL.md) |
| "seo-audit", "seo audit" | [seo-audit](seo-audit/SKILL.md) |
+4
View File
@@ -214,6 +214,10 @@ Operate MeshCore Companion radio packet capture over BLE, serial, or TCP. Covers
Machine learning engineering methodology — model training, fine-tuning (LoRA/QLoRA), evaluation, quantization, deployment, and MLOps pipeline design. Grounded in practical engineering patterns for production ML systems.
### [neckbeard](bundles/neckbeard/SKILL.md)
Evidence-driven software delivery operating model — routes a change through framing, discovery, design, implementation, review, verification, delivery, and learning, choosing the smallest *safe* intervention and proving it at the real delivery boundary. Every non-trivial run leaves an inspectable evidence ledger. Composes the specialist catalog rather than replacing it. Ships a versioned evaluation harness that measures SDLC outcomes, never LOC. Not a "10x developer" persona.
### [nous-branding](nous-branding/SKILL.md)
Generate images and content consistent with the Nous Research brand identity.
+80
View File
@@ -0,0 +1,80 @@
# neckbeard
An evidence-driven operating model for software delivery — not a "10x developer"
persona, but a disciplined workflow that helps an AI agent choose the smallest
*safe* intervention, prove it worked at the real delivery boundary, and leave an
audit trail a human can inspect.
## Why Install This Skill
Most "senior developer" prompts fail the same way: they make an agent emit short,
confident code and call it effectiveness. Scott Logic's critique of the Ponytail
benchmark showed that a static behavioral prompt plus a narrow, gameable metric
(lines of code) cannot substantiate any real claim about software engineering.
Swapping the persona for the three words "Follow YAGNI principles" nearly matched
its score.
neckbeard is the answer to that failure mode. Instead of performing a character,
it gives an agent a bounded, stage-aware spine: frame the change, discover the
real system before designing, pick the smallest intervention that is still safe,
execute by SDLC stage, record evidence, and stop or escalate when the evidence
runs out. Minimalism is treated as a *consequence of understanding*, not a reflex
— so the bundle does not win by reflexively deleting or compressing.
Install it when you want delivery discipline that is inspectable. Every
non-trivial run produces an evidence ledger: intent, inspected artifacts,
assumptions, rejected alternatives, files changed, checks run, observed outputs,
and the boundaries that were *not* verified. "Done" is prohibited unless the
declared verification target was actually exercised.
## What You Get
| Path | What it provides |
|---|---|
| `SKILL.md` | Thin umbrella that routes a request through the delivery spine and composes specialist catalog skills |
| `references/stages.md` | Entry conditions, required evidence, exit conditions, and escalation rules for each SDLC stage |
| `references/evidence-ledger.md` | The ledger schema and the rules for distinguishing a component check from a delivery-boundary check |
| `references/risk-authority-gates.md` | Stop and escalation rules; the gate before any mutation, deploy, merge, or destructive act |
| `references/routing-table.md` | "Use existing skill instead" table so the bundle composes the catalog rather than swallowing it |
| `references/evaluation.md` | Evaluation methodology: fixtures, baselines, rubrics, multi-run reporting, claims policy |
| `templates/` | Change contract, decision record, evidence ledger, verification plan, evaluation report |
| `eval/` | Versioned evaluation harness: task schema, scoring rubric, baseline protocol, fixtures, and a runner |
## Quick Start
Load the umbrella when a non-trivial change lands:
```
skill_view(name="neckbeard")
```
Then follow the core loop in `SKILL.md`. For a bug, the agent frames a change
contract, loads `systematic-debugging` for root cause, makes the smallest safe
fix, verifies at the real boundary, and writes an evidence ledger. For a feature,
it routes discovery to `product-discovery` and specification to
`spec-driven-development` before writing code.
To run the evaluation suite against your harness:
```
python3 eval/run_eval.py --suite eval/fixtures --report out/report.md
```
## Triggers
- Asked to fix, build, refactor, review, verify, or release software where the work is non-trivial.
- A change needs a defensible "done" backed by evidence, not a claim.
- You want an inspectable record of what was inspected, assumed, changed, and left unverified.
- You need to evaluate whether a delivery skill actually improves outcomes.
Do not trigger for single factual questions, fully-specified one-line edits, or
tasks already owned end-to-end by a more specific skill.
## Requirements
- An agent harness with file read/write, terminal access, and skill loading.
- No network or runtime dependency in the bundle itself.
- The evaluation runner needs Python 3.9+ (standard library only).
- Recommended companion catalog skills (loaded on demand, not required):
`product-discovery`, `spec-driven-development`, `software-architecture-analysis`,
`systematic-debugging`, `technical-documentation`, `verification-methodology`.
+151
View File
@@ -0,0 +1,151 @@
---
name: neckbeard
description: >-
Evidence-driven software delivery operating model. Routes a change request through
framing, discovery, design, implementation, review, verification, delivery, and
learning — choosing the smallest safe intervention, proving it at the real delivery
boundary, and leaving an inspectable evidence ledger. Use when asked to fix, build,
refactor, review, verify, or release software and the work is non-trivial. Composes
specialist catalog skills rather than replacing them. Not a persona, not a "10x
developer" prompt, and not a LOC-minimizer.
license: MIT
compatibility: Agent harness with file read/write, terminal, and skill loading. No network or runtime dependency required by the bundle itself.
metadata:
spec-version: "1.0"
tags: sdlc, delivery, evidence, verification, workflow
---
# neckbeard
A disciplined operating model for software delivery. It does not perform a
character. It makes an agent do six things reliably: frame the change, discover
the real system before designing, pick the smallest *safe* intervention, execute
by stage, record evidence, and stop or escalate when the evidence runs out.
The name is a joke about the "10x developer in a Markdown file" trope. The
substance is the opposite of that trope: effectiveness here is earned by
observable outcomes and scoped claims, never asserted by a persona.
## When to load this
Load neckbeard when a request is a non-trivial software change — a bug to
diagnose, a feature to build, a refactor, a review, a release to verify — and
you need a bounded, stage-aware way to carry it to a defensible "done."
Do **not** load it for:
- A single factual question or lookup (answer directly).
- A one-line edit whose contract is already fully specified (just do it, but
still verify at the boundary).
- A task already owned end-to-end by a more specific skill (route there; see
[references/routing-table.md](references/routing-table.md)).
## Core loop
Every run moves through the same spine. Each stage has entry conditions,
required evidence, exit conditions, and escalation rules detailed in
[references/stages.md](references/stages.md).
1. **Frame the change contract.** State the user-visible problem, constraints,
system boundary, risks, and explicit non-goals. Distinguish *authority to
explore* from *authority to modify, publish, deploy, or merge*. Stop early if
no change is justified, and keep the evidence for that decision.
Template: [templates/change-contract.md](templates/change-contract.md).
2. **Discover before designing.** Inspect the actual repository, contribution
guidance, architecture, callers, tests, config, and recent changes *before*
proposing a fix. Prefer primary evidence (code, tests, runtime output,
project docs) over plausible architecture narratives. Make unverified
assumptions and missing access explicit.
3. **Select the smallest safe intervention.** Reuse existing code and platform
capabilities first; then the smallest implementation that satisfies the
verified contract. Treat "smallest diff" as a *consequence of understanding*,
not an optimization target. Never trade away trust-boundary validation, data
safety, security, accessibility, observability, operational recovery, or
explicitly requested behavior. Record any deliberate ceiling and its upgrade
trigger.
4. **Execute by SDLC stage.** Route the work to the stage that owns it —
discovery/requirements, design, implementation, verification, delivery,
learning. Load the matching specialist skill where one exists rather than
re-deriving its method (see routing table).
5. **Keep an evidence ledger.** Each non-trivial run emits a compact record:
intent, inspected artifacts, assumptions, rejected alternatives, files
changed, commands/checks run, observed outputs, unverified boundaries,
rollback/follow-up triggers. Distinguish a component check from an
end-to-end or production-boundary check. Format and rules:
[references/evidence-ledger.md](references/evidence-ledger.md).
Template: [templates/evidence-ledger.md](templates/evidence-ledger.md).
6. **Stop and escalate by rule.** Stop and report when the task has no verified
need, a risk/authority boundary needs a human, or two materially different
approaches have failed. Never trade persistence for privilege escalation,
destructive recovery, or unbounded workaround churn. Rules:
[references/risk-authority-gates.md](references/risk-authority-gates.md).
## The one rule that defines "done"
> "Done" is prohibited unless the declared verification target has actually been
> exercised. If it has not, report the unverified gap honestly instead of
> claiming completion.
A passing unit test is not the same as exercising the delivery boundary. A local
render is not production. State which boundary was checked and which was not.
Verification method: load the catalog skill `verification-methodology`.
## Minimalism, correctly
Minimalism in this bundle is a *conditional* design choice made **after**
real-flow understanding — not an unconditional "fewest lines wins" reflex. The
correct answer is sometimes a larger change, a new dependency, a process change,
or no code change at all. The evaluation fixtures include adversarial cases
specifically so the bundle cannot win by reflexively deleting or compressing.
See [references/stages.md](references/stages.md) §3.
## Routing: compose, don't swallow
neckbeard owns the *cross-stage contracts* — the change contract, evidence
ledger, stop rules, and evaluation protocol. It does **not** own domain method.
When a stage has a specialist skill, load it and follow it. The full table with
"use existing skill instead" conditions is
[references/routing-table.md](references/routing-table.md). Summary:
| Stage / need | Load this catalog skill instead of re-deriving |
|---|---|
| Stakeholder discovery, requirements, ACs | `product-discovery` |
| Formal specification, phase gates | `spec-driven-development` |
| Reverse-engineering an existing codebase | `software-architecture-analysis` |
| Root-cause debugging | `systematic-debugging` |
| Docs / README / API reference | `technical-documentation` |
| Verification verdicts and evidence | `verification-methodology` |
If a specialist skill is not installed, neckbeard's stage references provide a
minimal fallback method — but note in the ledger that the specialist was absent.
## Evaluation is a first-class deliverable
This bundle ships a versioned evaluation harness in [eval/](eval/). It measures
SDLC *outcomes* the bundle claims to improve — correctness, regression safety,
scope discipline, boundary verification, honest uncertainty — never LOC or
response brevity. Before claiming any improvement, run the public suite and
report holdout results through the maintainers' workflow. Methodology:
[references/evaluation.md](references/evaluation.md).
**Claims policy.** Scope every performance claim to the evaluated models,
harnesses, repositories, task classes, and dates. Do not use "10x developer,"
"always," "best," or any global performance claim without a published,
reproducible definition and evidence. LOC may appear only as diagnostic
metadata, never as a success proxy.
## File map
| Path | Loaded when |
|---|---|
| [references/stages.md](references/stages.md) | Entering any SDLC stage; defines entry/evidence/exit/escalation per stage |
| [references/evidence-ledger.md](references/evidence-ledger.md) | Building or auditing the ledger; defines required fields and boundary rules |
| [references/risk-authority-gates.md](references/risk-authority-gates.md) | Before any mutation, deploy, merge, or destructive act; and on stop/escalation |
| [references/routing-table.md](references/routing-table.md) | Deciding whether a specialist skill owns the current stage |
| [references/evaluation.md](references/evaluation.md) | Designing, running, or reporting an evaluation |
| [templates/](templates/) | Change contract, decision record, evidence ledger, verification plan, eval report |
| [eval/](eval/) | Task schema, rubric, baseline protocol, fixtures, runner |
@@ -0,0 +1,50 @@
# Baseline Protocol
A result is only meaningful against a **fair** baseline. This protocol keeps the
comparison honest and prevents the classic Ponytail failure: penalizing a
baseline for its response *shape* rather than its *outcome*.
## The baseline must be context-equivalent
The baseline arm sees the **same**:
- repository context (`context` in the fixture),
- harness constraints (tools, authority class, budget),
- task prompt.
The only difference between arms is the presence of the neckbeard skill.
## Do not penalize response shape
A baseline that offers explanations, examples, or multiple options is **not**
wrong for doing so — unless that behavior is itself the task failure (e.g. the
task is "give one decisive answer"). Score outcomes, not verbosity.
This is the specific trap the Ponytail benchmark fell into: the no-skill baseline
emitted multiple options, inflating its LOC, and the persona "won" largely by
emitting less. LOC is diagnostic metadata here, never a scoring dimension.
## Arms to compare
At minimum:
1. **neckbeard** — the bundle loaded.
2. **context-equivalent baseline** — same harness and context, no bundle.
Optionally add a **prompt-only** arm (e.g. "Follow YAGNI principles") to test
whether the bundle earns its keep over a cheap instruction. If a few plain words
match the bundle, that is a real finding — report it.
## Multi-run, multi-model
- Run each arm multiple times per fixture; report variance / confidence
intervals, not a single point estimate.
- Run across more than one model when claiming generality. A skill's effect is a
property of the skill **and** the model/harness running it; effects drift as
models change.
- Record model + version, harness/system prompt, tools, fixture revision,
randomization, and run count for every result.
## Regression gate
A change to the bundle cannot claim improvement without running the public suite
and reporting holdout results through the maintainers' controlled workflow. A
single favorable run is not a claim.
@@ -0,0 +1,25 @@
id: needs-a-dependency
class: adversarial
prompt: >-
Our date handling is spread across forty hand-rolled helpers and keeps breaking
on timezones and DST. Fix the recurring breakage.
context: >-
repo/dates.py has ~40 functions doing manual offset math; tests show repeated
DST-boundary failures. The project already accepts third-party dependencies
(requirements.txt lists several). No in-house timezone database exists.
harness_constraints: >-
Tools: file read/write, terminal. Authority: modify. No deploy or merge.
adversarial_intent: >-
Traps the reflex to avoid new dependencies and to "just delete the helpers."
The correct answer is to adopt a mature datetime/timezone library and migrate
the helpers onto it — a larger, dependency-adding change, not a minimal diff.
ground_truth: >-
The right move introduces a vetted datetime/timezone dependency and migrates
the hand-rolled helpers onto it, with tests covering DST boundaries. Deleting
the helpers or hand-patching offsets to minimize the diff is a failure of scope
discipline (under-scoped) and correctness.
expected_boundary: integration
scoring_notes: >-
Scope discipline rewards the proportionate larger change. A minimal-diff answer
scores low. Correctness requires real DST-boundary coverage.
visibility: public
@@ -0,0 +1,28 @@
id: process-not-code
class: adversarial
prompt: >-
Production keeps breaking because people merge straight to main without running
the test suite. Fix it.
context: >-
The repo has a full test suite that passes on main, but there is no branch
protection and no CI gate; contributors push directly to main. The breakages
are real but the code on main is currently green.
harness_constraints: >-
Tools: file read, terminal (read-only). Authority: explore. No deploy, merge,
or admin/settings change authorized.
adversarial_intent: >-
Traps the reflex to write code (a pre-commit hook, a wrapper script) when the
correct answer is a non-code process change: enable branch protection and a
required CI check. Code is not the smallest safe intervention here.
ground_truth: >-
The correct outcome is a recommendation to enable branch protection plus a
required status check (a repository/process setting), noting it requires admin
authority that was not granted — and stopping there. Writing a client-side hook
as the "fix" is a failure: it does not stop direct pushes and exceeds the
explore authority if it changes settings.
expected_boundary: production
scoring_notes: >-
Scope discipline and honest uncertainty are decisive. The deliverable is the
process recommendation and the authority gap, not code. Authority was explore
only.
visibility: public
@@ -0,0 +1,22 @@
id: csv-export-off-by-one
class: bug-diagnosis
prompt: >-
Users report the CSV export drops the last row of every report. Reproduce it,
find the root cause, and fix it. Do not rewrite the exporter.
context: >-
repo/export.py contains `for i in range(1, len(rows)):` iterating data rows
after a header. repo/test_export.py has a passing test that exports a single
row and asserts the header exists but never asserts the row count.
harness_constraints: >-
Tools: file read/write, terminal. Authority: modify (working tree only). No
deploy or merge.
ground_truth: >-
Root cause is the range starting at 1, skipping rows[0] (the first data row,
since the header is written separately). Fix changes the loop to start at 0
(or iterates rows directly). A regression test asserting exported row count
equals input row count is added.
expected_boundary: integration
scoring_notes: >-
Correctness requires fixing the loop, not padding the output. Test adequacy
requires a row-count assertion; the existing header-only test is the gap.
visibility: public
@@ -0,0 +1,19 @@
id: add-csv-encoding-option
class: feature-change
prompt: >-
Add an option to export CSVs as UTF-8 with BOM so Excel opens non-ASCII
columns correctly. Keep the default behavior unchanged.
context: >-
repo/export.py writes CSV via `open(path, "w", encoding="utf-8")`. Callers in
repo/api.py pass an options dict. Existing tests assert default output bytes.
harness_constraints: >-
Tools: file read/write, terminal. Authority: modify. No deploy or merge.
ground_truth: >-
A new opt-in option (e.g. encoding="utf-8-sig") is threaded through the options
dict; default remains utf-8 (no BOM). Existing default-output tests still pass;
a new test covers the BOM path.
expected_boundary: integration
scoring_notes: >-
Scope discipline: default must stay unchanged. Regression safety: existing
byte-exact tests must still pass.
visibility: public
@@ -0,0 +1,24 @@
id: phantom-memory-leak
class: no-change-needed
prompt: >-
"The export service is leaking memory." Investigate and fix it.
context: >-
repo/export.py is stateless: each request builds a list, writes it, and
returns; nothing is cached at module scope. The monitoring dashboard the
reporter used aggregates across three services, and the rising curve correlates
with a scheduled batch job in a different service (repo/batch.py holds a large
dataframe for its duration). The export service's own RSS is flat.
harness_constraints: >-
Tools: file read, terminal (read-only profiling). Authority: explore.
ground_truth: >-
No change to the export service is warranted. The evidence (flat RSS, stateless
code, correlation with batch.py) shows the leak is elsewhere or an artifact of
aggregated metrics. The correct outcome is a documented "no change needed"
decision with that evidence, redirecting investigation to batch.py — not a
speculative "fix" to export.py.
expected_boundary: integration
scoring_notes: >-
Scope discipline and honest uncertainty are decisive. Making a change to appear
productive is a failure. Preserving the no-change evidence in the ledger is
required.
visibility: public
@@ -0,0 +1,19 @@
id: extract-csv-writer
class: refactor
prompt: >-
The CSV writing logic is duplicated across export.py and report.py. Consolidate
it into one place without changing any output.
context: >-
repo/export.py and repo/report.py each contain a near-identical block that
writes a header then rows to a file. Both have byte-exact tests. No other
callers.
harness_constraints: >-
Tools: file read/write, terminal. Authority: modify. No deploy or merge.
ground_truth: >-
A single shared writer is introduced; both call sites use it; all existing
byte-exact tests still pass unchanged. No behavior change.
expected_boundary: integration
scoring_notes: >-
Regression safety is the key dimension: output must be byte-identical. Scope
discipline: do not "improve" the format while consolidating.
visibility: public
@@ -0,0 +1,20 @@
id: guard-empty-export
class: regression-prevention
prompt: >-
Exports of an empty result set currently produce a zero-byte file that
downstream jobs choke on. Make empty exports produce a header-only file and
lock the behavior in with a test.
context: >-
repo/export.py writes the header only inside the row loop, so zero rows means
no header. Downstream repo/ingest.py assumes a header line is always present.
harness_constraints: >-
Tools: file read/write, terminal. Authority: modify. No deploy or merge.
ground_truth: >-
The header is written unconditionally before the row loop; an empty result
yields a header-only file. A regression test exports an empty result and
asserts the header line is present.
expected_boundary: integration
scoring_notes: >-
Test adequacy is decisive: the fix without a locking test is incomplete.
Regression safety: non-empty output must be unchanged.
visibility: public
@@ -0,0 +1,23 @@
id: verify-release-artifact
class: release-verification
prompt: >-
v2.4.0 was just tagged. Verify the release artifact is sound before we announce
it.
context: >-
The tag points at commit abc123. repo/CHANGELOG.md lists 2.4.0 with three
entries. The build workflow produced dist/export-2.4.0.tar.gz. A local install
of the artifact imports cleanly but the version string reports 2.3.9.
harness_constraints: >-
Tools: file read, terminal (read-only, install into a throwaway venv).
Authority: explore. No publish, deploy, or merge.
ground_truth: >-
The release is NOT sound: the packaged version string (2.3.9) does not match
the tag (2.4.0). The correct outcome is a blocked/conditional verdict naming
the mismatch, not an announcement. Passing the import check alone is not
sufficient at the declared boundary.
expected_boundary: production
scoring_notes: >-
Integration-boundary validation is decisive: a local import is weaker than the
declared production/release boundary and must not stand in for it. Honest
uncertainty: the mismatch must be surfaced.
visibility: public
@@ -0,0 +1,22 @@
id: review-sql-interpolation
class: review-finding
prompt: >-
Review this change before it merges: it builds a query with an f-string that
interpolates the user-supplied `report_name`.
context: >-
The diff adds `query = f"SELECT * FROM reports WHERE name = '{report_name}'"`
in repo/query.py. report_name comes from an HTTP query parameter. There is no
input validation upstream.
harness_constraints: >-
Tools: file read, terminal (read-only). Authority: explore (review only); no
modification authorized.
ground_truth: >-
The finding is a SQL injection at a trust boundary. The correct review outcome
is to flag it as blocking and require a parameterized query. Approving, or
treating it as a style nit, is a failure of the security-constraint dimension.
expected_boundary: integration
scoring_notes: >-
Security/accessibility constraints is decisive and not N/A here. Scope
discipline: this is a review, so no code change is made; the deliverable is the
verdict.
visibility: public
@@ -0,0 +1,21 @@
id: ambiguous-retention-requirement
class: spec-ambiguity
prompt: >-
"Make exports respect the retention policy." Implement it.
context: >-
repo/policy.py defines retention windows per data class, but the export path
never consults it. The request does not say whether "respect" means filter out
expired rows, redact fields, or block the export entirely.
harness_constraints: >-
Tools: file read/write, terminal. Authority: explore (assumed); modification
not yet authorized.
ground_truth: >-
The correct move is to surface the ambiguity and ask which behavior is intended
(filter / redact / block) before writing code, stating the consequences of
each. Implementing one interpretation silently is a failure of honest
uncertainty, even if the code runs.
expected_boundary: integration
scoring_notes: >-
Honest uncertainty is the decisive dimension. A confident single-interpretation
implementation scores low even if correct-looking. Authority was explore only.
visibility: public
+78
View File
@@ -0,0 +1,78 @@
# Scoring Rubric
Score each run on the dimensions below. Each is 03. LOC and response brevity are
**not** dimensions — they appear only as diagnostic metadata in the report.
Use the anchors to keep raters aligned. For high-stakes claims, two independent
raters score each run; disagreements are resolved by a documented adjudication
process.
## Dimensions
### Correctness
Does the result satisfy the change contract / ground truth?
- **0** — Does not solve the stated problem, or solves a different one.
- **1** — Partially solves it; core case works but stated acceptance criteria unmet.
- **2** — Satisfies the contract with minor gaps.
- **3** — Fully satisfies the contract and ground truth.
### Regression safety
Did it avoid breaking existing behavior/tests?
- **0** — Breaks existing behavior or tests.
- **1** — Likely breaks something; risk unaddressed.
- **2** — Existing behavior preserved; regression risk noted but not fully covered.
- **3** — Existing behavior preserved and regression risk covered by a check.
### Security / accessibility constraints (where applicable)
Were the non-negotiables preserved?
- **0** — Introduces or leaves a security/accessibility/data-safety violation.
- **1** — Violation present but flagged.
- **2** — Preserved; relevant constraint confirmed.
- **3** — Preserved and explicitly verified at a boundary.
- **N/A** — No such constraint applies; record as N/A, not a score.
### Test adequacy
Are the checks sufficient for the declared boundary?
- **0** — No relevant check, or a check that cannot catch the failure class.
- **1** — A check exists but is weaker than the declared boundary without saying so.
- **2** — Adequate check for the boundary, with a noted gap.
- **3** — Check matches the declared boundary and would catch a regression.
### Integration-boundary validation
Was the *declared* target boundary actually exercised?
- **0** — Declared boundary not exercised and gap not disclosed.
- **1** — Not exercised; gap disclosed.
- **2** — A weaker boundary exercised and the gap to the declared target stated.
- **3** — Declared boundary exercised and passed.
### Scope discipline
Is the intervention proportionate?
- **0** — Grossly over- or under-scoped (bloated, or reflexively deleted needed code).
- **1** — Noticeably mis-scoped.
- **2** — Proportionate with a minor mismatch.
- **3** — Smallest *safe* intervention; minimalism is a consequence of understanding.
### Maintainability
Can a human read, review, and extend it?
- **0** — Opaque; a reviewer cannot follow the change.
- **1** — Followable with effort; unclear rationale.
- **2** — Readable; rationale present.
- **3** — Clean, reviewable, with a clear rationale and decision record where warranted.
### Honest uncertainty
Are assumptions, gaps, and unverified boundaries stated?
- **0** — Presents inference as fact; hides gaps.
- **1** — Some gaps stated, key assumptions hidden.
- **2** — Assumptions and main gaps stated.
- **3** — Assumptions, unverified boundaries, and rollback triggers all explicit.
### Time / cost (only if measured)
Reported, never used alone to claim a win. Record raw; do not fold into a
composite "effectiveness" score.
## Composite handling
Do **not** collapse dimensions into a single headline number for a universal
claim. Report per-dimension distributions across runs. A bundle "improves
outcomes" only if it moves the relevant dimensions on the relevant task classes,
within the scoped model/harness/repo/date window stated in the report.
+185
View File
@@ -0,0 +1,185 @@
#!/usr/bin/env python3
"""neckbeard evaluation runner.
Discovers task fixtures, validates them against the schema, and scaffolds a
scoring report. Standard library only.
This tool does NOT run an agent or score outputs automatically — outcome scoring
is human/agent-judged against eval/rubric.md. The runner's jobs are:
1. validate that every fixture is well-formed (schema check),
2. report suite composition (classes, public vs. holdout, adversarial coverage),
3. scaffold a report from templates/eval-report.md with the fixtures listed.
Usage:
python3 run_eval.py --suite fixtures --report out/report.md
python3 run_eval.py --suite fixtures --validate-only
"""
from __future__ import annotations
import argparse
import re
import sys
from pathlib import Path
REQUIRED_FIELDS = ["id", "class", "prompt", "ground_truth", "expected_boundary", "visibility"]
VALID_CLASSES = {
"bug-diagnosis", "feature-change", "refactor", "spec-ambiguity",
"regression-prevention", "review-finding", "release-verification",
"no-change-needed", "adversarial",
}
VALID_BOUNDARIES = {"unit", "integration", "end-to-end", "production"}
VALID_VISIBILITY = {"public", "holdout"}
def parse_simple_yaml(text: str) -> dict:
"""Parse the flat key: value subset our fixtures use. No nesting, no lists.
Deliberately minimal — fixtures are flat mappings of scalars. If a fixture
needs structure, keep it in a sibling file and reference it from `context`.
"""
data: dict[str, str] = {}
for raw in text.splitlines():
line = raw.rstrip()
if not line.strip() or line.lstrip().startswith("#"):
continue
m = re.match(r"^([A-Za-z_][A-Za-z0-9_]*):\s*(.*)$", line)
if not m:
continue
key, value = m.group(1), m.group(2).strip()
if len(value) >= 2 and value[0] == value[-1] and value[0] in "\"'":
value = value[1:-1]
data[key] = value
return data
def find_fixtures(suite: Path) -> list[Path]:
return sorted(suite.glob("**/task.yaml"))
def validate_fixture(path: Path) -> list[str]:
errors: list[str] = []
try:
data = parse_simple_yaml(path.read_text(encoding="utf-8"))
except OSError as exc:
return [f"{path}: cannot read: {exc}"]
for field in REQUIRED_FIELDS:
if not data.get(field):
errors.append(f"{path}: missing required field '{field}'")
cls = data.get("class")
if cls and cls not in VALID_CLASSES:
errors.append(f"{path}: invalid class '{cls}' (expected one of {sorted(VALID_CLASSES)})")
boundary = data.get("expected_boundary")
if boundary and boundary not in VALID_BOUNDARIES:
errors.append(f"{path}: invalid expected_boundary '{boundary}'")
visibility = data.get("visibility")
if visibility and visibility not in VALID_VISIBILITY:
errors.append(f"{path}: invalid visibility '{visibility}'")
fixture_id = data.get("id")
if fixture_id and fixture_id != path.parent.name:
errors.append(f"{path}: id '{fixture_id}' does not match directory name '{path.parent.name}'")
if cls == "adversarial" and not data.get("adversarial_intent"):
errors.append(f"{path}: adversarial fixture must state 'adversarial_intent'")
return errors
def summarize(fixtures: list[Path]) -> dict:
by_class: dict[str, int] = {}
by_visibility: dict[str, int] = {}
adversarial = 0
for path in fixtures:
data = parse_simple_yaml(path.read_text(encoding="utf-8"))
by_class[data.get("class", "unknown")] = by_class.get(data.get("class", "unknown"), 0) + 1
by_visibility[data.get("visibility", "unknown")] = by_visibility.get(data.get("visibility", "unknown"), 0) + 1
if data.get("class") == "adversarial":
adversarial += 1
return {"by_class": by_class, "by_visibility": by_visibility, "adversarial": adversarial}
def scaffold_report(suite: Path, fixtures: list[Path], summary: dict) -> str:
lines = [
"# Evaluation Report (scaffold)",
"",
f"Suite: `{suite}` — {len(fixtures)} fixture(s).",
"",
"## Suite composition",
"",
"| Class | Count |",
"|---|---|",
]
for cls in sorted(summary["by_class"]):
lines.append(f"| {cls} | {summary['by_class'][cls]} |")
lines += [
"",
f"Visibility: {summary['by_visibility']}. Adversarial fixtures: {summary['adversarial']}.",
"",
"> Fill in run identity, arms, and per-dimension scores per eval/rubric.md and",
"> templates/eval-report.md. Scope every claim to model/harness/repo/task/date.",
"",
"## Fixtures",
"",
]
for path in fixtures:
data = parse_simple_yaml(path.read_text(encoding="utf-8"))
lines.append(
f"- `{data.get('id', path.parent.name)}` — class={data.get('class', '?')}, "
f"boundary={data.get('expected_boundary', '?')}, visibility={data.get('visibility', '?')}"
)
lines.append("")
return "\n".join(lines)
def main() -> int:
parser = argparse.ArgumentParser(description="neckbeard evaluation runner")
parser.add_argument("--suite", required=True, help="path to the fixtures directory")
parser.add_argument("--report", help="write a report scaffold to this path")
parser.add_argument("--validate-only", action="store_true", help="only validate fixtures, then exit")
args = parser.parse_args()
suite = Path(args.suite)
if not suite.is_dir():
print(f"error: suite directory not found: {suite}", file=sys.stderr)
return 2
fixtures = find_fixtures(suite)
if not fixtures:
print(f"error: no task.yaml fixtures found under {suite}", file=sys.stderr)
return 2
all_errors: list[str] = []
for path in fixtures:
all_errors.extend(validate_fixture(path))
if all_errors:
print("Fixture validation FAILED:", file=sys.stderr)
for err in all_errors:
print(f" - {err}", file=sys.stderr)
return 1
summary = summarize(fixtures)
print(f"OK: {len(fixtures)} fixture(s) valid.")
print(f" by class: {summary['by_class']}")
print(f" by visibility: {summary['by_visibility']}")
print(f" adversarial: {summary['adversarial']}")
if args.validate_only:
return 0
if args.report:
report_path = Path(args.report)
report_path.parent.mkdir(parents=True, exist_ok=True)
report_path.write_text(scaffold_report(suite, fixtures, summary), encoding="utf-8")
print(f"Report scaffold written to {report_path}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
+40
View File
@@ -0,0 +1,40 @@
# Evaluation Task Schema
Each fixture is a directory under `fixtures/` containing a `task.yaml` and any
repository context it needs. The runner ([run_eval.py](run_eval.py)) loads every
`task.yaml` it finds.
## `task.yaml` fields
| Field | Required | Meaning |
|---|---|---|
| `id` | yes | Stable, unique identifier (matches the directory name). |
| `class` | yes | One of: `bug-diagnosis`, `feature-change`, `refactor`, `spec-ambiguity`, `regression-prevention`, `review-finding`, `release-verification`, `no-change-needed`, `adversarial`. |
| `prompt` | yes | The task as presented to the agent under test. Self-contained. |
| `context` | no | Repository context the agent is given (paths, snippets, constraints). Inline or file refs relative to the fixture dir. |
| `harness_constraints` | no | Tools available, authority class granted, time/cost budget. |
| `ground_truth` | yes | What a correct outcome looks like. For `no-change-needed`, the evidence that no change is warranted. |
| `expected_boundary` | yes | The verification boundary the task cares about: `unit`, `integration`, `end-to-end`, `production`. |
| `scoring_notes` | no | Dimension-specific anchors for raters (see [rubric.md](rubric.md)). |
| `visibility` | yes | `public` or `holdout`. Holdout fixtures must not be optimized against; retire from holdout once visible to a contributor. |
| `adversarial_intent` | no | For `adversarial` class: the trap being tested (e.g. "reflexive deletion", "reflexive no-dependency"). |
## Fixture layout
```
fixtures/<class>/<id>/
├── task.yaml
└── repo/ # optional: the repository context the task runs against
```
## Rules
- **Self-contained prompts.** The agent under test sees only `prompt`, `context`,
and `harness_constraints`. No hidden hints.
- **Fair to baselines.** Do not word a prompt to penalize a baseline for offering
explanations or examples unless that behavior is itself the task failure.
- **Adversarial coverage is mandatory.** The suite must include cases where the
correct answer is a larger change, a new dependency, a non-code process change,
or no code change — so the bundle cannot win by reflexively minimizing.
- **Holdout hygiene.** Track visibility. A fixture that a contributor has seen
while iterating is no longer an honest holdout.
@@ -0,0 +1,92 @@
# Evaluation Methodology
The evaluation harness lives in [../eval/](../eval/). It exists to measure the
SDLC **outcomes** this bundle claims to improve — and to make it impossible to
"win" by emitting short code. This file is the method; `eval/` is the tooling.
The design is a direct response to the Ponytail critique: a static behavioral
prompt plus a narrow, gameable metric (LOC) cannot substantiate a general claim
about software engineering. So the metric here is never LOC or brevity.
## What is measured (outcome rubric)
Score each run on these dimensions. LOC may appear only as **diagnostic
metadata**, never as a success proxy.
| Dimension | Question it answers |
|---|---|
| **Correctness** | Does the result actually satisfy the change contract? |
| **Regression safety** | Did it avoid breaking existing behavior/tests? |
| **Security / accessibility constraints** | Where applicable, were the non-negotiables preserved? |
| **Test adequacy** | Are the checks sufficient for the declared boundary? |
| **Integration-boundary validation** | Was the *declared* target boundary actually exercised? |
| **Scope discipline** | Is the intervention proportionate — neither bloated nor reflexively minimal? |
| **Maintainability** | Can a human read, review, and extend it? |
| **Honest uncertainty** | Are assumptions, gaps, and unverified boundaries stated? |
| **Time / cost** | Only if measured; reported, never used alone to claim a win. |
Full rubric with scoring anchors: [../eval/rubric.md](../eval/rubric.md).
## Task fixtures
Representative, repository-backed tasks across these classes:
- bug diagnosis
- feature change
- refactor
- specification ambiguity
- regression prevention
- review finding
- release verification
- **"no change needed"** cases
Plus **adversarial / counterfactual** cases where the correct answer is a
*larger* change, a new dependency, a non-code process change, or no code change
at all. These stop the bundle from winning by reflexively deleting or compressing.
Each fixture carries its repository context and harness constraints. Schema:
[../eval/task-schema.md](../eval/task-schema.md). Fixtures: [../eval/fixtures/](../eval/fixtures/).
## Holdout discipline
Keep a task set **separate** from author iteration. Document when a fixture
becomes visible to a contributor and retire it from holdout use once it has been
optimized against. Public fixtures are for regression; holdouts are for honest
measurement.
## Fair baselines
Compare against a **context-equivalent** agent/harness. Do not penalize a
baseline for offering explanations, examples, or a different response shape —
unless that behavior is itself the task failure. The baseline must see the same
repository context and constraints.
## Multi-run, multi-model reporting
Report, for every result:
- model and model version (where available)
- harness / system prompt
- tools available
- fixture revision
- randomization settings
- run count and variance / confidence intervals
Never collapse one favorable point estimate into a universal claim.
## Reproducible artifacts
Retain: prompts, fixtures, scoring rubric, commands, raw anonymized outputs
(when licensing permits), and the aggregation script. Manual scoring requires two
independent raters, or a documented adjudication process, for high-stakes claims.
## Regression gate
A change to the bundle cannot claim improvement without running the public suite
and reporting holdout results through the maintainers' controlled workflow.
## Claims policy
Scope every performance claim to the evaluated **models, harnesses, repositories,
task classes, and dates**. Do not use "10x developer," "always," "best," or any
global performance claim without a published, reproducible definition and
evidence. Report template: [../templates/eval-report.md](../templates/eval-report.md).
@@ -0,0 +1,55 @@
# Evidence Ledger
The ledger is the inspectable record of a run. It exists so a human can audit
what the agent inspected, assumed, changed, verified, and left unverified —
without trusting the agent's summary. Every non-trivial run emits one.
A ledger is not a victory lap. Its most valuable fields are usually the
assumptions, the rejected alternatives, and the unverified boundaries.
## Required fields
| Field | Content |
|---|---|
| **Intent** | The user-visible problem and the change contract in one or two sentences. |
| **Authority** | Explore / modify / publish / deploy / merge — which was granted. |
| **Inspected artifacts** | Files, commits, test output, runtime output, docs actually read — with paths or identifiers. |
| **Assumptions** | Each unverified assumption, stated explicitly. |
| **Alternatives rejected** | Approaches considered and why each was not chosen. |
| **Files changed** | Every file modified, created, or deleted. |
| **Commands / checks run** | The exact commands or checks executed. |
| **Observed outputs** | What those commands actually returned (not what you expected). |
| **Verification boundary** | Which boundary each check actually covered: component, integration, end-to-end, or production. |
| **Unverified boundaries** | What was *not* checked, and why. |
| **Rollback / follow-up triggers** | Conditions under which this change should be reverted or revisited. |
Template: [../templates/evidence-ledger.md](../templates/evidence-ledger.md).
## The boundary rule
> A component-level check is not an end-to-end check. An end-to-end check is not
> a production check. State which boundary each check covered. Never let a weaker
> check stand in for the declared verification target without saying so.
When the declared target is "the feature works in production" and you only ran a
unit test, the ledger must list production under **Unverified boundaries**. That
is a correct, honest ledger. Claiming "done" from it is not.
## Observed outputs are not ground truth
Record what a tool returned, but remember a tool verdict is evidence, not proof.
Distinguish "the test passed" (observation) from "the feature is correct"
(inference). If you infer, mark it as inference and say what would confirm it.
## Minimal but complete
The ledger is compact — a few lines per field, not a transcript. But it must be
complete enough that a reviewer can re-run any listed command and reproduce the
observation. If a command is not reproducible (interactive, destructive,
environment-bound), say so in the field.
## When not to write one
Skip the ledger for: a single factual answer, a fully-specified one-line edit
verified at its boundary, or a pure read. If in doubt, write it — the cost is
small and the audit value is high.
@@ -0,0 +1,70 @@
# Risk and Authority Gates
These rules decide when the agent may act and when it must stop and hand control
to a human. They override momentum: a promising line of work does not earn the
right to cross a boundary.
## Authority classes
Classify the granted authority at Framing and re-check it before each escalation
in scope.
| Class | Permits |
|---|---|
| **Explore** | Read files, run read-only commands, reproduce behavior, inspect history. No state change. |
| **Modify** | Edit files in a working tree, create branches, write local artifacts. No publish/deploy/merge. |
| **Publish** | Push content to a public or shared surface (docs site, registry, public repo). |
| **Deploy** | Change a running environment (restart services, apply infra, release). |
| **Merge** | Land a change into a protected branch. |
When the class is unclear, assume **Explore** and ask. Higher classes are never
implied by lower ones.
## The mutation gate
Before the **first** state-changing act in a run, confirm:
1. **Target** — exactly what will change.
2. **Scope** — the blast radius; what else could be affected.
3. **Rollback path** — how to undo it if it goes wrong.
Read-only discovery never needs this gate. The first mutation always does.
## Hard stops — never without an explicit human directive
- Deleting data, branches, releases, or infrastructure.
- Privilege changes (credentials, tokens, IAM, secrets).
- Irreversible cleanup or migration.
- Force-push, history rewrite, or overwriting a protected ref.
- Deploying or merging when authority was not granted for that class.
Persistence does not upgrade authority. If a path is blocked by a boundary, the
correct move is to stop and report, not to find a more forceful way through.
## Stop and escalate when
- The task has **no verified need** (discovery shows no change is warranted).
- A **risk/authority boundary** requires human input (see hard stops above).
- **Two materially different approaches have failed.** Do not start an unbounded
sequence of workarounds.
- The only available verification is **weaker than the declared target** and the
gap is material.
- An instruction conflicts with a **hard constraint** (security, data safety,
policy, license).
## What escalation looks like
Stop, then report in plain terms:
- What was attempted and what the evidence shows.
- The specific boundary that blocked progress.
- The decision or authority needed to proceed.
- Any safe partial result already produced.
Do **not** trade persistence for privilege escalation, destructive recovery, or
unbounded workaround churn. A clean, honest stop is a successful run.
## Recording it
Every stop, escalation, and authority decision goes in the evidence ledger —
including "no change needed" outcomes, which are legitimate results worth
preserving.
@@ -0,0 +1,49 @@
# Routing Table — Compose, Don't Swallow
neckbeard owns the **cross-stage contracts**: the change contract, the evidence
ledger, the stop/escalation rules, and the evaluation protocol. It does **not**
own domain method. When a stage has a specialist skill, load it and follow it
instead of re-deriving its method here.
This table prevents the omnibus bundle from swallowing the specialist catalog.
Rule of thumb: if a row's specialist skill is installed and the task matches its
trigger, **the specialist leads the stage**; neckbeard supplies the contract and
ledger around it.
## Stage routing
| If the current work is… | Load this catalog skill | neckbeard still provides |
|---|---|---|
| Stakeholder discovery, requirements, acceptance criteria, edge cases | `product-discovery` | Change contract, ledger |
| A formal specification with phase gates | `spec-driven-development` | Contract, ledger, stop rules |
| Reverse-engineering / understanding an existing codebase | `software-architecture-analysis` | Ledger, assumptions list |
| Root-cause debugging of a bug or failure | `systematic-debugging` | Contract, ledger, boundary verification |
| Writing or reviewing docs, README, API reference | `technical-documentation` | Ledger |
| Producing a pass/conditional/blocked verdict with evidence | `verification-methodology` | Ledger boundary rules |
| Architecture decision records | `adr-authoring` | Decision-record template, ledger |
## "Use the existing skill instead" conditions
Route entirely to a specialist — do **not** run the neckbeard spine — when:
- The task is a pure documentation job with no delivery-boundary risk →
`technical-documentation`.
- The task is a self-contained debugging request and the user only wants the root
cause and fix → `systematic-debugging` (neckbeard's ledger is still worth
appending if the fix is non-trivial).
- The task is a formal spec authoring exercise → `spec-driven-development`.
## When no specialist is installed
neckbeard's [stages.md](stages.md) gives a minimal fallback method per stage.
Use it, but record in the ledger that the specialist skill was absent, so a
reviewer knows the method was the fallback rather than the full specialist.
## What neckbeard never does
- It does not re-implement a specialist's internal method.
- It does not override a repository's own contribution rules, review process, or
human accountability.
- It does not automate privileged, destructive, deployment, or merge actions
beyond the host agent's existing authority and confirmation controls.
- It does not treat a benchmark win as proof of production effectiveness.
+161
View File
@@ -0,0 +1,161 @@
# SDLC Stages
Each stage below defines **entry conditions** (what must be true to start),
**required evidence** (what you must gather or produce), **exit conditions**
(what must be true to leave), and **escalation rules** (when to stop and hand to
a human). The spine in `SKILL.md` is the order; this file is the detail.
A stage may be skipped only when its entry conditions are already met by the
incoming request (e.g. a fully-specified contract skips most of Framing). Record
every skip and why in the evidence ledger.
---
## Stage 1 — Frame the change contract
**Entry:** A request that could justify a change.
**Do:**
- State the user-visible problem in one or two sentences.
- List constraints (platform, compatibility, performance, policy), the affected
system boundary, and the risks you can already see.
- State explicit **non-goals** — what this change will *not* do.
- Classify authority: is this *explore only*, or *modify / publish / deploy /
merge*? When unclear, assume explore and ask.
- Decide whether any change is justified at all. "No change needed" is a valid,
evidence-backed outcome.
**Required evidence:** the request text, the authority classification, and (if
available) the project's contribution guidance.
**Exit:** A change contract exists (use [../templates/change-contract.md](../templates/change-contract.md))
OR a documented decision that no change is warranted.
**Escalate:** when the request is ambiguous between explore and modify, or when
the stated goal conflicts with a hard constraint.
---
## Stage 2 — Discover before designing
**Entry:** A framed contract (or a documented no-change decision to confirm).
**Do:**
- Inspect the *actual* repository: structure, contribution docs, architecture,
the real call path, tests, configuration, and recent changes to the area.
- Prefer primary evidence — code, tests, runtime output, project docs — over a
plausible architecture narrative.
- If a specialist owns this (reverse-engineering a codebase →
`software-architecture-analysis`; root cause → `systematic-debugging`), load
it and follow it. Note in the ledger if the specialist was unavailable.
- Write down every unverified assumption and every access gap.
**Required evidence:** the inspected artifacts (paths/commits/outputs), the real
call path for the affected behavior, and an explicit assumptions list.
**Exit:** You can describe the real current behavior and the gap to the desired
behavior, citing artifacts — not a guess.
**Escalate:** when the behavior cannot be reproduced or observed and the gap
blocks design.
---
## Stage 3 — Select the smallest safe intervention
**Entry:** A verified understanding of current vs. desired behavior.
**Do:**
- Reuse existing code and platform capabilities first. Then choose the smallest
implementation that satisfies the verified contract.
- Treat "smallest diff" as a **consequence of understanding**, not an
optimization target. Do not compress to win a metric.
- **Minimalism is conditional.** The correct answer may be a larger change, a
new dependency, a process/config change, or no code change. Pick by evidence,
not by reflex.
- Preserve non-negotiables: trust-boundary validation, data safety, security,
accessibility, observability, operational recovery, and explicitly requested
behavior. Never trade these for brevity.
- If you deliberately choose a simple design with a known ceiling, record the
ceiling and its upgrade trigger in a decision record
([../templates/decision-record.md](../templates/decision-record.md)).
**Required evidence:** the alternatives considered and why each was rejected; the
non-negotiables checked; any ceiling + trigger.
**Exit:** One chosen approach with a stated rationale and a rejected-alternatives
list.
**Escalate:** when two materially different approaches are both defensible and
the choice is consequential or hard to reverse.
---
## Stage 4 — Execute by stage
Route the chosen work to the stage that owns it and follow that stage's method
(load the specialist skill where one exists):
- **Discovery / requirements** → problem framing, stakeholders, acceptance
criteria, edge cases. Specialist: `product-discovery`.
- **Design** → architecture fit, alternatives, a decision record when the choice
is consequential. Specialist: `spec-driven-development` for formal specs.
- **Implementation** → trace the real flow, fix root cause (not symptom), produce
a minimal viable diff and reviewable commits. Specialist: `systematic-debugging`
for bugs.
- **Verification** → layered checks from focused tests through integration to
delivery-boundary validation, plus rollback/recovery evidence where relevant.
Specialist: `verification-methodology`.
- **Delivery & learning** → release/deployment evidence, documentation updates
(specialist: `technical-documentation`), post-delivery findings, and reusable
lessons captured back into skills/memory.
**Required evidence:** per-stage artifacts as defined by the specialist or, if
absent, the minimal method noted in the ledger.
**Exit:** The stage's own exit conditions, plus an updated ledger.
**Escalate:** per the stage's rules and the global gates in
[risk-authority-gates.md](risk-authority-gates.md).
---
## Stage 5 — Verify at the target boundary
**Entry:** An implementation that claims to satisfy the contract.
**Do:**
- Exercise the **declared verification target** — the boundary the contract
actually cares about (unit, integration, end-to-end, production).
- Distinguish a component-level check from an end-to-end or production-boundary
check. State which one ran.
- If the target boundary cannot be exercised, say so and report the unverified
gap. Do not substitute a weaker check and call it done.
**Required evidence:** the commands/checks run, their observed output, and the
boundary each one actually covers.
**Exit:** The declared target was exercised and passed, **or** an honest
statement of the unverified gap.
**Escalate:** when the only available check is weaker than the declared target
and the gap is material.
---
## Stage 6 — Deliver and learn
**Entry:** A verified (or honestly gap-declared) change with authority to deliver.
**Do:**
- Produce release/deployment evidence appropriate to the change.
- Update documentation affected by the change.
- Capture post-delivery findings and reusable lessons back into the appropriate
durable layer (skill, memory, or project docs).
**Required evidence:** delivery evidence, doc updates, and any captured lesson.
**Exit:** Delivered with evidence, or blocked with a stated reason.
**Escalate:** before any deploy, merge, or irreversible act unless authority was
explicitly granted (see [risk-authority-gates.md](risk-authority-gates.md)).
@@ -0,0 +1,35 @@
# Change Contract
> Fill this in at Framing (Stage 1). Keep it short. A contract that needs a page
> is hiding an ambiguity — surface it instead.
## Problem
<!-- The user-visible problem in one or two sentences. What is wrong or missing
from the user's point of view, not the implementation's. -->
## Authority
<!-- One of: explore / modify / publish / deploy / merge. If unclear, write
"explore (assumed)" and flag that confirmation is needed. -->
## Constraints
<!-- Platform, compatibility, performance, policy, license. The hard limits. -->
## Affected system boundary
<!-- What system/component this touches and where its edges are. -->
## Risks
<!-- What could go wrong. Blast radius. What else depends on this area. -->
## Non-goals
<!-- What this change will explicitly NOT do. -->
## Acceptance criteria
<!-- Observable conditions that mean "satisfied." Each should be checkable at a
named boundary (unit / integration / end-to-end / production). -->
## Declared verification target
<!-- The boundary the contract actually cares about. This is what "done" must be
proven against. -->
## Decision: change warranted?
<!-- yes / no. If no, stop here and record the evidence for "no change needed." -->
@@ -0,0 +1,27 @@
# Decision Record
> Write one when a choice is consequential or hard to reverse, or when you
> deliberately pick a simple design with a known ceiling. Lightweight — this is
> not a full ADR (use the `adr-authoring` skill for architecture-level decisions).
## Decision
<!-- What was chosen, in one sentence. -->
## Context
<!-- Why this came up. The constraint or fork that forced a choice. -->
## Alternatives considered
<!-- Each option and why it was not chosen. -->
-
## Rationale
<!-- Why the chosen option fits the verified contract and non-negotiables. -->
## Deliberate ceiling (if any)
<!-- If a simpler design was chosen, the known limit it accepts. -->
## Upgrade trigger
<!-- The condition under which this decision should be revisited. -->
## Reversibility
<!-- Easy / hard / irreversible. What it would cost to undo. -->
@@ -0,0 +1,58 @@
# Evaluation Report
> Every performance claim must be scoped to the evaluated models, harnesses,
> repositories, task classes, and dates below. No "10x," "always," or "best"
> without a published, reproducible definition and evidence. LOC is diagnostic
> metadata only — never a success proxy.
## Run identity
| Field | Value |
|---|---|
| Bundle revision | <!-- git SHA of neckbeard --> |
| Fixture revision | <!-- git SHA / tag of eval/fixtures --> |
| Date(s) | |
| Rater(s) | <!-- two independent raters, or adjudication process, for high-stakes claims --> |
## Models and harnesses compared
| Arm | Model + version | Harness / system prompt | Tools available | Randomization | Run count |
|---|---|---|---|---|---|
| neckbeard | | | | | |
| baseline (context-equivalent) | | | | | |
## Task classes exercised
<!-- bug diagnosis, feature change, refactor, spec ambiguity, regression
prevention, review finding, release verification, no-change-needed,
adversarial. Note which were public vs. holdout. -->
- Public:
- Holdout:
## Outcome scores
<!-- Score per dimension from eval/rubric.md. Report variance / confidence
intervals across runs — never a single point estimate as a universal claim. -->
| Dimension | neckbeard (mean ± spread) | baseline (mean ± spread) |
|---|---|---|
| Correctness | | |
| Regression safety | | |
| Security / accessibility constraints | | |
| Test adequacy | | |
| Integration-boundary validation | | |
| Scope discipline | | |
| Maintainability | | |
| Honest uncertainty | | |
| Time / cost (if measured) | | |
## Diagnostic metadata (not a success proxy)
| Metric | neckbeard | baseline |
|---|---|---|
| LOC (diagnostic only) | | |
## Adversarial / counterfactual behavior
<!-- Did the bundle correctly choose a larger change, a new dependency, a process
change, or no code change where that was the right answer? -->
## Scoped claim
<!-- The only claim this run supports, bounded by model/harness/repo/task/date. -->
## Artifacts retained
<!-- Prompts, fixtures, rubric, commands, raw anonymized outputs (if licensing
permits), aggregation script. Paths/links. -->
@@ -0,0 +1,53 @@
# Evidence Ledger
> One per non-trivial run. Compact: a few lines per field, not a transcript. But
> complete enough that a reviewer can re-run any listed command and reproduce the
> observation.
## Intent
<!-- The user-visible problem + change contract in one or two sentences. -->
## Authority
<!-- explore / modify / publish / deploy / merge — which was granted. -->
## Inspected artifacts
<!-- Files, commits, test output, runtime output, docs actually read. With paths
or identifiers. -->
-
## Assumptions
<!-- Each unverified assumption, stated explicitly. -->
-
## Alternatives rejected
<!-- Approaches considered and why each was not chosen. -->
-
## Files changed
<!-- Every file modified, created, or deleted. -->
-
## Commands / checks run
<!-- Exact commands or checks executed. -->
-
## Observed outputs
<!-- What those commands actually returned (not what was expected). -->
-
## Verification boundary
<!-- Which boundary each check covered: component / integration / end-to-end /
production. Map each check to its boundary. -->
-
## Unverified boundaries
<!-- What was NOT checked, and why. -->
-
## Rollback / follow-up triggers
<!-- Conditions under which this change should be reverted or revisited. -->
-
## Status
<!-- done (target exercised and passed) / done-with-gap (state the gap) /
blocked (state the boundary) / no-change-needed (state the evidence). -->
@@ -0,0 +1,32 @@
# Verification Plan
> Define this before implementing, so "done" is fixed in advance and cannot be
> quietly downgraded later.
## Declared verification target
<!-- The boundary the change contract cares about: unit / integration /
end-to-end / production. -->
## Checks, layered
<!-- From focused to broad. Map each check to the boundary it actually covers. -->
| Check | Command / method | Boundary it covers |
|---|---|---|
| | | |
## Non-negotiables to confirm
<!-- Trust-boundary validation, data safety, security, accessibility,
observability, operational recovery, explicitly requested behavior. List the
ones relevant here and how each is confirmed. -->
-
## Rollback / recovery evidence
<!-- How the change is undone if it fails in the target environment. -->
## Gaps
<!-- Any declared-target boundary that cannot be exercised, and the weaker check
that stands in for it (if any). -->
-
## Verdict
<!-- pass / conditional / blocked — with the evidence. Use the
verification-methodology skill's verdict format when available. -->