What happened
.claude/skills/lc-from-paper/references/specify.md instructs the SPECIFY sub-agent to author astra.yaml blocks in a shape that the installed astra-spec (0.0.10) rejects wholesale. The skill bundle is written against what looks like a future 1.0 grammar; the runtime hasn't caught up. There is no early signal — astra validate prints a quiet "analysis declares ASTRA spec version 1.0, but astra-spec 0.0.10 is installed; validation reflects the installed version" warning at the top, then continues, so SPECIFY only discovers the mismatch after authoring entire decision/insight/finding blocks and round-tripping each one through astra validate.
Concretely, specify.md tells SPECIFY to author (paraphrased):
prior_insights: placeholders with decision_links: mapping to options, plus doi: and claim: directly on the Insight
decisions: with name: + description: at the decision level, and per-option rationale: + evidence: blocks
evidence: blocks as TextQuoteSelector with source: and anchor: siblings
The 0.0.10 schema actually has:
Insight: id, label, claim, created_at (required ISO datetime), evidence: list[Evidence]. No decision_links, no value, no doi on Insight. DOI lives on each Evidence under a strict ^10\\.\\d{4,}/.*$ pattern.
Decision: id, label, rationale, tags, default, options: dict[str, Option]. No name, no description.
Option: id, label, description, insights: list[str] (back-refs to prior_insight IDs), incompatible_with, requires, excluded, excluded_reason. No rationale, no evidence directly on the option — evidence lives only inside Insights.
Evidence: id, doi or artifact, optional quote: TextQuoteSelector (just exact/prefix/suffix — no source, no anchor).
So decisions flow through prior_insights via Option.insights back-refs; evidence (and its quote selector) lives inside Insight, not on the decision/option/finding directly.
Reproduction
In a fresh lc-from-paper reproduction project against astra-spec 0.0.10, follow specify.md literally for any sub-analysis. Author a decisions: block with name: + per-option rationale: + per-option evidence: block as described in specify.md §"Pass A — paper pass". Run astra validate astra.yaml. The schema validator emits dozens of "Additional properties not allowed" / "Field required" errors per block. Same outcome for prior_insights: placeholders with decision_links: and findings: with value:.
What I'd ask for
- Either rebase specify.md (and the rest of lc-from-paper/references/, since they probably share this drift) onto the 0.0.10 grammar that ships with the harness today, or ship astra-spec 1.0 + the grammar specify.md actually documents
- Surface the mismatch louder than the current single-line warning — refuse to validate, or print a banner specifically when the analysis declares a version newer than the installed astra-spec
Related: I'm also filing an astra-spec validator bug separately (semantic.py:349 only looks at root prior_insights for Option.insights refs, breaking same-scope sub-analysis references), which I hit working around this docs mismatch.
Environment
- astra-spec: 0.0.10
- lightcone-cli: 0.3.4
- Python: 3.11.13
- Linux x86_64
— Claude on behalf of Cail
What happened
.claude/skills/lc-from-paper/references/specify.mdinstructs the SPECIFY sub-agent to authorastra.yamlblocks in a shape that the installedastra-spec(0.0.10) rejects wholesale. The skill bundle is written against what looks like a future 1.0 grammar; the runtime hasn't caught up. There is no early signal —astra validateprints a quiet "analysis declares ASTRA spec version 1.0, but astra-spec 0.0.10 is installed; validation reflects the installed version" warning at the top, then continues, so SPECIFY only discovers the mismatch after authoring entire decision/insight/finding blocks and round-tripping each one throughastra validate.Concretely, specify.md tells SPECIFY to author (paraphrased):
prior_insights:placeholders withdecision_links:mapping to options, plusdoi:andclaim:directly on the Insightdecisions:withname:+description:at the decision level, and per-optionrationale:+evidence:blocksevidence:blocks asTextQuoteSelectorwithsource:andanchor:siblingsThe 0.0.10 schema actually has:
Insight:id,label,claim,created_at(required ISO datetime),evidence: list[Evidence]. Nodecision_links, novalue, nodoion Insight. DOI lives on each Evidence under a strict^10\\.\\d{4,}/.*$pattern.Decision:id,label,rationale,tags,default,options: dict[str, Option]. Noname, nodescription.Option:id,label,description,insights: list[str](back-refs to prior_insight IDs),incompatible_with,requires,excluded,excluded_reason. Norationale, noevidencedirectly on the option — evidence lives only inside Insights.Evidence:id,doiorartifact, optionalquote: TextQuoteSelector(justexact/prefix/suffix— nosource, noanchor).So decisions flow through prior_insights via Option.insights back-refs; evidence (and its quote selector) lives inside Insight, not on the decision/option/finding directly.
Reproduction
In a fresh
lc-from-paperreproduction project against astra-spec 0.0.10, follow specify.md literally for any sub-analysis. Author adecisions:block withname:+ per-optionrationale:+ per-optionevidence:block as described in specify.md §"Pass A — paper pass". Runastra validate astra.yaml. The schema validator emits dozens of "Additional properties not allowed" / "Field required" errors per block. Same outcome forprior_insights:placeholders withdecision_links:andfindings:withvalue:.What I'd ask for
Related: I'm also filing an astra-spec validator bug separately (
semantic.py:349only looks at rootprior_insightsfor Option.insights refs, breaking same-scope sub-analysis references), which I hit working around this docs mismatch.Environment
— Claude on behalf of Cail