Skip to content

Proof Lane Declaration Pilot

Decision record

Outcome: partial — experiment completed; product adoption is not justified.

This pilot asks whether a small application declaration can close the known false-ready gap: current ashiba check --full succeeds after one selected command succeeds, even when a separately required PostgreSQL or transaction proof was never executed. It does not ask Ashiba to infer test semantics, application architecture, or whether an application's chosen declaration is complete.

The experiment ran on codex/proof-lane-declaration-pilot, derived from the Verifier Trust audit commit 6c6b272877b82fec01ac48025a7d2933a858e3e3. PR #47 was left untouched. Because GitHub still reported #47 open during the pilot, the audit was prepared as the non-duplicating stacked PR #48, based on #47's branch; it can be retargeted after #47 actually merges.

Acceptance items

Acceptance itemStatusRepository evidenceSupplementary evidenceGap
Preserve baseline and prepare audit-only PRpartialThis report names the immutable source commit and links the audit-only PR.GitHub reported #47 open; #48 is stacked to avoid duplicated baseline files.#48 CI/review and retargeting after #47 merge are external state, not evidence that the pilot is complete.
Architecture-neutral clean PostgreSQL controldoneThis report specifies the control contract and its fail-closed boundaries.Isolated live runs passed behavior and transaction lanes using run-specific schemas.The disposable fixture is not checked in; the repository claim is deliberately the recorded contract, not a shipped test suite.
Reproduce before-state false-ready and D12/D13 gapsdoneThe exact before/candidate matrix and scope are retained here.Local command results recorded current green versus direct/candidate red results.It is a small control, not a defect-rate estimate.
Strict declaration prototype and negative casesdoneThe strict format, states, and explicit limitation are retained here.Prototype self-test passed seven config cases; missing DB URL and zero-test sentinel were executed locally.Prototype source is experiment-only and not part of the product tree.
Matched Fresh Agent A/B/C and natural adoptionpartialThe two recorded D14 condition outcomes and their limits are retained here.Disposable agent-report.md files record commands and changes.D12/D13 fresh repairs and independent Tool-Available adoption were not run because the local agent-thread cap was reached.
Decide whether to adopt product integrationdoneThis document records a no-adoption decision and the unmet gate.No product source/configuration changed.Re-evaluate only after the missing fresh-agent evidence exists.
Update constitution and durable evidencedoneConstitution row/rule and this evaluation are versioned documentation.None required for the wording update.The classification remains an open hypothesis, not a product guarantee.

Verification basis and guarantee limits

Repository evidence is the versioned Constitution, this decision record, and the documentation build. Disposable controls, Docker-backed PostgreSQL runs, agent reports, command counts, and timing are supplementary evidence. They support the narrow observed statements but do not justify a general success rate or a product adoption claim. A green aggregate is expressly limited to declared command execution.

Evidence classes

  • Observed: a command result from the disposable control, prototype, or recorded agent run.
  • Inference: a bounded conclusion from those results.
  • Unproven: a question not settled by this small pilot.

Control and prototype

The clean control is an ordinary direct-pg Node application. It has no Ashiba CLI dependency, VSA layout, generator, repository layer, or scaffold. Its canonical SQL keeps optional search parameterized, chooses sort/direction from finite maps, paginates, converts driver rows at an application boundary, and uses explicit BEGIN/COMMIT/ROLLBACK for a transfer.

Its application-owned commands are:

Required laneWhat the control actually checksClean PostgreSQL result
staticsyntax/type check plus two unit assertionspass
postgres-behavioroptional search, hostile parameter, sorting, pagination, driver conversionpass (5 assertions)
transactionsuccessful commit and failed-transfer rollbackpass (2 assertions)

Every database invocation creates and finally drops an exact run-specific schema. CONTROL_DATABASE_URL missing, zero test sentinel, a failed behavior assertion, and a failed transaction all exit non-zero. No URL or password was printed. The clean aggregate report was:

text
overall=complete
static=passed, postgres-behavior=passed, transaction=passed

The experiment-only runner reads strict JSON (version, required, and lanes only), executes every declared lane once, and reports passed | failed | not-run | missing per command. Its aggregate is complete | failed | incomplete | invalid; deliberately, it has no ready status. It rejects absent/empty commands, missing required lanes, duplicate required identifiers, unknown configuration, and inconsistent required flags. An optional-lane failure remains visible without failing an otherwise complete required set. Seven self-tests passed.

This runner is not product code. It reports command execution and exit status only; it does not inspect coverage, test count, SQL meaning, or transaction semantics. Those facts are made fail-closed by this control's commands, not inferred by the runner.

Before / candidate mutation results

CaseCurrent check --full with npm testDirect required oracleCandidate aggregateInterpretation
Clean controlgreenall passcompleteno false positive observed
D14: unit-only selected command while live behavior is redgreenbehavior redfailed (postgres-behavior)measured false-ready is prevented when the declaration retains the live lane
D12: rollback removedgreentransaction redfailed (transaction)static success does not hide required transaction failure
D13: commit before failure sentinelgreentransaction redfailed (transaction)same boundary as D12

Observed: the existing full check returned green for D14 because npm test ran the unit lane only. The same source state made the direct live command non-zero and made the candidate aggregate failed.

Observed: D12 and D13 each remained green under the current full check and were red under the independently executable transaction lane and candidate aggregate.

Observed boundary: deleting transaction from the declared required list made the remaining declared lanes complete. This is correct for the runner's contract and proves that declaration completeness is an application/review responsibility, not a fact the runner can derive.

Observed negatives: missing DB URL yielded failed with both database lanes failed; the control's zero-test sentinel yielded non-zero. Invalid/missing required config, empty command, nonzero command, duplicate required ID, unknown configuration, optional failure, and all-success were covered by the prototype self-tests. JSON object duplicate keys are not observable after JSON.parse; duplicate required identifiers are rejected. A future format would need an array representation or duplicate-aware parser to reject raw duplicate lane keys.

Fresh-agent observations

The requested matched A/B runs were started as a small pilot. Their evidence is useful but insufficient for an adoption claim.

ConditionD14 observed behaviorCorrectness / review result
A — Rules + current VerifyRewired npm test to invoke unit, PostgreSQL behavior, and transaction commands. check --full then failed closed without a DB URL.Correct test-wiring repair; static/unit evidence passed. It did not complete a live success run in its timebox.
B/C — Rules + required candidate runnerUsed the runner, which showed static passed and both DB lanes failed without URL. The agent also hardened inherited JavaScript allowlist keys, rather than repairing the supplied live-order defect.The runner avoided a false green, but tool output broadened the investigation; final supplied business defect was not proven repaired.
Tool Availablenot runThe local agent-thread cap prevented an independent natural-adoption run in this pilot. Do not infer adoption or non-adoption.
D12/D13 matched fresh repairsnot runThe mutation gates were mechanically demonstrated above, but no fresh-agent comparison is claimed.

The B/C row is intentionally not counted as a successful repair. It is a useful observation about terminality: a runner that reports missing live proof prevents a false completion claim, but it can also cause additional source review and unrelated hardening. No human intervention occurred.

CLI responsibility judgement

ResponsibilityClassification nowReason
Static checkCore VerifyExisting scoped static evidence remains useful.
Existing check --full selected commandCore Verify, explicitly scopedIt proves that one selected command exited zero, not coverage.
Strict proof declaration parser/aggregatorInsufficient Evidence / Rule CandidateThe pilot fixes the measured aggregation gap only when the application has a sound declaration; fresh and maintenance evidence is insufficient for product adoption.
PostgreSQL behavior / transaction commandsApplication ResponsibilityThe application owns their meaning, data, and completeness.
Generator/scaffold/refreshInsufficient EvidenceThis pilot neither selected nor evaluated them.
Removal candidateNoneNon-use or configuration cost alone is not deletion evidence.

Verify-first hypothesis and terminality

Supported only in a narrow sense: a verifier/aggregator can be more useful than a generator here because it made a missing required execution visible without prescribing the app's test framework or architecture.

Not established: that this improves overall agent correctness or reduces human burden. The candidate agent's unrelated allowlist repair and the absent natural-adoption run are direct counterweights to a stronger claim.

The pilot saw no evidence that ready, blocked, or unresolved adds value over scoped complete, failed, incomplete, and invalid. complete must mean only: every application-declared required command executed and exited zero. It must not claim semantic correctness.

Product decision and constitution update

No production CLI/configuration change was made; therefore no CLI migration, new command, or scaffold architecture was introduced. The Phase 11 adoption gate is not met: D14/D12/D13 were separated mechanically and the clean control did not false-positive, but fresh-agent A/B/C, natural adoption, and configuration-maintenance evidence remain incomplete.

The Constitution now records declared proof-lane execution as an open hypothesis and explicitly distinguishes a declaration's adequacy from its mechanically checkable execution result.

Dynamic SQL questions carried forward

  1. Can a null-prototype/closed-world application sort map be recognized or reviewed without Ashiba owning the application module?
  2. Which live semantic obligations should be declared separately rather than combined into a general test command?
  3. How should a declaration relate to zero-test detection without making the runner framework-specific?
  4. Can a duplicate-aware, portable manifest remain smaller than the policy it replaces?

Run independently fresh, time-boxed A/B/Tool-Available repairs for D12 and D13 and a natural D14 run with a safely pre-provisioned disposable PostgreSQL URL. Measure final live correctness, source rereads, runner repeats, manifest churn, and human review surface. Only then consider a backward-compatible check --full integration with one optional declaration input.

Direct answers

Does explicit Proof Lane strengthen Rules + Proof realistically, or add configuration debt? It realistically closes the declared-command execution gap in D14/D12/D13, but the present pilot has not shown that its configuration cost is repaid across fresh agents or long-term maintenance.

What may Ashiba currently say is ready? Only that its static checks and every explicitly selected or declared command have succeeded, never that the application's omitted proof obligations or business semantics are correct.

Self review

Cycle 1 — consistency review

  • Resolved: the first draft did not map every acceptance item to status, evidence, and gap. The acceptance table now does so and separates versioned repository evidence from disposable supporting evidence.
  • Resolved: ready wording is restricted to the final scoped answer; the runner itself uses only complete, failed, incomplete, and invalid.
  • Resolved: no local filesystem paths or unstated test success claims appear in this repository-facing report.
  • Retro gate: no tmp/RETRO.md existed in the pilot worktree.

Cycle 2 — human acceptance review

  • Value: the before/candidate matrix makes the D14 false-ready closure and the D12/D13 transaction boundary visible without claiming semantic proof.
  • Guarantee limit: the declaration's adequacy, natural adoption, and Fresh Agent improvement remain visibly partial.
  • Triage: no blocker; the missing matched-agent runs are follow-up, and duplicate raw JSON key detection is a nit/follow-up for any future format. The report is ready for review as a no-adoption decision record.

Non-blocking next decision: accept the recommended defer of product integration, or explicitly request the bounded follow-up experiment with pre-provisioned disposable PostgreSQL and independent fresh-agent slots.