PR #1 · 2026-09-21
PASS
- Behavior tests
- 3/3 passed
- Contract check
- Passed
no-auth-boundary
No matching fact within the declared extraction capability.
Tested commit da0936e
Actual GitHub Actions results: both changes pass their behavior tests. Only one stays within the declared boundary.
PR #1 · 2026-09-21
no-auth-boundary
No matching fact within the declared extraction capability.
Tested commit da0936e
PR #2 · 2026-09-21
no-auth-boundary
Forbidden fact observed in head.
Tested commit afafd53
Captured September 21, 2026 from the exact runs linked above. These are synthetic examples, not a live status feed. Imported test evidence remains self-attested. Run metadata and report hashes ↗
The local INCOMPLETE fixture passes 2 of 2 tests but omits the required storage-failure scenario. Read its fixture report. This report comes from the separate local fixture run, not either Actions run above.
01 / The implementation
The drifting version adds the authentication import and sessionTag() call. The helper simply returns a string, so the signup tests stay green. The violation is the declared architectural boundary—not proof of a security flaw.
src/newsletter.ts · drifting version
import { sessionTag } from './auth.js';
import type { NewsletterStore } from './storage.js';
export async function subscribe(
email: string,
store: NewsletterStore,
): Promise<string> {
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email))
throw new Error('invalid_email');
sessionTag();
await store.put(email);
return 'subscribed';
}
Passing source · Drifting source · The three tests · Authentication helper
02 / The contract
The schema 0.2 contract forbids a runtime dependency from src/newsletter.ts to src/auth.ts. It also requires the handler and its call to signup, preserves the health API signature, and names three executed test scenarios.
schema: '0.2'
change:
name: Newsletter signup with executed evidence
intent: Validate email and store subscriptions without authentication coupling.
scope:
allowed:
[src/newsletter.ts, src/handler.ts, src/newsletter.test.ts, tsconfig.json]
requires:
- id: handler
match: { kind: api, file: src/handler.ts, name: post }
- id: handler-calls-subscribe
match:
{
kind: resolved-call,
file: src/handler.ts,
from: 'src/handler.ts#post',
to: 'src/newsletter.ts#subscribe',
}
forbids:
- id: no-auth-boundary
match:
{
kind: dependency,
file: src/newsletter.ts,
to: src/auth.ts,
typeOnly: false,
}
preserves:
- id: health-api
match: { kind: api, file: src/health.ts, name: health }
evidence:
- id: stores-email
stage: test
method: execution
scenario: successful_signup
file: src/newsletter.test.ts
- id: rejects-invalid-email
stage: test
method: execution
scenario: invalid_email
file: src/newsletter.test.ts
- id: propagates-storage-failure
stage: test
method: execution
scenario: storage_failure
file: src/newsletter.test.ts
The CI runs select the approved contract from the Git merge base and compare it with the candidate at the tested head. This is explicit baseline selection, not authenticated approval.
03 / Reproduce the run
Reproduce the exact CI runs, or run the local qualification fixtures below. Use Node 24 and pnpm 10.29.3 with the public MVP revision used by the examples:
git checkout b2925f9e6433cc94d5bbb2224dbb1143cc5704b5
pnpm install --frozen-lockfile
pnpm build
pnpm qualify
The qualification script explicitly runs Vitest, imports its JSON results, then verifies the contract. It also checks an aliased dependency and two deliberately broken implementations. Review and verify themselves do not execute the analyzed code.
Share a change where passing tests left an important question unanswered. A sanitized description is enough.
Share a real change ↗