C.W.K.
Stream
Lesson 04 of 04 · published

Modules Are Presets, Not Schedules

~9 min · modules, capture-preset, workout-intake, no-schedule

Level 0Cold Iron
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"A module is a faster way to write down what happened — never a claim about what was supposed to happen."

What a Module Actually Is

Dad and Pippa maintain recurring-capture modules together in the Modules tab, in two kinds: workout (indoor bike, the 3x total-body strength session, walks with Mom) and intake (protein powder, creatine, other repeated non-meal products). A module is a small template — an id, an immutable kind, a name, free-form default_values, notes, and an active flag. It is referenced by crumbs, and one shared CRUD implementation serves both kinds. That is the whole entity: a preset, not a plan.

Dropping a Chip Records Today

From the Stream, a module drops in as a chip. Pick Indoor Bike and adjust today's duration; pick Protein Powder and adjust today's servings. In both cases the module gives reusable structure while the new crumb records that day's actual event — the module_ref plus the day's adjusted module_values. The server, not the client, derives the crumb's surface from the module's immutable kind: a workout module makes a workout crumb, an intake module makes an intake crumb. The preset is a shortcut into the same free-prose stream, not a second kind of record.

A module is a capture preset; it records what happened, never what should. Intake modules do not encode frequency, expected doses, reminders, missed days, or adherence. Tapping the chip says 'this happened today,' full stop. The instant a module implies a schedule, it has become the adherence machine the last lesson forbade.

Deactivate, Don't Destroy

Because crumbs reference modules, deleting a module would strand the crumbs that mention it. So modules deactivate rather than delete — the template goes inactive, and every crumb that ever used it keeps its module_ref and its recorded values intact. Even the schema evolution honored this: when the immutable kind field was added, pre-existing events replayed as workout rather than being rewritten. The append-only truth is never edited to fit a new shape; the new shape is derived over it. And note the boundary: changing meals stay free prose plus the optional slot chips — they are not modules, because a meal is not a repeated identical event the way a supplement is.

Code

A module template, and the crumb a chip-tap creates·json
// The template, maintained in the Modules tab:
{
  "id": "mod_bike",
  "kind": "workout",            // immutable: workout | intake
  "name": "Indoor Bike",
  "default_values": { "duration_min": 45, "intensity": "moderate" },
  "active": true
}

// Tapping the chip creates an ordinary dated crumb -
// TODAY'S actual event, never a schedule:
{
  "target_date": "2026-07-24",
  "module_ref": "mod_bike",
  "module_values": { "duration_min": 60 },  // adjusted for today
  "surface": "workout"          // derived server-side from kind
}
// The module is the preset. The crumb is what happened.

External links

Exercise

Someone asks you to add an 'expected doses per week' field to an intake module so the app can show a red 'missed' badge when Dad falls short. Explain why Forge declines, and state what the module records instead of an expectation.
Hint
An expected-doses field turns a capture preset into a schedule, and the 'missed' badge is adherence gamification — both forbidden. The module records only the actual consumption events that happened, never a target to fall short of.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.