This is the record of an abcd-managed repository

abcdBetav0.16.2 · 2026-11-06

Development record

abcd Routes The Invisible Risks An Amateur Cannot See To A Real, Fail-Closed Gate That Wraps A Trusted Scanner

intentdraftsmajoritd-62

Press Release

abcd gains a pluggable validation-gate framework: a new kind of discipline that wraps an unmodified external scanner, fails closed, and emits the same four-verdict result as the fidelity reviewer — shipped with security/dependency/secret scanning as its first instance, validating the downstream app the product thinker builds, not abcd's own pipeline. The amateur-coder thesis says the risks a non-expert cannot see — most acutely security — must be routed to a gate whose own reliability is validated. abcd has built the intent→verdict spine but left this safety pillar as an extension point. This intent fills it without violating abcd's core rule: it does not fork or reimplement a scanner, it configures and wraps a trusted one. The wrapping machinery is generic; a11y, privacy, and architecture become later instances of the same pluggable pattern. It runs as a standalone CLI across CI, pre-commit, and runtime hooks — no Claude Code dependency — so it works on a local machine.

"I can judge whether the app does what I asked. I cannot judge whether it just shipped an XSS hole or a leaking dependency — that's exactly the part I'm blind to," said Iris, a product thinker building a real app on abcd. "I don't want abcd to describe a safety gate. I want it to actually run a scanner on what I built and refuse to call it safe when it can't tell. And I want that to keep working when I'm not in Claude Code."

Why This Matters

The amateur-coder thesis is explicit: keep the human's sense of "good" as the limiting constraint, and route what lies beyond it — security above all — to automated gates whose reliability is itself validated. An external assessment (2026-06-26) found this is abcd's single largest gap against its own thesis: the process-protecting gates (gitleaks, PII, push-block) are real and fail-closed, but they protect abcd's own dev process. The "invisible risks" of the downstream app the amateur builds — security, dependency, secret exposure, later a11y/privacy/architecture — are documented as a pattern, not delivered as a gate. The empirical case is stark: a large fraction of AI-generated code ships at least one OWASP vulnerability. A framework targeting amateurs that does not route this to a gate is, by its own logic, incomplete.

Two abcd governing rules shape how this gets built. First, abcd never touches its dependencies — it wraps and configures unmodified trusted tools, it does not fork, patch, or reimplement them. A safety gate must wrap an existing scanner, not become one. Second, abcd must eventually run locally, independent of Claude Code. The gate is therefore a standalone CLI exposed across the three tiers abcd already uses (CI, pre-commit, runtime hooks), reusing the fidelity reviewer's fail-closed, four-verdict posture so it composes with the machinery already trusted rather than inventing a parallel one. Building it as a pluggable framework (security first) rather than a one-off scanner means the remaining invisible risks plug into the same validated mechanism.

What's In Scope

  • A pluggable validation-gate framework: a new kind of discipline — framework-provided "validation disciplines" that wrap an external tool and fail closed — distinct from the existing app-authored disciplines. (Introducing this distinction is a brief change; per [[itd-60-doc-fidelity-anti-drift]] / [[itd-61-brief-change-derivation]] that brief change is itself governed by the doc-fidelity loop.)
  • A first instance: security / dependency / secret scanning, wrapping an unmodified, trusted external scanner (never forked, never reimplemented), targeting the downstream app the product thinker builds.
  • Standalone CLI as the primary entrypoint, invocable from CI, pre-commit, and runtime hooks — the same three-tier model abcd uses elsewhere — with no Claude Code dependency, so the gate runs on a local machine.
  • Fail-closed, four-verdict wiring: the gate emits MET / MET_WITH_CONCERNS / NOT_MET / INCONCLUSIVE per check, refuses (never passes silently) when the scanner is unavailable or a trustworthy scan cannot complete, and feeds the existing receipt/roll-up shape — mirroring the native ship gate and the fidelity reviewer.
  • Per-project configuration of which validation disciplines apply, consistent with abcd's "downstream apps configure" model.
  • The first capability seam a repository fills for its own product (proposed 2026-11-01, to confirm at planning): the external checker is declared in data and pinned by checksum and signer, the way abcd pins the tools it downloads (adr-2610241057124151), and build, drain, lint and launch ship honour its verdict unchanged, so a project extends abcd's gates without forking abcd. The person admits a project's checker once before it runs on their machine (the product thinker's ruling of 2026-11-01): the yes is kept in their home, bound to the repository's root commit, the checker's checksum and signer, and the exact invocation and configuration the project declares, asked again when any of them changes, and refused from an agent as a person-act, since a program a repository names runs as the person and a repository cannot grant that capability itself. abcd never runs a foreign executable under its own name; the next seams of the same shape (oracle, history, runner host) follow only when a consumer needs them (adr-22).

What's Out of Scope

  • a11y / privacy / architecture gates themselves. They are explicitly the later instances that motivate the pluggable design, but this intent ships only the framework + the security/dep/secret instance.
  • Forking, patching, or reimplementing any scanner. Hard constraint. The gate wraps an unmodified upstream tool and configures it; if a wrap needs upstream behavior it lacks, that is a wrap/config problem, not a fork.
  • A Claude-Code-only delivery. A CC skill frontend may exist as convenience later, but the local standalone CLI is the in-scope primary; shipping CC-only would violate the local-first requirement.
  • Re-hardening abcd's own pipeline. abcd's process-protecting gates already exist; this intent targets the downstream app, not abcd's CI.
  • Sequencing relative to itd-60/61 — /abcd:intent plan's job, though note the brief-change dependency below.

Acceptance Criteria

Given-When-Then per the itd-1 discipline.

  • Given a downstream app built with abcd, when the security validation gate runs, then it executes a wrapped, unmodified trusted scanner against the app and emits a per-check four-verdict result (MET / MET_WITH_CONCERNS / NOT_MET / INCONCLUSIVE).
  • Given the configured scanner is unavailable or a trustworthy scan cannot complete, when the gate runs, then it refuses (fails closed) and never reports a silent pass.
  • Given abcd's "never touch deps" rule, when the gate is implemented, then it wraps and configures the scanner without forking, patching, or reimplementing it.
  • Given abcd's local-first requirement, when the gate is invoked outside Claude Code (CI / pre-commit / runtime hook via the standalone CLI), then it runs to a verdict with no Claude Code dependency.
  • Given the pluggable framework, when a second risk type (e.g. a11y or privacy) is later added, then it plugs in as another validation discipline of the same kind without re-architecting the gate.

SOTA

Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the security-isolation SOTA note.

  • The motivating figure is real, vendor-run and task-skewed: Veracode's 2025 report found OWASP Top 10 flaws in 45% of test cases (80 curated tasks run across more than 100 models), scored by the vendor's own analyser; Java over 70%, XSS 86%, log injection 88% (Veracode press release).
  • Secret scanners are high-recall, low-precision, measured: Gitleaks precision 46%, recall 88%; TruffleHog recall 52%; GitHub's scanner precision 75%; false positives from "generic regular expressions and ineffective entropy calculation" (Basak et al., ESEM 2023, arXiv 2307.00714).
  • Gitleaks: MIT, git/dir/stdin modes, SARIF output, exit 0/1, and "Gitleaks is feature complete. I'm not merging new features", security patches only, the maintainer "shifting my focus to Betterleaks" (same maintainers, MIT; its SARIF support not confirmed in this pass), so the swappable seam is load-bearing from day one and the first-scanner choice is revisited at plan time (gitleaks README).
  • TruffleHog: AGPL-3, and "it can also log in to confirm if that secret is live", calling the provider with the found credential; outside a local-first default (trufflehog README).
  • OSV-Scanner for dependencies: Go, Apache-2.0, "19+ lockfile types", container images, and an offline mode after one database download (osv-scanner README).
  • SARIF 2.1.0 (OASIS Standard) is the one interchange shape with result, fingerprints and suppression objects; the candidate scanners all emit it (SARIF 2.1.0).
  • Gates get ignored for presentation as much as precision: twenty developers named "false positives and the way in which the warnings are presented" as the barriers (Johnson et al., ICSE 2013).
  • The local seam exists: adapter/scanner fails closed and treats external scanners as "config-selected plug-ins behind the same seam" (internal/README.md).

Path 1: adopt gitleaks and OSV-Scanner as the first wrapped scanners, executed on PATH and never imported, with SARIF 2.1.0 the only shape the gate parses; a scanner missing or unparsable is INCONCLUSIVE. No Go dependency. The confirm-and-record flow of itd-2610071545369520 is what keeps a 46%-precision gate from being ignored. The independent fit-challenge runs at plan time.

Open Questions

  • Which scanner(s) to wrap first for the security/dep/secret instance, and how to keep the choice swappable (the wrap must not bind abcd to one vendor)?
  • Does a framework-provided validation discipline become a baseline every abcd project inherits (opt-out) or a configured opt-in? The brief currently says downstream apps author their own disciplines; the chosen answer is "two kinds" (framework-provided vs app-authored), and the opt-in/opt-out default is still open.
  • How does the gate identify "the downstream app" to scan — by abcd project structure, an explicit target path, or configuration?
  • Where does the four-verdict output feed — a new receipt type, the existing review-artifact pipeline, or acceptance evidence the fidelity reviewer consumes?
  • Provenance/dependency: introducing the "validation discipline" kind edits the brief, which [[itd-61-brief-change-derivation]] would govern — does this intent wait on the doc-fidelity pair, or proceed and let them reconcile? (A /abcd:intent plan sequencing question.)

Audit Notes

Empty. Populated by intent-fidelity-reviewer when intent moves to shipped/.

References

  • [[itd-63-setup-wizard-explains-installs]] names this gate's missing-scanner refusal as its consumer (criterion 4): the refusal calls tools.Missing for the explanation and tools.Install on an explicit yes, never a bare install command.
  • Originating assessment: an internal comparative assessment (2026-06-26, recorded in the sources ledger) — names the safety pillar as abcd's largest gap against the amateur-coder thesis, and identifies the transplantable mechanisms in the companion harness.
  • Governing constraints: abcd never forks/patches/reimplements a dependency (wrap + configure only); abcd must run locally, independent of Claude Code.
  • Reuses the fail-closed, four-verdict posture of the fidelity reviewer of spc-12 (predecessor store) and the native ship gate (scanner-unavailable → refuse, never silent pass).
  • Brief-change dependency: introducing framework-provided "validation disciplines" alongside the existing app-authored disciplines is a brief edit governed by [[itd-60-doc-fidelity-anti-drift]] / [[itd-61-brief-change-derivation]].
  • Existing disciplines for contrast: intents/disciplines/ (itd-1-acceptance-gates, itd-5-prompt-quality, itd-37-modification-grammar) — all app-process disciplines, none a validation gate.

Frontmatter

iditd-62
typeintent
lifecycledrafts
severitymajor

References2

Referenced by5

mentions16