Sync docs and Claude skills with v0.4.0 - #165
Conversation
v0.4.0 shipped the JupyterHub-on-GCP backend and the MyST report scaffold without touching claude/lightcone/ or most of docs/. This brings both back on par with the code. Skills — several carried instructions that actively broke agent runs: - figure-comparison and lc-from-paper/references/compare.md searched for results at a flat results/<universe>/<output>.<ext>; outputs are directories containing the artifact plus .lightcone-manifest.json, so every comparison would have failed to find its file. - figure-comparison keyed off work/reference/metadata.json, a Docling intermediate that only exists on the PDF fallback path; the canonical index is index.json. - lc-from-paper/references/run.md invented status states (pending, no_recipe) and a per-output .log file that is never written. - lc-from-paper/references/architect.md shipped a stub astra.yaml that failed the astra validate gate the same file imposes. - lc-from-paper/references/implement.md documented a --universe auto-injection convention that does not exist. - lc-feedback probed astra.__version__, which a namespace package never has, so it always reported n/a. - session-start.sh still advertised the removed ASTRA narrative field in every session's primer. Skills also gained v0.4.0 coverage: the kubernetes runtime and Cloud Build path, Dask Gateway detection and the one-image-per-run constraint, and the MyST report scaffold. Docs — documented the new functionality (report scaffold, Gateway branch, pre-flight image builds, COPY/ADD source hashing, worker_image), corrected pages that contradicted the code (site_registry was described as orphaned while being central; runner.md was a tombstone for a live module; .lightcone/lightcone.yaml was described as unread), fixed the lc eval install instructions, added scratch/wrroc/eval pages, and cleared the orphaned docs/hpc section whose content was redundant with user/cluster.md and told readers to run the removed lc setup. Adds CHANGELOG.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
❌ Eval Results
GradersNo grader results Full output |
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
lightcone-cli | 3d64746 | Commit Preview URL Branch Preview URL |
Jul 29 2026, 04:48 PM |
| Ask the user via `AskUserQuestion` whether they want the claim audit. It's optional because for many reproductions the figure-comparison already settles "did it match?"; the sentence-by-sentence audit earns its keep when the paper makes many specific quantitative claims and the user wants each one anchored to a code location. | ||
|
|
||
| If yes, invoke `/check-sentence-by-sentence`. Same discipline as `/figure-comparison` — it can prompt the user; do not spawn under `Task` or inside a ralph iteration. | ||
| If yes, ask the user to run `/check-sentence-by-sentence` themselves — that skill is user-invoked by design and should not be launched from here. Same discipline as `/figure-comparison` once it runs: it can prompt the user, so it belongs in the main session, never under `Task` or inside a ralph iteration. |
There was a problem hiding this comment.
this is also said just above on L43, i think it's over-repetitive but this whole skill needs to be reworked so i think it's fine for now
cailmdaley
left a comment
There was a problem hiding this comment.
i think this is an improvement on the existing state, although i'm still concerned that it's not quite up to our standard of quality. some nits, the final one is the most major
| ``` | ||
|
|
||
| Set `container:` at analysis level (all recipes inherit); per-recipe `container:` overrides. Pass either a container image name (e.g., `python:3.12-slim`, `ghcr.io/org/img:latest`) or a path to a Containerfile (e.g., `Containerfile`, `containers/Dockerfile`). The runtime figures out whether to pull or build. | ||
| Set `container:` at analysis level (all recipes inherit); per-recipe `container:` overrides. Pass either a container image name (e.g., `python:3.12-slim`, `ghcr.io/org/img:latest`) or a path to a Containerfile (e.g., `Containerfile`, `containers/Dockerfile`). The runtime figures out whether to pull or build. Note: on a JupyterHub/Dask-Gateway deployment, `lc run` requires the whole run to resolve to a single container image — a spec declaring several distinct images is rejected there, so consolidate on one Containerfile (or one shared prebuilt image). |
There was a problem hiding this comment.
not sure if this is critical info
| Ask the user via `AskUserQuestion` whether they want the claim audit. It's optional because for many reproductions the figure-comparison already settles "did it match?"; the sentence-by-sentence audit earns its keep when the paper makes many specific quantitative claims and the user wants each one anchored to a code location. | ||
|
|
||
| If yes, invoke `/check-sentence-by-sentence`. Same discipline as `/figure-comparison` — it can prompt the user; do not spawn under `Task` or inside a ralph iteration. | ||
| If yes, ask the user to run `/check-sentence-by-sentence` themselves — that skill is user-invoked by design and should not be launched from here. Same discipline as `/figure-comparison` once it runs: it can prompt the user, so it belongs in the main session, never under `Task` or inside a ralph iteration. |
There was a problem hiding this comment.
this is also said just above on L43, i think it's over-repetitive but this whole skill needs to be reworked so i think it's fine for now
| ``` | ||
|
|
||
| Write extracted prior insights to astra.yaml immediately. Synthesize them by topic for the user. | ||
| Write extracted prior insights to astra.yaml immediately. The extractor's `decision_links:` block is not an ASTRA field — translate it into `insights: [...]` lists on the corresponding decision options when merging (Option.insights in `/astra`); never copy `decision_links` into astra.yaml. Synthesize the insights by topic for the user. |
There was a problem hiding this comment.
this is a band-aid, but probably we don't have time to rework the extractor agent. so probably fine for now.
| ``` | ||
|
|
||
| Then tell the user the spec is ready and they can begin implementation. Recommend running `/clear` first — the scoping conversation consumes significant context, and everything needed to continue is captured in `astra.yaml` and `CLAUDE.md`. | ||
| Then tell the user the spec is ready and they can begin implementation. Also flag that the scaffolded MyST report (`index.md`) still references the boilerplate ids (`example_method`, `main_result`) and needs updating to the new spec's element paths — the user or a follow-up session can edit it. Recommend running `/clear` first — the scoping conversation consumes significant context, and everything needed to continue is captured in `astra.yaml` and `CLAUDE.md`. |
There was a problem hiding this comment.
this is not going to be a pleasant experience for users, getting a bug report when they start a new project
There was a problem hiding this comment.
well noted, will remove this
- astra/SKILL.md: drop the JupyterHub/Dask-Gateway container note, already documented in lc-cli/SKILL.md - lc-new/SKILL.md: have Finalize actually repair index.md's dangling boilerplate references (example_method/main_result) instead of just flagging them to the user; grant Edit(index.md) accordingly - docs/skills/lc-new.md: mirror the above Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
v0.4.0 shipped the JupyterHub-on-GCP backend (#163) and the MyST report scaffold (#157) without touching
claude/lightcone/or most ofdocs/. This brings both back on par with the code.Everything here was verified behaviorally — scaffolding throwaway projects, running generated Snakefiles, and checking real
--helpoutput — rather than by reading code alone.Skills: instructions that actively broke agent runs
These are pre-existing bugs, not v0.4.0 fallout, and several would cause silent wrong behavior rather than an error:
figure-comparisonandlc-from-paper/references/compare.mdlooked for results in the wrong place. Both searched for flat files atresults/<universe>/<output>.<ext>. Outputs actually materialize as directories containing the artifact plus.lightcone-manifest.json(confirmed by running a generated Snakefile). Every comparison would have failed to locate its file and reported a mismatch.figure-comparisonread the wrong index. It keyed offwork/reference/metadata.json, a Docling intermediate that only exists on the PDF fallback path — on the primary arXiv path it is never created. The canonical index isindex.json.references/run.mdinvented a status vocabulary and a log file. It told loop iterations to reason aboutpending/no_recipe(real states:ok/stale/missing/alias, and it omittedstale— the one that matters after a spec edit) and to monitor a per-output.logthat is never written.references/architect.md's stubastra.yamlfailed theastra validategate the same file imposes. Replaced with a version iterated throughastra validateuntil clean.references/implement.mddocumented a--universeauto-injection convention that does not exist — a recipe using it raisesUnknown recipe placeholder.lc-feedbackalways reported the ASTRA version asn/a, becauseastra.__version__doesn't exist on a namespace package. Now usesastra --version.session-start.shstill advertised the removed ASTRAnarrativefield in every session's primer.Skills also gained v0.4.0 coverage: the
kubernetesruntime and Cloud Build path, Dask Gateway detection and the one-image-per-run constraint, and the MyST report scaffold.Docs
worker_image, and the new failure modes in troubleshooting.site_registry.mddescribed a now-central module as orphaned;runner.mdwas a "(removed)" tombstone for the module that forms the body of every generated rule;architecture.mdclaimed.lightcone/lightcone.yamlis never read (it is).lc evalinstall instructions, wrong in three places —pip install lightcone-cli[eval]doesn't work, sinceevalis a dependency-group, not an extra. Added adocs/cli/eval.mdpage.docs/cli/init.md, which was wrong about its own flags and about the permission tiers (/scratchand/pscratchareask, notdeny).docs/api/scratch.mdanddocs/api/wrroc.md;contributing/{backends,hpc-sites}.mdcorrected and linked into nav.docs/hpc/section: unreachable from nav, redundant withuser/cluster.md, and it told readers to runlc setup, a removed command.CHANGELOG.md.Verification
389 tests pass, ruff clean,
just docsreports no issues, every nav entry resolves, and the scaffold tree documented ininit.mdmatches a freshlc initexactly.Known issues found but deliberately not fixed
Code-level, out of scope for a docs/skills sync — worth separate issues:
claude/lightcone/templates/CLAUDE.mdis dead.lc initwrites an inline_PROJECT_CLAUDE_MD; the template is still copied to.claude/templates/, so projects carry two divergent versions.index.mdis coupled to the boilerplate idsexample_method/main_result. Every authoring skill reshapes the spec and breaks those references, andlc-newis forbidden from fixing it by its ownallowed-tools. Skills now warn the user instead.justfileeval recipes are broken (lc eval runtakes a positional config path, has no--skillflag, and--extra evaltargets a dependency-group).extract_path_bpassesarxiv_id=None, doi=Nonewhen writing the stubastra.yaml, so--doiis silently dropped on the PDF path. Looks like a real bug.lc runfails on ARM Macs — snakemake's ILP scheduler shells out to pulp's bundled x86-64 CBC binary (Bad CPU type in executable).--scheduler greedyworks.docs/skills/*.mdpages document an "Allowed tools" section for skills that declare noallowed-toolsfrontmatter — fabricated, never drifted. Needs a decision either way.manifest.SCHEMA_VERSIONis still 1 despiteworker_imageandgit_remotebeing added.One judgment call worth review
review.mdnow asks the user to run/check-sentence-by-sentencerather than invoking it, because that skill's description states other skills must not invoke it. Relaxing the skill's description instead would be an equally valid resolution.🤖 Generated with Claude Code