Skip to content

post_bot_commits counts local-tier agent commits as human rework - #1941

Merged
The01Geek merged 16 commits into
mainfrom
issue-1440-post-bot-commits-counts-local-tier-agent-commits
Aug 25, 2026
Merged

post_bot_commits counts local-tier agent commits as human rework#1941
The01Geek merged 16 commits into
mainfrom
issue-1440-post-bot-commits-counts-local-tier-agent-commits

Conversation

@prflow-implementer

@prflow-implementer prflow-implementer Bot commented Aug 25, 2026

Copy link
Copy Markdown

Summary

  • The weekly retrospective's post_bot_commits field miscounted the engine's own local-tier agent commits as human rework, because those commits carry a git identity GitHub cannot resolve to an account (a blank login) and the old filter counted any non-[bot] login as human.
  • The count is narrowed to only positively human-attributable non-merge commits, so a blank/whitespace/absent login is classified agent-side — unknown is not a human — and the retrospective clean gate stops forcing LLM analysis on PRs whose only "rework" was the engine's fix-loop commits.

Changes

lib/fetch-pr-context.sh: The POST_BOT_COMMITS jq block now counts a non-merge commit after the last bot/PR-author commit only when is_human holds for its author_login or committer_login — a non-blank string (at least one non-whitespace char) that neither ends in [bot] nor equals the [bot]-stripped PR author. The is_human/ends_bot helpers type-check first, so a null login no longer aborts the filter. Merge commits (parents_count > 1) stay excluded. The coupled POSTBOT_SHAS block carries the byte-identical predicate. The explanatory comment above the block is updated to state the new counting rule, including the agent-side classification of blank logins.

lib/cheap-gate.jq: The post_bot_commits field description in the header comment is updated to state that a blank/absent login is classified agent-side, never human. The post_bot_commits > 0 non-clean arm is unchanged.

lib/test/run.sh: A #1440 fixture block drives the shipped POST_BOT_COMMITS/POSTBOT_SHAS programs directly against fixture commit arrays — blank-login tail, whitespace-only tail, mixed tail with one named human, null-login record (no filter abort), merge-commit exclusion, missing parents_count, each is_human OR arm one-sidedly, PR-author self-exclusion, and the coupled POSTBOT_SHAS SHA selection.

lib/test/modules/coverage-map.json and docs/internal/DEVFLOW_SYSTEM_OVERVIEW.md: coverage entry and the retrospective's post_bot_commits clause updated to match the new counting rule.

Resolves

Resolves #1440

Test Plan

  • lib/test/run-shard.sh monolith passes (the #1440 block is run.sh-resident); observed 9850 passed / 0 failed / 0 skipped at head ca72fb7.
  • Blank-login tail after the last bot commit reports post_bot_commits: 0.
  • A named human non-merge commit after the last bot commit is still counted.
  • A null login does not abort the jq filter.

Visual Changes

N/A

Breaking Changes

None. The field's type and name are unchanged; only its counting rule changes, and historical retrospective records are not rewritten.

prompt-surface size: ran .prflow/vendor/prflow/scripts/prompt-surface-growth.py (vendored path; the prefix-stripped fallback was not needed). Reading: no tracked *.md under skills/, agents/, or .prflow/prompt-extensions/ changed on this branch — no table rendered.

@prflow-implementer
prflow-implementer Bot marked this pull request as ready for review August 25, 2026 19:19
@prflow-implementer

Copy link
Copy Markdown
Author

/prflow:review

@prflow-reviewer

prflow-reviewer Bot commented Aug 25, 2026

Copy link
Copy Markdown

PRFlow Review — PR #1941

Status: ✅ APPROVE with notes
Diff profile: engine_self_modifying (full checklist) — not config_only/small_diff; no new types; not detect_all_audit
Run: View run
Reviewed HEAD: bb2a556
Last updated: 2026-08-25

Blueprint

  • Classify diff (Phase 0.5)
  • Generate verification checklist (Phase 1)
  • Verify checklist (Phase 2)
  • Review agents (Phase 3)
  • Aggregate & verdict (Phase 4)
  • Run complete — everything this run owed

Verdict: APPROVE with notes (correct, well-tested bug fix to post_bot_commits counting; three minor test-coverage suggestions, no blocking issues)

Issue Compliance

Reviewed against issue #1440: post_bot_commits counts local-tier agent commits as human rework — criteria from the /prflow:implement workpad comment; scope unchanged. Requirement-based checklist items are included in the verification results below.
Criteria came from the /prflow:implement workpad comment — this run's authoritative set, possibly narrowed from the issue.

  • No divergence between the workpad's criteria and the issue body's.

All five acceptance criteria are satisfied (VC-1…VC-5 below, each PASS).

Verification Checklist Results

10 passed, 0 failed, 0 inconclusive — 0 via lite probe, 10 via agent.

✅ Passed items (10 of 10) — click to expand
  • VC-1: blank-login tail after last bot/author commit → post_bot_commits: 0 [lib/fetch-pr-context.sh]
  • VC-2: non-blank, non-[bot], non-author login commit still counted [lib/fetch-pr-context.sh]
  • VC-3: merge commits (parents_count > 1) remain excluded [lib/fetch-pr-context.sh]
  • VC-4: block comment + lib/cheap-gate.jq field description state the new counting rule (blank logins agent-side) [lib/cheap-gate.jq]
  • VC-5: lib/cheap-gate.jq's post_bot_commits > 0 non-clean arm unchanged [lib/cheap-gate.jq]
  • VC-6: test("[^[:space:]]") POSIX class supported by jq's oniguruma engine (whitespace-only → blank) [lib/fetch-pr-context.sh]
  • VC-7: run.sh grep/sed range markers match the shipped jq block delimiters (complete, not truncated) [lib/test/run.sh]
  • VC-8: test harness env-var contract ($COMMITS/$AUTHOR/$DEVFLOW_JQ) matches the shipped block [lib/test/run.sh]
  • VC-9: $author is the [bot]-stripped PR author, so $l != $author self-exclusion is correct [lib/fetch-pr-context.sh]
  • VC-10: coverage-map.json '1440' unmodularized entry matches sibling shape (tests live inline in run.sh) [lib/test/modules/coverage-map.json]

Code Review Findings

🟡 Suggestion / Minor

  1. No fixture targets a null/non-string login during the anchor selection specifically; the null login does not abort fixture reaches the guarded ends_bot path only incidentally via commit ordering. A fixture whose only distinguishing property is a null/non-string login seen during anchor scanning would pin the anchor-side ends_bot type guard directly. (raised by 1/5 agents)
  2. The documented "non-string are classified agent-side" behavior has no covering fixture (a numeric/object login). Handled correctly by the type == "string" guards, but unexercised. (raised by 1/5 agents)
  3. The $bot_indices | length == 0 (no bot commit at all) branch has no fixture in the new post_bot_commits counts local-tier agent commits as human rework #1440 block — unchanged by this PR, so not a regression risk, but uncovered. (raised by 1/5 agents)

over-grade annotation: no finding flagged
truthfulness sweep: no finding promoted
intra-diff contradiction scan: no contradiction found

Test Evidence

CI conclusions read from the GitHub API for the reviewed commit bb2a556: lib + python tests: success, lint (shellcheck + actionlint + ruff): success, and all shards (monolith, modules-pin, modules-rest, modules-large, python-pool): success.

Notes

  • Phase 0.6 stale-prose lint: disabled by config (prflow_review.stale_prose.enabled=false).
  • Prompt-surface edit-routing gate (repo extension): the diff touches no prompt-surface trigger glob (only lib/**, docs/**, .changeset/**), so the gate draws no finding.
  • Diff classified engine_self_modifying (touches lib/**) → full Phase 1+2 checklist was run.
  • Final-pass reviewer extension: loaded-empty, resolved-root matched the orchestrator's trusted root — no propagation-failure.

Verdict

APPROVE with notes — see above.

@prflow-reviewer prflow-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE with notes — full report in PR comment

The complete review report (checklist results, findings, details) is in the
PRFlow Review progress comment on this PR.

@prflow-implementer

Copy link
Copy Markdown
Author

/prflow:review

@prflow-reviewer prflow-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE with notes (correct, null-safe, well-tested bugfix; one Important test-coverage note and minor suggestions, none blocking at the critical threshold)

Issue Compliance

Reviewed against issue #1440: post_bot_commits counts local-tier agent commits as human rework — criteria from the /prflow:implement workpad comment; scope unchanged. Requirement-based checklist items are included in the verification results below.

Criteria came from the /prflow:implement workpad comment — this run's authoritative set, possibly narrowed from the issue. No divergence between the workpad's criteria and the issue body's. All five acceptance criteria are covered by verification items and pass:

  • AC1 (blank-login tail → 0): VC-1 PASS (executed against a fixture).
  • AC2 (named human still counted): VC-2 PASS.
  • AC3 (merge commits excluded): VC-3 PASS.
  • AC4 (comment + cheap-gate.jq description updated): VC-4 PASS.
  • AC5 (post_bot_commits > 0 non-clean arm unchanged): VC-5 PASS (base↔head diff confirms comment-only change).

Test Evidence

CI for the reviewed commit 1bc72c5483b8b11659c50da5327ced6d098e24a4 is fully green (from the engine ground-truth block, read from the GitHub API): lib + python tests: success, lint (shellcheck + actionlint + ruff): success, and all five shards (modules-pin, python-pool, modules-rest, modules-large, monolith) success. The #1440 fixtures are run.sh-resident (monolith shard), which passed.

Verification Checklist Results

13 passed, 0 failed, 0 inconclusive — 0 via lite probe, 13 via agent.

✅ Passed items (13 of 13) — click to expand
  • VC-1: blank-login tail reports post_bot_commits: 0 [lib/fetch-pr-context.sh]
  • VC-2: non-blank human login after last bot commit is still counted [lib/fetch-pr-context.sh]
  • VC-3: merge commits (parents_count > 1) remain excluded [lib/fetch-pr-context.sh]
  • VC-4: comment + cheap-gate.jq field description state the new rule (blank = agent-side) [lib/cheap-gate.jq]
  • VC-5: post_bot_commits > 0 non-clean arm unchanged (comment-only diff) [lib/cheap-gate.jq]
  • VC-6: is_human/ends_bot are null-safe via ($l|type)=="string" — null/non-string does not abort the filter [lib/fetch-pr-context.sh]
  • VC-7: run.sh test extracts the shipped jq blocks; sed end-markers match the real terminators [lib/test/run.sh]
  • VC-8: _pbc/_pbs supply COMMITS/AUTHOR/DEVFLOW_JQ matching the shipped block's reads [lib/test/run.sh]
  • VC-9: coupled POSTBOT_SHAS applies the byte-identical is_human predicate [lib/fetch-pr-context.sh]
  • VC-10: changeset's "coupled blocks updated" claim matches the actual edits [.changeset/…]
  • VC-11: blank/whitespace/absent/non-string login never classified human (executed falsifying inputs) [lib/fetch-pr-context.sh]
  • VC-12: a tail commit by the PR author itself → 0 (self-exclusion via != $author) [lib/fetch-pr-context.sh]
  • VC-13: coverage-map 1440 owner unmodularized consistent with run.sh-resident tests [lib/test/modules/coverage-map.json]

Code Review Findings

🟠 Important / Major

  1. The new #1440 fixtures never assert a count greater than 1: every _pbc fixture that counts a human tops out at 1 and every _pbs fixture yields a single-element array. The suite therefore proves "≥1 post-bot human ⇒ counted" but not "N humans ⇒ N", and the POSTBOT_SHAS list is only ever exercised at length 1 (SHA multiplicity/ordering unverified). A regression that collapsed the filtered array to a boolean/first-match would stay green. Adding one two-distinct-human fixture asserting 2 (and a matching two-element _pbs list) would close it. The shipped code is correct — this is a coverage-hardening note, not a defect. (raised by 1/5 agents) [suspected over-grade: shape 3 — single-source from pr-test-analyzer, no corroboration and no Phase-2 FAIL; observable fail-direction is a test-coverage gap against a hypothetical future regression, milder than the Important label. Advisory only; does not change the verdict.]

🟡 Suggestion / Minor

  1. The rewritten comment above the POST_BOT_COMMITS block in lib/fetch-pr-context.sh runs ~12 physical lines and carries derivation/rationale (the account-resolution narrative) beyond the specific wrong change it prevents; under the prevention-only comment standard for library source it could be trimmed, with the narrative left to the changeset/overview prose it already duplicates. Accurate, not misleading. (raised by 1/5 agents)
  2. No fixture exercises a human commit before the last bot/PR-author anchor (e.g. [human, bot, human2]), which would pin the slice-boundary [($bot_indices | last)+1:] against an off-by-one. (raised by 1/5 agents)
  3. No fixture places a blank-string login commit between two bot commits ([bot, blank, bot] → expect 0); low value since the anchor select demonstrably ignores blanks. (raised by 1/5 agents)
  4. A genuine human whose API login is blank/null (email not linked to any account, not only the local-tier agent identity) is now classified agent-side and undercounted — intentional and documented ("unknown is not a human"), failing in the safe direction for this cheap-gate trigger. No change required. (raised by 1/5 agents)

over-grade annotation: 1 finding flagged (Important test-coverage note, shape 3 — advisory only).
truthfulness sweep: no finding promoted — every diff-added comment and the DEVFLOW_SYSTEM_OVERVIEW.md prose verified true against HEAD.
intra-diff contradiction scan: no contradiction found.

Verdict Criteria

Threshold: critical (default). No checklist FAIL/INCONCLUSIVE; no self-contradicting-diff finding; no finding at or above critical. Only findings below the threshold are present → APPROVE with notes (rule 6). Full checklist ran (engine_self_modifying profile — no skip); 0 of 5 Phase-3 agents failed.

Notes

  • The change is a focused, correct bugfix. New ends_bot/is_human jq defs type-guard (($l|type)=="string") before every string op, which also fixes a pre-existing latent null-abort in the anchor select (null | endswith would have errored). The coupled POSTBOT_SHAS block, the lib/cheap-gate.jq field description, the block comment, and the overview prose were all updated in lockstep and are mutually consistent. Tests drive the extracted shipped jq bytes rather than a transcribed copy — the right call for this surface.
  • Diagnostic (non-blocking): the final-pass reviewer reported EXTENSION-STATUS: loaded-empty resolved-root=unset for the requesting-code-review extension while the orchestrator resolved a trusted review extension root; recorded as an unestablished hop-two propagation state per the engine's cross-check (local/interactive tier — held in-run, no reflection sink written).

The01Geek and others added 4 commits August 25, 2026 15:44
…k comment (#1440 review)

Addresses the PR #1941 review's Important coverage note and Suggestion 1.

- Adds a four-commit fixture (human before the anchor, human author ON the
  anchor, two distinct humans after it) asserting `2` on POST_BOT_COMMITS and a
  two-element ordered list on POSTBOT_SHAS. Mutation-checked against three
  mutants of a copy of lib/fetch-pr-context.sh: collapsing the filtered tail to
  a boolean (1 instead of 2), dropping the `+1` from the slice (3 instead of 2),
  and truncating POSTBOT_SHAS to its first match (["B"] instead of ["B","C"]).
  Each mutant is caught only by the new rows; the pre-existing #1440 fixtures
  stay green on mutants 1 and 3, which is the gap the review named.
- Trims the POST_BOT_COMMITS block comment from 12 lines to 6 under the
  prevention-only comment standard: the account-resolution narrative, the
  unchanged-anchor note and the trivial-fixup aside move out (the changeset and
  DEVFLOW_SYSTEM_OVERVIEW.md already carry them); the AC4-mandated
  specification statement and both prohibitions stay.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…on guards (review)

Addresses the review-and-fix engine's REJECT driver and its Important/Suggestion findings.

REJECT driver — lib/cheap-gate.jq contract header contradicted its own producer.
The header said the count is of commits "after the last bot push"; the producer
(and lib/fetch-pr-context.sh's sibling comment, written by the same change)
anchors on the last bot-OR-PR-author commit. Reproduced: [claude[bot], alice,
bob] with AUTHOR=alice yields 1 from the shipped block, 2 under the header's
stated rule. The header also read as a claim about the commit while the
predicate is an OR over the two logins; both are restated.

Important — the "extracted cleanly" guards checked the START marker, which the
sed range guarantees present. Replaced with an end-marker check plus a length
ceiling. The end-marker check alone is insufficient: a reindented terminator
makes sed run on to the producer's NEXT identical terminator, so the extraction
still ends in `')"` while carrying 438 extra lines that `bash -c` then executes
with live side effects (read-only-filesystem writes observed). Mutation-checked
against a reindented-terminator copy: the length guard reports overran:438.

Also in this batch:
- Pin the two blocks' coupled ends_bot/is_human defs byte-identical
  (mutation-checked: a one-character edit to the SHAS copy reports differ).
- Fixtures for the PR-author re-anchor ordering and the zero-anchor branch, and
  a shared blank+merge+pre-anchor input asserted on both blocks.
- `unset -f _pbc _pbs`, so a later caller cannot abort the suite under `set -u`.
- Drop the false "(the other rows all set author==committer)" parenthetical and
  the comment implying `!= $author` is regression-covered; it is unreachable.
- Changeset: drop the null-abort over-claim (the producer normalizes an absent
  login to "" before the filter sees it) and state the OR semantics.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…spective skill (review)

The review engine flagged both rows as describing a superset of what
`lib/fetch-pr-context.sh` now emits: `human_postbot_diff` said "commits AFTER
the bot's last commit" with no mention of the merge or human-attribution
filters, and `post_bot_commits` said "Substantive commits by a human" while a
human whose GitHub login is unresolvable is excluded. Both rows now state the
positive-attribution rule and the exclusion set, and both name the real anchor
(the last bot/PR-author commit) rather than "the bot's last commit" — the same
imprecision this branch's REJECT corrected in lib/cheap-gate.jq's header.

The rows ship verbatim into consumer repos, so they cite only files a consumer
has. No test added: agent-executed prompt prose with no tool reader carries no
automated regression coverage by design.

Writing-skills evidence: skill-loaded=yes (superpowers:writing-skills invoked via the Skill tool in a dispatched subagent before the target file was opened); guidance-applied=yes (its token-efficiency and no-redundancy guidance folded a duplicated merge-commit clause into one exclusion list and kept both cells to a single line); pressure-scenario=no (the failure was two reference cells naming a superset, not a rule an agent could be pressured to break, so no scenario applies); micro-tests=no (descriptive schema documentation with no behavior-shaping wording to A/B; correctness was verified directly against the two shipped jq blocks instead).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@prflow-implementer

Copy link
Copy Markdown
Author

/prflow:review

@prflow-reviewer

prflow-reviewer Bot commented Aug 25, 2026

Copy link
Copy Markdown

PRFlow Review — PR #1941

Status: ✅ APPROVE with notes
Diff profile: engine_self_modifying (full checklist; Phase 3 roster gated by applicability)
Run: View run
Reviewed HEAD: bce1ba3
Last updated: Phase 4 finalize

Blueprint

  • Phase 0.5 — diff classified
  • Phase 1/1.5 — checklist generated + deduped
  • Phase 2 — checklist verified
  • Phase 3 — review agents returned
  • Phase 4 — verdict aggregated
  • Terminal — verdict delivered

Verdict: APPROVE with notes (correct, null-safe, well-tested fix; only minor test/comment suggestions)

Issue Compliance

Reviewed against issue #1440: post_bot_commits should not count blank-login (local-tier agent) commits as human rework — criteria from the /prflow:implement workpad comment; scope unchanged. Requirement-based checklist items are included in the verification results below.

Criteria came from the /prflow:implement workpad comment — this run's authoritative set, possibly narrowed from the issue. No divergence between the workpad's criteria and the issue body's.

All five acceptance criteria are satisfied:

  • Blank author_login + blank committer_login tail → post_bot_commits: 0 — the new is_human predicate requires test("[^[:space:]]"), so blanks are dropped from the tail select. ✅
  • Non-blank, non-[bot], non-author login still counted — is_human returns true; both OR arms are exercised. ✅
  • Merge commits (parents_count > 1) excluded — the select((.value.parents_count // 1) <= 1) guard is retained ahead of the new is_human select in both blocks. ✅
  • Comment above the jq block + lib/cheap-gate.jq field description updated, incl. blank-login agent-side classification. ✅
  • lib/cheap-gate.jq's post_bot_commits > 0 non-clean arm unchanged (only the field's doc comment changed; the gate arm at line 145 is untouched). ✅

Verification Checklist Results

12 passed, 0 failed, 0 inconclusive — 1 via lite probe, 11 via agent/direct verification.

✅ Passed items (12 of 12) — click to expand
  • VC-1: blank-login tail reports post_bot_commits 0 [lib/fetch-pr-context.sh]
  • VC-2: non-blank human login still counted [lib/fetch-pr-context.sh]
  • VC-3: merge commits (parents_count>1) excluded [lib/fetch-pr-context.sh]
  • VC-4: cheap-gate.jq description + jq-block comment updated (blank agent-side) [lib/cheap-gate.jq]
  • VC-5: cheap-gate.jq post_bot_commits>0 non-clean arm unchanged [lib/cheap-gate.jq]
  • VC-6: is_human predicate null-safe (type-guards string before endswith/test) [lib/fetch-pr-context.sh]
  • VC-7: whitespace-only logins treated as blank via test("[^[:space:]]") [lib/fetch-pr-context.sh]
  • VC-8: run.sh extracts the SHIPPED jq blocks; sed terminators match head bytes [lib/test/run.sh]
  • VC-9: env-var injection (COMMITS/AUTHOR/DEVFLOW_JQ) drives the shipped block [lib/test/run.sh]
  • VC-10: POSTBOT_SHAS carries byte-identical is_human/ends_bot predicate (coupled pair) [lib/fetch-pr-context.sh]
  • VC-11: coverage-map.json valid JSON; 1440 entry ordered, owner unmodularized [lib/test/modules/coverage-map.json]
  • VC-12: DEVFLOW_SYSTEM_OVERVIEW.md cost-ranking sentence restated correctly [docs/internal/DEVFLOW_SYSTEM_OVERVIEW.md]

Code Review Findings

🟡 Suggestion / Minor

  1. The run.sh test extracts the shipped jq blocks via sed terminators coupled to fetch-pr-context.sh's exact indentation, with no direct guard against silent over-capture; a future indentation change could over-capture. Not a live defect — the value fixtures fail RED on any malformed program — but an end-of-block token assertion (mirroring the existing start-token guard) would make truncation/over-capture name itself. (raised by 1/5 agents)
  2. The added test-header comment block in lib/test/run.sh (7 physical lines) exceeds three lines and is largely behavioral/worked-example narration; only the "extracted … never a transcribed copy" clause is prevention-shaped. Consider trimming to that clause. (raised by 1/5 agents)
  3. The is_human null-safety type-guard is exercised only on the anchor-select path, not on the tail path — the "null login does not abort" fixture places the null/null commit before the bot anchor. A one-row fixture (bot anchor, then null/null commit, then a human) asserting the same count would close it. Low severity: the type guard is shared with the anchor path already under test, and a regression would abort RED rather than silently miscount. (raised by 1/5 agents)

over-grade annotation: no finding flagged
intra-diff contradiction scan: no contradiction found
truthfulness sweep: no finding promoted

Verdict Criteria applied

  • No verification FAIL / INCONCLUSIVE.
  • No review-agent finding at or above the configured threshold (critical).
  • Only Suggestion-level findings present → APPROVE with notes.

Assessment

The change is a correct, tightly-scoped, well-tested fix. The new ends_bot/is_human jq helpers are null-safe (the base version's bare endswith on a null login aborted the whole filter); blank/whitespace logins are correctly classified agent-side; the parents_count merge guard is preserved; and the coupled POSTBOT_SHAS block carries the byte-identical predicate. Tests drive the shipped jq blocks (extracted, not transcribed) with extraction-success guards, and cover both OR arms, multiplicity, slice boundary, self-exclusion, and null non-abort. Documentation edits (changeset, cheap-gate.jq header, DEVFLOW_SYSTEM_OVERVIEW.md) are accurate against HEAD — no documented falsehood. CI is green for the reviewed commit (lib + python tests, lint, and all shards success). All five specialist reviewers and the final pass corroborate. The three Suggestions are optional polish and do not gate merge.

@prflow-reviewer prflow-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE with notes — full report in PR comment

The complete review report (checklist results, findings, details) is in the
PRFlow Review progress comment on this PR.

The01Geek and others added 2 commits August 25, 2026 16:38
…claims the fix added

Fix-delta gate findings on the previous commit — the same documented-falsehood
class as the REJECT that commit was fixing.

- lib/test/run.sh: "ceilings on blocks of 18 and 21 lines" was false; both
  blocks are 18 lines.
- lib/test/run.sh: the `unset -f` rationale was the opposite of the truth. Under
  `set -u` an unbound deref inside `$( )` exits only the command-substitution
  subshell, so a later caller fails one row rather than aborting the suite. All
  18 call sites are inside `$( )`. Reason restated; `unset -f` kept as hygiene.
- lib/test/run.sh: the coupled defs are not byte-identical — they differ by
  indentation, which the comparison strips. Now says so.
- skills/retrospective/SKILL.md: "the same set post_bot_commits counts"
  overclaimed; the per-commit patch fetch is best-effort, so the delivered diff
  can be a proper subset and is null when no patch is available.

The gate also showed the guards only REPORTED a bad extraction. On a drifted
terminator all 18 fixture rows still ran 439 lines of the producer for real
(observed: "/gh-checkruns.err: Read-only file system"). The block now classifies
each extraction (empty-extraction / terminator-drift / overran:N) and blanks the
program to `:` before `_pbc`/`_pbs` are defined, so a bad extraction fails RED
with a named cause and executes nothing. Verified against a reindented-terminator
copy: overran:438, blanked, no side effects; and against the real file: ok, 1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@prflow-implementer

Copy link
Copy Markdown
Author

/prflow:review

@The01Geek
The01Geek enabled auto-merge August 25, 2026 22:57
@The01Geek
The01Geek merged commit ed7a931 into main Aug 25, 2026
8 checks passed
@The01Geek
The01Geek deleted the issue-1440-post-bot-commits-counts-local-tier-agent-commits branch August 25, 2026 22:57
@github-actions

Copy link
Copy Markdown
Contributor

PRFlow Review — PR #1941

Status: ❌ Review failed

Review run failed: claude step cancelled — https://github.com/The01Geek/prflow/actions/runs/32908025809

@github-actions

Copy link
Copy Markdown
Contributor

PRFlow review: no verdict-post receipt was found for this run.

  • Actions run id: 32908025809
  • Pull-request head SHA this step resolved: 079e727d38e419039ec8ded7721e6d124bf321fe

No run-scoped verdict-post receipt was found for this run: either Phase 4.4's
verdict emitter did not run, or it ran and could not write its receipt (look for a
could not write the verdict-post receipt breadcrumb in the job log).

No review authored by this run's reviewer identity is recorded in the reviews
API for the head above, so this run left the reviews API and reviewDecision untouched.
It recorded no verdict anywhere.

Any verdict text this run published OUTSIDE the emitter carries no producer-emitted verdict marker,
and the verdict-derivation consumers do not read it as a verdict.

This comment is a record of that gap. It is not a verdict, and it neither approves nor
rejects this pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

post_bot_commits counts local-tier agent commits as human rework

1 participant