Repository navigation
fix: require Discord topic thread titles and explicit reply states - #282
Merged
Merged
Conversation
A reply that creates its request's topic thread must pass --thread-title, and every answer or final must pass an explicit --thread-state; emit refuses either omission with a one-line message. Callers, tests, the ext-respond skill, and the topic-thread contract follow.
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
bin/fm-ext-emit.shnow refuses the two thread mistakes instead of relying on theext-respondskill being remembered.ensure_topic_threadconditions. The dedicated-channel lookup moved into a sharedfm_ext_dedicated_channelinbin/fm-ext-lib.sh, so emit,fm-ext-open.sh, and the poster read the same config.fm-ext-open.shpasses--thread-state noneby default on its first message, because that message is an answer.fm-ext-ask.shalready passesneeds-you, so it is unchanged.ackandfollowupstill need no state.ext-respondskill and the topic-thread section ofdocs/configuration.mdstate the rule once and point to the emit header as its owner.emit_replyhelper that strips a stand-in title.Evidence
ackon a top-level dedicated-channel request, or ananswer/finalwith no state, published a payload. The thread kept the raw message text as its name and no marker was set.34 emit requires a creating title and an answer or final stateintests/fm-ext-topic-threads.test.sh:bin/fm-lint.shrc=0.fm-ext-topic-threads(34/34),fm-ext-ask,fm-ext-media,fm-ext-decision,fm-ext-inbox-remove,fm-ext-plugin-dest,fm-ext-thread-context,fm-ext-waiting-pin, andfm-ext-ack-guardpass.fm-ext-bridgetest 35 (wake row presentation) andfm-ext-watch(mid-session arm timing under host load ~60). They pass in CI on main and on this PR. Neither touches emit.01M6148GQCM2C1A6YVDH55FP66, was cancelled by the supervisor after it stalled in lint. Its document-step commitcc8414cdis kept, and this run validated that head.Merge Danger
Door: two-way
Reverting restores optional flags. Already-queued payloads are unaffected, because the poster still names untitled legacy payloads.
Blast Radius: Discord replies
Any agent or script that calls
fm-ext-emit.shwith ananswer/finaland no state, or with an untitled thread-creating reply, now gets a refusal and must retry with the flag. Every in-repo caller is updated. Out-of-repo callers would see the one-line refusal.Testing
Live CLI scenarios and both focused regression files passed; base-version emit reproduced the omissions. Captured CLI transcripts and persisted payloads. Discord transport was injected in regression tests; no real Discord service was contacted. Lint and the full suite were left to their assigned phases.
Evidence: Live CLI refusals, acceptance, routing, ask and open
Evidence: Receipt-based idempotent retries
Evidence: Base emit reproduces missing-flag omissions
~/.no-mistakes/evidence/01M616JK5Q9620S320WNT6TKJV/topic-tests.log)Evidence: Focused ask regression tests
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.
TMPDIR="$PWD/.phase-test-tmp" PYTHONDONTWRITEBYTECODE=1 bash tests/fm-ext-topic-threads.test.shTMPDIR="$PWD/.phase-test-tmp" PYTHONDONTWRITEBYTECODE=1 bash tests/fm-ext-ask.test.shpython3 .phase-test-tmp/drive.py— real intake, emit, open, ask and task-hold interfaces against an isolated home; driver preserved as live-cli-driver.py in the evidence directory.python3 .phase-test-tmp/receipt.py— record receipts through fm-ext-outbox, retire payloads, then retry emit without required flags.python3 .phase-test-tmp/baseline.py— execute the base-version emit CLI and reproduce both missing-flag omissions.Removed the disposable setup and verifiedgit status --shortwas empty.✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.