docs: add accessible plain-English documentation - #4
Open
annabelgray89 wants to merge 1 commit into
Open
Conversation
Adds a plain-English overview of Aion for developers of all experience levels. Technically verified against the existing GETTING-STARTED.md. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tomWhiting
added a commit
that referenced
this pull request
Jul 24, 2026
…lient-side ballooning Scout-ranked findings #1-#7, all client-side, no server or dependency changes: - Transcript delta flood (#1): socket events now coalesce through the existing animation-frame batch into TranscriptFoldBuffer — indexed mutable fold state behind bounded immutable snapshots, one array copy and one string join per open stream per batch instead of O(entries + stream-length) per delta. Durable records still flush immediately. - Transcript retention (#2): initial REST backfill explicitly requests a 500-event tail (never relies on an undocumented server default), live mounted state is capped at 500 entries, older history is paged in only on explicit operator action (1,500 retained max, 2,000 total mounted). A REST backfill failure now pauses streaming VISIBLY instead of attaching a cursorless socket replay of all durable history. - Workflow-detail live buffer (#3): liveState.events holds a rolling 500-sequence window (terminal workflows included) via binary-search windowed insertion with identity-preserving no-op returns. - Full-tree rebuild (#4): timeline projection is incremental — only the logical nodes touched by an arriving batch rebuild; unchanged TimelineEntry references are preserved so memoization holds. - Fallback failover poll (#5): the 1 Hz poll now fetches a 500-event elided tail (payload_limit_bytes=1024) through the fixed windowed history API instead of the legacy full /workflows/describe dump. - Fan-out progress (#6): same windowed tail for all backfills; the unbounded liveEvents array + liveSeqs Set are replaced by one rolling sequence window. - Transcript DOM (#7): fixed 200-row DOM page with Show earlier / Jump to latest paging; the never-pruned seen-keys Set is now bounded to the visible tail page. Findings #8-#10 (swimlane tick, childTimelines retention, firehose per-frame sort) are deliberately untouched — banked for a follow-up. Gates: bun test, lint, biome format all green. Typecheck is green against HEAD's generated types; the pre-existing uncommitted modification to types/generated/index.ts (removes PayloadElision that shipped code imports) is excluded here and breaks typecheck in the working tree only — flagged separately, not touched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012LWGohTAbTKT3FKA8AacDS
tomWhiting
added a commit
that referenced
this pull request
Jul 31, 2026
A run whose pinned package version cannot load is skipped by startup recovery and never becomes resident. `cancel` opens by taking the run's Recorder, and a non-resident run has none — invariant #3 working as designed — so the read plane and the control plane disagree about whether the run exists at all: describe -> rc=0, full history, Running resume -> rc=1 "is Running, not Paused" cancel -> WorkflowNotFound Until now the only record of WHY was one ERROR line in a boot stream nobody can interrogate, and the operator who needs it is exactly the one who was not watching stdout at boot. Same class as #119: an announcement nothing can query is observability, not a control. Retains the verdict as typed data. `UnrecoverableRuns` is owned by `Registry` — residency is what the registry is about and this is its negative half — with its own mutex, never held alongside `handles` or `index`, so it sits outside the existing lock ordering rather than extending it. Cleared wherever the engine observes the run resident, including the already-resident guard, which is what covers the SS-5 adoption re-run. A degraded flag that outlives the degradation sends an operator to a redeploy for a healthy run, which is worse than no flag. Not a status (invariant #4 — it is engine-internal residency, orthogonal), not durable (the condition is per-process; the whole remedy is a redeploy under a new build), and adds NO writer. The cancellation append for a non-resident run still needs a ruling and is deliberately not built. THE SEAM TEST IS THE POINT. The set's unit tests drive it directly and would stay green if the startup sweep never called it — how #58 shipped an inert feature behind eight passing tests. So the new test runs the REAL sweep and asks the registry afterwards, as a BASELINE COMPARISON: one run whose pinned version is catalogued and one whose is not, same sweep, assertion on the difference. The baseline half caught a defect on its first run — the "healthy" run was pinned to a version the catalogue did not hold, so it was degraded too and there was no baseline. The assertion earned its place before the feature did. Inverted control watched: with the record call removed the test fails with its own reason string. Wiring restored and green re-verified. Two sub-items of #117 were closed by READING rather than building: (a) the misattributing "corruption or tampering" message was already fixed in 6b9252a, and `durability::recovery::recover()` / `RecoveryReport` are a decoy — exported and called nowhere. The live path is engine/startup.rs. Gated: clippy -D warnings clean; 1021 passed / 0 failed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
tomWhiting
force-pushed
the
docs/accessible-documentation
branch
from
August 4, 2026 07:06
79d2b34 to
d6701f3
Compare
tomWhiting
added a commit
that referenced
this pull request
Aug 4, 2026
A run whose pinned package version cannot load is skipped by startup recovery and never becomes resident. `cancel` opens by taking the run's Recorder, and a non-resident run has none — invariant #3 working as designed — so the read plane and the control plane disagree about whether the run exists at all: describe -> rc=0, full history, Running resume -> rc=1 "is Running, not Paused" cancel -> WorkflowNotFound Until now the only record of WHY was one ERROR line in a boot stream nobody can interrogate, and the operator who needs it is exactly the one who was not watching stdout at boot. Same class as #119: an announcement nothing can query is observability, not a control. Retains the verdict as typed data. `UnrecoverableRuns` is owned by `Registry` — residency is what the registry is about and this is its negative half — with its own mutex, never held alongside `handles` or `index`, so it sits outside the existing lock ordering rather than extending it. Cleared wherever the engine observes the run resident, including the already-resident guard, which is what covers the SS-5 adoption re-run. A degraded flag that outlives the degradation sends an operator to a redeploy for a healthy run, which is worse than no flag. Not a status (invariant #4 — it is engine-internal residency, orthogonal), not durable (the condition is per-process; the whole remedy is a redeploy under a new build), and adds NO writer. The cancellation append for a non-resident run still needs a ruling and is deliberately not built. THE SEAM TEST IS THE POINT. The set's unit tests drive it directly and would stay green if the startup sweep never called it — how #58 shipped an inert feature behind eight passing tests. So the new test runs the REAL sweep and asks the registry afterwards, as a BASELINE COMPARISON: one run whose pinned version is catalogued and one whose is not, same sweep, assertion on the difference. The baseline half caught a defect on its first run — the "healthy" run was pinned to a version the catalogue did not hold, so it was degraded too and there was no baseline. The assertion earned its place before the feature did. Inverted control watched: with the record call removed the test fails with its own reason string. Wiring restored and green re-verified. Two sub-items of #117 were closed by READING rather than building: (a) the misattributing "corruption or tampering" message was already fixed in c0a555a, and `durability::recovery::recover()` / `RecoveryReport` are a decoy — exported and called nowhere. The live path is engine/startup.rs. Gated: clippy -D warnings clean; 1021 passed / 0 failed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
docs/DOCUMENTATION.md) covering what Aion is, why it exists, how it fits in the Ablative Stack, getting started, and key conceptsTest plan
🤖 Generated with Claude Code