Repository navigation
Conversation
The old file was a ~1,500-line per-layer record written while the codebase was being re-added layer by layer. That rebuild is done, so the file now describes the code as it stands: commands, the review rules, and the architecture that spans modules. Also drop the remaining rebuild wording from the engine docstring and two test comments. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Contributor
❌ Eval
lc statusFull trace: |
ASTRA 0.1 moves universes into astra.yaml, defines where a result and its provenance record go, and says when a record still describes the analysis. astra-tools now answers all of that through `astra.api`, so lc stops deriving it and becomes the runner only. - plan.py asks `astra.api.plan` and carries each planned result across as a picklable Task keyed by its address (`fit#baseline`, `fit` for an output built once, `stage.fit#u1` driven, `stage/fit#v1` owned by a declared analysis). Paths are measured from the project root. Results of an analysis declared with a `commit` are refused. - assets.classify asks `astra.api.check` instead of hashing recipes and inputs; lc adds only `behind` (the record names an earlier environment) and the git-history foreign-write test. - The worker writes ASTRA records under `.astra/records/`, naming the environment `urn:lightcone:env:<env_version>`, with an `astra.environments` entry point for `astra check`. A recipe runs in its own analysis's folder. The manifest keeps only what the closed record cannot hold. - A task downstream of a possible remake re-asks the checker once its upstreams have landed, so a byte-identical rebuild still stops the cascade. - Scaffold, .gitattributes (nested `results/` are annexed), the RO-Crate renderer, `lc run` input discovery, the `lc view` server routes and the docs follow. ASTRA 0.1 is not on PyPI yet: astra-tools and astra-spec are pinned to git commits. The `lc view` page still needs the 0.1 SDK, and the eval workflow is not migrated. Tests are re-expressed as 0.1 specs; test_composition.py runs the specification's own shapes (pins, imports, derived_from, when, driving) end to end. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Signed-off-by: Francois Lanusse <fr.eiffel@gmail.com>
… result The manifest held what ASTRA's closed provenance record cannot: the rendered recipe, the decisions, the git remote, the uv version, the sandbox's hermeticity attestation and the image. None of it is kept any more, so `.<name>.manifest.json`, `assets.Manifest` and the helpers that existed only to fill it (`project.uv_version`, `Runtime.manifest_image`, `Runtime.arch`) are gone, with the `.gitattributes` lines that kept manifests out of the annex. - A run commits two files per place, the bytes and the record; the foreign-write check looks at those two. - The RO-Crate takes the repository's remote as an argument, describes each run with the task's command and decisions as the spec now stands, and no longer has a ContainerImage entity. - The warning about an output the spec dropped is now raised from its orphaned record. - `/lightcone/api/run` no longer answers `recipe`. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Signed-off-by: Francois Lanusse <fr.eiffel@gmail.com>
EiffL
marked this pull request as draft
November 11, 2026 15:21
6 tasks
This branch has not been deployed
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.
Why
ASTRA 0.1 and the rebuilt astra-tools change what a spec is and who answers what. Universes live in
astra.yaml; the spec fixes where a result and its provenance record go; and astra-tools now provides the plan, the staleness checker and record-writing building blocks that lc used to implement itself. This PR makes lc the runner on top ofastra.apiand nothing more.What
Engine
plan.py): asksastra.api.planinstead of resolving the spec. A task is one planned result, keyed by its address:fit#baseline,fitfor an output built once,stage.fit#u1for a driven declared analysis,stage/fit#v1for a result that belongs to one. Paths are measured from the project root, which may sit below the repository's top. A recipe runs in its own analysis's folder.assets.py): asksastra.api.checkinstead of hashing recipes and inputs (definition_versionis gone). lc adds onlybehind(the record names an earlier environment) and the git-history foreign-write test. States staycurrent/behind/stale.worker.py): each result gets an ASTRA record under.astra/records/, naming the environmenturn:lightcone:env:<env_version>. Anastra.environmentsentry point tellsastra checkthat IRI is recreatable.hermeticityattestation and image id are no longer kept.commit, and a result owned by a nested repository, are refused with a clear error rather than built.Around it
lc initscaffolds the minimal 0.1 spec;.gitattributesalso annexes theresults/of an analysis in a folder below the project.ContainerImageentity.lc rundiscovers declared inputs throughastra.api.bind, across declared analyses.lc viewserver routes read records; the paper route serves PDFs from astra's new cache./lightcone/api/runno longer returnsrecipe.CLAUDE.mdis rewritten as a lean guide (the first commit) and updated to this model.Dependencies
ASTRA 0.1 is not on PyPI.
pyproject.tomlpins astra-tools (ecbe950) and astra-spec (7de4f21) by git, with anoverride-dependenciesentry for astra-spec.Tests
Every suite is re-expressed as 0.1 specs. Tests for what ASTRA now owns or forbids (definition hashes, directory inputs, out-of-tree inputs,
universes/*.yaml) are deleted. Newtests/test_composition.pyruns the specification's own shapes end to end: pins, an imported universe,derived_from,when, a driven analysis, and the spec's "edit → what goes stale" table.Locally: ruff and
mypyclean; 1205 passed, 1 skipped (thelc viewbrowser test, no Chromium).Known gaps in this PR
lc view's page needs the 0.1@astra-spec/sdk/@astra-spec/ui; the browser test will fail in CI until then..github/workflows/eval.ymlandevals/tasks/snae/are still 0.0.14 (astra-tools==grep,astra universe generate).recipe.container/ analysiscontainerare ignored; containerized mode is still derived from[tool.lightcone.image].Pain points against the current astra-tools
Each is something lc works around today; fixing it upstream would let the workaround go.
checkis all-or-nothing. Every call re-validates, re-plans and computes every result's status;universes=/outputs=only filter the report, and each distinct record commit is a fresh bind. lc asks once in the driver and again only in tasks downstream of a possible remake; a wide cascade still pays one full check per task._Checker._changes). This is why workers now callcheck, and so need git and the repository.plan.Resultis not picklable (decisionsis amappingproxy), so it cannot cross to a Dask worker. lc copies each result into its ownTaskand buildsRecords by hand instead of usingrecords.new_record.new_recordrehashes upstream results. lc must record the digest the upstream task reported, because on a bytes-free clone the file is an annex pointer. Another reasonnew_recordgoes unused.plan.relative).Readat a commit holds no repository and there is nofetch(read); lc refuses analyses declared with acommit.check. lc keeps its own git-history foreign-write test.checkuses stand-ins for inputs only, so an unfetched or locked annexed result readsabsent; lc ignoresbytes_status.api.bindcannot run offline, so a read-only probe may fetch remotes.astra.plan.render_command,astra.records,astra.hashing,astra.contract,astra.load,astra.sources.*andastra.cache, none of whichastra.apipromises.uv tool installignores the override, and a dev engine's recorded rerun command cannot resolve.lc viewlost titles/authors and "any cached version" lookup.api.initalso creates a git repository, so lc writesapi.MINIMALitself.same_computationis only a note. Identical results in several universes are built once per universe; nothing in the plan lets a runner share them safely.🤖 Generated with Claude Code