feat(style): admit object emoji in a neutral reply, bounded at three #840
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!840
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/bk79-object-emoji"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #203. Both steps of the recorded build order, in the order Lucia argued for: check first, doctrine second.
The check
ValidateNeutralStylerefused every emoji, so the legibility this issue asks for could not ship at all. It now refuses tone and admits an emoji that names a thing.maxObjectEmoji(3) per reply, joined glyphs counting once.A style refusal is inside the repair loop at
proxy.go:516, so a fourth emoji costs one repair attempt rather than the turn outright. Worth stating because the thread twice described style rejection as going straight tofailTurnwith no repair - that is no longer true, and it is what makes enforcing the bound reasonable.Three judgement calls to review
The recorded decision has a contradiction, and I resolved it toward Kai's words. It says the emotive-versus-object split "needs no separate status-indicator carve-out", and also that
The Eco server is online 🟢is out. Both cannot hold:🟢is U+1F7E2, a geometric shape, not an emotive one, so "refuse emotive, admit the rest" would have admitted the exact example ruled out. Indicators are their own refused set.A party popper is an object to Unicode and tone to a reader.
🎉sits in Misc Symbols and Pictographs beside genuine objects, and my first implementation admitted it. "NOT for whimsy" is the issue's own emphasis, so the celebration range is refused even though nothing about it is a face.Denylist, not allowlist. Angie asked for a principled split rather than a list to maintain, and the failure asymmetry agrees: an allowlist refuses any object nobody thought of, costing a repair and then the turn, while a denylist admits an unlisted emoji that merely reads slightly off. The cheap mistake is the one it makes.
The doctrine
references/object-emoji.mdinsirens-echo-knowledge, carrying the rules the check cannot judge: the emoji follows the object rather than replacing it, first mention only, objects only, and no obvious emoji means none.A per-item table was drafted and cut. The full version cost 2142 bytes of Echo's prompt on every turn forever. The model already knows wood is 🪵; the rules are the part it cannot infer. Trimmed to one example line, the cost is 1535 bytes, recorded in
docs/sirens-echo-prompt-budget.mdwith that reasoning.Tests
objectemoji_test.gopins each decision: objects admitted, indicators refused, tone refused, three admitted and four refused, a joined glyph counted once, and a code span still surviving the scan (the2ef1c16regression). One more asserts the refused range tables stay sorted, becauseunicode.Isswitches to binary search past eighteen entries and an unsorted table would start missing runes silently.The shipped assertion that
The Eco server is online 🟢.is refused is kept with its rationale changed rather than deleted, as the decision asked.Wood 🪵 ...moved out of that list into the admitting test.Verification
ward gatePASS on all six steps. I also droveValidateResponseStyledirectly across all seven cases to confirm the social profile is untouched and admits everything.Conflict note
This touches
internal/community/tuning.go(addingmaxObjectEmoji) andinternal/community/prompt_test.go, and so does #835. Different constants and different lines, but they may need a merge.