feat(scanner): structural analyzer for Actions poll bounds - #1133
feat(scanner): structural analyzer for Actions poll bounds#1133seonghobae wants to merge 4 commits into
Conversation
Add failing regressions for a loop-local GitHub Actions + shell control-flow analyzer so transport-only poll bounds cannot borrow helper, sibling, reversed, or unreachable safety.
Classify conventional GitHub Actions while-polls by causal control flow so a transport-failure budget cannot stand in for a total bound.
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary: - Snapshot 06:01 UTC records Draft #1133 `529ecb0` stacked on #1088. - ADR-0009 remains Proposed; regex detector IDs stay migration oracles. Rationale: - #999 is the single writer of the product-technical gap baseline. - Analyzer-only slice is not protected scanner emission. Tests: - documentation-only; analyzer evidence lives on #1133
Measure 100% statement and branch coverage of appguardrail_core/actions_poll_analyzer.py on stacked PR heads. Issues 1087 and 1088 stay open. The analyzer is not hooked into _scan_file, and regex YAML is unchanged.
|
Added a dedicated exact-head coverage workflow at It checks out this stacked head and measures 100% statement and branch coverage of Concurrency is Issues 1087 and 1088 stay open. This does not retarget off 1088, does not hook |
|
Follow-up evidence, not approval. Exact head is now Stay Draft. Do not Close #1087 or #1088. Do not hook |
Summary: - Snapshot 06:16 UTC records #1133 `5baeab9` with actions-poll-analyzer-coverage and a queued exact-head job. - Hosted coverage is queued, not claimed GREEN. Rationale: - Stacked PRs targeting #1088 do not inherit develop-only coverage workflows. The PR-number-bound job is the exact-head evidence path. Tests: - documentation-only; analyzer coverage evidence lives on #1133
Summary: - Snapshot 07:21 UTC records Draft #1134 `4404840` stacked on #1129. - Inventory is evidence, not permission; undeclared executables fail admission. Hosted #1133 coverage remains queued, not GREEN. Rationale: - #999 is the single writer of the product-technical gap baseline. - #1099 remaining surfaces stay on stacked successors, not Close. Tests: - documentation-only; detector evidence lives on #1134 (638/638)
Summary: - Snapshot 08:25 UTC records Draft #1135 `81e83f4` stacked on #1134. - Archive path traversal and unadmitted submodules fail closed. - #1134 restack head is `0cd4329`; #1133 coverage remains queued. Rationale: - #999 is the single writer of the product-technical gap baseline. - #1099 remaining surfaces stay on stacked successors, not Close. Tests: - documentation-only; detector evidence lives on #1135 (997/997)
|
Stacked successor Draft #1152 ( It preserves detector IDs |
Summary: - Snapshot 15:28 UTC records Draft #1151 `822ca12` on #1150 and Draft #1152 `255cfd8` on #1133. - `_scan_file` emits poll analyzer findings once per (rule_id, file). - Deceptive read-only descriptions fail closed when inventory shows write or egress. Rationale: - #999 is the single writer of the product-technical gap baseline. - G-06 emission waited on #1133 exact-head coverage SUCCESS. Tests: - documentation-only; evidence lives on #1151 (1560/1560) and #1152 (417/417 analyzer statements)
Successor of #1088. This stacked G-06 slice adds a bounded structural GitHub Actions + shell control-flow analyzer without replacing the packaged regex family.
It preserves detector IDs
github-actions-transport-only-poll-boundandgithub-actions-transport-failure-budget-poll-boundand all existing regex corpus as migration oracles.This pull request does not Close #1087 or #1088. ADR-0009 Status is Proposed.
What this adds
classify_poll_loops(workflow_text)inappguardrail_core/actions_poll_analyzer.py-gt/-geand statically positive owning-jobtimeout-minutes/${{ N }}are total bounds; reversed, unreachable, zero/negative/dynamic, and quoted/comment text are not_scan_fileVerification
Focused tests:
tests/test_actions_poll_structural_analyzer.py,tests/test_github_actions_poll_bound_control_flow_regression.py,tests/test_github_actions_poll_bounds.py.