Skip to content

Gate CI on durable PM tracker health with pm 2026.8.6 - #56

Merged
unbraind merged 9 commits into
mainfrom
ci-merge-safety-gate
Aug 7, 2026
Merged

Gate CI on durable PM tracker health with pm 2026.8.6#56
unbraind merged 9 commits into
mainfrom
ci-merge-safety-gate

Conversation

@unbraind

@unbraind unbraind commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Outcome

  • Runs pm health --strict-exit in CI for durable, checkout-visible tracker failures.
  • States the boundary explicitly: clone-local merge receipts are not a lossless CI attestation; pm-cli #921 and #922 track the missing durable proof.
  • Refreshes npm lockfiles so the gate executes with @unbrained/pm-cli 2026.8.6 and pm-changelog 2026.8.6.
  • Reconciles the concurrent correction through pm merge reconcile, preserves both agents' notes, refreshes the 2026.8.6 merge fence, and regenerates the package-owned changelog.

PM evidence

Verification

  • npm ci --ignore-scripts
  • npm run release:check
  • pm health --strict-exit
  • npm run changelog:check
  • current tracked files and source history scanned for credential-shaped material

Add a 'Verify pm project integrity and merge safety' step to ci.yml
immediately after Install dependencies. It runs
./node_modules/.bin/pm health --strict-exit.

This closes a hole in multi-agent branch merging: when two agents edit the
same scalar field of one item on two branches, the field-aware merge driver
picks a winner and records the loser in a clone-local receipt. The resulting
.toon has no conflict markers and already holds the winning value, so the
naive resolution idiom (git add the marker-free file, commit) succeeds and
the peer edit is gone with no trace in any pushed artifact.

pm validate returns ok:true on that corrupted result because the file is
valid TOON. Only pm health goes red, via integrity.counts.pending_merge_decisions,
naming the affected items in pending_merge_decision_items. --strict-exit is
load-bearing because a bare pm health exits 0 even when ok:false.

Verified green on this repo and proven to exit 1 on the hazard in a
throwaway copy.

@sourcery-ai sourcery-ai 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.

Sorry @unbraind, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@unbraind, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 49 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3ab5e15b-939b-440d-8a18-f832bb73a894

📥 Commits

Reviewing files that changed from the base of the PR and between a29475a and fbd8299.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (7)
  • .agents/pm/chores/pm-graph-9qk5.toon
  • .agents/pm/history/pm-graph-9qk5.jsonl
  • .agents/pm/history/pm-graph-y2ax.jsonl
  • .agents/pm/issues/pm-graph-y2ax.toon
  • .github/workflows/ci.yml
  • CHANGELOG.md
  • package.json

Summary by CodeRabbit

  • Bug Fixes

    • Added CI validation that detects tracked project-health issues and fails checks when problems are found.
    • Improved release and changelog validation to ensure changes are reconciled before release checks.
  • Documentation

    • Added unreleased changelog entries describing project-health and release-gate updates.
    • Documented verification results and limitations for fresh CI environments.
  • Chores

    • Updated project-management tooling dependencies to version ^2026.8.6.

Walkthrough

The PR adds a strict PM health gate to CI, updates PM development dependencies, documents fresh-clone receipt limits, and records release reconciliation results in PM metadata and the changelog.

Changes

CI health gate

Layer / File(s) Summary
CI health-check workflow
.github/workflows/ci.yml, package.json, CHANGELOG.md
CI runs pm health --strict-exit. PM tooling versions change to ^2026.8.6. The changelog records the strict health gate.
Task and health-gate records
.agents/pm/chores/pm-graph-9qk5.toon, .agents/pm/history/pm-graph-9qk5.jsonl
PM records define the tracked-health scope, verification commands, fresh-clone receipt limitation, and upstream issue references.
Release reconciliation records
.agents/pm/issues/pm-graph-y2ax.toon, .agents/pm/history/pm-graph-y2ax.jsonl, CHANGELOG.md
PM records and the changelog document same-day release reconciliation, release checks, test results, and closure metadata.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related issues

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the primary change: gating CI on durable PM tracker health with the specified tool version.
Description check ✅ Passed The description directly explains the CI gate, version updates, limitations, reconciliation work, and verification steps.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci-merge-safety-gate

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

Adds a pm health-based integrity gate to CI to prevent silently dropped peer edits from merging, and records the change in project metadata (changelog and pm chore/history items).

Flow diagram for new pm health CI gate

flowchart TB
  A[Checkout repository] --> B[Install dependencies: npm ci]
  B --> C[Verify pm project integrity: pm health --strict-exit]
  C -->|exit 0| D[Type check: npm run typecheck]
  C -->|exit 1| E[Fail CI job]
Loading

File-Level Changes

Change Details Files
Add a pm health integrity/merge-safety gate to the CI workflow after dependency installation.
  • Introduce a new CI step named Verify pm project integrity and merge safety that runs in bash.
  • Run ./node_modules/.bin/pm health --strict-exit with set -euo pipefail to fail the job when pm reports pending merge decisions or other health issues.
  • Document in inline comments why pm validate is not used and why --strict-exit is required, as well as the expected behavior on fresh runner checkouts without merge drivers.
.github/workflows/ci.yml
Document the new CI gate in release notes and pm chore/history tracking artifacts.
  • Add an "Other" changelog entry describing that CI is now gated on pm health to prevent silently discarded peer edits from merging.
  • Create a new pm chore item describing this change and add its corresponding history entry for tracking within the pm system.
CHANGELOG.md
.agents/pm/chores/pm-graph-9qk5.toon
.agents/pm/history/pm-graph-9qk5.jsonl

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@greptile-apps

greptile-apps Bot commented Aug 6, 2026

Copy link
Copy Markdown

Greptile Summary

The PR adds a strict, time-bounded PM tracker-health check to CI while explicitly documenting that fresh checkouts cannot attest clone-local merge receipts.

  • Runs pm health --strict-exit after dependency installation.
  • Updates PM tooling and lockfile entries to version 2026.8.6.
  • Reconciles tracker history and regenerates the package-owned changelog.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
.github/workflows/ci.yml Adds a 120-second strict PM health gate and accurately limits its stated guarantees to durable, checkout-visible state.
package.json Updates PM CLI and changelog development dependency ranges to 2026.8.6.
package-lock.json Pins the updated PM tools and their transitive dependencies with registry integrity hashes.
CHANGELOG.md Regenerates the Unreleased section from the reconciled tracker state.

Reviews (8): Last reviewed commit: "fix(ci): enforce PM health timeout and c..." | Re-trigger Greptile

Comment thread .github/workflows/ci.yml Outdated

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 44-56: Update the CI merge-safety gate around pm health
--strict-exit so it verifies persisted evidence of discarded peer edits, not
only the marker-free .toon result. Persist a privacy-safe pending-decision
marker into the committed checkout or execute verification in the merge clone
containing the receipt, and add a regression that commits the marker-free result
then runs the gate from a fresh checkout.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 41828243-45b5-4cf5-a439-f1fd32edb319

📥 Commits

Reviewing files that changed from the base of the PR and between a29475a and a35d692.

📒 Files selected for processing (4)
  • .agents/pm/chores/pm-graph-9qk5.toon
  • .agents/pm/history/pm-graph-9qk5.jsonl
  • .github/workflows/ci.yml
  • CHANGELOG.md

Comment thread .github/workflows/ci.yml Outdated
The step and its tracker item both said this gate blocks a merge that silently
discarded a peer agent's edit. Verified today that it does not, and cannot as built:
merge-decision receipts live in .agents/pm/runtime/, which pm init gitignores, so they
are never pushed. On the same commit, the merge-performing clone reports one receipt and
exits 1, while a fresh clone - which is what CI checks out - reports zero and exits 0.

The pushed history does not disambiguate it either. Both writes are present in timestamp
order and the item matches the latest, so history verification reports ok. Filed upstream
as unbraind/pm-cli#922; flagged first by Greptile on every PR in this rollout.

The step is kept, because what it does catch is real and CI-observable: conflict markers
in item and history files, parse failures, invalid history JSON, hash drift,
unknown-author events, stale in-progress work and tracked runtime cache files. Only the
overstated claim is removed. A gate whose documentation promises more than it delivers is
worse than no gate, because it stops people looking for the hazard it does not cover.
@unbraind unbraind changed the title Gate CI on pm health so a silently discarded peer edit cannot merge Gate CI on pm health for tracker integrity Aug 6, 2026
@unbraind

unbraind commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Correction pushed — re-review please.

@coderabbitai full review
@greptileai

Greptile's P1 was correct and is the reason for this push. The gate does not detect a
silently discarded peer edit, and cannot as built: merge-decision receipts live in the
gitignored .agents/pm/runtime/, so a fresh CI checkout has none. Verified on the same
commit — merge clone exits 1, fresh clone exits 0. Filed upstream as
pm-cli#922.

What changed: the overstated claim was removed everywhere it appeared — the step name
(now "Verify pm tracker integrity"), its comment, the tracker item, and this PR's title
and body. The step itself is kept for what it genuinely catches in a fresh checkout.

What is worth checking this round:

  • Does the new comment now describe the gate accurately, without under- or
    over-claiming? It deliberately spells out what the step does not cover; if any part of
    that reads as still too confident, say so.
  • Is --strict-exit genuinely sufficient to make the step fail on the conditions listed,
    or is there a health condition that reports warn without flipping ok and therefore
    passes silently?
  • Anything else in this repo where a check's evidence lives in gitignored or clone-local
    state — that is the general pattern behind the P1 and it would be valuable to know if it
    appears elsewhere.

GitHub Actions is under a critical outage, so the checks here are absent for external
reasons; pm health --strict-exit and the full release:check were run locally.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@unbraind have exceeded the limit for the number of chat messages per hour. Please wait 17 minutes and 6 seconds before sending another message.

@unbraind unbraind changed the title Gate CI on pm health for tracker integrity Gate CI on durable PM tracker health with pm 2026.8.6 Aug 6, 2026
@unbraind

unbraind commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Fresh exact-head review requested for e087f05bf38d2ab95d11006f278cb77122477176 after reconciling the concurrent correction, updating to pm CLI/SDK 2026.8.6, and rerunning package gates.

@greptileai
/gemini review
@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

@unbraind I will perform a full review of the PR at commit e087f05bf38d2ab95d11006f278cb77122477176.

⚠️ Action not completed

Review rate limited.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 58 minutes.

@unbraind

unbraind commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Exact-head disposition for b1eeb3ed0445c81d61db61ef4a76f1c1b5d18d79:

  • accepted and fixed the attribution overclaim;
  • added stale in-progress work to the documented failing conditions;
  • linked the workflow and changelog on the canonical PM item;
  • distinguished pm-cli #921 (repair bypass) from #922 (directly green fresh-clone shape);
  • reran pm health --strict-exit and changelog:check (plus pm-vcs self-host verification where applicable).

Every inline bot finding has been reacted to and answered in-thread. CodeRabbit rate-limit messages are recorded as review limitations, not approvals.

@greptileai
/gemini review
@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@unbraind have exceeded the limit for the number of chat messages per hour. Please wait 13 minutes and 28 seconds before sending another message.

@unbraind

unbraind commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

The exact Actions failure was reproduced and fixed by reconciling the feature branch with the same-day 2026.8.6 release, then regenerating the package-owned changelog against the real merge topology. The full local release gate passes. Please review the new exact head.\n\n@greptileai\n/gemini review\n@coderabbitai full review\n@sourcery-ai review

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@unbraind have exceeded the limit for the number of chat messages per hour. Please wait 3 minutes and 47 seconds before sending another message.

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/pm/chores/pm-graph-9qk5.toon:
- Around line 30-32: Update the CI workflow’s health-check execution to enforce
the 120-second limit recorded for `pm health --strict-exit`, using a command
timeout or dedicated job limit. If the workflow intentionally does not enforce
this bound, revise the record to clearly state that `timeout_seconds` applies
only to the recorded verification run.

In @.agents/pm/history/pm-graph-y2ax.jsonl:
- Line 7: Align the pm-graph-y2ax tracker records with the pending exact-head
Node 22/26 Actions acceptance: in .agents/pm/history/pm-graph-y2ax.jsonl lines
7-7 and .agents/pm/issues/pm-graph-y2ax.toon lines 5-5, apply the appropriate
corrective transition from closed if closure was premature, and retain or
restore the closed state only after both required Actions jobs pass.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 94c4135d-a520-4a98-a248-9748de58dc57

📥 Commits

Reviewing files that changed from the base of the PR and between e087f05 and 23c9e2c.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (7)
  • .agents/pm/chores/pm-graph-9qk5.toon
  • .agents/pm/history/pm-graph-9qk5.jsonl
  • .agents/pm/history/pm-graph-y2ax.jsonl
  • .agents/pm/issues/pm-graph-y2ax.toon
  • .github/workflows/ci.yml
  • CHANGELOG.md
  • package.json

Comment thread .agents/pm/chores/pm-graph-9qk5.toon
Comment thread .agents/pm/history/pm-graph-y2ax.jsonl
@unbraind

unbraind commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Both fresh-review findings are fixed in fbd8299: CI enforces the recorded PM health timeout, and the reconciliation item now contains exact successful Actions evidence for both Node jobs. The full local release gate passes. Please review the new exact head.\n\n@greptileai\n/gemini review\n@coderabbitai full review\n@sourcery-ai review

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== HEAD ==='
git rev-parse HEAD
git status --short
echo

echo '=== Merge base and changed files ==='
base="$(git merge-base HEAD origin/main)"
printf 'merge-base: %s\n' "$base"
git diff --stat "$base"...HEAD
git diff --name-status "$base"...HEAD
echo

echo '=== Workflow outline and relevant content ==='
ast-grep outline .github/workflows/ci.yml --items all || true
nl -ba .github/workflows/ci.yml | sed -n '1,280p'
echo

echo '=== package.json relevant sections ==='
node -e 'const p=require("./package.json"); console.log(JSON.stringify({scripts:p.scripts,devDependencies:Object.fromEntries(Object.entries(p.devDependencies||{}).filter(([k])=>k==="`@unbrained/pm-cli`"||k==="pm-changelog"))},null,2))' 2>/dev/null || \
  rg -n -C3 '"(`@unbrained/pm-cli`|pm-changelog|release:check|changelog:check)"' package.json
echo

echo '=== Changed PM records ==='
for f in $(git diff --name-only "$base"...HEAD | rg '^\.agents/pm/(issues|chores|history)/'); do
  echo "--- $f ---"
  nl -ba "$f" | sed -n '1,260p'
done
echo

echo '=== Lockfile versions and changed lockfiles ==='
git diff --name-only "$base"...HEAD | rg '(^|/)(package-lock\.json|npm-shrinkwrap\.json)$' || true
rg -n -C2 '"(`@unbrained/pm-cli`|pm-changelog)"' package-lock.json npm-shrinkwrap.json 2>/dev/null || true
echo

echo '=== All health invocations and timeout configuration ==='
rg -n -C4 --glob '!node_modules/**' '(pm health|strict-exit|timeout)' .github package.json .agents 2>/dev/null || true

Length of output: 2817


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base="$(git merge-base HEAD origin/main)"

echo '=== Complete PR patch ==='
git diff --no-ext-diff --unified=80 "$base"...HEAD -- \
  .github/workflows/ci.yml \
  package.json \
  package-lock.json \
  CHANGELOG.md \
  .agents/pm/chores/pm-graph-9qk5.toon \
  .agents/pm/history/pm-graph-9qk5.jsonl \
  .agents/pm/history/pm-graph-y2ax.jsonl \
  .agents/pm/issues/pm-graph-y2ax.toon
echo

echo '=== Current CI workflow ==='
sed -n '1,320p' .github/workflows/ci.yml
echo

echo '=== Current package manifest: relevant keys ==='
sed -n '/"scripts"[[:space:]]*:/,/"dependencies"[[:space:]]*:/p' package.json
sed -n '/"devDependencies"[[:space:]]*:/,/^[[:space:]]*}/p' package.json
echo

echo '=== PM record contents ==='
for f in .agents/pm/chores/pm-graph-9qk5.toon \
         .agents/pm/history/pm-graph-9qk5.jsonl \
         .agents/pm/history/pm-graph-y2ax.jsonl \
         .agents/pm/issues/pm-graph-y2ax.toon; do
  echo "--- $f ---"
  sed -n '1,320p' "$f"
done
echo

echo '=== Lockfile package entries ==='
rg -n -A20 -B3 '"node_modules/(`@unbrained/pm-cli`|pm-changelog)"' package-lock.json || true
echo

echo '=== Exact-head GitHub check runs ==='
gh api "repos/unbraind/pm-graph/commits/$(git rev-parse HEAD)/check-runs" \
  -H 'Accept: application/vnd.github+json' \
  --jq '.check_runs[] | [.name, .status, .conclusion, .details_url] | `@tsv`' || true

Length of output: 136595


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Diff whitespace check ==='
git diff --check "$(git merge-base HEAD origin/main)"...HEAD
echo 'PASS'
echo

echo '=== JSON syntax checks for changed JSON files ==='
python3 - <<'PY'
import json
for path in [
    "package.json",
    "package-lock.json",
    ".agents/pm/history/pm-graph-9qk5.jsonl",
    ".agents/pm/history/pm-graph-y2ax.jsonl",
]:
    with open(path, encoding="utf-8") as f:
        if path.endswith(".jsonl"):
            for lineno, line in enumerate(f, 1):
                json.loads(line)
        else:
            json.load(f)
    print(f"valid: {path}")
PY
echo

echo '=== PM runtime ignore and tracked-state checks ==='
rg -n -C3 '\.agents/pm/runtime|runtime/' .gitignore .git/info/exclude 2>/dev/null || true
git check-ignore -v .agents/pm/runtime/example-receipt.json || true
git ls-files .agents/pm/runtime
echo

echo '=== Health-gate and timeout references in tracked configuration ==='
rg -n -C3 --glob '!package-lock.json' \
  '(pm health|strict-exit|timeout_seconds|--kill-after|120s)' \
  .github .agents package.json README.md 2>/dev/null || true
echo

echo '=== Changed-file status and credential-pattern scan ==='
git status --short
git diff --no-ext-diff --unified=0 "$(git merge-base HEAD origin/main)"...HEAD | \
  rg -n -i '(^\+.*(api[_-]?key|secret|password|token)[[:space:]]*[:=]|ghp_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,})' || true
echo

echo '=== Current exact-head workflow run ==='
gh run view 31132827759 --repo unbraind/pm-graph --json status,conclusion,headSha,jobs \
  --jq '{status, conclusion, headSha, jobs: [.jobs[] | {name, status, conclusion}]}' || true

Length of output: 74388


@unbraind Static review of fbd8299e2f07f6371f5336b010a283f88b9c6de3 found no new findings.

The health gate now enforces the recorded 120-second limit with a 10-second kill grace period. The workflow wording correctly limits the gate to durable checkout-visible state. The gitignore rule confirms that .agents/pm/runtime/ receipts are absent from fresh CI checkouts.

The package manifest and lockfile consistently use @unbrained/pm-cli and pm-changelog 2026.8.6. JSON and JSONL validation passed. The diff has no whitespace errors or credential-shaped additions.

Exact-head CI verification remains pending. Actions run 31132827759 is still in progress for Node 22 and Node 26. Please retry review after those jobs complete if you need CI-result verification.

⚠️ Action not completed

Review rate limited.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 49 minutes.

@unbraind
unbraind merged commit f1779ba into main Aug 7, 2026
9 checks passed
@unbraind
unbraind deleted the ci-merge-safety-gate branch August 7, 2026 00:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant