lightcone-cli 0.3.5__tar.gz → 0.3.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/PKG-INFO +20 -6
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/README.md +4 -4
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/README.md +1 -2
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/astra/SKILL.md +15 -40
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/check-sentence-by-sentence/SKILL.md +4 -3
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/figure-comparison/SKILL.md +3 -3
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-code/SKILL.md +1 -1
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/SKILL.md +2 -2
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/architect.md +20 -23
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/implement.md +2 -2
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/specify.md +14 -17
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-new/SKILL.md +3 -3
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/paper-extraction/SKILL.md +5 -9
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/paper-extraction/scripts/extract-paper-substrate.py +6 -8
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/pyproject.toml +17 -1
- lightcone_cli-0.3.5/claude/lightcone/skills/narrative/SKILL.md +0 -228
- lightcone_cli-0.3.5/claude/lightcone/skills/narrative/references/co-drafting.md +0 -79
- lightcone_cli-0.3.5/claude/lightcone/skills/narrative/references/existing-analysis.md +0 -50
- lightcone_cli-0.3.5/claude/lightcone/skills/narrative/references/paper-reproduction.md +0 -118
- lightcone_cli-0.3.5/claude/lightcone/skills/paper-extraction/examples/unions-bmodes-astra.yaml +0 -106
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/.gitignore +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/LICENSE +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/agents/lc-extractor.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/hooks.json +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/scripts/activate-venv.sh +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/scripts/session-start.sh +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/scripts/validate-on-save.sh +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-cli/SKILL.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-feedback/SKILL.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/compare.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/literature.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/orient.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/review.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/references/run.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/templates/CLAUDE.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/lc-from-paper/templates/constitution.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/paper-extraction/references/arxiv-source.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/paper-extraction/references/pdf-fallback.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/ralph/SKILL.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/ralph/references/constitution.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/ralph/references/crafting.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/ralph/scripts/ralph +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/templates/CLAUDE.md +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/cli/__init__.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/cli/commands.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/cli/plugin.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/__init__.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/container.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/dask_cluster.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/manifest.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/runner.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/scratch.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/site_registry.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/snakefile.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/status.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/tree.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/validation.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/verify.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/engine/wrroc.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/__init__.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/build.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/cli.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/graders.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/harness.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/models.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/report.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/lightcone/eval/sandbox.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/snakemake_executor_plugin_dask/__init__.py +0 -0
- {lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/src/snakemake_executor_plugin_dask/executor.py +0 -0
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lightcone-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.7
|
|
4
4
|
Summary: Lightcone command-line toolchain
|
|
5
5
|
Author: Lightcone Research
|
|
6
6
|
License: BSD-3-Clause
|
|
7
7
|
License-File: LICENSE
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Environment :: Console
|
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
|
11
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python
|
|
14
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Human Machine Interfaces
|
|
8
22
|
Requires-Python: >=3.11
|
|
9
|
-
Requires-Dist: astra-tools>=0.2.
|
|
23
|
+
Requires-Dist: astra-tools>=0.2.10
|
|
10
24
|
Requires-Dist: click>=8.0
|
|
11
25
|
Requires-Dist: dask>=2024.1
|
|
12
26
|
Requires-Dist: distributed>=2024.1
|
|
@@ -21,10 +35,10 @@ Description-Content-Type: text/markdown
|
|
|
21
35
|
|
|
22
36
|
# lightcone-cli
|
|
23
37
|
|
|
24
|
-
[](https://opensource.org/licenses/BSD-3-Clause)
|
|
39
|
+
[](https://pypi.org/project/lightcone-cli/)
|
|
40
|
+
[](https://pypi.org/project/lightcone-cli/)
|
|
41
|
+
[](https://github.com/LightconeResearch/lightcone-cli/actions/workflows/tests.yml)
|
|
28
42
|
|
|
29
43
|
<!-- [](https://github.com/astral-sh/ruff) -->
|
|
30
44
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# lightcone-cli
|
|
2
2
|
|
|
3
|
-
[](https://opensource.org/licenses/BSD-3-Clause)
|
|
4
|
+
[](https://pypi.org/project/lightcone-cli/)
|
|
5
|
+
[](https://pypi.org/project/lightcone-cli/)
|
|
6
|
+
[](https://github.com/LightconeResearch/lightcone-cli/actions/workflows/tests.yml)
|
|
7
7
|
|
|
8
8
|
<!-- [](https://github.com/astral-sh/ruff) -->
|
|
9
9
|
|
|
@@ -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,
|
|
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. |
|
|
@@ -3,8 +3,8 @@ name: astra
|
|
|
3
3
|
description: >
|
|
4
4
|
Comprehensive reference for the `astra.yaml` specification — top-level
|
|
5
5
|
structure, sub-analyses, inputs/outputs, decisions and options, prior
|
|
6
|
-
insights and findings, evidence and quote verification,
|
|
7
|
-
|
|
6
|
+
insights and findings, evidence and quote verification, and
|
|
7
|
+
composition mechanics. Invoke whenever reading, writing,
|
|
8
8
|
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`, `
|
|
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
|
|
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
|
|
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.
|
|
@@ -37,7 +37,7 @@ analyses options content narrative
|
|
|
37
37
|
# Simple analysis -- everything at top level
|
|
38
38
|
version: "1.0"
|
|
39
39
|
name: "My Analysis"
|
|
40
|
-
#
|
|
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
|
-
##
|
|
354
|
+
## Description
|
|
355
355
|
|
|
356
|
-
`
|
|
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
|
-
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
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.
|
|
392
366
|
```
|
|
393
367
|
|
|
368
|
+
|
|
394
369
|
## CLI Reference (astra)
|
|
395
370
|
|
|
396
371
|
```bash
|
|
@@ -149,9 +149,10 @@ PROCEDURE
|
|
|
149
149
|
or generic framing -- skip it.
|
|
150
150
|
3. Before searching, **read `astra.yaml` once** -- it is a pre-built
|
|
151
151
|
paper↔code map maintained by the project. Harvest specifically:
|
|
152
|
-
- `
|
|
153
|
-
|
|
154
|
-
|
|
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
|
|
155
156
|
- `prior_insights` (if present) — extracted paper quotes already tied
|
|
156
157
|
to decisions
|
|
157
158
|
- per-decision `evidence` quotes and `description` fields
|
{lightcone_cli-0.3.5 → lightcone_cli-0.3.7}/claude/lightcone/skills/figure-comparison/SKILL.md
RENAMED
|
@@ -93,8 +93,8 @@ Read, in this order:
|
|
|
93
93
|
- If neither file exists, use the default paper-driven flow below and
|
|
94
94
|
build a best-effort report from `astra.yaml` plus `work/reference/`.
|
|
95
95
|
|
|
96
|
-
2. **`astra.yaml`** -- specifically `
|
|
97
|
-
|
|
96
|
+
2. **`astra.yaml`** -- specifically the top-level `description`, `outputs:`,
|
|
97
|
+
and `findings:` if present. Use it to
|
|
98
98
|
map scoped targets to output IDs and to harvest declared findings. Do not
|
|
99
99
|
assume ASTRA outputs have a dedicated filename-hint field; result paths
|
|
100
100
|
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:
|
|
|
200
200
|
reported sample size after a specific cut, every bin width or step
|
|
201
201
|
used as a result-defining choice, every reported accuracy / score /
|
|
202
202
|
metric.
|
|
203
|
-
- Any explicit reproduction targets in `astra.yaml`'s `
|
|
203
|
+
- Any explicit reproduction targets in `astra.yaml`'s `findings:`.
|
|
204
204
|
|
|
205
205
|
It is fine to repeat one quantity in multiple manifest entries when the
|
|
206
206
|
paper reports it under different conditions (preliminary vs. final,
|
|
@@ -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 `
|
|
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:
|
|
67
67
|
|
|
@@ -36,8 +36,8 @@ Eight phases (zero-indexed). ORIENT runs before the loop, in the user's main ses
|
|
|
36
36
|
| # | Phase | Where it runs | Reference | Primary outputs |
|
|
37
37
|
|---|---|---|---|---|
|
|
38
38
|
| 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,
|
|
40
|
-
| 2 | SPECIFY | ralph iteration | [`references/specify.md`](references/specify.md) | filled `astra.yaml` (`decisions:`, `findings:`, `prior_insights:` placeholders
|
|
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` |
|
|
41
41
|
| 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>/` |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ARCHITECT — write the stub `astra.yaml`
|
|
2
2
|
|
|
3
|
-
ARCHITECT is the structural seam: decide the sub-analysis decomposition, wire the inputs and outputs at the sub-analysis level, and author
|
|
3
|
+
ARCHITECT is the structural seam: decide the sub-analysis decomposition, wire the inputs and outputs at the sub-analysis level, and author a short `description:` for each analysis — all in one stub `astra.yaml`. SPECIFY then fills the stub with `decisions:`, `prior_insights:`, and `findings:`. Splitting **structure** from **content** keeps each iteration's cognitive load manageable: ARCHITECT decides *what the analyses are*; SPECIFY decides *what's inside each one*.
|
|
4
4
|
|
|
5
5
|
ARCHITECT is what a ralph iteration does when the workdir signals "ORIENT substrate present + project-root `astra.yaml` absent (or empty stub)." The heavy work of *understanding* the paper and code happened in `/paper-extraction` and `/lc-from-code`'s scan-only branch — both invoked inline during ORIENT in the user's main session. Their on-disk substrate (the structural `index.json`, the paper-extraction `astra.yaml`, the `code-index.md`) is what you read on entry. No persistent expert sub-agents; targeted reads against the substrate carry the orientation.
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ ARCHITECT is what a ralph iteration does when the workdir signals "ORIENT substr
|
|
|
9
9
|
- `constitution.md` — Goal, Fidelity intent, Scope, Quality bar. Read first; the Goal's intended replication targets fence what `outputs:` belong in the stub.
|
|
10
10
|
- `CLAUDE.md` — auto-loaded; Rules + accumulators (still empty at this point).
|
|
11
11
|
- `work/reference/index.json` — paper-side structural index from `/paper-extraction` (figures, tables, section outline with line numbers, citations with resolved DOIs).
|
|
12
|
-
- `work/reference/astra.yaml` — paper-extraction's ASTRA-shape stub of the paper itself: id, name, `
|
|
12
|
+
- `work/reference/astra.yaml` — paper-extraction's ASTRA-shape stub of the paper itself: id, name, `description` (from abstract), optionally `findings:` (paper's claimed numerical results).
|
|
13
13
|
- `work/reference/code-index.md` — code-side inventory from `/lc-from-code`'s scan: script inventory, candidate decisions with `file:line` refs, module map, entry-points, external data dependencies, container hints.
|
|
14
14
|
- `work/reference/source/` (Path A) or `work/reference/document.md` (Path B) — paper text. Grep into for specific facts; do not re-read whole.
|
|
15
15
|
- `work/reference/code/` (when present) — the cloned reference code. Read targeted modules when `code-index.md` doesn't answer a structural question.
|
|
@@ -17,7 +17,7 @@ ARCHITECT is what a ralph iteration does when the workdir signals "ORIENT substr
|
|
|
17
17
|
|
|
18
18
|
## Outputs
|
|
19
19
|
|
|
20
|
-
- `astra.yaml` at the project root — **stub form**: sub-analyses named, architecture wired (inputs / outputs declared at the sub-analysis level),
|
|
20
|
+
- `astra.yaml` at the project root — **stub form**: sub-analyses named, architecture wired (inputs / outputs declared at the sub-analysis level), a short `description:` per analysis. **No `decisions:`, `prior_insights:`, or `findings:` yet** — those entries are SPECIFY's.
|
|
21
21
|
- `constitution.md` updates: Open dimensions, when something material surfaces that warrants user ratification at REVIEW.
|
|
22
22
|
|
|
23
23
|
## Step 1 — Read the substrate, then write the stub
|
|
@@ -27,32 +27,29 @@ Read `constitution.md`, `CLAUDE.md`, `work/reference/index.json`, `work/referenc
|
|
|
27
27
|
### What to do
|
|
28
28
|
|
|
29
29
|
1. **Reconcile sub-analysis decompositions.** Read `code-index.md`'s natural-decomposition section and `index.json`'s section outline. Where paper and code agree on a stage, use that name (noun-phrase, e.g. `reconstruction`). Where they disagree, **code's structure is canonical for stage boundaries** — the paper compresses; the code reveals the actual decomposition. Where code is absent or thin, follow the paper alone. Where module boundaries are genuinely ambiguous, read the relevant modules under `work/reference/code/` to settle it.
|
|
30
|
-
2. **Choose: one analysis or sub-analyses?** If the paper has only one stage end-to-end (no clean intermediate handoffs), write a single analysis. If it has genuinely independent stages (each stage's output flows as the next's input), write sub-analyses. Sub-analysis IDs must be noun phrases: `reconstruction`, `clustering`, `bao_fit`. Avoid reserved names: `inputs`, `outputs`, `decisions`, `findings`, `prior_insights`, `analyses`, `options`, `content
|
|
30
|
+
2. **Choose: one analysis or sub-analyses?** If the paper has only one stage end-to-end (no clean intermediate handoffs), write a single analysis. If it has genuinely independent stages (each stage's output flows as the next's input), write sub-analyses. Sub-analysis IDs must be noun phrases: `reconstruction`, `clustering`, `bao_fit`. Avoid reserved names: `inputs`, `outputs`, `decisions`, `findings`, `prior_insights`, `analyses`, `options`, `content`.
|
|
31
31
|
3. **Wire inputs and outputs at the sub-analysis level.** For each sub-analysis:
|
|
32
32
|
- Declare `inputs:` from `code-index.md`'s External-data-dependencies plus any paper-named external datasets. The depth (acquisition path, selection criteria) is SPECIFY's; ARCHITECT names the input and gives it a stable id.
|
|
33
33
|
- Declare `outputs:` matching the result loci from `index.json` (figures + tables) plus any intermediate artifacts a downstream sub-analysis consumes. Tag each output's `priority:` from the paper's emphasis (primary / secondary). **The reproduction's targeted scope from `constitution.md`'s Scope takes precedence** — if the user only wants Figure 3 and Table 2, only those land as `outputs:`; the rest are out-of-scope and noted as such.
|
|
34
|
-
4. **Author the root and per-analysis
|
|
35
|
-
5. **Validate.** `astra validate astra.yaml` must return clean — even with empty `decisions:` / `prior_insights:` / `findings:` blocks, the structural fields and
|
|
34
|
+
4. **Author the root and per-analysis `description`.** Write a short `description:` (one or two paragraphs) on the root analysis and on each sub-analysis — enough to orient a reader on what the analysis is and what it produces. The root `description:` should give a top-down, end-to-end sketch of how the sub-analyses' outputs flow into one another when sub-analyses exist. Keep it high-level; per-decision and per-finding prose lives on those entries' own `rationale:` / `notes:` fields, authored in SPECIFY.
|
|
35
|
+
5. **Validate.** `astra validate astra.yaml` must return clean — even with empty `decisions:` / `prior_insights:` / `findings:` blocks, the structural fields and descriptions must pass schema checks.
|
|
36
36
|
|
|
37
37
|
### Stub shape — what `astra.yaml` looks like after ARCHITECT
|
|
38
38
|
|
|
39
39
|
```yaml
|
|
40
|
-
# Stub: structure +
|
|
40
|
+
# Stub: structure + descriptions. SPECIFY fills decisions/findings/prior_insights.
|
|
41
41
|
id: <paper-slug>
|
|
42
42
|
title: "<paper title>"
|
|
43
43
|
doi: <doi>
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
methods: |
|
|
49
|
-
<data-flow paragraph; required when sub-analyses exist>
|
|
45
|
+
description: |
|
|
46
|
+
<high-level paragraph for the root analysis; sketch the end-to-end
|
|
47
|
+
data flow across sub-analyses when they exist>
|
|
50
48
|
|
|
51
49
|
analyses:
|
|
52
50
|
<sub-analysis-id-1>:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<prose for this sub-analysis>
|
|
51
|
+
description: |
|
|
52
|
+
<short paragraph orienting a reader on this sub-analysis>
|
|
56
53
|
inputs:
|
|
57
54
|
<input-id>:
|
|
58
55
|
<stable name; depth lives in SPECIFY>
|
|
@@ -74,9 +71,9 @@ analyses:
|
|
|
74
71
|
|
|
75
72
|
- **Stub, not snapshot.** Don't try to author content for `decisions:`, `prior_insights:`, `findings:`. Those go in SPECIFY. Your job is the structural skeleton.
|
|
76
73
|
- **Reserved names.** Sub-analysis IDs are noun phrases; avoid the reserved set. Each ID must be unique across the spec.
|
|
77
|
-
- **Code-as-canonical for structure.** Where paper and code disagree on the decomposition, the code's structure is canonical (the paper compresses
|
|
74
|
+
- **Code-as-canonical for structure.** Where paper and code disagree on the decomposition, the code's structure is canonical (the paper compresses; the code reveals real seams).
|
|
78
75
|
- **Targeted scope wins.** `constitution.md`'s Scope fences the reproduction. If the user only wants Figures 3–4 plus Table 2, only those land as `outputs:`.
|
|
79
|
-
- **
|
|
76
|
+
- **Short descriptions, high-level only.** Author a `description:` at root and per-sub-analysis levels. Keep it orienting; per-decision / per-finding prose lives on those entries in SPECIFY.
|
|
80
77
|
- **Validate before exit.** `astra validate astra.yaml` must return clean.
|
|
81
78
|
- **Targeted reads, not whole-paper absorption.** The indices give you most of what you need; reach into the source / document / code for specific items, not as a default.
|
|
82
79
|
|
|
@@ -84,15 +81,15 @@ After the stub is written and validates, commit it (`architect: stub astra.yaml`
|
|
|
84
81
|
|
|
85
82
|
## Reviewing prior ARCHITECT work as part of survey
|
|
86
83
|
|
|
87
|
-
There is no separate review phase. Every iteration that enters and finds an ARCHITECT stub on disk reads it critically before doing anything else. If you see real issues — wrong sub-analysis decomposition, reserved-name collision, missing in-scope output,
|
|
84
|
+
There is no separate review phase. Every iteration that enters and finds an ARCHITECT stub on disk reads it critically before doing anything else. If you see real issues — wrong sub-analysis decomposition, reserved-name collision, missing in-scope output, a `description` gap — fix them inline, commit (`architect: fix <what>`), and exit. Only when a fresh-context read finds nothing to fix does the iteration move on to SPECIFY work. The fresh-context property at iteration boundaries makes the next iteration the review; nothing else is needed.
|
|
88
85
|
|
|
89
86
|
What to look at:
|
|
90
87
|
|
|
91
88
|
1. **Sub-analysis decomposition.** Right cuts? Consistent with `code-index.md`? Defensible against the paper where the paper compresses?
|
|
92
|
-
2. **Sub-analysis IDs.** Noun phrases. No reserved-name collisions (`inputs`, `outputs`, `decisions`, `findings`, `prior_insights`, `analyses`, `options`, `content
|
|
89
|
+
2. **Sub-analysis IDs.** Noun phrases. No reserved-name collisions (`inputs`, `outputs`, `decisions`, `findings`, `prior_insights`, `analyses`, `options`, `content`).
|
|
93
90
|
3. **Inputs at sub-analysis level.** Each input has a stable id; the data dependency is real (cross-check against `code-index.md`'s External-data-dependencies and the paper's data section).
|
|
94
91
|
4. **Outputs at sub-analysis level.** Each output corresponds to a result locus from `index.json` OR an intermediate artifact a downstream sub-analysis consumes. Targeted scope from `constitution.md`'s Scope is honored — no out-of-scope outputs sneaking in, no in-scope targets missed.
|
|
95
|
-
5. **
|
|
92
|
+
5. **Description coverage.** Root `description` sketches the end-to-end data flow (when sub-analyses exist). Each sub-analysis's `description` accurately describes its role.
|
|
96
93
|
6. **Validates.** `astra validate astra.yaml` returns clean.
|
|
97
94
|
|
|
98
95
|
Don't flag empty `decisions:` / `prior_insights:` / `findings:` — that's SPECIFY's territory. Don't re-read the entire paper or code; use the indices and targeted reads. If you see the same artifact getting churned across many recent commits without convergence, log the situation to `open-questions.md` and advance the phase anyway.
|
|
@@ -101,12 +98,12 @@ Don't flag empty `decisions:` / `prior_insights:` / `findings:` — that's SPECI
|
|
|
101
98
|
|
|
102
99
|
- `work/reference/index.json` + `work/reference/astra.yaml` + `work/reference/code-index.md` (when code present) exist ⇒ ORIENT substrate is ready
|
|
103
100
|
- `astra.yaml` at project root absent (or present-but-empty) ⇒ this iteration writes the stub
|
|
104
|
-
- `astra.yaml` exists with stub form (sub-analyses + inputs + outputs +
|
|
101
|
+
- `astra.yaml` exists with stub form (sub-analyses + inputs + outputs + per-analysis `description` populated; `decisions:` / `prior_insights:` / `findings:` blocks present-and-empty) ⇒ ARCHITECT's output is on disk; read it critically. Fix anything wrong; otherwise the iteration moves on to SPECIFY.
|
|
105
102
|
|
|
106
103
|
## Notes
|
|
107
104
|
|
|
108
105
|
- **No persistent expert sub-agents.** The on-disk substrate (`index.json`, `code-index.md`, the paper-extraction `astra.yaml`) carries the orientation iterations need; re-read what you need on entry.
|
|
109
106
|
- **The stub's empty blocks are intentional.** `decisions: {}`, `prior_insights: {}`, `findings: {}` make it clear at a glance that ARCHITECT's job is structural and SPECIFY fills them. Don't try to half-author content — empty is honest.
|
|
110
|
-
- **Code-as-canonical for structure, paper-as-canonical for
|
|
111
|
-
- **
|
|
107
|
+
- **Code-as-canonical for structure, paper-as-canonical for wording.** The code reveals where the real stage boundaries are; the paper provides the words to describe them. The stub uses both.
|
|
108
|
+
- **Descriptions are orienting, not exhaustive.** ARCHITECT's `description:` blocks give a reader the shape of each analysis; the detailed prose (decision `rationale:`, finding `notes:`) lands on those entries in SPECIFY.
|
|
112
109
|
- **Commit each artifact as it lands.** The stub commits when it lands; each subsequent fix pass commits separately. Small, descriptive commits keep `git log` legible to the next iteration.
|
|
@@ -6,7 +6,7 @@ IMPLEMENT is what a ralph iteration does when the workdir signals "SPECIFY done
|
|
|
6
6
|
|
|
7
7
|
## Inputs
|
|
8
8
|
|
|
9
|
-
- `astra.yaml` — the filled spec (sub-analyses, decisions, prior_insights, findings
|
|
9
|
+
- `astra.yaml` — the filled spec (sub-analyses, decisions, prior_insights, findings — all populated by SPECIFY; per-analysis `description` from ARCHITECT)
|
|
10
10
|
- `implementation-notes.md` — tricky algorithms, numerical gotchas, data-format quirks
|
|
11
11
|
- `work/reference/index.json` — paper-side structural index (figures, tables, outline, citations); useful when the spec compresses or you need to find where in the paper a behavior is described.
|
|
12
12
|
- `work/reference/code-index.md` (when code present) — code inventory: module map, candidate decisions with file:line, entry-points, data dependencies, gotchas (the canonical map of where each sub-analysis's logic lives in `work/reference/code/`).
|
|
@@ -54,7 +54,7 @@ The iteration merges scripts and recipes after the per-output sub-agents finish.
|
|
|
54
54
|
|
|
55
55
|
1. **One script per output** (or a shared script for tightly-coupled outputs).
|
|
56
56
|
2. **Parameterize by decisions.** Each decision is a CLI argument; scripts also receive `--universe <universe_id>`. See lightcone-cli's `CLAUDE.md` for the full convention.
|
|
57
|
-
3. **Add recipes** to each output in `astra.yaml` with `command:` and `inputs:` (dependencies). Recipe inputs use the
|
|
57
|
+
3. **Add recipes** to each output in `astra.yaml` with `command:` and `inputs:` (dependencies). Recipe inputs use the `<analysis>.<output>` tree-path form that wires outputs to downstream inputs.
|
|
58
58
|
4. **Create `requirements.txt`** with needed packages. Do not install them — the RUN phase manages environments.
|
|
59
59
|
5. **Do not execute scripts** — the RUN phase handles execution via `lc run`.
|
|
60
60
|
6. **Validate** with `astra validate astra.yaml` after adding recipes.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SPECIFY — fill the stub `astra.yaml`, two passes per sub-analysis
|
|
2
2
|
|
|
3
|
-
Read the stub `astra.yaml` from ARCHITECT and fill in `decisions:`, `prior_insights:`, `findings:` per sub-analysis
|
|
3
|
+
Read the stub `astra.yaml` from ARCHITECT and fill in `decisions:`, `prior_insights:`, `findings:` per sub-analysis. SPECIFY is the **first material-disagreement seam** — paper-vs-code conflicts surface here, and they're often the highest-value moments for the user to weigh in on at REVIEW.
|
|
4
4
|
|
|
5
5
|
SPECIFY is what a ralph iteration does when the workdir signals "stub `astra.yaml` present + sub-analyses' `decisions:` / `prior_insights:` / `findings:` blocks still empty." Iterations run detached in tmux; the user isn't reachable interactively, so the canonical-resolution default (code wins where paper and code disagree on a material choice) applies and disagreements are logged to CLAUDE.md's **Paper-vs-code disagreements** section plus `open-questions.md` for REVIEW close-out.
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ Per-sub-analysis work is parallelizable when sub-analyses are independent. Each
|
|
|
10
10
|
|
|
11
11
|
## Inputs
|
|
12
12
|
|
|
13
|
-
- `astra.yaml` — the stub from ARCHITECT (sub-analyses, inputs, outputs,
|
|
13
|
+
- `astra.yaml` — the stub from ARCHITECT (sub-analyses, inputs, outputs, per-analysis `description`; empty `decisions:` / `prior_insights:` / `findings:` blocks)
|
|
14
14
|
- `constitution.md` — Goal (scope), Fidelity intent, Quality bar
|
|
15
15
|
- `CLAUDE.md` — Rules; **Paper-vs-code disagreements** for prior-iteration entries
|
|
16
16
|
- `work/reference/index.json` — paper-extraction's structural index: figures, tables, section outline, citations. The `citations:` block maps each cited paper's BibTeX key (Path A) or synthetic `<lastname>_<year>` key (Path B) to `{locations, citation, doi}`. SPECIFY uses this to write each `prior_insights:` placeholder's `doi:` so LITERATURE knows which paper to fetch.
|
|
@@ -22,18 +22,18 @@ Per-sub-analysis work is parallelizable when sub-analyses are independent. Each
|
|
|
22
22
|
|
|
23
23
|
## Outputs
|
|
24
24
|
|
|
25
|
-
- `astra.yaml` — **filled form**: each sub-analysis's `decisions:` populated with decision-level `rationale:` prose plus options (the paper's choice is identified by `default:`); `findings:` populated as full `Insight` blocks with paper-anchored `evidence:` (the target paper's DOI + `quote: {exact, prefix, suffix}` + `location: {page: N}`); `prior_insights:` populated as citation **placeholders** — each a syntactically-complete `Insight` (`id`, `claim`, `created_at`, `evidence: [{id, doi}]`) whose placeholder Evidence carries the cited paper's DOI looked up from `work/reference/index.json#citations[<cite-key>].doi` **but no `quote:` selector yet** — LITERATURE fills those in. Each option that draws on a placeholder cites it via `Option.insights: [<insight_id>, ...]` (the back-reference that links options to prior_insights in the ASTRA grammar). `
|
|
25
|
+
- `astra.yaml` — **filled form**: each sub-analysis's `decisions:` populated with decision-level `rationale:` prose plus options (the paper's choice is identified by `default:`); `findings:` populated as full `Insight` blocks with paper-anchored `evidence:` (the target paper's DOI + `quote: {exact, prefix, suffix}` + `location: {page: N}`); `prior_insights:` populated as citation **placeholders** — each a syntactically-complete `Insight` (`id`, `claim`, `created_at`, `evidence: [{id, doi}]`) whose placeholder Evidence carries the cited paper's DOI looked up from `work/reference/index.json#citations[<cite-key>].doi` **but no `quote:` selector yet** — LITERATURE fills those in. Each option that draws on a placeholder cites it via `Option.insights: [<insight_id>, ...]` (the back-reference that links options to prior_insights in the ASTRA grammar). `astra validate astra.yaml` returns clean (Evidence with `doi:` and no `quote:` is structurally valid at this stage); `astra validate astra.yaml --verify-evidence` runs after LITERATURE has authored the quotes.
|
|
26
26
|
- `universes/baseline.yaml` — selects the paper's choices (where paper and code disagree per the canonical-resolution rule, see "Material conflicts" below)
|
|
27
27
|
- `implementation-notes.md` — concise practical guidance for the IMPLEMENT phase: tricky algorithms, numerical gotchas, data-format quirks, things the spec can't capture. Bullets, not essays.
|
|
28
28
|
- `targets/targets.md` — small target ledger COMPARE consumes: per output (already declared by ARCHITECT), a brief entry with type, priority, paper value, expected match criteria, and the path to the reference figure / table / metric (when applicable, copy the reference file into `targets/` so the directory is self-contained)
|
|
29
29
|
- `CLAUDE.md` updates — append entries to **Paper-vs-code disagreements** for each material conflict surfaced
|
|
30
30
|
- `constitution.md` updates — Open dimensions when something material warrants user ratification at REVIEW
|
|
31
31
|
|
|
32
|
-
##
|
|
32
|
+
## Prose discipline
|
|
33
33
|
|
|
34
|
-
-
|
|
34
|
+
Per-element prose lives directly on the entries SPECIFY authors: each decision's `rationale:` carries the paper's stated reasoning (or the code's, where canonical-resolution applies); findings and prior_insights carry their `claim:` and optional `notes:`. Keep the paper's hedges and qualifiers intact and don't add editorial commentary beyond what the paper supports.
|
|
35
35
|
|
|
36
|
-
Your responsibility in this phase is the **content**: build out the `decisions:` / `prior_insights:` / `findings:` for each sub-analysis (each with its own evidence shape — detailed below)
|
|
36
|
+
Your responsibility in this phase is the **content**: build out the `decisions:` / `prior_insights:` / `findings:` for each sub-analysis (each with its own evidence shape — detailed below). ARCHITECT already settled the structure and the orienting `description:` blocks.
|
|
37
37
|
|
|
38
38
|
## The two-pass-per-sub-analysis structure
|
|
39
39
|
|
|
@@ -46,7 +46,7 @@ Read the paper's section(s) covering this sub-analysis. Author:
|
|
|
46
46
|
1. **`decisions:`** — every choice in this sub-analysis where a different defensible option could plausibly shift a numerical result: algorithmic methods, thresholds, statistical approaches, data selection criteria, calibration choices. Use `when`, `incompatible_with`, and `requires` constraints for non-independent decisions.
|
|
47
47
|
|
|
48
48
|
For each decision, the paper-pass authors:
|
|
49
|
-
- **Decision-level fields:** `label:` (short human-readable name), `rationale:` (the paper's stated reasoning
|
|
49
|
+
- **Decision-level fields:** `label:` (short human-readable name), `rationale:` (the paper's stated reasoning, authored as prose), `default:` (the option the paper actually selects), and `options:` (the map of option entries below).
|
|
50
50
|
- **Options:** the chosen option plus any sibling alternatives the paper discusses. Each option carries `label:` (required) and an optional `description:`. Per the 0.0.10 grammar, options do **not** carry their own `rationale:` or `evidence:` block — the decision's `rationale:` covers the reasoning; paper-text evidence flows through `findings:` (for the paper's own quantitative claims) or via `Option.insights` back-references into `prior_insights:` (for citation-backed support).
|
|
51
51
|
- **Option ↔ prior_insights linkage:** when the option's support derives from cited literature, list the relevant `prior_insights:` ids in `Option.insights: [<insight_id>, ...]`. The placeholder block under `prior_insights:` (authored in step 2 below) is the back-end of this link — LITERATURE fills in the verbatim cited-paper quote later. **Scope rules** (astra-tools ≥ 0.2.9): bare ids resolve **node-locally only** — the prior_insight must be declared in the same sub-analysis as the option. For a citation declared at an ancestor scope, use explicit upward refs: `[../id]` for the parent, `[../../id]` for the grandparent, etc. (same `../` grammar as `Input.from` and `Decision.from`). The natural shape — declare each cited paper at the sub-analysis that uses it, reference with a bare id from same-scope options — keeps everything node-local and needs no `../`.
|
|
52
52
|
|
|
@@ -56,7 +56,7 @@ Read the paper's section(s) covering this sub-analysis. Author:
|
|
|
56
56
|
decisions:
|
|
57
57
|
<decision_id>:
|
|
58
58
|
label: "<short human-readable name>"
|
|
59
|
-
rationale: "<the paper's stated reasoning,
|
|
59
|
+
rationale: "<the paper's stated reasoning, as prose>"
|
|
60
60
|
default: <chosen_option_id>
|
|
61
61
|
options:
|
|
62
62
|
<option_id>:
|
|
@@ -101,9 +101,7 @@ Read the paper's section(s) covering this sub-analysis. Author:
|
|
|
101
101
|
location: { page: <N> }
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
-
4. **
|
|
105
|
-
|
|
106
|
-
5. **Verify finding quotes against the paper source by Grep.** For each `findings:` Evidence entry with a `quote:`, Grep the paper source to confirm the `exact:` text is verbatim and the `prefix:` / `suffix:` are real surrounding text. `astra validate --verify-evidence` will run the deterministic check across every quote later (after LITERATURE resolves the `prior_insights:` placeholders); a manual Grep now catches typos and paraphrases before the code pass.
|
|
104
|
+
4. **Verify finding quotes against the paper source by Grep.** For each `findings:` Evidence entry with a `quote:`, Grep the paper source to confirm the `exact:` text is verbatim and the `prefix:` / `suffix:` are real surrounding text. `astra validate --verify-evidence` will run the deterministic check across every quote later (after LITERATURE resolves the `prior_insights:` placeholders); a manual Grep now catches typos and paraphrases before the code pass.
|
|
107
105
|
|
|
108
106
|
### Pass B — code pass (when `work/reference/code/` exists)
|
|
109
107
|
|
|
@@ -132,9 +130,8 @@ The cross-check questions on entry: are the decisions covering everything materi
|
|
|
132
130
|
3. **Evidence verification.** Every `findings:` Evidence entry uses `TextQuoteSelector` with a verbatim `exact:` quote, real surrounding-text `prefix:` / `suffix:`, and a `location: {page: N}` (1-indexed). Quotes that are paraphrased or whose `prefix:` / `suffix:` are editorial parentheticals will fail `--verify-evidence`. `prior_insights:` placeholders intentionally have `evidence: [{id, doi}]` without a `quote:` at this stage — LITERATURE authors the quotes — so do not flag a missing quote on placeholder entries. After LITERATURE resolves the placeholders, run `astra validate astra.yaml --verify-evidence`.
|
|
133
131
|
4. **Findings traceability.** Each `findings:` Insight's `evidence:` resolves either to a real paper claim (target-paper DOI + verbatim `quote:` + page) or to a real declared output via `artifact: <output_id>` (with optional `source_commit:` and `snapshot:`).
|
|
134
132
|
5. **Material-disagreement surfacing.** Where paper and code disagree on a material choice, the spec records both options under the relevant `decisions:` entry, `universes/baseline.yaml` selects the code's option (canonical-resolution default), and the conflict is appended to CLAUDE.md's *Paper-vs-code disagreements* section plus `open-questions.md` for the user to resolve at REVIEW close-out. Flag any material disagreement that got silently dropped, that didn't make it into the disagreements log, or where the baseline picked the paper without the canonical-resolution rule applying.
|
|
135
|
-
6. **
|
|
136
|
-
7.
|
|
137
|
-
8. **No synthetic data.** Unless the paper itself uses synthetic data, every input has a real acquisition source — no mock / synthetic substitutes anywhere in the sub-analysis's inputs, decisions, or implementation-notes.
|
|
133
|
+
6. **Prose voice fidelity.** Hedges and qualifiers from the paper survive in the decisions' `rationale:` and the findings' `claim:` / `notes:`. Editorial commentary added beyond what the paper supports gets flagged.
|
|
134
|
+
7. **No synthetic data.** Unless the paper itself uses synthetic data, every input has a real acquisition source — no mock / synthetic substitutes anywhere in the sub-analysis's inputs, decisions, or implementation-notes.
|
|
138
135
|
|
|
139
136
|
Apply fixes inline as you find them — `astra.yaml`, `universes/baseline.yaml`, `implementation-notes.md`, the disagreements log in CLAUDE.md as needed. The diff against the prior commit is the record of what changed. After any change to `astra.yaml`:
|
|
140
137
|
|
|
@@ -175,11 +172,11 @@ Out-of-scope targets stay in `targets/targets.md` with an explicit reason and sh
|
|
|
175
172
|
- **Equation and section numbers must match the rendered paper / PDF**, not a naïve count of TeX blocks or markdown headings. When citing "eq. N" or "§N", find the equation or heading by content in the rendered paper and use the printed number.
|
|
176
173
|
- **Validate** with `astra validate astra.yaml` after each pass.
|
|
177
174
|
- **Targeted reads, not whole-paper absorption.** Use `work/reference/index.json` and `work/reference/code-index.md` for structural lookups; Grep into `work/reference/source/` (Path A) or `work/reference/document.md` (Path B) for specific verbatim quotes; read targeted code modules under `work/reference/code/` for canonical method details. Don't re-read the whole paper or whole code base.
|
|
178
|
-
- **
|
|
175
|
+
- **Content correctness, not structure.** ARCHITECT settled the structure and the orienting `description:` blocks; SPECIFY's contribution is the `decisions:` / `prior_insights:` / `findings:` content and the prose on those entries.
|
|
179
176
|
|
|
180
177
|
## Survey signals (entry into SPECIFY)
|
|
181
178
|
|
|
182
|
-
- `astra.yaml` exists with stub form (sub-analyses + inputs + outputs +
|
|
179
|
+
- `astra.yaml` exists with stub form (sub-analyses + inputs + outputs + per-analysis `description`; empty decisions / prior_insights / findings) ⇒ ready to specify
|
|
183
180
|
- For each sub-analysis: `decisions:` populated with decision-level `rationale:` + options (paper's choice at `default:`); `findings:` populated as full Insight blocks with paper-anchored Evidence (DOI + `quote: {exact, prefix, suffix}` + `location: {page}`); `prior_insights:` populated as citation placeholders (`id`, `claim`, `created_at`, `evidence: [{id, doi}]` with `quote:` omitted — LITERATURE fills the quotes next); `Option.insights` back-references wired up where options draw on placeholders ⇒ paper pass done
|
|
184
181
|
- For each sub-analysis: when `work/reference/code/` exists, code-pass material-disagreement entries land in `decisions:` (with both options) and `universes/baseline.yaml` selects the canonical-resolution choice; `implementation-notes.md` carries non-material gotchas ⇒ code pass done
|
|
185
182
|
- For each sub-analysis: a fresh-context iteration reads the slice and finds nothing to fix ⇒ that sub-analysis is done; the next iteration moves on
|
|
@@ -191,7 +188,7 @@ Out-of-scope targets stay in `targets/targets.md` with an explicit reason and sh
|
|
|
191
188
|
## Notes
|
|
192
189
|
|
|
193
190
|
- **Material disagreements** are appended to CLAUDE.md's **Paper-vs-code disagreements** section AND `open-questions.md`. CLAUDE.md is the at-a-glance summary every iteration sees; `open-questions.md` is the user-resolution accumulator. Both lead to the same place: the user resolves at REVIEW close-out.
|
|
194
|
-
- **
|
|
191
|
+
- **SPECIFY owns content, not structure.** Its job is content correctness — the `decisions:` / `prior_insights:` / `findings:` and the `rationale:` / `claim:` / `notes:` prose on them. The orienting `description:` blocks were ARCHITECT's; the structural surface is fixed.
|
|
195
192
|
- **The target ledger is a derivation, not a separate phase's output.** Treat `targets/targets.md` as a small index produced alongside the filled `astra.yaml`, not a heavyweight artifact. The depth lives in `astra.yaml`'s `outputs:` / `findings:` / `decisions:`.
|
|
196
193
|
- **Two-pass discipline is the cross-check.** Skipping the code pass (when code exists) loses the canonical-resolution surface and lets paper-vs-code material disagreements slip through. The fresh-context review can recover *some* of these but not all — the disciplined sequence (paper → code → review) catches more.
|
|
197
194
|
- **Per-sub-analysis parallelism is opt-in.** When sub-analyses are independent (no shared decision blocks, no cross-sub-analysis findings), the iteration can fan out one-level-deep sub-agents (one per sub-analysis from inside its main session) to run their passes in parallel. When they share material decisions or findings (rare), serialize across iterations.
|
|
@@ -25,7 +25,7 @@ Then sharpen:
|
|
|
25
25
|
- "What would a clear answer look like?" (sharpens the description)
|
|
26
26
|
- "Why does this matter?" (context for decisions)
|
|
27
27
|
|
|
28
|
-
**Update astra.yaml** — set `name`. (`astra init` scaffolded a placeholder example decision/input/output plus a TODO `
|
|
28
|
+
**Update astra.yaml** — set `name`. (`astra init` scaffolded a placeholder example decision/input/output plus a TODO `description`; the placeholder structure is replaced in Phases 2–3, and the `description` is filled in Finalize once structure has settled — written too early it goes stale.)
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
@@ -115,9 +115,9 @@ astra universe generate -n baseline
|
|
|
115
115
|
|
|
116
116
|
Generate only `baseline` unless the user explicitly asks for additional universes.
|
|
117
117
|
|
|
118
|
-
### Populate
|
|
118
|
+
### Populate Description
|
|
119
119
|
|
|
120
|
-
Replace the TODO
|
|
120
|
+
Replace the TODO `description:` in `astra.yaml` with a short one-or-two-paragraph orientation now that structure is stable — what the analysis is and how its pieces fit together. Keep it brief; per-element prose lives on each Input/Output/Decision/Option via `description`/`rationale`.
|
|
121
121
|
|
|
122
122
|
### Populate CLAUDE.md
|
|
123
123
|
|