You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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>
Copy file name to clipboardExpand all lines: claude/lightcone/skills/README.md
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,7 +18,7 @@ Not direct entry points — Claude invokes these (or other skills invoke them) t
18
18
19
19
| Skill | Role |
20
20
|---|---|
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. |
22
22
|`lc-cli`| Reference for `lc` workflow: commands, the Spec-Code Invariant, status interpretation, failure diagnosis, multiverse runs, WRROC export. |
23
23
24
24
## Paper-reproduction bundle
@@ -29,7 +29,6 @@ A self-contained toolkit for reproducing published papers in ASTRA. The bundle i
29
29
|---|---|
30
30
|[`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. |
31
31
|[`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). |
33
32
|[`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. |
34
33
|[`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. |
35
34
|[`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. |
validating, or debugging an `astra.yaml` spec; whenever working with
9
9
decisions, options, prior_insights, findings, or evidence; or whenever
10
10
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 *
22
22
23
23
## astra.yaml Structure
24
24
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).
26
26
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`):
28
28
29
29
```
30
30
inputs outputs decisions findings prior_insights
31
-
analyses options content narrative
31
+
analyses options content
32
32
```
33
33
34
34
**`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.
#narrative: { ... } # see Narrative section; typically added later
40
+
#description: "One-paragraph orientation (optional)" # see Description section
41
41
inputs:
42
42
- id: training_data
43
43
type: data
@@ -351,46 +351,21 @@ decisions:
351
351
352
352
The **`universe:` field** in universe files selects which sub-analysis universe to load: `build_mocks: { universe: baseline }`loads `./analyses/build_mocks/universes/baseline.yaml`.
353
353
354
-
## Narrative
354
+
## Description
355
355
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.
357
357
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 -- `` for repo-relative paths or `` 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.
375
359
376
360
```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
Copy file name to clipboardExpand all lines: claude/lightcone/skills/lc-from-code/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,7 +61,7 @@ When the codebase is large enough that one Explore pass risks missing depth (a m
61
61
62
62
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.
63
63
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.
65
65
66
66
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:
| 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`|
42
42
| 4 | IMPLEMENT | ralph iteration |[`references/implement.md`](references/implement.md)|`scripts/`, `requirements.txt`, recipes in `astra.yaml`|
43
43
| 5 | RUN | ralph iteration |[`references/run.md`](references/run.md)|`results/<universe>/<output>/`|
0 commit comments