docs: the plan for splitting "what the content is" from "what the machine does" - #126
Merged
Merged
Conversation
…hine does" Answering the creator's three questions — why three values, doesn't that constrain the content, doesn't it constrain what the AI produces — with the conclusion that the enum is not the problem: one field is doing two jobs. Machine behaviour (routing, which judgment fields are required, which signals are watched, and — verified — which learned rules apply at all: `content_genome.py:147` skips rules whose applicability intent differs) needs a comparable finite key. "What is this content" needs to be open, because the creator should never pick from three, and the AI should be able to name any shape it sees. Those are different requirements on one field. So deleting the enum is the wrong fix; splitting it is the right one. The plan is additive and staged, each step its own PR, each reversible, production usable throughout: 1. add `content_form` (open, AI-named) as plumbing — no visual change; 2. make the UI show the AI's name and demote the three values to the behaviour key (this is the step with visible change); 3. rename the behaviour key in the rubric so it stops reading as a content category; 4. only if a fourth *behaviour* ever appears, widen the six CHECK constraints in one migration — explicitly not for a new content shape. The inventory is measured, not estimated: 139 references across 12 files, six tables carrying the CHECK, five user-visible render sites, and — usefully — no E2E assertion on any intent label, so the copy carries less risk than feared.
This was referenced Sep 16, 2026
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.
Answering the creator's three questions — why three values, doesn't that constrain the content, doesn't it constrain what the AI produces — with the conclusion that the enum is not the problem: one field is doing two jobs.
Why the split, not the delete
Machine behaviour needs a comparable finite key: routing, which judgment fields are required, which signals are watched, and — verified, not assumed — which learned rules apply at all:
So the field is load-bearing beyond cosmetics: before #124 a piece of text was judged
solve, which meant experience distilled for share pieces was silently not used. "What is this content" needs to be open, because the creator should never pick from three and the AI should be able to name any shape it sees. Deleting the enum pushes interpretation into 12 files; splitting it keeps the machine's key finite and lets the naming be free.The plan (additive, staged, reversible, production usable throughout)
content_form(open, AI-named) as pure plumbing — no visual change at all.Inventory is measured, not estimated
Also records the migration trap that has now bitten twice (any new column on
content_projectsmust be added to the 043 rebuild DDL constant), and the acceptance criteria including one test to keepcontent_formout of routing.