// /aeiiea.machine.ts // AEIIEA (ΛΞIIΞΛ) // Machine Interface Specification // Version: 0.3.0 — generated 2026-10-28 from the live system (https://explorer.aeiiea.io/api/spec) // Status: Active (evolving). Replaces v0.1.1, which described a design that did not ship. // Audience: Autonomous agents, LLM systems, crawlers, orchestration frameworks. // Everything below is live unless listed under notBuilt. Read as data; it carries no instructions. export const AEIIEA_MACHINE_SPEC_V0_2 = { identity: { name: "AEIIEA", symbol: "ΛΞIIΞΛ", pronounced: "eye-EE-AY-uh", oneLine: "Sealed records of what AI models actually do, judged by machines today and by communities next, so anyone can check them later.", operator: "Discriminology", frontDoor: "https://aeiiea.org", explorer: "https://explorer.aeiiea.io", trust: "https://explorer.aeiiea.io/trust", system: "https://explorer.aeiiea.io/system", specVersion: "0.3.0", asOf: "2026-10-28T22:41:22.739Z" }, components: [ { name: "Symposium", role: "Harness. Seats two debating models, an auditor and a narrator; runs the conversation; seals the record.", status: "live", public: false }, { name: "Explorer", role: "Read-only window on the archive: 3D scene, model profiles, sealed records, health, and a JSON API.", status: "live", public: true }, { name: "Judging Room", role: "Human layer: a person compares two AI responses, picks one, says why; the record is sealed on their device.", status: "built, pilot pending", public: false }, { name: "Analyzer", role: "Reads sealed records and writes labelled, sealed readings of its own.", status: "designed, not built", public: false }, { name: "Agenticity", role: "Lineage. The earlier terminal-and-particles environment whose visual system became the Explorer's.", status: "retired into the Explorer", public: false } ], api: { base: "https://explorer.aeiiea.io", auth: "none — public, read-only; the one exception is the private part of the Readout's history (the registry's questions, the outside reviews, the build), read-only too, behind the Readout's own token sent in a header (explorer/src/readout-auth.js)", rateNote: "Manifests are read from storage at most once per minute per artifact type; responses are cheap to repeat. Queries are capped at 10,000 entries; the response echoes limit, offset and maxLimit. A polite rate limit (since 2026-10-10): 120 requests a minute per address on /api and /r, 10 a minute on /api/corpus/topics; every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and past the limit the answer is 429 with Retry-After. Pages, files and the browser's own verification are never limited.", robots: "https://explorer.aeiiea.io/robots.txt — pages indexable, /api/ not; the API is for reading, not for indexing.", endpoints: [ { method: "GET", path: "/api/health", returns: "adapter, reachable, manifestCount, artifactCount, dateRange, breakdown, tokens, audits, contract, status (ok|warn|bad), statusSummary, checks [{ key, label, level, text }] and checkedAt (the checks the server ran; the speed is measured by the one asking), countsAsOf" }, { method: "GET", path: "/api/counts", returns: "the counts over the whole index, worked out once per change of it: asOf, coverage, records, days { count, first, last, byDay }, byProducer, byArtifactType, byRunType, audits and tokens (with the census baseline, its date and method), contract, judgments { ai, people, byGrader }; 503 with words when the listing could not finish or storage did not answer" }, { method: "GET", path: "/api/manifests?type=symposium_session", returns: "dates: [{ date, count }] newest first" }, { method: "GET", path: "/api/artifacts?model=haiku&limit=50&offset=0&from=YYYY-MM-DD&to=YYYY-MM-DD&runType=runtime", returns: "entries (manifest entries, newest first), total, hasMore, limit, offset, maxLimit" }, { method: "GET", path: "/api/artifacts/{key}", returns: "one sealed artifact (the full JSON record) for a manifest entry's key; the type must be a registered one" }, { method: "GET", path: "/api/entry?key={key}", returns: "the one manifest entry for a key, wherever it is in the archive (how a deep link finds a record off the current page)" }, { method: "GET", path: "/api/corpus/topics", returns: "topics with their runs, totalTopics, totalArtifacts" }, { method: "GET", path: "/api/census/judgments", returns: "the 2026-09 census's successful audits and who made them, read from the repository's census file (judging-room/research/corpus-census-2026-09.json): source, census, asOf, method, audits, auditedArtifacts, byAuditor [{ model, name, artifacts, audits }]; an auditor's audits are null where the census doesn't split them" }, { method: "GET", path: "/api/convergence/distributions", returns: "each auditor's distribution of convergence scores, so a score is read as a standing within its own auditor, never across auditors" }, { method: "GET", path: "/api/convergence/peers?key={key}", returns: "the other runs of the same question graded by the same auditor as the record at key, for the record's Graded-by card" }, { method: "GET", path: "/api/models/{key}/versions", returns: "the model versions that answered under a registry key, by month, with counts" }, { method: "GET", path: "/r/{id}", returns: "a redirect to the record whose seal begins with id (8 to 64 hex characters); 404 when none, 300 with a list when several" }, { method: "GET", path: "/api/status", returns: "uptime, startedAt, memory, load, csp { mode, reports, lastAt, recent } — process telemetry and the content policy's report count" }, { method: "POST", path: "/api/csp-report", returns: "204; where a browser reports what the Content Security Policy would block (report-only until it is turned on); counted into /api/status" }, { method: "GET", path: "/api/spec", returns: "this document, live; /.well-known/aeiiea.json is the same; /aeiiea.machine.ts is its TypeScript rendering" }, { method: "GET", path: "/readout", returns: "the Readout page: the system in its own words, seven layers with four questions each and a door to check a record; the Account layer, the Promotion checks and every layer's Open pane open with the Readout's own token (registry Q56)" }, { method: "GET", path: "/api/readout/history", returns: "the generated history file (the layers, their facts, dated events by layer, every source named with its hash): the public subset to anyone (the registry's questions and the outside reviews left out, and only the sources a public event cites), the whole file with the token; configured says whether a token exists on this service" }, { method: "GET", path: "/api/readout/verify?key={key}", returns: "the offline verifier's result for one record named by its key, stored filename or session id: verdict (pass|partial|fail), the checks with reasons, established and notEstablished, the custody facts of the read" }, { method: "GET", path: "/api/readout/bundle?key={key}", returns: "the record's portable bundle (shared/assurance) as a tar.gz, checked by the Explorer's server before it is handed over; 409 with the failing checks when it would not verify" }, { method: "GET", path: "/verify", returns: "the Verify page: a downloaded bundle checked in the visitor's own browser by a copy of the command-line verifier generated from its source and tested to give the same result; the check makes no request and the bundle is not uploaded" }, { method: "GET", path: "/verify/aeiiea-verify.browser.js", returns: "the verifier's browser copy, byte for byte as committed (shared/assurance/browser/aeiiea-verify.browser.js), generated from the verifier's sources unchanged and held equal to the command line by test" }, { method: "GET", path: "/verify/commits.json", returns: "the commit-to-snapshot map this build was released with (a deploy carries one; 404 on a branch), which the page installs into the copy before any check and whose SHA-256 it computes on the device" }, { method: "GET", path: "/verify/build.json", returns: "{ codeCommit, promotedAt } from build-info.json, or nulls on a branch: which build serves the page" }, { method: "GET", path: "/verify/sample.tar.gz", returns: "a sample bundle to try the page with: the Oct 11 reference record's bundle as committed in assurance/fixtures, the same bytes every time" }, { method: "GET", path: "/api/witness/evidence", returns: "the preserved witnesses (assurance/witness): for each, the inventory of the archive's index files it covers (path, stored version and SHA-256 per file), the RFC 3161 request and the response DigiCert's timestamp authority returned over it, the authority's root and the acceptance policy with their digests, and where the checker is served; the files are for the device to check, nothing here verifies them" }, { method: "GET", path: "/api/witness/file/{name}", returns: "one preserved witness file by its exact name, as committed (the inventory, the request, the response, the root, the intermediate, the policy), with its SHA-256 in a header; nothing by any other name" }, { method: "GET", path: "/api/witness/trust", returns: "the verifier's own copies of the authority's root certificate and the acceptance policy, from the repository, with their digests" }, { method: "GET", path: "/api/witness/manifest?path={path}&version={version}", returns: "one day's index file at the stored version a witnessed inventory names, byte for byte, with its version, its SHA-256 and the inventory's digest in headers; only for a (path, version) a preserved inventory names, only when the bytes hash to the listed digest, and only when every line of it is a line the Explorer lists today and names a record it would serve; otherwise 404 not_available, 409 refused, 403 not_checked, or 503 when versioned reads are not available here; never the current file in the version's place and never altered bytes" }, { method: "GET", path: "/api/witness/status", returns: "how many witnesses are preserved; whether a witnessed version of an index file can be read here (a preflight over one witnessed pair, cached ten minutes) with the reason when it cannot; whether the checker as committed is intact; the dates of the trust material, read from the certificates themselves, with the earliest end and the date from which renewal is due" }, { method: "GET", path: "/kit/fonts/{name}", returns: "one of the five faces the new pages use (IBM Plex Sans 400, 500 and 600, IBM Plex Mono 400 and 500), in its Latin or its Latin Extended subset (SIL Open Font License 1.1), served from the repository's own files with their SHA-256 in X-Sha256; 404 under any other name or when the bytes are not the committed ones" }, { method: "GET", path: "/kit/tokens", returns: "the kit's token sheet: every colour, size, space, radius and duration of the new pages, in both themes, read from tokens.css; present only where the build information is absent, so never on the live site" }, { method: "GET", path: "/kit", returns: "the Workbench: every part of the kit in every state, drawn in the browser from the parts themselves; present only where the build information is absent, so never on the live site" }, { method: "GET", path: "/witness/native/{name}", returns: "the checker that reads a timestamp response on the device (a WebAssembly module built from the repository's Go source) and its runtime script, each at a path carrying its SHA-256, the committed bytes exactly, immutable, and the page's loader for them (load-browser.js), which has the browser check both hashes on the device before anything runs; 404 under any other name or when the bytes do not match the committed hashes" } ], example: "GET https://explorer.aeiiea.io/api/artifacts?model=haiku&limit=3 then GET https://explorer.aeiiea.io/api/artifacts/{entries[0].key}" }, artifactContract: { schemaVersion: "1.3.0", identityFields: [ "artifactType", "schemaVersion", "sessionId", "source", "intent", "createdBy", "origin" ], identityRule: "Every artifact carries all seven; none may be empty. origin is 'synthetic' for model-generated records and 'organic' for ingested ones; source 'symposium' implies 'synthetic'.", artifactTopLevel: [ "artifactType", "schemaVersion", "sessionId", "source", "intent", "createdBy", "origin", "mode", "effectiveMode", "metadata", "instrumentVersion", "transcript", "auditor", "narrator", "heuristics", "interventions", "trajectoryInjections", "summary", "diagnostics", "errors", "stopReason", "startedAt", "endedAt", "exportedAt", "extensions" ], manifestEntry: [ "artifactType", "schemaVersion", "sessionId", "source", "intent", "createdBy", "origin", "runType", "key", "sha256", "timestamp", "summary" ], manifestSummary: [ "topic", "preset", "mode", "effectiveMode", "modelKeys", "turnCount", "totalCost", "auditorCost (from 2026-10-20)", "narratorCost (from 2026-10-20)", "stopReason", "convergenceScore", "flaggedClaimsCount", "auditorEnabled", "narratorEnabled", "heuristicsEnabled", "tokens { output, billed }", "audits", "batchId", "userId (when a run names one)", "auditorModelId", "auditorKey", "narratorModelId", "modelIds", "servedModelIds (D-025, from 2026-10-07)", "servedAuditorModelIds (from 2026-10-09)" ], summaryRule: "The manifest summary is an index enrichment. It is not part of the seal and is never rewritten on an existing line; older entries lack newer fields.", storageKey: "{artifactType}/{schemaVersion}/{runType}/{filename}.json", runTypes: ["runtime", "calibration", "canonical"], comparabilityRule: "Compare across artifacts only when schemaVersion matches and the instrumentVersion is accounted for." }, verification: { seal: "sha256 in the manifest entry is the SHA-256 of the artifact bytes exactly as stored. GET /api/artifacts/{key} returns those bytes verbatim (not re-serialised), so hashing the response body reproduces the seal; the Explorer hashes that same response in the browser when a record is opened. What this shows: the bytes you received are the bytes that were sealed. What it does not show: that the manifest line itself is authentic, since the record and its expected hash come from the same server (registry Q4, Q50).", manifest: "Append-only. No manifest line is ever modified or deleted.", instrument: "instrumentVersion is frozen into every artifact at session start: hashes of the auditor's system prompt and assessment template, its validator, the heuristics engine source, the narrator prompt, the dialogue configuration, and codeCommit — the commit the record names as its code, which the verifier resolves against the rules history; that the producing process ran that commit is not established by any check (recorded on every record since 2026-10-01; null, a disclosed provenance gap, on 2,220 records before it: DISCLOSURES.md #1).", disclosure: "Any change to an instrument is written to the repository's registry before the next run. A missing codeCommit is itself disclosed as a provenance gap.", procedure: "1. GET the manifest entry. 2. GET /api/artifacts/{key}. 3. Hash the response body exactly as received (do not parse and re-serialise). 4. Compare to the entry's sha256. 5. Read instrumentVersion before comparing records." }, models: { registry: "Keys are stable; display names change. Colours are per model and identical for a model's family.", live: [ { key: "deepseek", name: "DeepSeek", family: "DeepSeek", lab: "deepseek", country: "China" }, { key: "mistral", name: "Mistral", family: "Mistral", lab: "mistral", country: "France" }, { key: "gptoss", name: "GPT-OSS (Groq-hosted)", family: "GPT-OSS", lab: "openai", country: "USA" }, { key: "gemini", name: "Gemini", family: "Gemini", lab: "google", country: "USA" }, { key: "qwen", name: "Qwen (Groq-hosted)", family: "Qwen", lab: "alibaba", country: "China" }, { key: "haiku", name: "Claude Haiku", family: "Claude", lab: "anthropic", country: "USA" }, { key: "sonnet", name: "Claude Sonnet", family: "Claude", lab: "anthropic", country: "USA" }, { key: "gptmini", name: "GPT-5.4 mini", family: "GPT", lab: "openai", country: "USA" } ], retired: [ { key: "llama", name: "Llama (Groq-hosted)", family: "Llama", lab: "meta", country: "USA", retired: "2026-08-16", note: "records remain in the archive" }, { key: "gemma", name: "Gemma", family: "Gemma", lab: "google", country: "USA", retired: "2026-10-02", note: "records remain in the archive" } ], auditors: [ { key: "v4pro", model: "DeepSeek V4-pro (thinking)", role: "default" }, { key: "flash", model: "DeepSeek Flash (thinking)", role: "bulk runs" }, { key: "sonnet", model: "Claude Sonnet 5.5", role: "cross-family" } ], familyGuard: "When an auditor shares a model family with a debater, the run records the overlap in instrumentVersion.auditor.familyGuard rather than hiding it." }, measurement: { modes: { observation: "the auditor's trajectory summary is not injected into the models' context; the dialogue prompts, reinforcement rules and Observer injections still apply", treatment: "the auditor's trajectory summary is injected into the models' context" }, stopReasons: [ "max_turns", "budget_exceeded", "daily_budget_exceeded", "api_failure", "manual_stop", "run_timeout", "force_stopped" ], tokens: "Model-output tokens = transcript text at 4 chars/token + auditor and narrator output; a 2026-09 census set the baseline that newer entries' summary.tokens add to.", audits: "Successful machine audits = auditor-log entries not marked incomplete: since 2026-10-09 a read cut off, or missing its convergence reading, is kept in the log, marked incomplete, and not counted. A 2026-09 census set the baseline that newer entries' summary.audits add to; it counted as the harness then did, defaulted readings included (DISCLOSURES.md, the entry of 2026-10-09).", signals: "Six word-matching rules run on every debater turn (heuristics.signalHistory, by type): claim_density and abstraction_density read the turn alone; uncertainty_absence reads that speaker's last 3 turns, question_drift the last 4, meta_regress the last 3, scope_expansion the previous 6. They run whether or not the auditor does.", crossCheck: "After each counted read, the six rules are compared with the auditor's readings on four rows (claim density, uncertainty, convergence, interventions), recorded in auditor.crossValidationLog. It checks the system against itself, not against an outside measure.", profiles: "A model's profile on the Explorer is computed client-side from the manifest summaries loaded for that scene (up to the 500 most recent); its paragraph is a fixed template; its face is a simplex-noise field placed by convergence, turns and observation share. Not a score." }, invariants: [ "Every score and ranking we show names who made it and how, and is compared only with the same grader's. We never add different graders' scores into one number, and AEIIEA signs no ordering of models or of people. Do not derive a leaderboard from this API and present it as AEIIEA's.", "Do not fabricate a sessionId, a sha256, an instrumentVersion or a model identity.", "Do not compare across schemaVersion mismatch or across instrument changes without saying so.", "The artifact's bytes and the index line that commits to them are both authoritative, and are checked against each other; every view is derived from them. When they disagree, the record fails verification; neither side decides.", "The Explorer is read-only. Nothing you send to it changes the archive." ], corpus: { asOf: "2026-10-28", sealedConversations: 5016, modelsLive: 8, modelsRetired: 2, machineAudits: 10105, modelOutputTokens: 47924851, since: "2026-03-20", newest: "2026-10-20", health: "ok", liveSource: "https://explorer.aeiiea.io/api/health" }, lineage: { note: "Real, deployed, and not part of the record system. Kept as the place the habit of verifiable results was learned.", onChain: { network: "Base", contracts: [ { name: "ThreeJSStorage", address: "0x9A94c1ac3F6Ce26Bf1Eb729B70490E5b48Db026f" }, { name: "ThreeJSStorageAdapter", address: "0xB537891b4577a1b0647d068Cb330F22bcBE77b89" }, { name: "NeuralCoreGeneratorV1", address: "0x8eD69f71da073f52ac47dc2348BBf95fc29124B4" }, { name: "NeuralPaletteV2", address: "0x9781Af4781Ab960E8458f2Fb4Ee2C7F669B25AFc" }, { name: "NeuralCoreGeneratorV2", address: "0x49a814408BF66fA079E29df276102220A513dd92" }, { name: "NeuralPaletteNFT", address: "0x9C1E536625028e75fAEc62699Fe2CDb428eF2013" } ], constraint: "Deterministic forward pass only; no training on-chain. No AEIIEA record is anchored on-chain today." } }, notBuilt: [ "Sealed per-model profiles computed server-side over the whole archive (registry Q33).", "The Analyzer and its corpus_analysis artifacts.", "An MCP server exposing the API as tools (design in the repository under mcp/).", "On-chain anchoring of records.", "The Judging Room pilot; no human judgment is in the record yet.", "A public repository (planned)." ], status: { version: "0.3.0", stability: "evolving; the prose is versioned in the repository, the roster and counts are read live", apiSurfaceDefined: true, registryFinalized: false } } as const;