Repository navigation
Accept an earlier one-way-door yes; ask refuses re-asking a decided question - #213
Merged
Merged
Conversation
A question asked in class one-way-door is a one-way door whatever its kind: approve-plan's door citation, the Goal-level door line, the ticket-level door check, the decision-authority check and the remediation paths now accept it, still only on the owner's own answer, hash bound. ask records --class one-way-door as --kind one-way-door, refuses another kind, and refuses --default on a door. ask refuses a question close to one the owner answered about the same work, pointing at the answer to cite; --new-because "<what changed>" lets it through and the owner reads it first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # docs/devteam/dashboard/index.html # docs/devteam/scripts/devteam.mjs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A goal-level door is cited only as recommended, never from a ticket-level question for another ticket; citing it for plans doesn't use it up for the one-way-door act itself. - ask refuses only decisions (owner-decision, one-way door, a secret already asked for) in the same class, or a door re-asked in any shape; worded alike word for word (versions and names count whole); not after the answer was spent (goal changes included), not for another pinned draft, not when only a blocked ticket differs. --new-because is left off a first question. - Merged #210's own door default refusal in place of ours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re-ask gaps - A one-way door is asked with --recommendation, so its answer approves a plan only as recommended. - The --approves once-used scan skips approve-plan door citations too. - An earlier owner-action without secrets never blocks a question. - --new-because is kept only on a question that re-asks a decision. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Member
Author
|
Owner request: "ensure I am not asked the same question over and over again". Reviewed at 3f049f2, after the author's adversarial Fable pass. A door answer counts only from the owner's own hash-bound line, agreeing with its recommendation, for the same ticket. Defaults never count. The re-ask refusal needs a close text match, the same work, an owner answer that could approve the new question, and allows |
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.
What
1. An earlier one-way-door yes counts, whatever kind it was asked as.
isDoorQuestion(v)is true forkind: one-way-doororclass: one-way-door. The kit now uses it wherever it accepts an owner's one-way-door answer:authorise()'s approve-plan door citationdecisionAuthorityGapandanswerUseGapact's ticket-level door check and its Goal-level door pathWhat makes the answer count is unchanged:
status: answeredfromquestionView, which means the owner's own line in the owner's file, bound to the question's hash, and never a default. act still refuses a door the owner didn't answer, and the plan review still has to say- Goal-level door: <qid> covers this plan.These checks are tighter than before (from review):
doorAgreed). This applies to both the cited path and the ticket-level path. Before, an owner's "no" to a door still let approve-plan pass.--goal.--recommendation. Without one, an answer would agree by default, so a bare "no" could still approve the plan.authorise(including its--approvesbranch) andanswerUseGapskip those approve-plan calls.2. The mismatch is stopped at the source. In
ask,--class one-way-doorwith no--kindis recorded askind: one-way-door.--class one-way-door --kind <anything else>is refused with "ask it --kind one-way-door, not --kind X". The no-default rule now applies to these questions as well: #210's refusal ("a one-way door has no --default") covers the normalised kind.--kindoff, so that case now just works. An explicit other kind has rules of its own (a review's page, an owner-action's secrets) that a silent rewrite would drop. Refusing keeps every per-kind check as it is, and the normalised kind brings the no-default rule and the Inbox floor with it.3.
askrefuses a re-ask. This scope came from the owner: "ensure I am not asked the same question over and over again".askdies only when all of these hold:owner-decision,one-way-door, or anowner-actionasking for the same secret to the same sink. Clarifications, goal definitions and proposals are only mentioned, because those questions are iterative.answered_by: owner, answered, and hash bound. A defaulted or open question never blocks.--kind one-way-door --ticket <impl ticket>.The refusal names the answer and how to cite it:
--approved <qid>, and for a door,act --class approve-plan --approved <qid>plus the Goal-level door line. If the owner answered against the recommendation, the refusal says that answer is their decision.--new-because "<what changed>"lets the question through. It is recorded on the line asnew_because, a new optional schema field covered by the question hash. The dashboard card shows it above the question as "Asked again because: …", and so doesquestions. If nothing the owner answered is like the question,--new-becauseis left off with a warning, so a first question never reads "Asked again".4. Docs.
supervisor.md§6 now opens its re-ask rule with "Never ask the owner a decision they have already made: cite the answer. Re-asking is a failure, not caution." It covers class one-way-door, whataskrefuses, and--new-because.constitution.md§4 says a question asked in classone-way-dooris a one-way-door answer. When the similar earlier answer is a door,ask's warning points at citing it.Why
On 2026-11-10 the owner answered "yes" to q-20261110-035713266-supervisor. It was a goal-level question with
kind: owner-decision, class: one-way-door, about moving the proposal gate into a shared package. When ticket proposals-22 reached approve-plan, the kit only acceptedkind: one-way-door, so the supervisor asked again (q-20261113-014021742-supervisor) under a different type. The owner: "this type of shit is really annoying and timeconsuming - you're re-asking me the same question with a different type."Authority (what a hand-written line can't do)
All agents share one Unix user, and the supervisor writes its own log. Each of these still counts for nothing, and each has a test:
answer: the integrity check doesn't let the supervisor setanswer, so the fold drops the line.status: answered: the fold readsansweredonly from an owner answer line.ownerline in the supervisor's file: the writer must match the file.setaddingclass: one-way-doorto an owner-answered question: the supervisor may not setclass. The class is also hashed, so a duplicate line that rewrites it reopens the question.Tested
test/lib/chain.mjs, new step "a one-way door asked in class one-way-door…":owner-decision/class: one-way-dooryes is cited by decide → act approve-plan (with the review line) and accepted. Thenact --class one-way-door --approvedthat same answer works once.--approvedpath.asknormalises a missing kind, refuses an explicit other kind, and refuses--default. It refuses the owner's exact re-ask shape (--kind one-way-door --ticket …) and the same--classre-ask, and--new-becauserecords the reason.test/search.test.mjs:--new-becauselets it through, andquestionsprints "Asked again because: …" before the question.--new-becauseis left off.--new-because: chain sync, chain goal-change, and next-step's strategy test."new_because": null.TMUX_TMPDIR):test/kit.test.mjs(82/82), plussearch,approvals,components,merge-admin,plain-questionsandnext-step. CI runs the rest.Not changed (noted in review)
checkLinestill flags a default only onkind: one-way-door. Extending it toclass: one-way-doorcould faillog-checkon lines older kits wrote. A hand-written class-door line with a default gets no authority anyway, because act refuses it.The remediation path's
isDoorQuestionbranch can't be reached throughask, sinceremediation:blocks are only allowed under class production-remediation. It is there for consistency.The word match is whole-word with no stemming, which leans toward no false positives. A heavily reworded re-ask, such as "moving" plus a ticket id, is only warned about, not refused. A classless answer re-asked in an owner-only class is asked again (with a warning), because the kit can't cite the classless answer there.
An earlier owner-action without secrets never blocks a later question.
Migration
new_becauseis optional.new_becauseis part of the question hash. A kit older than this one drops the unknown field, so it would read an answered re-asked question as rewritten. Upgrade every box on the project together.This branch includes #210 (
supervisor-bolder-plainer, merged), and #210'saskchecks and §6 text are kept.🤖 Generated with Claude Code