Intake surface for the VERIFRAX public perimeter. This surface accepts intake only. It does not publish proof, determine verification truth, issue authority, or execute governed actions.
+
Terminal intake control plane for VERIFRAX. This host converts untrusted human intent into structured private review signal only. It does not publish proof, verify truth, issue authority, execute governed actions, recognize terminal truth, or assign recourse.
Bounded public tool surface inside the VERIFRAX perimeter.
diff --git a/README.md b/README.md
index c217428..cca1571 100644
--- a/README.md
+++ b/README.md
@@ -1,169 +1,48 @@
# APPLY
-* License: GNU Affero General Public License v3.0
+APPLY is the VERIFRAX terminal intake control plane.
-APPLY is the Verifrax intake boundary: the public surface that accepts structured intake into the Verifrax system without becoming authored protocol source, authority issuance, governed execution, public verification, proof publication, or archive/reference.
+`APPLY = intake(filter(humans)) -> structured_signal`
-## Proof artifacts
+APPLY accepts structured intake, rejects incomplete intake, normalizes applicant signal, scores reviewability, issues intake receipts, routes records into a private queue, exposes protected reviewer workflow, and emits review state.
-This repository is part of the VERIFRAX proof perimeter.
+APPLY does not decide truth.
-- **ARTIFACT-0006**
-- **ARTIFACT-0005**
-- **ARTIFACT-0004**
-- **ARTIFACT-0003**
-- **ARTIFACT-0002**
-- **ARTIFACT-0001**
+APPLY may not define law, accept canonical state, issue authority, execute governed actions, verify artifacts, publish proof, archive evidence, recognize terminal truth, assign terminal recourse, or publish applicant PII.
-**Canonical public proof surface:** https://proof.verifrax.net
-**Canonical proof publication repository:** https://github.com/Verifrax/proof
-**Canonical evidence root:** https://github.com/Verifrax/VERIFRAX
+## Live host
-## Terminal planes
+https://apply.verifrax.net
-- **[ANAGNORIUM](https://github.com/Verifrax/ANAGNORIUM)** — terminal recognition
-- **[REGRESSORIUM](https://github.com/Verifrax/REGRESSORIUM)** — terminal recourse
+## Required routes
-## Status
+Public: `/`, `/task`, `/submit`, `/confirm`, `/status`, `/privacy`, `/admin`.
-* Surface class: intake
-* Repository class: intake host surface
-* Public host ownership: `apply.verifrax.net`
-* Host class: tool
-* Role: apply
-* Deploy mode: static-root
-* Current repository posture: live public intake boundary
-## Boundary
+API: `/api/submit`, `/api/confirm`, `/api/status`, `/api/admin/submissions`, `/api/admin/submission/:id`.
-This repository owns structured intake only.
+## Tracks
-It accepts bounded submissions into the Verifrax system.
-It exposes intake-surface role truth and intake-entry behavior.
+- protocol-review
+- security-adversarial-review
+- verifier-engineering
+- surface-frontend
+- enterprise-compliance
+- documentation-systems
-It does not author normative source material.
-It does not issue authority.
-It does not execute governed actions.
-It does not verify published material.
-It does not publish proof.
-It does not serve as archive/reference.
-It does not replace adjacent sovereign boundaries.
+## Queue states
-## What it does
+`new`, `review`, `accepted`, `rejected`, `deferred`, `spam`, `quarantined`.
-- accepts structured intake into the Verifrax system
-- provides a bounded host surface for intake entry
-- preserves a clean intake boundary for public users and system routing
-- keeps intake distinct from authority, execution, verification, proof publication, and archive/reference
-- anchors intake-surface role truth for adjacent repositories and hosts
+## Scoring law
-## What it does not do
+`S = 0.5 * output_presence + 0.2 * link_quality + 0.2 * alignment + 0.1 * clarity`
-- not authored protocol source; that belongs to VERIFRAX
-- not authority issuance; that belongs to AUCTORISEAL
-- not governed execution; that belongs to CORPIFORM
-- not public verification; that belongs to VERIFRAX-verify
-- not proof publication; that belongs to proof
-- not archive/reference; that belongs to SIGILLARIUM
-- not constitutional doctrine; that belongs to SYNTAGMARIUM
-- not canonical world-state; that belongs to ORBISTIUM
-- not reconciliation or repair; that belongs to CONSONORIUM
-- not sovereign cognition; that belongs to TACHYRIUM
+## Runtime
-## Adjacent sovereign surfaces
+Cloudflare Pages Functions + D1:
-- `VERIFRAX` — authored protocol and evidence-root boundary
-- `AUCTORISEAL` — authority issuance
-- `CORPIFORM` — governed execution
-- `VERIFRAX-verify` — public verification
-- `proof` — proof publication
-- `SIGILLARIUM` — archive/reference
-
-VERIFRAX authors.
-AUCTORISEAL issues.
-CORPIFORM executes.
-proof publishes.
-VERIFRAX-verify verifies.
-APPLY accepts intake.
-
-That separation must remain explicit.
-
-## Public host ownership
-
-This repository owns the public intake host for:
-
-* `https://apply.verifrax.net/`
-
-That host must remain intake only.
-
-It must not become:
-
-* authored protocol source
-* authority issuance
-* governed execution
-* verifier UI
-* proof publication
-* archive/reference
-* docs mirror
-* commercial landing
-
-## Public surface
-
-The public surface of this repository is its repository identity, README boundary, public intake host surface, and intake-facing materials carried by this repository.
-
-Publication here is not authored source.
-Publication here is not authority.
-Publication here is not execution.
-Publication here is not verification.
-Publication here is not proof publication.
-Publication here is not archive/reference.
-
-## Package / host / repo truth
-
-Repository truth for APPLY lives in this repository.
-
-Host truth for this surface is `https://apply.verifrax.net/`.
-Host presentation and repository truth are related but not interchangeable.
-Repository boundary still controls intake role truth here.
-
-## Intake meaning in-system
-
-Intake in-system means the stack can point to APPLY and say that a bounded intake surface, intake-entry path, or submission-acceptance surface belongs to this boundary.
-
-Intake here accepts.
-Intake here does not author.
-Intake here does not issue authority.
-Intake here does not execute.
-Intake here does not verify.
-Intake here does not publish proof.
-
-That does not by itself mean:
-
-- the intake surface became authored protocol source
-- the intake surface issued authority
-- the intake surface executed a governed action
-- the intake surface verified truth
-- the intake surface published proof
-- the intake surface replaced archive/reference
-- the intake surface replaced the evidence-root repository
-
-## Not this
-
-APPLY is not authored protocol source.
-APPLY is not authority issuance.
-APPLY is not governed execution.
-APPLY is not public verification.
-APPLY is not proof publication.
-APPLY is not archive/reference.
-
-## Validation
-
-- `surface.host.json` must continue to declare:
- - repo = `apply`
- - host = `https://apply.verifrax.net`
- - hostClass = `tool`
- - role = `apply`
- - deployMode = `static-root`
-
-## License
-
-This repository is licensed under the GNU Affero General Public License v3.0. See `LICENSE`.
+- `APPLY_DB`
+- `ADMIN_TOKEN`
+- `RECEIPT_HMAC_SECRET`
+- `TURNSTILE_SECRET`
+- `APPLY_WEBHOOK_URL`
diff --git a/docs/APPLY_TERMINAL_INTAKE_CONTROL_PLANE.md b/docs/APPLY_TERMINAL_INTAKE_CONTROL_PLANE.md
new file mode 100644
index 0000000..a7a6f16
--- /dev/null
+++ b/docs/APPLY_TERMINAL_INTAKE_CONTROL_PLANE.md
@@ -0,0 +1,28 @@
+# APPLY Terminal Intake Control Plane
+
+A static page saying "submit" is not intake.
+
+Finished APPLY completes:
+
+`visitor -> self-selection filter -> bounded task -> structured artifact -> validation -> score -> receipt -> private queue -> sixty-second decision`
+
+No public APPLY surface may make an applicant submission appear verified, authorized, proven, recognized, or accepted as truth.
+
+## Release gates
+
+1. Six bounded task lanes exist.
+2. Form captures required structured signal.
+3. Missing artifact is rejected.
+4. Missing work link is rejected.
+5. Honeypot is rejected.
+6. Overlong narrative is rejected.
+7. Submission receives deterministic score.
+8. Submission writes to private queue.
+9. Receipt is generated.
+10. Admin queue requires bearer token.
+11. Reviewer can transition queue state.
+12. Full record read is protected.
+13. Public confirmation is receipt-only.
+14. Status route is APPLY-only.
+15. PII never enters public repository.
+16. Static contract tests pass.
diff --git a/docs/CLOUDFLARE_DEPLOYMENT.md b/docs/CLOUDFLARE_DEPLOYMENT.md
new file mode 100644
index 0000000..8942cb0
--- /dev/null
+++ b/docs/CLOUDFLARE_DEPLOYMENT.md
@@ -0,0 +1,21 @@
+# APPLY Cloudflare Deployment
+
+```bash
+wrangler d1 create verifrax-apply
+wrangler d1 migrations apply verifrax-apply
+wrangler pages secret put ADMIN_TOKEN
+wrangler pages secret put RECEIPT_HMAC_SECRET
+````
+
+Optional:
+
+```bash
+wrangler pages secret put TURNSTILE_SECRET
+wrangler pages secret put APPLY_WEBHOOK_URL
+```
+
+Admin: `https://apply.verifrax.net/admin`
+
+Queue: `/api/admin/submissions?state=new`
+
+Record: `/api/admin/submission/:id`
diff --git a/functions/api/admin/submission/[id].ts b/functions/api/admin/submission/[id].ts
new file mode 100644
index 0000000..848617c
--- /dev/null
+++ b/functions/api/admin/submission/[id].ts
@@ -0,0 +1,4 @@
+import { json, fail } from "../../../lib/http";
+import { assertAdmin } from "../../../lib/auth";
+interface Env { APPLY_DB: D1Database; ADMIN_TOKEN: string; }
+export const onRequestGet: PagesFunction = async ({request,env,params})=>{if(!assertAdmin(request,env))return fail("unauthorized",401);const id=Array.isArray(params.id)?params.id[0]:params.id;const row:any=await env.APPLY_DB.prepare("select * from submissions where id = ?").bind(id).first();if(!row)return fail("not_found",404);return json({ok:true,submission:{...row,score:JSON.parse(row.score_json),receipt:JSON.parse(row.receipt_json),submission:JSON.parse(row.submission_json)}})};
diff --git a/functions/api/admin/submissions.ts b/functions/api/admin/submissions.ts
new file mode 100644
index 0000000..64673c4
--- /dev/null
+++ b/functions/api/admin/submissions.ts
@@ -0,0 +1,6 @@
+import { json, fail } from "../../lib/http";
+import { assertAdmin } from "../../lib/auth";
+import { STATES, REVIEW_REASONS } from "../../lib/validation";
+interface Env { APPLY_DB: D1Database; ADMIN_TOKEN: string; }
+export const onRequestGet: PagesFunction = async ({request,env})=>{if(!assertAdmin(request,env))return fail("unauthorized",401);const state=new URL(request.url).searchParams.get("state")||"new";const rows=await env.APPLY_DB.prepare("select id, created_at, updated_at, state, track, github_url, artifact_url, score_total, score_json from submissions where state = ? order by created_at desc limit 100").bind(state).all();return json({ok:true,state,submissions:rows.results})};
+export const onRequestPatch: PagesFunction = async ({request,env})=>{if(!assertAdmin(request,env))return fail("unauthorized",401);const input:any=await request.json();if(!STATES.has(input.state))return fail("invalid_state",400);if(input.reason&&!REVIEW_REASONS.has(input.reason))return fail("invalid_reason",400);await env.APPLY_DB.prepare("update submissions set state = ?, updated_at = ? where id = ?").bind(input.state,new Date().toISOString(),input.id).run();await env.APPLY_DB.prepare("insert into review_decisions (id, submission_id, created_at, decision, reason, produced_something, aligned, above_baseline, review_seconds) values (?, ?, ?, ?, ?, ?, ?, ?, ?)").bind(crypto.randomUUID(),input.id,new Date().toISOString(),input.state,input.reason||null,Boolean(input.produced_something),Boolean(input.aligned),Boolean(input.above_baseline),Number(input.review_seconds||0)).run();await env.APPLY_DB.prepare("insert into submission_events (id, submission_id, created_at, from_state, to_state, actor, reason) values (?, ?, ?, ?, ?, ?, ?)").bind(crypto.randomUUID(),input.id,new Date().toISOString(),null,input.state,"admin",input.reason||"manual_review").run();return json({ok:true})};
diff --git a/functions/api/confirm.ts b/functions/api/confirm.ts
new file mode 100644
index 0000000..26977a9
--- /dev/null
+++ b/functions/api/confirm.ts
@@ -0,0 +1,3 @@
+import { json, fail } from "../lib/http";
+interface Env { APPLY_DB: D1Database; }
+export const onRequestGet: PagesFunction = async ({ request, env }) => { const id=new URL(request.url).searchParams.get("id"); if(!id)return fail("missing_id",400); const row:any=await env.APPLY_DB.prepare("select receipt_json from submissions where id = ?").bind(id).first(); if(!row)return fail("not_found",404); return json({ok:true,receipt:JSON.parse(row.receipt_json)}); };
diff --git a/functions/api/status.ts b/functions/api/status.ts
new file mode 100644
index 0000000..b36b38d
--- /dev/null
+++ b/functions/api/status.ts
@@ -0,0 +1,2 @@
+import { json } from "../lib/http";
+export const onRequestGet: PagesFunction = async () => json({ok:true,role:"apply_intake_only",truth_warning:"INTAKE_ONLY_NOT_TRUTH",queue_states:["new","review","accepted","rejected","deferred","spam","quarantined"]});
diff --git a/functions/api/submit.ts b/functions/api/submit.ts
new file mode 100644
index 0000000..70bd55e
--- /dev/null
+++ b/functions/api/submit.ts
@@ -0,0 +1,22 @@
+import { json, fail } from "../lib/http";
+import { validateSubmission } from "../lib/validation";
+import { scoreSubmission } from "../lib/scoring";
+import { checkRateLimit } from "../lib/rate-limit";
+import { sha256 } from "../lib/hash";
+import { makeReceipt } from "../lib/receipt";
+import { notify } from "../lib/notify";
+interface Env { APPLY_DB: D1Database; RECEIPT_HMAC_SECRET?: string; TURNSTILE_SECRET?: string; APPLY_WEBHOOK_URL?: string; }
+async function logBlocked(env:Env,reason:string,ipHash:string,userAgentHash:string,payload:unknown){await env.APPLY_DB.prepare("insert into blocked_attempts (id, created_at, reason, ip_hash, user_agent_hash, payload_json) values (?, ?, ?, ?, ?, ?)").bind(crypto.randomUUID(),new Date().toISOString(),reason,ipHash,userAgentHash,JSON.stringify(payload).slice(0,4000)).run();}
+export const onRequestPost: PagesFunction = async ({ request, env }) => {
+const ip=request.headers.get("cf-connecting-ip")||"unknown";
+const userAgentHash=await sha256(request.headers.get("user-agent")||"unknown");
+const rate=await checkRateLimit(env,ip,5);
+let input:any; try{input=await request.json()}catch{await logBlocked(env,"invalid_json",rate.ipHash,userAgentHash,{});return fail("invalid_json")}
+const rejection=validateSubmission(input); if(rejection){await logBlocked(env,rejection,rate.ipHash,userAgentHash,input);return json({ok:false,rejection},400)}
+const id=crypto.randomUUID(), now=new Date().toISOString(), score=scoreSubmission(input), state=score.threshold==="reject"?"rejected":"new";
+const receipt=await makeReceipt({id,created_at:now,track:input.track,state,secret:env.RECEIPT_HMAC_SECRET});
+await env.APPLY_DB.prepare(`insert into submissions (id, schema_version, created_at, updated_at, state, track, email, github_url, artifact_url, score_total, score_json, receipt_json, submission_json, ip_hash, user_agent_hash) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(id,"1.0.0",now,now,state,input.track,input.identity?.email||"",input.links?.github||"",input.signal.artifact_link,score.total,JSON.stringify(score),JSON.stringify(receipt),JSON.stringify(input),rate.ipHash,userAgentHash).run();
+await env.APPLY_DB.prepare(`insert into submission_events (id, submission_id, created_at, from_state, to_state, actor, reason) values (?, ?, ?, ?, ?, ?, ?)`).bind(crypto.randomUUID(),id,now,null,state,"system",score.threshold).run();
+await notify(env.APPLY_WEBHOOK_URL,{type:"apply.submission.created",id,track:input.track,state,score});
+return json({ok:true,id,state,score,receipt});
+};
diff --git a/functions/lib/auth.ts b/functions/lib/auth.ts
new file mode 100644
index 0000000..ae0319b
--- /dev/null
+++ b/functions/lib/auth.ts
@@ -0,0 +1,2 @@
+export interface AdminEnv { ADMIN_TOKEN: string; }
+export function assertAdmin(request: Request, env: AdminEnv): boolean { const h=request.headers.get("authorization")||""; return Boolean(env.ADMIN_TOKEN) && h === `Bearer ${env.ADMIN_TOKEN}`; }
diff --git a/functions/lib/hash.ts b/functions/lib/hash.ts
new file mode 100644
index 0000000..87789de
--- /dev/null
+++ b/functions/lib/hash.ts
@@ -0,0 +1,2 @@
+export async function sha256(value:string):Promise{const b=new TextEncoder().encode(value);const d=await crypto.subtle.digest("SHA-256",b);return [...new Uint8Array(d)].map(x=>x.toString(16).padStart(2,"0")).join("")}
+export async function hmacSha256(secret:string,value:string):Promise{return sha256(secret+"|"+value)}
diff --git a/functions/lib/http.ts b/functions/lib/http.ts
new file mode 100644
index 0000000..aabeb25
--- /dev/null
+++ b/functions/lib/http.ts
@@ -0,0 +1,2 @@
+export function json(body: unknown, status = 200): Response { return new Response(JSON.stringify(body,null,2), { status, headers: { "content-type": "application/json; charset=utf-8" } }); }
+export function fail(error: string, status = 400): Response { return json({ok:false,error},status); }
diff --git a/functions/lib/notify.ts b/functions/lib/notify.ts
new file mode 100644
index 0000000..9f5d814
--- /dev/null
+++ b/functions/lib/notify.ts
@@ -0,0 +1 @@
+export async function notify(url:string|undefined,body:unknown):Promise{if(!url)return;try{await fetch(url,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(body)})}catch{}}
diff --git a/functions/lib/rate-limit.ts b/functions/lib/rate-limit.ts
new file mode 100644
index 0000000..c567039
--- /dev/null
+++ b/functions/lib/rate-limit.ts
@@ -0,0 +1,3 @@
+import { sha256 } from "./hash";
+export interface RateLimitEnv { APPLY_DB: D1Database; }
+export async function checkRateLimit(env:RateLimitEnv,ip:string,limit=5){const ipHash=await sha256(ip||"unknown");return {ok:true,ipHash};}
diff --git a/functions/lib/receipt.ts b/functions/lib/receipt.ts
new file mode 100644
index 0000000..4ac9105
--- /dev/null
+++ b/functions/lib/receipt.ts
@@ -0,0 +1,2 @@
+import { hmacSha256 } from "./hash";
+export async function makeReceipt(i:{id:string;created_at:string;track:string;state:string;secret?:string}){const r:any={receipt_type:"APPLY_INTAKE_RECEIPT",schema_version:"1.0.0",id:i.id,created_at:i.created_at,track:i.track,state:i.state,boundary:"INTAKE_ONLY_NOT_TRUTH"};if(i.secret)r.signature=await hmacSha256(i.secret,`${r.receipt_type}|${r.id}|${r.created_at}|${r.track}|${r.state}|${r.boundary}`);return r;}
diff --git a/functions/lib/scoring.ts b/functions/lib/scoring.ts
new file mode 100644
index 0000000..abbc23d
--- /dev/null
+++ b/functions/lib/scoring.ts
@@ -0,0 +1,2 @@
+import { TRACKS } from "./validation";
+export function scoreSubmission(input:any){const output_presence=input.signal?.artifact_link&&input.task_output?.artifact_url?1:0;const link_quality=Math.min(1,(1+(input.signal?.work_links?.length||0))/4);const alignment=TRACKS.has(input.track)?0.75:0;const clarity=Math.min(1,(String(input.signal?.capability||"").length+String(input.task_output?.summary||"").length)/500);const total=Number((0.5 * output_presence + 0.2 * link_quality + 0.2 * alignment + 0.1 * clarity).toFixed(3));const threshold=total<0.4?"reject":total<0.7?"defer":"candidate_pool";return{output_presence,link_quality,alignment,clarity,total,threshold}}
diff --git a/functions/lib/validation.ts b/functions/lib/validation.ts
new file mode 100644
index 0000000..94c5322
--- /dev/null
+++ b/functions/lib/validation.ts
@@ -0,0 +1,4 @@
+export const TRACKS = new Set(["protocol-review", "security-adversarial-review", "verifier-engineering", "surface-frontend", "enterprise-compliance", "documentation-systems"]);
+export const STATES = new Set(["new", "review", "accepted", "rejected", "deferred", "spam", "quarantined"]);
+export const REVIEW_REASONS = new Set(["artifact_fake","wrong_track","role_confusion","security_risk","exceptional_signal","missing_concrete_output","strong_boundary_signal"]);
+export function validateSubmission(i:any):string|null{if(!i||typeof i!=="object")return"invalid_json";if(i.trap)return"bot_trap";if(i.schema_version!=="1.0.0")return"invalid_schema_version";if(!TRACKS.has(i.track))return"invalid_track";if(!i.signal?.artifact_link)return"missing_artifact";if(!Array.isArray(i.signal?.work_links)||i.signal.work_links.length<1)return"missing_work_links";if(!i.constraints?.unpaid_ack||!i.constraints?.async_ack||!i.constraints?.output_first_ack)return"missing_ack";return null;}
diff --git a/index.html b/index.html
index 37a64d5..b32d768 100644
--- a/index.html
+++ b/index.html
@@ -4,7 +4,7 @@
VERIFRAX Apply
-
+
@@ -12,7 +12,7 @@
VERIFRAX / apply
VERIFRAX Apply
-
Intake surface for the VERIFRAX public perimeter. This surface accepts intake only. It does not publish proof, determine verification truth, issue authority, or execute governed actions.
+
Terminal intake control plane for VERIFRAX. This host converts untrusted human intent into structured private review signal only. It does not publish proof, verify truth, issue authority, execute governed actions, recognize terminal truth, or assign recourse.
Bounded public tool surface inside the VERIFRAX perimeter.
diff --git a/migrations/0001_terminal_intake_control_plane.sql b/migrations/0001_terminal_intake_control_plane.sql
new file mode 100644
index 0000000..149e7fb
--- /dev/null
+++ b/migrations/0001_terminal_intake_control_plane.sql
@@ -0,0 +1,11 @@
+create table if not exists submissions (id text primary key,schema_version text not null,created_at text not null,updated_at text not null,state text not null check (state in ('new','review','accepted','rejected','deferred','spam','quarantined')),track text not null,email text not null,github_url text not null,artifact_url text not null,score_total real not null,score_json text not null,receipt_json text not null,submission_json text not null,ip_hash text,user_agent_hash text);
+create table if not exists submission_events (id text primary key,submission_id text not null,created_at text not null,from_state text,to_state text not null,actor text not null,reason text);
+create table if not exists review_decisions (id text primary key,submission_id text not null,created_at text not null,decision text not null,reason text,produced_something integer not null default 0,aligned integer not null default 0,above_baseline integer not null default 0,review_seconds integer not null default 0);
+create table if not exists blocked_attempts (id text primary key,created_at text not null,reason text not null,ip_hash text,user_agent_hash text,payload_json text);
+create table if not exists rate_limits (ip_hash text not null,window_start text not null,count integer not null,primary key (ip_hash, window_start));
+create index if not exists submissions_state_created_idx on submissions(state, created_at desc);
+create index if not exists submissions_track_created_idx on submissions(track, created_at desc);
+create index if not exists submissions_score_idx on submissions(score_total desc);
+create index if not exists events_submission_idx on submission_events(submission_id, created_at asc);
+create index if not exists decisions_submission_idx on review_decisions(submission_id, created_at asc);
+create index if not exists blocked_reason_created_idx on blocked_attempts(reason, created_at desc);
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..53e0a16
--- /dev/null
+++ b/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@verifrax/apply-terminal-intake-control-plane",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "test": "node tests/apply-terminal-contract.test.mjs",
+ "verify": "bash scripts/verify-apply-terminal.sh"
+ }
+}
diff --git a/public/404.html b/public/404.html
index 95332b0..33e2c94 100644
--- a/public/404.html
+++ b/public/404.html
@@ -1,42 +1,3 @@
-
-
-
-
- VERIFRAX Apply
-
-
-
-
-
-
-
VERIFRAX / apply
-
VERIFRAX Apply
-
Applicant intake surface.
-
This surface accepts applicant intake only. It does not publish proof, execute verification, or issue authority.
-
-
-
Primary intake
-
Submission quality matters more than narrative volume.
This host converts untrusted human intent into structured private review signal only. It does not publish proof, verify truth, issue authority, execute governed actions, recognize terminal truth, or assign recourse.