Files
stack/docs/plans/2026-10-21_creative-delete-human.md

3.2 KiB

Brief: the human deletes a creative instance (REQ-COS-3, after row 194)

Sage, 2026-10-21, for mos-1214 item 5 and mos-1215 item 3. Owner Honker, reviewer Webby, gate owner Sage. Chained after row 194: deleteRefusal and the delete path land in 194, so this row builds on 194's landing. The row has to land before the v1 tag for 10-27. If it slips past that date, Sage tells Mos before 194's v1 tag (mos-1215).

Why

REQ-COS-3 (docs/prd/mosaic-stack.md:342) says "Only the user deletes an instance." Creative entries are instances: they sit in the business file's instances, and only the human's instances.set adds or changes one (C2-08 M10, row 213). Row 213 made every creative definition END_PROTECTED (vocabulary.mjs:195, END_PROTECTED = THREAD_DEFINITIONS). In row 194, deleteRefusal refuses END_PROTECTED for every actor (organization-definition-refused), so nobody can delete a creative instance. The human can only delist one with launch: false. This row lets the human delete one, which matches END_PROTECTED's intent: a protected end goes to the human (sage-0525).

What this row does

  1. Human-only delete of a creative instance. Pass the actor into deleteRefusal, and through every caller: the broker's check at the verb, the launcher pass's set op delete, the CLI and the Console.
    • A creative definition (CREATIVE_DEFINITIONS) whose actor is the business file's human passes this check and goes on to the remaining checks (references, kept, credentials).
    • Any other actor still gets a refusal. Use the code creativeHumanOnly gives (organization-creative-human-only), so the refusal says why.
    • Every other END_PROTECTED definition (the thread definitions that aren't creative, such as the chief of staff) still refuses organization-definition-refused for every actor, the human included.
  2. Fire stays as it is. role.fire and instance.fire keep refusing END_PROTECTED for every actor. REQ-COS-3's fire is the chief's action, and the chief can never hire a creative instance.
  3. Agents page. Row 194 hides Delete on endProtected. Offer Delete on a creative instance only on the human's page, from the same server predicate, and never on the tester listener. Add one browser test for each side.
  4. Persona file. Say in BUILD.md what happens to <configDir>/personas/<business>/<instance>.md on delete. The smallest choice is to leave it in place and record that. If you remove it, open it with O_NOFOLLOW as row 213 reads it, and add a test.
  5. DEFERRED. Close row 194's DEFERRED entry for human delete of a creative entry, and name this row in it.

Boundaries

  • No change to who may add or change a creative instance (M10), or to role.hire's bounds.
  • No change to fire, veto or launch.keep.
  • No test touches ~/.mosaic-dev, ~/.config/mosaic-dev, the live units, a slot file, .53 or .54.

Gate

Webby approves the manifest. On Sage's slot, every touched test file passes whole, along with the business, bus, cli and webui suites whole and every scripts/test-*.sh. Two mutants must be killed: one that lets a non-human actor delete a creative instance, and one that lets the human delete a non-creative END_PROTECTED instance.