chore(deps): synchronize FastAPI and Redis backend locks - #725
chore(deps): synchronize FastAPI and Redis backend locks#725seonghobae wants to merge 25 commits into
Conversation
Updates the requirements on [fastapi](https://github.com/fastapi/fastapi) to permit the latest version. - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](fastapi/fastapi@0.137.1...0.141.1) --- updated-dependencies: - dependency-name: fastapi dependency-version: 0.141.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
|
Warning Review limit reached
Next review available in: 42 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the 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. 📝 WalkthroughWalkthroughFastAPI 최소 버전을 Changes의존성 버전 동기화
Estimated code review effort: 1 (Trivial) | ~5 minutes Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
@opencode-agent @cwl-noema-review Please independently review exact current head |
|
@opencode-agent Please review exact head |
|
@cwl-noema-review Please independently review exact head |
|
@opencode-agent @cwl-noema-review Please independently review exact current head |
|
@opencode-agent @cwl-noema-review Please independently review exact current head @coderabbitai review |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='056ff195c014ff24c4a09519b76fd1597130ee92'
printf '%s\n' '== Checked-out commit =='
git rev-parse HEAD
git show -s --format='%H%n%P%n%s' HEAD
test "$(git rev-parse HEAD)" = "$expected"
printf '%s\n' '== Exact-commit changed files and summary =='
git diff-tree --no-commit-id --name-status -r "$expected"
git diff --stat "${expected}^" "$expected"
git diff --check "${expected}^" "$expected"
printf '%s\n' '== Candidate dependency, changelog, and workflow files =='
fd -HI -t f -E .git \
-e in -e txt -e toml -e lock -e md -e yml -e yaml \
| rg -i '(^|/)(requirements|.*requirements.*|pyproject|poetry\.lock|uv\.lock|changelog|.*workflow.*|.*depend.*)(\.|$)' \
|| true
printf '%s\n' '== FastAPI / Redis declarations and lock entries =='
rg -n -i -C 3 '^\s*(fastapi|redis)(\[.*\])?\s*(==|>=|~=|<=|>|<)' \
-g '*.in' -g '*.txt' -g 'pyproject.toml' -g '*.lock' . || true
printf '%s\n' '== Requirement lock entry structure =='
for f in $(fd -HI -t f -E .git -e txt -e lock | xargs -r rg -l '^\s*(fastapi|redis)(\[.*\])?\s*==' || true); do
echo "--- $f"
rg -n -A 12 -B 1 '^\s*(fastapi|redis)(\[.*\])?\s*==' "$f"
done
printf '%s\n' '== Lines without a hash in hash-locked requirement files =='
for f in $(fd -HI -t f -E .git -e txt -e lock | xargs -r rg -l -- '--hash=sha256:' || true); do
echo "--- $f"
awk '
/^[[:space:]]*$/ || /^[[:space:]]*`#/` { next }
/^[[:space:]]*--/ { next }
/^[[:space:]]+--hash=sha256:[0-9a-f]{64}[[:space:]]*$/ { next }
{ print FNR ":" $0 }
' "$f"
done
printf '%s\n' '== Full diff =='
git diff --find-renames --find-copies "${expected}^" "$expected"
printf '%s\n' '== GitHub check runs for the exact commit =='
gh api "repos/ContextualWisdomLab/pg-erd-cloud/commits/${expected}/check-runs?per_page=100" \
--jq '.check_runs[] | [.name, .status, .conclusion, .details_url] | `@tsv`' \
|| trueLength of output: 19432 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
pr='725'
head='056ff195c014ff24c4a09519b76fd1597130ee92'
printf '%s\n' '== Pull request metadata =='
gh pr view "$pr" --repo "$repo" \
--json number,state,isDraft,baseRefName,baseRefOid,headRefName,headRefOid,mergeCommit,changedFiles,additions,deletions \
--jq '.'
base=$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')
printf 'BASE=%s\nHEAD=%s\n' "$base" "$head"
test "$(git rev-parse HEAD)" = "$head"
printf '%s\n' '== Full PR changed files =='
git diff --name-status "${base}...${head}"
git diff --stat "${base}...${head}"
git diff --check "${base}...${head}"
printf '%s\n' '== Dependency declarations in backend/pyproject.toml =='
ast-grep outline backend/pyproject.toml --items all || true
rg -n -i -C 5 'fastapi|redis|dependencies|optional-dependencies|dependency-groups' backend/pyproject.toml
printf '%s\n' '== Relevant CHANGELOG.md entries =='
rg -n -i -C 4 'fastapi|redis|0\.141\.1|8\.1\.0|dependenc' CHANGELOG.md
printf '%s\n' '== Full PR diff: backend declarations, locks, changelog, and automation =='
git diff --find-renames "${base}...${head}" -- \
backend/pyproject.toml backend/requirements.lock backend/requirements-dev.lock \
CHANGELOG.md .github
printf '%s\n' '== Block-aware hash-lock validation and production/dev closure comparison =='
python3 - <<'PY'
from pathlib import Path
import re
from collections import OrderedDict
files = [Path("backend/requirements.lock"), Path("backend/requirements-dev.lock")]
header = re.compile(r'^([A-Za-z0-9_.-]+)(?:\[[^]]+\])?==([^\s\\]+)\s*(\\)?\s*$')
hashline = re.compile(r'^\s*--hash=sha256:([0-9a-f]{64})\s*(\\)?\s*$')
def parse(path):
entries = OrderedDict()
current = None
errors = []
for lineno, line in enumerate(path.read_text().splitlines(), 1):
match = header.match(line)
if match:
if current:
name, data = current
if not data["hashes"]:
errors.append(f"{name} has no hash")
entries[name] = data
current = (match.group(1).lower().replace("_", "-"), {"version": match.group(2), "hashes": []})
continue
if current and hashline.match(line):
current[1]["hashes"].append(hashline.match(line).group(1))
continue
if current and line and not line.startswith((" ", "#")):
errors.append(f"line {lineno}: unexpected line in {current[0]} block: {line}")
if current:
name, data = current
if not data["hashes"]:
errors.append(f"{name} has no hash")
entries[name] = data
return entries, errors
parsed = {}
for file in files:
entries, errors = parse(file)
parsed[file.name] = entries
print(f"{file}: packages={len(entries)}, packages_without_hashes={sum(not x['hashes'] for x in entries.values())}, parser_errors={len(errors)}")
for error in errors:
print("ERROR", error)
prod, dev = parsed["requirements.lock"], parsed["requirements-dev.lock"]
missing = sorted(set(prod) - set(dev))
mismatched = sorted(
name for name in set(prod) & set(dev)
if prod[name]["version"] != dev[name]["version"] or set(prod[name]["hashes"]) != set(dev[name]["hashes"])
)
print(f"production_missing_from_development={missing}")
print(f"production_development_mismatches={mismatched}")
for name in ("fastapi", "redis"):
print(f"{name}: prod={prod.get(name)} dev={dev.get(name)}")
PY
printf '%s\n' '== Potential one-shot or repair artifacts added by the full PR =='
git diff --name-only --diff-filter=A "${base}...${head}" | rg -i 'repair|one[-_ ]?shot|lock|depend|workflow|script|artifact' || true
printf '%s\n' '== All full-PR changed paths =='
git diff --name-only "${base}...${head}"Length of output: 12650 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
sha='056ff195c014ff24c4a09519b76fd1597130ee92'
run='30878504812'
printf '%s\n' '== CI commands that enforce backend dependency and test validation =='
rg -n -i -C 5 -- '--require-hashes|requirements(-dev)?\.lock|mypy|pytest|coverage' \
.github/workflows/ci.yml .github/workflows/codeql-backfill.yml || true
printf '%s\n' '== Exact-head backend workflow job steps =='
gh api "repos/${repo}/actions/runs/${run}/jobs?per_page=100" \
--jq '.jobs[] | select(.name == "backend") | {name,conclusion,head_sha,started_at,completed_at,steps: [.steps[] | {name,conclusion,number}]}' \
|| true
printf '%s\n' '== Exact-head backend job log lines for required commands =='
gh run view "$run" --repo "$repo" --log 2>/dev/null \
| rg -n -i -C 2 -- 'pip .*--require-hashes|--require-hashes.*requirements|mypy|pytest|100%|coverage' \
|| true
printf '%s\n' '== PR review-thread status =='
gh api graphql \
-F owner='ContextualWisdomLab' \
-F name='pg-erd-cloud' \
-F number=725 \
-f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes { isResolved isOutdated comments(first: 1) { nodes { author { login } body } } }
}
}
}
}' \
--jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | {outdated: .isOutdated, author: .comments.nodes[0].author.login, body: .comments.nodes[0].body}]'Length of output: 15247 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
run='30878504821'
printf '%s\n' '== Exact-head coverage-evidence job steps =='
gh api "repos/${repo}/actions/runs/${run}/jobs?per_page=100" \
--jq '.jobs[] | select(.name == "coverage-evidence") | {name,conclusion,head_sha,steps: [.steps[] | {name,conclusion,number}]}' \
|| true
printf '%s\n' '== Exact-head coverage evidence =='
gh run view "$run" --repo "$repo" --log 2>/dev/null \
| rg -n -i -C 3 -- 'coverage|100%|TOTAL|pytest|passed|threshold' \
|| true
printf '%s\n' '== Repository coverage configuration =='
rg -n -i -C 4 -- 'fail_under|fail-under|coverage|cov-fail-under|100' \
backend/pyproject.toml backend/.coveragerc .github/workflows/ci.yml 2>/dev/null || trueLength of output: 2808
I cannot approve under the requested condition because 100% coverage is not verifiable from this head. The successful You are interacting with an AI system. |
Pull request was converted to draft
There was a problem hiding this comment.
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 `@CHANGELOG.md`:
- Line 4: Update the CHANGELOG entry for FastAPI/Redis runtime synchronization
to remove the claim that drift is prevented by the current checks, or add an
explicit CI check that compares pyproject.toml with both lockfiles. If no
synchronization check is implemented, state only that locked installation, mypy,
and the full backend test suite are run.
🪄 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: CHILL
Plan: Pro Plus
Run ID: 37e0d730-424d-40b5-8c73-8f75f82b294d
⛔ Files ignored due to path filters (2)
backend/requirements-dev.lockis excluded by!**/*.lockbackend/requirements.lockis excluded by!**/*.lock
📒 Files selected for processing (2)
CHANGELOG.mdbackend/pyproject.toml
|
@opencode-agent @cwl-noema-review Please independently review exact current head |
|
@coderabbitai review @opencode-agent @cwl-noema-review Please independently review exact current head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
pr='725'
expected='1db057eedc5367d725097fac423a4048b7fbabb7'
printf '%s\n' '== Exact checked-out head =='
git rev-parse HEAD
git show -s --format='commit=%H%nparents=%P%nsubject=%s' HEAD
test "$(git rev-parse HEAD)" = "$expected"
printf '%s\n' '== Pull request metadata and exact full-PR diff =='
gh pr view "$pr" --repo "$repo" \
--json state,isDraft,baseRefOid,headRefOid,changedFiles,additions,deletions \
--jq '.'
base="$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')"
test "$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')" = "$expected"
git diff --name-status "${base}...${expected}"
git diff --check "${base}...${expected}"
git diff --find-renames "${base}...${expected}" -- \
CHANGELOG.md backend/pyproject.toml backend/requirements.lock backend/requirements-dev.lock .github
printf '%s\n' '== Declarations and changelog =='
ast-grep outline backend/pyproject.toml --items all || true
rg -n -i -C 4 '(^|["'\''])(fastapi|redis)(\[.*\])?\s*(>=|==)|fastapi|redis|0\.141\.1|8\.1\.0' \
backend/pyproject.toml CHANGELOG.md
printf '%s\n' '== Hash-lock integrity and closure synchronization =='
python3 - <<'PY'
from pathlib import Path
from collections import OrderedDict
import re, sys
paths = (Path("backend/requirements.lock"), Path("backend/requirements-dev.lock"))
header = re.compile(r'^([A-Za-z0-9_.-]+)(?:\[[^]]+\])?==([^\s\\]+)\s*(?:\\)?\s*$')
hash_line = re.compile(r'^\s*--hash=sha256:([0-9a-f]{64})\s*(?:\\)?\s*$')
def parse(path):
entries, errors, current = OrderedDict(), [], None
for number, line in enumerate(path.read_text().splitlines(), 1):
match = header.match(line)
if match:
if current:
name, item = current
if not item["hashes"]:
errors.append(f"{path}:{number - 1}: {name} has no hashes")
entries[name] = item
current = (match.group(1).lower().replace("_", "-"),
{"version": match.group(2), "hashes": []})
elif current and hash_line.match(line):
current[1]["hashes"].append(hash_line.match(line).group(1))
elif current and line.strip() and not line.lstrip().startswith("#"):
errors.append(f"{path}:{number}: unexpected entry content: {line}")
if current:
name, item = current
if not item["hashes"]:
errors.append(f"{path}:EOF: {name} has no hashes")
entries[name] = item
return entries, errors
locks = {}
for path in paths:
entries, errors = parse(path)
locks[path.name] = entries
print(f"{path}: entries={len(entries)} entries_without_hashes={sum(not x['hashes'] for x in entries.values())} errors={len(errors)}")
for error in errors:
print(f"ERROR {error}")
prod, dev = locks["requirements.lock"], locks["requirements-dev.lock"]
print("production_missing_from_development=", sorted(set(prod) - set(dev)))
print("production_development_mismatches=", sorted(
name for name in set(prod) & set(dev)
if prod[name]["version"] != dev[name]["version"] or set(prod[name]["hashes"]) != set(dev[name]["hashes"])
))
for name in ("fastapi", "redis"):
print(f"{name}: production={prod.get(name)} development={dev.get(name)}")
if any(not item["hashes"] for entries in locks.values() for item in entries.values()):
sys.exit(1)
PY
printf '%s\n' '== Changed paths that can affect runtime, credentials, or one-shot automation =='
git diff --name-status "${base}...${expected}" -- .github backend \
| rg -i 'credential|secret|token|review|workflow|action|script|repair|one[-_ ]?shot|docker|runtime|requirements|pyproject' || true
printf '%s\n' '== Exact-head checks and workflow command evidence =='
gh api "repos/${repo}/commits/${expected}/check-runs?per_page=100" \
--jq '.check_runs[] | [.name,.status,.conclusion,.details_url] | `@tsv`'
rg -n -i -C 4 -- '--require-hashes|requirements(-dev)?\.lock|mypy|pytest|coverage|token|secret|credential' \
.github/workflows backend/pyproject.toml 2>/dev/null || true
printf '%s\n' '== Unresolved review threads =='
gh api graphql \
-F owner='ContextualWisdomLab' -F name='pg-erd-cloud' -F number="$pr" \
-f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes {
isResolved
isOutdated
comments(first: 1) { nodes { author { login } body } }
}
}
}
}
}' \
--jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | {outdated: .isOutdated, author: .comments.nodes[0].author.login, body: .comments.nodes[0].body}]'Length of output: 21652 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
sha='1db057eedc5367d725097fac423a4048b7fbabb7'
run='30963780975'
printf '%s\n' '== Backend job identity and completed steps =='
gh api "repos/${repo}/actions/runs/${run}/jobs?per_page=100" \
--jq --arg sha "$sha" '
.jobs[]
| select(.name == "backend")
| {
name,
conclusion,
head_sha,
started_at,
completed_at,
steps: [.steps[] | {number,name,conclusion}]
}
| select(.head_sha == $sha)'
printf '%s\n' '== Backend log evidence for installation, type checking, and test completion =='
gh run view "$run" --repo "$repo" --log \
| rg -n -i -C 3 -- \
'pip install.*--require-hashes|--require-hashes.*requirements-dev\.lock|mypy app|Success: no issues found|pytest -q|passed|failed|skipped|error' \
|| trueLength of output: 1236 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
sha='1db057eedc5367d725097fac423a4048b7fbabb7'
run='30963780975'
printf '%s\n' '== Backend job identity and completed steps =='
gh api "repos/${repo}/actions/runs/${run}/jobs?per_page=100" \
| jq --arg sha "$sha" '
.jobs[]
| select(.name == "backend" and .head_sha == $sha)
| {
name,
conclusion,
head_sha,
started_at,
completed_at,
steps: [.steps[] | {number,name,conclusion}]
}'
printf '%s\n' '== Backend log evidence for installation, type checking, and test completion =='
gh run view "$run" --repo "$repo" --log \
| rg -n -i -C 3 -- \
'pip install.*--require-hashes|--require-hashes.*requirements-dev\.lock|mypy app|Success: no issues found|pytest -q|[0-9]+ passed|[0-9]+ skipped|[0-9]+ failed|ERROR' \
|| trueLength of output: 6256
[approve] You are interacting with an AI system. |
|
Temporarily holding this PR behind security migration #743. The current branch still declares |
|
@opencode-agent review Review exact current head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
pr='725'
expected='1db057eedc5367d725097fac423a4048b7fbabb7'
echo '== Exact PR head =='
actual="$(git rev-parse HEAD)"
printf 'checked_out=%s\nexpected=%s\n' "$actual" "$expected"
test "$actual" = "$expected"
gh pr view "$pr" --repo "$repo" \
--json state,isDraft,baseRefOid,headRefOid,changedFiles,additions,deletions \
--jq '.'
test "$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')" = "$expected"
base="$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')"
echo '== Changed paths and whitespace =='
git diff --name-status "${base}...${expected}"
git diff --check "${base}...${expected}"
echo '== Declarations and CHANGELOG wording =='
rg -n -i -C 4 \
'fastapi|redis|0\.141\.1|8\.1\.0|drift|prevent|lock|dependenc' \
backend/pyproject.toml CHANGELOG.md
echo '== Relevant PR diff =='
git diff --find-renames "${base}...${expected}" -- \
CHANGELOG.md backend/pyproject.toml backend/requirements.lock backend/requirements-dev.lock .github
echo '== Hash-lock entry and closure checks =='
for lock in backend/requirements.lock backend/requirements-dev.lock; do
echo "--- ${lock}"
awk '
BEGIN { entries=0; missing=0; current=""; hashes=0; bad=0 }
function finish() {
if (current != "" && hashes == 0) {
print "MISSING_HASH " current
missing++
}
}
/^[A-Za-z0-9_.-]+(\[[^]]+\])?==[^[:space:]\\]+[[:space:]]*\\?$/ {
finish()
current=$1
hashes=0
entries++
next
}
/^[[:space:]]+--hash=sha256:[0-9a-f]{64}[[:space:]]*\\?$/ {
hashes++
next
}
/^[[:space:]]*$/ || /^[[:space:]]*`#/` { next }
{ print "UNEXPECTED " FNR ":" $0; bad++ }
END {
finish()
printf "entries=%d missing_hashes=%d unexpected_lines=%d\n", entries, missing, bad
exit (missing || bad)
}
' "$lock"
rg -n -A 12 -B 1 '^(fastapi|redis)==|^[[:space:]]+--hash=sha256:' "$lock" \
| sed -n '/fastapi==/,+12p;/redis==/,+12p'
done
echo '== Production entries absent or divergent in development lock =='
awk '
FNR==NR {
if (/^[A-Za-z0-9_.-]+(\[[^]]+\])?==[^[:space:]\\]+/) {
split($1, a, "=="); prod[a[1]]=$1
}
next
}
/^[A-Za-z0-9_.-]+(\[[^]]+\])?==[^[:space:]\\]+/ {
split($1, a, "=="); dev[a[1]]=$1
}
END {
for (name in prod) {
if (!(name in dev)) print "MISSING_FROM_DEV " name
else if (prod[name] != dev[name]) print "VERSION_MISMATCH " prod[name] " <> " dev[name]
}
}
' backend/requirements.lock backend/requirements-dev.lock
echo '== Added writer or automation paths =='
git diff --name-only --diff-filter=A "${base}...${expected}" \
| rg -i '(^|/)(\.github/workflows/|.*(one[-_]?shot|repair|write|writer|script|workflow).*)' || true
echo '== Exact-head checks and backend log evidence =='
gh api "repos/${repo}/commits/${expected}/check-runs?per_page=100" \
--jq '.check_runs[] | [.name,.status,.conclusion] | `@tsv`'
run="$(gh run list --repo "$repo" --commit "$expected" --workflow ci.yml --json databaseId,conclusion,status --jq '.[] | select(.status=="completed" and .conclusion=="success") | .databaseId' | head -n1)"
printf 'ci_run=%s\n' "$run"
test -n "$run"
gh run view "$run" --repo "$repo" --log \
| rg -n -i -C 2 -- \
'pip install.*--require-hashes|--require-hashes.*requirements-dev\.lock|mypy app|Success: no issues found|pytest -q|[0-9]+ passed|[0-9]+ skipped|[0-9]+ failed'
echo '== Security migration `#743` status and dependency presence =='
gh pr view 743 --repo "$repo" \
--json state,mergedAt,mergeCommit,baseRefOid,headRefOid,url,title \
--jq '.'
rg -n -i -C 2 'python-jose|types-python-jose|^ecdsa==' \
backend/pyproject.toml backend/requirements.lock backend/requirements-dev.lock || trueLength of output: 25453
The FastAPI/Redis update is synchronized.
I cannot approve this head. Pull request ✏️ Learnings added
You are interacting with an AI system. |
|
Exact-head independent review requested for |
|
@opencode-agent @cwl-noema-review @coderabbitai review Review the exact current head only. Verify declaration/lock synchronization for FastAPI and Redis, hash-only installation, absence of one-shot repair artifacts, unchanged application behavior, and current-head CI/security evidence. Please submit a formal current-head verdict. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
pr='725'
echo '== Pull request and checked-out head =='
gh pr view "$pr" --repo "$repo" \
--json state,isDraft,baseRefOid,headRefOid,changedFiles,additions,deletions,url \
--jq '.'
head="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
base="$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')"
printf 'checked_out=%s\nbase=%s\nhead=%s\n' "$(git rev-parse HEAD)" "$base" "$head"
test "$(git rev-parse HEAD)" = "$head"
echo '== Changed paths and relevant diff =='
git diff --name-status "${base}...${head}"
git diff --check "${base}...${head}"
git diff --find-renames "${base}...${head}" -- \
CHANGELOG.md backend/pyproject.toml backend/requirements.lock backend/requirements-dev.lock .github
echo '== Dependency declarations and CHANGELOG wording =='
ast-grep outline backend/pyproject.toml --items all || true
rg -n -i -C 4 \
'fastapi|redis|0\.141\.1|8\.1\.0|drift|prevent|lock|dependenc|python-jose|ecdsa' \
backend/pyproject.toml CHANGELOG.md
echo '== Hash-lock integrity and production-to-development closure =='
python3 - <<'PY'
from pathlib import Path
from collections import OrderedDict
import re, sys
paths = (Path("backend/requirements.lock"), Path("backend/requirements-dev.lock"))
header = re.compile(r'^([A-Za-z0-9_.-]+)(?:\[[^]]+\])?==([^\s\\]+)\s*(?:\\)?\s*$')
hashline = re.compile(r'^\s*--hash=sha256:([0-9a-f]{64})\s*(?:\\)?\s*$')
def parse(path):
entries, errors, current = OrderedDict(), [], None
for line_no, line in enumerate(path.read_text().splitlines(), 1):
match = header.match(line)
if match:
if current:
name, item = current
if not item["hashes"]:
errors.append(f"{path}:{line_no - 1}: {name} has no hashes")
entries[name] = item
current = (match.group(1).lower().replace("_", "-"),
{"version": match.group(2), "hashes": []})
elif current and (match := hashline.match(line)):
current[1]["hashes"].append(match.group(1))
elif line.strip() and not line.lstrip().startswith("#"):
errors.append(f"{path}:{line_no}: unexpected content: {line}")
if current:
name, item = current
if not item["hashes"]:
errors.append(f"{path}:EOF: {name} has no hashes")
entries[name] = item
return entries, errors
locks = {}
for path in paths:
entries, errors = parse(path)
locks[path.name] = entries
print(f"{path}: entries={len(entries)}, missing_hashes={sum(not x['hashes'] for x in entries.values())}, errors={len(errors)}")
for error in errors:
print(f"ERROR {error}")
prod, dev = locks["requirements.lock"], locks["requirements-dev.lock"]
print("production_missing_from_development=", sorted(set(prod) - set(dev)))
print("production_development_mismatches=", sorted(
name for name in set(prod) & set(dev)
if prod[name]["version"] != dev[name]["version"] or set(prod[name]["hashes"]) != set(dev[name]["hashes"])
))
for name in ("fastapi", "redis", "python-jose", "types-python-jose", "ecdsa"):
print(f"{name}: production={prod.get(name)} development={dev.get(name)}")
if any(not item["hashes"] for entries in locks.values() for item in entries.values()):
sys.exit(1)
PY
echo '== Added workflow, repair, or writer artifacts =='
git diff --name-status --diff-filter=A "${base}...${head}" \
| rg -i '(^|/)(\.github/workflows/|.*(one[-_ ]?shot|repair|writer|script|artifact).*)' || true
echo '== Exact-head checks and CI command evidence =='
gh api "repos/${repo}/commits/${head}/check-runs?per_page=100" \
--jq '.check_runs[] | [.name,.status,.conclusion,.details_url] | `@tsv`'
rg -n -i -C 3 -- \
'--require-hashes|requirements(-dev)?\.lock|mypy app|pytest -q|coverage' \
.github/workflows backend/pyproject.toml 2>/dev/null || true
gh run list --repo "$repo" --commit "$head" --limit 30 \
--json databaseId,name,status,conclusion,workflowName,headSha \
--jq '.[] | select(.status == "completed") | [.databaseId,.workflowName,.conclusion,.headSha] | `@tsv`'
echo '== Security migration `#743` status =='
gh pr view 743 --repo "$repo" \
--json state,mergedAt,mergeCommit,baseRefOid,headRefOid,url \
--jq '.'
echo '== Unresolved review threads =='
gh api graphql \
-F owner='ContextualWisdomLab' -F name='pg-erd-cloud' -F number="$pr" \
-f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes {
isResolved
isOutdated
comments(first: 1) { nodes { author { login } body } }
}
}
}
}
}' \
--jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | {outdated: .isOutdated, author: .comments.nodes[0].author.login, body: .comments.nodes[0].body}]'Length of output: 22020
The FastAPI and Redis update is synchronized.
Pull request After You are interacting with an AI system. |
|
@opencode-agent review Review exact current head |
Rate Limit Exceeded
|
Pull request was converted to draft
|
Drafted to prevent stale lock material from reintroducing |
What
Replaces #706 with a maintainer-owned branch so verified generated lockfiles can be persisted safely.
>=0.141.1;>=8.1.0;--require-hashesinstallation, mypy, and the complete backend test suite;CHANGELOG.md.Why
The Dependabot-owned branch could not persist regenerated lockfiles because its workflow token is intentionally read-only. Keeping declarations and installed locks synchronized prevents a misleading green build against stale dependencies.
Validation
Auto-merge is enabled and awaits the repository-required independent current-head approval.
Summary by CodeRabbit