Xean runs a mathematical research workflow on Pi Durable. Explorer develops notes, Verifier checks their claims and dependencies, and Coordinator chooses further work. Each campaign runs Coordinator, one worker, then Coordinator again. A worker may parallelize its own internal work. Pi owns tasks, conversations, checkpoints, cancellation, and storage.
This checkout develops 3.5.0 and requires fresh campaign databases. The campaign definition format and external role interface have changed. Keep existing campaigns with their pinned runtimes. No database migration is provided. The qualification results identify the revisions and configurations tested.
The implementation includes staged verification, blind reconstruction, external trust grants, stable-ID edits, optional role backends for implementation, verification, and research, independent review, and a CLI with a shared campaign host. The capability inventory maps this behavior to implementation and tests. See the changelog for changes since 3.0.0. The FAQ covers computation, broader research goals, and current limits. The proposed milestones cover 4.0 research and computation, then 5.0 knowledge maintenance and paper writing. Further design ideas describe future work.
Models choose mathematical strategy. Xean preserves the exact task, declared dependencies, and evidence needed to check a result. Notes carry shared memory through an index, detailed summaries, and full text, including failed approaches. Pi supplies durable execution and storage. Xean keeps research policy in a small layer over Pi's native APIs.
Xean assumes a trusted operator and trusted application, dependency, replacement, and generated code. Isolation from malicious code or users is outside Xean's scope. Validation addresses model mistakes, invalid outputs, stale revisions, interrupted operations, and accidental concurrent ownership. Mathematical claims still require verification.
The native Pi Explorer continues within the same conversation so later responses can develop and revise earlier reasoning. Each successful submission publishes its notes and edits immediately. Explorer can read and edit those notes while it continues working. Coordinator waits for the worker to finish before choosing the next worker. A later worker starts a fresh conversation from the published notebook. Prompt caching can reduce repeated-context costs, while new reasoning and output still cost tokens. A valid partial submission alone does not end Explorer's invocation.
Acceptance requires checks across the complete dependency chain.
All notes share the same content and verification rules. External trust is
recorded in checks.external with a reference to the caller's Pi input entry.
It grants correctness and sources. A note becomes verified only when its
declared dependencies are verified.
Before blind reconstruction, Verifier must produce a faithful exact statement
with PASS for each note. For externally trusted notes, this checks statement
fidelity without rechecking the granted truth. Preparation follows the ordinary
retry and reassessment rules.
Blind reconstruction receives exact statements and approved premises without
the original proofs. INCONCLUSIVE remains unresolved. Model judgments can be
wrong, and independent review is recorded separately from internal acceptance.
Explorer repairs notes through edits, retaining their IDs. Each edit supplies
the expected revision and only changed fields. Retiring a note hides it from
routine discovery and preserves historical reads. Existing consumers can still
verify their retired dependencies.
Workers create notes with permanent IDs prefixed by their Pi task ID, such as
27/square-bound. They use those exact IDs
in text, dependencies, reads, and edits. Names are never rewritten at publication.
New notes require unused names. Changes to existing notes use edits.
Caller edits preserve an existing external grant unless they explicitly change
trusted. Explorer edits to mathematical fields revoke that grant. Changes to
mathematical fields, support, or trust clear affected checks. Candidate and
retirement flags only advance the revision.
Verifier may correct summaries on PASS, while proof text and dependencies change
through edits.
Explorer publication receipts also identify dependent notes whose checks were
cleared. A dependent revision can be reused when Explorer had observed its prior
revision. The receipt requires a read when intervening changes remain unseen.
Operator recheck inputs withdraw assessments for the named note revisions and
their transitive consumers. They also withdraw external grants on the named
notes. Note content and prior evidence remain in Pi's journal. Reassessment uses
the ordinary verification stages.
Coordinator receives the target IDs and withdrawal reason as guidance.
Coordinator can assign an external Verifier to reassess an INCONCLUSIVE correctness, requirements, or reconstruction check when computation or artifact access can settle the unfinished obligation. This can follow either verifier backend, and Coordinator decides whether another attempt is useful. Xean does not retry these checks automatically. PASS and FAIL assessments of unchanged inputs stay closed. Coordinator can also choose mathematical repairs, relevant source retrieval, another approach, or idle. New quotations matching a note's exact premises can reopen an eligible INCONCLUSIVE source check. Changing receipt IDs or adding unrelated quotations does not reopen it. Both verifier backends use the registered research backend for source checking. Source backend failures identify that stage and preserve completed checks. Switching verifier backend leaves the source provider unchanged.
Install Bun 1.4.2 or later on macOS or Linux. Run these commands from the source root:
bun install --production --frozen-lockfile --ignore-scriptsSet OPENAI_API_KEY in your environment, or use a saved Pi login as described
below. The example settings
use public OpenAI with gpt-6-astra and max reasoning. The default is closed-book: Explorer
and Verifier use the configured Pi models, and external source retrieval and
independent online review require an explicitly registered backend. Keep credential
values outside task and settings files.
bun run xean doctor examples/settings.json
bun run xean init examples/task.json .xean/demo/campaign.sqlite examples/settings.json
bun run xean run .xean/demo/campaign.sqlite
bun run xean status .xean/demo/campaign.sqliteinit freezes the task and settings without model calls. doctor checks local Pi setup without testing live providers or optional backends. run performs research.
Read the returned JSON status: a successful CLI exit can report blocked or
idle. Returning work: null leaves a campaign idle without claiming completion.
Add guidance or use resume to request another decision.
Pausing retains inputs and worker outcomes. Resume makes a fresh decision over
that accumulated state and explicitly replaces any failed decision.
Campaign arguments accept explicit paths or names under --campaign-dir, which
defaults to .xean relative to the calling directory.
The same CLI provides pause, resume, cancel, inspect [--records], and
accepted-only Markdown export. submit takes a JSON file containing notes
and optional edits. Explorer uses the same submission structure. Set
candidate: true on a note or its edit when it claims a complete solution.
guide takes a text file. recheck takes note IDs, current revisions, and a reason
for withdrawing their assessments. These commands require a stable --id for
exact retries.
With submit --id lemmas, new note IDs have the form input/lemmas/square-bound.
Use the full ID in the JSON and in references between notes in the same batch.
Use guide for short steering instructions and submit for initial notes or
reference material. New caller notes default to external trust. Set a note or
edit's trusted field to false, or pass submit --untrusted for the batch, to
require ordinary verification. See guidance versus notes.
Live mutations reach the active owner.
role NAME INPUT CAMPAIGN SETTINGS runs a standalone procedure. Use role review
with a JSON input containing task and argument for independent review. The
FAQ includes edit and review examples. Use
--help for arguments and owner, credential, and usage-attribution options.
Settings use native Pi profiles for OpenAI, openai-codex,
Anthropic, and Google, with per-role overrides. Custom Responses gateways use
openai with baseUrl and an explicit apiKeyEnv or --key-stdin credential.
This keeps saved subscription credentials on their native provider route.
For a custom CA, set NODE_EXTRA_CA_CERTS to its PEM
certificate bundle.
For ChatGPT or Claude subscriptions, start the bundled Pi CLI with
bun run pi, enter /login, and select OpenAI or Anthropic. Set the Xean
profile's provider to openai or anthropic and choose a model available to that
account. Existing OpenAI Codex logins use openai-codex instead of openai.
Xean's CLI and doctor reuse Pi's ~/.pi/agent/auth.json, including
native token refresh. PI_CODING_AGENT_DIR selects another Pi directory for both
commands. Explicit apiKeyEnv or --key-stdin credentials take precedence.
Login and logout remain Pi commands, and Xean model selection remains in its
settings file. Codex CLI login is separate. Library callers can pass authenticated
Pi Models to open.
The supplied instance owns all configured providers and is reused by native
conversations and replacement roles.
Register external tools with a module exporting an open({ roles }) callback.
For example, save this as roles.ts in a project that depends on Xean:
import { codex } from "xean/plugins/codex";
const worker = {
model: "gpt-6-astra",
reasoning: "max" as const,
workspace: "/absolute/path/to/workspaces",
};
export default codex({
implementation: worker,
verifier: worker,
research: { model: "gpt-6-astra", reasoning: "max" },
});Install and authenticate the selected CLI separately, then pass the module when opening or resuming work:
bun run xean --roles ./roles.ts run .xean/demo/campaign.sqliteOnly explicitly supplied roles are enabled. Core installation and ordinary Pi
roles need no external CLI. Codex provides implementation, verification,
Explorer, and research adapters. The claude factory from xean/plugins/claude
provides implementation, verification, and Explorer adapters through the same
registration pattern. External Explorers receive the note index and return a single batch of
new notes per invocation. They cannot edit existing full texts through that interface.
The native Pi Explorer retains its reading, editing, and continued-submission behavior.
Claude uses its native restricted mode and requires its native shell sandbox.
Codex retains workspace-write mode for workers and read-only mode for research.
The caller's role module can instead export chatgpt({baseUrl, model}) from
xean/plugins/chatgpt to use ChatGPT Pro through the external browser service.
Run codex-chatgpt-web separately
in browser-only mode with an authenticated browser. Codex, Claude, and ChatGPT
all register through external.explorer. Other services can implement the same
ExternalCall contract. Xean validates their returned notes.
The browser adapter reuses completed Pi memos and refuses ambiguous replay of
an interrupted request. Each new Explorer invocation can make a new request.
Browser usage is unmeasured and excluded from usage reports.
Source retrieval and independent review require research. Literature additionally
requires literature: true in settings. The Codex research adapter uses native
web search with shell execution disabled. To disable Codex plugins for these
calls, use xean-research.config.toml in
CODEX_HOME and set research.profile: "xean-research" in the factory options.
Codex worker profiles are configured independently on implementation, verifier,
and explorer.
Keep the module and configuration stable across recovery. A native Pi memo rejects changes to enabled backend registrations while recovering an interrupted worker. Packaged adapters separately pin the provider and configuration of admitted calls. Custom replacement code remains responsible for its own replay behavior.
Run named campaigns under one foreground process:
bun run xean --campaign-dir .xean hostAt startup, the host opens every .xean/NAME/campaign.sqlite it can own and resumes
its saved Pi execution. This includes initialized campaigns that have not run yet.
Paused, idle, accepted, and cancelled campaigns retain their stored state. Keep only
campaigns using this runtime under that directory. An unavailable or incompatible
database is reported without stopping other campaigns.
From another terminal, attach a newly initialized campaign or detach an owned one:
bun run xean init examples/task.json second examples/settings.json
bun run xean attach second
bun run xean detach secondEach campaign retains its Pi Harness, database, and sequential workflow. The host
shares Pi's Models instance and uses the existing campaign control sockets.
pause, resume, cancel, and submissions work as before. Detach suspends unfinished
work and closes its control socket and Pi Harness. Attach recovers its committed progress.
Host restart scans the directory again, including detached campaigns. Pause a campaign
before detaching when it should remain paused on restart. SIGINT and SIGTERM close
all owned campaigns. Ordinary OS supervision can restart the foreground host.
Supply --roles, credentials, and usage overrides on host, which applies them
to every attached campaign. External CLI child processes still have their own
memory costs.
A Linux x86-64 measurement at bd1c668 with Bun 1.4.2 compared one shared
host with one host process per campaign. Total proportional resident memory
(PSS, which apportions shared pages) was:
| Campaigns | Active shared / separate | Idle shared / separate |
|---|---|---|
| 1 | 56.5 / 56.9 MiB | 58.8 / 58.8 MiB |
| 10 | 70.5 / 399.5 MiB | 76.4 / 416.7 MiB |
| 50 | 118.1 / 1,793.1 MiB | 140.1 / 1,855.9 MiB |
| 100 | 156.2 / 3,541.0 MiB | 195.4 / 3,677.4 MiB |
These synthetic campaigns each retained a 64 KiB seed note, ran a worker waiting
on a barrier, then committed a second note. They made no provider calls or CLI
subprocesses. Provider buffers, larger notebooks, and external processes add to
these costs. Every campaign completed its worker, and ten subsequent reopen/close
cycles completed. Diagnostics remain outside the source package under
runs/issues-20-21/memory/, with results in summary-r3.json.
Every close returned to the nine-descriptor process baseline without explicit
garbage collection. In the 100-campaign shared process, memory was 135.7 MiB after
the initial close. The reopen/close series began after an explicit collection,
peaked at 139.7 MiB in its closed-state measurements, and reached 85.4 MiB after
a final explicit collection. Xean leaves collection to Bun. The native
Bun SQLite connection finalizes statements on close, while Pi retains ownership
of SQL transactions and durable state. An earlier node:sqlite comparison
retained database handles until collection. The thin driver facade fixes that
cleanup behavior without another Pi patch.
The public entry point, xean, supplies the default setup through
open, which returns the native Harness, root Conversation, workflow, and close.
For custom roles, import xean/core and call createResearch(roles) when assembling
your own native Pi Harness, registry, models, and storage. Core contains the
sequential workflow, note publication, dependency and verification rules, and role
contracts. It records role settings as JSON and runs without the bundled roles,
CLI, or adapters.
xean/roles exports createRoles for the bundled prompts, conversations, and
verification strategy, plus selectBatch for capacity-based grouping with caller-supplied
inputs and output estimates. xean/report supplies status and reports. The ordinary
open setup validates settings for the bundled roles and accepts native Pi models
and a roles callback that receives the built-in functions. Coordinator returns
one work request, or work: null to become idle. Replacement roles follow the
same sequential outer loop. Register custom Research
through that callback's external.research field. Register custom tools and tasks
through Pi's native registry option.
Coordinator supplies an assignment to Explorer, Literature, and implementation. Caller
guidance remains campaign input for Coordinator.
Explorer assignments identify relevant note IDs and the remaining gap in the
complete task, so later workers can continue from published work.
With a verifier backend registered, Coordinator can request
{kind: "verifier", backend: "external", notes: [noteId], through: "correctness"}.
The same selection supports source, requirements, and reconstruction stages.
Omitting backend selects the native Verifier. External Verifiers judge PASS, FAIL, or
INCONCLUSIVE under the same dependency, stage, and acceptance rules. The packaged
Codex and Claude backends run checks and independent proofs in fresh retained
workspaces and record execution receipts and artifact paths. Source checks still use the research backend.
External blind reconstruction receives only the task, exact statements, and approved
support and premises. Instructions forbid reading original proofs, campaign transcripts,
or other workspaces. This boundary relies on instruction compliance, not hostile
code isolation.
Call open for separate databases to run several campaigns in one process.
Pass the same Pi models instance to share its provider registry. Each campaign
keeps its own Harness and sequential workflow. The CLI exposes this through host, attach, and detach.
Notes store summary, detailedSummary, and authoritative free-form text.
The text can record proofs, conjectures, observations, questions, or failed
approaches. Correctness records a separate nullable statement for later
verification. Without external trust, notes with no mathematical claim remain
unverified context. The note reader includes the existing checked statement.
Explorer and Verifier
use it to distinguish granted support from additional facts that need a proof
or a separate supporting lemma.
Explorer continues its Pi conversation after partial submissions. A claimed complete solution, an empty notes-and-edits submission, or reaching the response allowance ends the invocation. Submission returns published note IDs and current revisions for subsequent reads and edits. Explorer reads the current notebook. Stale edits and dependencies changed since Explorer observed them are rejected. Each publication and its replay receipt commit together in Pi. Recovery returns the saved receipt without publishing twice. Previously committed batches remain published after a later failure or cancellation. Worker completion records publication references without submitting the notes again.
Standalone Explorer uses the same notebook tools. Supplied notes retain their IDs, external grants, and recorded checks, with new revisions assigned by Pi. Their checks refer to immutable input evidence. External Explorers and replacement roles returning a batch retain publication on completion.
The native Pi Explorer defaults to eight completed responses and up to four note-read calls, including reads of its own published notes when the notebook starts empty. Each read can request several notes. Reads and rejected submissions consume responses, and reading is disabled on the final response. These are ceilings, not a minimum amount of exploration.
Other native Pi role conversations allow up to sixteen completed responses. Coordinator allows up to four note-read calls. Responses with reads or rejected submissions count toward the limit. Incomplete responses do not. Admitted reads also count across recovery.
Output limits (max_messages or max_output_tokens) and retryable provider
failures with reusable text, reasoning, or tool arguments continue the same
submission automatically. Continuations have no fixed count. Pi retains the raw
response and schedules its continuation atomically. Unfinished tool arguments
become unexecuted draft text. Incomplete tools never execute. Empty limit responses
fail explicitly. Retryable failures without reusable output use Pi's bounded
retry policy and backoff. Authentication, quota, invalid-request failures, context
overflow, and cancellation retain their existing handling. Context and
completed-response limits still apply, with operational handoffs to Coordinator.
Native correctness and requirements checks also use selectBatch, with each group
receiving its declared support and relevant source records. Earlier judgments
update later groups, and refuted dependencies skip their later consumers.
Blind reconstruction assigns batches in dependency order. External verification reconstructs
one note per call. Native verification greedily packs notes using original text
lengths, Pi's token estimator, and the configured model's context and output
capacities. It reserves space for complete writing,
reasoning, structured results, and headroom. Comparisons use the actual returned
proof lengths and may need smaller batches. Each call must submit every assigned
note. These estimates guide grouping and do not cap responses or guarantee that
a proof fits. An oversized note is assigned alone, subject to Pi's input guard.
Pi checks context use and the provider guard reserves the full output allowance.
Native roles use Pi's model catalog for context and output limits. The packaged
catalog corrects OpenAI entries that used a pricing threshold as context
capacity. For example,
openai/gpt-6.1-sol
has a 1,050,000-token context window and a 128,000-token output limit. Pi's
4,096-token safety margin leaves 917,904 estimated input tokens with the full
output allowance. Higher pricing above 272,000 input tokens remains in effect.
Caller-supplied Models retain their own capacity metadata.
Pi reuses committed proofs and comparisons after reopening, and an ordinary failure retains earlier completed checks. If an unresolved generated claim supports a later proof group, Verifier finishes the current group's comparisons and returns its checks. Coordinator then chooses a mathematical repair or other work. Further worker admissions use the existing outer round allowance.
The model-free example supplies scripted roles and prints the resulting campaign status without provider credentials. Its fixed judgments demonstrate the workflow, not mathematical performance. From the package root, give it a new database path:
bun examples/model-free.ts .xean/scripted/campaign.sqliteimport { BACKGROUND_CONTEXT as context } from "@earendil-works/chord/context";
import { defaultSettings, inspect, open, readReport } from "xean";
const path = "campaign.sqlite";
const owner = await open(path, {
create: {
task: {
problem: "For every real x >= 1, prove x squared >= x.",
completionCriteria: "Give a self-contained elementary proof.",
},
settings: defaultSettings,
},
});
try {
await owner.root.waitForIdle(context);
} finally {
await owner.close();
}
console.log((await inspect(path, readReport)).status);The host uses Pi's SQLite storage and transaction queue with Bun's native SQLite
driver, FULL synchronization, and exclusive ownership. A small adapter normalizes
the driver interface. Bun tracks prepared statements and finalizes them on close,
so releasing database handles does not depend on garbage collection. This uses
Pi's existing adapter without another Pi patch.
A rewindable Pi catalog and per-note body Documents hold the
current notebook. Native submissions and outcomes retain execution receipts.
Workers receive a notebook snapshot at their admission cutoff. Explorer reads
its current notebook after each durable submission.
inspect uses a read-only Pi Session and holds a SQLite read transaction.
Pi rejects writes from inspection callbacks. Acceptance atomically checks the
current dependency closure and pins its snapshot for export.
Closing suspends unfinished execution. Reopening reuses Pi's committed private
progress. A request interrupted before its answer commits may repeat.
Codex and Claude adapters share Execa process handling and Pi request receipts. Pi memoizes each completed request within its worker. Interrupted calls
restart in a fresh workspace. Source checks also retain results from custom
research implementations before later stages. The browser adapter refuses to
resend an ambiguously admitted request. The built-in Verifier preserves
structurally validated completed checks when a stage fails. Invalid submissions and faults in
opaque custom roles publish no partial results. A new Verifier reuses
applicable completed checks. Cleanup errors use Pi's nonfatal
reporting, preserving submitted results and the primary failure when a call fails.
Cancellation stops the external CLI process group and may leave usage unknown.
Detached descendants require external process containment. Implementation
artifacts remain in their workspace.
External CLI output capture allows 16 Mi decoded characters on stdout and 1 Mi on stderr.
Exceeding either limit stops the process group and records a failed call with
truncated output. Usage received before the limit remains in the receipt.
Failed calls retain their raw logs and report the provider's error message when available.
Failures also identify the operation, request and completion records, exit status
when recorded, and workspace. Coordinator receives these references in the
failure message. A missing completion record leaves execution unknown.
Xean sets Pi's documentRetentionMs to zero, releasing unobserved document
trackers after use. Watched documents remain cached until their observers detach
or the document retires. Later reads reload evicted documents from storage.
Completed roles release their provider session resources.
Agents inspect campaigns through the CLI on the campaign host:
bun run xean status .xean/demo/campaign.sqlite
bun run xean inspect .xean/demo/campaign.sqlite
bun run xean inspect .xean/demo/campaign.sqlite --records
bun run xean export .xean/demo/campaign.sqliteUse status for compact JSON with progress, failures, and verification issues.
The init, run, role, pause, resume, and cancel commands also
return compact status. These responses skip transcript accounting and full
work-history details. Use inspect for usage, full notes, checks, dependencies,
and standalone results.
Request --records only when native tasks and transcripts are needed. export
returns the accepted argument and its dependency chain from the pinned snapshot
as Markdown. status, inspect, and export read the campaign database directly
through a read-only Pi Session. Each call holds a consistent SQLite read
transaction without recovering work or calling models. Inspect historical
campaigns with their matching frozen runtime.
Retain the campaign database as the transcript record. For routine monitoring,
keep only the latest compact status. Run inspect --records on demand for
diagnostics instead of retaining repeated transcript copies.
Usage reports count committed assistant responses and recorded external CLI invocations. They cannot establish every outbound request or provider retry. Missing native usage remains unknown. Process health, internal acceptance, and independent review are separate observations.
The Codex factory's usagePrefix supplies XEAN_CODEX_USAGE_TAG to Codex. A custom provider's native
configuration can forward it as an HTTP header for usage attribution.
bounded-solve.ts reads task.json and settings.json
from a run directory, with --round-limit TOTAL, --resume, and closed-book
--offline options. A round is a Coordinator decision that admits one worker,
including a Verifier. Empty waits and internal proof or comparison calls add
no rounds. The count derives from Pi's worker records and remains outside model
inputs. Response and usage counters remain observational.
For prompt checks, prepare a role input and run the ordinary standalone command:
bun run xean role verifier input.json campaign.sqlite settings.jsonUse a fresh campaign path for each case and keep expected answers outside the input.
Pi stores the task, role input, and settings in the campaign. Standalone
verifier and reconstruct inputs also accept backend: "external" with
a verifier backend registered through --roles.
Install development dependencies to run checks and create a source archive:
bun install --frozen-lockfile --ignore-scripts
bun run check
bun run packStart interface changes with focused contract tests and model behavior changes
with small standalone roles, using the CLI role command and frozen inputs.
Inspect their actual submissions before running a complete campaign smoke.
Use the golden problems after those checks pass.
During development, run a selected test file with
bun scripts/dev.ts test ./tests/apps.test.ts. Use
bun run check ./tests/apps.test.ts to include types and formatting. Keep the ./ prefix so Bun treats the argument as a file path.
Run the full check and pack when the change is ready for release.
check runs TypeScript, formatting, and scripted tests.
check:distribution checks an unpacked source archive with production dependencies,
including the Pi and role contract tests, model-free workflow, CLI inspection
and export, and licenses.
pack runs the same distribution check and writes the source archive under
dist/. Use check:distribution when you need that check without retaining an
archive. Running both commands on unchanged code repeats the packaged checks.
Tests cover mathematical validation, notebook publication, role protocols, workflow recovery, provider adapters, and CLI processes. Pure validation uses direct calls. Role tests use Pi's in-memory storage unless they need persistence. Reopening and crash tests use durable storage, and process tests retain actual subprocesses. Scripted model replies exercise protocol behavior. Research quality requires separate model experiments.
Keep each test tied to a failure it can detect. Assert observable results and preserved data instead of exact prompt sentences. Share repeated setup while keeping scenario actions and expectations in the test. Preserve distinct publication, cancellation, and recovery boundaries when consolidating cases.
The current checks qualify fresh databases only. Historical campaigns remain pinned to their recorded runtimes. Transfer of an in-flight model generation remains unqualified.
The 3.4.0 local checks passed 259 tests and 2,533 assertions. The unpacked source archive passed 97 tests and 1,257 assertions under Bun 1.4.2. A Linux ARM64 package smoke also passed the focused protocol tests and a model-free campaign. These checks use scripted providers. Live campaign qualification remains pending.
The 3.2.0 qualification passed 213 scripted tests and 2,044 assertions on each
tested platform: macOS ARM64 with Bun 1.4.3, and Linux ARM64 and x86-64 with
Bun 1.4.2. Source-distribution checks also passed 66 Pi and role tests.
A live Codex CLI implementation screen with gpt-5.6-luna at low reasoning
passed strict-schema handling and independent execution of the generated artifact.
The completed role reopened without credentials or new calls. This live check
covered one standalone implementation role. Full-campaign qualifications below
retain their original revisions.
The 3.1.0 qualification passed 203 scripted tests on fresh production installs on macOS ARM64, Linux ARM64, and Linux x86-64 with Bun 1.4.2 and no provider credentials. The x86-64 suite used tmpfs. On Btrfs, 26 tests exceeded the default five-second timeout. With longer allowances, all cases passed across a full run and an isolated rerun. Sixteen additional SQLite cases passed crash recovery, writer exclusion, dependency invalidation, and unchanged-INCONCLUSIVE checks.
The 3.1.0 native-provider smoke passed note reading, an elementary campaign,
and credential-free reopening with a saved Pi OpenAI Codex login and
openai-codex/gpt-5.6-luna at max reasoning. At the release qualification
snapshot, two of six fresh gpt-6-astra/max golden campaigns through
codex-lb's OpenAI /v1 route and SSE had passed internal acceptance,
independent review, and credential-free reopening.
The other four remained in progress. These are model-based assessments.
Qualification receipts remain under runs/release-3.1.0-qualification-20261010/
and runs/release-3.1.0-golden-20261010-r01/, outside the source package.
Explorer publication after provider failures and Codex error reporting have contract-test coverage. The live qualifications below used earlier revisions.
At revision 0e74fc7, all six sequential golden campaigns reached internal
acceptance and independent PASS review, then reopened without credentials.
Standalone verification also reconstructed a dependency chain and rejected a
false claim. These runs used gpt-6-astra with max reasoning through codex-lb's
OpenAI /v1 route and SSE. They qualify that gateway configuration, not public
OpenAI or Pi's subscription openai-codex transport. Source checking recorded
web activity without a directly observed source-open operation. Receipts and the
golden report are in runs/golden-sequential-20261006-r04/.
Release checks at e40b85e passed installed CLI use of a saved Pi OpenAI Codex
login, note reading, complete verification, and credential-free reopening with
openai-codex/gpt-5.6-luna at max reasoning. Gateway checks reconstructed a valid
proof chain, rejected invalid arguments, and left a claimless note INCONCLUSIVE.
Process tests covered live controls, writer exclusion, interrupted private work,
completed-result recovery, and dependency-complete export.
Public OpenAI, the new direct OpenAI subscription login, fresh login, OAuth
refresh, Anthropic, and Google remain unqualified live. Available credentials
covered only the gateway and existing OpenAI Codex login for those native-provider
checks.
Literature retrieval passed with independently checked quotations.
At e40b85e, the implementation worker passed on native macOS, including
independent artifact checks and credential-free reopening. At that revision, the
tested Linux container could not create Codex's sandbox namespace. Container
execution depends on the host's sandbox configuration.
Receipts are under runs/release-3.0.0-qualification-20261008/, outside the source
package.
Pi packages are built from unreleased upstream commit
301617df7b88951c328f8a7b6a732e590713df07, after the 1.2.0 release.
They retain the existing frozen model catalog, including the OpenAI/Azure
context-capacity correction, and all existing Xean patches.
Artifact and patch hashes are recorded in provenance.
Pi integration records each retained patch,
including the adapter fixes, the request hook used to select a profile's stream,
and read-only SQLite inspection.
This is an MIT-licensed source package. Bun and provider access suffice
for the core workflow. Fleet, Nix, and private Xean Lab are not required for installation.