Decide the Named fold subscription's data-authorability boundary — data selector vs Rust-only
#310
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Source
Fieldtest of the tap-subscribers cycle (#283 + #77), spec_gap SG2. Contrast of examples
tap_2_fold/tap_3_live(Rust-only) againsttap_1/tap_4(CLI / op-script).Problem
The cycle's headline is
TapSubscription::Named { label, params }as a "fully data-expressible" subscription over the layered fold registry. But no CLI verb and no authored artifact (op-script / campaign / process document) can select a per-tap fold: bothaura runandaura measurehardcode a record-all plan, and no document field carries a subscription. ANamedfold or aLivetap is reachable ONLY by writing a Rust consumer crate againstaura-runner(TapPlan::empty().subscribe(name, named("mean"))). For the default data-only project (project-layout.md), the cycle's new vocabulary is out of reach without escalating to Rust.The ledger (C25/C27) calls the
Namedform "data-expressible" but wires it to no data surface — an ambiguity: is a fold subscription meant to be authorable as data (a campaignpersist_taps-style selector), or is it deliberately Rust-only for now?Fork (decide, then record in the ledger)
Namedlabel vocabulary is closed/data-shaped, but selecting a subscription is Rust-authoring surface".subscribeop, or a campaignpersist_tapsfield) to carry{ tap, label }, so a data-only project can request a fold.Either is fine; the ledger must say which so the "data-expressible" promise stops being ambiguous. Filed at cycle close of #283.
Design reconciliation (specify, /boss 2026-07-24)
Spec: fold-subscription-data-selector (cycle in progress). The fork below is still listed open on this issue; this records its derived resolution.
Basis: derived — C27 built
Named { label, params }deliberately data-shaped (closed label vocabulary, scalar param schemas, layered growth without a core edit) and assigns tap consumption to the run-mode owner ("what consumes a tap is declared per run by a tap plan"); C25 forbids an authoring path whose only route is a Rust compile where the role's iteration cost demands data. Ratifying Rust-only (a) would soften a designed-in promise with effort as the only rationale — banned in this project.aura runandaura measure— gain a repeatable CLI selector--tap <tap>=<fold-label>(labels resolve against the layered FoldRegistry with its roster-enumerating refusal; unknown taps keep the typed UndeclaredTap). Any explicit--tapreplaces the record-all default entirely; unlisted taps stay unbound (C27: unbound is inert, a non-error). Fold params stay out of the grammar until a parameterized fold exists (all core folds are param-less; theNamedparams seam remains).Presentation.persist_taps(presentation channel,equity|exposure|r_equity|net_r_equity,TapChannel) is a mechanism disjoint from C27 declared taps (FlatGraph.taps+ FoldRegistry).persist_tapsbefore that reconciliation is decided.Cycle close (2026-07-24)
Shipped on branch
worktree-issue-310-fold-data-authorability(merge = owner):1baee77(feature:--tap TAP=FOLDselector onaura run, C27 Current-state amendment + first C27 history sidecar + glossary fix),e482f0e(audit close: usage strings name--tap; C14 exit-class tension routed to #297),7cc3ce0(fieldtest corpus).closes #310fires on merge.Precision correction to the decision comment above: there is no separate
aura measureverb binding taps — both declared-tap entry points (run_signal_r,run_measurement) are arms of the single verbaura run, so the selector lands once and reaches both. (The glossary sentence claimingaura measurepasses a record-all plan was a pre-existing inaccuracy, fixed this cycle.)Per-cycle fieldtest (source-blind, release binary
e482f0e): 0 bugs / 5 friction / 1 spec_gap / 3 working — the selector spine is byte-exact end-to-end, incl. the C1 identity pin and kind-aware folds/refusals on a Bool tap. Routing: #332 (introspect--foldsrenders the FoldKind table, not the registry roster — bug), #333 (declared-tap enumeration), #334 (C14 skipped-tap note for unbound-under-explicit-plan), #335 (fold summary-row timestamp semantics — decide); the exit-class split is tracked on #297 (audit evidence comment); the replace-semantics itself is confirmed as designed and now ledger-recorded.