Skip to content

Commit 3f64890

Browse files
committed
chore(ci): GitHub owner maonakamoto -> catomean
1 parent a59f948 commit 3f64890

5 files changed

Lines changed: 21 additions & 14 deletions

File tree

.claude/settings.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@
4545
"timeout": 150
4646
}
4747
]
48+
},
49+
{
50+
"hooks": [
51+
{
52+
"type": "command",
53+
"command": "/home/g/.claude/hooks/fleetcrown-session-end.sh"
54+
}
55+
]
4856
}
4957
],
5058
"PreToolUse": [
@@ -90,6 +98,5 @@
9098
"tui": "fullscreen",
9199
"editorMode": "vim",
92100
"agentPushNotifEnabled": true,
93-
"voiceEnabled": true,
94-
"model": "claude-fable-5[1m]"
95-
}
101+
"voiceEnabled": true
102+
}

.github/workflows/model-pins.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666
run: |
6767
mkdir -p "$RUNNER_TEMP/air" && cd "$RUNNER_TEMP/air"
6868
npm init -y >/dev/null
69-
npm i --no-audit --no-fund github:maonakamoto/ai-kit#v0.3.0 >/dev/null
69+
npm i --no-audit --no-fund github:catomean/ai-kit#v0.3.0 >/dev/null
7070
7171
- name: Audit the fleet's pins
7272
if: github.event_name != 'pull_request'

SHARED.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ the inventory underneath it is **generated**, and the number it produces is a
2222

2323
| Package | Install | Replaces |
2424
|---|---|---|
25-
| [`ai-forms`](https://github.com/maonakamoto/ai-forms) | `npm i github:maonakamoto/ai-forms#v0.1.0` | per-app "fill this form from prose" + conversational refinement. Headless — ships **no markup**, so each app keeps its own styling. |
26-
| [`ai-kit`](https://github.com/maonakamoto/ai-kit) | `npm i github:maonakamoto/ai-kit#v0.4.0` | **the AI layer, in one install** — which model to call, whether the vendor still lists it, the three kinds of 429, fair-share of a free tier, and (re-exported) `ai-forms`. Renamed from `ai-ration` 2026-08-26: the name described one of five modules, and the package had one adopter while five repos that skipped it went down together to a retired model id. |
27-
| [`threadkit`](https://github.com/maonakamoto/threadkit) | `npm i threadkit` | multi-participant message threads where *permission is participation*, not a role or an ownership column. Headless pure functions, so "who may read this" is unit-testable instead of buried in a `WHERE` clause. AI participants obey the same visibility rules. **ESM-only.** |
28-
| [`limitkit`](https://github.com/maonakamoto/limitkit) | `npm i github:maonakamoto/limitkit#v0.1.0` | the fleet's **12 hand-rolled rate limiters** (this file's own "next extraction" row). Sliding/fixed windows over an injectable two-method `Store`; **bounded** memory default (the unbounded-Map leak is impossible by construction); standard `X-RateLimit-*` + `Retry-After` headers — what orangecat's ADR-0002 specified seven months before anything enforced it; `clientIp()`. Refusals count nothing, so a hammered key recovers. Ships no middleware and **no limit values** — how many attempts a route allows is app semantics, asserted locally. |
25+
| [`ai-forms`](https://github.com/catomean/ai-forms) | `npm i github:catomean/ai-forms#v0.1.0` | per-app "fill this form from prose" + conversational refinement. Headless — ships **no markup**, so each app keeps its own styling. |
26+
| [`ai-kit`](https://github.com/catomean/ai-kit) | `npm i github:catomean/ai-kit#v0.4.0` | **the AI layer, in one install** — which model to call, whether the vendor still lists it, the three kinds of 429, fair-share of a free tier, and (re-exported) `ai-forms`. Renamed from `ai-ration` 2026-08-26: the name described one of five modules, and the package had one adopter while five repos that skipped it went down together to a retired model id. |
27+
| [`threadkit`](https://github.com/catomean/threadkit) | `npm i threadkit` | multi-participant message threads where *permission is participation*, not a role or an ownership column. Headless pure functions, so "who may read this" is unit-testable instead of buried in a `WHERE` clause. AI participants obey the same visibility rules. **ESM-only.** |
28+
| [`limitkit`](https://github.com/catomean/limitkit) | `npm i github:catomean/limitkit#v0.1.0` | the fleet's **12 hand-rolled rate limiters** (this file's own "next extraction" row). Sliding/fixed windows over an injectable two-method `Store`; **bounded** memory default (the unbounded-Map leak is impossible by construction); standard `X-RateLimit-*` + `Retry-After` headers — what orangecat's ADR-0002 specified seven months before anything enforced it; `clientIp()`. Refusals count nothing, so a hammered key recovers. Ships no middleware and **no limit values** — how many attempts a route allows is app semantics, asserted locally. |
2929

3030
**Adopted:** `ai-forms` — fleetcrown, evig, aoz-housing, surf-your-life.
3131
`ai-kit` — fleetcrown, aoz-housing, truthseeker, botsmann, **and this repo**
@@ -74,7 +74,7 @@ CI: installed from the public registry into an empty project, imported, and got
7474
17 named exports plus `dist/index.d.ts`.
7575

7676
It exists because of the bug
77-
[`single-tenant-prod-hides-unscoped-queries`](https://github.com/maonakamoto/dotfiles)
77+
[`single-tenant-prod-hides-unscoped-queries`](https://github.com/catomean/dotfiles)
7878
records: role-derived access is correct at one doctor / one tenant / one org and
7979
silently wrong at two. `canRead(thread, user)` cannot express that bug, because
8080
there is no role to check.
@@ -113,11 +113,11 @@ Ranked by (copies × how identical the logic is). Counts from
113113
| Concern | Files | Why it is a good candidate |
114114
|---|---|---|
115115
| `auto-merge-sweep.sh` | ~~22~~ **6** | **EXTRACTED 2026-08-16/20.** Sixteen repos call the canonical as a reusable workflow, each verified to actually *run* it (a sweep that fails to start looks exactly like one with nothing to do). The six remaining are deliberate: dotfiles is the canonical home and runs it directly; ai-forms, datacat, petvity, solon had dirty working trees owned by other sessions when swept — convert when clear. The two repos that had ever *tested* their copies (evig, orangecat) had that coverage ported into the canonical suite **before** deletion: 17 cases, mutation-proven. |
116-
| rate limiting | **14 → adopting** | **Extracted 2026-08-20 as [`limitkit`](https://github.com/maonakamoto/limitkit)** (see registry above). fleetcrown converted as the proving consumer; 13 files remain across 8 repos, orangecat first in line (its ADR-0002 becomes a 12-line `Store` adapter + three deletions). The ratchet holds the count until each adoption lands. |
116+
| rate limiting | **14 → adopting** | **Extracted 2026-08-20 as [`limitkit`](https://github.com/catomean/limitkit)** (see registry above). fleetcrown converted as the proving consumer; 13 files remain across 8 repos, orangecat first in line (its ADR-0002 becomes a 12-line `Store` adapter + three deletions). The ratchet holds the count until each adoption lands. |
117117
| AI provider client | **16** | evig 7, orangecat 5. `ai-kit` already owns the hard part (chain, 429, budget); these are the callers. **Priced 2026-08-26, re-priced 2026-08-27:** Groq retired the llama-3.x family and the damage was far wider than the first count. Seven repos were broken, not five — the audit could not see two of them — and inside a repo the id was written down **two to four times**. Kivvi took three PRs to remove one retired id: it lived in the provider registry, an app's inline fetch body, the fallback chain, and a client hook's `FALLBACK_MODEL`. Each pass only found the copies the tooling could see. That is the cost of duplication measured rather than argued. fleetcrown, which adopted the package, was unaffected throughout. |
118118
| logger | **10** | sbb-lost-found alone has 4. |
119119
| health route | **8** | Identical shape in 8 repos; a 20-line contract. |
120-
| ~~`@ai-native-cms/core`~~ || **Withdrawn — measurement error.** `maonakamoto/revampit` *redirects* to `maonakamoto/evig` (renamed in the pivot); the "two repos" with byte-identical trees were two clones of ONE repo. Nothing to extract. Two directories are not two repos: check `git remote -v` before reporting cross-repo duplication. |
120+
| ~~`@ai-native-cms/core`~~ || **Withdrawn — measurement error.** `catomean/revampit` *redirects* to `catomean/evig` (renamed in the pivot); the "two repos" with byte-identical trees were two clones of ONE repo. Nothing to extract. Two directories are not two repos: check `git remote -v` before reporting cross-repo duplication. |
121121

122122
## What must NOT be centralized
123123

scripts/ci/auto-merge-sweep.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ else
176176
# base quietly collecting more of them and getting harder to diagnose. But
177177
# when the PR *is* the repair, the same rule deadlocks the repo — the fix
178178
# cannot travel the path its own redness blocks, and only a human can move
179-
# it. Seen in maonakamoto/aoz-housing on 2026-08-07: E2E red on the base, the
179+
# it. Seen in catomean/aoz-housing on 2026-08-07: E2E red on the base, the
180180
# fix sitting green in a PR, every sweep refusing politely.
181181
#
182182
# So identify WHICH jobs are red and let a PR through only if its own checks
@@ -277,7 +277,7 @@ merged_any=0
277277

278278
# OLDEST FIRST. `gh pr list` returns newest-first, and this loop merges the
279279
# first eligible PR and stops — so the newest green PR wins every sweep and an
280-
# older one can wait indefinitely. Observed in maonakamoto/fleetcrown on
280+
# older one can wait indefinitely. Observed in catomean/fleetcrown on
281281
# 2026-08-06: two consecutive sweeps merged the two newest PRs while three
282282
# older green ones were never even evaluated. With several agent sessions
283283
# opening PRs continuously, "newest wins" is starvation, and it starves the PR

scripts/ci/test-auto-merge-sweep.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ FAKE
8181
chmod +x "$dir/gh"
8282

8383
local out status
84-
out=$(PATH="$dir:$PATH" GH_REPO=maonakamoto/fixture BASE_BRANCH=main \
84+
out=$(PATH="$dir:$PATH" GH_REPO=catomean/fixture BASE_BRANCH=main \
8585
DEPLOY_WORKFLOW="$deploy_wf" \
8686
bash "$SWEEP" 2>&1)
8787
status=$?

0 commit comments

Comments
 (0)