Skip to content

Spec 001 T005 and T006: a no-go, and the figures drawn in a step of their own - #87

Closed
adamjohnwright wants to merge 5 commits into
mainfrom
t005/measure-5
Closed

adamjohnwright wants to merge 5 commits into
mainfrom
t005/measure-5

Conversation

@adamjohnwright

Copy link
Copy Markdown
Contributor

Spec 001, T005 and T006. Replaces #83 to #86, with their reviews' findings fixed.

T005: a no-go. The render service, in the book's mix (85% reactions, 6% diagrams, 1% illustrations, 8% selections), cold, on a private copy of release 98's graph, on an 8-core host:

Concurrency Figures/s The book's 19,313 Core-seconds a figure
1 0.394 13 h 37 min 3.5
2 0.712 7 h 32 min 4.0
4 1.166 4 h 36 min 4.4
8 1.523 3 h 31 min 4.6

SC-003's figure budget needs 7.3 a second; the processors are the limit, and the cost per figure rises with concurrency. What T005 did not run, and why, is in research R7. Script: ci/measure/throughput.ts.

T006: the route taken. The figures are drawn by a step of their own before the book: pdf-export figures writes them to a folder with a manifest tying it to its release (new contracts/figures.md), after running the book's release-file and character checks; book --figures reads them, refuses a stale folder, and asks no render service. SC-003 is the book's time from figures already drawn; new SC-010 covers the figures' step. New task T046; T024, T029, T031, T037, T039 and T045 follow; contracts, research, data model, quickstart and plan updated to match.

From #83's review: the script chose a selection's ancestor differently from the book and stalled its client while sampling CPU; both fixed and all four settings re-run. R7's per-figure cost claims now follow from the table.

From #84's review: the folder's manifest carries a fingerprint (the graph's release number and checksum, the content service's release, the render service's build); figures refuses to resume another fingerprint and book faults it as stale-folder; a file is moved into place before its manifest entry; T046 follows T024. The runs' raw outputs are in ci/measure/results/2026-11-02/.

From #85's review: the fingerprint's parts are specified where they are read (render build in contracts/render.md, the graph checksum in data-model, the content release endpoint), and what it cannot see is stated and asked of WebsiteAngular (R10, T042). The manifest is an append-only journal; the script probes the service and fails on missing figures.

From #86's review: a figures folder is complete only with a closing complete line written after the end-of-run check; book faults incomplete-folder and no-checksum.

🤖 Generated with Claude Code

adamjohnwright and others added 5 commits November 2, 2026 18:27
…heir own

T005 measured the render service in the book's mix on an 8-core host: at most
1.41 figures a second (concurrency 8), limited by the processors at about 3
core-seconds a figure, against the 7.3 a second SC-003's figure budget needs.
The script is ci/measure/throughput.ts.

T006 takes a third route, the user's choice: `pdf-export figures` draws every
figure the book needs into a folder before the book (SC-010, contracts/figures.md),
and `book --figures` reads them, asking no render service. SC-003 is now the
book's time from figures already drawn. T046 adds the command; T024, T029, T037
and T039 follow; T005's single-figure measurement moves to T007.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e folder tied to its release

The measuring script now chooses a selection's ancestor as the book does
(nearestAncestor, a top-level pathway last), samples the container's CPU
without stalling the client, rejects bad numbers, and keeps the mix when a
selection has no ancestor. Re-run on all four settings: 1.523 figures a
second at best, 3.5-4.6 core-seconds a figure, rising with concurrency.

The figures' folder gets a manifest (release; each figure's kind, source and
selection): `book` refuses a stale or other release's folder, and `figures`
redraws only what changed. `figures` takes --files and runs the book's
release-file and character checks before drawing. The book's own run, contracts,
research R3/R7/R9/R10, data-model, quickstart, plan and tasks no longer say the
book asks the render service.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…safe resume, task order

The figures' manifest now carries a fingerprint: the graph's DBInfo release
number and checksum, the release of the content service behind the render
service, and the render service's build. `figures` checks the content service's
release before drawing and refuses to resume a folder of another fingerprint;
`book` faults a folder of another graph as stale-folder. A file is moved into
place before its entry is written, and a file with no entry is drawn again.
T046 now follows T024, whose preflight it runs.

The script states its two limits (EHLDs told by hasEHLD; the render container's
CPU only), checks free memory and --render at the start, times out and reports
docker stats, and exits 1 with no extrapolation when its memory guard stops it.
The four runs' outputs are kept in ci/measure/results/2026-11-02/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd cannot see

The folder's fingerprint is now specified where it is read: the render
service's health `build` in contracts/render.md (refused when `unknown`), the
graph's DBInfo checksum in data-model (present on release 98; missing is a
fault), and the content service's release by GET /data/database/version. The
contract states plainly what it cannot see: `build` hashes the service's code,
not the website page that draws, and `--content` is the operator's word; both
are asked of WebsiteAngular (R10, T042). The manifest is an append-only journal
with one writer, a redrawn figure loses its old file first, the fingerprint is
read again at the end, and a refused resume names a new --out. T046 extends the
render stub with /health and adds a content stub; T024 adds the checksum.

The script probes the render service and checks memory before sampling, records
release, species, seed and figures asked, and exits 1 when any figure is missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…when its run is

`figures` ends its journal with a `complete` line repeating the fingerprint,
written only once every figure is in place and the end-of-run check passed;
`book` faults a folder without it (incomplete-folder) and a graph without a
checksum (no-checksum). A torn last line is drawn again on resume. The
content-service check is described as what it is (the service named by
--content), the two asks of WebsiteAngular are named, and T046 tests the cases
the review listed. The script records the render service's build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adamjohnwright

Copy link
Copy Markdown
Contributor Author

Replaced by the follow-up PR with this review's findings fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant