Skip to content

feat(php-backend-sdlc): publish review findings + conclusion as GitHub PR comments - #9

Merged
Kravalg merged 6 commits into
mainfrom
feature/publish-review-comments
Jun 14, 2026
Merged

feat(php-backend-sdlc): publish review findings + conclusion as GitHub PR comments#9
Kravalg merged 6 commits into
mainfrom
feature/publish-review-comments

Conversation

@dmytrocraft

@dmytrocraft dmytrocraft commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

Publish review findings + conclusion as GitHub PR comments

Closes #8. Built via the BMAD planning chain (specs/autonomous/2026-06-14-publish-review-comments/) → implementation.

Adds an opt-in, default-off capability so the plugin's three review lenses (security-audit, BMAD fr/nfr, code-review) publish their findings as one idempotent PR comment per lens, plus a conclusion comment at loop close (counts found by lens×severity, count auto-fixed root-cause-with-regression-test, run duration).

What's here

  • scripts/post-review-findings.sh — shared poster: gated (first action), idempotent hidden-marker publish (REST list → marker+author match → edit oldest, else create; minimize surplus duplicates), canonical finding-record ledger, per-lens deduped+severity-ordered render, --conclusion aggregate, in-scope base-repo authorization, secret redaction, full degrade matrix (every failure → note + exit 0). Dual jq/python backend confined to a deterministic JSON→TSV projection so renders are byte-identical.
  • lib/common.sh — wrap-safe num_add + lower helpers (no (( )) over counts).
  • Gated Publish steps in the three review SKILLs + --conclusion wiring in /sdlc-review.
  • Profile keys: capabilities.publish_pr_comments (bool, default false) + make.post_review_findings (nullable) — schema + generator + validator.
  • Tests: tests/post-review-findings.bats (37 cases) + fixtures; prompt-quality LLM-judge re-judges the edited skills.

Verification

  • Full bats 235/235; shellcheck -x clean; markdownlint clean; component counts 8/7/22 unchanged; NFR-2 denylist clean.
  • No new command/agent/skill; default-off so existing flows are unchanged.

🤖 Generated with Claude Code


Summary by cubic

Adds an opt-in feature to publish review findings as GitHub PR comments: one consolidated, idempotent comment per lens (security, FR/NFR, code review) plus a single conclusion at loop end. Improves safety and reliability with correct gh -F posting, stricter author matching, safer redaction, Markdown escaping, and duration fallback.

  • Bug Fixes

    • Require a resolved poster login before updating marker’d comments; otherwise create a new one and warn.
    • Resolve the conclusion poster via real lib/common.sh helpers (profile_path + profile_get make.post_review_findings, null → bundled script) and guard $PR in /sdlc-review.
    • Comment listing/rendering hardening: guard null .body, escape | in table cells, and fix cwe-less dedup by unique id.
    • Redaction tuning: require a digit in long-entropy runs; require ≥8-char assignment values; avoid path over-redaction; single-pass python on fd 3.
    • Duration now falls back to ledger started_at/ended_at and rejects absurd (>12-digit) values.
    • Exclude **/tests/fixtures/** from quality scanners to prevent false positives.
  • Migration

    • Set capabilities.publish_pr_comments: true to enable.
    • Optionally set make.post_review_findings; otherwise uses the built-in script.
    • Ensure the CI token used by gh can comment on PRs in the base repository.

Written for commit 5a17624. Summary will update on new commits.

Review in cubic

dmytrocraft and others added 2 commits June 14, 2026 15:02
…review comments)

Core of the publish-review-comments feature (issue #8), built from the BMAD
planning chain (research/brief/prd/architecture/epics/readiness under specs/).

- lib/common.sh: add wrap-safe num_add (digit-string addition) + lower helper.
- scripts/post-review-findings.sh: the shared poster — gated (default-off
  capabilities.publish_pr_comments, first action), idempotent hidden-marker
  publish (REST list → marker+author match → PATCH else POST), canonical
  finding-record ledger, per-lens deduped+severity-ordered render, --conclusion
  aggregate (counts found / auto-fixed / duration via wrap-safe num_add),
  in-scope base-repo authorization, secret redaction, full degrade matrix
  (every failure → note + exit 0). Dual jq/python backend confined to a
  deterministic JSON→TSV projection so renders are byte-identical; the rest is
  single-impl bash. shellcheck -x clean.

Verified by smoke: gating on/off, jq↔python parity, dedup by
(cwe,location,endpoint), severity order, dropped grouping, redaction
(password=/AKIA/JWT/url-creds), conclusion math + duration.

Skill Publish slots, orchestrator wiring, profile keys, and the test tiers
land in follow-up commits on this branch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rator, profile, tests)

Completes the publish-review-comments feature (issue #8) on top of the poster
script (d96fb04), per the BMAD architecture.

Profile keys (FR-8): capabilities.publish_pr_comments (bool, default false) and
make.post_review_findings (nullable, plugin-substitutes the script) — added to
docs/profile-schema.md (table + # profile-example), emitted by
generate-profile.sh, required by validate-profile.sh MAKE_KEYS (valid.yml
fixture updated to stay complete).

Gated Publish steps (FR-6) in security-audit (§5.7), bmad-fr-nfr-review-gate,
and code-review SKILLs — each gates on the capability, resolves the poster via
make.post_review_findings (null → ${CLAUDE_PLUGIN_ROOT}/scripts/...), emits its
lens ledger, and states the degrade contract; both keys added to each skill's
Profile keys consumed. Orchestrator (FR-10): /sdlc-review captures loop
start/end and posts the --conclusion once at loop close (single post; no
double-post on the finish-pr hand-off).

Poster improvements from the test-author critique: edit the OLDEST (min numeric
id, wrap-safe) not list-order; minimize surplus duplicate marker'd comments
(lazy node_id fetch) for corruption recovery; emit the no-PR skip-note to
stderr so it surfaces; zero-pad the conclusion duration (12m 04s); tighten
redaction rule #6 so `/`-containing paths aren't over-redacted.

Tests (FR-11): tests/post-review-findings.bats — 37 cases (render, jq↔python
byte-parity, idempotent create/update, duplicate collapse, dedup, severity
order, redaction, gating on/off, every degrade row, base-repo refusal,
conclusion math + wrap-safe + duration, install-cache) + fixtures. Full suite
235/235 green; shellcheck -x clean; markdownlint clean; component counts 8/7/22
unchanged; NFR-2 denylist clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in, default-off publish_pr_comments capability to the php-backend-sdlc plugin. This includes two new profile keys (make.post_review_findings, capabilities.publish_pr_comments), num_add/lower helpers in common.sh, gated Publish steps in three SKILL.md files, orchestrator conclusion wiring in sdlc-review.md, test fixtures (ledgers + profiles), a 496-line bats suite for post-review-findings.sh, and a full planning spec suite. Also ignores BMAD scratch files in .gitignore.

Changes

Publish Review Findings as GitHub PR Comments

Layer / File(s) Summary
Profile schema, generator, and validator
plugins/php-backend-sdlc/docs/profile-schema.md, plugins/php-backend-sdlc/scripts/generate-profile.sh, plugins/php-backend-sdlc/scripts/validate-profile.sh, plugins/php-backend-sdlc/tests/fixtures/profiles/valid.yml, plugins/php-backend-sdlc/tests/fixtures/profiles/publish-on.yml, plugins/php-backend-sdlc/tests/fixtures/profiles/publish-off.yml
Adds make.post_review_findings and capabilities.publish_pr_comments to the schema doc, generator YAML output, and validator MAKE_KEYS completeness check; updates profile fixtures to match.
common.sh helpers: num_add and lower
plugins/php-backend-sdlc/scripts/lib/common.sh
Adds wrap-safe digit-string addition (num_add) and a tr-based lowercase helper (lower) used by the poster script's conclusion arithmetic.
Skill and orchestrator publish-step wiring
plugins/php-backend-sdlc/skills/security-audit/SKILL.md, plugins/php-backend-sdlc/skills/code-review/SKILL.md, plugins/php-backend-sdlc/skills/bmad-fr-nfr-review-gate/SKILL.md, plugins/php-backend-sdlc/commands/sdlc-review.md
Inserts gated Publish steps into three lens skills (emitting per-lens ledger JSON and invoking post-review-findings.sh) and wires REVIEW_STARTED_AT/REVIEW_ENDED_AT timestamps plus a single --conclusion post into the orchestrator.
Test fixtures: ledgers and profiles
plugins/php-backend-sdlc/tests/fixtures/ledgers/*, plugins/php-backend-sdlc/tests/fixtures/profiles/*
Adds eight ledger JSON fixtures (empty, minimal, full, dedup-pair, dropped-and-open, mixed-severity, secret-laden, 20-digit-count) and two new profile YAML fixtures (publish-on, publish-off) exercised by the bats suite.
Bats test suite for post-review-findings.sh
plugins/php-backend-sdlc/tests/post-review-findings.bats
496-line suite covering: test harness + gh stub, render contracts (markers/ordering/n/a/jq-python3 parity), idempotency (CREATE→UPDATE→duplicate recovery), dedup and severity ordering, secret redaction, publish gating (off/on), full degrade matrix (D2–D7), malformed-ledger hard-fail, conclusion arithmetic and wrap-safety, installability, and argument grammar errors.
Planning specs
specs/autonomous/2026-06-14-publish-review-comments/*
Adds research, product-brief, PRD, architecture, epics/stories, and implementation-readiness documents for the feature.

Gitignore Update

Layer / File(s) Summary
Ignore BMAD scratch files
.gitignore
Adds specs/**/.bmad-plan.mjs glob to prevent BMAD planning scratch files from being tracked.

Sequence Diagram(s)

sequenceDiagram
    participant Orchestrator as /sdlc-review
    participant Skill as Lens SKILL
    participant Poster as post-review-findings.sh
    participant GH as gh CLI

    Orchestrator->>Orchestrator: capture REVIEW_STARTED_AT
    loop per review iteration
        Orchestrator->>Skill: run lens (security / fr-nfr / code-review)
        Skill->>Skill: emit findings to .sdlc/review-ledgers/<lens>.json
        Skill->>Poster: invoke with lens arg (gated: publish_pr_comments=true)
        Poster->>Poster: validate ledger, dedup, redact secrets
        Poster->>GH: list PR comments (author-filtered)
        GH-->>Poster: existing comments
        alt marker found
            Poster->>GH: PATCH existing comment
        else no marker
            Poster->>GH: POST new comment
        end
    end
    Orchestrator->>Orchestrator: capture REVIEW_ENDED_AT
    Orchestrator->>Poster: invoke --conclusion (post-exit, gated)
    Poster->>Poster: aggregate counts via num_add, format duration
    Poster->>GH: POST/PATCH conclusion comment
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

  • #8 — This PR directly implements the feature tracked in issue #8: it adds the opt-in publish_pr_comments capability, the shared poster script contract, idempotent marker-based PR comments, per-lens gated publish steps, and the conclusion comment at loop close.

Possibly related PRs

  • VilnaCRM-Org/claude-plugins#7 — This PR extends the security-audit SKILL.md introduced in PR #7 by adding the gated 5.7 Publish step and make.post_review_findings/capabilities.publish_pr_comments profile key consumption.
  • VilnaCRM-Org/claude-plugins#2 — This PR extends PR #2's baseline by modifying the same generate-profile.sh, validate-profile.sh, and scripts/lib/common.sh files to add new profile keys and arithmetic helpers.

Suggested reviewers

  • Kravalg
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Title accurately summarizes the main change: adding a feature to publish review findings and conclusion as GitHub PR comments.
Linked Issues check ✅ Passed The PR addresses issue #8 requirements: shared poster script with idempotent publishing, per-lens findings + conclusion, opt-in gating, secret redaction, degrade-safe behavior, full test coverage.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the feature: poster script, helpers, skill/orchestrator integration, profile schema/validation, fixtures, tests, and supporting documentation—no unrelated modifications.
Description check ✅ Passed PR description clearly relates to the changeset: publishing review findings as GitHub PR comments with detailed feature overview, testing results, and implementation completeness details.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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 and usage tips.

@qltysh

qltysh Bot commented Jun 14, 2026

Copy link
Copy Markdown

All good ✅

Comment thread plugins/php-backend-sdlc/tests/fixtures/ledgers/secret-laden.json
Comment thread plugins/php-backend-sdlc/tests/fixtures/ledgers/secret-laden.json
…ression test

Real-PR QA on PR #9 caught it: `gh api -X POST/PATCH ... -f body=@-` posts the
LITERAL string "@-", because gh only reads stdin for a field with -F/--field
(@-/@file expansion); -f/--raw-field takes the value verbatim. The comment body
was therefore never sent (the marker'd comment never appeared; junk "@-"
comments were created instead). Switch both the POST and PATCH writes to
`-F body=@-` so the rendered Markdown is read from stdin.

The bats gh-stub logs calls but cannot emulate gh's -f/-F stdin semantics, so it
missed this — added a regression assertion to the CREATE test that the write
uses `-F body=@-` and never `-f body=@-`.

Verified live on PR #9: create → one marker'd comment; re-run → idempotent
update (still one); secret redaction confirmed in the posted body; QA comments
cleaned up afterward.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
coderabbitai[bot]
coderabbitai Bot previously requested changes Jun 14, 2026

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
plugins/php-backend-sdlc/tests/fixtures/profiles/valid.yml (1)

50-54: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Missing publish_pr_comments capability in the reference fixture.

The fixture should include publish_pr_comments: false in the capabilities block to match the schema and the auto-emitted profile. Currently it's missing.

🔧 Proposed fix
 capabilities:
   structurizr: false
   observability_emf: false
   load_testing: true
+  publish_pr_comments: false
🤖 Prompt for 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.

In `@plugins/php-backend-sdlc/tests/fixtures/profiles/valid.yml` around lines 50 -
54, Add the missing `publish_pr_comments: false` capability to the capabilities
block in the valid.yml fixture file. The capabilities section currently includes
structurizr, observability_emf, and load_testing, but is missing the
publish_pr_comments field which is required by the schema and expected in
auto-emitted profiles. Insert this capability in the appropriate location within
the capabilities block to ensure the fixture matches the complete schema.
🤖 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 `@plugins/php-backend-sdlc/commands/sdlc-review.md`:
- Around line 191-197: The documentation shows a contract mismatch where the
text describes using the profile-mapped poster target from
`make.post_review_findings`, but the bash command at Line 196 hardcodes the
default script path instead of using a variable. Replace the hardcoded
`"${CLAUDE_PLUGIN_ROOT}/scripts/post-review-findings.sh"` path in the conclusion
invocation with a variable (such as `POST_REVIEW_FINDINGS`) that should be
defined from the profile configuration with a default fallback. Add the variable
definition immediately before this snippet to establish the profile-mapped
target while maintaining the default path as a fallback when no profile override
is provided.

In `@specs/autonomous/2026-06-14-publish-review-comments/architecture.md`:
- Around line 317-334: The current filter logic in the matches condition allows
marker-only matching when POSTING_LOGIN is empty, which creates a security risk
where any comment containing the marker could be updated instead of only the
bot's own comment. Remove the fallback to marker-only matching by modifying the
filter condition: when POSTING_LOGIN is empty (posting identity cannot be
resolved), the filter should not match any comments, effectively skipping the
update path. This prevents updating reviewer comments that happen to quote the
marker when the bot login cannot be determined.

---

Outside diff comments:
In `@plugins/php-backend-sdlc/tests/fixtures/profiles/valid.yml`:
- Around line 50-54: Add the missing `publish_pr_comments: false` capability to
the capabilities block in the valid.yml fixture file. The capabilities section
currently includes structurizr, observability_emf, and load_testing, but is
missing the publish_pr_comments field which is required by the schema and
expected in auto-emitted profiles. Insert this capability in the appropriate
location within the capabilities block to ensure the fixture matches the
complete schema.
🪄 Autofix (Beta)

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

Run ID: 1ca4af57-f6e4-4987-b7f9-7a1078906464

📥 Commits

Reviewing files that changed from the base of the PR and between b2b29f0 and 85d8f14.

📒 Files selected for processing (28)
  • .gitignore
  • plugins/php-backend-sdlc/commands/sdlc-review.md
  • plugins/php-backend-sdlc/docs/profile-schema.md
  • plugins/php-backend-sdlc/scripts/generate-profile.sh
  • plugins/php-backend-sdlc/scripts/lib/common.sh
  • plugins/php-backend-sdlc/scripts/post-review-findings.sh
  • plugins/php-backend-sdlc/scripts/validate-profile.sh
  • plugins/php-backend-sdlc/skills/bmad-fr-nfr-review-gate/SKILL.md
  • plugins/php-backend-sdlc/skills/code-review/SKILL.md
  • plugins/php-backend-sdlc/skills/security-audit/SKILL.md
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/20-digit-count.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/dedup-pair.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/dropped-and-open.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/empty.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/full.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/minimal.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/mixed-severity.json
  • plugins/php-backend-sdlc/tests/fixtures/ledgers/secret-laden.json
  • plugins/php-backend-sdlc/tests/fixtures/profiles/publish-off.yml
  • plugins/php-backend-sdlc/tests/fixtures/profiles/publish-on.yml
  • plugins/php-backend-sdlc/tests/fixtures/profiles/valid.yml
  • plugins/php-backend-sdlc/tests/post-review-findings.bats
  • specs/autonomous/2026-06-14-publish-review-comments/architecture.md
  • specs/autonomous/2026-06-14-publish-review-comments/epics.md
  • specs/autonomous/2026-06-14-publish-review-comments/implementation-readiness.md
  • specs/autonomous/2026-06-14-publish-review-comments/prd.md
  • specs/autonomous/2026-06-14-publish-review-comments/product-brief.md
  • specs/autonomous/2026-06-14-publish-review-comments/research.md

Comment thread plugins/php-backend-sdlc/commands/sdlc-review.md
Comment thread specs/autonomous/2026-06-14-publish-review-comments/architecture.md

@cubic-dev-ai cubic-dev-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.

4 issues found and verified against the latest diff

Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.

Re-trigger cubic

Comment thread plugins/php-backend-sdlc/commands/sdlc-review.md Outdated
Comment thread specs/autonomous/2026-06-14-publish-review-comments/architecture.md
Comment thread plugins/php-backend-sdlc/commands/sdlc-review.md Outdated
Comment thread specs/autonomous/2026-06-14-publish-review-comments/architecture.md Outdated
dmytrocraft and others added 2 commits June 14, 2026 15:42
…poster)

CI shellcheck (older version than local) flagged SC2119 on profile_path with no
arg → call profile_path "$PWD".

Adversarial review of the feature found 2 High + 4 Medium real bugs, all fixed:
- [High] the comment-list `gh --jq` did `gsub` on a possibly-null `.body`, which
  errors out, empties the list, and makes the poster CREATE a duplicate every
  run; guard with `(.body // "")`.
- [High] finding text was interpolated raw into the Markdown table — a `|` in a
  summary/location injected phantom columns; escape `|`→`\|` in cell_or_na.
- [Med] dedup by (cwe,location,endpoint) collapsed distinct cwe-less fr-nfr /
  code-review findings at the same location, dropping real findings; key cwe-less
  findings by their unique id instead.
- [Med] the high-entropy redaction rule nuked any 32+ alnum run (long class
  names / path segments); now require a digit in the run (real tokens have one).
- [Med] the keyword-assignment redaction fired on prose ("token: expired"); now
  require an ≥8-char value.
- [Med] --conclusion duration ignored the ledgers' started_at/ended_at fallback
  (OQ-7); derive min-start … max-end from the ledgers when no explicit source.
- redact() is now a single python pass on fd 3 (not `python3 -`, which would
  read the program from stdin and swallow the piped data); human_duration
  rejects an absurd >12-digit value (NFR-4 letter).

4 regression bats added (pipe-escape, distinct-cwe-less-dedup, no-over-redaction,
duration ledger fallback). Poster suite 41/41; shellcheck -x clean; verified
live on PR #9 (create→idempotent update, redaction, cleanup).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CodeRabbit (CHANGES_REQUESTED) + cubic + qlty actionable items:
- valid.yml reference fixture: add capabilities.publish_pr_comments: false so it
  matches the full schema / auto-emitted profile (CodeRabbit Major).
- poster author filter: never marker-only match when the posting identity is
  unresolved — that could edit a human comment quoting the marker; require a
  resolved login to match, else create + warn (CodeRabbit/cubic, R7).
- /sdlc-review conclusion invocation: resolve the poster via
  make.post_review_findings (null → bundled script) instead of a hardcoded path,
  matching the per-lens Publish steps; guard $PR (cubic P1/P2 contract mismatch).
- qlty: exclude **/tests/fixtures/** from scanning — the redaction-test ledgers
  hold intentional fake secrets (AWS example key / sample JWT), not real ones
  (qlty gitleaks/checkov false positives).
- architecture.md §4.2: sync the doc with the implementation — null-guarded body
  in the list jq, resolved-login-required match, -F (not -f) body=@-, and the
  lazy node_id fetch for the minimize path (cubic P1 doc mismatch).

shellcheck -x clean; bats 84/84 (poster + profile suites) green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@dmytrocraft

Copy link
Copy Markdown
Collaborator Author

Addressed review feedback (commit ce9e515)

Thanks @coderabbitai @cubic-dev-ai @qltysh — all actionable items resolved:

  • valid.yml missing publish_pr_comments (CodeRabbit) → added publish_pr_comments: false to the fixture's capabilities block.
  • Don't marker-only match when the bot login is unknown (CodeRabbit/cubic, R7) → the author filter now requires a resolved posting identity to match an existing comment; with no login it creates a fresh comment (+ warns) rather than risk editing a human's comment.
  • Conclusion invocation should use the profile-mapped poster target (CodeRabbit/cubic) → /sdlc-review now resolves the poster via make.post_review_findings (null → bundled script), matching the per-lens Publish steps; $PR is guarded.
  • qlty secret findings in fixtures (qlty) → **/tests/fixtures/** excluded in .qlty/qlty.toml; those are the redaction-test ledgers with intentional fake secrets (AWS example key / sample JWT), not real credentials.
  • arch doc node_id / list projection mismatch (cubic) → architecture §4.2 synced to the implementation: null-guarded .body in the list jq, resolved-login-required match, -F body=@-, lazy node_id fetch for the minimize path.

Also fixed in earlier commits on this branch from an internal adversarial pass + real-PR QA: the gh -f-F body=@- bug (was posting the literal @-), null-body list-parse crash, Markdown-table pipe escaping, dedup no longer dropping distinct cwe-less findings, high-entropy over-redaction, and the conclusion duration ledger fallback. Poster suite is 41 bats cases; full suite green.

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@dmytrocraft — clean sweep, well done. The three items I flagged are all properly resolved:

  • valid.yml + publish_pr_comments: false in the capabilities block.
  • ✅ Resolved-login-required guard before marker matching — correct call to avoid clobbering human comments.
  • ✅ Conclusion poster now goes through make.post_review_findings (null → bundled script) with $PR guarded, consistent with per-lens steps.

The bonus fixes from the adversarial pass (especially the gh -f-F body=@-`` literal-string bug and the null-body crash) are exactly the kind of edge cases that bite in real CI runs — good catch. 41 bats cases with a green suite is a solid safety net for this feature.


If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

@cubic-dev-ai cubic-dev-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.

1 issue found across 5 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread plugins/php-backend-sdlc/commands/sdlc-review.md Outdated
@dmytrocraft

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

…he conclusion slot

cubic (P1, conf 10): the prior conclusion example called `profile_make_target`,
which does not exist → a Bash `command not found` at runtime (the `${POSTER:-…}`
fallback masked it). Use the actual lib/common.sh helpers the plugin scripts
already source — `profile_path` + `profile_get "$profile" make.post_review_findings ""`
— with the bundled script as the null default; a non-null key maps to a custom
publisher. Matches the per-lens Publish steps' null-substitution.
@dmytrocraft
dmytrocraft dismissed coderabbitai[bot]’s stale review June 14, 2026 13:13

All CodeRabbit threads resolved in ce9e515; cubic + qlty re-reviewed non-blocking; CI green. Dismissing the superseded review.

@Kravalg
Kravalg merged commit b5206e3 into main Jun 14, 2026
27 checks passed
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.

feat(php-backend-sdlc): publish review findings + conclusion as GitHub PR comments

2 participants