Skip to content

Top-level (4)

The four atoms that frame the project.

One-paragraph problem statement + value prop. ~1 per project.

{
"id": "vis_main_a1b2",
"kind": "vision",
"name": "Habit Tracker vision",
"problemStatement": "People want to build small daily habits but lose track of streaks; existing apps overload with social features.",
"valueProposition": "No-friction tracker focused on streaks. One screen per habit, one tap to check in."
}

No Layer 2. Carries Layer 1 (intent) like every atom.

Target users. Goals + pain points. ~1–3 per project.

{
"id": "per_self_improver_c3d4",
"kind": "persona",
"name": "Self-improver",
"goals": ["build a daily habit", "see streak grow"],
"painPoints": ["cluttered apps", "forgetting to check in"]
}

Coarse grouping under a project (e.g. “Auth”, “Billing”, “Habits”). Acts as the parent for features via parent_of edges.

{
"id": "mod_habits_e5f6",
"kind": "module",
"name": "Habits",
"status": "in_progress"
}

status is one of idea / in_progress / done / archived.

One unit of behavior. The most-used kind in any project.

{
"id": "feat_create_habit_h14a",
"kind": "feature",
"name": "Create habit",
"userStory": "As a self-improver I add a new habit by typing a name and tapping Create.",
"priority": "p1",
"status": "in_progress",
"intent": {
"userStory": "...",
"relatedAtoms": ["ent_habit_h7h8", "ui_habits_screen_a1b2"]
},
"behavior": {
"trigger": "onClick",
"steps": [
{ "kind": "validate", "rule": "habit_name_not_empty",
"errorMessage": "Habit name cannot be empty" },
{ "kind": "call", "method": "POST", "endpoint": "/api/habits",
"body": { "name": { "$ref": "state.draftHabitName" } },
"assignTo": "state.lastCreated" },
{ "kind": "dispatch", "feature": "load_habits" },
{ "kind": "setState", "path": "state.draftHabitName", "value": "" }
]
}
}

Lowered into a SenLang Action chain by @atomprd/codegen-senlang. See Layer 2 schemas → feature.behavior.