feat(loop): record what the content is, as an open field (split Step 1) - #127
Merged
Merged
Conversation
Step 1 of the taxonomy split, deliberately invisible: the digest now also asks the model to name what this content *is* — 作品展示, 教程, 踩坑复盘, 清单, 观点, 前后对比 — and the name is stored on the deliverable and carried onto the project at pickup. Nothing reads it yet, so the interface does not change and the whole step can be reverted by ignoring two columns. Why this shape rather than a fourth enum value: "what is this content" is open by nature (the creator should never pick from a list, and the model should be able to name any shape it sees), while the three values that remain keep doing the job that genuinely needs a comparable finite key — routing, which judgment fields are required, which signals are watched, and (content_genome) which learned rules apply. Widening the enum instead would mean rebuilding six tables carrying the CHECK constraint. The open field's length cap is 40 while the prompt asks for 4–12 characters: capping it tightly in the contract would make a slightly-too-long name fail validation and discard the entire AI draft, which is the silent-degradation shape behind bug #85. Verified against the real model with the creator's own example: | material | named form | behaviour key | |---|---|---| | 「第30天,新叶终于变深了」 | 30天养护记录 | record | | 「春天画了六张水彩,想听听你们的意见」 | 水彩作品展示 | share | The second is the case the creator raised — "what if I am just sharing a piece I made" — and the name now says 作品展示 instead of forcing it into 分享. Tests: the form is stored and mirrored in the judgment; the fallback path invents nothing (null); pickup carries it; and one test pins the split's invariant — a project routes identically with and without a form. Reverting the pickup carry fails that test. Full backend suite: 507 passed. Migration 057 also adds the column to the 043 rebuild DDL constant, which is the trap that has bitten twice.
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.
Step 1 of the taxonomy split, deliberately invisible: the digest now also asks the model to name what this content is — 作品展示, 教程, 踩坑复盘, 清单, 观点, 前后对比 — and the name is stored on the deliverable and carried onto the project at pickup. Nothing reads it yet, so the interface does not change and the whole step can be reverted by ignoring two columns.
Why this shape rather than a fourth enum value
"What is this content" is open by nature — the creator should never pick from a list, and the model should be able to name any shape it sees. The three values that remain keep doing the job that genuinely needs a comparable finite key: routing, which judgment fields are required, which signals are watched, and (
content_genome) which learned rules apply. Widening the enum instead would mean rebuilding six tables carrying the CHECK constraint.One deliberate tolerance
The open field's length cap is 40 while the prompt asks for 4–12 characters: capping it tightly in the contract would make a slightly-too-long name fail validation and discard the entire AI draft — the silent-degradation shape behind bug #85.
Verified against the real model, with the creator's own example
The second is the case the creator raised — "what if I am just sharing a piece I made" — and the name now says 作品展示 instead of forcing it into 分享.
Tests
null);Reverting the pickup carry fails that test. Full backend suite: 507 passed. Migration 057 also adds the column to the 043 rebuild DDL constant — the trap that has bitten twice.