generated from coulomb/repo-seed
research: Strudel.cc live-coding REPL deep dive; SHARD-WP-0004 T5
Code as live time-based audio performance; the far live end of the live<->snapshot axis (no faithful static form; static = source + marked recording). The honesty test for graceful degradation. Enrichment-only (UC-54/55). Marks T5 done — all 8 batch tasks complete. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2
SCOPE.md
2
SCOPE.md
@@ -22,7 +22,7 @@ Learnings update both SCOPE and INTENT where necessary.
|
|||||||
| Research | yawex prior art; c2 origins; federation concepts; wikiengines overview (`research/260608-*/`); XWiki/TWiki/Foswiki deep dives (`research/260613-*/`); Xanadu + ZigZag + Roam + Obsidian + Notion + Joplin + Logseq + local-first workspaces (Anytype/AFFiNE/AppFlowy) + Trilium + Wiki.js + Federated Wiki + Wikibase + git-forge wikis + TiddlyWiki + ikiwiki + Quip + MojoMojo + Oddmuse + UseModWiki deep dives & shard-spectrum synthesis (`research/260614-*/`) |
|
| Research | yawex prior art; c2 origins; federation concepts; wikiengines overview (`research/260608-*/`); XWiki/TWiki/Foswiki deep dives (`research/260613-*/`); Xanadu + ZigZag + Roam + Obsidian + Notion + Joplin + Logseq + local-first workspaces (Anytype/AFFiNE/AppFlowy) + Trilium + Wiki.js + Federated Wiki + Wikibase + git-forge wikis + TiddlyWiki + ikiwiki + Quip + MojoMojo + Oddmuse + UseModWiki deep dives & shard-spectrum synthesis (`research/260614-*/`) |
|
||||||
| Demand | NetKingdom integration asks captured, not yet negotiated |
|
| Demand | NetKingdom integration asks captured, not yet negotiated |
|
||||||
| Spec | Architecture blueprint drafted; UseCaseCatalog 84 UCs from research; PRD/TSD scaffolds |
|
| Spec | Architecture blueprint drafted; UseCaseCatalog 84 UCs from research; PRD/TSD scaffolds |
|
||||||
| Work | `SHARD-WP-0001` active (6 tasks); `SHARD-WP-0002` active (16 tasks: T1–T10 federation + T11–T16 adapter contract); `SHARD-WP-0003` **done** (9 engine dives complete); `SHARD-WP-0004` active (8 computational-knowledge dives: T1 literate programming, T2 Mathematica, T3 Jupyter, T4 Processing, T6 Squeak + T8 Pharo (merged), T7 Glamorous Toolkit done) |
|
| Work | `SHARD-WP-0001` active (6 tasks); `SHARD-WP-0002` active (16 tasks: T1–T10 federation + T11–T16 adapter contract); `SHARD-WP-0003` **done** (9 engine dives complete); `SHARD-WP-0004` active (8 computational-knowledge dives: T1 literate programming, T2 Mathematica, T3 Jupyter, T4 Processing, T5 Strudel, T6 Squeak + T8 Pharo (merged), T7 Glamorous Toolkit done — all 8 dives complete) |
|
||||||
|
|
||||||
## In Scope (today)
|
## In Scope (today)
|
||||||
|
|
||||||
|
|||||||
30
research/260614-strudel-deep-dive/README.md
Normal file
30
research/260614-strudel-deep-dive/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 260614 — Strudel.cc (live-coding REPL) deep dive
|
||||||
|
|
||||||
|
Date: 2026-06-14 · Source: **SHARD-WP-0004 T5**
|
||||||
|
|
||||||
|
## What this is
|
||||||
|
|
||||||
|
A deep dive into **Strudel.cc** (the JavaScript port of **TidalCycles**): a browser
|
||||||
|
**live-coding REPL** where terse **pattern source** is **evaluated live into time-based
|
||||||
|
audio** — code as a running musical performance, with **no document, no output cell, no file
|
||||||
|
of results**.
|
||||||
|
|
||||||
|
## Why it matters
|
||||||
|
|
||||||
|
- The **extreme of the live↔snapshot axis** (named at T6): output is **temporal, generative,
|
||||||
|
performative**, so there is **no faithful static form** — the best static projection is
|
||||||
|
**source (canonical, diffable) + an optional audio recording snapshot**, marked as one
|
||||||
|
performance. The **honesty test** for union-without-erasure + graceful degradation.
|
||||||
|
- Bounds the projection model's live end: ahead-of-time → view-time one-shot → continuous →
|
||||||
|
**irreducibly live/temporal (recording-only)**.
|
||||||
|
|
||||||
|
## Yield
|
||||||
|
|
||||||
|
- **No new UC** (enrichment / design prior art; far live end). Enriches **UC-54, UC-55**;
|
||||||
|
links UC-83/84, UC-37, UC-35.
|
||||||
|
|
||||||
|
## Contents
|
||||||
|
|
||||||
|
| Path | Role |
|
||||||
|
|------|------|
|
||||||
|
| `findings.md` | Code-as-live-performance, the limit of static projection, INTENT mapping, UC disposition (enrichment-only), architecture notes (T16 far end of live↔snapshot axis) |
|
||||||
118
research/260614-strudel-deep-dive/findings.md
Normal file
118
research/260614-strudel-deep-dive/findings.md
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
# Strudel.cc — live-coding REPL — deep dive (findings)
|
||||||
|
|
||||||
|
**Date:** 2026-06-14 · **Source:** SHARD-WP-0004 T5 · **Subject:** Strudel.cc (the
|
||||||
|
JavaScript port of TidalCycles) — a browser **live-coding REPL** where code is a **running
|
||||||
|
musical performance**.
|
||||||
|
|
||||||
|
## Why this dive
|
||||||
|
|
||||||
|
The closing, lowest-priority dive — and the **extreme** of the live↔snapshot axis. Where
|
||||||
|
Processing (T4) renders *visual* output at view time, Strudel renders **time-based audio**
|
||||||
|
that only exists *while running and evolving*. It is the limit case for "can a page be a live
|
||||||
|
computation?" — the answer where **static projection is least faithful**. Enrichment-only;
|
||||||
|
feeds UC-54/55 and hardens the snapshot-degradation rule.
|
||||||
|
|
||||||
|
## 1. Code as a live, evaluated performance
|
||||||
|
|
||||||
|
- **Strudel** ports **TidalCycles**' pattern language to JavaScript, running entirely in the
|
||||||
|
**browser** (Web Audio). You write **pattern expressions** (e.g. `note("c e g")`,
|
||||||
|
`sound("bd sd")` with transformations) and **evaluate them live**; the sound updates
|
||||||
|
**without stopping** — the essence of *live coding*.
|
||||||
|
- The artifact is **terse source text** (a pattern); the "content" is the **sound it
|
||||||
|
produces over time**. There is **no document, no output cell, no file of results** —
|
||||||
|
output is **ephemeral, temporal, and performative**.
|
||||||
|
- A Strudel "page" (a shared REPL link / snippet) is **source + the implicit promise of a
|
||||||
|
running evaluation**. The source is tiny and diffable; the experience is not capturable as
|
||||||
|
text.
|
||||||
|
|
||||||
|
## 2. The limit of static projection
|
||||||
|
|
||||||
|
Strudel pushes past Processing on every "live" dimension:
|
||||||
|
|
||||||
|
- **Temporal & generative** — output unfolds over time and may be **non-deterministic**
|
||||||
|
(randomness, evolving state). There is no single "frame"; the faithful capture is a
|
||||||
|
**recording (audio), itself just one performance**, not the artifact.
|
||||||
|
- **Performative** — the value is partly the **act of live editing**; even a recording loses
|
||||||
|
the live-coding dimension.
|
||||||
|
- So on the **live↔snapshot axis** (named at T6), Strudel sits at the **far live end**: the
|
||||||
|
best static projection is **(a) the source** (canonical, diffable) **+ (b) an optional
|
||||||
|
audio recording snapshot**, explicitly marked as one rendering of a live/temporal artifact.
|
||||||
|
|
||||||
|
This makes Strudel the **honesty test** for the contract: shard-wiki must be able to attach
|
||||||
|
such a source, present it truthfully (here is the source; a live render needs the runtime; a
|
||||||
|
recording is one performance), and **never imply a static page captures it**.
|
||||||
|
|
||||||
|
## 3. INTENT mapping (enrichment-only — no new UC)
|
||||||
|
|
||||||
|
### Reinforcements / refinements
|
||||||
|
|
||||||
|
- **Live-evaluated, time-based content (UC-54/55).** Strudel is the extreme executable-as-
|
||||||
|
page: **source canonical, presentation = a temporal live evaluation**. Confirms the page
|
||||||
|
model must represent content whose rendered form is **time-based / generative / performative**.
|
||||||
|
- **live↔snapshot axis (T6) — far end.** Establishes the **upper bound**: some content is
|
||||||
|
**irreducibly live**; static projection degrades to **source + a recording snapshot**, with
|
||||||
|
honesty about what's lost. Generalizes Processing's "snapshot frame" to "recording of one
|
||||||
|
performance."
|
||||||
|
- **Graceful degradation (INTENT).** A backend that can't run the REPL still serves the
|
||||||
|
**source** (tiny, diffable) and any **recording** as read/projection/backup — the
|
||||||
|
limited-backend-still-usable rule, at the hardest content type.
|
||||||
|
- **Union without erasure.** Presenting a Strudel shard must surface "this is a **live
|
||||||
|
temporal artifact**; what you see/hear statically is **source / one recording**" — never
|
||||||
|
hide the liveness or imply completeness.
|
||||||
|
|
||||||
|
### Boundaries
|
||||||
|
|
||||||
|
- shard-wiki is **not an audio/REPL runtime**; default = attach the **source** + offer/store
|
||||||
|
a **recording** with provenance; live in-viewer evaluation is a gated capability (trust/
|
||||||
|
sandbox, like Processing T4). Source is canonical; everything rendered is a degrading,
|
||||||
|
view-time/temporal projection.
|
||||||
|
|
||||||
|
## 4. UC disposition (enrichment-only)
|
||||||
|
|
||||||
|
| Mechanism (findings §) | Catalog UC / thread |
|
||||||
|
|------------------------|---------------------|
|
||||||
|
| Pattern source = live, evaluated, time-based performance (§1) | UC-54 / UC-55 (enriched: time-based/generative executable content) |
|
||||||
|
| Output ephemeral/temporal/non-deterministic → no faithful static form (§2) | links live↔snapshot axis (T6), far end |
|
||||||
|
| Best static projection = source + audio recording snapshot, marked as one performance (§2) | links UC-83/UC-84 (degrading projection), UC-37 (recording as backup) |
|
||||||
|
| Limited backend still serves source + recording (§3) | links UC-37 graceful degradation |
|
||||||
|
| Live in-viewer evaluation = capability + trust/sandbox (§3) | links UC-35 |
|
||||||
|
|
||||||
|
**No new UC** — Strudel is design prior art marking the **far live end** of the projection/
|
||||||
|
liveness model; it adds no orchestration scenario, it bounds one.
|
||||||
|
|
||||||
|
## 5. Architecture notes for SHARD-WP-0002
|
||||||
|
|
||||||
|
- **T16 (projection):** anchor the **far end of the live↔snapshot axis** — content can be
|
||||||
|
**irreducibly live/temporal/generative**; the contract must allow a projection to declare
|
||||||
|
"no faithful static form; static = source + a marked recording." Combined with T4's
|
||||||
|
**materialization-timing** and **continuity** facets, the projection model now spans:
|
||||||
|
ahead-of-time materialized → view-time one-shot → view-time continuous/interactive →
|
||||||
|
**temporal/generative/performative (recording-only snapshot)**.
|
||||||
|
- **T12/T15 (page model):** **time-based / generative executable content** as a page-model
|
||||||
|
edge; source canonical, render temporal.
|
||||||
|
- **T11 (capabilities):** "live-evaluate (audio/REPL) in viewer" capability + trust/sandbox;
|
||||||
|
default off → source + recording.
|
||||||
|
|
||||||
|
## 6. Open questions
|
||||||
|
|
||||||
|
1. Does the contract carry an explicit **"irreducibly live / no faithful static form"** flag
|
||||||
|
on a projection (so the union renders the honest fallback automatically)? (The far-end
|
||||||
|
resolution of the live↔snapshot axis open question from T6.)
|
||||||
|
2. Is a **recording** modeled as a stored **derivation-projection snapshot with provenance**
|
||||||
|
(one performance, time T, source rev R), reusing the UC-84 snapshot machinery?
|
||||||
|
|
||||||
|
## 7. Sources
|
||||||
|
|
||||||
|
- `strudel.cc` (docs, REPL); **TidalCycles** (`tidalcycles.org`) — the pattern language
|
||||||
|
Strudel ports; Web Audio.
|
||||||
|
- prior: `research/260614-processing-deep-dive/` (view-time render, continuity, UC-54/55);
|
||||||
|
`research/260614-squeak-pharo-deep-dive/` (live↔snapshot axis);
|
||||||
|
`research/260614-mathematica-deep-dive/` (`Dynamic` interactive, snapshot-only).
|
||||||
|
|
||||||
|
## 8. Traceability
|
||||||
|
|
||||||
|
**No new UC** (enrichment / design prior art; the far live end). Enriched: UC-54, UC-55;
|
||||||
|
links UC-83/UC-84 (degrading projection), UC-37 (recording = backup / graceful degradation),
|
||||||
|
UC-35 (live-evaluate capability + trust). Architecture cross-refs: SHARD-WP-0002 T16 (far end
|
||||||
|
of live↔snapshot axis: irreducibly-live content, static = source + marked recording), T12/T15
|
||||||
|
(time-based/generative executable content), T11 (live-evaluate capability + sandbox).
|
||||||
@@ -43,3 +43,4 @@ when multiple files or sources are involved. Findings here inform `spec/` and
|
|||||||
| 2026-06-14 | `260614-mathematica-deep-dive/` | Mathematica Notebooks — the original computational notebook (`.nb` = a Wolfram expression); nestable cell groups, structured re-evaluable outputs, `Manipulate` live widgets, CDF; confirms UC-84 notebook shape is a genus; SHARD-WP-0004 T2; enrichment-only (reinforces UC-84; UC-54/55) |
|
| 2026-06-14 | `260614-mathematica-deep-dive/` | Mathematica Notebooks — the original computational notebook (`.nb` = a Wolfram expression); nestable cell groups, structured re-evaluable outputs, `Manipulate` live widgets, CDF; confirms UC-84 notebook shape is a genus; SHARD-WP-0004 T2; enrichment-only (reinforces UC-84; UC-54/55) |
|
||||||
| 2026-06-14 | `260614-squeak-pharo-deep-dive/` | Squeak & Pharo (image-based Smalltalk) — the live-object image (purest "live" end); image-is-not-a-store boundary (export→files only); Pharo Tonel/Iceberg externalizes code to git text; names the live↔snapshot projection axis; SHARD-WP-0004 **T6 + T8** (merged); boundary/enrichment-only, no new UC |
|
| 2026-06-14 | `260614-squeak-pharo-deep-dive/` | Squeak & Pharo (image-based Smalltalk) — the live-object image (purest "live" end); image-is-not-a-store boundary (export→files only); Pharo Tonel/Iceberg externalizes code to git text; names the live↔snapshot projection axis; SHARD-WP-0004 **T6 + T8** (merged); boundary/enrichment-only, no new UC |
|
||||||
| 2026-06-14 | `260614-processing-deep-dive/` | Processing / p5.js — program-as-page rendered live at view time (no cached output); adds materialization-timing + continuity facets to projection; execute-in-viewer = capability+trust; SHARD-WP-0004 T4; enrichment-only (UC-54/55) |
|
| 2026-06-14 | `260614-processing-deep-dive/` | Processing / p5.js — program-as-page rendered live at view time (no cached output); adds materialization-timing + continuity facets to projection; execute-in-viewer = capability+trust; SHARD-WP-0004 T4; enrichment-only (UC-54/55) |
|
||||||
|
| 2026-06-14 | `260614-strudel-deep-dive/` | Strudel.cc (TidalCycles JS) live-coding REPL — code as live time-based audio performance; the far live end (no faithful static form; static = source + marked recording); honesty test for graceful degradation; SHARD-WP-0004 T5; enrichment-only (UC-54/55) |
|
||||||
@@ -2510,6 +2510,33 @@ captured snapshot/recording; live in-viewer rendering is gated. **No new UC.** A
|
|||||||
logged for `SHARD-WP-0002` (T12/T15/T16/T11): program-as-page (source-canonical/render-
|
logged for `SHARD-WP-0002` (T12/T15/T16/T11): program-as-page (source-canonical/render-
|
||||||
derived), materialization-timing + continuity facets, view-time-execute capability + sandbox.
|
derived), materialization-timing + continuity facets, view-time-execute capability + sandbox.
|
||||||
|
|
||||||
|
### strudel mapping
|
||||||
|
|
||||||
|
(Enrichment dive — **no new UC**; design prior art, the far live end. Source: the **Strudel
|
||||||
|
deep dive**, `research/260614-strudel-deep-dive/findings.md`.)
|
||||||
|
|
||||||
|
| Strudel mechanism (findings §) | Catalog UC / thread |
|
||||||
|
|--------------------------------|---------------------|
|
||||||
|
| Pattern source = live, evaluated, time-based performance (§1) | UC-54 / UC-55 (enriched: time-based/generative content) |
|
||||||
|
| Output ephemeral/temporal/non-deterministic → no faithful static form (§2) | links live↔snapshot axis (T6), far end |
|
||||||
|
| Best static projection = source + audio recording snapshot (marked one performance) (§2) | links UC-83/UC-84, UC-37 (recording = backup) |
|
||||||
|
| Limited backend still serves source + recording (§3) | links UC-37 (graceful degradation) |
|
||||||
|
| Live in-viewer evaluation = capability + trust/sandbox (§3) | links UC-35 |
|
||||||
|
|
||||||
|
Note: Strudel (the JS port of TidalCycles) is the **extreme of the live↔snapshot axis** —
|
||||||
|
terse **pattern source** evaluated **live into time-based audio**, with output that is
|
||||||
|
**temporal, generative, and performative** and therefore has **no faithful static form**. It
|
||||||
|
is the **honesty test** for the contract: attach the **source** (tiny, diffable, canonical),
|
||||||
|
offer/store an **audio recording** as a marked snapshot (one performance, time T, source rev
|
||||||
|
R — reusing UC-84 snapshot machinery), and **never imply a static page captures it**
|
||||||
|
(union-without-erasure). It bounds the projection model's **far live end**, completing the
|
||||||
|
span ahead-of-time → view-time one-shot → continuous/interactive (Processing) →
|
||||||
|
**irreducibly live/temporal (recording-only)**. A limited backend still serves source +
|
||||||
|
recording (graceful degradation, UC-37); live in-viewer evaluation is a gated capability
|
||||||
|
(trust/sandbox, UC-35). **No new UC.** Architecture logged for `SHARD-WP-0002` (T16/T12/T15/
|
||||||
|
T11): far end of the live↔snapshot axis (irreducibly-live content; static = source + marked
|
||||||
|
recording), time-based/generative executable content, live-evaluate capability + sandbox.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Open questions
|
## Open questions
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ for the page model (UC-54/55).
|
|||||||
|
|
||||||
```task
|
```task
|
||||||
id: SHARD-WP-0004-T5
|
id: SHARD-WP-0004-T5
|
||||||
status: todo
|
status: done
|
||||||
priority: low
|
priority: low
|
||||||
state_hub_task_id: "2b099639-3f8b-4b29-a24a-75f7418dd083"
|
state_hub_task_id: "2b099639-3f8b-4b29-a24a-75f7418dd083"
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user