docs(activities): recipe formalization — the rewrite DEMOTED recipes from 20 fields to 4 (#274) - #2278
Open
joelteply wants to merge 2 commits into
Open
docs(activities): recipe formalization — the rewrite DEMOTED recipes from 20 fields to 4 (#274)#2278joelteply wants to merge 2 commits into
joelteply wants to merge 2 commits into
Conversation
…#274) Design, not built. Written after auditing every recipe artifact in the tree, and the audit is the headline. THE FINDING: the recipe system did not fail to get built — it was DEMOTED in the Rust rewrite. legacy/src/system/recipes/ 28 recipes, 20 fields core/…/experience/recipes/ 4 recipes, 4 fields The live four (benchmark/hard-rs, chat, profile, video-chat) carry only `purpose, regions, affordances, layout` — PRESENTATION. Everything describing how an activity BEHAVES was dropped: pipeline, ragTemplate, strategy, roles, tools, sentinelTemplates, access, isPublic, locked, tags, name/description, and — the one that bit us — uniqueId + version. `ai-debate-club.json` ships `roles: [{role, type, requires, prefers}]` and `strategy.responseRules`. Those are exactly the two things found missing this session when citizens had no roles and no participation rules and looped in academy. Not unbuilt. Designed, authored 28 times, lost in the port. Several open cards are re-deriving pieces of it: #371 (recipe-owned objective), #6 (ground persona in room purpose), #264's role gap. IDENTITY is the specific loss that caused the live defect. uniqueId + version were replaced by ONE free-form `purpose` string doing two jobs — identity AND taxonomy. That is why `benchmark` (family) and `benchmark/hard-rs` (instance) were indistinguishable, why spawn's docs advertised a purpose resolving to nothing, and why such rooms render as plain chat. THE DESIGN: - RecipeId (UUID) + version = identity. Stable across content edits, so a bugfix to chat.json does not orphan every chat room. NOT a content hash for that reason. - Reproducibility moves to the RUN RECEIPT: (recipe_id, version, content_hash), so a benchmark's exact bytes are pinned forever without making identity brittle. Same shape forge-alloy already uses for models. - purpose demoted to a free-form hierarchical LABEL. Grouping falls out of the path: `benchmark/*` is a prefix query, rooms live at academy/bench/<suite>/<run>, and the web UI rewrites URLs from the same taxonomy instead of a hand-kept nav. - ONE registry, TWO ways in: shipped (embedded, stable ids) and installed (`recipe/install` at runtime). Spawn resolves an id and does not care which. Install is the validation boundary — serde, fail loud, assign identity. - NOT an enum (a closed set cannot express a system where anyone writes a recipe, and it reintroduces the compiler-to-author trap experience/source.rs warns about). Named constants over an open registry: `shipped::BENCHMARK_HARD_RS`. - Binding carries (id, version, content) so a partitioned node still renders its rooms — addressing by identity while keeping bytes local, as expert paging does. Six-step build order; steps 1-2 remove the silent-chat-room fallback, step 4 fixes per-run benchmark rooms (#346 slice 3), step 5 restores roles (#264's open half), step 6 ports 28 activity types forward as pure data with zero Rust. Explicitly recorded as NOT to build: room field on work cards (retracted), an activity-type enum, hierarchical purpose fallback, automatic room expiry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
… open cards (#274) Joel: 'Old shit was broken and a mess but many extra recipes we maybe miss.' Enumerates every legacy recipe so they cannot be lost twice, and maps them to work already underway. SEVEN describe activities we have OPEN CARDS re-deriving from scratch: training-dashboard (#141, in progress), grid-overview (#257), universe (#375), research (#93), academy-training, factory, inference-sample. Sharpest instance: general-chat's description is 'Natural conversation where AIs respond to humans thoughtfully, AVOIDING AI-TO-AI LOOPS.' That requirement was recipe-level, authored, and lost in the port — and this session was spent watching three citizens loop in academy. Port the concept and field content, not the Node implementation. Each port is a JSON file plus a test that its purpose resolves — zero Rust. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Design doc, nothing built. Written after auditing every recipe artifact in the tree.
The audit is the headline
legacy/src/system/recipes/uniqueId, version, name, displayName, description, tags, pipeline, ragTemplate, strategy, roles, tools, sentinelTemplates, layout, view, access, isPublic, locked, inputs, room, entityTypecore/…/experience/recipes/purpose, regions, affordances, layoutThe rewrite reduced a recipe to presentation. Every field describing how an activity behaves was dropped.
ai-debate-club.jsonshipsroles: [{role, type, requires, prefers}]andstrategy.responseRules. Those are precisely the two things found missing this session, when citizens with no roles and no participation rules looped in academy. Not unbuilt — designed, authored 28 times, lost in the port. Open cards re-deriving pieces of it: #371, #6, #264.Identity was the loss that caused the live bug
uniqueId+versionbecame one free-formpurposestring doing two jobs — identity and taxonomy. Hencebenchmarkvsbenchmark/hard-rsbeing indistinguishable, hence spawn's docs advertising a purpose that resolves to nothing (fixed separately in #2277), hence those rooms rendering as plain chat.Design
RecipeId(UUID) +version— stable across content edits, so a bugfix tochat.jsondoesn't orphan every chat room. Deliberately not a content hash, for that reason.(recipe_id, version, content_hash). A benchmark's exact bytes pinned forever without brittle identity. Same shape forge-alloy uses.purposedemoted to a label, hierarchical. Grouping is then free:benchmark/*is a prefix query, rooms live atacademy/bench/<suite>/<run>, web UI rewrites URLs from the taxonomy rather than a hand-kept nav.recipe/install). Spawn resolves an id and doesn't care which. Install is the validation boundary.experience/source.rsalready warns about.Six-step build order. Steps 1–2 kill the silent-chat-room fallback, step 4 gives per-run benchmark rooms (#346 slice 3), step 5 restores roles (#264's open half), step 6 ports 28 activity types forward as data with zero Rust.
Also records what not to build: room field on work cards (retracted earlier in #274), an activity-type enum, hierarchical purpose fallback, automatic room expiry.
🤖 Generated with Claude Code
https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo