Skip to content

Commit 38b42bc

Browse files
EiffLclaude
andauthored
Remove ASTRA narrative field from skills; bump astra-tools to 0.2.10 (#156)
ASTRA's `narrative` field has been removed from the spec ([astra-spec RFC-0002](https://github.com/LightconeResearch/astra-spec/blob/main/rfcs/0002-decouple-reports.md)) — replaced by a single optional `description` on any Analysis, with rich write-ups now authored as **external reports** that reference analysis elements by their tree-path. This brings the skill bundle in line. ## Dependency - `astra-tools>=0.2.5` → **`>=0.2.10`** (the release that requires `astra-spec>=0.0.11`, the narrative-free schema). ## Skills - **Deleted the `narrative` skill** (`SKILL.md` + references) and every pointer to it: docs mirror (`docs/skills/narrative.md`), `zensical.toml` nav, README/index rows, CLAUDE.md bundle note. The paper-reproduction bundle is now **five skills (four siblings)**. - **`astra`** (spec reference): dropped `narrative`/`authors` from the field list, removed `narrative` from the reserved-ID set, and replaced the `## Narrative` section with a `## Description` + element-addressing section. - **`lc-new`**: "Populate Narrative" → "Populate Description". - **`lc-from-paper`** (SKILL + `architect`/`specify`/`implement` references): ARCHITECT authors a short per-analysis `description` (no five-section narrative, no `astra-anchor:` weaving); SPECIFY drops the `/narrative` substrate invocation and authors `rationale:`/`claim:`/`notes:` directly on entries. - **`paper-extraction`**: the `extract-paper-substrate.py` script now emits a top-level `description:` (from the abstract) instead of `narrative.summary`, and no longer emits a `narrative.findings` cross-link; the SKILL prose and the example YAML are aligned (example bumped to 0.0.11). - **`figure-comparison`, `lc-from-code`, `check-sentence-by-sentence`**: source `description`/`findings:` per-element fields instead of `narrative.*`. - **docs/user**: FINALIZE authors a `description:`. Remaining uses of the word "narrative" are general-English (constitution/report writing, console output) — not the ASTRA field. ## Verification - `uv run pytest` → **335 passed** - The paper-extraction example and the script's generated stub both **validate against astra-spec 0.0.11** - No new ruff findings (CI lints `src/ tests/`; the skill script is out of scope); no dangling links to the removed skill 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 5474186 commit 38b42bc

28 files changed

Lines changed: 99 additions & 828 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ claude/lightcone/ # Claude plugin source — force-included into the w
7070
├── skills/ # lc-new, lc-from-code, lc-from-paper,
7171
│ # lc-feedback, ralph;
7272
│ # paper-reproduction bundle: lc-from-paper (entry),
73-
│ # ralph (loop substrate), narrative,
73+
│ # ralph (loop substrate),
7474
│ # paper-extraction, figure-comparison,
7575
│ # check-sentence-by-sentence
7676
│ # (see skills/README.md for the full bundle map)

claude/lightcone/skills/README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Not direct entry points — Claude invokes these (or other skills invoke them) t
1818

1919
| Skill | Role |
2020
|---|---|
21-
| `astra` | Reference for the `astra.yaml` spec: structure, decisions, options, prior insights, findings, evidence, sub-analyses, narrative anchors, composition mechanics. |
21+
| `astra` | Reference for the `astra.yaml` spec: structure, decisions, options, prior insights, findings, evidence, sub-analyses, composition mechanics. |
2222
| `lc-cli` | Reference for `lc` workflow: commands, the Spec-Code Invariant, status interpretation, failure diagnosis, multiverse runs, WRROC export. |
2323

2424
## Paper-reproduction bundle
@@ -29,7 +29,6 @@ A self-contained toolkit for reproducing published papers in ASTRA. The bundle i
2929
|---|---|
3030
| [`lc-from-paper`](lc-from-paper/SKILL.md) | **Reproduction driver.** ORIENT-first; one pre-loop phase in the user's main session that asks for the paper, runs `/paper-extraction` inline, interviews the user (grounded in the paper), clones the reference code and runs `/lc-from-code` scan-only (when a repo exists), and drafts the per-paper `constitution.md` + `CLAUDE.md`. Then hands off to a ralph loop whose iterations carry the long middle: ARCHITECT → SPECIFY → LITERATURE → IMPLEMENT → RUN → COMPARE. When the loop closes (constitution `status: closed` after COMPARE returns `pass`), REVIEW runs back in the user's main session. Fidelity intent — captured as prose at ORIENT — is what every iteration reads when sizing its next move, and what COMPARE grades opportunities against. |
3131
| [`ralph`](ralph/SKILL.md) | The loop substrate. `lc-from-paper`'s ORIENT invokes `/ralph`'s Authoring mode to draft the per-paper constitution; the loop launcher hands off after ORIENT lands. Each iteration runs `/ralph`'s Loop protocol against the constitution. |
32-
| [`narrative`](narrative/SKILL.md) | Author the `narrative:` prose and decision `rationale:` in `astra.yaml`. Invoked by `lc-from-paper`'s ARCHITECT (for the structural narrative) and SPECIFY (for anchored content narrative). |
3332
| [`paper-extraction`](paper-extraction/SKILL.md) | Turn an arXiv ID or DOI into a standardized `work/reference/` directory: structural index (figures, tables, outline, citations with resolved DOIs) plus a stub `astra.yaml` for the paper. Primary acquisition path for `lc-from-paper`'s ORIENT (Stage 2); also invoked per cited paper by LITERATURE. |
3433
| [`check-sentence-by-sentence`](check-sentence-by-sentence/SKILL.md) | Audit paper claims against code locations (`file:line` or `NOT FOUND`). Invoked from `lc-from-paper`'s REVIEW close-out (opt-in); also user-invokable directly. |
3534
| [`figure-comparison`](figure-comparison/SKILL.md) | Build a self-contained HTML side-by-side: original figures/tables/numerics vs replicated. Invoked from `lc-from-paper`'s REVIEW close-out (mandatory); also user-invokable directly. |

claude/lightcone/skills/astra/SKILL.md

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ name: astra
33
description: >
44
Comprehensive reference for the `astra.yaml` specification — top-level
55
structure, sub-analyses, inputs/outputs, decisions and options, prior
6-
insights and findings, evidence and quote verification, narrative
7-
anchors, and composition mechanics. Invoke whenever reading, writing,
6+
insights and findings, evidence and quote verification, and
7+
composition mechanics. Invoke whenever reading, writing,
88
validating, or debugging an `astra.yaml` spec; whenever working with
99
decisions, options, prior_insights, findings, or evidence; or whenever
1010
the user asks about ASTRA schema, spec syntax, or sub-analysis
@@ -22,13 +22,13 @@ An `astra.yaml` spec captures this for a single unit of work. The structure is *
2222

2323
## astra.yaml Structure
2424

25-
Fields: `id`, `version`, `name`, `narrative`, `authors`, `tags`, `inputs`, `outputs`, `decisions`, `prior_insights`, `findings`, `analyses`, `container`. `narrative` is the analysis-level prose field -- see [Narrative](#narrative) (typically filled in later, once the structural pieces have settled).
25+
Fields: `id`, `version`, `name`, `description`, `tags`, `inputs`, `outputs`, `decisions`, `prior_insights`, `findings`, `analyses`, `container`. `description` is the analysis-level free-prose field -- see [Description](#description) (the same optional field every element carries).
2626

27-
**Reserved IDs.** No analysis entity (input, output, decision, option, finding, prior insight, evidence, sub-analysis) may use any of these names as its `id` -- they collide with the narrative anchor grammar:
27+
**Reserved IDs.** No analysis entity (input, output, decision, option, finding, prior insight, evidence, sub-analysis) may use any of these names as its `id` -- they collide with the tree-path reference grammar (used by `from:`, `when`, `requires`, and `incompatible_with`):
2828

2929
```
3030
inputs outputs decisions findings prior_insights
31-
analyses options content narrative
31+
analyses options content
3232
```
3333

3434
**`label` field.** Inputs, Outputs, Decisions, Options, and Insights all accept an optional `label:` -- a short human-readable name for compact rendering (margin glyphs, breadcrumbs, card titles). Tooling falls back to `id` when absent. `label` is required only on Options.
@@ -37,7 +37,7 @@ analyses options content narrative
3737
# Simple analysis -- everything at top level
3838
version: "1.0"
3939
name: "My Analysis"
40-
# narrative: { ... } # see Narrative section; typically added later
40+
# description: "One-paragraph orientation (optional)" # see Description section
4141
inputs:
4242
- id: training_data
4343
type: data
@@ -351,46 +351,21 @@ decisions:
351351

352352
The **`universe:` field** in universe files selects which sub-analysis universe to load: `build_mocks: { universe: baseline }` loads `./analyses/build_mocks/universes/baseline.yaml`.
353353

354-
## Narrative
354+
## Description
355355

356-
`narrative` is the analysis-level prose field on any Analysis (root or sub). It's structured as five Markdown sections: `summary`, `findings`, `methods`, `inputs`, `outputs`. The schema is closed (`additionalProperties: false`) -- no other keys are allowed.
356+
`description` is a single optional free-prose field on any Analysis (root or sub) -- the same field every other element carries (`Input`, `Output`, `Option`, `Universe`). It holds a short human orientation to the analysis (a paragraph or two), nothing more.
357357

358-
**Recommendation:** fill `narrative` in *later*, once the structural pieces of the analysis (decisions, outputs, sub-analyses) have settled. Prose written too early goes stale fast and tends to describe what no longer exists. Per-element prose (what each Input, Output, Decision, Option, or Insight is and why) belongs on the elements themselves via `description`/`rationale`/`notes` -- those can be written from day one.
359-
360-
**Conditional coverage.** All five sections are schema-optional, but `astra validate` enforces:
361-
362-
| Section | Required when |
363-
|---|---|
364-
| `findings` | the analysis has entries under `findings:` |
365-
| `methods` | the analysis has entries under `decisions:` or `analyses:` |
366-
| `inputs` | the analysis has entries under `inputs:` |
367-
| `outputs` | the analysis has entries under `outputs:` |
368-
| `summary` | always optional |
369-
370-
Authors narrate what they declare; stub analyses with only a summary stay clean.
371-
372-
**Anchor references.** Inside any section, link to other elements with Markdown anchor links (`[text](#path.to.element)`) using the same tree-path grammar as `from:` -- `#decisions.scaling`, `#decisions.scaling.options.standard`, `#findings.best_model`, `#analyses.preprocessing` (whole sub-analysis), `#analyses.preprocessing.outputs.features` (element inside a sub-analysis), `#../decisions.method` to escape to a parent scope.
373-
374-
**Inline images.** Standard Markdown image syntax inside any section -- `![alt](path/to/img.png)` for repo-relative paths or `![alt](https://...)` for URLs. Renderers like lightcone-ui pick them up the same way they pick up text.
358+
Per-element prose (what each Input, Output, Decision, Option, or Insight is and why) belongs on the elements themselves via `description`/`rationale`/`notes` -- those can be written from day one. The analysis-level `description` can be filled in at any time and is safe to leave short.
375359

376360
```yaml
377-
narrative:
378-
summary: |
379-
A two-stage pipeline for Iris classification that demonstrates
380-
sub-analyses.
381-
methods: |
382-
The [feature_extraction sub-analysis](#analyses.feature_extraction)
383-
produces encoded features, which feed
384-
[classification](#analyses.classification). A
385-
[test_split](#decisions.test_split) decision controls the holdout.
386-
inputs: |
387-
[iris_data](#inputs.iris_data) is Fisher's 150-sample, 4-feature,
388-
3-class dataset.
389-
outputs: |
390-
The top level exposes [accuracy](#outputs.accuracy) and a
391-
[pipeline_summary](#outputs.pipeline_summary) report.
361+
description: |
362+
A two-stage pipeline for Iris classification that demonstrates
363+
sub-analyses: a feature-extraction stage feeds a classification
364+
stage. The top level exposes the classifier accuracy and a
365+
pipeline-summary report.
392366
```
393367

368+
394369
## CLI Reference (astra)
395370

396371
```bash

claude/lightcone/skills/check-sentence-by-sentence/SKILL.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,10 @@ PROCEDURE
149149
or generic framing -- skip it.
150150
3. Before searching, **read `astra.yaml` once** -- it is a pre-built
151151
paper↔code map maintained by the project. Harvest specifically:
152-
- `narrative.methods` — links paper methodology concepts to decision
153-
IDs (e.g. paper prose "the chosen <method>" → `#decisions.<id>`)
154-
- `narrative.findings` — links paper claims/values to result anchors
152+
- `decisions` — each decision's `label` / `rationale` links paper
153+
methodology concepts to a decision ID (e.g. paper prose "the chosen
154+
<method>" → `decisions.<id>`)
155+
- `findings` — links paper claims/values to result entries
155156
- `prior_insights` (if present) — extracted paper quotes already tied
156157
to decisions
157158
- per-decision `evidence` quotes and `description` fields

claude/lightcone/skills/figure-comparison/SKILL.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ Read, in this order:
9393
- If neither file exists, use the default paper-driven flow below and
9494
build a best-effort report from `astra.yaml` plus `work/reference/`.
9595

96-
2. **`astra.yaml`** -- specifically `narrative.summary`, `narrative.outputs`,
97-
`narrative.findings`, `outputs:`, and `findings:` if present. Use it to
96+
2. **`astra.yaml`** -- specifically the top-level `description`, `outputs:`,
97+
and `findings:` if present. Use it to
9898
map scoped targets to output IDs and to harvest declared findings. Do not
9999
assume ASTRA outputs have a dedicated filename-hint field; result paths
100100
come from the output ID and the result resolver in Phase 2.
@@ -200,7 +200,7 @@ paper asserts and the project tracks. Concretely, harvest from:
200200
reported sample size after a specific cut, every bin width or step
201201
used as a result-defining choice, every reported accuracy / score /
202202
metric.
203-
- Any explicit reproduction targets in `astra.yaml`'s `narrative.findings`.
203+
- Any explicit reproduction targets in `astra.yaml`'s `findings:`.
204204

205205
It is fine to repeat one quantity in multiple manifest entries when the
206206
paper reports it under different conditions (preliminary vs. final,

claude/lightcone/skills/lc-from-code/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ When the codebase is large enough that one Explore pass risks missing depth (a m
6161

6262
Write the scan results to `CLAUDE.md` under `## Project Notes` (fresh migration) or to the path the invocation prompt specifies (scan-only — typically `work/reference/code-index.md`) as a script inventory, then in fresh migration mode draft or add to `astra.yaml` from the scan results following the spec structure documented in `/astra`. In scan-only mode, stop after the inventory file lands; do not touch `astra.yaml`. Use the decision criteria from `/astra` (Decisions section) to filter candidate decisions down to only true analytical choices — most hardcoded values are implementation details, not decisions. Use current hardcoded values as defaults.
6363

64-
In augment mode, preserve the existing paper-derived or user-derived `inputs`, `outputs`, `decisions`, `findings`, and `narrative` unless the code scan shows a real conflict. Attach code evidence to the nearest existing home first. Create new ASTRA structure only when the code reveals a real analysis object that has no suitable home in the current spec.
64+
In augment mode, preserve the existing paper-derived or user-derived `inputs`, `outputs`, `decisions`, `findings`, and `description` unless the code scan shows a real conflict. Attach code evidence to the nearest existing home first. Create new ASTRA structure only when the code reveals a real analysis object that has no suitable home in the current spec.
6565

6666
For each output, list the upstream artifacts it depends on under `Output.inputs: [...]` and the decisions it consumes under `Output.decisions: [...]`. Then add a `recipe.command` template that references each via `{inputs.<id>}` / `{decisions.<id>}` and writes to `{output}`. Example:
6767

claude/lightcone/skills/lc-from-paper/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ Eight phases (zero-indexed). ORIENT runs before the loop, in the user's main ses
3636
| # | Phase | Where it runs | Reference | Primary outputs |
3737
|---|---|---|---|---|
3838
| 0 | ORIENT | user's main session | [`references/orient.md`](references/orient.md) | per-paper `constitution.md` + `CLAUDE.md` + paper substrate at `work/reference/{paper.pdf, source/ or document.md, figures/, tables/, index.json, astra.yaml}` (from inline `/paper-extraction`) + code substrate at `work/reference/{code/, code-status.yaml, code-index.md}` (from inline `/lc-from-code` scan-only, when a repo exists) |
39-
| 1 | ARCHITECT | ralph iteration | [`references/architect.md`](references/architect.md) | stub `astra.yaml` at project root (sub-analyses, inputs, outputs, narrative) |
40-
| 2 | SPECIFY | ralph iteration | [`references/specify.md`](references/specify.md) | filled `astra.yaml` (`decisions:`, `findings:`, `prior_insights:` placeholders, anchored narrative); `targets/targets.md`; `implementation-notes.md`; `universes/baseline.yaml` |
39+
| 1 | ARCHITECT | ralph iteration | [`references/architect.md`](references/architect.md) | stub `astra.yaml` at project root (sub-analyses, inputs, outputs, per-analysis `description`) |
40+
| 2 | SPECIFY | ralph iteration | [`references/specify.md`](references/specify.md) | filled `astra.yaml` (`decisions:`, `findings:`, `prior_insights:` placeholders); `targets/targets.md`; `implementation-notes.md`; `universes/baseline.yaml` |
4141
| 3 | LITERATURE | ralph iteration | [`references/literature.md`](references/literature.md) | `astra.yaml`'s `prior_insights:` Evidence entries each carry resolved `quote:` + `location:` selectors; per-paper PDFs cached via `astra paper add` |
4242
| 4 | IMPLEMENT | ralph iteration | [`references/implement.md`](references/implement.md) | `scripts/`, `requirements.txt`, recipes in `astra.yaml` |
4343
| 5 | RUN | ralph iteration | [`references/run.md`](references/run.md) | `results/<universe>/<output>/` |

0 commit comments

Comments
 (0)