2026-05-14 22:05:10 +02:00
|
|
|
---
|
|
|
|
|
id: IB-WP-0016
|
|
|
|
|
type: workplan
|
|
|
|
|
title: "Lefevre EPUB3 Infospace Readiness Pilot"
|
2026-06-22 23:16:25 +02:00
|
|
|
domain: communication
|
2026-05-14 22:05:10 +02:00
|
|
|
repo: infospace-bench
|
IB-WP-0016-T07: review report and output policy; close IB-WP-0016
Enrich reports/generation-summary.md with the review-oriented sections
that the 2026-05-17 smoke run flagged as missing: ## Chapter coverage
(per-chapter source/entity/relation/anchor counts), ## Entities (the
deduped title list), ## Unmapped source chunks (sources with no
downstream generated artifact), and ## Page anchors (total plus
deterministic sample). Sections are conditional on data being present
so generic non-Lefevre runs stay terse.
Add docs/lefevre-readiness.md as the final sign-off document for
IB-WP-0016: what is wired (T01-T06 recap), an output policy table
(checked-in fixture sources vs disposable generated infospaces vs
archive targets), a seven-item reviewer checklist (duplicate entities,
relation endpoints, weak evidence, overgeneralization, anchor
coverage, unmapped sources, plan-vs-actual variance), a scale-up plan
from one-chapter to full-book, and the load-bearing risks still
outstanding (cross-chunk dedup, whole-run resume, adaptive routing
deferred to LLM-WP-0004 / IB-WP-0018, rate-table drift).
Closes IB-WP-0016 (Lefevre EPUB3 Infospace Readiness Pilot): T01-T07
all done; the workplan is set to status=done.
131 tests pass, 1 skipped (live OpenRouter smoke, correctly gated).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 01:22:41 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
owner: markitect
|
|
|
|
|
topic_slug: markitect
|
|
|
|
|
created: "2026-05-14"
|
IB-WP-0016-T01: spine-aware EPUB3 intake
Parse META-INF/container.xml and the OPF package document, then iterate
documents in spine reading order instead of archive-name sort. Classify
each spine item (body, cover, nav, toc, header, footer, notes, license,
auxiliary) and exclude non-body sections by default; include_non_body=True
opts them back in for inspection. Capture OPF book metadata (title,
creator, language, subjects, rights, identifier, source_url, modified)
onto every chunk and propagate it through source artifact provenance.
Preserve the legacy zip-without-OPF fallback for malformed EPUBs.
Real Lefevre EPUB now yields 148 body chunks in spine order (was 155
mixed, archive-sorted) with cover=1, header=1, footer=4 detected and
dropped. 78 tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 13:52:24 +02:00
|
|
|
updated: "2026-05-17"
|
2026-05-14 22:05:10 +02:00
|
|
|
state_hub_workstream_slug: "ib-wp-0016-lefevre-ebook-infospace-readiness"
|
|
|
|
|
state_hub_workstream_id: "23be7d20-b01f-4b17-9851-4d540e4c0984"
|
|
|
|
|
depends_on_workplans:
|
|
|
|
|
- IB-WP-0015
|
|
|
|
|
related_workplans:
|
2026-06-22 23:16:25 +02:00
|
|
|
- IB-WP-0014---
|
2026-05-14 22:05:10 +02:00
|
|
|
|
|
|
|
|
# IB-WP-0016 - Lefevre EPUB3 Infospace Readiness Pilot
|
|
|
|
|
|
|
|
|
|
## Goal
|
|
|
|
|
|
|
|
|
|
Use Edwin Lefevre's `Reminiscences of a Stock Operator` EPUB3 as the next real
|
|
|
|
|
ebook example for `infospace-bench`, and close the gaps that prevent a serious
|
|
|
|
|
OpenRouter-backed full-book infospace build.
|
|
|
|
|
|
|
|
|
|
This workplan should leave us able to run a bounded command like:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
infospace-bench generate from-source \
|
|
|
|
|
/mnt/c/Users/bernd.worsch/Downloads/LefevreEdwin-ReminiscencesOfAStockOperator.epub \
|
|
|
|
|
--slug reminiscences-stock-operator \
|
|
|
|
|
--name "Reminiscences of a Stock Operator" \
|
|
|
|
|
--profile trading-literature \
|
|
|
|
|
--provider openrouter \
|
|
|
|
|
--model <openrouter-model-id> \
|
|
|
|
|
--chapter I \
|
|
|
|
|
--cost-cap <cap> \
|
|
|
|
|
--apply
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
and then scale from one reviewed chapter to the full book without losing
|
|
|
|
|
provenance, reviewability, or cost control.
|
|
|
|
|
|
|
|
|
|
## Validation Baseline
|
|
|
|
|
|
2026-05-17 16:13:39 +02:00
|
|
|
Validation note: `docs/lefevre-epub3-validation.md` (includes T01 and T02
|
|
|
|
|
result sections).
|
|
|
|
|
|
|
|
|
|
After T01 and T02, the local Lefevre EPUB is intake-ready:
|
|
|
|
|
|
|
|
|
|
- 67 body chunks at default `max_words=800`, all 24 roman-numeral chapters
|
|
|
|
|
detected, stable IDs `chapter-01..chapter-24` with `-part-NNN` suffix
|
|
|
|
|
- Cover, PG header/footer, Contents, Transcriber's Notes, and license
|
|
|
|
|
sections classified out of the body stream by default
|
|
|
|
|
- Per-chunk provenance carries full OPF book metadata, chapter label and
|
|
|
|
|
number, page anchors, and spine index
|
|
|
|
|
|
|
|
|
|
### Smoke Run (2026-05-17)
|
|
|
|
|
|
|
|
|
|
A fixture-backed end-to-end smoke run with `--max-chunks 3` against the
|
|
|
|
|
real EPUB produced a complete infospace:
|
|
|
|
|
|
|
|
|
|
- 3 source chunks (`chapter-01-part-001..003`), 3 entities, 3 relations,
|
|
|
|
|
3 evaluations, 1 generation-summary report
|
|
|
|
|
- All chapter/book/anchor provenance fields land in `artifacts/index.yaml`
|
|
|
|
|
(verified: `chapter_label=I`, `chapter_number=1`,
|
|
|
|
|
`page_anchors=[Page_1, Page_2, Page_3]` on the first chunk)
|
|
|
|
|
- Metrics viable: `coverage=1.0`, `redundancy=0.0`,
|
|
|
|
|
`granularity_entropy=1.79`, viability gates pass
|
|
|
|
|
- Same-title entities returned by repeated stages were upserted to single
|
|
|
|
|
artifact files — basic dedupe works for exact-title matches
|
|
|
|
|
|
|
|
|
|
### Remaining Gaps
|
|
|
|
|
|
|
|
|
|
These are the gaps a serious full-book run still hits:
|
|
|
|
|
|
|
|
|
|
- No compact `plan` output for cost/call preview on a 67-chunk run
|
|
|
|
|
(~5 stages per chunk = ~335 provider calls at default `max_words`) — T03
|
|
|
|
|
- No `--chapter`, `--from-chapter`, `--to-chapter`, `--cost-cap`, or
|
|
|
|
|
`--max-calls` selection — T03
|
|
|
|
|
- Generic profile produces sensible structure but does not push concepts
|
|
|
|
|
toward traders, markets, lessons, or strategies — T04
|
|
|
|
|
- The generation-summary report only shows counts and metrics; it should
|
|
|
|
|
surface entity titles, chapter coverage, page-anchor links, and unmapped
|
|
|
|
|
chunks for human review — T07
|
|
|
|
|
- Long-book resume is still whole-run-skip, not chunk-level — T06
|
|
|
|
|
- Near-duplicate entities across chunks (e.g. "Larry Livingston" vs "the
|
|
|
|
|
narrator") need cross-chunk merge/dedupe policy before a 24-chapter run
|
2026-05-14 22:05:10 +02:00
|
|
|
|
|
|
|
|
## Non-Goals
|
|
|
|
|
|
|
|
|
|
- Do not commit a full generated Lefevre infospace before review.
|
|
|
|
|
- Do not make live OpenRouter calls in the default test suite.
|
|
|
|
|
- Do not store API keys or provider secrets in the infospace.
|
|
|
|
|
- Do not build a general-purpose EPUB conversion suite beyond what the
|
|
|
|
|
infospace generator needs.
|
|
|
|
|
|
|
|
|
|
## Tasks
|
|
|
|
|
|
|
|
|
|
### T01 - Spine-aware EPUB3 intake
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T01
|
IB-WP-0016-T01: spine-aware EPUB3 intake
Parse META-INF/container.xml and the OPF package document, then iterate
documents in spine reading order instead of archive-name sort. Classify
each spine item (body, cover, nav, toc, header, footer, notes, license,
auxiliary) and exclude non-body sections by default; include_non_body=True
opts them back in for inspection. Capture OPF book metadata (title,
creator, language, subjects, rights, identifier, source_url, modified)
onto every chunk and propagate it through source artifact provenance.
Preserve the legacy zip-without-OPF fallback for malformed EPUBs.
Real Lefevre EPUB now yields 148 body chunks in spine order (was 155
mixed, archive-sorted) with cover=1, header=1, footer=4 detected and
dropped. 78 tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 13:52:24 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: high
|
|
|
|
|
state_hub_task_id: "a672fcf9-1b80-4faf-b16d-84ca52601dc9"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Parse `META-INF/container.xml` to find the package document
|
|
|
|
|
- Parse OPF metadata, manifest, and spine
|
|
|
|
|
- Follow spine reading order instead of archive-name sorting
|
|
|
|
|
- Preserve book title, creator, source URL, subjects, language, rights, and
|
|
|
|
|
modified timestamp in source provenance
|
|
|
|
|
- Exclude or tag cover, nav, table-of-contents, Project Gutenberg header,
|
|
|
|
|
transcriber notes, and license/footer material by explicit policy
|
|
|
|
|
- Add tests using a small EPUB3 fixture with nav, cover, body, notes, and footer
|
|
|
|
|
|
|
|
|
|
### T02 - Chapter-aware chunking and IDs
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T02
|
IB-WP-0016-T02: chapter-aware chunking and stable IDs
Resolve chapter labels from EPUB nav entries (when present) and from the
first in-document h1/h2/h3 heading, parse roman-numeral and "Chapter N"
labels into numeric chapter indices, and generate stable IDs of the form
chapter-NN with -part-NNN suffix when a chapter exceeds max_words. The
chunker now operates on cleaned body text, distributes id="Page_*" page
anchors per part via inline markers extracted before splitting, and
supports a configurable overlap_words evidence window between adjacent
parts of the same chapter. Reclassify body sections whose chapter label
matches contents/transcriber-notes/license/colophon tokens so they leave
the body stream by default. Strip <head>...</head> from HTML body
extraction to stop the <title> tag from duplicating heading text in the
chunk markdown.
Real Lefevre EPUB now detects all 24 roman-numeral chapters with stable
chapter-NN IDs, distributes Page_N anchors across multi-part chapters,
and reclassifies Contents and Transcriber's Notes out of body
(role histogram body=67, cover=1, header=1, toc=1, notes=1, footer=2).
82 tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 15:52:47 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: high
|
|
|
|
|
state_hub_task_id: "47de1110-36d0-4d63-bf87-389746509e03"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Resolve chapter labels from EPUB nav entries and in-document headings
|
|
|
|
|
- Generate stable IDs like `chapter-01`, `chapter-01-part-002`, not repeated
|
|
|
|
|
Gutenberg document titles
|
|
|
|
|
- Chunk within chapter boundaries with a configurable word limit
|
|
|
|
|
- Consider overlap or evidence-window context without duplicating headings
|
|
|
|
|
- Preserve page anchors where available as optional provenance
|
|
|
|
|
- Add tests showing `Reminiscences`-style roman numeral chapters become stable
|
|
|
|
|
ordered source chunks
|
|
|
|
|
|
|
|
|
|
### T03 - Scale-aware generation planning
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T03
|
IB-WP-0016-T03: scale-aware planning
Replace generate plan's full-prompt dump with a compact summary that
reports selected-chunk counts, selected chapter numbers, per-workflow
call counts, prompt-word and token estimates, and a rough USD cost when
--cost-per-1k is supplied. Selection filters --chapter (label or number,
repeatable), --from-chapter / --to-chapter (numeric range), and --chunk
(repeatable id) shape the estimate. Budget caps --max-calls and
--cost-cap are reported as exceeds_* booleans so callers can fail fast
before run.
The old full per-workflow plan with prompts remains available behind
--full so deep inspection is opt-in instead of the default.
Whole-Lefevre estimate at default max_words=800: 146 chunks, 730 calls,
~518k prompt tokens, ~$155 at $0.30/1k. Chapters 3-5 only: 19 chunks,
95 calls, ~64k tokens. 87 tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 18:18:09 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: high
|
|
|
|
|
state_hub_task_id: "bee5c38a-f052-4edb-9313-b3a2ee5a6c26"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Add compact plan output for long sources
|
|
|
|
|
- Report estimated chunks, workflow stages, provider call count, prompt word or
|
|
|
|
|
token estimate, and rough cost inputs
|
|
|
|
|
- Add CLI selection filters such as `--chapter`, `--chunk`, `--from-chapter`,
|
|
|
|
|
`--to-chapter`, `--max-calls`, and `--cost-cap`
|
|
|
|
|
- Keep full prompt inspection available, but do not make it the default for
|
|
|
|
|
large corpora
|
|
|
|
|
- Add tests proving plan output is compact and does not dump hundreds of prompts
|
|
|
|
|
|
|
|
|
|
### T04 - Trading-literature profile
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T04
|
IB-WP-0016-T04: trading-literature profile
Ship a specialized profile for trading memoirs and market-structure
texts. The profile names eight entity categories (trader, market,
strategy, error, psychological_pattern, institution, instrument,
evidence_bearing_claim), five relation types (cause_effect,
lesson_evidence, risk_mitigation, actor_venue, strategy_outcome), and
four evaluation criteria (groundedness, lesson_clarity,
historical_context, overgeneralization_risk). Each is reflected in the
prompts and contracts so the LLM is steered toward operator-level
findings rather than biographical detail or moralising.
The generic profile remains the default. A 2-chapter Lefevre smoke run
with --profile trading-literature completes end-to-end with viable
metrics; 93 tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 18:59:45 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: medium
|
|
|
|
|
state_hub_task_id: "1a1b8fde-773f-46a6-887a-3c87a425d7a3"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Add or specialize a profile for trading memoir and market-structure texts
|
|
|
|
|
- Tune entity prompts for traders, markets, strategies, errors, psychological
|
|
|
|
|
patterns, institutions, instruments, and evidence-bearing claims
|
|
|
|
|
- Tune relation prompts for cause/effect, lesson/evidence, risk/mitigation,
|
|
|
|
|
actor/venue, and strategy/outcome links
|
|
|
|
|
- Tune evaluation criteria for groundedness, lesson clarity, historical context,
|
|
|
|
|
and overgeneralization risk
|
|
|
|
|
- Keep the generic profile usable for non-trading books
|
|
|
|
|
|
|
|
|
|
### T05 - Deterministic Lefevre acceptance fixture
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T05
|
IB-WP-0016-T05: deterministic Lefevre acceptance fixture
Check in a small Lefevre-shaped EPUB fixture as separate source files
under tests/fixtures/lefevre/sources/ (container.xml, OPF, nav, cover,
PG header, three roman-numeral chapters with page anchors,
transcriber notes, license, PG footer). The test helper assembles
these into an EPUB at test time so the inputs stay inspectable in git.
Fixture responses tuned to the trading-literature profile (T04) live
at tests/fixtures/lefevre/responses.yaml: trader / institution /
strategy categories on entities, strategy_outcome / actor_venue
relation types, and all four trading-tuned evaluation criteria.
Three tests cover the acceptance:
- end-to-end Python pipeline: stable chapter-NN source slugs, full
artifact tree (entities, relations, evaluations, metrics, history,
generation report), budget registry persisted, chapter_number
provenance round-trips through artifacts/index.yaml
- regression: PG boilerplate (cover, nav, header, notes, license,
footer) is excluded by default and only appears under
include_non_body=True
- CLI smoke through generate from-source --profile trading-literature
--fixture-responses ...
125 tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 22:31:17 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: high
|
|
|
|
|
state_hub_task_id: "c9bbc84e-691b-4530-a79a-6ecfa9c41fdd"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Add a small checked-in EPUB-like or extracted chapter fixture derived from
|
|
|
|
|
public-domain Lefevre structure
|
|
|
|
|
- Add deterministic fixture responses for source summary, entity extraction,
|
|
|
|
|
relation extraction, and evaluation
|
|
|
|
|
- Prove the fixture generates a manifest-backed infospace with stable source,
|
|
|
|
|
entity, relation, evaluation, metrics, history, and report artifacts
|
|
|
|
|
- Include a regression test for excluding Gutenberg boilerplate when requested
|
|
|
|
|
|
|
|
|
|
### T06 - OpenRouter live-run guardrails
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T06
|
IB-WP-0016-T06: OpenRouter live-run guardrails
Add --chapter / --from-chapter / --to-chapter / --chunk selection flags
to generate init and generate from-source, plumb them into
init_generation_infospace via a new _filter_chunks_by_chapter helper,
and refuse to create an infospace when the filters reject every chunk
(InfospaceError "empty_chapter_selection"). The flags use the same
T03/T02 plumbing (chapter labels, roman numerals, chunk ids) so a
single-chapter selection is a one-flag command.
OpenRouter run-record metadata (model, request_id, usage tokens,
retry_count, duration_seconds) already lands in
output/workflows/runs/*.yaml; this task just adds the smoke test that
proves it stays there, plus the parallel guarantee that the same
provider metadata reaches generated artifact provenance via
provenance.provider_metadata.
tests/test_openrouter_live.py covers:
- chapter-filter, from/to-chapter range, and empty-selection failure on
init (non-live, deterministic)
- CLI smoke through generate from-source with --chapter
- a pytest-skipped live OpenRouter one-chapter end-to-end gated by
OPENROUTER_API_KEY + INFOSPACE_BENCH_ENABLE_LIVE_OPENROUTER, with
INFOSPACE_BENCH_LIVE_MODEL override (default openai/gpt-4o-mini)
docs/generic-source-generator.md gains a "Live OpenRouter runs (handle
with care)" section that walks plan-before-run, single-chapter live
run, the budget/usage artifacts, and the checks a reviewer should run
before scaling to the full book.
129 tests pass, 1 skipped (the live smoke, correctly gated).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 23:04:19 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: high
|
|
|
|
|
state_hub_task_id: "c6bf97c3-1c2c-4993-8f4f-97a48e01cce2"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Add an optional live smoke test path that is skipped unless credentials and an
|
|
|
|
|
explicit opt-in environment variable are present
|
|
|
|
|
- Support a one-chapter OpenRouter run with selected model, bounded retries,
|
|
|
|
|
cost/call cap, provider metadata, and resume
|
|
|
|
|
- Record provider model, request IDs, timing, usage, and retry counts in run
|
|
|
|
|
records and generated artifact provenance
|
|
|
|
|
- Document how to run the smoke safely and how to stop before a full-book build
|
|
|
|
|
|
|
|
|
|
### T07 - Example output and review policy
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: IB-WP-0016-T07
|
IB-WP-0016-T07: review report and output policy; close IB-WP-0016
Enrich reports/generation-summary.md with the review-oriented sections
that the 2026-05-17 smoke run flagged as missing: ## Chapter coverage
(per-chapter source/entity/relation/anchor counts), ## Entities (the
deduped title list), ## Unmapped source chunks (sources with no
downstream generated artifact), and ## Page anchors (total plus
deterministic sample). Sections are conditional on data being present
so generic non-Lefevre runs stay terse.
Add docs/lefevre-readiness.md as the final sign-off document for
IB-WP-0016: what is wired (T01-T06 recap), an output policy table
(checked-in fixture sources vs disposable generated infospaces vs
archive targets), a seven-item reviewer checklist (duplicate entities,
relation endpoints, weak evidence, overgeneralization, anchor
coverage, unmapped sources, plan-vs-actual variance), a scale-up plan
from one-chapter to full-book, and the load-bearing risks still
outstanding (cross-chunk dedup, whole-run resume, adaptive routing
deferred to LLM-WP-0004 / IB-WP-0018, rate-table drift).
Closes IB-WP-0016 (Lefevre EPUB3 Infospace Readiness Pilot): T01-T07
all done; the workplan is set to status=done.
131 tests pass, 1 skipped (live OpenRouter smoke, correctly gated).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 01:22:41 +02:00
|
|
|
status: done
|
2026-05-14 22:05:10 +02:00
|
|
|
priority: medium
|
|
|
|
|
state_hub_task_id: "5ff1f11e-49ad-4c2d-bd4c-b8cc261309bc"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Define where generated Lefevre outputs live
|
|
|
|
|
- Decide what is committed, what remains disposable, and what needs human review
|
|
|
|
|
- Add a review checklist for duplicate entities, relation endpoints, weak
|
|
|
|
|
evidence, and over-broad trading lessons
|
|
|
|
|
- Add a final readiness report before generating the full book
|
2026-05-17 16:13:39 +02:00
|
|
|
- Enrich `reports/generation-summary.md` beyond counts and metrics: list
|
|
|
|
|
entity titles, per-chapter coverage, page-anchor links, and any unmapped
|
|
|
|
|
source chunks (gap found in the 2026-05-17 smoke run)
|
2026-05-14 22:05:10 +02:00
|
|
|
|
|
|
|
|
## Acceptance
|
|
|
|
|
|
|
|
|
|
- Current local EPUB can be inspected as EPUB3 with metadata and ordered body
|
|
|
|
|
sections
|
|
|
|
|
- `generate init` can import the book as body-only ordered chapter chunks
|
|
|
|
|
- Chunk titles and IDs are stable, readable, and not dominated by Project
|
|
|
|
|
Gutenberg boilerplate
|
|
|
|
|
- `generate plan` gives compact cost/call planning for the full book
|
|
|
|
|
- A deterministic Lefevre-style fixture generates a complete infospace without
|
|
|
|
|
network access
|
|
|
|
|
- Optional one-chapter OpenRouter smoke run is explicit, bounded, resumable, and
|
|
|
|
|
skipped by default
|
|
|
|
|
- A full-book run has documented review and output policy before execution
|
|
|
|
|
|