aster is the canonical public proving-ground destination for runx.
The repo itself now carries the operator core:
- constitutional doctrine under
doctrine/ - mutable current state under
state/ - append-only public memory under
history/andreflections/ - the separate public face under
site/ - working docs under
docs/during migration
The docs in this repo are still about aster itself:
- what
asteris trying to become - the philosophy that governs how it should behave
- how it should evolve under governance
- which live lanes are real today
- what evidence each lane should emit
The runx engine docs still belong in the runx repo. aster is the
public target, not the place where the framework API and platform model should
be documented.
aster is meant to become a repo that can improve itself gradually in
public.
The story is not "an autonomous agent that silently rewrites itself."
The story is:
runxinspectsasterrunxproposes bounded changes and public updates- humans approve the next safe mutation
asterimproves gradually, with receipts
That means the repo should accumulate a visible evolutionary trail:
- issues that get triaged instead of ignored
- bounded issues that become draft PRs
- PRs that receive operator-grade comments
- new skills that begin as proposals before they become automation
- docs that explain the current system honestly, including its gaps
The governing philosophy is:
- legibility over spectacle
- bounded action over vague autonomy
- receipts over claims
- governed evolution over hidden self-modification
aster now has seven concrete live lanes:
issue-triage: covers both issue intake and PR review. Issues run throughsupport-triage, can openobjective-decomposewhen planning is approved, and only then start one or more repo-scopedissue-to-prworkers when build is approved. The work issue is the living ledger: trusted maintainer replies retrigger the lane, the rolling triage comment updates in place, and PR snapshots still run throughgithub-triage, pass replay/public gates, and publish one high-signal maintainer comment back onto the PRfix-pr: runs one bounded bugfix request through the governed PR runner, validates the target repo with its declared verification profile, reruns from trusted replies on[fix]work issues, and refreshes a draftrunx/*PR only after that same issue authorizesfix-pr.publishdocs-pr: runs one bounded docs or explanation request through the same governed PR runner, keeps the request docs-only, reruns from trusted replies on[docs]work issues, and refreshes a draftrunx/*PR only after that same issue authorizesdocs-pr.publishskill-lab: a skill proposal issue runs throughobjective-to-skill, materializes a proposal indocs/skill-proposals/, keeps one rolling machine comment attached to the same issue ledger, and refreshes one draft PR only after the same work issue authorizesskill-lab.publishskill-upstream: prepares and validates a portable upstreamSKILL.mdcontribution packet, reruns from trusted replies on[upstream]work issues, keeps the proposal state on one work issue ledger, and can open a draft PR against the target repo only after that same thread authorizesskill-upstream.publishmerge-watch: observes upstream contribution state and emits public proof when the status changesproving-ground: keeps a draft-first receipt trail for the broader catalog
Support workflows stay valuable even when the external caller is offline:
site-pages: builds and deploysaster.runx.aifrom repo-owned operator contentgenerated-pr-policy: enforces draft-only plus human-review policy on generatedrunx/*PRsrollback: posts corrective comments or closes generated PRs when a public output needs to be superseded
aster needs only a small hosted secret surface:
OPENAI_API_KEY: external caller forrunxagent-stepboundariesRUNX_CALLER_MODEL(optional): pinned model override for the hosted bridgeRUNX_REF(repo variable): optionalrunxbranch or tag for hosted checkouts; defaults tomainRUNX_REPOSITORY_PAT(optional): GitHub token for privaterunxcheckout and other cross-repo automation. The repo-scopedgithub.tokenis enough for same-repo workers; fanout into other repos needs broader access.
Without OPENAI_API_KEY, the mutation-capable lanes stay intentionally idle and
the draft-first observability lanes continue to run.
- docs/introduction.md: what
asteris trying to prove - docs/philosophy.md: the doctrine behind the repo's behavior and safety boundaries
- docs/architecture.md: the full-shape plan, ownership boundary, memory model, and site topology
- doctrine/ASTER.md: the public thesis
- doctrine/MISSION.md: what kinds of actions most
strongly prove the
runxruntime thesis in public - doctrine/EXAMPLES.md: concrete good, bad, and
no_opexamples for public action - doctrine/CONDUCT.md: how the operator should treat people and attention
- doctrine/VOICE.md: how public GitHub interaction should sound
- doctrine/EPISTEMOLOGY.md: what counts as truth and how memory stays subordinate to receipts
- doctrine/AUTHORITY.md: what the operator may do, what requires review, and what is forbidden
- doctrine/EVOLUTION.md: the permitted order of improvement
- state/priorities.md: current operator priorities
- state/capabilities.md: current strengths, limits, and trust posture
- state/selection-policy.json: machine-readable weights, thresholds, cooldowns, and selection contract
- history/: append-only public evolutionary record
- reflections/: append-only diagnosis and interpretation layer
- site/: Astro source for
aster.runx.ai - docs/evolution.md: the intended evolutionary path
- docs/operating-model.md: the governance model for gradual self-improvement
- docs/llm-training-spec.md: the selector and
labeling contract for
astertraining rows - docs/run-catalog.md: each hosted lane, trigger, and emitted artifact
- docs/backlog.md: the next bounded improvements worth pursuing
- docs/sourcey.config.ts: Sourcey config for the optional working-docs surface
- scripts/build-aster-context.mjs: assembles doctrine, state, history, reflections, and artifact signals into a bounded context bundle before the bridge calls the model
- scripts/aster-cycle.mjs: the learned selector,
durable control-state writer, and selector-training-row emitter for
prerelease
v1 - scripts/aster-core.mjs: the unified lane runtime that assembles context, invokes the bridge, and writes promotion drafts
- scripts/promote-aster-state.mjs: materializes reflection/history draft packets from completed lane runs
- scripts/apply-aster-promotions.mjs:
applies promotion drafts back into repo-owned
history/,reflections/, and target dossier recent-outcomes sections - scripts/derive-evidence-projections.mjs: rebuilds repo-owned memory projections from uploaded workflow artifacts and keeps them on one rolling draft PR
- scripts/runx-agent-bridge.mjs: external
caller that answers
runxagent-steprequests without internal shortcuts - scripts/prepare-issue-triage-decision.mjs:
converts a
support-triageresult into one explicit triage decision plus optional planning and worker requests - scripts/run-issue-triage-plan.mjs:
runs
objective-decomposewhen the triage approves planning and appends a phased plan summary to the issue comment - scripts/run-issue-triage-workers.mjs:
executes one or more isolated
issue-to-prworkers and publishes the resulting draft PRs - scripts/run-governed-pr-lane.mjs:
reusable governed draft-PR runner for
fix-pranddocs-pr - scripts/publish-runx-pr.mjs: reusable draft PR publisher for generated repo changes
- scripts/operator-shakeout.mjs: local shakeout for replay guard, PR policy, rollback, evidence routing, and the governed PR lanes
For the public face and repo-owned operator state:
npm run check
npm run shakeout:local
npm --prefix site install
npm run site:buildIf you are touching the optional working-docs surface as well:
npm run docs:buildRun the live proving-ground lane locally from this repo:
RUNX_ROOT=/home/kam/dev/runx bash scripts/proving-ground.sh
node scripts/summarize-proving-ground.mjs .artifacts/proving-groundRun a real runx lane through the external caller bridge:
OPENAI_API_KEY=... \
RUNX_ROOT=/home/kam/dev/runx \
node scripts/runx-agent-bridge.mjs \
--runx-root /home/kam/dev/runx \
--receipt-dir .artifacts/issue-triage/manual \
-- \
skill /home/kam/dev/runx/oss/skills/support-triage \
--title "Example bounded issue" \
--body "Describe the concrete repo problem here." \
--source github_issue \
--source_id 1 \
--source_url https://github.com/nilstate/aster/issues/1If you have prerecorded caller answers for a given proving-ground run, place
one JSON file per run name in $RUNX_ANSWERS_DIR:
$RUNX_ANSWERS_DIR/
evolve-introspect.json
sourcey.json
content-pipeline.json
The script will pick those up automatically and continue past the normal
needs_resolution boundary for that run.