Skip to content

docs: add accessible plain-English documentation - #4

Open
annabelgray89 wants to merge 1 commit into
mainfrom
docs/accessible-documentation
Open

docs: add accessible plain-English documentation#4
annabelgray89 wants to merge 1 commit into
mainfrom
docs/accessible-documentation

Conversation

@annabelgray89

Copy link
Copy Markdown

Summary

  • Adds a plain-English documentation file (docs/DOCUMENTATION.md) covering what Aion is, why it exists, how it fits in the Ablative Stack, getting started, and key concepts
  • Technically verified against the existing GETTING-STARTED.md — uses correct CLI commands, Gleam SDK workflow authoring, and multi-step deploy process
  • Written for developers of all experience levels — no assumed knowledge of durable execution, event sourcing, or BEAM

Test plan

  • Review content for technical accuracy against current CLI and SDK
  • Confirm it reads well for someone unfamiliar with Aion

🤖 Generated with Claude Code

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
tomWhiting force-pushed the docs/accessible-documentation branch from 79d2b34 to d6701f3 Compare August 4, 2026 07:06
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant