Skip to content

fix(deonboard): one implementation, so the language-gate rollout gets the schema guard and the case fix - #56

Merged
hyperpolymath merged 4 commits into
mainfrom
claude/deonboard-single-impl
Oct 19, 2026
Merged

hyperpolymath merged 4 commits into
mainfrom
claude/deonboard-single-impl

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

What was wrong

scripts/deonboard-workflow.sh (#54) is a copy of the estate-audit de-onboard script, taken before #52 and #53 landed. It has neither fix:

  1. No schema guard. It accepts any actions.lock schema. On a v9.9.9 lock it exits 0 and edits the lock. test(deonboard): pin the de-onboard script to the lockfile schemas it is tested on #53's fail-closed guard (exit 3) lives only in deonboard-estate-audit.sh.
  2. Case-sensitive prune. It compares dependency keys byte for byte. Take a lock where the hyperpolymath/standards record reaches swatinem/rust-cache@6323deb… but the record key is Swatinem/rust-cache@6323deb…. The script prunes that record and leaves a dangling edge, which startup-fails the run. This is the januskey shape fix(deonboard): compare owner/repo case-insensitively when pruning #52 fixed, but only in the estate-audit copy.

Who was exposed: rollout_language_gates.sh de-onboards every Rust CI, Creusot, SPARK and miniKanren caller through deonboard-workflow.sh. Rust CI callers are exactly the repositories whose locks carry the standards → rust-cache edge.

As far as this session knows, no rollout has run since #54 merged, so this is a latent defect rather than a broken estate. That is ASSUMED: I have no rollout logs.

The deonboard-workflow.sh header and README line 273 on main already said the estate-audit script "now delegates" to it. It did not; it was a second copy.

The change

Evidence (TESTED)

I copied the new suites into a tree of origin/main (9a947fa) and ran them against main's scripts.

tests/deonboard-estate-audit.sh: PASS=14 FAIL=4

  • FAIL pruned Swatinem/rust-cache, which the standards record still reaches
  • FAIL dangling edge(s): swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6
  • FAIL the entry points disagree: …
  • FAIL mutant is identical to the script: the case-folding the test exists for is gone

tests/deonboard-lock-schemas.sh: PASS=57 FAIL=4

  • FAIL script declares no known_versions
  • FAIL exit 0 on schema v9.9.9 (want 3)
  • FAIL lock modified despite refusal
  • FAIL orphan check passed a mutant that does not prune (main's wrapper does not delegate)

On this branch:

Check Result
tests/deonboard-estate-audit.sh PASS=19 FAIL=0
tests/deonboard-lock-schemas.sh PASS=63 FAIL=0
tests/lock-transitive-closure.sh PASS=31 FAIL=0
tests/composite-shell-contract.sh PASS=28 FAIL=0
bash -n clean
shellcheck -S warning clean (default severity: same SC2015/SC2016 counts as main)
actionlint no new findings (the 8 "$/actions/…" findings in the hygiene self-test are also on main)

🤖 Generated with Claude Code

https://claude.ai/code/session_01VTeVWDEJgdYKsUNr4uhnXX

… the schema guard and the case fix

scripts/deonboard-workflow.sh (#54) is a copy of the estate-audit
de-onboard script taken before #52 and #53 landed, and it carried
neither fix:

* it accepted any actions.lock schema (rc=0 on a v9.9.9 lock), and
* it compared dependency keys byte for byte, so it pruned
  'Swatinem/rust-cache@<sha>' while the standards record still reached
  it as 'swatinem/rust-cache@<sha>', leaving a dangling edge that
  startup-fails the run.

rollout_language_gates.sh de-onboards every Rust CI caller through it,
and Rust callers are exactly the ones whose locks hold that edge. Its
header and the README already said the estate-audit script delegates
to it; it did not.

deonboard-workflow.sh now holds the guard and the case-insensitive
prune, and deonboard-estate-audit.sh is a two-line entry point that
execs it. Both test suites run every check through both entry points
and apply their mutants to the one implementation; a mutant must be
killed through the wrapper too, which fails if the wrapper ever stops
delegating. tests/deonboard-estate-audit.sh (#52) was not run in CI;
it now runs in the Composite shell contract job, and the hygiene
self-test triggers on deonboard-workflow.sh.

Against main's scripts the new suites fail 4 + 4 checks (dangling
edge, entry points disagree, v9.9.9 accepted, wrapper mutant
survives); on this branch they pass 19/19 and 63/63.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VTeVWDEJgdYKsUNr4uhnXX
Move all 24 hyperpolymath/cicd-suite/actions/* refs in
.github/workflows/main-estate-audit.yml from 1aa6bfb (#48) to 9a947fa,
the current main HEAD (#54's merge commit).

#51 changed actions/manifest-check and left the pins at 1aa6bfb, so
main's "Composite shell contract" has been red since 8bf6d92:
tests/lock-transitive-closure.sh reports that manifest-check is pinned at
1aa6bfb, which differs from HEAD's. The pin moves to 9a947fa rather than
8bf6d92 so it serves everything on main, including #54's additions.

This also makes #51's manifest-deed-paths-ignore and
manifest-k9-paths-ignore inputs take effect: manifest-check@1aa6bfb does
not declare them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kjdf4Mf4Z41bNQh2TrsEp9
(cherry picked from commit 80bea8c)

Copy link
Copy Markdown
Owner Author

Composite shell contract was red on efa4b41. The failure comes from the base branch, not this PR.

The failing step is tests/lock-transitive-closure.sh, which reports:

FAIL main-estate-audit.yml pins actions/manifest-check at 1aa6bfb…, which differs from HEAD's
PASS=30 FAIL=1

Main has this failure on every push since #51. This PR does not touch actions/ or the pins.

The failure also mattered here: the two de-onboard test steps come after it in the same job, so CI skipped them and never ran this PR's tests.

What I did: I cherry-picked #55's repin (80bea8c → 3325927, -x) onto this branch. Its diff is byte-identical to #55's, so whichever PR merges second sees no change from it.

Locally on the new head:

  • lock-transitive-closure: 31/0
  • deonboard-lock-schemas: 63/0
  • deonboard-estate-audit: 19/0
  • composite-shell-contract: 28/0
  • actionlint main-estate-audit.yml: clean

Generated by Claude Code

@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 1de55347-7778-497f-a68a-c7d5890fa0a3
📥 Commits

Reviewing files that changed from the base of the PR and between 3325927 and 926e04c.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • No new commits to review - use @coderabbitai full review for a full pass

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 1982c3bd-eb6d-472d-837e-02cec88372a8
📥 Commits

Reviewing files that changed from the base of the PR and between 9a947fa and 3325927.

📒 Files selected for processing: 8
  • .github/workflows/code-hygiene-self-test.yml
  • .github/workflows/main-estate-audit.yml
  • ARCHITECTURE.adoc
  • README.adoc
  • scripts/deonboard-estate-audit.sh
  • scripts/deonboard-workflow.sh
  • tests/deonboard-estate-audit.sh
  • tests/deonboard-lock-schemas.sh

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
🧰 Additional context used
🪛 GitHub Check: SonarCloud Code Analysis
tests/deonboard-estate-audit.sh

[failure] 84-84: Add a default case (*) to handle unexpected values.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cgy&open=AaFUDInNcaN6ZSv-0Cgy&pullRequest=56

[warning] 86-86: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cg1&open=AaFUDInNcaN6ZSv-0Cg1&pullRequest=56

[warning] 83-83: Add an explicit return statement at the end of the function.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cg3&open=AaFUDInNcaN6ZSv-0Cg3&pullRequest=56

[warning] 85-85: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cg0&open=AaFUDInNcaN6ZSv-0Cg0&pullRequest=56

[warning] 85-85: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cgz&open=AaFUDInNcaN6ZSv-0Cgz&pullRequest=56

[warning] 86-86: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cg2&open=AaFUDInNcaN6ZSv-0Cg2&pullRequest=56

[failure] 146-146: Use '[[' instead of '[' for conditional tests. The '[[' construct is safer and more feature-rich.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDInNcaN6ZSv-0Cg4&open=AaFUDInNcaN6ZSv-0Cg4&pullRequest=56

tests/deonboard-lock-schemas.sh

[failure] 53-53: Use '[[' instead of '[' for conditional tests. The '[[' construct is safer and more feature-rich.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg5&open=AaFUDIracaN6ZSv-0Cg5&pullRequest=56

[warning] 69-69: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg8&open=AaFUDIracaN6ZSv-0Cg8&pullRequest=56

[warning] 70-70: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg9&open=AaFUDIracaN6ZSv-0Cg9&pullRequest=56

[warning] 70-70: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg-&open=AaFUDIracaN6ZSv-0Cg-&pullRequest=56

[warning] 67-67: Add an explicit return statement at the end of the function.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg_&open=AaFUDIracaN6ZSv-0Cg_&pullRequest=56

[failure] 68-68: Add a default case (*) to handle unexpected values.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg6&open=AaFUDIracaN6ZSv-0Cg6&pullRequest=56

[warning] 69-69: Assign this positional parameter to a local variable.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0Cg7&open=AaFUDIracaN6ZSv-0Cg7&pullRequest=56

[failure] 135-135: Use '[[' instead of '[' for conditional tests. The '[[' construct is safer and more feature-rich.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0ChA&open=AaFUDIracaN6ZSv-0ChA&pullRequest=56

[failure] 153-153: Use '[[' instead of '[' for conditional tests. The '[[' construct is safer and more feature-rich.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_cicd-suite&issues=AaFUDIracaN6ZSv-0ChB&open=AaFUDIracaN6ZSv-0ChB&pullRequest=56

🔇 Additional comments: 8
scripts/deonboard-workflow.sh: 1

19-23: LGTM!

Also applies to: 48-57, 61-79

scripts/deonboard-estate-audit.sh: 1

20-27: LGTM!

ARCHITECTURE.adoc: 1

15-15: LGTM!

Also applies to: 28-28

README.adoc: 1

178-184: LGTM!

tests/deonboard-estate-audit.sh: 1

4-19: LGTM!

Also applies to: 24-25, 81-89, 101-151

tests/deonboard-lock-schemas.sh: 1

4-6: LGTM!

Also applies to: 24-28, 39-54, 66-73, 98-98, 108-139, 141-150, 152-169

.github/workflows/code-hygiene-self-test.yml: 1

23-23: LGTM!

Also applies to: 44-44, 90-99

.github/workflows/main-estate-audit.yml: 1

87-87: LGTM!

Also applies to: 90-90, 93-93, 96-96, 108-108, 111-111, 114-114, 117-117, 120-120, 132-132, 138-138, 150-150, 153-153, 156-156, 159-159, 171-171, 174-174, 177-177, 180-180, 183-183, 186-186, 189-189, 192-192, 195-195

📝 Summary

Summary by CodeRabbit

  • Bug Fixes
    • Removing a workflow now preserves dependencies that are still referenced elsewhere, including when repository names differ only by letter case.
    • Unsupported lock-file schemas are rejected before changes are made.
  • Documentation
    • Clarified dependency-pruning behaviour, supported lock-file schemas and the shared de-onboarding process.

The estate-audit script now delegates to a shared de-onboarding implementation. The shared script validates supported lock schemas and matches dependency owner and repository names without regard to case. Tests cover both entry points. The estate-audit workflow also uses updated action commit references.

Changes: De-onboarding behaviour

Layer / File(s) Summary
Shared implementation and entry-point delegation
scripts/deonboard-workflow.sh, scripts/deonboard-estate-audit.sh, ARCHITECTURE.adoc, README.adoc
The shared script accepts schemas v0.0.2 and v0.0.3 and exits with status 3 for other versions. It compares owner and repository names without regard to case while preserving ref case. The estate-audit script delegates to the shared script, and the documentation describes the arrangement.
Validation through both entry points
tests/deonboard-estate-audit.sh, tests/deonboard-lock-schemas.sh, .github/workflows/code-hygiene-self-test.yml
The tests run schema and dependency-pruning checks through both scripts. They check workflow removal, dependency references, orphan removal, idempotence, unknown schemas, and mutant behaviour. The hygiene workflow includes the shared script in its path filters and adds a check for lower-case nested uses: entries.

Estate-audit action pins

Layer / File(s) Summary
Update estate-audit action references
.github/workflows/main-estate-audit.yml
The governance, hygiene, manifest, language, and advisory gate actions now use commit 9a947faad4f7f6640148980dd892b39f216fd091. Job conditions and manifest ignore-input forwarding are unchanged.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 33259

No blocking issue is established for the de-onboarding changes or updated action pins; the PR is ready for normal merge checks.

Security architecture risk: 🔵 Low · up to 33259

The shared implementation extends schema refusal and correct dependency matching to language-gate de-onboarding. The secret-scanning action is unchanged across the old and new pins, with no observed authority expansion. Remaining uncertainty concerns interruption recovery and downstream rollout behavior, not a verified new security defect.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — A de-onboarding invocation can modify the supplied repository's actions.lock with the invoking process's filesystem authority. The behavior is shared by estate-audit and language-gate callers, but the inspected evidence does not establish an estate-wide consumer inventory or whether any production rollout has run.

Trust Boundaries and Controls

  • observed — The scoped estate-audit caller grants contents: read, disables persisted checkout credentials, and invokes the pinned secrets action only after successful checkout while not cancelled. The pin update does not change those controls or the scanner implementation; no new privilege transition was established for this candidate.

Resilience and Maintainability Implications

  • inferred — One implementation reduces control drift between rollout paths. Schema refusal and repository-case matching now apply through both entry points, while the existing lack of whole-transition atomicity remains a recovery constraint rather than an introduced PR concern.

Hardening Proposals

  • proposed — For future rollout hardening, consider validating a complete temporary lock before atomic replacement, serializing competing writers, and defining interruption recovery. Fault-injection checks could verify that retries cannot strand partially completed lock maintenance.
Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 53.85% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 13 functions across 4 files. (4 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Title check Passed The title clearly identifies the main change: consolidating de-onboarding into one implementation and applying the schema guard and case-insensitive pruning fixes.
Description check Passed The description directly explains the defects, implementation changes, test coverage, CI updates, documentation updates, and reported validation results.
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 53.85% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 13 functions across 4 files. (4 skipped: 4 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

✨ Finishing Touches
📝 Generate docstrings
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Warning

CI annotation context is incomplete: annotation collection unavailable or limited

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.

@hyperpolymath
hyperpolymath marked this pull request as ready for review October 19, 2026 12:12
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-19T12:12:56.063470Z 3325927 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Add Carrot credits or activate Agent usage billing to use Autofix

@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

🤖 Coding task started for 1 failed pre-merge check.

@coderabbitai

coderabbitai Bot commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

❌ Failed to create Coding Agent finishing-touch task. Please try again.

@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

hyperpolymath added a commit that referenced this pull request Oct 19, 2026
…; pin Alire by hash; re-pin the theatre gate (#57)

## What the first live caller showed

The first cross-repository call of `rust-ci.yml`
(hyperpolymath/plasma-parser-writer#108, [run
39251770946](https://github.com/hyperpolymath/plasma-parser-writer/actions/runs/39251770946))
died at startup:

> The action
EmbarkStudios/cargo-deny-action@3c63498
is not allowed in hyperpolymath/plasma-parser-writer because all actions
must be from a repository owned by hyperpolymath, created by GitHub,
verified in the GitHub Marketplace, or match one of the patterns: …

`creusot-gate.yml` from the same commit resolved and ran on that PR
(detect, theatre gate and verdict all green), which also answers the
callee-lock question #54 left open: a gate workflow that is deliberately
not keyed in this repository's lock resolves fine. The Actions policy is
evaluated in the **caller's** repository, so a reusable may only use
what every caller is allowed, and nothing in this repository's own CI
could ever see the refusal.

## What this PR does

* **`rust-ci.yml`** — cargo-deny is installed through
`taiki-e/install-action` (the installer the coverage job and hypatia's
green workflows already use) at the version cargo-deny-action shipped
(`0.20.2`, new input `cargo_deny_version`), and run as plain `cargo
deny` steps with the argument shape the action used (global args,
`--manifest-path`, command).
* **`spark-gate.yml`** — Alire is a sha256-pinned release binary (alr
`2.1.1` x86_64 Linux, the version `setup-alire` v6.0.0 defaults to; new
inputs `alr_version` / `alr_sha256`, hash recorded from the downloaded
asset) followed by `alr -n toolchain --select gnat_native=<v> gprbuild`,
which is what `alire-project/setup-alire` does on Linux. That action is
also outside the allowed owners, and it nests `actions/cache/restore@v4`
and `actions/setup-node@v4`, floating tags no caller under
`sha_pinning_required` may carry. The nested standards theatre gate
moves from `95de3df` to `75bd599`: since about 2026-10-15 GitHub
validates a called reusable against the callee's `actions.lock` and
rejects records whose `ref:` is their own SHA; `95de3df`'s lock has them
(hypatia PIN-003, hyperpolymath/hypatia#931, lists the 545 such
standards commits), `75bd599` is the first that does not. The theatre
gate's content is identical at both commits.
* **`tests/gate-action-owners.sh`**, run by
`language-gates-self-test.yml` — every `uses:` in the four gates names
an owner in {actions, github, hyperpolymath, dtolnay, swatinem,
goto-bus-stop, taiki-e} at a full SHA; a planted disallowed owner and a
planted tag pin must both be refused or the guard reports NO CHECK (exit
2).
* **README** — what a gate may use, what the callee lock must look like,
and how a consumer with a lock-sync gate onboards a caller
(hyperpolymath/cicd-squabbler#135 is the worked example for its
standards callers).

## Evidence

actionlint clean on the three workflows; shellcheck clean on the guard;
the four gate test suites (31/27/19/19) and the composite shell contract
(28) still pass; the owners guard passes with its planted control
tripping. `tests/lock-transitive-closure.sh` fails 6 checks on this
branch **and on main alike** (`manifest-check` pinned at `1aa6bfb` in
`main-estate-audit.yml`, the subject of #56);
nothing here touches it.

## Not yet witnessed live

The pinned-alr path and `cargo deny` through install-action run for the
first time on the first consumer that pins this commit; the planted
controls still make a broken install report void, never green. After
this merges, plasma-parser-writer#108's pin moves to the merged SHA and
`Rust CI` runs there for the first time; cicd-squabbler can then onboard
the Rust and SPARK gates with a closure that no longer needs ids this
session could not obtain.

Commits on this branch are unsigned: no signing key is available in this
session (the configured key file is empty). GitHub signs the squash
merge.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01Xn9nqHVbUTRLgBdedoXAc8)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@hyperpolymath
hyperpolymath merged commit bf7dd95 into main Oct 19, 2026
14 of 15 checks passed
@hyperpolymath
hyperpolymath deleted the claude/deonboard-single-impl branch October 19, 2026 20:23
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants