root 86123fce4c gateway: /v1/validate endpoint — Phase 43 v3 part 2
Closes the Phase 43 PRD's "any caller can validate" surface. The
validator crate (FillValidator + EmailValidator + PlaybookValidator
+ WorkerLookup) is now reachable over HTTP at /v1/validate.

Request/response:
  POST /v1/validate
    {"kind":"fill"|"email"|"playbook", "artifact":{...}, "context":{...}?}
  → 200 + Report on success
  → 422 + ValidationError on validation failure
  → 400 on bad kind

Boot-time wiring (main.rs):
- Load workers_500k.parquet into a shared Arc<dyn WorkerLookup>
- Path overridable via LH_WORKERS_PARQUET env
- Missing file: warn + fall back to empty InMemoryWorkerLookup so the
  endpoint stays live (validators just fail Consistency on every
  worker-existence check, which is the correct behavior when the
  roster isn't configured)
- Boot log line: "workers parquet loaded from <path>" or
  "workers parquet at <path> not found"
- Live boot timing: 500K rows loaded in ~1.4s

V1State gains `validate_workers: Arc<dyn validator::WorkerLookup>`.
The `_context` JSON key is auto-injected from `request.context` so
callers can either embed `_context` directly in `artifact` or split
it cleanly via the `context` field.

Verified live (gateway + 500K worker snapshot):
  POST {kind:"fill", phantom W-FAKE-99999}    → 422 Consistency
                                                 ("does not exist in
                                                  worker roster")
  POST {kind:"fill", real W-1, "Anyone"}      → 200 OK + Warning
                                                 ("differs from
                                                  roster name 'Donald
                                                  Green'")
  POST {kind:"email", body has 123-45-6789}   → 422 Policy ("SSN-
                                                shaped sequence")
  POST {kind:"nonsense"}                       → 400 Bad Request

The "0→85% with iteration" thesis can now run end-to-end on real
staffing data: an executor emits a fill_proposal, posts to
/v1/validate, gets a structured ValidationError on phantom IDs or
inactive workers, observer-corrects, retries. Closure of that loop
in a scrum harness is the next commit (separate scope).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 07:40:27 -05:00
2026-04-22 02:41:15 -05:00
2026-03-27 05:54:09 -05:00
2026-04-22 02:41:15 -05:00
Description
Rust-first object storage system
6.3 GiB
Languages
TypeScript 38.4%
Rust 35.8%
HTML 13.9%
Python 7.8%
Shell 2.1%
Other 2%