SEAL
Documentation.
Havoc and Longhaul · synthetic · public anchors · not Army program data
Start with Havoc. It is the same desk the product uses, locked to a published synthetic pack with public anchors.
- Read the brief in Ask. It is an email with three candidates, five objectives, two hard limits, one soft target, three assumptions, and three risks.
- Open Elicit. Every candidate carries a confidence and a locator back to its sentence. Accept, edit, or reject. Rejected objects never enter the run.
- Open Graph. Select the chassis standard node and read the public anchor with its hash and URL.
- Open Plan. Change a weight so the sum is not 1000. Run stays disabled until you fix it.
- Run. The 8x8 fails the gross-weight constraint and is ranked last. Its electrical-power cell is blank because no accepted source states the figure.
- Run again. The hash is identical and the desk says so.
- Open Flip. Read the protection-weight threshold where the 6x6 diesel overtakes the hybrid.
- Open Ready. Two bias checks fail with numbers. One assumption is still untested. One high risk is open.
- Sign. Download the package as Markdown or JSON.
- Switch to Longhaul and open Refresh at T2, then T3. The ranking changes at T2; signature is blocked at T3 until you resolve the invalidated assumption in Ready.
Schema
Every first-class object carries an id, a label, evidence ids, and an accepted flag. Parameters that no accepted source states are null and stay unscored.
Objective { id, label, measure, direction: "min" | "max" | "target", target?, owner, evidence_ids[], accepted }
Option { id, label, name, parameters: { curb_weight_lb, gross_weight_lb, payload_lb, power_hp,
protection_level, unit_cost_usd, fielding_months, range_mi, max_speed_mph, alternator_amp },
parameter_evidence?, vendor_claim?, evidence_ids[], accepted }
Constraint { id, label, expression, kind: "hard" | "soft", lhs, op: "<=" | ">=" | "<" | ">" | "==", rhs, evidence_ids[], accepted }
Assumption { id, label, text, status: "stated" | "tested" | "invalidated", expires?, evidence_ids[], accepted }
Risk { id, label, text, likelihood 1–5, consequence 1–5, mitigation, residual 1–5, open, evidence_ids[], accepted }
BiasCheck { id, label, kind: recency | single_source | vendor_claim | untested_weight | anchoring,
metric, threshold, passed, note, evidence_ids[], accepted }
Criterion { id, parameter, direction, weight_thousandths, label, unit } // weights sum to exactly 1000
Evidence { evidence_id, source_id, quoted, locator, url?, sha256, as_of, claims? }
Episode { id, label, as_of, events[], option_overrides, assumption_status, risk_overrides?, new_evidence[] }
Flip { kind: "weight" | "parameter", criterion_id?, option_id?, parameter?, from_rank1, to_rank1, threshold, unit, sentence }
Readiness { score 0–100, coverage, assumptions_tested, open_high_risks, bias_passed, bias_total, evidence_age_days, blockers[] }
Run { run_id, pack, episode_id, schema_hash, weight_hash, evidence_hash, run_hash, scores[], ranking[], flips[], readiness, generated_utc }
Package { package_id, run, recommendation, open_risks[], signer, signed_at, status: "draft" | "signed", package_hash, markdown }Scoring
Per criterion, values are min-max normalized across the feasible options in the criterion's direction, then multiplied by the weight in thousandths. Totals are the sum of scored terms; a total with a blank cell is marked partial. Hard-constraint failures make an option infeasible: it is scored against the feasible range, flagged, and ranked after every feasible option. Soft-constraint failures are noted.
Flips move one weight at a time in integer steps, rescaling the others so the sum stays 1000, and one parameter at a time by bisection inside a public-anchor range. The threshold is the first grid value where rank 1 changes. Ties are not flips.
Readiness is 40 × coverage + 20 × share of assumptions tested + 20 × share of bias checks passed + 20 × (1 − min(open high risks, 2) / 2), minus 10 when the newest term evidence is older than 180 days. Signature needs 70.
Package JSON
An excerpt of the Havoc draft package. The full package also carries every accepted object, the score table, and the evidence list; the Markdown rendering is the same content.
{
"package_id": "pkg-havoc-single-06661202",
"status": "draft",
"recommendation": "Recommend 6x6 hybrid. It ranks first at the locked weights with a score of 0.550, 0.100 ahead of 6x6 diesel. 8x8 diesel fails con-hv-gvw. 6x6 diesel overtakes 6x6 hybrid if the weight on protection level falls to 0.388 (now 0.450). Readiness 73/100.",
"run": {
"run_hash": "0666120260decf98bf7e406ef1b2867fdb6bb1fa0bd0a8db23ef78847f341f6d",
"schema_hash": "3d71d26c6f7cce647cf36434a480602fd48b33c6310a29edc39a89757fe8bc08",
"weight_hash": "3f09f703e0e1981b36f152e2cf1b65492938e63869ff3a51aeec16f41b6b715f",
"evidence_hash": "46855827e03663f4f5c301c0746e4e7113029eb1a92ca2690401af47b10dbbb7",
"ranking": [
"opt-6x6-hybrid",
"opt-6x6-diesel",
"opt-8x8-diesel"
],
"readiness": {
"score": 73,
"coverage": 0.933,
"assumptions_tested": 2,
"open_high_risks": 1,
"bias_passed": 3,
"bias_total": 5,
"evidence_age_days": 7,
"blockers": []
},
"flips": [
{
"kind": "weight",
"criterion_id": "crit-protection",
"from_rank1": "opt-6x6-hybrid",
"to_rank1": "opt-6x6-diesel",
"threshold": 0.388,
"unit": "weight",
"sentence": "6x6 diesel overtakes 6x6 hybrid if the weight on protection level falls to 0.388 (now 0.450)."
},
{
"kind": "weight",
"criterion_id": "crit-cost",
"from_rank1": "opt-6x6-hybrid",
"to_rank1": "opt-6x6-diesel",
"threshold": 0.274,
"unit": "weight",
"sentence": "6x6 diesel overtakes 6x6 hybrid if the weight on unit cost rises to 0.274 (now 0.200)."
}
]
},
"package_hash": "075a219433a70ad566c12ae23feaf3f2292a67fbb6a1c29c2d90a5915a328d39"
}API
GET /api/seal/health
{
"product": "SEAL",
"ok": true,
"packs": [
{ "slug": "havoc", "name": "Havoc", "as_of": "2026-08-14", "options": 3, "criteria": 5, "episodes": 0, "evidence": 34 },
{ "slug": "longhaul", "name": "Longhaul", "as_of": "2026-03-31", "options": 3, "criteria": 5, "episodes": 4, "evidence": 35 }
],
"checks": { "total": 20, "passed": 20 },
"generated_utc": "2026-09-11T00:00:00Z"
}The desk runs in the browser. Health is a read of the same packs and the same measured checks. Do not upload operational or export-controlled records.