A project's inheritance becomes a decision, not a default (milestone 297, concept #2864).
Record — projects.inception JSON (migration 0085; legacy backfill stamps existing projects inherit-all so only new projects are asked); project_rulebook_exclusions (a project's opt-out of a whole always-on rulebook). Backup v10.
Rules — exclusions are total: list_always_on_rules(project_id), the subscription-derived set, rules_payload.excluded_always_on (7th key), the SessionStart block for a bound project; exclude_/include_always_on_rulebook tools + REST.
Service — inception.decide() validates every target before any effect, then applies (exclude, subscribe, design system, standard Systems seed) and writes the record last; current_defaults(); STANDARD_SYSTEMS moves to services/systems (the bootstrap ask names the same list).
Doors — create_project(...) takes the inception args; decide_project_inception; enter_project carries an inception ask for the owner of an undecided project; REST POST /api/projects with inception, POST …/<id>/inception, GET …/<id>/inception/defaults; _INSTRUCTIONS (kept under the 2k fold).
UI — New-project modal step 2, InceptionCard on the project page, Rules tab shows excluded always-on rulebooks.
A project's inheritance becomes a decision, not a default (milestone 297, concept #2864).
- **Record** — `projects.inception` JSON (migration 0085; legacy backfill stamps existing projects inherit-all so only new projects are asked); `project_rulebook_exclusions` (a project's opt-out of a whole always-on rulebook). Backup v10.
- **Rules** — exclusions are total: `list_always_on_rules(project_id)`, the subscription-derived set, `rules_payload.excluded_always_on` (7th key), the SessionStart block for a bound project; `exclude_/include_always_on_rulebook` tools + REST.
- **Service** — `inception.decide()` validates every target before any effect, then applies (exclude, subscribe, design system, standard Systems seed) and writes the record last; `current_defaults()`; `STANDARD_SYSTEMS` moves to `services/systems` (the bootstrap ask names the same list).
- **Doors** — `create_project(...)` takes the inception args; `decide_project_inception`; `enter_project` carries an `inception` ask for the owner of an undecided project; REST `POST /api/projects` with `inception`, `POST …/<id>/inception`, `GET …/<id>/inception/defaults`; `_INSTRUCTIONS` (kept under the 2k fold).
- **UI** — New-project modal step 2, `InceptionCard` on the project page, Rules tab shows excluded always-on rulebooks.
- **Docs** — using-scribe skill section, plugin 0.1.38, api-reference, README.
CI green on dev (run 4202). Migration 0085 runs on deploy.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
A project's inheritance becomes a decision, not a default (milestone 297).
- projects.inception (JSONB, NULL = undecided): {decided_at, decided_by, via
mcp|ui|legacy, choices {exclude_always_on_rulebooks, subscribe_rulebooks,
design_system_id, seed_systems}}; on to_dict.
- project_rulebook_exclusions: a project's opt-out of a whole always-on
rulebook — the sibling of the rule/topic suppressions, CASCADE both ways.
- services/inception.py (first cut): the vocabulary, validate_inception
(pure, all-or-nothing), normalize_choices, is_decided. Effects come in
step 3.
- Migration 0085 backfills every existing project via="legacy" with its
current standing (no exclusions, its subscriptions, its design_system_id,
no seed) so the ask fires only for projects created after this ships.
- Backup v10: rulebook_exclusions section; project rows carry inception and
design_system_id, restored in a post-pass once rulebooks/design systems are
mapped (design_system_id was not restored before — fixed in passing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A project that opted out of an always-on rulebook at inception must not see
it anywhere: list_always_on_rules(project_id=) and the subscription-derived
set skip it (an exclusion is total), get_applicable_rules / rules_payload
carry `excluded_always_on` as the seventh key so the departure is visible
wherever the rules are, and the SessionStart block built for a bound project
names it ("Excluded for this project by its inception decision …"). MCP:
list_always_on_rules takes project_id; exclude_always_on_rulebook /
include_always_on_rulebook mirror suppress/unsuppress (owner-only; the
rulebook must be always_on — subscribed rulebooks are left by unsubscribing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- inception.decide(user, project, choices=, via=): owner-only; validates the
choices (pure) and every target (owned rulebook / always-on for an
exclusion / readable design system) BEFORE any effect; then, each
idempotent: exclude always-on rulebooks, subscribe rulebooks, point the
design system (None = explicitly none), seed the standard Systems if asked
and the project has none; writes projects.inception LAST. Re-deciding is
additive for exclusions/subscriptions, replaces the design system, never
re-seeds.
- inception.current_defaults(): what binds if nobody decides — the ask's
payload (always-on / other rulebooks, standing exclusions + subscriptions,
design system + the choices, Systems count).
- services/systems.STANDARD_SYSTEMS (name + generic charter) + seed_standard_systems();
mcp/tools/systems names the same list in the bootstrap ask — one vocabulary.
- Integration tests: effects land and the record says why; bad targets apply
nothing; outsiders cannot decide.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- MCP create_project(..., exclude_always_on_rulebooks, subscribe_rulebooks,
design_system_id (0 unstated / -1 none / n), seed_systems): any inception
arg → inception.decide(via="mcp") after the create; none → undecided with
an inception_hint. New decide_project_inception(project_id, …) records or
re-records; nothing given = an inherit-all decision, stated.
- enter_project carries `inception` ONLY for the caller's own, undecided
project: inception_ask() = the project's current defaults + what to ask the
operator once + the exact call (the #2683 ask shape). Absent otherwise.
- REST: POST /api/projects accepts `inception` (validated before the create);
POST /api/projects/<id>/inception decides/re-decides; GET …/inception/defaults
is the card's payload; GET project already carries inception via to_dict.
- _INSTRUCTIONS: ORIENT names the ask; START a project names the questions —
never create a project bare by default (product behaviour, P#119).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- components/InceptionCard.vue: the one form, two homes — mode="create" in
the New-project modal's second step (emits the choices; the create carries
`inception`), mode="decide" on ProjectView for the owner of an undecided
project (loads that project's defaults, records the decision). Always-on
rulebooks listed checked (uncheck = exclude), others unchecked (check =
subscribe), design system select, seed-Systems toggle (disabled once the
project has Systems). Tokens only; modal canon (#2855); .btn-* canon.
- ProjectView: the card while undecided, one "Inheritance decided <date> via
… · …" line after; onDecided refreshes the project.
- ProjectRulesTab: "Excluded always-on rulebooks" section with include-back.
- api/inception.ts (types, fetchInceptionDefaults, decideInception);
api/rulebooks.ts: ApplicableRules.excluded_always_on, exclude/include
wrappers; REST POST/DELETE /api/projects/<id>/exclusions/rulebooks/<rb>.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A project's inheritance becomes a decision, not a default (milestone 297, concept #2864).
projects.inceptionJSON (migration 0085; legacy backfill stamps existing projects inherit-all so only new projects are asked);project_rulebook_exclusions(a project's opt-out of a whole always-on rulebook). Backup v10.list_always_on_rules(project_id), the subscription-derived set,rules_payload.excluded_always_on(7th key), the SessionStart block for a bound project;exclude_/include_always_on_rulebooktools + REST.inception.decide()validates every target before any effect, then applies (exclude, subscribe, design system, standard Systems seed) and writes the record last;current_defaults();STANDARD_SYSTEMSmoves toservices/systems(the bootstrap ask names the same list).create_project(...)takes the inception args;decide_project_inception;enter_projectcarries aninceptionask for the owner of an undecided project; RESTPOST /api/projectswithinception,POST …/<id>/inception,GET …/<id>/inception/defaults;_INSTRUCTIONS(kept under the 2k fold).InceptionCardon the project page, Rules tab shows excluded always-on rulebooks.CI green on dev (run 4202). Migration 0085 runs on deploy.
🤖 Generated with Claude Code
A project's inheritance becomes a decision, not a default (milestone 297). - projects.inception (JSONB, NULL = undecided): {decided_at, decided_by, via mcp|ui|legacy, choices {exclude_always_on_rulebooks, subscribe_rulebooks, design_system_id, seed_systems}}; on to_dict. - project_rulebook_exclusions: a project's opt-out of a whole always-on rulebook — the sibling of the rule/topic suppressions, CASCADE both ways. - services/inception.py (first cut): the vocabulary, validate_inception (pure, all-or-nothing), normalize_choices, is_decided. Effects come in step 3. - Migration 0085 backfills every existing project via="legacy" with its current standing (no exclusions, its subscriptions, its design_system_id, no seed) so the ask fires only for projects created after this ships. - Backup v10: rulebook_exclusions section; project rows carry inception and design_system_id, restored in a post-pass once rulebooks/design systems are mapped (design_system_id was not restored before — fixed in passing). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>A project that opted out of an always-on rulebook at inception must not see it anywhere: list_always_on_rules(project_id=) and the subscription-derived set skip it (an exclusion is total), get_applicable_rules / rules_payload carry `excluded_always_on` as the seventh key so the departure is visible wherever the rules are, and the SessionStart block built for a bound project names it ("Excluded for this project by its inception decision …"). MCP: list_always_on_rules takes project_id; exclude_always_on_rulebook / include_always_on_rulebook mirror suppress/unsuppress (owner-only; the rulebook must be always_on — subscribed rulebooks are left by unsubscribing). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>