Skip to content

Sync docs and Claude skills with v0.4.0 - #165

Open
aboucaud wants to merge 2 commits into
mainfrom
chore/v0.4.0-docs-skills-sync
Open

Sync docs and Claude skills with v0.4.0#165
aboucaud wants to merge 2 commits into
mainfrom
chore/v0.4.0-docs-skills-sync

Conversation

@aboucaud

Copy link
Copy Markdown
Member

v0.4.0 shipped the JupyterHub-on-GCP backend (#163) and the MyST report scaffold (#157) without touching claude/lightcone/ or most of docs/. This brings both back on par with the code.

Everything here was verified behaviorally — scaffolding throwaway projects, running generated Snakefiles, and checking real --help output — 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-comparison and lc-from-paper/references/compare.md looked for results in the wrong place. Both searched for flat files at results/<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-comparison read the wrong index. It keyed off work/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 is index.json.
  • references/run.md invented a status vocabulary and a log file. It told loop iterations to reason about pending/no_recipe (real states: ok/stale/missing/alias, and it omitted stale — the one that matters after a spec edit) and to monitor a per-output .log that is never written.
  • references/architect.md's stub astra.yaml failed the astra validate gate the same file imposes. Replaced with a version iterated through astra validate until clean.
  • references/implement.md documented a --universe auto-injection convention that does not exist — a recipe using it raises Unknown recipe placeholder.
  • lc-feedback always reported the ASTRA version as n/a, because astra.__version__ doesn't exist on a namespace package. Now uses astra --version.
  • 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 what v0.4.0 added: report scaffold, Gateway branch, pre-flight image builds, COPY/ADD source hashing (a rerun-triggering behavior change), worker_image, and the new failure modes in troubleshooting.
  • Corrected pages that contradicted the code: site_registry.md described a now-central module as orphaned; runner.md was a "(removed)" tombstone for the module that forms the body of every generated rule; architecture.md claimed .lightcone/lightcone.yaml is never read (it is).
  • Fixed lc eval install instructions, wrong in three places — pip install lightcone-cli[eval] doesn't work, since eval is a dependency-group, not an extra. Added a docs/cli/eval.md page.
  • Fixed docs/cli/init.md, which was wrong about its own flags and about the permission tiers (/scratch and /pscratch are ask, not deny).
  • New docs/api/scratch.md and docs/api/wrroc.md; contributing/{backends,hpc-sites}.md corrected and linked into nav.
  • Deleted the orphaned docs/hpc/ section: unreachable from nav, redundant with user/cluster.md, and it told readers to run lc setup, a removed command.
  • Adds CHANGELOG.md.

Verification

389 tests pass, ruff clean, just docs reports no issues, every nav entry resolves, and the scaffold tree documented in init.md matches a fresh lc init exactly.

Known issues found but deliberately not fixed

Code-level, out of scope for a docs/skills sync — worth separate issues:

  1. claude/lightcone/templates/CLAUDE.md is dead. lc init writes an inline _PROJECT_CLAUDE_MD; the template is still copied to .claude/templates/, so projects carry two divergent versions.
  2. The scaffolded index.md is coupled to the boilerplate ids example_method/main_result. Every authoring skill reshapes the spec and breaks those references, and lc-new is forbidden from fixing it by its own allowed-tools. Skills now warn the user instead.
  3. justfile eval recipes are broken (lc eval run takes a positional config path, has no --skill flag, and --extra eval targets a dependency-group).
  4. extract_path_b passes arxiv_id=None, doi=None when writing the stub astra.yaml, so --doi is silently dropped on the PDF path. Looks like a real bug.
  5. lc run fails on ARM Macs — snakemake's ILP scheduler shells out to pulp's bundled x86-64 CBC binary (Bad CPU type in executable). --scheduler greedy works.
  6. Five docs/skills/*.md pages document an "Allowed tools" section for skills that declare no allowed-tools frontmatter — fabricated, never drifted. Needs a decision either way.
  7. manifest.SCHEMA_VERSION is still 1 despite worker_image and git_remote being added.
  8. No test coverage for the plugin bundle — nothing would have caught any of the above.

One judgment call worth review

review.md now asks the user to run /check-sentence-by-sentence rather 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

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>
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

❌ Eval Results

Metric Value
Score 0.00
Build complete
Cost $0.00
Turns 0
Duration 0s
lightcone-cli 0.4.1.dev3+geb5dfeb36 (eb5dfeb3)
Results Download

Graders

No grader results

Full output
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/lightcone-cli/lightcone-cli/.venv/lib/python3.12/site-packages/daytona_api_client/exceptions.py", line 148, in from_response
    raise ForbiddenException(http_resp=http_resp, body=body, data=data)
daytona_api_client.exceptions.ForbiddenException: (403)
Reason: Forbidden
HTTP response headers: HTTPHeaderDict({'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '155', 'Connection': 'keep-alive', 'Date': 'Wed, 29 Jul 2026 16:47:13 GMT', 'ETag': 'W/"9b-V/Xx4rzMDKb4+HQZfsZxuOJaFW8"', 'X-Powered-By': 'Express', 'Vary': 'Origin', 'X-Daytona-Api-Version': 'v0.202.0', 'X-RateLimit-Limit-sandbox-create': '600', 'X-RateLimit-Remaining-sandbox-create': '599', 'X-RateLimit-Reset-sandbox-create': '60', 'X-Cache': 'Error from cloudfront', 'Via': '1.1 e7c1fac5920ba451129493421444f012.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'IAD61-P5', 'X-Amz-Cf-Id': 'O8LfzK6FZHg5ILXf0HFxK6_bjZKW123JlpToBb6gwpStrKJHADrt0w==', 'X-Frame-Options': 'DENY', 'Referrer-Policy': 'strict-origin-when-cross-origin', 'Content-Security-Policy': "frame-ancestors 'none'", 'X-Content-Type-Options': 'nosniff', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload'})
HTTP response body: {"path":"/api/sandbox","timestamp":"2026-07-29T16:47:13.182Z","statusCode":403,"error":"Forbidden","message":"Organization is suspended: Depleted credits"}


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/lightcone-cli/lightcone-cli/src/lightcone/eval/harness.py", line 112, in run_trial
    sandbox.create()
  File "/home/runner/work/lightcone-cli/lightcone-cli/src/lightcone/eval/sandbox.py", line 149, in create
    self._sandbox = self._daytona.create(
                    ^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/lightcone-cli/lightcone-cli/.venv/lib/python3.12/site-packages/daytona_sdk/_utils/errors.py", line 224, in sync_wrapper
    process_n_raise_exception(e)
  File "/home/runner/work/lightcone-cli/lightcone-cli/.venv/lib/python3.12/site-packages/daytona_sdk/_utils/errors.py", line 156, in process_n_raise_exception
    raise create_daytona_error(
daytona_sdk.common.errors.DaytonaForbiddenError: Failed to create sandbox: Organization is suspended: Depleted credits
  snae trial 0: score=0.00 error: Failed to create sandbox: Organization is 
suspended: Deplete

lightcone-cli: 0.4.1.dev3+geb5dfeb36 (HEAD eb5dfeb3)
ASTRA: 0.2.11

  Eval Results: Scores  
┏━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Task ┃     Score     ┃
┡━━━━━━╇━━━━━━━━━━━━━━━┩
│ snae │ 0.00 +/- 0.00 │
│      │  pass@k: 0%   │
│      │   1 errors    │
└──────┴───────────────┘

   Eval Results: Cost &   
         Duration         
┏━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Task ┃ Cost / Duration ┃
┡━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ snae │      $0.00      │
│      │       0s        │
└──────┴─────────────────┘

Total: 1 trials, $0.00, 0s

Results saved to: eval-results/build-eb5dfeb3/results.json

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 28, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

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.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cailmdaley what's your view on this ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cailmdaley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment thread claude/lightcone/skills/astra/SKILL.md Outdated
```

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).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a band-aid, but probably we don't have time to rework the extractor agent. so probably fine for now.

Comment thread claude/lightcone/skills/lc-new/SKILL.md Outdated
```

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`.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is not going to be a pleasant experience for users, getting a bug report when they start a new project

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
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.

2 participants