Skip to content

Commit 8564654

Browse files
committed
Add bespoke journey figures
1 parent d7ab159 commit 8564654

5 files changed

Lines changed: 160 additions & 54 deletions

File tree

docs/lessons-learned.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,5 @@ git diff --check
121121
- **Audit across dimensions, not just artifacts.** A serious pass reads examples for payoff, rationale, alternatives, determinism, idiom, literate fit, source/result pairing, decomposition, progression, coverage, usefulness, and editorial shape; reads figures for cell fidelity, earned value, one move, mechanism, caption voice, grammar, emphasis, restraint, and fit; and reads journeys for section fidelity, scope, conceptual move, independence from lesson figures, outcome support, and prerequisite order. File-by-file review misses cross-cutting failures that dimension-by-dimension review catches.
122122
- **When every score is green, resist score inflation and look for unsupported claims.** The current steady state is intentionally boring: one documented `hello-world` waiver, no below-target example diagrams, no below-target journey figures, no orphaned examples, and no stale weak-section backlog. Future audits should preserve that baseline by finding semantic drift, note claims without cells, weak `See also` edges, or journey sections that no longer match their support examples — not by raising 9.0 scores to 9.5 without new evidence.
123123
- **Journey audit is graph audit plus outcome audit.** A journey section is healthy only when its examples form a prerequisite-respecting mental map and its declared outcomes are backed by cells on those examples. A section can have a beautiful figure and still fail if the support list is a catalog slice, if the `See also` graph isolates one example, or if the section caption describes a conceptual shift the examples do not actually make.
124-
- **A green total can still hide a weak criterion.** The journey-figure audit found every section figure above the project gate while 15 sections still reused a lesson paint function, which weakens the independence-from-lesson-figures dimension. Keep a watchlist for criterion-level weakness even when the aggregate score remains shippable.
124+
- **A green total can still hide a weak criterion.** The journey-figure audit found every section figure above the project gate while 15 sections still reused a lesson paint function, which weakened the independence-from-lesson-figures dimension. Bespoke runtime, control-flow, and iteration section figures reduced that watchlist to 6; keep tracking criterion-level weakness even when the aggregate score remains shippable.
125125
- **Deployment smoke belongs beside CI.** `scripts/smoke_deployment.py` checks rendered Worker pages, runtime-boundary pages, journey pages, prototype review pages, and representative Dynamic Worker POST runs for HTTP failures, exception markers, and stale edited-code output. Build success is not enough; the deployed Worker must render and execute edited examples.

docs/rubric-audit-2026-05-12.md

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ This snapshot audits the shipped catalog against the example, example-figure, an
5252
| Mechanism over metaphor | Canvas primitives show protocols, boundaries, lanes, or flows | PASS |
5353
| Caption alignment | Section figure captions unique and declarative | PASS |
5454
| Grammar conformance | Shared geometry contracts | PASS |
55-
| Independence from lesson figures | Section figures compared with example attachments | WATCH (15 reused paint functions) |
55+
| Independence from lesson figures | Section figures compared with example attachments | WATCH (6 reused paint functions) |
5656
| Layout fit | Journey figure dimensions within production column | PASS |
5757
| Outcome support | `check_journey_outcomes.py` over all 24 sections | PASS |
5858
| Prerequisite order | Journey order reviewed against lesson dependencies | PASS |
@@ -175,15 +175,15 @@ This snapshot audits the shipped catalog against the example, example-figure, an
175175

176176
| Journey | Section | Support examples | Outcomes | Figure | Score | Caption |
177177
| --- | --- | --- | --- | --- | --- | --- |
178-
| runtime | Start with executable evidence. | 5 | 4 | program-output | 9.0 | Every page is a runnable program. The smallest mental model: source produces visible output. |
179-
| runtime | Separate value, identity, and absence. | 6 | 4 | identity-and-equality | 9.0 | Two names can share one object (left, both `is` and `==` true) or hold two equal-but-distinct objects (right, only `==` true). |
180-
| runtime | Read expressions as object operations. | 5 | 4 | operator-dispatch | 9.0 | Operators are method calls. `a + b` dispatches to `a.__add__(b)`; the data model exposes the syntax. |
181-
| control-flow | Choose between paths. | 4 | 4 | branch-fork | 9.0 | A value flows through a predicate to one of several branches. |
182-
| control-flow | Name and shape decisions. | 3 | 3 | naming-decisions | 9.0 | Name an intermediate fact, then dispatch by data shape when a boolean branch is too small. |
183-
| control-flow | Stop as soon as the answer is known. | 3 | 3 | early-exit | 9.0 | The loop exits at the first match — break short-circuits the rest of the sequence. |
184-
| iteration | Choose the right loop shape. | 5 | 4 | loop-repetition | 9.0 | Choose the loop whose stopping rule matches the data: exhaustion, condition, or sentinel. |
185-
| iteration | See the protocol behind `for`. | 3 | 3 | iter-protocol | 9.5 | iter() exposes the iterator behind for; next() pulls one value at a time until exhausted. |
186-
| iteration | Compose lazy value streams. | 3 | 3 | lazy-stream | 9.0 | Filters and maps compose without materialising intermediate lists; values flow through the pipeline only when next() pulls them. |
178+
| runtime | Start with executable evidence. | 5 | 4 | runtime-evidence-loop | 9.0 | Examples are evidence loops: source, a run step, and visible output stay together. |
179+
| runtime | Separate value, identity, and absence. | 6 | 4 | runtime-object-axes | 9.0 | Runtime objects answer separate questions: equal value, same identity, or the singleton that marks absence. |
180+
| runtime | Read expressions as object operations. | 5 | 4 | runtime-expression-model | 9.0 | Expression syntax enters the data model; object methods produce the result. |
181+
| control-flow | Choose between paths. | 4 | 4 | control-decision-map | 9.0 | Facts flow into one decision point; exactly one branch owns the next step. |
182+
| control-flow | Name and shape decisions. | 3 | 3 | control-fact-shape | 9.0 | Name a fact when a condition needs it; match shape when the data structure is the decision. |
183+
| control-flow | Stop as soon as the answer is known. | 3 | 3 | control-stop-boundary | 9.0 | Early exits draw a boundary: once the answer is found, the tail stays unread. |
184+
| iteration | Choose the right loop shape. | 5 | 4 | iteration-loop-selector | 9.0 | Choose the loop from its stopping rule: exhaustion, condition, or sentinel marker. |
185+
| iteration | See the protocol behind `for`. | 3 | 3 | iteration-protocol-map | 9.5 | for is surface syntax; iter() creates an iterator and next() pulls values until StopIteration. |
186+
| iteration | Compose lazy value streams. | 3 | 3 | iteration-lazy-pull | 9.0 | Lazy pipelines run from the consumer's pull: next() requests one value through each stage. |
187187
| shapes | Pick the container that matches the question. | 5 | 4 | container-questions | 9.0 | Each container answers a different question: ordered, fixed, lookup, unique. |
188188
| shapes | Move between shapes deliberately. | 6 | 4 | reshape-pipeline | 9.0 | Most everyday code reshapes data: one input, one transform, one new value. |
189189
| shapes | Cross text and data boundaries. | 5 | 4 | text-data-boundary | 9.0 | Programs receive text and produce structured data; parsing makes the boundary explicit. |
@@ -202,19 +202,10 @@ This snapshot audits the shipped catalog against the example, example-figure, an
202202

203203
## Journey figure independence watchlist
204204

205-
These section figures still reuse production example paint functions. They remain above the project gate, but the journey rubric's independence criterion should be the next visual-design frontier.
205+
6 section figures still reuse production example paint functions. They remain above the project gate, but the journey rubric's independence criterion should be the next visual-design frontier.
206206

207207
| Section | Shared figure | Also attached to example |
208208
| --- | --- | --- |
209-
| Start with executable evidence. | program-output | hello-world |
210-
| Separate value, identity, and absence. | identity-and-equality | equality-and-identity |
211-
| Read expressions as object operations. | operator-dispatch | operator-overloading, special-methods |
212-
| Choose between paths. | branch-fork | conditionals |
213-
| Name and shape decisions. | naming-decisions | assignment-expressions |
214-
| Stop as soon as the answer is known. | early-exit | break-and-continue |
215-
| Choose the right loop shape. | loop-repetition | while-loops |
216-
| See the protocol behind `for`. | iter-protocol | iterating-over-iterables, iterator-vs-iterable, iterators |
217-
| Compose lazy value streams. | lazy-stream | generator-expressions |
218209
| Keep runtime and static analysis separate. | annotation-ghost | type-hints |
219210
| Describe realistic data shapes. | union-types | union-and-optional-types |
220211
| Scale annotations for reusable libraries. | generic-preservation | generics-and-typevar |
@@ -224,4 +215,4 @@ These section figures still reuse production example paint functions. They remai
224215

225216
## Audit conclusion
226217

227-
No gate-blocking edits are required by this pass. The only below-target example is the standing `hello-world` waiver; all example diagrams and journey figures are at or above 9.0; every journey section has declared outcomes; and the example graph has no orphaned sources. The main non-gating watch item is journey-figure independence: several section figures intentionally reuse lesson paint functions and should be the next source of bespoke visual-design work.
218+
No gate-blocking edits are required by this pass. The only below-target example is the standing `hello-world` waiver; all example diagrams and journey figures are at or above 9.0; every journey section has declared outcomes; and the example graph has no orphaned sources. The main non-gating watch item is journey-figure independence: 6 section figures intentionally reuse lesson paint functions and should be the next source of bespoke visual-design work.

scripts/audit_rubric_snapshot.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ def render_report(date: str) -> str:
297297
"",
298298
"## Journey figure independence watchlist",
299299
"",
300-
"These section figures still reuse production example paint functions. They "
300+
f"{len(reused_sections)} section figures still reuse production example paint functions. They "
301301
"remain above the project gate, but the journey rubric's independence "
302302
"criterion should be the next visual-design frontier.",
303303
"",
@@ -319,9 +319,9 @@ def render_report(date: str) -> str:
319319
"example is the standing `hello-world` waiver; all example diagrams and "
320320
"journey figures are at or above 9.0; every journey section has declared "
321321
"outcomes; and the example graph has no orphaned sources. The main "
322-
"non-gating watch item is journey-figure independence: several section "
323-
"figures intentionally reuse lesson paint functions and should be the next "
324-
"source of bespoke visual-design work.",
322+
f"non-gating watch item is journey-figure independence: {len(reused_sections)} "
323+
"section figures intentionally reuse lesson paint functions and should be "
324+
"the next source of bespoke visual-design work.",
325325
"",
326326
])
327327
return "\n".join(lines)

src/asset_manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Generated by scripts/fingerprint_assets.py. Do not edit by hand.
22
ASSET_PATHS = {'SITE_CSS': '/site.57a55415849b.css', 'SYNTAX_JS': '/syntax-highlight.3b6c7f730d46.js', 'EDITOR_JS': '/editor.a4a7766e1b9b.js'}
3-
HTML_CACHE_VERSION = 'b798d2f716b8'
3+
HTML_CACHE_VERSION = 'd194de216e67'

0 commit comments

Comments
 (0)