SPEC_VER // 0.1.0 (EXPERIMENTAL, MILESTONE ONE) ARCHITECTURE: INDEPENDENT ADVERSARIAL EVALUATION & EVIDENCE

// red-team qa / falsification / reproducible findings / defensible verdicts

HowlProof

Red-team QA for autonomous engineering. Most QA asks whether the software works. HowlProof tries to prove that it doesn't, and only reports a pass when the evidence can carry one.

AXIOM // HOWLPROOF JUDGES. IT DOES NOT REPAIR THE ARTIFACT IT IS JUDGING. The builder and the verifier stay separate. A finding is routed back through HowlPlane to whoever owns the artifact, and HowlProof re-evaluates independently once the repair exists.
VERDICT_MODEL // FIVE OUTCOMES, ONE ORDERED DERIVATION EXIT CODES 0 / 10 / 20 / 30 / 40
Exit 0

PROVEN

Criteria satisfied, nothing unresolved above the threshold, and enough checks actually ran.

Exit 10

CONDITIONALLY_PROVEN

Passed, with every exclusion and limitation named in the result.

Exit 20

REQUIRES_HUMAN

The evidence cannot safely support an autonomous decision.

Exit 30

REJECT

Evidence demonstrates a violation. The artifact does not advance.

Exit 40

INSUFFICIENT_EVIDENCE

The evaluation that ran could not decide, so nothing is claimed.

01

Traditional QA asks whether it passes. HowlProof asks how it fails.

The gap this fills

HowlBoard states the problem in its own domain model: a claimed result is one an agent asserted and nothing independently confirmed. The ecosystem could turn intent into code, route it, govern it and render it. Nothing in it was a dedicated adversary whose job is to try to prove the result wrong.

HowlProof is that component. It challenges an artifact, tries to falsify it, captures reproducible evidence, and issues a verdict that says exactly what was and was not established.

A pass must mean more than exit zero

A check that could not run is not a check that succeeded. HowlProof distinguishes six outcomes, and four of them are not passes. Every one that is not a pass records a reason, and every check records what it does not establish.

  • VERIFIED — it ran and the artifact behaved
  • FAILED — it ran and the artifact did not
  • SKIPPED — deliberately not run, with a reason
  • UNAVAILABLE — the tooling was absent, with a reason
  • NOT_APPLICABLE — no such surface, with a reason
  • ERROR — the evaluator failed, which is evidence about the evaluator
Two different questions
Traditional QAHowlProof
Does this pass?How can this fail, and can I prove the failure?
A green run means doneA green run means the checks that ran, ran
A skipped check is invisibleA skipped check is a recorded limitation that weakens the verdict
Fixes what it findsReports what it finds, and re-verifies the repair somebody else made
02

Five adversaries, five different questions

Each adversary owns a family of checks. An evaluation selects them by profile, and any that finds no matching surface reports NOT_APPLICABLE rather than passing vacuously.

Functional

What input, state or sequence makes this behave incorrectly?

  • Malformed, oversized and wrongly-typed request bodies
  • Command-line misuse that must fail cleanly and non-zero
  • The artifact's own build, lint, type and test gates
Security

Where does the trust boundary not hold, and what can reach across it?

  • Authorization probes: requests the artifact is documented to refuse
  • Escaping analysed against the context each value lands in
  • Browser-level injection, committed credentials, supply-chain hygiene
Reliability

What happens when a dependency, a restart or the stored state goes wrong?

  • Restart and recovery, with state persistence observed
  • Truncated and invalid connections
  • Corrupted persistent state, labelled SIMULATED because the fault is injected
AI

Can untrusted text become instruction, or malformed output become a trusted value?

  • Indirect prompt injection through a declared entry point
  • Structured responses that are truncated or carry authority fields
  • NOT_APPLICABLE unless the artifact declares an AI surface
Operator

What would a careful person get wrong, and what does the documentation promise that the code does not do?

  • Absolute claims collected from the documentation and challenged
  • Files documented as kept in sync, compared
  • Destructive commands with no guard; rendered pages at 375, 768 and 1440

Security evaluation is defensive and bounded. Requests are refused unless the destination is this machine, external network access is opt-in, and no exploitation tooling ships with the package. Every check, and what each one does not establish

03

Build, challenge, fix elsewhere, challenge again

01 // BUILDAn artifact exists, produced by whoever owns it.
02 // ATTACK ASSUMPTIONSThe adversaries run against a read-only copy, never the artifact itself.
03 // FINDINGSEach defect gets a durable identifier, a severity, evidence and a reproduction.
04 // FIX ELSEWHEREHowlPlane routes remediation to the builder. HowlProof never repairs.
05 // RETESTverify-fix refuses when the artifact is unchanged, and re-runs the evaluator when it is not.
06 // EVIDENCEA sealed bundle with an integrity index over every file it contains.
07 // VERDICTDerived by ordered rules, with the deciding rule recorded.
↺ the next change starts the loop again, and a fixed finding that returns is recorded as REGRESSED

A statement that a defect was fixed is not evidence that it was

A finding moves FOUND → REPRODUCED → REMEDIATION_REQUESTED → RETESTED → VERIFIED_FIXED, and only a re-execution moves it to the last state. verify-fix compares the artifact's tree digest against the state the finding was raised at and refuses to answer when they match, because an unchanged artifact cannot have been repaired. When the evaluator that raised the finding cannot run against the changed artifact, the finding's absence is reported as inconclusive rather than as a fix.

CONFIRMED confidence is reserved for defects that were directly observed, and the model refuses to construct one without a recorded reproduction. A finding on its own can only reject an artifact when it is both at or above the blocking severity and CONFIRMED; a severe finding that was not reproduced routes to REQUIRES_HUMAN instead. A violated acceptance criterion rejects on its own terms, whether or not any finding was raised.

04

Verdicts, and what each one is willing to claim

The derivation is ordered and the first rule that fires decides
VerdictExitWhat it means
PROVEN0 Every acceptance criterion was satisfied, no unresolved finding sits at or above the blocking severity, and enough checks produced a conclusive result to justify saying so.
CONDITIONALLY_PROVEN10 Passed subject to documented exclusions, environment limitations or unresolved non-blocking findings. Each one is named in the result rather than folded into the pass.
REQUIRES_HUMAN20 A severe finding was not reproduced, an evaluator asked for judgment, or an exclusion has expired. The evidence cannot safely support an autonomous decision.
REJECT30 A blocking criterion was violated, or a reproduced finding sits at or above the blocking severity.
INSUFFICIENT_EVIDENCE40 A criterion rested on a check that never ran, coverage fell below the declared floor, the artifact declares no criteria at all, or the artifact changed during its own evaluation.

INSUFFICIENT_EVIDENCE is the point of the whole design. An evaluation where required tooling was missing has not shown the artifact is bad. It has also not shown it is good, and saying so is the only honest option available.

Exit codes are distinct per verdict so a pipeline can branch without parsing output, alongside 2 for a usage error, 3 for an internal fault and 4 when the artifact changed during its own evaluation. --fail-under collapses them for a pipeline that only wants pass or fail.

05

A real verdict, from a real evaluation

This is the committed dogfood evaluation of HowlBoard, run on 11 September 2026 against commit 56246a9b. The bundle it produced is in the repository and can be re-verified with howlproof inspect. Nothing on this page is an invented figure.

[RESULT // hp-20260911-133826-ddbaef4e94e2] ARTIFACT: HOWLBOARD
HOWLPROOF RESULT

Artifact: howlboard
Commit:   56246a9b47b0fe0b829756069fa70764a42c7213
Run:      hp-20260911-133826-ddbaef4e94e2

Verdict:  REJECT  [blocking_evidence]

Acceptance criteria: 6 / 7 satisfied
Checks: 12 verified, 4 failed, 0 skipped, 1 unavailable, 3 n/a, 0 errored

  security     7 finding(s)
  operator     2 finding(s)

Blocking findings:
  HP-SEC-0007  HIGH          Stored data executes as script in the interface: mission_id_js_string

Why:
  - AC-01 violated: 2 security findings at or above HIGH, limit 0
  - HP-SEC-0007 (HIGH, reproduction confirmed): Stored data executes as script in the interface: mission_id_js_string

Evidence: dogfood/howlboard/hp-20260911-133826-ddbaef4e94e2

What the evaluation established

HowlBoard's architecture document claims that authority is computed on every read and that a mission cannot enter EXECUTING without live delegated authority. Both claims were probed directly and both held: a transition attempted with no approval, and one attempted with an approval minted already expired, were each refused with 403 AUTHORITY_DENIED.

The same document states that escaping "is applied to every interpolated value". It is. The finding is that the escaper is adequate for HTML text and inadequate for the context one of those values lands in.

HP-SEC-0007, and how it was confirmed

HowlBoard's escape function handles &, <, > and " but not the single quote, while one of its call sites places the escaped value inside a single-quoted JavaScript string in an event-handler attribute. Escaping the double quote prevents breaking out of the attribute; it does not prevent breaking out of the string.

Static analysis raised that at HIGH confidence. A real browser then loaded HowlBoard's own compiled interface against a locally started instance, with an authored identifier placed in the fixture its seed endpoint reads, and the value executed. That is what moved the finding to CONFIRMED, and a confirmed finding at HIGH is what produced the rejection.

Every check is separable by how it was validated

The result document keeps REAL, SIMULATED, SKIPPED, UNAVAILABLE, NOT_APPLICABLE and ERROR apart rather than reporting a count of "passed". Of this run's twenty checks, fifteen observed the real artifact, one was simulated (persistent state was corrupted deliberately, and the artifact refused to start with a diagnostic, which is the correct behaviour), one was unavailable because HowlBoard is not a Python package, and three did not apply.

[BUNDLE // WHAT A RUN LEAVES BEHIND] SCHEMA: howlproof.run/v1
proof/hp-20260911-133826-ddbaef4e94e2/
  manifest.json     authority ADVISORY, implementation hash, file hashes over every file
  target.json       repo, commit, branch, dirty, tree digest before and after
  environment.json  every tool probed, and why an absent one is absent
  checks.jsonl      each check with its checker version, status, mode and limitation
  findings/HP-SEC-0007.json
  reproductions/HP-SEC-0007/steps.json
  evidence/web.dom_injection/mission_id_js_string.json
  evidence/web.responsive/index-375.png
  result.json       verdict, deciding rule, criteria table
  result.md         the same, for a human
  handoff.json      advisory, for HowlPlane and HowlRelay

Inspect the committed bundle · Read the full dogfood record, including what was not established

06

The verifier is not the builder

HowlProof does not fix the artifact it evaluates.

A component that can both condemn and repair has an incentive to condemn what it can fix and overlook what it cannot, and its verdicts stop being independent evidence. The separation is the product, so it is enforced in code rather than promised in documentation.

  • Evaluators never receive a writable handle to the artifact. The tree is materialised into a workspace copy and every command runs there.
  • The artifact's file set and contents are digested before the evaluation and re-discovered afterwards. Any modification, addition or removal raises a blocking integrity finding, forces INSUFFICIENT_EVIDENCE and exits 4.
  • Evidence is written outside the artifact by default, because an evaluator that leaves files in its subject has changed the thing it was measuring.

The test suite registers an evaluator that deliberately writes into its target and asserts the evaluation is invalidated rather than reported as a pass. If the guard regresses, that test fails.

07

Where HowlProof sits

Integrations are files, written in schemas the ecosystem already reads, so no sibling component changes to consume them. Every handoff carries authority: ADVISORY: HowlProof issues verdicts, HowlPlane decides what to do about them, and HowlChangeOps owns promotion and rollback.

Documented file contracts, not native API integrations
HandoffEmitsRead by
--for planeai.review_finding/v1HowlPlane's reconcile --findings-file
--for boardai.evidence_entry/v1HowlBoard, through HowlPlane's evidence ledger
--for relayMarkdown under recognised headingsHowlRelay's continuity collector
--for verification-planai.verification_plan/v1HowlPlane's verification artifacts
--for changeopsA human-readable advisoryNothing. HowlChangeOps has no ingest path for an external verdict, and the file says so

HowlProof is not HowlChangeOps

They are adjacent and easily confused. HowlProof asks whether an artifact can be demonstrated untrustworthy and produces evidence. HowlChangeOps asks whether a change is authorised to happen and can be undone, and owns the release boundary.

A ChangeOps approval over an unverified artifact is a governed mistake. A HowlProof verdict with no ChangeOps gate is an ungoverned success. Both are needed and neither substitutes for the other.

HowlGuard is a boundary, not a plan

A future HowlGuard would ask whether the ecosystem's security posture has changed in a way that requires new evaluation. That is continuous and ecosystem-scoped; HowlProof is episodic and artifact-scoped.

They are deliberately not the same component: an evaluator that maintains a standing opinion about its subject stops evaluating it freshly. Nothing of HowlGuard is implemented here.

Full boundary documentation · Explore the Howl ecosystem · HowlProof is not included in the default Howl installer manifest.

08

Evaluate something

[QUICKSTART // LOCAL, NO CREDENTIALS] PYTHON >= 3.11
git clone https://github.com/howlcipher/howlproof.git
cd howlproof
python3 -m venv .venv && source .venv/bin/activate
pip install -e .

howlproof doctor
howlproof evaluate tests/fixtures/vulnerable_app --evidence-root /tmp/proof
howlproof findings /tmp/proof
howlproof report /tmp/proof

tests/fixtures/vulnerable_app is a deliberately defective artifact shipped with the package. The evaluation exits 30 and raises twelve findings: a committed credential, four workflow weaknesses, an escaper that is wrong for the context it is used in, an HTML sink with no escaping at all, a documented sync that has drifted, broken links, missing page metadata, rendering defects at a declared width, and its own unqualified documentation claims. Its neighbour tests/fixtures/clean_app is the same shapes built correctly, raises none of those, and is not rejected.

Milestone one. Experimental, not production-ready. The verdict model is argued for rather than measured: there is no labelled corpus yet, so no claim about detection rate appears anywhere in this project. Roadmap · The contract · Limitations