Skip to content

Commit 4f95444

Browse files
committed
Document the rubric for journey section figures
Parallels docs/example-quality-rubric.md but for the figures beside journey section headings — not lesson figures, not banner figures. Three categories scored to 10: Content (5.5) section fidelity, pedagogical scope, one move, mechanism over metaphor, caption alignment Craft (3.0) grammar conformance, emphasis scarcity, restraint Context (1.5) independence from lesson figures, layout fit Topic gates per section type (decision, loop, iteration, type, resource, concurrency) name what each kind of figure must depict. Release gates: exactly one figure per section, caption present, summary aligns with caption, section-figure column dimensions, palette discipline. Project gate: ≥8.5 per figure, ≥8.8 journey average. https://claude.ai/code/session_01MazwoRWAihW6dwso3fMCHE
1 parent a2f63ca commit 4f95444

1 file changed

Lines changed: 121 additions & 0 deletions

File tree

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# Journey visualisation rubric
2+
3+
This rubric scores the figure beside each journey section heading.
4+
The example rubric (docs/example-quality-rubric.md) covers individual
5+
lesson pages; this one covers the conceptual figures that introduce
6+
each journey section.
7+
8+
A journey section sits *above* individual lessons. It groups three to
9+
five examples under a shared conceptual shift, e.g. "Recognise iteration
10+
as a protocol" or "Bundle behavior with state". The figure beside that
11+
heading should depict the shift the section asks the reader to make.
12+
It is not a recycled lesson figure.
13+
14+
Score each section figure on a 10-point scale.
15+
16+
## Content (5.5)
17+
18+
1. **Section fidelity (0-1.5)** — the figure depicts the conceptual
19+
shift the section title and summary describe. It does not depict
20+
one of the section's examples. A figure for "Make decisions
21+
explicitly" must show *deciding*, not the body of any particular
22+
`match` statement; a figure for "Bundle behavior with state" must
23+
show *bundling*, not one specific class.
24+
2. **Pedagogical scope (0-1.0)** — the figure captures the general
25+
pattern that unifies the section's items. If the figure could be
26+
replaced with the diagram from any single lesson it is too specific.
27+
3. **One conceptual move (0-1.0)** — exactly one shift, before-state
28+
to after-state, or the depiction of a single mechanism. Two ideas
29+
compete for the reader's eye and both lose. Squint test: the
30+
primary structure is identifiable within two seconds.
31+
4. **Mechanism over metaphor (0-1.0)** — the figure shows the actual
32+
machinery the section names — the iterator object, the cell, the
33+
dispatch arrow — not a cartoon of it. Knuth's rule.
34+
5. **Caption alignment (0-1.0)** — the `figcaption` names the
35+
conceptual shift in plain language and matches the section
36+
summary's voice. The caption is part of the figure, not optional.
37+
38+
## Craft (3.0)
39+
40+
6. **Grammar conformance (0-1.0)** — composed exclusively from
41+
`Canvas` primitives in `src/marginalia_grammar.py`. No bespoke
42+
SVG, no new colours, no stroke weights outside the locked set.
43+
7. **Emphasis scarcity (0-1.0)** — at most one accent mark per
44+
figure. The accent goes on the single element the section names
45+
(the live yield, the dispatch arrow, the captured cell). If three
46+
things are orange the figure has no emphasis at all.
47+
8. **Restraint (0-1.0)** — no decoration that does not carry
48+
information. No drop shadows, gradients, ornamental rules,
49+
non-orthogonal tilts, or marks placed for "balance".
50+
51+
## Context (1.5)
52+
53+
9. **Independence from lesson figures (0-1.0)** — distinct framing
54+
from any single lesson's diagram. If the section figure is
55+
identical to a `cell-figure` in one of the section's lessons,
56+
one of them is wrong. Usually the section figure should be the
57+
*more abstract* one.
58+
10. **Layout fit (0-0.5)** — renders comfortably at the journey
59+
page's ~280-320px section-figure column. Text inside the SVG
60+
stays readable at that scale; the figure does not overflow.
61+
62+
## Topic gates
63+
64+
- **Decision sections** — depict the fork explicitly: a value flowing
65+
through a predicate to one of several branches. A single linear
66+
arrow does not satisfy this gate.
67+
- **Loop sections** — show the back-edge that makes a loop a loop.
68+
A linear sequence of cells without a return path is not a loop
69+
picture, it is just a sequence.
70+
- **Iteration sections** — show the `iter()` / `next()` protocol
71+
explicitly: an iterable, an iterator, and one or more values
72+
pulled out by `next()`. The figure must distinguish iterable
73+
from iterator.
74+
- **Type sections** — show annotations as ghost overlays on runtime
75+
values, or show type relationships (union, generic, structural
76+
matching) as containment / flow. Do not let a type figure devolve
77+
into "a function with parameter names".
78+
- **Resource and boundary sections** — show enter and exit as paired
79+
events bracketing a body, with the failure path also routed
80+
through exit. A one-way arrow is not a context manager.
81+
- **Concurrency sections** — show two parallel lanes with handoffs
82+
between them. A single timeline is not a concurrency picture.
83+
84+
## Release gates outside the score
85+
86+
- **Exactly one figure per section.** Section figures are not stacked.
87+
If the section needs two figures the section is doing two things.
88+
- **Caption present.** A figure without a `figcaption` is not allowed.
89+
- **Section summary aligns with caption.** The summary in
90+
`src/app.py`'s `JOURNEYS` list agrees with what the figure caption
91+
asserts. Disagreement means one or the other is wrong.
92+
- **Renders within `.journey-section`'s 2-column grid.** The figure
93+
obeys the column the layout gives it (~280-320px); design at a
94+
viewBox sized for that column, not at lesson-figure dimensions.
95+
- **Uses only the four palette constants.** `INK`, `INK_SOFT`,
96+
`EMPHASIS`, `SOFT_FILL`. Anything else is grounds for redesign.
97+
98+
## Quality bands
99+
100+
- **9.0-10.0** — captures the conceptual shift in two seconds; the
101+
caption could only describe this figure; pleasant to look at on
102+
return visits.
103+
- **8.0-8.9** — depicts the right idea but shares too much framing
104+
with a lesson figure, or the caption hedges instead of asserting,
105+
or one secondary mark steals attention from the primary one.
106+
- **7.0-7.9** — depicts the section but loses something in scope:
107+
uses a specific predicate / iterable / type instead of the
108+
general pattern; or topic gate not satisfied.
109+
- **below 7.0** — recycled lesson figure, missing topic gate,
110+
multiple primary ideas competing, or accent marks scattered
111+
rather than scarce. Redesign before publishing.
112+
113+
## Project gate
114+
115+
Every section figure on a published journey page should score at
116+
least **8.5**. The journey average across its three sections should
117+
exceed **8.8** so the journey reads as a unified set rather than
118+
three independently designed cards.
119+
120+
The score is a guide, not a substitute for reading the page beside
121+
its surrounding lessons.

0 commit comments

Comments
 (0)