land: accept a bot clean-review comment (naming the current head SHA) as the silence signal — fn-65#177
Merged
Merged
Conversation
…e signal - workflow.md §2.6: silence-gated, paginated issues/<n>/comments scan after the reviews-API loop and before the draft-trigger check; sets AUTO_REVIEW_CURRENT=1 on (automated-reviewer allowlist) ∧ (clean-review pattern) ∧ (head-current SHA token, empty/min-length guarded) - never resets the reviews-API result; observability via AUTO_REVIEW_SOURCE= comment + AUTO_REVIEW_EVIDENCE in --dry-run + verdict report - flowctl.py (canonical + dogfood .flow/bin) seed land.cleanReviewCommentPattern structured ERE; contract: null/missing→built-in default, explicit ""→disabled - SKILL.md prose: comment-path supplement + empty-disables contract - test_land_config.py: +16 tests (default present, round-trip, explicit-empty- disables distinct from default, no-clobber, docstring, structured-ERE, real-codex-comment behavioral; static §2.6 assertions — paginate, silence gate, before-draft-trigger, SHA non-empty/min-length guard, null≠empty cfg) - Codex mirror regenerated Task: fn-65-land-accept-a-bot-reviewed-clean.1
…p 2.1.1 - flowctl.md: new land config row, default shown as built-in ERE, empty disables comment scan - CHANGELOG: 2.1.1 Added entry citing fn-65 - version bump 2.1.0 -> 2.1.1 (patch, additive/opt-in) across all manifests + README badge Task: fn-65-land-accept-a-bot-reviewed-clean.2
Owner
Author
|
@codex review |
|
Codex Review: Didn't find any major issues. Already looking forward to the next diff. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
gmickel
added a commit
that referenced
this pull request
Jun 17, 2026
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 & why
/flow-next:land'ssilencemerge signal needs "an automated review of the current head." But land detected reviews only via the formal reviews API — and Codex (the botsilencewas built for) files a formal review only when it has findings. On a clean pass it posts an issue comment ("Didn't find any major issues. Reviewed commit<sha>") that never hits the reviews API. So a converged-clean PR could sit atNEEDS_HUMANforever — which is exactly what happened landing fn-64 (PR #176); a human had to merge on judgment.This teaches
silenceto also accept a bot's clean-review comment that names the current head SHA as head-current review evidence — closing the blind spot for the default bot-review flow.R-ID coverage
silenceworkflow.md §2.6comment scan[0-9a-fA-F]{7,40}, ≥7, non-empty, prefix-match), no==$var*-on-empty footgunworkflow.md §2.6[bot]/automatedReviewersallowlist)workflow.md §2.6workflow.md §2.6null→default, explicit""→disabled;silence-gated; only ever setsAUTO_REVIEW_CURRENTflowctl.pyget_default_config()(+ dogfood copy)flowctl.mdrow + flow-next.devland.mdx(3 spots) + changelogdocs/flowctl.md, flow-next.devAUTO_REVIEW_SOURCE=comment+AUTO_REVIEW_EVIDENCEin dry-run/reportworkflow.md §2.6Critical changes — where to look
plugins/flow-next/skills/flow-next-land/workflow.md§2.6 — the comment scan: paginatedissues/<n>/comments, gated onREVIEW_SIGNAL == silence, runs after the reviews loop and before the draft-trigger check; allowlist + pattern + head-current-SHA-token match; setsAUTO_REVIEW_CURRENT=1(never resets). SHA preferentially read from theReviewed commitmarker line.plugins/flow-next/scripts/flowctl.py(+ dogfood.flow/bin/flowctl.py, lockstep) —land.cleanReviewCommentPatternseeded as a structured ERE; thecfgread distinguishesnull(→ built-in default) from explicit""(→ disabled) — the real off-switch.plugins/flow-next/tests/test_land_config.py— +16 tests (default present, round-trip, explicit-empty-disables distinct from default, no-clobber both directions, docstring) plus a static§2.6invariant guard (--paginate, silence-gate, before-draft-trigger ordering, SHA non-empty/min-length, set-only-never-reset, null≠empty).flowctl.md+ flow-next.devland.mdx+ changelog; plugin 2.1.0 → 2.1.1 (additive/opt-in patch). flow-next.dev pushed separately (gmickel/flow-next.dev@57f61da).Decision context
silencewas built for "bots that comment but never APPROVE," yet its detection only read formal reviews — so the feature and its implementation disagreed on exactly the bot it targets. The fix stays conservative: allowlist-gated, head-SHA-anchored (a fix push still forces a fresh clean comment), additive-only (never overrides a formal review / open thread / red CI), and disable-able via empty pattern.Verification
python3 -m unittest discover -s plugins/flow-next/tests);ci_test.sh67/67; standalone behavioral bash matrix (head-current clean ✓, stale-SHA ✗, no-SHA ✗, non-bot ✗, empty-pattern ✗).==$var*-on-empty footgun and the un-disableable-opt-out config bug.🤖 Generated with Claude Code via
/flow-next:make-pr