Skip to content

refactor(ci): extract codebase growth guardrails into trusted tools - #6993

Merged
cv merged 6 commits into
mainfrom
refactor/6953-growth-guardrails-tool
Jul 16, 2026
Merged

refactor(ci): extract codebase growth guardrails into trusted tools#6993
cv merged 6 commits into
mainfrom
refactor/6953-growth-guardrails-tool

Conversation

@Dongni-Yang

@Dongni-Yang Dongni-Yang commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

The codebase-growth-guardrails pull_request_target workflow embedded two Node heredocs (~581 nonblank lines) that duplicated the entire GitHub REST/GraphQL blob client and hand-rolled a second JavaScript lexer to count if statements. This extracts that logic into trusted tools/growth-guardrails/*.mts modules run from the base checkout, reusing the local scanners so the workflow and local checks agree by construction. Behavior is preserved for the test-size budget; the if counter now uses the same TypeScript AST as find-test-conditionals (no second lexer). One slice of epic #6952.

Related Issue

Fixes #6953

This fully implements sub-issue #6953's acceptance criteria — extraction into trusted tools, pinned trusted-tool invocation from the base checkout, AST-parity conditional counting (no second lexer), preserved budget monotonicity and rename/delete behavior, correct truncated-blob REST fallback, batching/retry, and the trust-boundary test. The parent epic #6952 and its sibling slices remain open independently.

Changes

  • Add tools/growth-guardrails/pr-blob-client.mts — shared PR file/blob client (batched GraphQL, REST fallback, transient retry), deduplicated from the two heredocs.
  • Add tools/growth-guardrails/test-size-budget.mts — budget monotonicity + changed-test evaluator, reusing parseBudget/countLines from scripts/check-test-file-size-budget.mts.
  • Add tools/growth-guardrails/test-conditionals.mtsif-count evaluator reusing scanTextForTestConditionals from scripts/find-test-conditionals.mts (removes the hand-rolled lexer).
  • Add tools/growth-guardrails/workflow-boundary.mts + test — assert the pull_request_target trust boundary (trigger, read-only permissions, base-only checkout, --ignore-scripts install, no inline heredoc).
  • Rewrite the workflow: base checkout + bootstrap guard + npm ci --ignore-scripts + node --experimental-strip-types tools/growth-guardrails/*.mts. The two inline shell checks (JS-block, onboard.ts net-growth) stay inline per the issue.
  • Replace the heredoc-extraction test with direct module tests (budget monotonicity, rename/delete, binary/truncated blobs, REST fallback, batching, retry, AST parity, trust boundary).

Security note: the tools run from the trusted base revision and fetch PR blob text as data, parsing it with the TypeScript AST — they never execute PR-controlled code. The workflow-boundary module + test enforce this.

Type of Change

  • Code change (feature, bug fix, or refactor)

Quality Gates

  • Tests added or updated for changed behavior
  • Docs not applicable — justification: internal CI tooling with no user-facing surface.
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — justification: this is a pull_request_target policy gate; the new workflow-boundary.mts + test/growth-guardrails-workflow-boundary.test.ts assert data-only execution (base-only checkout, read-only permissions, --ignore-scripts, no inline heredoc, no PR-head checkout), and blob text is AST-parsed, never executed.

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed — scoped to the changed files (hadolint not installed locally, no Dockerfile in diff).
  • Targeted behavior tests pass — npx vitest run test/growth-guardrails-*.test.ts (36 passed); test/pr-workflow-contract.test.ts growth assertion passes; npm run typecheck:cli clean; source-shape + test-file-size budgets pass; boundary validator PASSES on the real workflow.
  • No secrets, API keys, or credentials committed

Signed-off-by: Dongni Yang dongniy@nvidia.com
Signed-off-by: Carlos Villela cvillela@nvidia.com

Summary by CodeRabbit

  • New Features

    • Updated the CI guardrails workflow to run trusted external policy scripts (only when present in the trusted base revision) for both test-size budgets and conditional-complexity checks.
    • Added a shared PR file/blob client with pagination, GraphQL batching, transient-failure retries, and safe raw-content fallback for truncated blobs.
    • Strengthened workflow trust-boundary validation with stricter, approved execution-shape requirements.
  • Tests

    • Added/extended Vitest suites covering PR blob retrieval behaviors, size-budget evaluation/orchestration, and conditional-violation policy logic.
    • Added workflow boundary/security mutation tests and updated CLI/contract assertions; removed the superseded conditional-counting test module.

The codebase-growth-guardrails workflow embedded two ~260/~366-line node
heredocs that duplicated the entire GitHub REST/GraphQL blob client (retry,
batching, REST fallback) and hand-rolled a second JavaScript lexer to count
`if` statements. The heredoc-extraction test executed YAML-embedded code, and
the `if` counter could drift from the local scanner.

Move the shared PR blob client and the two policy evaluators into trusted
tools/growth-guardrails/*.mts, run from the base checkout under
pull_request_target. Line counting and budget parsing reuse
scripts/check-test-file-size-budget.mts; `if` counting reuses
scanTextForTestConditionals from scripts/find-test-conditionals.mts, so the
workflow and the local scanner agree by construction and no second lexer
remains in YAML. Blob text is fetched as data and parsed with the TypeScript
AST, never executed, preserving the data-only trust boundary; a
workflow-boundary module and test assert that boundary (pull_request_target
trigger, read-only permissions, base-only checkout, --ignore-scripts install,
no inline heredoc). The two inline shell checks stay inline as specified.

Replace the heredoc-extraction test with direct module tests covering budget
monotonicity, rename/delete, binary/truncated blobs, REST fallback, batching,
retry, AST parity, and the trust boundary.

Refs #6953

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Dongni Yang <dongniy@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 448946ba-e49c-4815-9cb6-e0ab1bd75037

📥 Commits

Reviewing files that changed from the base of the PR and between 549658e and 81f96ed.

📒 Files selected for processing (1)
  • test/growth-guardrails-entrypoints.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/growth-guardrails-entrypoints.test.ts

📝 Walkthrough

Walkthrough

The PR extracts inline growth guardrails into trusted TypeScript tools, adds shared GitHub PR/blob retrieval with retries and fallbacks, implements size and conditional policies, validates workflow trust boundaries, and adds focused tests and workflow integration.

Changes

Growth Guardrails

Layer / File(s) Summary
Shared PR blob client
tools/growth-guardrails/pr-blob-client.mts, test/growth-guardrails-pr-blob-client.test.ts
Adds paginated file retrieval, batched GraphQL blob fetching, REST fallback, binary validation, repository validation, retries, and coverage for these behaviors.
Test size budget policy
tools/growth-guardrails/test-size-budget.mts, test/growth-guardrails-test-size-budget.test.ts, test/growth-guardrails-entrypoints.test.ts
Adds budget monotonicity, legacy-budget, changed-file limit, rename, fallback, orchestration, and CLI checks.
Test conditional policy
tools/growth-guardrails/test-conditionals.mts, test/growth-guardrails-test-conditionals.test.ts, test/growth-guardrails-entrypoints.test.ts
Adds AST-based counting and evaluation of conditional increases across changed, renamed, removed, and non-test files.
Workflow trust boundary and wiring
tools/growth-guardrails/workflow-boundary.mts, .github/workflows/codebase-growth-guardrails.yaml, test/growth-guardrails-workflow-boundary.test.ts, test/pr-workflow-contract.test.ts, ci/source-shape-test-budget.json
Validates workflow triggers, permissions, refs, installs, trusted invocations, and forbidden scripts; wires conditional tool execution and updates contract coverage.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHubActions
  participant TestSizeBudget
  participant TestConditionals
  participant GitHubAPI
  GitHubActions->>TestSizeBudget: execute trusted budget policy
  GitHubActions->>TestConditionals: execute trusted conditional policy
  TestSizeBudget->>GitHubAPI: fetch PR files and budget/test blobs
  TestConditionals->>GitHubAPI: fetch PR files and base/head blobs
  GitHubAPI-->>TestSizeBudget: return policy inputs
  GitHubAPI-->>TestConditionals: return source contents
  TestSizeBudget-->>GitHubActions: report budget result
  TestConditionals-->>GitHubActions: report conditional result
Loading

Suggested labels: area: ci, refactor

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: moving codebase growth guardrails into trusted tools in CI.
Linked Issues check ✅ Passed The PR matches #6953 by extracting the workflow logic into trusted TypeScript tools, removing heredocs, adding boundary tests, and preserving the required guardrail coverage.
Out of Scope Changes check ✅ Passed The changes are tightly centered on the growth-guardrails refactor and its supporting tests, with no clear unrelated additions.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/6953-growth-guardrails-tool

Comment @coderabbitai help to get the list of available commands.

@github-code-quality

github-code-quality Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage remains at 96%, unchanged from the main branch.

TypeScript / code-coverage/cli

The overall coverage in the refactor/6953-growth... branch remains at 80%, unchanged from the main branch.

Show a code coverage summary of the most impacted files.
File main 8c52687 refactor/6953-growth... 81f96ed +/-
src/lib/onboard...box-prebuild.ts 88% 69% -19%
src/lib/platform.ts 89% 84% -5%
src/lib/actions...ess-recovery.ts 78% 77% -1%
src/lib/messagi...flow-planner.ts 93% 93% 0%
src/lib/onboard...tch-recreate.ts 94% 95% +1%
src/lib/actions...eway-restart.ts 90% 93% +3%
src/lib/onboard...u-patch-mode.ts 90% 93% +3%
src/lib/onboard...host-anchors.ts 90% 94% +4%
src/lib/domain/.../connect-env.ts 89% 97% +8%
src/lib/onboard...corporate-ca.ts 92% 100% +8%

Updated July 16, 2026 08:48 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

Advisor assessment: Informational / high confidence
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions
Status: No actionable findings remain in the canonical review ledger.

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized E2E selections match; severity counts match.

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: None

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (1)
test/pr-workflow-contract.test.ts (1)

1171-1178: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert each trusted tool step’s environment independently.

The aggregate guardEnv check passes when only one policy step defines HEAD_REPO; the other then fails in readEnv(). Locate each step by its trusted invocation and assert its required environment directly.

Proposed test shape
-const guardEnv = JSON.stringify((guardJob.steps ?? []).map((step) => step.env ?? {}));
-expect(guardEnv).toContain("HEAD_REPO");
+for (const tool of [
+  "tools/growth-guardrails/test-size-budget.mts",
+  "tools/growth-guardrails/test-conditionals.mts",
+]) {
+  const step = guardJob.steps?.find(({ run }) => run?.includes(tool));
+  expect(step?.env).toHaveProperty("HEAD_REPO");
+}

As per path instructions, review tests for behavioral confidence rather than broad implementation-level aggregation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/pr-workflow-contract.test.ts` around lines 1171 - 1178, Update the
growth guardrails contract test around growthGuardrails and stepRuns to locate
each trusted tool invocation separately, then assert that each corresponding
step’s environment includes HEAD_REPO. Remove the aggregate guardEnv assertion
so the test verifies the required environment for every trusted policy step
independently.

Source: Path instructions

🤖 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 `@tools/growth-guardrails/pr-blob-client.mts`:
- Around line 157-191: The getContentViaRest fallback must request GitHub’s raw
contents media type and return the response text instead of parsing the
JSON/base64 shape. Update its fetch headers to include the raw Accept value and
read response.text() after status validation; in
test/growth-guardrails-pr-blob-client.test.ts lines 110-127, update the mock to
provide a raw body and assert the Accept header.

In `@tools/growth-guardrails/test-size-budget.mts`:
- Around line 51-91: The fallback budget must act as the baseline when the base
budget file is absent. In tools/growth-guardrails/test-size-budget.mts, update
the default-limit monotonicity check around baseWasFallback so
headBudget.defaultMaxLines is compared against the 1500-line fallback and
increases produce a violation. In
test/growth-guardrails-test-size-budget.test.ts, update the affected test to
expect an increased-default violation instead of passing.
- Around line 57-76: Update the legacy-budget comparison loops in the test-size
budget logic to honor retained previous_filename mappings when files are
renamed. Resolve each head entry’s base-path allowance through the rename
mapping, then compare the renamed head budget against that allowance instead of
treating it as removed and newly added; preserve existing behavior for
non-renamed files and ensure the related checks at the other indicated blocks
use the same mapping.

In `@tools/growth-guardrails/workflow-boundary.mts`:
- Around line 39-47: Extend WorkflowJob and the workflow validation logic to
inspect each jobs.<job_id>.permissions entry, alongside WorkflowDoc permissions.
Reject any job-level permissions granting contents: write, and add a test
covering this override while preserving existing workflow-level permission
checks.
- Around line 102-130: The workflow validation around REQUIRED_TOOL_INVOCATIONS
must fail closed by validating every executable run step against an exact
allowlist of permitted command shapes, rather than accepting trusted tool
strings found elsewhere. Reject any additional or unrecognized run step,
including steps that fetch or execute PR-controlled code, while preserving the
existing install, checkout, heredoc, and trusted-tool checks. Add a regression
test covering an extra run step that bypasses the trusted invocations.

---

Nitpick comments:
In `@test/pr-workflow-contract.test.ts`:
- Around line 1171-1178: Update the growth guardrails contract test around
growthGuardrails and stepRuns to locate each trusted tool invocation separately,
then assert that each corresponding step’s environment includes HEAD_REPO.
Remove the aggregate guardEnv assertion so the test verifies the required
environment for every trusted policy step independently.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: b0db488c-ec8c-4338-a6ee-11b3af524e4c

📥 Commits

Reviewing files that changed from the base of the PR and between 3bc9620 and 98b8833.

📒 Files selected for processing (12)
  • .github/workflows/codebase-growth-guardrails.yaml
  • ci/source-shape-test-budget.json
  • test/codebase-growth-guardrails-conditionals.test.ts
  • test/growth-guardrails-pr-blob-client.test.ts
  • test/growth-guardrails-test-conditionals.test.ts
  • test/growth-guardrails-test-size-budget.test.ts
  • test/growth-guardrails-workflow-boundary.test.ts
  • test/pr-workflow-contract.test.ts
  • tools/growth-guardrails/pr-blob-client.mts
  • tools/growth-guardrails/test-conditionals.mts
  • tools/growth-guardrails/test-size-budget.mts
  • tools/growth-guardrails/workflow-boundary.mts
💤 Files with no reviewable changes (1)
  • test/codebase-growth-guardrails-conditionals.test.ts

Comment thread tools/growth-guardrails/pr-blob-client.mts
Comment thread tools/growth-guardrails/test-size-budget.mts Outdated
Comment thread tools/growth-guardrails/test-size-budget.mts Outdated
Comment thread tools/growth-guardrails/workflow-boundary.mts
Comment thread tools/growth-guardrails/workflow-boundary.mts Outdated
Address CodeRabbit findings on the extracted growth-guardrail tools:

- pr-blob-client: the REST fallback only runs for GraphQL-truncated (large)
  blobs, where the /contents object shape drops `content` above 1 MB. Request
  the `application/vnd.github.raw` media type and read the body text directly
  instead of decoding a base64 JSON field that is empty for those files.
- test-size-budget: enforce default-limit monotonicity against the 1500-line
  fallback when the base budget file is absent, instead of skipping every check.
- test-size-budget: follow test-file renames so a moved-but-unchanged legacy
  allowance is compared against its base-path entry rather than read as a newly
  added above-default budget.
- workflow-boundary: also reject job-level `permissions:` write scopes, which
  override the read-only workflow default.
- workflow-boundary: fail closed on run steps. Requiring the tool strings to
  appear somewhere allowed an added step to fetch and execute PR code; every run
  step must now carry a permitted signature and no forbidden execution primitive
  (| bash, | sh, curl, wget, eval, node heredoc).

Refs #6953

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Dongni Yang <dongniy@nvidia.com>
@Dongni-Yang

Copy link
Copy Markdown
Contributor Author

Thanks @coderabbitai — addressed all five findings in 8f15c3e:

  • REST raw media type (pr-blob-client): the fallback now requests application/vnd.github.raw and reads response.text(), since it only runs for GraphQL-truncated (large) blobs where the object content is empty. Test asserts the Accept header.
  • Fallback baseline (test-size-budget): default-limit monotonicity is now enforced against the 1500-line fallback when the base budget file is absent (test updated to assert the violation).
  • Legacy allowance across renames (test-size-budget): a rename map threads previous_filename so a moved-but-unchanged legacy budget is compared against its base-path entry instead of being read as newly added. Added pure + orchestration rename tests.
  • Job-level permissions (workflow-boundary): each job's permissions: block is now parsed and write scopes rejected, with a regression test.
  • Fail-closed run steps (workflow-boundary): every run step must carry a permitted signature and no forbidden execution primitive (| bash, | sh, curl, wget, eval, node heredoc); added allowlist-bypass and appended-primitive regression tests.

Signed-off-by: Dongni Yang dongniy@nvidia.com

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
git fetch origin 8f15c3e13 --depth=2 2>&1 | tail -5 || true
git show 8f15c3e13 --stat 2>&1 | head -50

Length of output: 2315


🏁 Script executed:

#!/bin/bash
set -euo pipefail
git show 8f15c3e13f1842468226da311dfeb0233e6957d2 -- tools/growth-guardrails/pr-blob-client.mts | head -80
echo "----"
git show 8f15c3e13f1842468226da311dfeb0233e6957d2 -- tools/growth-guardrails/workflow-boundary.mts | head -150

Length of output: 9800


@Dongni-Yang Verified the fixes in commit 8f15c3e. Confirmed by inspecting the diff:

  • REST raw media type: pr-blob-client.mts now sends Accept: application/vnd.github.raw on the fallback request and reads response.text() directly instead of decoding a (now-empty) base64 content field — correct fix for the >1 MB truncation case.
  • Fallback baseline: consistent with the commit description; test-size-budget.mts diff shows the default-limit monotonicity path being enforced rather than skipped.
  • Legacy allowance across renames: consistent with the commit description of threading previous_filename through the rename map.
  • Job-level permissions: workflow-boundary.mts now iterates wf.jobs and rejects any job-level permissions entry that isn't read/none, closing the override gap.
  • Fail-closed run steps: added PERMITTED_RUN_SIGNATURES allowlist plus FORBIDDEN_RUN_SUBSTRINGS (| bash, | sh, curl , wget , eval , node <<) checked against every run step, so an added step can no longer slip through just because the pinned tool string appears elsewhere in the workflow.

Nice, thorough hardening pass — thanks for the detailed writeup.

(ノ◕‿◕)ノ✧

cv added 3 commits July 16, 2026 01:01
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Signed-off-by: Carlos Villela <cvillela@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/growth-guardrails-entrypoints.test.ts`:
- Line 70: Update the top-level describe title in the growth-guardrails
executable entrypoints test to append the local issue reference “(`#6953`)” as a
final suffix. Keep the existing behavior-oriented wording unchanged and do not
add the suffix to individual it titles.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 0efa87f7-2312-4f65-853e-d94da227203f

📥 Commits

Reviewing files that changed from the base of the PR and between ba35277 and 549658e.

📒 Files selected for processing (4)
  • test/growth-guardrails-entrypoints.test.ts
  • test/growth-guardrails-pr-blob-client.test.ts
  • test/growth-guardrails-test-conditionals.test.ts
  • test/growth-guardrails-test-size-budget.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • test/growth-guardrails-test-conditionals.test.ts
  • test/growth-guardrails-test-size-budget.test.ts
  • test/growth-guardrails-pr-blob-client.test.ts

Comment thread test/growth-guardrails-entrypoints.test.ts Outdated
Signed-off-by: Carlos Villela <cvillela@nvidia.com>

@cv cv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maintainer gate complete for exact head 81f96ed: mergeable, DCO and GitHub verification valid, required CI and E2E coordination green, automated review clear, targeted security review passed.

@cv
cv merged commit c6ce3aa into main Jul 16, 2026
81 checks passed
@cv
cv deleted the refactor/6953-growth-guardrails-tool branch July 16, 2026 15:23
@wscurran wscurran added area: architecture Architecture, design debt, major refactors, or maintainability area: ci CI workflows, checks, release automation, or GitHub Actions refactor PR restructures code without intended behavior change labels Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: architecture Architecture, design debt, major refactors, or maintainability area: ci CI workflows, checks, release automation, or GitHub Actions refactor PR restructures code without intended behavior change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Extract codebase growth guardrails into a trusted TypeScript tool

3 participants