Skip to content

fix(tag-ruleset-canon): enumerate and probe through the App installation - #1210

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/ruleset-applier-installation-token
Oct 9, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
fix/ruleset-applier-installation-token

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Summary

tag-ruleset-canon.yml mints one GitHub App installation token per owner (RULESET_APP_ID, #1208). scripts/apply-tag-ruleset-canon.sh still assumed a PAT, so both workflow steps would have failed on their first App run. This PR makes the applier work under an installation token and leaves PAT behaviour unchanged.

Three defects are fixed:

  1. hyperpolymath step: user/repos under an App token. That endpoint needs a user identity, so it answers an installation token (ghs_…) with 403 Resource not accessible by integration. Under set -e the run died before it examined any repository. Under an installation token the applier now lists installation/repositories (private repos included, archived ones dropped). If that listing fails, the run dies and names the endpoint.
  2. metadatastician step: write probe outside the installation. The apply-mode write probe always self-PUT GITHUB_REPOSITORY (hyperpolymath/standards). An installation on metadatastician cannot write that repo, so a capable credential got a false exit 3 ("credential cannot WRITE rulesets"). Under an installation token the probe now self-PUTs a repository-level tag ruleset inside its own installation. It skips org-inherited rulesets, because a per-repo PUT of those 404s (O6 propagation: four contradictions between the ruling and the committed rulesets #1032). A credential that really cannot write still stops the run with exit 3.
  3. ESTATE_ORGS='' meant metadatastician. The hyperpolymath step sets ESTATE_ORGS: '', but ${ESTATE_ORGS:-metadatastician} treated the empty string as unset. That step would therefore also sweep metadatastician repos its token cannot write. It is now ${ESTATE_ORGS-metadatastician}: an explicit empty value means no orgs, and the default still applies when the variable is unset.

Unchanged under a PAT (the ESTATE_ADMIN_TOKEN fallback): targets come from user/repos and the probe self-PUTs GITHUB_REPOSITORY. The workflow file is not touched.

No tracking issue. This implements the owner's ruling of 2026-10-08: "Fix in a standards PR now".

Type of change

  • 🐛 Bug fix (non-breaking change that fixes an issue). Under a PAT nothing changes. Under an App token the applier now runs where before it crashed.
  • ✨ New feature. No new capability; this makes the existing App path work.
  • 💥 Breaking change. The one behaviour change is that an explicit ESTATE_ORGS='' now means no orgs. The only caller that sets it to '' is the hyperpolymath step of tag-ruleset-canon.yml, which wants exactly that.
  • 🕳️ Soundness fix. The ruleset canon and the convergence logic are unchanged.
  • 📖 Documentation. Only the script's header comment changes, to describe --skip-user and ESTATE_ORGS under an App token.
  • 🧹 Refactor / tech debt. Not behaviour-preserving (see Bug fix).
  • ⚡ Performance. Not applicable.
  • 🔧 Build / CI / tooling. An estate maintenance script and a new test for it.

📌 New pins

  • Head SHA: e39d890c6de1f56faa6bdba1f02aca20234f4aed
  • None. No uses: SHA, actions.lock entry, lockfile record or container digest is added or changed. No workflow file is touched.

How has this been verified?

All commands were run in the worktree on Debian 13 (WSL2).

  • New scripts/tests/apply-tag-ruleset-canon-test.sh → passed=14 failed=0. It runs the applier against a stub gh that serves fixtures and refuses what GitHub refuses:
    • ghs_ on user/repos → 403;
    • an installation token writing outside its installation → 403;
    • a per-repo PUT of an org-inherited ruleset → 404.
    • Planted positives (3): the stub is shown to refuse each of those, so no case passes vacuously.
    • Cases (6):
      • App token with ESTATE_ORGS='': targets are exactly the installation's non-archived repos, both CONVERGED, rc 0, and user/repos is never called.
      • PAT: user/repos.
      • PAT probe: still GITHUB_REPOSITORY.
      • A failed installation listing: non-zero rc, no report lines, the endpoint named.
      • Org App token in apply mode with GITHUB_REPOSITORY=hyperpolymath/standards: exactly one probe PUT, to the repo-level ruleset inside the installation. The org-inherited repo listed first is skipped and reported ORG-INHERITED. rc 0.
      • Write-denied org token: still exit 3.
    • Mutants (4), each bash -n-checked and each killed:
      • the ghs_* detection disabled, killed by 2 cases;
      • ${ESTATE_ORGS:-…} restored;
      • the source_type == "Repository" filter removed from the probe;
      • the listing failure swallowed.
  • The origin/main applier through the same harness → 5 cases failed:
    • App token: rc=1 on the user/repos 403, as was the failed-listing case;
    • PAT with ESTATE_ORGS='': metadatastician/delta was swept;
    • org probe: false rc=3, no write attempted.
  • bash tests/test_tag_ruleset_canon.sh → passed=31 failed=0 (the existing structural guards, properties 1–14).
  • shellcheck on both files → rc 0. One SC2016 is disabled on a single line, with a reason: the ${…} there is sed text to match.
  • .githooks/docstring-scan.sh --worktree --check → functions=17 documented=17 coverage=100.00%.
  • bash scripts/run-shell-test-suite.sh → 80 of 82 test files pass. The 2 failures are pre-existing on main: scripts/tests/build-registry-test.sh (2 ❌) and scripts/tests/build-scorecards-test.sh (10 ❌) fail identically in a clean detached worktree of origin/main 900c42c7. This PR touches neither generator nor either test.
  • Pre-commit hooks: all passed (gitleaks, SPDX, sha-pins, actions-lock, permissions, codeql, bot-directives).
  • CI on this head (Self Test run 37861614216): scripts/tests/apply-tag-ruleset-canon-test.sh → passed=14 failed=0. The run reports 2 of 82 test file(s) failed, and they are the same two pre-existing files.

Horizon: this is a local stub of GitHub's behaviour, not a live run. The live acceptance run is the next step. It needs the ruleset App to be created and installed on both owners, and RULESET_APP_ID / RULESET_APP_PRIVATE_KEY to be set on this repo. Then tag-ruleset-canon is dispatched with apply=false.

Checklist

  • My commits are signed: one commit, git log --show-signature → G, ED25519.
  • I ran the project's own checks/tests locally and they pass, apart from the 2 test files that fail identically on main (see above).
  • New files carry the correct SPDX-License-Identifier: the new test is MPL-2.0. No existing file was relicensed.
  • Docs are updated, and no public claim now overstates what the code does. The script header now says what --skip-user and ESTATE_ORGS='' do under an App token.
  • I have not introduced a soundness hole. The probe still refuses a credential that cannot write (shown by the write-denied case), and the convergence and comparison logic is untouched.

Notes for reviewers

🤖 Generated with Claude Code

https://claude.ai/code/session_015bTuGfwCcvjrmNFejydTML

tag-ruleset-canon.yml now mints one App installation token per owner
(RULESET_APP_ID, #1208). The applier still assumed a PAT, so both steps
would have failed on their first App run:

- hyperpolymath step: user/repos needs a user identity and answers an
  installation token (ghs_) with 403, so the run died under set -e before
  examining a single repository. Under an installation token the applier
  now lists installation/repositories instead, private repos included,
  archived ones dropped. A failed listing dies naming the endpoint.
- metadatastician step: the apply-mode write probe always self-PUT
  GITHUB_REPOSITORY (hyperpolymath/standards), which an installation on
  metadatastician cannot write, so a capable credential got a false
  exit 3. The probe now self-PUTs a repo-level tag ruleset inside the
  installation, skipping org-inherited ones (a per-repo PUT of those 404s).
  A credential that cannot write still stops the run with exit 3.
- ESTATE_ORGS='' (set by the hyperpolymath step) fell back to
  metadatastician through ${ESTATE_ORGS:-...}, so that step also swept
  repos its token cannot write. An explicit empty value now means no orgs.

PAT behaviour is unchanged: user/repos and the GITHUB_REPOSITORY probe.

scripts/tests/apply-tag-ruleset-canon-test.sh runs the applier against a
stub gh that refuses what GitHub refuses (planted positives), and four
mutants reintroduce each defect; the origin/main applier fails 5 of its
cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015bTuGfwCcvjrmNFejydTML
@coderabbitai

coderabbitai Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 26 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 71281659-6a14-49df-b4f4-32d6497ff01d
📥 Commits

Reviewing files that changed from the base of the PR and between 900c42c and e39d890.

📒 Files selected for processing (2)
  • scripts/apply-tag-ruleset-canon.sh
  • scripts/tests/apply-tag-ruleset-canon-test.sh
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/37861614231

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] debt rhodium-standard-repositories/rsr-compliance-checklist.k9.ncl (fail) — K9-N001 K9-S004 K9-S005 K9-S014 (grandfathered; touching it makes it blocking)
[validate-k9] 14 conforming, 1 grandfathered (layer all, contract v1.0.0)

@sonarqubecloud

sonarqubecloud Bot commented Oct 8, 2026

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit ca12cd4 into main Oct 9, 2026
65 of 67 checks passed
@hyperpolymath
hyperpolymath deleted the fix/ruleset-applier-installation-token branch October 9, 2026 00:24
hyperpolymath added a commit that referenced this pull request Oct 9, 2026
…1211)

## Summary

`scripts/apply-workflow-pins-remote.sh` lists its targets with
`users/<owner>/repos`, falling back to `orgs/<owner>/repos`. Both
endpoints answer a GitHub App installation token (`ghs_…`) with **public
repositories only**. So once `APP_ID` is set, the private repositories
the applier App is installed on, and can write, are **never audited and
never re-pointed**. This PR adds them.

1. **Under a `ghs_` token, the installation's own repositories are added
to the public listings.** They come from `installation/repositories`,
with archived ones dropped and the list filtered to `--owners`. They are
added, not substituted: `GITHUB_TOKEN` is `ghs_` too, and its
installation is this one repository. Replacing the listing would shrink
the scheduled audit census, which runs on `GITHUB_TOKEN` while no App is
configured, to `hyperpolymath/standards` alone.
2. **Enumeration now fails closed.** `list_repos` returns 1 and prints
nothing when the installation listing fails, or when an owner's `users/`
and `orgs/` listings both fail. `main` then stops before writing a
census and says the enumeration failed. Before this, the second
listing's stderr went to `/dev/null` and its exit status was ignored, so
a rate-limited owner silently contributed zero repositories. That is the
same fail-open `fetch_workflows` was cured of on 2026-10-02.

**Under a PAT nothing changes:** the public listings, and
`installation/repositories` is never called. The workflow file is
**not** touched.

No tracking issue. This is the bug-fix half of the owner's request "push
the f88b721 with bug fix" (dev-notes `f88b721` recorded the finding).

## Type of change

- [x] 🐛 Bug fix (non-breaking change that fixes an issue). Under an App
token the census now includes the installation's private repositories.
Under a PAT or `GITHUB_TOKEN` the public census is unchanged.
- [ ] ✨ New feature. No new capability; the App path now sees what the
App can write.
- [ ] 💥 Breaking change. One behaviour changes on purpose: a run whose
enumeration fails now exits 1 instead of reporting a partial census.
That is the intended fail-closed behaviour, not a break of any caller.
- [ ] 🕳️ Soundness fix. The classifier and the rewrite logic are
untouched. The fail-closed enumeration does remove a false "nothing to
do" for a rate-limited owner, but it is listed under Bug fix.
- [ ] 📖 Documentation. Only `list_repos`'s own docstring is new.
- [ ] 🧹 Refactor / tech debt. Not behaviour-preserving (see Bug fix).
- [ ] ⚡ Performance. Under an App token there is one extra paginated
listing per run; under any other token there is none.
- [x] 🔧 Build / CI / tooling. An estate maintenance script and its test
suite.

## 📌 New pins

- **Head SHA: `1ba3f5b0670c475506db73e214da20058d59191f`**
- None. No `uses:` SHA, `actions.lock` entry, lockfile record or
container digest is added or changed. No workflow file is touched.

## How has this been verified?

All local commands were run in the worktree on Debian 13 (WSL2).

- **`bash tests/test_apply_workflow_pins_remote.sh` → 41 PASS, `RESULT:
all checks passed`, rc 0.** The new section 4 runs `list_repos`, and
`main` end to end, against a stub `gh` that serves listing fixtures with
real `jq` and refuses `installation/repositories` to a non-`ghs_` token.
- **Planted positives (2):** the stub refuses
`installation/repositories` to a PAT, and fails a flagged `users/`
listing. So no fail-closed case can pass because nothing ever failed.
  - **Cases (9):**
- App token: exactly `hyperpolymath/priv-b`, `hyperpolymath/pub-a` and
`metadatastician/pub-c`. The private installation repo is included, both
archived repos are dropped, and `pub-a` (public and in the installation)
appears once.
- `GITHUB_TOKEN`-shaped `ghs_` token whose installation is
`hyperpolymath/standards`: the public census survives alongside it.
- PAT: the public listings only, and `installation/repositories` is
absent from the call log.
- `--owners metadatastician` under an App token on hyperpolymath: no
hyperpolymath repo leaks in.
    - A `users/` 404 falls back to `orgs/`.
- Failed installation listing: rc 1, nothing printed, and the endpoint
is named.
- Both public listings fail for one owner: rc 1, nothing printed, and
the owner is named.
- `main`, App token: the census row `hyperpolymath/priv-b ci.yml FRESH`
is present.
- `main`, failed enumeration: rc 1, no census, "repository enumeration
failed" on stderr.
- **Mutants (6).** Each one is checked to have changed the file and to
parse (`bash -n`), and each is killed:
    - `ghs_` detection disabled;
- the installation listing replacing the public one (killed by the
`GITHUB_TOKEN` case);
    - dedupe removed;
    - the owner filter dropped;
    - the installation-listing failure swallowed;
    - the public-listing failure swallowed.
- **The `origin/main` applier through the same section 4 → 7 of its 12
behaviour checks fail.**
  - Under an App token `priv-b` is missing.
  - A failed installation listing returns rc 0 with the public repos.
- A rate-limited owner yields a partial list, which `main` would have
accepted.
  - The end-to-end census lacks the private repo.
  - A failed enumeration is not reported as one.
- **Live audit run on this head, under `GITHUB_TOKEN`:** [run
37865067072](https://github.com/hyperpolymath/standards/actions/runs/37865067072),
dispatched with `mode=audit` and `limit=2`. The run succeeded. The cred
step logged "AUDIT-ONLY: no App credential; census will run on
GITHUB_TOKEN". The applier enumerated with no FATAL, walked 2 repos and
reported `BEHIND 4`.
- **`shellcheck`** on both files → 11 findings on this branch and 11 on
`origin/main`, and the two sets are identical (compared with line
numbers stripped). This PR adds none. Two new `SC2016` disables carry a
reason: `$1` and `$2` there are expanded by an inner `bash -c`.
- **`.githooks/docstring-scan.sh --worktree --check` → `functions=17
documented=17 coverage=100.00%`.**
- **`bash scripts/run-shell-test-suite.sh` → 79 of 81 test files pass.**
The 2 failures are **pre-existing on `main`**:
`scripts/tests/build-registry-test.sh` and
`scripts/tests/build-scorecards-test.sh` fail the same way on
`900c42c7`. This PR touches neither generator nor either test.
- **Pre-commit hooks:** all passed (gitleaks, SPDX, sha-pins,
actions-lock, permissions, codeql, bot-directives).
- **PR CI on this head** (check-runs read with `--paginate`): 66 runs.
52 success, 12 skipped, 2 failure.
- The 3 required contexts passed: `governance / Actions lockfile
verify`, `uses ⊆ actions.lock` and `scan / gitleaks`.
- In Repo self-tests, `tests/test_apply_workflow_pins_remote.sh` PASSes.
The job reports "2 of 82 test file(s) failed": build-registry and the
Wave-3 scorecard test, the same two pre-existing failures. The count is
82 because the merge ref includes #1210's new test.
- **Code scanning:** on the PR merge ref, CodeQL (actions), CodeQL
(javascript-typescript) and Hypatia each analysed `408ef607` and
returned 0 results. The open alerts on the PR ref minus those on `main`
form the **empty set**. All 10 open alerts on `main` are Scorecard
findings, and Scorecard does not run on PRs.

**Horizon:**
- The stub cases model GitHub's documented behaviour; they are not a
live App run. The live run above proves that the `GITHUB_TOKEN` audit
path still works on this head. It does **not** show that
`installation/repositories` was called, because the log masks the token:
that rests on `GITHUB_TOKEN` carrying the documented `ghs_` prefix.
- The App path itself gets its live acceptance run once `APP_ID` and
`APP_PRIVATE_KEY` are set and the applier App is installed.

## Checklist

- [x] My commits are **signed**: one commit, `git log --show-signature`
→ `G`, ED25519.
- [x] I ran the project's own checks/tests locally and they pass, apart
from the 2 test files that fail the same way on `main` (see above).
- [x] New files carry the correct `SPDX-License-Identifier`. No new
files; both changed files keep their existing `MPL-2.0` header, and no
file was relicensed.
- [x] Docs are updated, and no public claim now overstates what the code
does. `list_repos`'s new docstring says what each credential sees and
why the listings are unioned. The workflow's comments are unchanged and
remain accurate.
- [x] I have not introduced a soundness hole. Enumeration is now
stricter (fail-closed), and the classifier, the rewrite and
`fetch_workflows` are untouched.

## Notes for reviewers

- **Why union and not replace?** #1210 could replace `user/repos` with
`installation/repositories` because `user/repos` 403s for any
installation token. Here `users/<o>/repos` succeeds under `ghs_` and
merely under-reports. Replacing it would turn today's `GITHUB_TOKEN`
audit into a census of one repository. The `replace_not_union` mutant
exists to keep that from regressing.
- **Out of scope, recorded in dev-notes `inbox/findings.md`:**
- The workflow mints `tok-org` (the applier App scoped to
metadatastician) and never uses it; L126 passes only `tok-user ||
GITHUB_TOKEN`. Even after this PR, metadatastician's **private** repos
stay invisible, and `--fix` writes to metadatastician repos fall outside
the hyperpolymath installation.
- The fix is one applier step per owner, each with its own token. That
is a workflow edit, held until this repo's gates read KYAML (AGENTS.md
§2a).
  - A PAT also lists public repos only. That is unchanged here.
- **Red check deferred:** `Registry + topology in sync` also fails on
current `main`, `2e12b312` (measured with check-runs `--paginate` at PR
open). It has been red since `bbcc722b` (#1206). This PR touches neither
the registry nor its generator. Tracked by #1161 §2, which has
acceptance criteria.
- **Red check deferred:** `Repo self-tests` also fails on current
`main`, `2e12b312`. The same two files fail on `900c42c7` and on this
head: `scripts/tests/build-registry-test.sh` and
`scripts/tests/build-scorecards-test.sh`, both from the `REGISTRY.a2ml`
drift. Tracked by #1161 §2. Whether to regenerate the registry or retire
the check with `.a2ml` is the owner's ruling, so this PR does not
regenerate it.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_015bTuGfwCcvjrmNFejydTML

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant