TSA-506: Preset description editing - #507
Merged
Merged
Conversation
A preset has a description, but nobody could write one: it was set by hand in the seed migrations and left empty forever on anything a user made, while the Presets list showed "No description" with no way to change that. - GET /presets/:id now returns description; without it the editor had nothing to prefill the field from - an optional Description input in the editor, under Name, carried into the create payload - the list renders an empty description as nothing, not a placeholder - design: the Stage 8 mockup and spec now include the field
Both preset screens sat flush against the left edge while every other page centres its content: the document page uses a max-width column with auto margins, the presets list had no max-width at all, and the editor had one but no auto margins, so it never moved off the left. Both now match the document page: a full-width header with its rule, and a centred column under it, capped at the 960px the editor already used.
The container was centred at 960px but the card inside it caps at 720px with no auto margins, so all 240px of slack sat on the right and the form stood 120px left of centre.
IlliaMatushchak
approved these changes
Sep 28, 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.
Closes #506
A preset has always had a
description, but there was no way for a user to write one. It is set by hand in the seed migrations for the four built-in presets, andNOT NULL DEFAULT ''in the schema, so anything a user creates keeps an empty one forever. Once the Presets list landed, that became visible: a user-made preset reads "No description" and nothing can change it.What I found while doing it
Adding the input was not enough.
GET /presets/:idnever returneddescription, so when you opened a preset to edit it there was nothing to prefill the field from - you would have silently wiped the description every time you saved a new version. So the field is now carried through the details DTO, the entity and the repository select as well.Changes
GET /presets/:idreturnsdescription.Descriptioninput in the editor, underName, prefilled from the base preset and sent in the create payload. No backend work was needed for saving:POST /presetsalready accepted the field and validated it at 2000 characters."No description"placeholder.design/prompts.md: the Stage 8 mockup and the spec now include the field, so the design and the code say the same thing.Tested against the local backend
GET /presets/1returns the seeded description.''.Validation failed.notevalues survive the round trip.tsc --noEmitandeslint --max-warnings=0are clean.Note on scope
This was listed in #271 ("edits text fields: name, description, instructions, seed glossary") and ticked there, but the editor never had the field - the implementation followed the design, which omitted it. #271 has been narrowed and this is split out, with the design updated to match rather than left to diverge again.
🤖 Generated with Claude Code