t1412.11: Per-repo security posture in aidevops init#3628
Conversation
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds severity constants and JSON/info finding tracking to the security posture helper, paginates collaborator fetch via Changes
Sequence Diagram(s)sequenceDiagram
participant User as User
participant CLI as aidevops CLI
participant Scaffold as scaffold_agents_md
participant Posture as .agents/security-posture-helper.sh
participant GH as GitHub API
participant FS as Filesystem
User->>CLI: run `aidevops init`
CLI->>Scaffold: scaffold_agents_md(project_root)
Scaffold->>Posture: request Security section content / posture scan
Posture->>GH: gh api --paginate collaborators & repo checks
GH-->>Posture: collaborator data & API responses
Posture->>FS: write findings to `.aidevops.json`
Scaffold->>FS: create/update `.agents/AGENTS.md` and root `AGENTS.md`
CLI-->>User: init complete (AGENTS.md updated, posture stored)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Suggested labels
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Sat Mar 7 20:58:19 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
|
@coderabbitai review Review bots were rate-limited when this PR was created (affected: coderabbitai gemini-code-assist). Requesting a review retry. |
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
🧠 Learnings used✅ Actions performedReview triggered.
|
|
This PR appears orphaned — no active worker process found and no activity for 7+ hours. Flagging for re-dispatch. |
d71e1ec to
b3bd121
Compare
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Sun Mar 8 11:56:39 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
aidevops.sh (1)
1470-1472: Consider backfilling the Security section for older repos.This only creates
.agents/AGENTS.mdwhen it is missing, so re-runningaidevops init securityon an already-initialized repo keeps the old instructions. An idempotent merge/update step would make the new security guidance the actual repo source of truth.Based on learnings "All instructions, documentation, and operational guidance should be maintained in AGENTS.md as the single source of truth".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@aidevops.sh` around lines 1470 - 1472, The current logic only creates .agents/AGENTS.md when missing (scaffold_agents_md "$project_root"), leaving older docs unchanged; change the init path so that running "aidevops init security" updates/merges the Security section into an existing .agents/AGENTS.md instead of skipping it: call or extend scaffold_agents_md (or add a new merge_agents_md function) to perform an idempotent merge/update of the Security section into "$project_root/.agents/AGENTS.md" (preserving existing custom content outside the Security section) and log whether it created or updated the file (keep print_success messages for both create and update).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@aidevops.sh`:
- Around line 1402-1410: The .features object is missing a boolean entry for
sops so re-registering from .aidevops.json will drop SOPS; add a "sops":
$enable_sops entry to the same object where "beads" is defined (mirror the
pattern used for "beads" and other features), ensuring proper JSON
commas/structure and that the variable name $enable_sops is used so downstream
code that reads .features (the consumers of the "sops" flag) will correctly see
SOPS enabled.
---
Nitpick comments:
In `@aidevops.sh`:
- Around line 1470-1472: The current logic only creates .agents/AGENTS.md when
missing (scaffold_agents_md "$project_root"), leaving older docs unchanged;
change the init path so that running "aidevops init security" updates/merges the
Security section into an existing .agents/AGENTS.md instead of skipping it: call
or extend scaffold_agents_md (or add a new merge_agents_md function) to perform
an idempotent merge/update of the Security section into
"$project_root/.agents/AGENTS.md" (preserving existing custom content outside
the Security section) and log whether it created or updated the file (keep
print_success messages for both create and update).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 6103804c-eccb-4e41-a3c7-4e2f34abb34b
📒 Files selected for processing (2)
.agents/scripts/security-posture-helper.shaidevops.sh
…llaborator pagination - Extract scaffold_agents_md() function from cmd_init() for context-aware .agents/AGENTS.md generation (t1412.11) - JS/TS projects (package.json detected) get @stackone/defender recommendation for prompt injection defense - Non-JS/TS projects get framework-agnostic prompt injection guidance - Both variants include general security rules and link to framework docs - Fix collaborator check to use --paginate with per_page=100 per issue spec
…ested inside database object
b3bd121 to
d058c69
Compare
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Sun Mar 8 14:07:49 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
…existing files Re-running 'aidevops init' on an already-initialized repo now updates the Security section in .agents/AGENTS.md instead of skipping it. Custom content outside the Security section is preserved. Refactored into three functions: - _generate_security_section(): produces Security content based on project type - scaffold_agents_md(): creates file if missing, delegates to update if exists - _update_agents_md_security(): replaces Security section, preserves everything else Addresses CodeRabbit nitpick on PR #3628.
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Sun Mar 8 15:09:25 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@aidevops.sh`:
- Around line 1207-1215: Update the "General Security Rules" list to include one
concrete secure-storage pointer: add a bullet that directs users to the
supported local secret workflow under ~/.aidevops (e.g., reference the local API
key setup helper script at
~/Git/aidevops/.agents/scripts/setup-local-api-keys.sh and the framework's
secret store guidance) and instruct to use placeholders in code examples rather
than embedding secrets; modify the block under the "General Security Rules"
heading (the existing bullet list) to contain this new line so new repos use the
documented secure storage flow instead of ad-hoc dotfiles or shell-history.
- Around line 1317-1333: The current heading check uses a prefix match on the
variable "line" (if [[ "$line" == "## Security" || "$line" == "## Security "*
]]) which also matches headings like "## Security Architecture" and will clobber
user sections; change the condition so it only matches the exact "## Security"
heading (allowing only optional trailing whitespace) when setting in_security,
has_security_section, writing security_content and setting security_replaced,
e.g. replace the glob prefix test with a stricter pattern match (anchored/regex
or explicit trim+equality) on "line" and leave the subsequent next-heading
detection (the "## " check that turns off in_security and writes the next
heading) unchanged.
- Around line 1185-1202: Replace the incorrect example that uses a non-existent
defend(userInput) API with the actual StackOne Defender usage: import and call
createPromptDefense to construct a defense instance, then call its
defendToolResult method on untrusted tool outputs (pass the tool response and
tool name), check result.allowed and handle blocked content, and use
result.sanitized as the safe content; reference the createPromptDefense factory
and the defendToolResult method and ensure the example emphasizes defending tool
results before adding them to the LLM context rather than sanitizing raw user
input.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b766feba-1ce2-4b09-8b8d-188fa3187f89
📒 Files selected for processing (2)
.agents/scripts/security-posture-helper.shaidevops.sh
… pointers, heading match - Replace incorrect defend(userInput) example with actual StackOne Defender API: createPromptDefense() + defendToolResult() for sanitizing tool outputs - Add concrete secure-storage pointer (aidevops secret set) to both JS/TS and generic General Security Rules sections - Narrow ## Security heading match to exact string only, preventing accidental clobbering of user headings like '## Security Architecture'
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Sun Mar 8 20:07:01 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
|
Dispatching worker to address review feedback and fix CI.
|
|
@coderabbitai review All review feedback has been addressed in commits d058c69, a993e87, and d50b77b:
Requesting re-review to clear the stale CHANGES_REQUESTED status. |
|
🧠 Learnings used✅ Actions performedReview triggered.
|
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Mon Mar 9 04:16:06 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
.agents/scripts/security-posture-helper.sh (1)
52-56: Finish the literal cleanup with category constants too.Centralizing the severity strings helps, but the repeated category keys (
workflows,branch_protection,dependencies, etc.) are still duplicated throughout the file, so Sonar will keep flagging this script.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/scripts/security-posture-helper.sh around lines 52 - 56, Centralize repeated category string literals by adding readonly CATEGORY_* constants (e.g., CATEGORY_WORKFLOWS="workflows", CATEGORY_BRANCH_PROTECTION="branch_protection", CATEGORY_DEPENDENCIES="dependencies", etc.) alongside the existing SEVERITY_* constants, then replace all raw category string usages in functions and conditionals with those constants (search for the literal keys like "workflows", "branch_protection", "dependencies", "secrets", "actions", etc.) to avoid duplication and satisfy SonarCloud; keep naming consistent with the SEVERITY_ prefix pattern and update any comments or docs referencing the literals.aidevops.sh (1)
1259-1273: Makescaffold_agents_md()create.agents/itself.The helper advertises “creates the file if missing”, but it still depends on the caller having created the parent directory first. Adding the directory creation here makes the function reusable and keeps its contract true.
♻️ Minimal hardening
scaffold_agents_md() { local project_root="$1" local agents_md="$project_root/.agents/AGENTS.md" + + mkdir -p "$(dirname "$agents_md")" if [[ -f "$agents_md" ]]; then # File exists — update the Security section idempotently🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@aidevops.sh` around lines 1259 - 1273, scaffold_agents_md currently assumes the parent directory exists; modify scaffold_agents_md to ensure the directory for "$agents_md" exists before writing the file by creating the .agents directory (use mkdir -p on the directory portion of the agents_md path) right after computing agents_md and before checking [[ -f "$agents_md" ]], so both the update and creation paths are safe; reference scaffold_agents_md, the agents_md variable, and _update_agents_md_security/_generate_security_section when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.agents/scripts/security-posture-helper.sh:
- Around line 582-589: The posture logic currently sets posture_status for
warnings but leaves the script exit code unchanged; update the block handling
FINDINGS_WARNING and total_findings so that when FINDINGS_WARNING > 0 (or
total_findings > 0 but no criticals) you both set
posture_status="$SEVERITY_WARNING" (or "good" as appropriate) and set a non-zero
exit indicator (e.g., EXIT_CODE=1 or call exit 1), and ensure the script's final
termination uses that EXIT_CODE; reference the variables posture_status,
FINDINGS_WARNING, FINDINGS_CRITICAL, total_findings and SEVERITY_WARNING so the
change is applied where those symbols are used.
---
Nitpick comments:
In @.agents/scripts/security-posture-helper.sh:
- Around line 52-56: Centralize repeated category string literals by adding
readonly CATEGORY_* constants (e.g., CATEGORY_WORKFLOWS="workflows",
CATEGORY_BRANCH_PROTECTION="branch_protection",
CATEGORY_DEPENDENCIES="dependencies", etc.) alongside the existing SEVERITY_*
constants, then replace all raw category string usages in functions and
conditionals with those constants (search for the literal keys like "workflows",
"branch_protection", "dependencies", "secrets", "actions", etc.) to avoid
duplication and satisfy SonarCloud; keep naming consistent with the SEVERITY_
prefix pattern and update any comments or docs referencing the literals.
In `@aidevops.sh`:
- Around line 1259-1273: scaffold_agents_md currently assumes the parent
directory exists; modify scaffold_agents_md to ensure the directory for
"$agents_md" exists before writing the file by creating the .agents directory
(use mkdir -p on the directory portion of the agents_md path) right after
computing agents_md and before checking [[ -f "$agents_md" ]], so both the
update and creation paths are safe; reference scaffold_agents_md, the agents_md
variable, and _update_agents_md_security/_generate_security_section when making
the change.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 2d0c9678-1505-4cd5-8568-2cef34fd976e
📒 Files selected for processing (2)
.agents/scripts/security-posture-helper.shaidevops.sh
…ents_md - check/audit/store now return exit 1 when FINDINGS_WARNING > 0 (not just critical), matching the script header contract: exit 1 = findings detected - scaffold_agents_md() creates .agents/ directory itself via mkdir -p, making the function self-contained and reusable without caller setup
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Mon Mar 9 05:01:10 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
Review feedback addressed (commit 07abb32)Fixed (valid findings)
Dismissed (with reasoning)
Previously addressed (commits d058c69, a993e87, d50b77b, bfcd349)
@coderabbitai review |
|
Kicking off a fresh review to clear the stale 🧠 Learnings used✅ Actions performedReview triggered.
|
All CodeRabbit review feedback addressedRound 1 (review 3911369662)
Round 2 (review 3911584722)
Round 3 (review 3912793672)
All inline comments now have replies. CI is green (all checks passing including SonarCloud Quality Gate). @coderabbitai review |
|
Kicking off a fresh review now to clear the stale 🧠 Learnings used✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.agents/scripts/security-posture-helper.sh (1)
582-605:⚠️ Potential issue | 🟠 MajorDon't label info-only audits as fully good.
With the new
SEVERITY_INFO/skip tracking, a repo that could not be fully assessed still falls through tostatus="good"as soon as there are no warnings or criticals.print_summary()then reports “all checks passed,” even when phases were skipped becauseghis missing, the repo has no GitHub remote, or collaborator data was inaccessible. Persist a separate partial/incomplete state so stored posture does not overstate audit coverage.🔧 Minimal fix
local posture_status="unknown" if [[ "$FINDINGS_CRITICAL" -gt 0 ]]; then posture_status="$SEVERITY_CRITICAL" elif [[ "$FINDINGS_WARNING" -gt 0 ]]; then posture_status="$SEVERITY_WARNING" + elif [[ "$FINDINGS_INFO" -gt 0 && "$FINDINGS_PASS" -eq 0 ]]; then + posture_status="partial" elif [[ "$total_findings" -gt 0 ]]; then posture_status="good" fi local temp_file="${config_file}.tmp" jq --arg status "$posture_status" \ --arg ts "$timestamp" \ --argjson critical "$FINDINGS_CRITICAL" \ --argjson warnings "$FINDINGS_WARNING" \ + --argjson info "$FINDINGS_INFO" \ --argjson passed "$FINDINGS_PASS" \ --argjson findings "$FINDINGS_JSON" \ '.security_posture = { "status": $status, "last_audit": $ts, "critical": $critical, "warnings": $warnings, + "info": $info, "passed": $passed, "findings": $findings }' "$config_file" >"$temp_file" && mv "$temp_file" "$config_file"case "$stored_status" in critical) echo "Security: $stored_critical critical issue(s), $stored_warnings warning(s) — run \`aidevops security audit\` (last: $stored_ts)" ;; warning) echo "Security: $stored_warnings warning(s) — run \`aidevops security audit\` for details (last: $stored_ts)" ;; + partial) + echo "Security: audit completed with skipped checks — review findings (last: $stored_ts)" + ;; good) echo "Security: all checks passed (last: $stored_ts)" ;;As per coding guidelines, ".agents/scripts/*.sh: Automation scripts - focus on: Reliability and robustness".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/scripts/security-posture-helper.sh around lines 582 - 605, The current posture_status assignment treats any repo with zero warnings/criticals as "good" even when info-only findings or skipped phases exist; update the logic in the posture_status block (the posture_status variable assignment) to detect incomplete audits—e.g., check FINDINGS_INFO, a SKIPPED_PHASES or INCOMPLETE_SCAN flag, or rely on SEVERITY_INFO—and set posture_status to a distinct value like "partial" or "$SEVERITY_INFO" instead of "good" when those indicators are present, keeping the existing precedence for SEVERITY_CRITICAL and SEVERITY_WARNING; ensure the revised posture_status is what gets passed into jq (the same $posture_status/$temp_file flow) so print_summary and stored config reflect an incomplete audit.
🧹 Nitpick comments (1)
aidevops.sh (1)
1227-1249: Broaden the non-JS threat model wording.The generic variant only calls out direct user input, but indirect prompt injection usually arrives through retrieved docs, tool outputs, tickets, emails, and webhook payloads too. Matching the broader boundary you use in the JS/TS section would make the scaffold less likely to under-specify the real risk.
✏️ Suggested wording
-Any feature that accepts user input and passes it to an LLM must defend against -prompt injection. Sanitize and validate all untrusted input before including it -in prompts: +Any feature that passes untrusted content to an LLM — user input, tool outputs, +retrieved documents, emails, tickets, or webhook payloads — must defend against +prompt injection. Sanitize and validate that content before including it in +prompts:🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@aidevops.sh` around lines 1227 - 1249, Update the "### Prompt Injection Defense" section to broaden the threat model beyond direct user input by explicitly calling out indirect vectors (retrieved docs, tool outputs, tickets, emails, webhook payloads, database/content stores, and agent/toolchain results) and align its guidance with the JS/TS section; change the bullets under that heading (the list starting with "Strip or escape control characters...") to include an item advising validation/sanitization of all externally sourced content before inclusion in prompts, add examples of indirect sources, and ensure wording for "Never concatenate raw user input..." covers "raw external content" as well so uses of function names or templates that build prompts (e.g., the structured prompt template advice) are updated to enforce boundaries for both direct and indirect inputs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In @.agents/scripts/security-posture-helper.sh:
- Around line 582-605: The current posture_status assignment treats any repo
with zero warnings/criticals as "good" even when info-only findings or skipped
phases exist; update the logic in the posture_status block (the posture_status
variable assignment) to detect incomplete audits—e.g., check FINDINGS_INFO, a
SKIPPED_PHASES or INCOMPLETE_SCAN flag, or rely on SEVERITY_INFO—and set
posture_status to a distinct value like "partial" or "$SEVERITY_INFO" instead of
"good" when those indicators are present, keeping the existing precedence for
SEVERITY_CRITICAL and SEVERITY_WARNING; ensure the revised posture_status is
what gets passed into jq (the same $posture_status/$temp_file flow) so
print_summary and stored config reflect an incomplete audit.
---
Nitpick comments:
In `@aidevops.sh`:
- Around line 1227-1249: Update the "### Prompt Injection Defense" section to
broaden the threat model beyond direct user input by explicitly calling out
indirect vectors (retrieved docs, tool outputs, tickets, emails, webhook
payloads, database/content stores, and agent/toolchain results) and align its
guidance with the JS/TS section; change the bullets under that heading (the list
starting with "Strip or escape control characters...") to include an item
advising validation/sanitization of all externally sourced content before
inclusion in prompts, add examples of indirect sources, and ensure wording for
"Never concatenate raw user input..." covers "raw external content" as well so
uses of function names or templates that build prompts (e.g., the structured
prompt template advice) are updated to enforce boundaries for both direct and
indirect inputs.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b9884805-3b0c-45e2-8624-63a6739c9b35
📒 Files selected for processing (2)
.agents/scripts/security-posture-helper.shaidevops.sh
- Add 'partial' posture status when only info findings exist with no passes (skipped checks should not report 'good') - Include info count in stored .aidevops.json security_posture - Add 'partial' case to print_summary for accurate status display - Broaden non-JS prompt injection defense to cover indirect vectors (tool outputs, retrieved docs, emails, tickets, webhook payloads) Addresses CodeRabbit review round 4 on PR #3628.
Review round 4 feedback addressed (commit 41060fa)Fixed (both suggestions)
@coderabbitai review |
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Mon Mar 9 05:53:45 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
|
Kicking off a fresh review to clear the stale 🧠 Learnings used✅ Actions performedReview triggered.
|
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Mon Mar 9 06:06:20 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
Review feedback addressedAll CodeRabbit suggestions from the latest review round have been resolved: Already addressed (prior commits)
Newly addressed
Previously confirmed (all 5 inline comments) |
|
|
Dispatching fix worker to address 1 unresolved bot review suggestion before merge.
|



Summary
Implements per-repo security posture configuration in
aidevops init(t1412.11).Changes
aidevops.sh:scaffold_agents_md()function that generates context-aware.agents/AGENTS.mdwith a Security section:package.json): recommends@stackone/defenderfor prompt injection defense with install/usage examples.aidevops.jsonstructure:beadsandsopsconfig blocks were incorrectly nested inside thedatabaseobject — now properly at root levelsopsboolean to.featuresobject so downstream code that reads.featurescorrectly detects SOPS enablement (CodeRabbit review feedback).agents/scripts/security-posture-helper.sh:--paginatewithper_page=100as required by t1412.11 spec (never use a global trusted-users cache)Already implemented (prior work)
The
security-posture-helper.shscript already implements all 6 audit phases:The
aidevops security auditcommand and posture storage in.aidevops.jsonwere also already functional.Closes #3883
Summary by CodeRabbit
New Features
Improvements