Skip to content

OSAC-2870: rename 5 more EPs per Jira-content cross-check - #174

Merged
openshift-merge-bot[bot] merged 3 commits into
osac-project:mainfrom
tchughesiv:OSAC-2870-followup3-eran-jira-matches
Jul 30, 2026
Merged

openshift-merge-bot[bot] merged 3 commits into
osac-project:mainfrom
tchughesiv:OSAC-2870-followup3-eran-jira-matches

Conversation

@tchughesiv

@tchughesiv tchughesiv commented Jul 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Follow-up to Eran Cohen's comment on OSAC-2870, which re-examined the 8 directories that were still unrenamed after #139/#144/#149 merged and found resolvable Jira keys for 5 of them by searching Jira Features directly (rather than only checking each doc's own frontmatter/PR title).

Each of Eran's 4 matches was independently re-verified here — and one (catalog-items) was corrected — using three signals per directory: content match, an explicit "Enhancement Proposal" link in the Jira issue's own description pointing back at the originating GitHub PR (where present), and date correlation (the directory's/PR's creation date vs. the Jira issue's creation date — these EPs predate Jira Feature tracking, so tickets were consistently backfilled 1–4 months later).

Changes

Directory Renamed to Verification
catalog-items OSAC-1002-catalog-items Corrected from Eran's suggestion of OSAC-1531 (a directory-name-similarity match). OSAC-1531's own PR (#129) already lives at enhancements/OSAC-1531-default-catalog-items/prd.md — a different, later, narrower feature ("auto-publish default catalog items at install time") that explicitly lists "Modifications to the fulfillment-service private API" as out of scope, i.e. it assumes this directory's catalog-item API already exists. The correct match is OSAC-1002 ("Support Catalog items for CaaS & VMaaS - Part 1") — its Jira description literally links .../pull/17, the exact PR that created this directory. No actual duplication with #129 exists; both directories are independently correct.
dns-api OSAC-1050-dns-api Directory and originating PR #29 both created 2026-03-17 (same day). OSAC-1050's problem statement ("OSAC currently hardcodes AWS Route 53...") is nearly verbatim identical to the doc's own. Reporter Dan Manor = doc author dmanor.
organizations OSAC-1030-organizations Directory and originating PR #14 both created 2025-12-21 (same day). OSAC-1030's description explicitly links .../pull/14.
vm-api-fields OSAC-1034-vm-api-fields Directory and originating PR #21 both created 2026-01-27 (same day). OSAC-1034's parent Epic (OSAC-61, same title) is authored by Michael Hrivnak — matches doc author mhrivnak.
repository-consolidation OSAC-1732-repository-consolidation (Epic-level) Directory and originating PR #40 both created 2026-05-07; OSAC-1732 was created 2026-06-24, the same day PR #40 merged. OSAC-1732's description explicitly links .../pull/40. Self-authored and self-filed by Eran Cohen (ercohen@redhat.com in the doc). Used the Epic, not its parent Feature OSAC-2053 ("CI Modernization & Quality") — that Feature is a broad umbrella over 10 unrelated sibling Epics (CI dashboards, Triagent, cluster-tool, etc.), whereas OSAC-1732's own title is a word-for-word match of this EP's title.

All 5 renames used git mv to preserve file history. catalog-items/ and organizations/ each also contain a ui-design.md alongside the README.md, both moved together.

Cross-references updated

Searched the full repo for references to all 5 old directory names, then re-ran the sweep against all 41 retired directory names from the entire OSAC-2870 effort (not just this PR's 5) as a validation pass — that second sweep caught 2 more that earlier PRs had missed. Final count: 16 reference-line edits across 11 files:

File References fixed
OSAC-1002-catalog-items/ui-design.md 1 — its own see-also self-reference to the pre-rename catalog-items path
OSAC-1030-organizations/ui-design.md 2 — two hardcoded GitHub blob links (.../blob/main/enhancements/organizations/README.md) pointing at its own sibling file's pre-rename path
OSAC-985-metering-and-usage-tracking/prd.md 2 — catalog-items, organizations
OSAC-985-metering-and-usage-tracking/design.md 3 — catalog-items, organizations, vm-instance-types (this last one was already stale before this PR — missed by #144, which renamed vm-instance-types → OSAC-46-vm-instance-types while metering-and-usage-tracking was still deferred behind an open PR, so it fell outside that PR's cross-reference sweep)
OSAC-1269-cluster-version-api/design.md 1 — catalog-items
OSAC-979-image-management/README.md 2 — catalog-items (×2)
OSAC-1118-baremetal-instance-api/README.md 1 — catalog-items
OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md 1 — catalog-items
OSAC-1421-cluster-and-vm-provisioning-wizard/design.md 1 — catalog-items
OSAC-1567-secret-management/design.md 1 — organizations
OSAC-1330-type-safe-resource-references/design.md 1 — networking (also already stale before this PR — #121 self-renamed this directory in its own branch, so it never went through our networking → OSAC-356-networking cross-reference sweep from #144 either)

The two bolded ones aren't new breakage from this PR — they're pre-existing staleness from earlier PRs that a full-repo audit (rather than a scoped one) caught. Fixed here since they were already found.

Frontmatter

Filled in tracking-link for all 5 (previously empty placeholder or TBD) with the resolved Jira browse/ link. Left OSAC-1030-organizations/ui-design.md's own Jira: OSAC-2792 field untouched — that's a distinct, more specific ticket for the UI-only slice of this feature, which is a normal and expected pattern (see catalog-items/ui-design.md's separate PR-based tracking-link for the same reason).

Notes for reviewers

  • Original authors, tagged for awareness of their directory's move (no action needed unless something looks wrong):
    • OSAC-1002-catalog-items — @mhrivnak
    • OSAC-1050-dns-api — @danmanor
    • OSAC-1030-organizations — @avishayt
    • OSAC-1034-vm-api-fields — @mhrivnak
    • OSAC-1732-repository-consolidation — @eranco74 (also the Jira commenter who identified 4 of these 5)
  • No open PRs conflict with any of the 5 renamed directories (re-verified at time of this PR).
  • 3 directories remain unrenamed per Eran's same comment — vmaas, bare-metal-fulfillment, tenant-specific-storageclasses — all confirmed to genuinely predate Jira Feature tracking with no resolvable key (tracking-link: None/TBD and no Jira Feature exists to link, per his analysis). Left as-is; not addressed by this PR.

Testing

  • pre-commit run --all-files locally — all hooks pass, including check-ep-naming, after both commits.
  • Confirmed via a full-repo Python-based scan (all file types, not just .md) that no stray references remain for any of the 5 old directory names, or for any of the other 36 retired directory names from the rest of the OSAC-2870 effort (excluding known test fixtures in test_check_ep_naming.py, which intentionally use retired names as illustrative path strings).
  • Checked the other OSAC component repos (fulfillment-service, osac-operator, osac-installer, osac-test-infra, osac-ui, osac-aap, docs) via git grep for cross-repo references to any of the 5 old paths — none found.
  • Verified git log --follow on each renamed file traces cleanly back through its full history to the original PR that created it.
  • Re-confirmed no open PRs conflict with any of the 5 renamed directories or the 2 additionally-touched files, and that the branch is current with main (0 commits behind).

Summary by CodeRabbit

  • Documentation
    • Replaced placeholder tracking metadata with links to the corresponding Jira issues.
    • Updated enhancement references across catalog items, organizations, and related proposals to use their current documentation paths.
    • Corrected PRD links and cross-references in design documents, glossaries, and future-work sections.
    • Preserved existing behavior descriptions, validation details, permissions examples, and API content.

…comment thread)

Follow-up to Eran Cohen's OSAC-2870 comment identifying resolvable Jira
keys for 4 of the 8 remaining unrenamed directories, plus independent
verification/correction of a 5th:

- catalog-items -> OSAC-1002-catalog-items
  (NOT OSAC-1531 as originally suggested by directory-name similarity —
  verified via content: OSAC-1002's Jira description explicitly links
  PR osac-project#17, the exact PR that created this directory. OSAC-1531/PR osac-project#129's
  enhancements/OSAC-1531-default-catalog-items/ is a separate, later,
  narrower feature that assumes this catalog item API already exists —
  no actual duplication between the two.)
- dns-api -> OSAC-1050-dns-api
  (dir + originating PR osac-project#29 both created 2026-03-17; problem statement
  nearly verbatim match; reporter Dan Manor = author dmanor)
- organizations -> OSAC-1030-organizations
  (dir + originating PR osac-project#14 both created 2025-12-21; Jira explicitly
  links PR osac-project#14)
- vm-api-fields -> OSAC-1034-vm-api-fields
  (dir + originating PR osac-project#21 both created 2026-01-27; parent Epic OSAC-61
  authored by Michael Hrivnak = dir author mhrivnak)
- repository-consolidation -> OSAC-1732-repository-consolidation
  (Epic-level key, not parent Feature OSAC-2053: OSAC-2053 is a broad
  'CI Modernization & Quality' umbrella with 10 unrelated sibling Epics,
  while OSAC-1732's title is a word-for-word match of the EP's own title
  and Jira explicitly links PR osac-project#40, the exact originating PR. Also
  self-authored by Eran Cohen, who filed both.)

Filled in tracking-link frontmatter for all 5 (previously empty/TBD).
Updated 10 cross-references across 8 other files, including two
hardcoded GitHub blob links in organizations/ui-design.md that pointed
at the pre-rename path.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
@openshift-ci-robot

openshift-ci-robot commented Jul 29, 2026 •

Copy link
Copy Markdown

@tchughesiv: This pull request references OSAC-2870 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Follow-up to Eran Cohen's comment on OSAC-2870, which re-examined the 8 directories that were still unrenamed after #139/#144/#149 merged and found resolvable Jira keys for 5 of them by searching Jira Features directly (rather than only checking each doc's own frontmatter/PR title).

Each of Eran's 4 matches was independently re-verified here — and one (catalog-items) was corrected — using three signals per directory: content match, an explicit "Enhancement Proposal" link in the Jira issue's own description pointing back at the originating GitHub PR (where present), and date correlation (the directory's/PR's creation date vs. the Jira issue's creation date — these EPs predate Jira Feature tracking, so tickets were consistently backfilled 1–4 months later).

Changes

Directory Renamed to Verification
catalog-items OSAC-1002-catalog-items Corrected from Eran's suggestion of OSAC-1531 (a directory-name-similarity match). OSAC-1531's own PR (#129) already lives at enhancements/OSAC-1531-default-catalog-items/prd.md — a different, later, narrower feature ("auto-publish default catalog items at install time") that explicitly lists "Modifications to the fulfillment-service private API" as out of scope, i.e. it assumes this directory's catalog-item API already exists. The correct match is OSAC-1002 ("Support Catalog items for CaaS & VMaaS - Part 1") — its Jira description literally links .../pull/17, the exact PR that created this directory. No actual duplication with #129 exists; both directories are independently correct.
dns-api OSAC-1050-dns-api Directory and originating PR #29 both created 2026-03-17 (same day). OSAC-1050's problem statement ("OSAC currently hardcodes AWS Route 53...") is nearly verbatim identical to the doc's own. Reporter Dan Manor = doc author dmanor.
organizations OSAC-1030-organizations Directory and originating PR #14 both created 2025-12-21 (same day). OSAC-1030's description explicitly links .../pull/14.
vm-api-fields OSAC-1034-vm-api-fields Directory and originating PR #21 both created 2026-01-27 (same day). OSAC-1034's parent Epic (OSAC-61, same title) is authored by Michael Hrivnak — matches doc author mhrivnak.
repository-consolidation OSAC-1732-repository-consolidation (Epic-level) Directory and originating PR #40 both created 2026-05-07; OSAC-1732 was created 2026-06-24, the same day PR #40 merged. OSAC-1732's description explicitly links .../pull/40. Self-authored and self-filed by Eran Cohen (ercohen@redhat.com in the doc). Used the Epic, not its parent Feature OSAC-2053 ("CI Modernization & Quality") — that Feature is a broad umbrella over 10 unrelated sibling Epics (CI dashboards, Triagent, cluster-tool, etc.), whereas OSAC-1732's own title is a word-for-word match of this EP's title.

All 5 renames used git mv to preserve file history. catalog-items/ and organizations/ each also contain a ui-design.md alongside the README.md, both moved together.

Cross-references updated

Searched the full repo for references to all 5 old directory names. Found and updated 10, across 8 files:

  • OSAC-985-metering-and-usage-tracking/prd.md and design.md — links to both catalog-items and organizations
  • OSAC-1269-cluster-version-api/design.md, OSAC-979-image-management/README.md (×2), OSAC-1118-baremetal-instance-api/README.md, OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md and design.md — all reference catalog-items
  • OSAC-1567-secret-management/design.md — references organizations
  • OSAC-1030-organizations/ui-design.md itself had two hardcoded GitHub blob links (.../blob/main/enhancements/organizations/README.md) pointing at its own sibling file's pre-rename path — updated to the new path

Frontmatter

Filled in tracking-link for all 5 (previously empty placeholder or TBD) with the resolved Jira browse/ link. Left OSAC-1030-organizations/ui-design.md's own Jira: OSAC-2792 field untouched — that's a distinct, more specific ticket for the UI-only slice of this feature, which is a normal and expected pattern (see catalog-items/ui-design.md's separate PR-based tracking-link for the same reason).

Notes for reviewers

  • Original authors, tagged for awareness of their directory's move (no action needed unless something looks wrong):
  • OSAC-1002-catalog-items — @mhrivnak
  • OSAC-1050-dns-api — @danmanor
  • OSAC-1030-organizations — @avishayt
  • OSAC-1034-vm-api-fields — @mhrivnak
  • OSAC-1732-repository-consolidation — @eranco74 (also the Jira commenter who identified 4 of these 5)
  • No open PRs conflict with any of the 5 renamed directories (re-verified at time of this PR).
  • 3 directories remain unrenamed per Eran's same comment — vmaas, bare-metal-fulfillment, tenant-specific-storageclasses — all confirmed to genuinely predate Jira Feature tracking with no resolvable key (tracking-link: None/TBD and no Jira Feature exists to link, per his analysis). Left as-is; not addressed by this PR.

Testing

  • pre-commit run --all-files locally — all hooks pass, including check-ep-naming.
  • Confirmed via a full-repo Python-based scan that no stray references to any of the 5 old directory names remain anywhere in the repo.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci
openshift-ci Bot requested review from jhernand and rawagner July 29, 2026 16:18
@coderabbitai

coderabbitai Bot commented Jul 29, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

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

Next review available in: 48 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

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: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 22527e03-f9b1-4098-90d7-6c3ed7b6dc16

📥 Commits

Reviewing files that changed from the base of the PR and between 7dceb6a and 8358ac6.

📒 Files selected for processing (4)
  • enhancements/OSAC-1030-organizations/ui-design.md
  • enhancements/OSAC-1269-cluster-version-api/design.md
  • enhancements/OSAC-1330-type-safe-resource-references/design.md
  • enhancements/OSAC-985-metering-and-usage-tracking/design.md

Walkthrough

Updated Jira tracking metadata and internal enhancement links across catalog-items, organizations, metering, provisioning, image management, secret management, and related proposal documents.

Changes

Enhancement reference updates

Layer / File(s) Summary
Tracking metadata updates
enhancements/OSAC-1002-catalog-items/README.md, enhancements/OSAC-1030-organizations/README.md, enhancements/OSAC-1034-vm-api-fields/README.md, enhancements/OSAC-1050-dns-api/README.md, enhancements/OSAC-1732-repository-consolidation/README.md
Placeholder tracking links are replaced with concrete Jira URLs.
Catalog Items cross-reference updates
enhancements/OSAC-1002-catalog-items/ui-design.md, enhancements/OSAC-1118-baremetal-instance-api/README.md, enhancements/OSAC-1269-cluster-version-api/design.md, enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/*, enhancements/OSAC-979-image-management/README.md, enhancements/OSAC-985-metering-and-usage-tracking/prd.md
References to the generic Catalog Items enhancement path are updated to the OSAC-1002 path.
Organizations cross-reference updates
enhancements/OSAC-1030-organizations/ui-design.md, enhancements/OSAC-1567-secret-management/design.md, enhancements/OSAC-985-metering-and-usage-tracking/*
Organizations links are updated to the OSAC-1030 enhancement path, including PRD references.
Estimated code review effort: 1 (Trivial) ~5 minutes

Possibly related PRs

Suggested labels: approved, lgtm, rfe-creator-auto-reviewed

Suggested reviewers: avishayt, crystalchun, alonakaplan

🚥 Pre-merge checks | ✅ 11
✅ Passed checks (11 passed)
Check name Status Explanation
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.
No-Hardcoded-Secrets ✅ Passed Scanned all touched docs; found only Jira/PR links and descriptive mentions of token/password/pull_secret, with no credential literals, base64 blobs, or embedded creds.
No-Weak-Crypto ✅ Passed PR only renames markdown docs and updates links/metadata; patch contains no weak crypto primitives, custom crypto, or secret/token comparisons.
No-Injection-Vectors ✅ Passed PR only renames Markdown docs and updates links/frontmatter; no executable code or risky sinks were added.
Container-Privileges ✅ Passed Docs-only rename PR: changed files are markdown enhancement docs; no container/K8s manifests or privilege settings were added.
No-Sensitive-Data-In-Logs ✅ Passed Docs-only renames/link updates; no code/logging changes and no new runtime log output or secret/token exposure added.
Ai-Attribution ✅ Passed PASS: HEAD commit includes an Assisted-by: Claude Code trailer, and no AI-related Co-Authored-By trailer was found.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main change: renaming five enhancement proposals after Jira-content cross-checking.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@github-actions

Copy link
Copy Markdown

AI EP Review: EP-174

Score: 2/10 | Verdict: FAIL

Criterion Score Notes
WHAT (clear need) 0/2 Score 0. This PR contains no new product capability. It renames existing enhancement-proposal directories to follow the OSAC-- naming convention, updates cross-references to the new paths, and replaces 'TBD' tracking links with actual Jira URLs. The file content is unchanged (99% similarity). The rubric explicitly scores 0 when 'the sole deliverable is documentation, example files, or other content with no new platform capability.' This is project housekeeping, not an enhancement.
WHY (justification) 0/2 Score 0. No business justification is stated anywhere in the diff. The implicit motivation — naming-convention consistency — is valid project hygiene but does not constitute a user pain, business need, or strategic goal that warrants a PRD.
User-Facing Focus 1/2 Score 1. Since there is no PRD content being proposed, design leakage is not the concern. The metadata and cross-reference updates are benign and do not prescribe implementation. Scored 1 rather than 0 because the changes are not actively prescriptive — they simply lack any user-facing substance to evaluate.
Right-Sized 1/2 Score 1. The changes are internally coherent — all related to a single naming-convention alignment task. However, this is not a product feature scope question; it is a mechanical cleanup that touches many files for one reason.
Testability 0/2 Score 0. There are no product requirements in this PR. Directory renames and link updates are not verifiable by a PM or QA engineer using the product — there is nothing to test from a product perspective.

Verdict: This PR is a housekeeping change (directory renames and cross-reference updates) with no new product capability, no business justification, and no testable requirements — it does not belong in the PRD pipeline.

Feedback: This work should be tracked as a Jira task, not submitted as a PRD or reviewed through the enhancement-proposal pipeline. PRDs describe new or changed product capabilities; directory renames and link cleanup are project maintenance. If you are submitting a new PRD alongside these renames, split them into separate PRs so the PRD content can be reviewed on its own merits.

Critical (3)

  1. No product capability: The entire PR is directory renames (e.g., enhancements/catalog-items/ → enhancements/OSAC-1002-catalog-items/) and cross-reference updates. File content is unchanged at 99% similarity. This is not an enhancement — track it as a Jira task.
  2. No business justification: The diff contains no problem statement, user pain, or strategic rationale. Naming-convention alignment is valid work but not PRD-level scope.
  3. No testable requirements: There are no product requirements a PM or QA engineer could verify by using the product.

Important (1)

  1. If these renames are part of a larger PRD submission, the housekeeping changes should be in a separate PR to avoid conflating maintenance with feature proposals.

Suggestions (1)

  1. Consider adding a brief PR description explaining the naming convention being enforced (OSAC--) so reviewers understand the mechanical nature of the change without needing to infer it from the diff.

Review cost

Model: claude-opus-4-6
Cost: $0.4751
Tokens: 5 in / 2.8k out
Cache: 98.0k read
Active time: 59s
API calls: 0

@github-actions github-actions Bot added the rfe-creator-auto-reviewed EP was reviewed by AI label Jul 29, 2026
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-174

Score: 0/8 | Verdict: FAIL

Criterion Score Notes
Feasibility 0/2 No design content present. The PR is a mechanical rename of enhancement proposal directories to include Jira key prefixes (e.g., catalog-items/ -> OSAC-1002-catalog-items/) and updates internal cross-references. No implementation details, proto schemas, workflows, or technical specifics exist to evaluate.
Testability 0/2 No test plan or graduation criteria are present or proposed. This is a housekeeping PR that touches only directory names, YAML frontmatter tracking-link fields, and markdown cross-reference links in existing documents.
Scope 0/2 No summary, goals, non-goals, or boundaries are defined. The PR does not introduce or propose any feature — it standardizes directory naming conventions and backfills previously-TBD tracking links with actual Jira URLs.
Architecture 0/2 No architectural decisions are made. The changes are limited to file renames (6 directories), updating see-also and tracking-link references across ~15 files, and fixing internal markdown links to match the new directory names. No new resources, APIs, controllers, or integration points are introduced.

Verdict: This PR is a directory-renaming housekeeping change, not a design document — it contains no design content to evaluate against the rubric, resulting in zeros across all criteria.

Feedback: This PR standardizes enhancement proposal directory naming to include Jira keys and backfills tracking links, which is valuable maintenance work but is not a design document. The design review rubric does not apply to housekeeping PRs. If this PR is intended to accompany a design, the actual design content (Summary, Motivation, Proposal, API Extensions, Test Plan, etc.) needs to be included.

Critical (1)

  1. No design document is present in this PR. The diff contains only directory renames (e.g., enhancements/catalog-items/ -> enhancements/OSAC-1002-catalog-items/), tracking-link backfills from TBD to actual Jira URLs, and cross-reference link updates. The design review rubric requires a design document with architectural decisions, implementation details, scope boundaries, and a test plan — none of which exist here.

Important (0)

None.

Suggestions (2)

  1. The directory renaming and tracking-link backfill work is good housekeeping. Consider reviewing this as a documentation/maintenance PR rather than a design review.
  2. Verify that all internal cross-references were updated consistently — the diff shows updates in see-also fields and inline markdown links, but a grep for the old directory names across the full repo would confirm nothing was missed.

Review cost

Model: claude-opus-4-6
Cost: $0.2762
Tokens: 5 in / 2.0k out
Cache: 126.0k read
Active time: 46s
API calls: 0

@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 `@enhancements/OSAC-1030-organizations/ui-design.md`:
- Line 7: Update the PRD table entry in ui-design.md so the displayed link label
matches its target URL, or change the URL to the actual PRD file; ensure the PRD
metadata is consistent for readers and tooling.

In `@enhancements/OSAC-1269-cluster-version-api/design.md`:
- Line 139: Update the catalog-items reference in the ClusterVersion design
document to point to the renamed enhancement directory using the correct
relative path, such as ../OSAC-1002-catalog-items/README.md, or the repository’s
canonical enhancement URL; leave the surrounding field-definition and validation
content unchanged.
🪄 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: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 13f4a696-7fcd-4831-8d08-651a6fa6940a

📥 Commits

Reviewing files that changed from the base of the PR and between 0db4aca and 7dceb6a.

📒 Files selected for processing (15)
  • enhancements/OSAC-1002-catalog-items/README.md
  • enhancements/OSAC-1002-catalog-items/ui-design.md
  • enhancements/OSAC-1030-organizations/README.md
  • enhancements/OSAC-1030-organizations/ui-design.md
  • enhancements/OSAC-1034-vm-api-fields/README.md
  • enhancements/OSAC-1050-dns-api/README.md
  • enhancements/OSAC-1118-baremetal-instance-api/README.md
  • enhancements/OSAC-1269-cluster-version-api/design.md
  • enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md
  • enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md
  • enhancements/OSAC-1567-secret-management/design.md
  • enhancements/OSAC-1732-repository-consolidation/README.md
  • enhancements/OSAC-979-image-management/README.md
  • enhancements/OSAC-985-metering-and-usage-tracking/design.md
  • enhancements/OSAC-985-metering-and-usage-tracking/prd.md

Comment thread enhancements/OSAC-1030-organizations/ui-design.md Outdated
Comment thread enhancements/OSAC-1269-cluster-version-api/design.md Outdated
Full-repo sweep across all 41 retired directory names from the entire
OSAC-2870 effort (not just this PR's 5) turned up two more stale
references that earlier passes missed:

- OSAC-1330-type-safe-resource-references/design.md still linked to
  '/enhancements/networking' (renamed to OSAC-356-networking in osac-project#144).
  This directory was self-renamed by osac-project#121's own branch, so it never
  went through our cross-reference sweep.
- OSAC-985-metering-and-usage-tracking/design.md still linked to
  '/enhancements/vm-instance-types' (renamed to OSAC-46-vm-instance-types
  in osac-project#144). metering-and-usage-tracking was one of the directories
  deferred at that time due to an open PR, so it was excluded from
  that pass's cross-reference sweep and the reference went stale once
  the deferred rename landed in osac-project#149.

No open PRs conflict with either file (re-verified).

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
@github-actions

Copy link
Copy Markdown

AI EP Review: EP-174

Score: 1/10 | Verdict: FAIL

Criterion Score Notes
WHAT (clear need) 0/2 This PR contains no PRD and describes no new product capability. It is a housekeeping change that renames enhancement proposal directories to include Jira ticket keys (e.g., enhancements/catalog-items/ → enhancements/OSAC-1002-catalog-items/), updates internal cross-references to match the new paths, and fills in previously-TBD tracking links with actual Jira URLs. No personas, no user stories, no services are identified because none are relevant — this is file reorganization, not an enhancement
WHY (justification) 0/2 No business justification is provided or needed because there is no product capability being proposed. The implicit motivation is organizational consistency (standardizing directory naming to include Jira keys), which is a valid housekeeping goal but not a product requirement that belongs in the PRD pipeline.
User-Facing Focus 0/2 There are no user-facing outcomes described because the PR makes no product changes. The changes are entirely internal to the enhancement-proposals repository structure — renaming directories, updating markdown cross-references, and adding tracking links. No user of the OSAC platform would observe any difference.
Right-Sized 1/2 The change itself is well-scoped and internally coherent: every modification follows the same pattern (prefix directories with Jira keys, update all references). However, this is not a PRD scope question — it is a single organizational cleanup task.
Testability 0/2 There are no product requirements to verify. The only testable aspect is whether the renamed files and updated links are correct, which is a code-review concern, not a PRD testability question.

Verdict: This PR is a directory-renaming housekeeping change, not a PRD — it introduces no new product capability, making it unsuitable for the enhancement proposal pipeline.

Feedback: This PR renames enhancement directories to follow the OSAC-NNNN-slug naming convention and backfills tracking links — both valuable housekeeping tasks. However, they should be tracked as a Jira task, not submitted through the PRD/enhancement pipeline. No PRD review criteria can meaningfully apply to file reorganization work.

Critical (1)

  1. Not a PRD: The PR contains zero product requirements, user stories, or capability descriptions. It is purely a directory-rename and cross-reference update across existing enhancement proposals. Per the rubric, content-only work with no new platform capability should be tracked as a Jira task, not an enhancement proposal.

Important (0)

None.

Suggestions (1)

  1. Consider adding a brief PR description explaining the naming convention being adopted (OSAC-NNNN-slug prefix) so future contributors understand the standard when creating new enhancement directories.

Review cost

Model: claude-opus-4-6
Cost: $0.4540
Tokens: 5 in / 2.0k out
Cache: 98.3k read
Active time: 44s
API calls: 0

- OSAC-1030-organizations/ui-design.md: fix PRD table link label
  ('03-prd.md' -> 'README.md') to match its target file. Pre-existing
  mismatch, unrelated to the directory rename itself.
- OSAC-1269-cluster-version-api/design.md: simplify the catalog-items
  EP link from a broken '../../../enhancement-proposals/enhancements/...'
  roundtrip (only happens to resolve in a local osac-workspace
  multi-repo checkout, not on GitHub.com) to the correct same-repo
  relative path '../OSAC-1002-catalog-items/README.md'. Pre-existing
  bug inherited via find-replace on the directory name, not introduced
  by this PR.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
@github-actions

github-actions Bot commented Jul 29, 2026 •

Copy link
Copy Markdown

AI Design Review: EP-174

Score: 0/8 | Verdict: FAIL

Criterion Score Notes
Feasibility 0/2 This PR contains no design content — no implementation details, proto schemas, error handling, lifecycle operations, or risk analysis. It is a housekeeping PR that renames enhancement directories to follow the OSAC-- naming convention and updates cross-references. Cannot be scored as a design document.
Testability 0/2 No test plan is present because this is not a design document. The PR is a mechanical rename of directories and link updates with no testable design content.
Scope 0/2 No summary, goals, non-goals, alternatives, or PRD reference as a design document. The PR scope as a maintenance change is clear (rename directories, fix links, add tracking URLs), but it does not constitute a design proposal.
Architecture 0/2 No architectural decisions, resource patterns, API design, tenant isolation, or dependency analysis are present. The directory renaming itself follows OSAC conventions correctly, but there is no design architecture to evaluate.

Verdict: This PR is a housekeeping/maintenance change that renames enhancement directories to the OSAC-- convention and updates cross-references — it contains no design document content and cannot pass a design review rubric.

Feedback: This PR is not a design document and should not be reviewed against the design document rubric. It is a valid maintenance PR that standardizes directory naming (e.g., catalog-items/ → OSAC-1002-catalog-items/) and replaces TBD tracking links with actual Jira URLs. If this PR is intended to accompany a design, the actual design content should be included. As a standalone housekeeping change, it should be reviewed for link correctness and completeness rather than design quality.

Critical (1)

  1. No design document content: The PR contains only directory renames, frontmatter tracking-link updates, and cross-reference path fixes. There is no Summary, Motivation, Proposal, API Extensions, Implementation Details, Test Plan, or any other section required by the OSAC design template. This makes it impossible to score on any design review dimension.

Important (2)

  1. Mixed content scope: The PR touches 15+ files across 10+ enhancement directories. While all changes are mechanical (path updates), the breadth increases the risk of missed or broken cross-references. A grep for any remaining old-style paths (e.g., /enhancements/catalog-items, /enhancements/organizations, /enhancements/vm-api-fields) across the full enhancement-proposals repo would confirm completeness.
  2. The see-also reference /enhancements/bare-metal-fulfillment in OSAC-1118 and OSAC-1330 was not updated to include a Jira key prefix — if this directory also needs renaming, it was missed.

Suggestions (2)

  1. Consider adding a CI check or pre-commit hook that validates see-also and cross-reference paths point to existing directories, preventing link rot after future renames.
  2. The OSAC-1330 design.md see-also was updated from /enhancements/networking to /enhancements/OSAC-356-networking, which is correct. Verify /enhancements/bare-metal-fulfillment similarly follows the naming convention or document why it does not.

Review cost

Model: claude-opus-4-6
Cost: $0.2908
Tokens: 5 in / 2.4k out
Cache: 126.3k read
Active time: 51s
API calls: 0

@github-actions

Copy link
Copy Markdown

AI EP Review: EP-174

Score: 0/10 | Verdict: FAIL

Criterion Score Notes
WHAT (clear need) 0/2 This PR contains no PRD. It renames enhancement proposal directories to follow the OSAC-- naming convention, updates tracking links from 'TBD' to actual Jira URLs, and fixes cross-references across existing EPs. There is no new product capability — the sole deliverable is organizational housekeeping on existing documentation.
WHY (justification) 0/2 No business justification is presented because this is not a PRD. The implicit motivation is naming convention compliance, but no user pain, business need, or strategic goal is articulated.
User-Facing Focus 0/2 Not applicable — there is no PRD content to evaluate for design leakage. The changes are purely directory renames and link updates in YAML frontmatter and markdown cross-references.
Right-Sized 0/2 Not applicable — there is no feature scope to evaluate. The PR is a single housekeeping task (rename directories, update references).
Testability 0/2 Not applicable — there are no requirements or acceptance criteria to verify. The only verifiable outcome is that renamed paths and updated links resolve correctly.

Verdict: This PR is a housekeeping task (directory renames and link fixes), not a PRD — it introduces no new product capability and should be tracked as a Jira task, not reviewed through the PRD pipeline.

Feedback: This PR renames enhancement directories to the OSAC-- convention and updates cross-references, which is valuable maintenance work but not a PRD. Track it as a standard Jira task and merge it through normal code review. The PRD review process is for proposals that introduce new user-facing capabilities.

Critical (1)

  1. No PRD content: The PR contains only directory renames (e.g., catalog-items/ → OSAC-1002-catalog-items/), tracking-link updates from 'TBD' to Jira URLs, and cross-reference fixes across ~15 existing enhancement proposal files. This is content-only housekeeping with no new platform capability — per the rubric, it belongs in a Jira task, not the PRD pipeline.

Important (0)

None.

Suggestions (0)

None.


Review cost

Model: claude-opus-4-6
Cost: $0.1927
Tokens: 5 in / 1.7k out
Cache: 141.7k read
Active time: 34s
API calls: 0

@github-actions

github-actions Bot commented Jul 29, 2026 •

Copy link
Copy Markdown

AI Design Review: EP-174

Score: 0/8 | Verdict: FAIL

Criterion Score Notes
Feasibility 0/2 No design content to evaluate. This PR is a bulk directory rename (adding Jira key prefixes to enhancement directories) and metadata fix (replacing TBD tracking-links with actual Jira URLs). No implementation details, proto schemas, workflows, or risk analysis are proposed.
Testability 0/2 No design content to evaluate. No test plan is proposed because no feature is being designed. The PR is purely mechanical: rename directories and update cross-references.
Scope 0/2 No design content to evaluate. There is no summary, no goals/non-goals, no alternatives section, and no PRD reference — because this is not a design document. It is a housekeeping change standardizing directory naming conventions.
Architecture 0/2 No design content to evaluate. No architectural decisions are made. The PR touches only frontmatter fields (tracking-link, see-also) and inline cross-reference paths across multiple existing design documents, without modifying any design substance.

Verdict: This PR is not a design document — it is an administrative/housekeeping change that renames enhancement directories to the OSAC-- convention and fixes tracking links, so the design review rubric does not apply.

Feedback: This PR does useful work (standardizing directory names, replacing TBD tracking links with real Jira URLs, updating cross-references), but it is not a design document and should not be evaluated against the design review rubric. If this PR is submitted alongside or as part of a design proposal, the actual design content should be included in the diff for review. As a standalone housekeeping PR, it would benefit from a checklist verifying that all cross-references were updated (grep for old directory names to catch any missed references).

Critical (1)

  1. PR contains no design document content — only directory renames and metadata updates across existing enhancement proposals. All four rubric criteria score 0 because there is nothing to assess, not because the content is deficient.

Important (0)

None.

Suggestions (2)

  1. Verify completeness: grep the entire enhancement-proposals tree for any remaining references to the old directory names (e.g., '/enhancements/catalog-items', '/enhancements/organizations', '/enhancements/vm-api-fields', '/enhancements/dns-api', '/enhancements/repository-consolidation') to catch missed cross-references.
  2. The OSAC-1269 design.md update (line 127-128) changes a relative path from '../../../enhancement-proposals/enhancements/catalog-items/README.md' to '../OSAC-1002-catalog-items/README.md' — verify this relative path resolves correctly from its location.

Review cost

Model: claude-opus-4-6
Cost: $0.2414
Tokens: 6 in / 2.5k out
Cache: 195.7k read
Active time: 56s
API calls: 0

@eranco74

Copy link
Copy Markdown
Contributor

/lgtm
/approve

@openshift-ci

openshift-ci Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: avishayt, eranco74, tchughesiv

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-merge-bot
openshift-merge-bot Bot merged commit 3feb4f8 into osac-project:main Jul 30, 2026
5 checks passed
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 2, 2026
- OSAC-1030-organizations/ui-design.md: fix PRD table link label
  ('03-prd.md' -> 'README.md') to match its target file. Pre-existing
  mismatch, unrelated to the directory rename itself.
- OSAC-1269-cluster-version-api/design.md: simplify the catalog-items
  EP link from a broken '../../../enhancement-proposals/enhancements/...'
  roundtrip (only happens to resolve in a local osac-workspace
  multi-repo checkout, not on GitHub.com) to the correct same-repo
  relative path '../OSAC-1002-catalog-items/README.md'. Pre-existing
  bug inherited via find-replace on the directory name, not introduced
  by this PR.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…_LOGISTICS

Adds ep_classify.classify_logistics_only(), a per-file diff classifier that
recognizes three provably-safe shapes (pure rename, allow-listed frontmatter
field change, same-line link/path substitution) and falls back to
SUBSTANTIVE for anything else — "when in doubt, review." Widens
get_changed_files() to fetch status/previous_filename/patch per file
(Phase A's filename-only consumers are unaffected via filenames_only()).

Ships default-off: EP_REVIEW_SKIP_LOGISTICS=false means the classifier
runs and logs its verdict against every real PR, but the full review
pipeline always still runs — pure observability during burn-in, per the
frozen design's rollout plan. Wired the flag into ep-review.yml's
vars.EP_REVIEW_SKIP_LOGISTICS the same way EP_REVIEW_SHADOW already is,
so flipping it later needs only a repo variable change. When flipped on,
a LOGISTICS_ONLY verdict skips run_review() and posts
hooks.apply_logistics_comment()'s minimal comment instead.

Corrects a contradiction found in the frozen local design while
implementing it: an earlier draft forced SUBSTANTIVE whenever Phase A's
derive_feature_key reported PR-wide key ambiguity, which would have
wrongly failed PR osac-project#174 (a legitimate 16-file bulk rename touching 5
distinct Feature keys). Feature-key attribution and logistics
classification are separate concerns — classify_logistics_only doesn't
call derive_feature_key at all, and decides purely per-file. See the
"Correction" note added to .planning/OSAC-3416_DESIGN.md.

Golden-fixture tests (testdata/pr{168,172,173,174}_files.json, captured
from the real GitHub API) confirm osac-project#174 -> LOGISTICS_ONLY and
osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE, including osac-project#172's frontmatter-plus-prose-
rewrite case that guards against a naive "any frontmatter touched =>
skip" bug.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
Recovered findings from an interrupted `/code-review high` run on the
logistics-classifier work (commit 12ed080), each verified against actual
code/dependencies before fixing:

1. ticket never reached the real prompt/comment. agentic_ci.skill.run_skill
   only forwards its `ticket=` argument to pre_gates/context_writer/
   extension_config_writer — prompt_builder and label_applier only ever see
   **extra_kwargs, which excludes `ticket` since it's a named parameter of
   run_skill(), not a passthrough kwarg. Confirmed against both the
   installed agentic-ci 0.3.37 and the repo's floor (0.3.15): identical
   behavior in both. In production this meant build_prompt()/apply_labels()
   always rendered "Jira Feature key: could not be determined" and empty
   structural notes, even when derive_feature_key() worked correctly.
   Fixed at the ep_skill_config.py seam: prompt_builder/label_applier are
   now wrapped to rename a second `osac_ticket=` kwarg (which *does* survive
   into **extra_kwargs) back to `ticket`, so ep_hooks.py's public method
   signatures are untouched. Added
   test_ep_review.py::RunReviewRealSeamTests, which drives the real
   agentic_ci.skill.run_skill (container execution faked out) instead of
   calling EPHooks.build_prompt()/apply_labels() directly — proven to fail
   against the pre-fix code.

2. Frontmatter false positive in ep_classify._hunk_is_safe. An allow-listed
   field (e.g. last-updated) edited earlier in a hunk left its field name
   "sticky" for the rest of the hunk, so an unrelated real content change
   later in the *same* hunk — even past the closing `---` — was wrongly
   treated as another safe frontmatter edit. Fixed by resetting the tracked
   field at the frontmatter delimiter. Verified the fix doesn't regress the
   legitimate multi-line YAML continuation shapes real PR osac-project#174 relies on
   (e.g. `tracking-link:\n  - <url>`), which need the field-tracking to
   survive across a value's continuation lines.

3. Logistics-only path skipped same-SHA dedup. The EP_REVIEW_SKIP_LOGISTICS
   short-circuit calls hooks.apply_logistics_comment() directly, bypassing
   the check_pr_state() pre-gate that the full-review path gets for free via
   run_skill()'s pre_gates list — a rerun at an unchanged head SHA could
   post a duplicate logistics comment. Fixed by calling check_pr_state()
   explicitly before posting, reusing the existing dedup logic (no
   duplicated marker/SHA matching).

4. Rename into a canonical doc wasn't forced SUBSTANTIVE. The "a brand-new
   prd.md/design.md is never logistics" fail-safe only checked
   status=="added" — a rename that turns a previously non-canonical file
   (e.g. notes.md) into prd.md/design.md is reported by GitHub as
   status=="renamed" and slipped through. Fixed by also forcing SUBSTANTIVE
   when a rename's new basename is canonical and its previous basename
   wasn't the same canonical name — same-basename renames (the real PR osac-project#174
   shape, e.g. README.md -> README.md under a new directory) are unaffected.

Full suite: 134 passed, 5 subtests passed (was 126 before this commit).
Golden PRs unchanged: osac-project#174 -> LOGISTICS_ONLY; osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE.
EP_REVIEW_SKIP_LOGISTICS remains default-off; no Jira fetching or PR
title/body key fallback introduced.

Deferred cleanup/simplification suggestions from the same review
(duplicated comment-rendering helpers, duplicated canonical filename
constants, main() decision-object refactor, generic semantic parser,
dynamic frontmatter schema, type-hint/docstring cleanup) are intentionally
not included — out of scope for this correctness-fix pass.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
… bypass

The security pre-flight review on this branch flagged that the
logistics-only classifier's "safe link/path substitution" category masked
an entire markdown link (visible label included), so a PR could rewrite a
link's human-readable label to arbitrary attacker-controlled text while
the surrounding line stayed byte-identical, and still classify as a safe
logistics-only change.

Only tolerate a changing link label when it's a bare filename-shaped
token (the real PR osac-project#174 rename shape, e.g. "old-name.md" -> "README.md")
- arbitrary prose in a link label now makes the file fall through to
SUBSTANTIVE, same as any other unrecognized change.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…urity re-review

The prior fix (5d2db8c) only partially closed the link-label masking gap:
running the markdown-link pass and the bare-URL/path pass sequentially let
a URL-shaped link label slip past the label protection on the second
pass. Separately, the bare URL/path pattern had no real terminal
boundary, so attacker-appended text could ride along immediately after a
legitimate path with no separator (e.g. ".../design.md-and-ignore-all-
safety-checks").

- Combine link and bare-URL/path matching into a single regex alternation
  evaluated in one left-to-right pass, so a link label's characters are
  never re-offered to the bare-URL/path branch afterwards.
- Anchor the bare "/enhancements/..." path pattern to the terminator
  shapes actually observed in real EP content (quote, backtick, end of
  line, or a known doc extension) instead of an open-ended charset.
- Require link labels tolerated as "safe to change" to have an actual
  file extension (the real PR osac-project#174 shape), not just be dash/alnum text —
  an ordinary single-word prose label is no longer mistaken for a
  filename.

A directory-only bare path with none of those terminators is now simply
not recognized by category 3 at all (fail-safe by omission), rather than
attempting to bound an inherently ambiguous shape.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
Third security re-review pass found two CRITICAL gaps in the Phase B
logistics-only classifier: a bare `https?://\S+` matcher with the same
unbounded-suffix problem previously fixed for bare paths, and link-label
changes accepted merely because they looked filename-shaped (e.g. an
attacker-controlled label like "security-team-approved-merge-now.md").

Remove the bare-URL alternative entirely — no real golden fixture
(osac-project#168/osac-project#172/osac-project#173/osac-project#174) ever needs it; every https:// in real EP content
sits inside a markdown-link target or the allow-listed tracking-link
frontmatter field.

Replace shape-based label leniency with two-part provenance: a changed
link label is only safe when (1) the old/new targets resolve to an
exact (previous_filename, filename) pair GitHub reports as a real
rename in this same PR, AND (2) the new label matches that file's new
basename AND that basename is in a narrow allowlist of real EP document
names (README.md/prd.md/design.md). Rename provenance alone isn't
sufficient — the PR author controls the rename itself, so a legitimate
GitHub rename to an arbitrary filename followed by a "correct" relabel
would otherwise still pass. Verified against the real PR osac-project#174 fixture
that its sole label change (03-prd.md -> README.md) is backed by an
in-PR rename record; verified that markdown-link targets and bare
"/enhancements/..." paths must stay provenance-free, since osac-project#174 itself
contains cross-references to renames from earlier PRs with no
corroborating record in this PR's own file list.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…m list

Security preflight found that the "does this introduce a first-seen
reviewable EP identity" guard only special-cased status "added" and
"renamed", leaving GitHub's documented "copied" status (which can
introduce a first-seen reviewable path, e.g. via a copy with only a
narrow-safe tracking-link patch) as an unguarded bypass.

Replace the two ad hoc status checks with a structural invariant:
_introduces_new_reviewable_identity() treats "modified" (and a
same-basename "renamed", the PR osac-project#174 shape) as the only
identity-preserving transitions, and forces SUBSTANTIVE for every other
status — added, copied, changed, unchanged, removed, or any future
status this enum grows — when the basename is reviewable. This closes
the whole class in one pass instead of re-enumerating one status at a
time each review round.

Also import ep_paths.CANONICAL_FILENAMES directly instead of
maintaining an independent literal copy, per the review's non-blocking
drift-risk note — the two constants can no longer silently diverge.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…_LOGISTICS

Adds ep_classify.classify_logistics_only(), a per-file diff classifier that
recognizes three provably-safe shapes (pure rename, allow-listed frontmatter
field change, same-line link/path substitution) and falls back to
SUBSTANTIVE for anything else — "when in doubt, review." Widens
get_changed_files() to fetch status/previous_filename/patch per file
(Phase A's filename-only consumers are unaffected via filenames_only()).

Ships default-off: EP_REVIEW_SKIP_LOGISTICS=false means the classifier
runs and logs its verdict against every real PR, but the full review
pipeline always still runs — pure observability during burn-in, per the
frozen design's rollout plan. Wired the flag into ep-review.yml's
vars.EP_REVIEW_SKIP_LOGISTICS the same way EP_REVIEW_SHADOW already is,
so flipping it later needs only a repo variable change. When flipped on,
a LOGISTICS_ONLY verdict skips run_review() and posts
hooks.apply_logistics_comment()'s minimal comment instead.

Corrects a contradiction found in the frozen local design while
implementing it: an earlier draft forced SUBSTANTIVE whenever Phase A's
derive_feature_key reported PR-wide key ambiguity, which would have
wrongly failed PR osac-project#174 (a legitimate 16-file bulk rename touching 5
distinct Feature keys). Feature-key attribution and logistics
classification are separate concerns — classify_logistics_only doesn't
call derive_feature_key at all, and decides purely per-file. See the
"Correction" note added to .planning/OSAC-3416_DESIGN.md.

Golden-fixture tests (testdata/pr{168,172,173,174}_files.json, captured
from the real GitHub API) confirm osac-project#174 -> LOGISTICS_ONLY and
osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE, including osac-project#172's frontmatter-plus-prose-
rewrite case that guards against a naive "any frontmatter touched =>
skip" bug.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
Recovered findings from an interrupted `/code-review high` run on the
logistics-classifier work (commit 12ed080), each verified against actual
code/dependencies before fixing:

1. ticket never reached the real prompt/comment. agentic_ci.skill.run_skill
   only forwards its `ticket=` argument to pre_gates/context_writer/
   extension_config_writer — prompt_builder and label_applier only ever see
   **extra_kwargs, which excludes `ticket` since it's a named parameter of
   run_skill(), not a passthrough kwarg. Confirmed against both the
   installed agentic-ci 0.3.37 and the repo's floor (0.3.15): identical
   behavior in both. In production this meant build_prompt()/apply_labels()
   always rendered "Jira Feature key: could not be determined" and empty
   structural notes, even when derive_feature_key() worked correctly.
   Fixed at the ep_skill_config.py seam: prompt_builder/label_applier are
   now wrapped to rename a second `osac_ticket=` kwarg (which *does* survive
   into **extra_kwargs) back to `ticket`, so ep_hooks.py's public method
   signatures are untouched. Added
   test_ep_review.py::RunReviewRealSeamTests, which drives the real
   agentic_ci.skill.run_skill (container execution faked out) instead of
   calling EPHooks.build_prompt()/apply_labels() directly — proven to fail
   against the pre-fix code.

2. Frontmatter false positive in ep_classify._hunk_is_safe. An allow-listed
   field (e.g. last-updated) edited earlier in a hunk left its field name
   "sticky" for the rest of the hunk, so an unrelated real content change
   later in the *same* hunk — even past the closing `---` — was wrongly
   treated as another safe frontmatter edit. Fixed by resetting the tracked
   field at the frontmatter delimiter. Verified the fix doesn't regress the
   legitimate multi-line YAML continuation shapes real PR osac-project#174 relies on
   (e.g. `tracking-link:\n  - <url>`), which need the field-tracking to
   survive across a value's continuation lines.

3. Logistics-only path skipped same-SHA dedup. The EP_REVIEW_SKIP_LOGISTICS
   short-circuit calls hooks.apply_logistics_comment() directly, bypassing
   the check_pr_state() pre-gate that the full-review path gets for free via
   run_skill()'s pre_gates list — a rerun at an unchanged head SHA could
   post a duplicate logistics comment. Fixed by calling check_pr_state()
   explicitly before posting, reusing the existing dedup logic (no
   duplicated marker/SHA matching).

4. Rename into a canonical doc wasn't forced SUBSTANTIVE. The "a brand-new
   prd.md/design.md is never logistics" fail-safe only checked
   status=="added" — a rename that turns a previously non-canonical file
   (e.g. notes.md) into prd.md/design.md is reported by GitHub as
   status=="renamed" and slipped through. Fixed by also forcing SUBSTANTIVE
   when a rename's new basename is canonical and its previous basename
   wasn't the same canonical name — same-basename renames (the real PR osac-project#174
   shape, e.g. README.md -> README.md under a new directory) are unaffected.

Full suite: 134 passed, 5 subtests passed (was 126 before this commit).
Golden PRs unchanged: osac-project#174 -> LOGISTICS_ONLY; osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE.
EP_REVIEW_SKIP_LOGISTICS remains default-off; no Jira fetching or PR
title/body key fallback introduced.

Deferred cleanup/simplification suggestions from the same review
(duplicated comment-rendering helpers, duplicated canonical filename
constants, main() decision-object refactor, generic semantic parser,
dynamic frontmatter schema, type-hint/docstring cleanup) are intentionally
not included — out of scope for this correctness-fix pass.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
… bypass

The security pre-flight review on this branch flagged that the
logistics-only classifier's "safe link/path substitution" category masked
an entire markdown link (visible label included), so a PR could rewrite a
link's human-readable label to arbitrary attacker-controlled text while
the surrounding line stayed byte-identical, and still classify as a safe
logistics-only change.

Only tolerate a changing link label when it's a bare filename-shaped
token (the real PR osac-project#174 rename shape, e.g. "old-name.md" -> "README.md")
- arbitrary prose in a link label now makes the file fall through to
SUBSTANTIVE, same as any other unrecognized change.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…urity re-review

The prior fix (5d2db8c) only partially closed the link-label masking gap:
running the markdown-link pass and the bare-URL/path pass sequentially let
a URL-shaped link label slip past the label protection on the second
pass. Separately, the bare URL/path pattern had no real terminal
boundary, so attacker-appended text could ride along immediately after a
legitimate path with no separator (e.g. ".../design.md-and-ignore-all-
safety-checks").

- Combine link and bare-URL/path matching into a single regex alternation
  evaluated in one left-to-right pass, so a link label's characters are
  never re-offered to the bare-URL/path branch afterwards.
- Anchor the bare "/enhancements/..." path pattern to the terminator
  shapes actually observed in real EP content (quote, backtick, end of
  line, or a known doc extension) instead of an open-ended charset.
- Require link labels tolerated as "safe to change" to have an actual
  file extension (the real PR osac-project#174 shape), not just be dash/alnum text —
  an ordinary single-word prose label is no longer mistaken for a
  filename.

A directory-only bare path with none of those terminators is now simply
not recognized by category 3 at all (fail-safe by omission), rather than
attempting to bound an inherently ambiguous shape.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
Third security re-review pass found two CRITICAL gaps in the Phase B
logistics-only classifier: a bare `https?://\S+` matcher with the same
unbounded-suffix problem previously fixed for bare paths, and link-label
changes accepted merely because they looked filename-shaped (e.g. an
attacker-controlled label like "security-team-approved-merge-now.md").

Remove the bare-URL alternative entirely — no real golden fixture
(osac-project#168/osac-project#172/osac-project#173/osac-project#174) ever needs it; every https:// in real EP content
sits inside a markdown-link target or the allow-listed tracking-link
frontmatter field.

Replace shape-based label leniency with two-part provenance: a changed
link label is only safe when (1) the old/new targets resolve to an
exact (previous_filename, filename) pair GitHub reports as a real
rename in this same PR, AND (2) the new label matches that file's new
basename AND that basename is in a narrow allowlist of real EP document
names (README.md/prd.md/design.md). Rename provenance alone isn't
sufficient — the PR author controls the rename itself, so a legitimate
GitHub rename to an arbitrary filename followed by a "correct" relabel
would otherwise still pass. Verified against the real PR osac-project#174 fixture
that its sole label change (03-prd.md -> README.md) is backed by an
in-PR rename record; verified that markdown-link targets and bare
"/enhancements/..." paths must stay provenance-free, since osac-project#174 itself
contains cross-references to renames from earlier PRs with no
corroborating record in this PR's own file list.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…m list

Security preflight found that the "does this introduce a first-seen
reviewable EP identity" guard only special-cased status "added" and
"renamed", leaving GitHub's documented "copied" status (which can
introduce a first-seen reviewable path, e.g. via a copy with only a
narrow-safe tracking-link patch) as an unguarded bypass.

Replace the two ad hoc status checks with a structural invariant:
_introduces_new_reviewable_identity() treats "modified" (and a
same-basename "renamed", the PR osac-project#174 shape) as the only
identity-preserving transitions, and forces SUBSTANTIVE for every other
status — added, copied, changed, unchanged, removed, or any future
status this enum grows — when the basename is reviewable. This closes
the whole class in one pass instead of re-enumerating one status at a
time each review round.

Also import ep_paths.CANONICAL_FILENAMES directly instead of
maintaining an independent literal copy, per the review's non-blocking
drift-risk note — the two constants can no longer silently diverge.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
…the final field

PR review (ItzikEzra-rh) found HIGH: the allow-listed-frontmatter
shortcut in _hunk_is_safe decided from the change group's FINAL field
state only, via _update_frontmatter_field's context-line-oriented
leniency (it leaves the field unchanged for any line that isn't itself
a recognized `key:` or the `---` delimiter, to support real YAML
continuations like `  - value`). That same leniency let an unrelated,
unindented prose line silently "inherit" whatever field was last
tracked, so a contiguous +/- group (no separating context line) ending
on an allow-listed last-updated/tracking-link line waved through
arbitrary injected or deleted prose earlier in the same group.

Track a sticky group_all_safe flag and verify every changed line
individually: a continuation is only trusted when it's indented (real
YAML list/wrapped-value shape) AND a field is already tracked; anything
else (unindented, non-key, non-delimiter) breaks the chain to None,
which can never be allow-listed. Sticky means a later line
re-establishing a valid key can't retroactively excuse an earlier
unsafe line in the same group. Legitimate multi-line YAML continuation
behavior (PR osac-project#174's tracking-link list-item edits) is unaffected, since
those continuation lines are indented and never break the chain.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 20, 2026
PR review (tchughesiv) noted a remaining nit: markdown-link targets
were treated as "always safe to change" even when the label stayed
identical, so a same-label retarget to an arbitrary external URL
classified LOGISTICS_ONLY unconditionally. The target isn't rendered
as visible text, but it's still where a reader ends up navigating to,
so an external retarget is its own attacker-controlled-destination
risk independent of the label check.

Add _target_is_repo_local: whenever a markdown-link target actually
changes, both the old and new target must be one of the shapes real
PR osac-project#174 evidence needs — a bare "/enhancements/..." path, a GitHub
blob URL for this exact repo, or a relative repo path with no URI
scheme and no other absolute-path prefix. An unchanged target is never
re-validated, so an already-external link elsewhere on the same line
(e.g. osac-project#174's cross-repo applyFieldDefinitions() link) is unaffected.
Rename-pair provenance for labels is unchanged; this is an additional,
independent check specifically for the target's destination.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
…_LOGISTICS

Adds ep_classify.classify_logistics_only(), a per-file diff classifier that
recognizes three provably-safe shapes (pure rename, allow-listed frontmatter
field change, same-line link/path substitution) and falls back to
SUBSTANTIVE for anything else — "when in doubt, review." Widens
get_changed_files() to fetch status/previous_filename/patch per file
(Phase A's filename-only consumers are unaffected via filenames_only()).

Ships default-off: EP_REVIEW_SKIP_LOGISTICS=false means the classifier
runs and logs its verdict against every real PR, but the full review
pipeline always still runs — pure observability during burn-in, per the
frozen design's rollout plan. Wired the flag into ep-review.yml's
vars.EP_REVIEW_SKIP_LOGISTICS the same way EP_REVIEW_SHADOW already is,
so flipping it later needs only a repo variable change. When flipped on,
a LOGISTICS_ONLY verdict skips run_review() and posts
hooks.apply_logistics_comment()'s minimal comment instead.

Corrects a contradiction found in the frozen local design while
implementing it: an earlier draft forced SUBSTANTIVE whenever Phase A's
derive_feature_key reported PR-wide key ambiguity, which would have
wrongly failed PR osac-project#174 (a legitimate 16-file bulk rename touching 5
distinct Feature keys). Feature-key attribution and logistics
classification are separate concerns — classify_logistics_only doesn't
call derive_feature_key at all, and decides purely per-file. See the
"Correction" note added to .planning/OSAC-3416_DESIGN.md.

Golden-fixture tests (testdata/pr{168,172,173,174}_files.json, captured
from the real GitHub API) confirm osac-project#174 -> LOGISTICS_ONLY and
osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE, including osac-project#172's frontmatter-plus-prose-
rewrite case that guards against a naive "any frontmatter touched =>
skip" bug.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
Recovered findings from an interrupted `/code-review high` run on the
logistics-classifier work (commit 12ed080), each verified against actual
code/dependencies before fixing:

1. ticket never reached the real prompt/comment. agentic_ci.skill.run_skill
   only forwards its `ticket=` argument to pre_gates/context_writer/
   extension_config_writer — prompt_builder and label_applier only ever see
   **extra_kwargs, which excludes `ticket` since it's a named parameter of
   run_skill(), not a passthrough kwarg. Confirmed against both the
   installed agentic-ci 0.3.37 and the repo's floor (0.3.15): identical
   behavior in both. In production this meant build_prompt()/apply_labels()
   always rendered "Jira Feature key: could not be determined" and empty
   structural notes, even when derive_feature_key() worked correctly.
   Fixed at the ep_skill_config.py seam: prompt_builder/label_applier are
   now wrapped to rename a second `osac_ticket=` kwarg (which *does* survive
   into **extra_kwargs) back to `ticket`, so ep_hooks.py's public method
   signatures are untouched. Added
   test_ep_review.py::RunReviewRealSeamTests, which drives the real
   agentic_ci.skill.run_skill (container execution faked out) instead of
   calling EPHooks.build_prompt()/apply_labels() directly — proven to fail
   against the pre-fix code.

2. Frontmatter false positive in ep_classify._hunk_is_safe. An allow-listed
   field (e.g. last-updated) edited earlier in a hunk left its field name
   "sticky" for the rest of the hunk, so an unrelated real content change
   later in the *same* hunk — even past the closing `---` — was wrongly
   treated as another safe frontmatter edit. Fixed by resetting the tracked
   field at the frontmatter delimiter. Verified the fix doesn't regress the
   legitimate multi-line YAML continuation shapes real PR osac-project#174 relies on
   (e.g. `tracking-link:\n  - <url>`), which need the field-tracking to
   survive across a value's continuation lines.

3. Logistics-only path skipped same-SHA dedup. The EP_REVIEW_SKIP_LOGISTICS
   short-circuit calls hooks.apply_logistics_comment() directly, bypassing
   the check_pr_state() pre-gate that the full-review path gets for free via
   run_skill()'s pre_gates list — a rerun at an unchanged head SHA could
   post a duplicate logistics comment. Fixed by calling check_pr_state()
   explicitly before posting, reusing the existing dedup logic (no
   duplicated marker/SHA matching).

4. Rename into a canonical doc wasn't forced SUBSTANTIVE. The "a brand-new
   prd.md/design.md is never logistics" fail-safe only checked
   status=="added" — a rename that turns a previously non-canonical file
   (e.g. notes.md) into prd.md/design.md is reported by GitHub as
   status=="renamed" and slipped through. Fixed by also forcing SUBSTANTIVE
   when a rename's new basename is canonical and its previous basename
   wasn't the same canonical name — same-basename renames (the real PR osac-project#174
   shape, e.g. README.md -> README.md under a new directory) are unaffected.

Full suite: 134 passed, 5 subtests passed (was 126 before this commit).
Golden PRs unchanged: osac-project#174 -> LOGISTICS_ONLY; osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE.
EP_REVIEW_SKIP_LOGISTICS remains default-off; no Jira fetching or PR
title/body key fallback introduced.

Deferred cleanup/simplification suggestions from the same review
(duplicated comment-rendering helpers, duplicated canonical filename
constants, main() decision-object refactor, generic semantic parser,
dynamic frontmatter schema, type-hint/docstring cleanup) are intentionally
not included — out of scope for this correctness-fix pass.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
… bypass

The security pre-flight review on this branch flagged that the
logistics-only classifier's "safe link/path substitution" category masked
an entire markdown link (visible label included), so a PR could rewrite a
link's human-readable label to arbitrary attacker-controlled text while
the surrounding line stayed byte-identical, and still classify as a safe
logistics-only change.

Only tolerate a changing link label when it's a bare filename-shaped
token (the real PR osac-project#174 rename shape, e.g. "old-name.md" -> "README.md")
- arbitrary prose in a link label now makes the file fall through to
SUBSTANTIVE, same as any other unrecognized change.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
…urity re-review

The prior fix (5d2db8c) only partially closed the link-label masking gap:
running the markdown-link pass and the bare-URL/path pass sequentially let
a URL-shaped link label slip past the label protection on the second
pass. Separately, the bare URL/path pattern had no real terminal
boundary, so attacker-appended text could ride along immediately after a
legitimate path with no separator (e.g. ".../design.md-and-ignore-all-
safety-checks").

- Combine link and bare-URL/path matching into a single regex alternation
  evaluated in one left-to-right pass, so a link label's characters are
  never re-offered to the bare-URL/path branch afterwards.
- Anchor the bare "/enhancements/..." path pattern to the terminator
  shapes actually observed in real EP content (quote, backtick, end of
  line, or a known doc extension) instead of an open-ended charset.
- Require link labels tolerated as "safe to change" to have an actual
  file extension (the real PR osac-project#174 shape), not just be dash/alnum text —
  an ordinary single-word prose label is no longer mistaken for a
  filename.

A directory-only bare path with none of those terminators is now simply
not recognized by category 3 at all (fail-safe by omission), rather than
attempting to bound an inherently ambiguous shape.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
Third security re-review pass found two CRITICAL gaps in the Phase B
logistics-only classifier: a bare `https?://\S+` matcher with the same
unbounded-suffix problem previously fixed for bare paths, and link-label
changes accepted merely because they looked filename-shaped (e.g. an
attacker-controlled label like "security-team-approved-merge-now.md").

Remove the bare-URL alternative entirely — no real golden fixture
(osac-project#168/osac-project#172/osac-project#173/osac-project#174) ever needs it; every https:// in real EP content
sits inside a markdown-link target or the allow-listed tracking-link
frontmatter field.

Replace shape-based label leniency with two-part provenance: a changed
link label is only safe when (1) the old/new targets resolve to an
exact (previous_filename, filename) pair GitHub reports as a real
rename in this same PR, AND (2) the new label matches that file's new
basename AND that basename is in a narrow allowlist of real EP document
names (README.md/prd.md/design.md). Rename provenance alone isn't
sufficient — the PR author controls the rename itself, so a legitimate
GitHub rename to an arbitrary filename followed by a "correct" relabel
would otherwise still pass. Verified against the real PR osac-project#174 fixture
that its sole label change (03-prd.md -> README.md) is backed by an
in-PR rename record; verified that markdown-link targets and bare
"/enhancements/..." paths must stay provenance-free, since osac-project#174 itself
contains cross-references to renames from earlier PRs with no
corroborating record in this PR's own file list.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
…m list

Security preflight found that the "does this introduce a first-seen
reviewable EP identity" guard only special-cased status "added" and
"renamed", leaving GitHub's documented "copied" status (which can
introduce a first-seen reviewable path, e.g. via a copy with only a
narrow-safe tracking-link patch) as an unguarded bypass.

Replace the two ad hoc status checks with a structural invariant:
_introduces_new_reviewable_identity() treats "modified" (and a
same-basename "renamed", the PR osac-project#174 shape) as the only
identity-preserving transitions, and forces SUBSTANTIVE for every other
status — added, copied, changed, unchanged, removed, or any future
status this enum grows — when the basename is reviewable. This closes
the whole class in one pass instead of re-enumerating one status at a
time each review round.

Also import ep_paths.CANONICAL_FILENAMES directly instead of
maintaining an independent literal copy, per the review's non-blocking
drift-risk note — the two constants can no longer silently diverge.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
…the final field

PR review (ItzikEzra-rh) found HIGH: the allow-listed-frontmatter
shortcut in _hunk_is_safe decided from the change group's FINAL field
state only, via _update_frontmatter_field's context-line-oriented
leniency (it leaves the field unchanged for any line that isn't itself
a recognized `key:` or the `---` delimiter, to support real YAML
continuations like `  - value`). That same leniency let an unrelated,
unindented prose line silently "inherit" whatever field was last
tracked, so a contiguous +/- group (no separating context line) ending
on an allow-listed last-updated/tracking-link line waved through
arbitrary injected or deleted prose earlier in the same group.

Track a sticky group_all_safe flag and verify every changed line
individually: a continuation is only trusted when it's indented (real
YAML list/wrapped-value shape) AND a field is already tracked; anything
else (unindented, non-key, non-delimiter) breaks the chain to None,
which can never be allow-listed. Sticky means a later line
re-establishing a valid key can't retroactively excuse an earlier
unsafe line in the same group. Legitimate multi-line YAML continuation
behavior (PR osac-project#174's tracking-link list-item edits) is unaffected, since
those continuation lines are indented and never break the chain.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
omerough added a commit to omerough/enhancement-proposals that referenced this pull request Aug 25, 2026
PR review (tchughesiv) noted a remaining nit: markdown-link targets
were treated as "always safe to change" even when the label stayed
identical, so a same-label retarget to an arbitrary external URL
classified LOGISTICS_ONLY unconditionally. The target isn't rendered
as visible text, but it's still where a reader ends up navigating to,
so an external retarget is its own attacker-controlled-destination
risk independent of the label check.

Add _target_is_repo_local: whenever a markdown-link target actually
changes, both the old and new target must be one of the shapes real
PR osac-project#174 evidence needs — a bare "/enhancements/..." path, a GitHub
blob URL for this exact repo, or a relative repo path with no URI
scheme and no other absolute-path prefix. An unchanged target is never
re-validated, so an already-external link elsewhere on the same line
(e.g. osac-project#174's cross-repo applyFieldDefinitions() link) is unaffected.
Rename-pair provenance for labels is unchanged; this is an additional,
independent check specifically for the target's destination.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
…_LOGISTICS

Adds ep_classify.classify_logistics_only(), a per-file diff classifier that
recognizes three provably-safe shapes (pure rename, allow-listed frontmatter
field change, same-line link/path substitution) and falls back to
SUBSTANTIVE for anything else — "when in doubt, review." Widens
get_changed_files() to fetch status/previous_filename/patch per file
(Phase A's filename-only consumers are unaffected via filenames_only()).

Ships default-off: EP_REVIEW_SKIP_LOGISTICS=false means the classifier
runs and logs its verdict against every real PR, but the full review
pipeline always still runs — pure observability during burn-in, per the
frozen design's rollout plan. Wired the flag into ep-review.yml's
vars.EP_REVIEW_SKIP_LOGISTICS the same way EP_REVIEW_SHADOW already is,
so flipping it later needs only a repo variable change. When flipped on,
a LOGISTICS_ONLY verdict skips run_review() and posts
hooks.apply_logistics_comment()'s minimal comment instead.

Corrects a contradiction found in the frozen local design while
implementing it: an earlier draft forced SUBSTANTIVE whenever Phase A's
derive_feature_key reported PR-wide key ambiguity, which would have
wrongly failed PR osac-project#174 (a legitimate 16-file bulk rename touching 5
distinct Feature keys). Feature-key attribution and logistics
classification are separate concerns — classify_logistics_only doesn't
call derive_feature_key at all, and decides purely per-file. See the
"Correction" note added to .planning/OSAC-3416_DESIGN.md.

Golden-fixture tests (testdata/pr{168,172,173,174}_files.json, captured
from the real GitHub API) confirm osac-project#174 -> LOGISTICS_ONLY and
osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE, including osac-project#172's frontmatter-plus-prose-
rewrite case that guards against a naive "any frontmatter touched =>
skip" bug.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
Recovered findings from an interrupted `/code-review high` run on the
logistics-classifier work (commit 12ed080), each verified against actual
code/dependencies before fixing:

1. ticket never reached the real prompt/comment. agentic_ci.skill.run_skill
   only forwards its `ticket=` argument to pre_gates/context_writer/
   extension_config_writer — prompt_builder and label_applier only ever see
   **extra_kwargs, which excludes `ticket` since it's a named parameter of
   run_skill(), not a passthrough kwarg. Confirmed against both the
   installed agentic-ci 0.3.37 and the repo's floor (0.3.15): identical
   behavior in both. In production this meant build_prompt()/apply_labels()
   always rendered "Jira Feature key: could not be determined" and empty
   structural notes, even when derive_feature_key() worked correctly.
   Fixed at the ep_skill_config.py seam: prompt_builder/label_applier are
   now wrapped to rename a second `osac_ticket=` kwarg (which *does* survive
   into **extra_kwargs) back to `ticket`, so ep_hooks.py's public method
   signatures are untouched. Added
   test_ep_review.py::RunReviewRealSeamTests, which drives the real
   agentic_ci.skill.run_skill (container execution faked out) instead of
   calling EPHooks.build_prompt()/apply_labels() directly — proven to fail
   against the pre-fix code.

2. Frontmatter false positive in ep_classify._hunk_is_safe. An allow-listed
   field (e.g. last-updated) edited earlier in a hunk left its field name
   "sticky" for the rest of the hunk, so an unrelated real content change
   later in the *same* hunk — even past the closing `---` — was wrongly
   treated as another safe frontmatter edit. Fixed by resetting the tracked
   field at the frontmatter delimiter. Verified the fix doesn't regress the
   legitimate multi-line YAML continuation shapes real PR osac-project#174 relies on
   (e.g. `tracking-link:\n  - <url>`), which need the field-tracking to
   survive across a value's continuation lines.

3. Logistics-only path skipped same-SHA dedup. The EP_REVIEW_SKIP_LOGISTICS
   short-circuit calls hooks.apply_logistics_comment() directly, bypassing
   the check_pr_state() pre-gate that the full-review path gets for free via
   run_skill()'s pre_gates list — a rerun at an unchanged head SHA could
   post a duplicate logistics comment. Fixed by calling check_pr_state()
   explicitly before posting, reusing the existing dedup logic (no
   duplicated marker/SHA matching).

4. Rename into a canonical doc wasn't forced SUBSTANTIVE. The "a brand-new
   prd.md/design.md is never logistics" fail-safe only checked
   status=="added" — a rename that turns a previously non-canonical file
   (e.g. notes.md) into prd.md/design.md is reported by GitHub as
   status=="renamed" and slipped through. Fixed by also forcing SUBSTANTIVE
   when a rename's new basename is canonical and its previous basename
   wasn't the same canonical name — same-basename renames (the real PR osac-project#174
   shape, e.g. README.md -> README.md under a new directory) are unaffected.

Full suite: 134 passed, 5 subtests passed (was 126 before this commit).
Golden PRs unchanged: osac-project#174 -> LOGISTICS_ONLY; osac-project#168/osac-project#172/osac-project#173 -> SUBSTANTIVE.
EP_REVIEW_SKIP_LOGISTICS remains default-off; no Jira fetching or PR
title/body key fallback introduced.

Deferred cleanup/simplification suggestions from the same review
(duplicated comment-rendering helpers, duplicated canonical filename
constants, main() decision-object refactor, generic semantic parser,
dynamic frontmatter schema, type-hint/docstring cleanup) are intentionally
not included — out of scope for this correctness-fix pass.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
… bypass

The security pre-flight review on this branch flagged that the
logistics-only classifier's "safe link/path substitution" category masked
an entire markdown link (visible label included), so a PR could rewrite a
link's human-readable label to arbitrary attacker-controlled text while
the surrounding line stayed byte-identical, and still classify as a safe
logistics-only change.

Only tolerate a changing link label when it's a bare filename-shaped
token (the real PR osac-project#174 rename shape, e.g. "old-name.md" -> "README.md")
- arbitrary prose in a link label now makes the file fall through to
SUBSTANTIVE, same as any other unrecognized change.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
…urity re-review

The prior fix (5d2db8c) only partially closed the link-label masking gap:
running the markdown-link pass and the bare-URL/path pass sequentially let
a URL-shaped link label slip past the label protection on the second
pass. Separately, the bare URL/path pattern had no real terminal
boundary, so attacker-appended text could ride along immediately after a
legitimate path with no separator (e.g. ".../design.md-and-ignore-all-
safety-checks").

- Combine link and bare-URL/path matching into a single regex alternation
  evaluated in one left-to-right pass, so a link label's characters are
  never re-offered to the bare-URL/path branch afterwards.
- Anchor the bare "/enhancements/..." path pattern to the terminator
  shapes actually observed in real EP content (quote, backtick, end of
  line, or a known doc extension) instead of an open-ended charset.
- Require link labels tolerated as "safe to change" to have an actual
  file extension (the real PR osac-project#174 shape), not just be dash/alnum text —
  an ordinary single-word prose label is no longer mistaken for a
  filename.

A directory-only bare path with none of those terminators is now simply
not recognized by category 3 at all (fail-safe by omission), rather than
attempting to bound an inherently ambiguous shape.

EP_REVIEW_SKIP_LOGISTICS still defaults to false, so this closes a latent
gap rather than an active one.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
Third security re-review pass found two CRITICAL gaps in the Phase B
logistics-only classifier: a bare `https?://\S+` matcher with the same
unbounded-suffix problem previously fixed for bare paths, and link-label
changes accepted merely because they looked filename-shaped (e.g. an
attacker-controlled label like "security-team-approved-merge-now.md").

Remove the bare-URL alternative entirely — no real golden fixture
(osac-project#168/osac-project#172/osac-project#173/osac-project#174) ever needs it; every https:// in real EP content
sits inside a markdown-link target or the allow-listed tracking-link
frontmatter field.

Replace shape-based label leniency with two-part provenance: a changed
link label is only safe when (1) the old/new targets resolve to an
exact (previous_filename, filename) pair GitHub reports as a real
rename in this same PR, AND (2) the new label matches that file's new
basename AND that basename is in a narrow allowlist of real EP document
names (README.md/prd.md/design.md). Rename provenance alone isn't
sufficient — the PR author controls the rename itself, so a legitimate
GitHub rename to an arbitrary filename followed by a "correct" relabel
would otherwise still pass. Verified against the real PR osac-project#174 fixture
that its sole label change (03-prd.md -> README.md) is backed by an
in-PR rename record; verified that markdown-link targets and bare
"/enhancements/..." paths must stay provenance-free, since osac-project#174 itself
contains cross-references to renames from earlier PRs with no
corroborating record in this PR's own file list.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
…m list

Security preflight found that the "does this introduce a first-seen
reviewable EP identity" guard only special-cased status "added" and
"renamed", leaving GitHub's documented "copied" status (which can
introduce a first-seen reviewable path, e.g. via a copy with only a
narrow-safe tracking-link patch) as an unguarded bypass.

Replace the two ad hoc status checks with a structural invariant:
_introduces_new_reviewable_identity() treats "modified" (and a
same-basename "renamed", the PR osac-project#174 shape) as the only
identity-preserving transitions, and forces SUBSTANTIVE for every other
status — added, copied, changed, unchanged, removed, or any future
status this enum grows — when the basename is reviewable. This closes
the whole class in one pass instead of re-enumerating one status at a
time each review round.

Also import ep_paths.CANONICAL_FILENAMES directly instead of
maintaining an independent literal copy, per the review's non-blocking
drift-risk note — the two constants can no longer silently diverge.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
…the final field

PR review (ItzikEzra-rh) found HIGH: the allow-listed-frontmatter
shortcut in _hunk_is_safe decided from the change group's FINAL field
state only, via _update_frontmatter_field's context-line-oriented
leniency (it leaves the field unchanged for any line that isn't itself
a recognized `key:` or the `---` delimiter, to support real YAML
continuations like `  - value`). That same leniency let an unrelated,
unindented prose line silently "inherit" whatever field was last
tracked, so a contiguous +/- group (no separating context line) ending
on an allow-listed last-updated/tracking-link line waved through
arbitrary injected or deleted prose earlier in the same group.

Track a sticky group_all_safe flag and verify every changed line
individually: a continuation is only trusted when it's indented (real
YAML list/wrapped-value shape) AND a field is already tracked; anything
else (unindented, non-key, non-delimiter) breaks the chain to None,
which can never be allow-listed. Sticky means a later line
re-establishing a valid key can't retroactively excuse an earlier
unsafe line in the same group. Legitimate multi-line YAML continuation
behavior (PR osac-project#174's tracking-link list-item edits) is unaffected, since
those continuation lines are indented and never break the chain.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 31, 2026
PR review (tchughesiv) noted a remaining nit: markdown-link targets
were treated as "always safe to change" even when the label stayed
identical, so a same-label retarget to an arbitrary external URL
classified LOGISTICS_ONLY unconditionally. The target isn't rendered
as visible text, but it's still where a reader ends up navigating to,
so an external retarget is its own attacker-controlled-destination
risk independent of the label check.

Add _target_is_repo_local: whenever a markdown-link target actually
changes, both the old and new target must be one of the shapes real
PR osac-project#174 evidence needs — a bare "/enhancements/..." path, a GitHub
blob URL for this exact repo, or a relative repo path with no URI
scheme and no other absolute-path prefix. An unchanged target is never
re-validated, so an already-external link elsewhere on the same line
(e.g. osac-project#174's cross-repo applyFieldDefinitions() link) is unaffected.
Rename-pair provenance for labels is unchanged; this is an additional,
independent check specifically for the target's destination.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Omer Avi <omeravi23@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants