Repository navigation
fix: enforce Discord decision buttons and recommendations - #290
Merged
Merged
Conversation
…d option on choices fm-ext-emit.sh now refuses an answer, followup, or final marked needs-you unless it carries --decision-file or --no-buttons "<reason>", so a thread asking the captain to act always carries the buttons for that choice. fm-ext-ask.sh refuses a post of two or more options that stars none of them unless --no-recommendation records the genuine tie, and the reason lands in the outbox payload as no_recommendation_reason. fm-ext-open.sh passes both decision flags through to its first message. Headers, help, docs/configuration.md, and the ext-respond skill carry the rule.
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.
Summary
Every Discord decision now has to arrive as buttons, and every choice of two or more options has to name a recommendation.
Evidence
Before:
bin/fm-ext-emit.sh --kind answer --thread-state needs-youwith no buttons published a plain post; three such choice posts reached the captain on 2026-11-06 because the text-shape guard only matched numbered or coded option lines.After: the same command exits 2 and publishes nothing:
With the escape it publishes an ordinary payload:
{"thread_state":"needs-you","no_buttons_reason":"status reminder, no choice asked"}.Before:
bin/fm-ext-ask.sh --option North --option Southposted a two-option choice with no starred option.After: it exits 2 before touching the hold:
With
--no-recommendation 'both routes cost the same'the payload carries the record:{"no_recommendation_reason":"both routes cost the same","labels":["North","South"]}.Tests:
env -u FM_TASK_ID bash tests/fm-ext-needs-you-buttons.test.shpasses all 4 cases; all 12tests/fm-ext-*.test.shsuites exit 0.FM_TASK_IDis unset only because a worker environment deliberately makes the watcher and drain suites refuse.Lint:
bin/fm-lint.shclean at pinned ShellCheck 0.11.0.Merge Danger
Door: two-way
The rule is validation only: no data migration, no payload field is required, and reverting restores the previous posting behavior.
Blast Radius: bridge
Any home running this commit must pass buttons or
--no-buttons "<reason>"on a needs-you reply, and a starred recommendation on a choice of two or more options; the emit and ask headers,docs/configuration.md, and the ext-respond skill say so.Pipeline
Updates from git push no-mistakes
✅ **Intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
✅ **Test** - passed
✅ No issues found.
python3 .test-validation/live.py— real intake, emit, ask, hold, open, and lookup commands against an isolated FM_HOMEfor suite in tests/fm-ext-*.test.sh; do TMPDIR="$PWD/.test-validation/tmp" bash "$suite"; done— all twelve suites exited successfullybin/fm-ext-emit.sh --help,bin/fm-ext-ask.sh --help, andbin/fm-ext-open.sh --helpManually reviewed documentation changes and the skill's two added sentences🔧 **Document** - 1 issue found → auto-fixed ✅
.agents/skills/ext-respond/SKILL.md:70- The new sentence says emit refuses any needs-you reply, but ack is exempt. Narrow it to answer/followup/final. Left unchanged because this phase forbids rewording runtime-loaded prompts.🔧 Fix applied.
✅ Re-checked - no issues remain.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.