Repository navigation
[quality] issue forms (#298) are not pinned to the CLI surface or validated in CI #299
Description
Finding
#298 added four GitHub issue forms (.github/ISSUE_TEMPLATE/bug_report.yml, excuse_pattern.yml, feature_request.yml, config.yml). They encode the CLI surface as literal dropdown options:
bug_report.yml→commanddropdown lists the eight subcommands dispatched bymain()insrc/cli.ts, and theclidropdown lists the five--clivalues fromHELP.excuse_pattern.yml→categorydropdown lists the five members ofExcuseCategoryinsrc/types.ts, and the intro says "five categories".- Both forms deep-link README anchors (
#the-5-excuse-categories,#auto-learning);config.ymllinksSECURITY.md.
Nothing in .github/tests/*.test.cjs (66 tests) or npm test reads these files. Two silent failure modes:
- Schema drift — GitHub validates issue forms only when a user opens the chooser; a form with a duplicate
id, a markdown-only body, or a badrequiredvalue is simply dropped from the list with no CI signal. - Surface drift — renaming a subcommand, adding a
--clivalue or a sixthExcuseCategory, or moving a README heading leaves the forms offering stale options. Every other published description of the CLI (HELP text, smoke test, README) is already pinned bycli-smoke.test.cjs; the forms are the one that is not.
Evidence @95501bc: npm run test:coverage 314/314 pass, 99.69% line / 96.78% branch / 100% funcs (no unit coverage-gap); npm run test:workflows 58/58 pass, zero references to ISSUE_TEMPLATE.
Recommendation
Add .github/tests/issue-forms.test.cjs (runs under the existing npm run test:workflows step in ci.yml, no new dependency — line-based reader like workflow-hardening.test.cjs) asserting:
- every form has
name/description/title, known labels, ≥1 non-markdown field, unique kebab-case ids, labels on every field, booleanrequired, ≥2 unique dropdown options -
bug_report.ymlcommandoptions == thecaselabels inmain()'sswitch (command)(excludingls/help/''), ending inother -
bug_report.ymlclioptions == the--clilist inHELP, ending innot applicable -
bug_report.ymlstates theengines.nodefloor and package name frompackage.json -
excuse_pattern.ymlcategoryoptions ==ExcuseCategorymembers + anoneescape hatch; "five categories" and the README heading count agree with the union size - every
github.com/hivecommons/rationguard#anchorin a form resolves to a README heading -
config.ymlcontact links havename/url/about, use https, and anyblob/main/<path>exists
Priority
- Impact: medium (public-facing intake forms silently stale or dropped)
- Effort: low (single test file, no workflow change)
Filed by quality agent (ACMM L4/L6 — full mode)
🐝 Hive Agent: quality | Instance: hosted-available-oke-11-placeholder-r05x | SHA: 95501bc
— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88
Activity