Single-commit clean baseline after security scrub of niche-tells, project codenames, internal jargon, and contributor-email leaks. Contents: - 100 Rust crates (_primitives/_rust/) - 37 agent manifests (_manifests/) + generated specs (_generated/) - 67 user-invocable skills (skills/) - 33 hooks (hooks/) - Composition blocks (_blocks/) - Documentation (docs/, README.md) - TS adapter packages (_ts_packages/) - Assembler (_assembler/) - Roles (_roles/) - Templates (_templates/) - Forgejo CI (.forgejo/) Author: Denis Parfionovich <info@greendragon.info> License: see LICENSE.
4 KiB
4 KiB
Phase 1 — Intake (language, coverage, critical paths, CI)
One free-text paragraph + one AskUserQuestion multi-part batch.
1a — Ask for the testing-gap description
Emit a regular message (NOT AskUserQuestion):
Describe in one paragraph: what are you testing (project name / stack), what gap is
/test-gennot solving (fuzz? load? E2E? mutation? all?), and what failure mode would be worst (prod crash? data loss? latency regression? auth bypass?). Reply in one message.
Store verbatim as INTAKE.
If INTAKE mentions ONLY "unit tests" / "missing tests for function X"
(unit-level gap, not matrix gap), emit:
DETECTION: this is a /test-gen task, not /test-matrix.
Handing off to `skills/test-gen/SKILL.md`. Re-run /test-matrix later
when fuzz / property / load / E2E / mutation coverage is needed.
…and STOP. Do not proceed.
1b — Multi-part intake click (one AskUserQuestion call)
{
"questions": [
{
"question": "Language(s) in scope?",
"header": "Languages",
"multiSelect": true,
"options": [
{"label": "Rust", "description": "cargo-fuzz, proptest, cargo-mutants, oha"},
{"label": "Python", "description": "hypothesis, atheris, mutmut, schemathesis"},
{"label": "JavaScript/TypeScript", "description": "fast-check, StrykerJS, Playwright"},
{"label": "Go", "description": "built-in fuzz (go test -fuzz), gopter, vegeta"},
{"label": "Swift", "description": "SwiftCheck, XCUITest — limited fuzz tooling"},
{"label": "Flutter/Dart", "description": "glados property, flutter integration_test"}
]
},
{
"question": "Baseline unit-test coverage?",
"header": "Coverage",
"multiSelect": false,
"options": [
{"label": "High (≥ 80%)", "description": "Matrix tests layer on top of solid unit base"},
{"label": "Medium (40-80%)", "description": "Run /test-gen in parallel, don't skip unit gaps"},
{"label": "Low (< 40%)", "description": "Strongly recommend /test-gen FIRST — fuzz+load on buggy code wastes CI"},
{"label": "Unknown — need to measure", "description": "Phase 3 will add a coverage job before scaffolding"}
]
},
{
"question": "Critical paths (multi-select)?",
"header": "Critical",
"multiSelect": true,
"options": [
{"label": "Auth / session / crypto", "description": "Fuzz + property mandatory on token parsers + signature verify"},
{"label": "Payment / money-in-motion", "description": "E2E + property (invariants: no negative balance, idempotency) mandatory"},
{"label": "Data integrity (DB / serialization)", "description": "Property-based round-trips + migration E2E"},
{"label": "Performance-sensitive (< 100ms SLO)", "description": "Load tests with k6/oha mandatory; set SLO thresholds in CI"},
{"label": "Untrusted-input parsing", "description": "Fuzz mandatory (cargo-fuzz / atheris / jsfuzz)"},
{"label": "User-facing UI flows", "description": "E2E with Playwright on 5-15 critical journeys"}
]
},
{
"question": "CI target?",
"header": "CI",
"multiSelect": false,
"options": [
{"label": "GitHub Actions", "description": "workflow file under .github/workflows/"},
{"label": "Forgejo Actions", "description": "workflow file under .forgejo/workflows/ (kit default — compatible)"},
{"label": "Self-hosted / custom", "description": "Emit portable YAML + shell scripts; wire manually"},
{"label": "None — local only", "description": "Generate Makefile / justfile targets, no CI"}
]
}
]
}
Store as LANGS, COVERAGE, CRITICAL, CI.
Verify-criterion
INTAKEis non-empty.LANGShas ≥ 1 entry.CRITICALhas ≥ 1 entry (zero-critical-path tasks are unit-test-only — redirect to /test-gen).CIis exactly one value.- On failure, re-ask the failing input only. Never fall through.