You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
sentry-checkin: run log for skilld-dev/skilld.dev #89
2026-08-27T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 over 5 files | 0 issues requested
The scheduled sentry-checkin runtime has no Sentry issue-read token, so every run reports missing_observability and cannot see open issues such as SKILLD-11.
skills-raw caches a missing marker and returns 404 when the upstream tree fetch fails, while skill-asset returns 503 without caching for the same failure.
2026-08-29T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 2 issues requested
When ungh.cc returns 404 for the repo tree (no cached index for the branch), skills-raw throws 503 Skill source is unavailable upstream and pages Sentry (SKILLD-11, event 2026-08-29T18:31Z on deployed release 7457344), even though skills.rendered_skill_path already records the SKILL.md path needed to fetch the raw file directly from raw.githubusercontent.com without any tree listing.
Verify with:pnpm vitest run test/unit/skills-raw-tree-outage.test.ts
Estimated to change 2 files.
The skill-asset handler shares the skills-raw ungh.cc tree dependency and answers the same 503 Skill source is unavailable upstream when ungh has no tree for the branch, though skills.rendered_skill_path joined alongside s.assets already names the skill directory needed to build the raw URL directly.
2026-09-01T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 1 found | 1 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 1 issues requested
Nitro's built-in route cache (defineCachedEventHandler) forwards its already-caught best-effort KV write failures to Sentry as unhandled errors (SKILLD-17, KV PUT failed: 429), while project policy in shared/server/cache.ts records the same failure class as a wide event, so the server Sentry config needs a beforeSend filter for this exact signature with the wide event kept as the visibility path.
2026-09-02T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 3 found | 3 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 3 issues requested
retryD1MaintenanceRead only retries long-running import/export errors, so transient 'D1 DB is overloaded' read failures 500 across 24 Sentry issues (SKILLD-13/14/18/19/1A-1K/1M-1T) during crawler sweeps instead of being replayed with the existing jittered backoff.
Verify with:pnpm vitest run test/unit/platform-d1.test.ts
Estimated to change 2 files.
nuxt-skew-protection 1.5.2 closes its BroadcastChannel on app:error while the app:manifest:update hook can still fire, so a later postMessage throws InvalidStateError on /gh/ file pages (SKILLD-12); multi-tab broadcast is redundant here because updateStrategy polling already reloads each tab.
nitro cached-handler SWR writes to the KV_CACHE mount exceed the 1 write/sec per-key limit and captureError raises each rejected best-effort write as an error even though the request succeeds, so SKILLD-17 and SKILLD-1V are recurring noise rather than a live defect.
Target:shared/sentry.ts plus server/plugins/sentry.ts (add a beforeSend that drops cache-tagged 'KV PUT failed: 429' rejections)
Verify with:pnpm vitest run test/unit/sentry-observability.test.ts
Verdict: AMBER. 34 open issues. No new defect needs new code beyond one small fix. Delivery is the real problem: production last deployed 2026-09-02T01:31Z and sits 4 commits behind main, so the merged #119 upstream-retry fix is undeployed and SKILLD-1E still fires.
Scope and mapping
Inventory: not found. Checked $SITES_FILE (unset), ~/SITES.md, ~/sites/SITES.md. Ran read-only against the user-named site. No edits, commits, pushes, or Sentry mutations.
The request named org skilld-dev; no such org exists. Sole org harlan-zw used. Project skilld (4511781692506112) maps to the skilld-dev/skilld.dev checkout. No unmatched projects, no zero-issue sites in scope.
Snapshot: ~/.local/state/sentry-checkin/run-jvGq09zU/skilld.snapshot.json. 34 unresolved ids, checksum c70fe319c58b…, duplicate_ids_dropped empty. Bundles reused from run run-BKLXtjvF (identical snapshot checksum), so evidence is from the same frozen set.
History: 34 new, 0 recurring, 0 unclosed. First recorded run for this project. History file: ~/.local/state/sentry-checkin/history.tsv. Nothing recorded this turn (read-only).
Deploy-state finding
wrangler deployments list: newest production deployment 2026-09-02T01:31:45Z, one version at 100%. The newest SKILLD-1E event (2026-09-03T17:50Z) reports release 1f5dcb9, the build that deployment carried. Production serves 1f5dcb9.
Sentry holds a release 827faaf (created 2026-09-02T02:35Z, 0 events) that no Cloudflare deployment carries. The deploy workflow builds (which creates the Sentry release) then deploys, smokes, and rolls back. Reading: the 827faaf deploy never landed or was rolled back. GitHub Actions state unreadable this run (401).
Consequence: SKILLD-1E stays blocked on deploy. Do not resolve it yet.
Triage, one row per frozen id
D1 overload burst — 20 ids, fixed-via-candidate + covered.SKILLD-13,14,18,19,1A,1B,1C,1D,1F,1G,1H,1J,1K,1M,1N,1P,1Q,1R,1S,1T, all D1_ERROR: D1 DB is overloaded, on read endpoints, in 4-5 second crawler-sweep windows (Aug 31 06:06Z, Sep 2 09:17Z). The known ledger fingerprint, exit condition still unmet. No layer retries this message: @harlan-zw/nuxt-cloudflareTRANSIENT_D1_SIGNALS lacks it, and server/utils/db.ts retries only long-running import/export. One PR adds it to the replayable-read retry in server/utils/db.ts. The owning fix covers all 20 ids if a later sweep confirms.
KV PUT 429 — SKILLD-17, SKILLD-1V: expected. Nitro route-cache writes are best-effort; the setItem rejection is caught and reported via captureError (single Object.setItem frame, auto.function.nuxt.nitro). The request succeeds, the write is dropped. KV allows one write per key per second. No code change.
Skill source unavailable — SKILLD-11 (256 events, last 2026-08-31T22:10Z): already-fixed. Fixed by 24a14b5 (fix(registry): answer 410 for gone sources on skill-files and skill-asset #109), carried by the deployed 1f5dcb9 build. Last event precedes that deployment; quiet since. Resolve --in-release 1f5dcb92378e….
Skill source unavailable — SKILLD-1E (16 events, last 2026-09-03T17:50Z): blocked. Fix merged as eafbfd5 (fix(registry): retry a transient ungh tree read before answering 503 #119); production does not carry it. Next action: land the pending deploy of main, confirm one clean window, then resolve in that release.
Long-running export — SKILLD-15, SKILLD-16: third-party. Cloudflare D1 maintenance window. The e3045fc retry (4 attempts, ≤~480ms backoff) is deployed but cannot clear a minutes-long maintenance inside a request. Counts 2 and 1, stale since 2026-08-20.
D1_RESET_DO — SKILLD-Y: already-fixed.withD1ResetRecovery + e3045fc; one event, 2026-08-12.
withSession is not a function — SKILLD-Z: already-fixed. Nuxt Content route removed in 97a0d39; quiet since 2026-08-13.
BroadcastChannel closed — SKILLD-12: third-party. nuxt-skew-protection multi-tab plugin, 1 event, 2026-08-19. Upstream module owns the channel lifecycle; no local fix.
Proposed actions
Land the deploy of main and find why 827faaf never served. This unblocks SKILLD-1E and the SKILLD-11 resolution.
One PR: add D1 DB is overloaded to the replayable-read retry matcher in server/utils/db.ts, with a failing-first unit test in test/unit/platform-d1.test.ts. See the Candidate.
Next run (with write access): resolve SKILLD-11 in 1f5dcb9, resolve the six stale already-fixed ids (S, V, W, X, Y, Z, 10) per the release evidence above, and leave SKILLD-1E, the overload family, the expected and third-party rows open.
No Sentry issue was resolved this turn. No branch, worktree, or PR was created.
Confidence: 88/100. Verified: snapshot checksum, all 34 bundles, Cloudflare deployment history, release-to-event mapping, retry code paths. Unverified: GitHub CI state (401) and whether the 827faaf deploy failed smoke or never ran.
2026-09-04T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 1 found | 0 new | 1 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry check-in — skilld.dev (read-only)
Verdict: AMBER. 34 open issues on project skilld (org harlan-zw), all new to this run's ledger. 20 of 34 are one live D1-overload family with events through 2026-09-04; one small code fix covers it. Most remaining ids are already fixed on main and are stale. Production lags HEAD, which holds one merged fix this family needs.
Site inventory: $SITES_FILE unset, ~/SITES.md missing, ~/sites/SITES.md missing — the repo's own docs/ops/triage-ledger.md served as prior-disposition evidence.
Snapshot: 34 issues, checksum c70fe319c58bd34493a8af5d377d0e3da26353b8af7db89ee0f8d788c0a32be5, no dropped duplicates, all states new. Run dir: ~/.local/state/sentry-checkin/run-sPenhpR7.
Live defect. Neither retryD1MaintenanceRead in server/utils/db.ts nor @harlan-zw/nuxt-cloudflare's TRANSIENT_D1_SIGNALS lists the overload message, so replayable reads fail instead of retrying. Fix: extend the repo retry to replayable reads on this error. Candidate below.
KV PUT 429 in Nitro route cache
SKILLD-17, 1V
Expected degradation. The error is Nitro's internal cachedEventHandler KV write ([cache] Cache write error), caught and logged; the request succeeds. Repo writeCache/readCache already degrade best-effort on their paths. No code change ≤5 files without muting, which is forbidden. Disposition expected; wide events carry the signal.
Skill source unavailable upstream
SKILLD-11 (256), 1E (16)
Blocked on deploy.#109/#119 fixed the gone-source 410s and added the tree retry; #119 merged 2026-09-02 12:23 AEST, one hour after the production release was cut. SKILLD-1E's post-deploy events (last 2026-09-03T17:50Z) land on the un-deployed fix.
KV GET 500
SKILLD-S
Already fixed: readCache landed 2026-08-19 (#40), in production. Last event 2026-08-18T06:24Z precedes it. Resolve in the carrying release.
Long-running D1 import/export
SKILLD-10, 15, 16
Already fixed: read retry landed 2026-08-14/#26 and 2026-08-21/#55, in production. Last events precede the deploys.
Too many SQL variables on /api/clusters
SKILLD-X
Already fixed: parameter-cap guard 2026-08-20 (#50), in production. Last event 2026-08-13.
D1_RESET_DO
SKILLD-Y
Already fixed: withD1ResetRecovery landed 2026-08-14 (#26). Single event 2026-08-12.
withSession is not a function on content query
SKILLD-Z
Already fixed: withSession support in the maintenance-tolerant D1 wrapper landed 2026-08-14 (#26), one day after the last event. No recurrence in 3+ weeks.
Og-image numeric handle (e58.split)
SKILLD-V, W
Already fixed 2026-08-18 (56b6c56, og-props coercion), in production; last event 2026-08-12.
BroadcastChannel closed
SKILLD-12
Already fixed: nuxt-skew-protection 1.5.2 upgrade landed 2026-09-01 (b6c4caf), in production, with guard test. Last event 2026-08-19.
Proposed actions
One PR: overload-aware retry for replayable D1 reads (candidate). Expected to cut the 20-id overload family to noise and let the next run resolve them as fixed.
Verdict: 2 live defect classes need code, 11 already-fixed ids wait on Sentry resolution once deploy state is confirmed, 0 regressions. Frozen snapshot skilld.snapshot.json (checksum c70fe319c58bd34493a8af5d377d0e3da26353b8af7db89ee0f8d788c0a32be5, no duplicate ids dropped), 34 open issues, all new (no prior run history). No mutations made: no branch, no PR, no ledger recorded; history at /home/harlan/.local/state/sentry-checkin/history.tsv stays untouched.
Coverage (34/34)
Live, needs a PR (22 ids).
20 ids, D1_ERROR: D1 DB is overloaded. Requests queued for too long. (7683331480, 7683331513, 7701851775, 7701851777, 7701851783, 7701851784, 7701851793, 7701851846, 7706489539, 7706489557, 7706489559, 7706489573, 7706489580, 7706489596, 7706489601, 7706489615, 7706489624, 7706489639, 7706489647, 7706489648; ~347 events). Latest events ran release 1f5dc / 11fe9b8 (2026-08-31, 2026-09-02), which already carries every shipped mitigation (skill-related caching, canonical links, indexes). Verified missing: neither retryD1MaintenanceRead in server/utils/db.ts nor TRANSIENT_D1_SIGNALS in @harlan-zw/nuxt-cloudflare/d1 matches the overload message, so a replayable read that hits a full D1 queue fails on first attempt. Candidate 1 fixes the category and covers all 20 ids.
2 ids, KV PUT failed: 429 Too Many Requests (7701833213, 7706553864). Both postdate the writeCache fix (3ab8ea5, 2026-08-03). The 2026-09-02 bundle carries the breadcrumb [cache] Cache write error. Error: KV PUT failed: 429 Too Many Requests, which is Nitro 2.13.4's route cache (defineCachedEventHandler) writing hot keys straight to KV_CACHE; nitro catches the rejection but captureError raises a fresh Sentry issue per hot path on every crawler sweep. Candidate 2 fixes the category at the storage mount.
Already fixed at HEAD, resolution evidence only (11 ids). Every one of these last fired on a release that predates the fix commit (release names verified with git cat-file -e):
7669649767 e57.withSession is not a function → 2 events, silent since 2026-08-13 on b37cf91, one day before fix(d1): recover transient read failures #26 rewired the D1 proxy; watch for one recurrence before further work.
7669999882, 7683331537, 7683331572 long-running import/export → fixed by the read retry (8ea5861, fix(d1): retry reads during exports #55, 2026-08-21); last events 2026-08-20 on aa64972, hours before the fix.
7680671269 BroadcastChannel postMessage → fixed upstream in nuxt-skew-protection 1.5.2, installed and guarded by test/unit/skew-protection-multi-tab.test.ts.
Proposed actions
Candidate 1: extend the replayable-read retry to the D1 overload class (server/utils/db.ts, 2 files). Covers the 20 overload ids.
Candidate 2: mount a failure-tolerant driver on the cache storage so nitro route-cache KV rejections degrade to a miss with a wide event instead of a captured error (nuxt.config.ts + driver + test, 3 files). Covers the 2 KV PUT ids.
The maintenance read retry in retryD1MaintenanceRead only matches long-running import and export messages, so a D1 overload rejection fails a replayable read on its first attempt and 20 live endpoint issues keep growing.
Target:server/utils/db.ts
Verify with:pnpm vitest run test/unit/platform-d1.test.ts
Estimated to change 2 files.
Nitro's route cache writes hot keys straight to the KV_CACHE binding, so each 429 from the one-write-per-second limit is captured to Sentry as a fresh error issue per hot path during a crawler sweep.
Target:nuxt.config.ts
Verify with:pnpm vitest run test/unit/nitro-cache-storage.test.ts
2026-09-07T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 2 issues requested
Sentry check-in: skilld.dev (project skilld)
Verdict: backlog is 34 issues, all new to the ledger, zero prior dispositions. Every issue is accounted for. Two live noise sources get one small filter PR each. Everything else is already fixed in code; most of those fixes deployed on 2026-09-07 and just need a Sentry resolve with release evidence on the next mutating run.
Scope and method
Org: harlan-zw (the only organization; skilld-dev is the GitHub owner, not a Sentry org). Project skilld, matched to skilld.dev through sentry.client.config.ts and shared/sentry.ts (DSN project id 4511781692506112).
Site inventory: no inventory exists. Paths checked: $SITES_FILE (empty), ~/SITES.md, ~/sites/SITES.md. Scope taken from the request instead.
Snapshot: 34 issues, no duplicate IDs dropped, checksum c70fe319c58b.... Run dir: ~/.local/state/sentry-checkin/run-9gwt5G2X.
PR #158 (f82a70a, 2026-09-07) added d1 db is overloaded to RETRYABLE_D1_READ_MESSAGES in server/utils/db.ts. All events are 2026-09-02 to 09-04, from releases 11fe9b8a and 1f5dcb92, which predate the fix. f82a70a is an ancestor of release 8b1af9f, built 2026-09-07; a Cloudflare deployment followed at 06:14Z. Resolve in 8b1af9f once its deploy SHA is confirmed.
KV PUT 429
2: SKILLD-17, 1V
already-fixed
PR #159 (4025044) routes Nitro cache writes through the tolerant KV mount and drops the forwarded error in server/plugins/sentry.tsbeforeSend, via isBestEffortCacheWriteError. Events 2026-08-31 and 09-02 predate it. Same release evidence as above.
Long-running import/export
3: SKILLD-10, 15, 16
already-fixed
8ea5861 (2026-08-21) retries reads during D1 maintenance; ancestor of release 11fe9b8a (2026-08-31). Events 2026-08-13 and 08-20 come from b37cf91e and aa64972d.
Upstream unavailable 503
2: SKILLD-11, 1E
expected, filter proposed
layers/registry/server/api/skill-files/[...slug].get.ts throws 503 with Retry-After when fetchUpstreamTree reports unavailable. That is intended. The handler already emits an operational wide event for the outage, so the Sentry capture is duplicate noise. Last event 2026-09-05, so this recurs. Candidate 1.
SQL variables
1: SKILLD-X
already-fixed
ba8ede4 (2026-08-13 18:27 AEST) chunked the /api/clusters selectors at D1_BOUND_PARAMETER_LIMIT. The one event fired 08:35Z the same day from df28e5ec, minutes before the fix. No recurrence.
KV GET 500
1: SKILLD-S
already-fixed
04dc7c7 (PR #40, 2026-08-19) made readCache treat a failed read as a miss. The single event, 2026-08-18 16:24 AEST, ran on 2e4f9d6b, built 15:16 AEST the day before the fix.
D1_RESET_DO
1: SKILLD-Y
already-fixed
e3045fc (2026-08-14) wraps reads in withD1ResetRecovery. Event 2026-08-12 from e0fe519a.
withSession TypeError
1: SKILLD-Z
already-fixed
Same commit e3045fc added the withSession proxy in createMaintenanceTolerantDatabase. Event 2026-08-13 from b37cf91e.
Curator OG image crash
2: SKILLD-V, W
already-fixed
Numeric-login coercion landed on 56b6c56 (2026-08-12); repo triage ledger row confirms exit condition met 2026-08-18. Events 2026-08-12 from d2616c5e.
BroadcastChannel race
1: SKILLD-12
third-party, mitigation proposed
The error comes from nuxt-skew-protection's multi-tab client plugin, not repo code. One event, 2026-08-19. A client beforeSend filter is the safe local mitigation. Candidate 2.
Proposed actions
Candidate 1: drop expected upstream-unavailable 503s in the server beforeSend filter. Files: shared/sentry.ts, server/plugins/sentry.ts, one test file. Covers SKILLD-11, SKILLD-1E.
Candidate 2: drop the benign closed-channel postMessage error in a client beforeSend filter. Files: shared/sentry.ts, sentry.client.config.ts, one test file. Covers SKILLD-12.
Next mutating run: confirm release 8b1af9f is the deployed SHA, then resolve the 29 already-fixed issues listed above in their carrying releases. Do not resolve expected or third-party rows.
Unmatched projects: none. Unmatched inventory sites: none in scope. Zero-issue sites: not applicable, single project.
Confidence: 88/100. Verified: snapshot checksum, per-issue bundles, fix commits and their release ancestry, and the Cloudflare deployment timestamp. Unverified: the exact SHA inside the 2026-09-07 06:14Z deployment, and that the Sep 7 releases receive no new events under live traffic.
The skill-files, skill-asset and skills-raw handlers throw their intended upstream-outage 503 as an unhandled error, so Sentry records SKILLD-11 and SKILLD-1E although fetchUpstreamTree already reports the outage as an operational wide event.
Target:shared/sentry.ts
Verify with:pnpm vitest run test/unit/sentry-cache-write-filter.test.ts
Estimated to change 3 files.
The client Sentry config reports a benign tab-close race in nuxt-skew-protection's multi-tab plugin (SKILLD-12, InvalidStateError: Channel is closed) as an error.
Target:shared/sentry.ts
Verify with:pnpm vitest run test/unit/sentry-cache-write-filter.test.ts
Verdict: AMBER. 37 open issues, all frozen as new for this routine's history file. 14 are already-fixed in Sentry's eyes and only need resolving against deployed releases; 25 belong to two live families: D1 saturation during crawler sweeps (23 ids, events today) and upstream-blip 503s on skills-raw (SKILLD-1E, grew after the #119 retry fix). Five small cache candidates proposed below; no code was changed, committed, or pushed.
Scope and method
Organization harlan-zw, project skilld, mapped to this checkout via nuxt.config.ts sentry config. Sole org, no ambiguity.
No site inventory exists at $SITES_FILE, ~/SITES.md, or ~/sites/SITES.md; scope taken from the request plus the repo's tracked sentry config.
Snapshot: 37 unresolved issues, sha256 97434734639e5664a580131ae3c0d34891423505959af8d88ab98b3de16514a0, no duplicate ids dropped. One event bundle per issue fetched. History file ~/.local/state/sentry-checkin/history.tsv is empty: first run of this routine, so new 37, recurring 0, unclosed 0. The repo's own docs/ops/triage-ledger.md was used as prior-art evidence.
Deployed release at snapshot time is 103991d, equal to origin/main HEAD.
Dispositions
Already-fixed, resolve next run in the carrying release after confirming the deploy (14 ids, all with last-seen before their fix deployed and 5+ days clean): SKILLD-S (readCache, shared/server/cache.ts), SKILLD-V and SKILLD-W (og-props numeric-handle fix, 56b6c56), SKILLD-Z (content route removed, 97a0d39), SKILLD-X (D1 SQL variable chunking, ba8ede4), SKILLD-Y (D1 reset recovery, #26), SKILLD-10 (import retry, #55), SKILLD-15 and SKILLD-16 (export retry, #55), SKILLD-12 (BroadcastChannel skew fix #66), SKILLD-11 (gone-source 410 on skill-files/skill-asset, #109).
Watch, then resolve: SKILLD-17 and SKILLD-1V (KV PUT 429). The beforeSend drop (#176) and route-cache wide-event resolution (#159) deployed 2026-09-07/08, after both ids' last events. Expect the next burst window to be silent; then resolve.
Live, D1 overload family (23 ids): SKILLD-13, 14, 18, 19, 1A, 1B, 1C, 1D, 1F, 1G, 1H, 1J, 1K, 1M, 1N, 1P, 1Q, 1R, 1S, 1T, 1W, 1X, 1Y. Still firing today on the current release despite #158 (D1 read retry) and #168 (stale fallback on skill-related). Mechanism per the ledger: crawler sweeps of unique cold keys; no cache helps a never-cached key. Root mitigation is capacity or crawler shaping, which is a decision, not a small fix; the five candidates below remove the remaining uncached and short-TTL hot paths and would have covered 9 of today's 23 culprit endpoints.
Live, skills-raw outage 503s: SKILLD-1E. Five events 2026-09-03 to 09-05 across four repositories, after #119's tree retry deployed. Matches the ledger's own over-firing exit condition; candidate 5 is the mitigation.
Blocked: none.
Proposed actions
Five candidates, each one small PR: cache the org profile endpoint, cache the user skills endpoint, add stale serving to the tag profile cache, add stale serving to both cluster endpoints, and serve the stale skills-raw body when upstream blips. Resolve the 14 already-fixed ids in their carrying releases on the next non-read-only run. No Sentry resolutions were applied this run; nothing was muted.
Confidence: 91/100. Verified live Sentry state, deployed release, fix lineage in git, and handler cache shapes by reading code. Untested path: whether ungh (not skilld) was down during the 09-03 to 09-05 SKILLD-1E events; the events are consistent with either an ungh outage or classifier over-firing.
GET /api/orgs/:owner is a bare defineEventHandler with no route or read-through cache, so every crawler hit runs five-plus D1 queries plus per-repo upstream fetches, which is the recurring D1 overload culprit (SKILLD-1M, SKILLD-1N, and the 2026-08-05 orgs family).
Verify with:pnpm vitest run test/unit/org-profile-cache.test.ts
Estimated to change 2 files.
GET /api/users/:login/skills is a bare defineEventHandler with no cache, so each crawler hit repeats the same D1 reads and landed as SKILLD-1K in the D1 overload burst.
Target:server/api/users/[login]/skills.get.ts
Verify with:pnpm vitest run test/unit/user-skills-cache.test.ts
Estimated to change 2 files.
The tag profile handler caches for 60 seconds with swr disabled on a heavy FTS query plus per-row subqueries, so crawler sweeps recompute it continuously (SKILLD-19, SKILLD-1C, SKILLD-1H).
Verify with:pnpm vitest run test/unit/tag-profile-cache.test.ts
Estimated to change 2 files.
Both cluster handlers cache for 60 seconds with swr disabled, so crawler sweeps re-run the cluster index D1 queries every minute (SKILLD-1A, recurring burst member).
Target:layers/registry/server/api/clusters/index.get.ts and layers/registry/server/api/clusters/[slug].get.ts
Verify with:pnpm vitest run test/unit/cluster-cache.test.ts
Estimated to change 3 files.
The raw endpoint keeps a fetched body for only 5 minutes with no stale fallback, so an upstream blip after expiry answers 503 retry-after on the npx skilld run surface although a last-good copy existed minutes earlier (SKILLD-1E kept growing after #119).
GREEN. 42 frozen issues, all covered in the audited ledger. 9 resolved in the verified deployed release 103991d0b34830f98e5b361c4c8665d8f0d75aaa. 33 stay open as third-party Cloudflare platform failures with mitigations already deployed. No code repairs needed, so no Candidates and no PR. Repository unchanged.
Scope and access
Repository: skilld-dev/skilld.dev, controller worktree skilld.dev.harlan-agent-routine-sentry-checkin-2026-09-09-9f3c9c18b5ab on 103991d (= origin/main).
Organization: harlan-zw. Project: skilld.
Project mapping: DSN project id 4511781692506112 in shared/sentry.ts:1 matches Sentry project skilld (id 4511781692506112). One project, exact match, no unmatched projects.
sentry-cli installed and authenticated. No script failures. No duplicate ids dropped.
Counts
Metric
Value
Frozen issues
42
Ledger rows
42 (100% coverage, audit pass)
new
42
recurring
0
unclosed
0
already-fixed (resolved this run)
9
third-party (left open)
33
Candidates
0
First routine run against this history file, so every id tags new. Prior manual triage in docs/ops/triage-ledger.md was used as leads only.
Deployment evidence
Release 103991d0b34830f98e5b361c4c8665d8f0d75aaa:
Released 2026-09-08T07:40:06Z (Sentry release record).
Wrangler deployment record 2026-09-08T07:40:37Z, 100% traffic.
Fresh production events landed on this release through 2026-09-09T02:11Z, so it was live.
Live probe 2026-09-09: https://skilld.dev/ 200, /api/clusters 200.
Every fix commit below verified as an ancestor of this release with git merge-base --is-ancestor.
Resolved this run (9), all --in-release 103991d0b34830f98e5b361c4c8665d8f0d75aaa
Issue
Fix evidence
SKILLD-S 7662446055 KV GET 500
readCache treats a rejected KV read as a miss (acbd24c#40). Last event 2026-08-18 precedes the fix.
SKILLD-V 7666848469 OG island 500, digit login
og-props coercion (56b6c56), test-guarded. Last event 2026-08-12T01:32Z.
SKILLD-W 7666848478e58.split is not a function
Same root cause and fix as SKILLD-V.
SKILLD-X 7667355409 too many SQL variables
findClusterIndexRows chunks at the D1 100-parameter cap (ba8ede4#21, 0349755#50). Last event 2026-08-13; live endpoint 200 today.
SKILLD-Z 7669649767withSession is not a function
db proxy forwards withSession (e3045fc#26, 2026-08-14). Last event 2026-08-13T13:01Z.
Same class as SKILLD-11: retry (eafbfd5) + capture filter (c318148). Last event 2026-09-05T01:14Z, before this release.
SKILLD-1V 7706553864 KV PUT 429 captured
Same class as SKILLD-17: wide events (4025044) + capture filter. Last event 2026-09-02T10:04Z.
Resolution plan ran before --apply. All 9 re-read through the API after applying: status=resolved, statusDetails.inRelease=103991d0b34830f98e5b361c4c8665d8f0d75aaa. Sentry reopens any of these as a regression if the error returns.
Left open (33), all third-party, never resolved
28 D1 overload ids (SKILLD-13/14/18/19/1A/1B/1C/1D/1F/1G/1H/1J/1K/1M/1N/1P/1Q/1R/1S/1T/1W/1X/1Y/1Z/20/21/22/23): Cloudflare D1 capacity rejection during crawler and ingest bursts. All frames terminate in cloudflare-internal d1-api. Mitigations deployed: route caching (d56a917, bb607cc) and the replayable-read retry (f82a70afix(d1): retry replayable reads on D1 overload #158). Events at 2026-09-09T02:11Z continue after the retry fix, so the residual is platform capacity. Exit condition unchanged: a crawler sweep produces no burst.
SKILLD-10/15/16: D1 refuses reads while a long-running import or export holds the database. Platform lock, no local frame.
SKILLD-12: nuxt-skew-protection BroadcastChannel postMessage after close. Stack entirely in the dependency runtime, one event, 2026-08-19, no recurrence.
Candidates
None. No disposition this run needed a code repair. The repository is unchanged (0 tracked modifications), no branch, no PR.
Artifacts
Run directory: /home/harlan/.local/state/sentry-checkin/runs/766422606816d7c50ff67eb7914ba507b0e79c3e7ba9b3044ca945b81a8ff69b
Resolution plan / apply / verify: skilld.resolve-plan.json, skilld.resolve-apply.json, skilld.resolve-verify.txt
Run history: /home/harlan/.local/state/sentry-checkin/history.tsv (42 rows appended for run id skilld-dev/skilld.dev:sentry-checkin:2026-09-09T20:20:00.000Z)
Confidence: 95/100. Verified end to end: frozen snapshot, 42-row audited ledger, resolution plan, applied resolutions, and per-issue API status checks. The untested remainder is future behaviour: a recurrence reopens any resolved id, and the D1 overload family depends on Cloudflare capacity, not on this run.
Verdict: Backlog is one Cloudflare D1 capacity class plus one stale upstream bug. This run resolved SKILLD-12 in the verified live release. The 33 D1 rows stay open as third-party: the deployed read-retry mitigation is live and cannot remove Cloudflare capacity errors. No code repairs this run.
History states: new 1 (SKILLD-24), recurring 33, unclosed 0.
Resolved this run
Issue
Disposition
Resolved in release
Proof
SKILLD-12 (7680671269) BroadcastChannel postMessage on closed channel
already-fixed
103991d0b34830f98e5b361c4c8665d8f0d75aaa
Upstream fix installed in b6c4caf (catalog → nuxt-skew-protection 1.5.2, local patch dropped), which is an ancestor of release 103991d0b. That release is proven deployed: it carried production events dated 2026-09-10T15:36. Last SKILLD-12 event 2026-08-19 predates the fix; no recurrence across three weeks. Guarded by test/unit/skew-protection-multi-tab.test.ts.
Plan (resolve-plan.json) ran before --apply (resolve-applied.json); API re-read (resolve-verify.json) confirms status: resolved, inRelease: 103991d0b….
Evidence: all three signatures are already retried with backoff by retryReplayableD1Read (server/utils/db.ts:133, deployed in f82a70a, present in live release 103991d0b), yet fresh failures on 2026-09-10 still surfaced from that release. The root cause is Cloudflare capacity, no local code can remove it. Mitigation decision: keep the read retries; accept residual 500s during D1 overload windows. Never resolved in Sentry; a regression would still surface.
No issue was left blocked. No issue was muted.
Code repair Candidates
None. Every open issue is third-party with its mitigation already deployed; the one fixable issue was already fixed upstream and is now resolved in Sentry.
Artifacts
Run dir: /home/harlan/.local/state/sentry-checkin/runs/c20bca4f77bd529927338dc052f0412a72b7984798eb146372a330ce01b86f56
History: /home/harlan/.local/state/sentry-checkin/history.tsv (34 rows appended for run skilld-dev/skilld.dev:sentry-checkin:2026-09-10T20:20:00.000Z)
Confidence: 93/100. Verified end to end: snapshot checksums, audit, resolve plan → apply → API re-read, history append. Untested: none within this run's scope; the D1 third-party verdict rests on Cloudflare-side behavior this run cannot exercise.
Verdict: backlog unchanged and all third-party. One new Nuxt error-page crash, no local fix. Zero eligible Sentry resolutions. No code Candidates, no PR.
Organization: harlan-zw (sole org). Project: skilld, matched by tracked DSN in shared/sentry.ts:1 (project ID 4511781692506112). No unmatched projects, no exclusions.
32 D1 errors (D1_ERROR: D1 DB is overloaded / long-running import/export). Every stack terminates in cloudflare-internal:d1-api (D1DatabaseSession._sendOrThrow) behind Nitro handlers. Events span releases up to 103991d0b348 with latest event 2026-09-10, so the platform failure is still live. The app already retries through runRecoverable. No local fix exists; mitigation is keep-open monitoring and Cloudflare escalation if volume grows.
1 new SKILLD-25 (7726701629) TypeError: t.toString is not a function, single client event 2026-09-11 at /__nuxt_error.md, release 103991d0b348. Mechanism auto.function.nuxt.vue-error; every frame is nuxt@4.5.2 / vue@3.5.42 dist code, innermost nuxt-error-page.vueLg.setup. The repo ships no error.vue and no local code references __nuxt_error; the .md source plugin only answers /gh/*/*.md. No local fix; mitigation is monitor and add a custom error.vue or upgrade Nuxt if it recurs.
Sentry resolutions
Eligible resolutions: 0. No fixed, covered, or already-fixed rows exist, so no --in-release plan ran and nothing was applied. All 33 rows stay open by rule (third-party is never resolved).
Muted issues: none.
Code repairs
Candidates: 0. No issue has a local root cause this run.
Run history: /home/harlan/.local/state/sentry-checkin/history.tsv (33 rows appended for run skilld-dev/skilld.dev:sentry-checkin:2026-09-11T20:20:00.000Z, date 2026-09-11)
Script failures and missing evidence
None. No step failed. No deployment evidence was needed because no row qualified for resolution.
2026-09-12T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 code proposals | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry Check-in: skilld.dev (skilld) — 2026-09-12
Verdict: no action needed. All 32 open issues are already-attributed upstream classes (29x Cloudflare D1 capacity, 2x D1 export lock, 1x Nuxt error-page internals); zero eligible resolutions, zero code repairs this run.
Run identity
Routine run ID: skilld-dev/skilld.dev:sentry-checkin:2026-09-12T20:20:00.000Z
Mode: propose (scheduled)
Repository: skilld-dev/skilld.dev, controller worktree at HEAD 103991d0 (clean, unchanged)
Sentry: org harlan-zw, project skilld (matched via DSN project id 4511781692506112 in shared/sentry.ts:1)
handled=yes, runtime=cloudflare; last events 2026-09-02..09-10, all on the current release 103991d0/1f5dcb92; mitigation (SWR inflight dedup, shared/server/cache.ts) already deployed; kept open as upstream capacity signal
D1 export lock (Currently processing a long-running export.)
7683331537, 7683331572
third-party
last event 2026-08-20 on aa64972d; manual D1 export lock, no local fix; quiet 3+ weeks
Nuxt error page TypeError
7726701629
third-party
single event 2026-09-11 on 103991d0; all 18 frames inside vue/nuxt 4.5.2 deps, throw site nuxt-error-page.vue setup, zero app frames; mitigation: monitor, Sentry reopens on regression
Resolutions
Eligible (already-fixed / covered): none. Every issue's latest event landed on the currently deployed release 103991d0 (live events 28h before the run), so no issue is provably fixed by a deployed release.
Plan: empty; nothing applied to Sentry. Per contract, third-party rows are never resolved.
Code repairs
Candidates: none. No issue traces to app code; all throw sites are Cloudflare infra or Nuxt/Vue internals.
Repairs beyond the file limit: none.
Notes
Prior run (2026-09-11) dispositions were third-party for all 32; this run re-verified each against fresh event evidence and the repo's deployed mitigation before agreeing.
7706489539 remains the highest-volume issue (1030 events, last 2026-09-10). Volume is upstream; watch Cloudflare D1 status rather than the app.
Verdict: healthy triage, no code defects. All 32 frozen issues are upstream or unattributable; 31 are Cloudflare D1 capacity/export-lock failures surfaced through cloudflare-internal:d1-api, 1 is a single unattributable client TypeError inside minified Nuxt error-page internals. Zero eligible Sentry resolutions this run; zero code repair Candidates. Nothing was muted.
Scope and mapping
Repository: skilld.dev/skilld.dev, controller worktree, read-only (git status clean at end).
Sentry access: sentry-cli authenticated, sole org harlan-zw.
Project mapping: tracked DSN in shared/sentry.ts:1 (project id 4511781692506112) maps exactly to project skilld. No unmatched projects. No inventory exclusions apply.
Query: is:unresolved via sentry-cli, 32 issues frozen, no duplicate IDs dropped.
Resolved this run: none (no fixed/already-fixed/covered rows exist; third-party is never resolved).
Issue inventory (all third-party)
D1_ERROR: D1 DB is overloaded. Requests queued for too long. (29 issues: SKILLD-13, 14, 18, 19, 1A, 1B, 1C, 1D, 1F, 1G, 1H, 1J, 1K, 1M, 1N, 1P, 1Q, 1R, 1S, 1T, 1W, 1X, 1Y, 1Z, 20, 21, 22, 23, 24): every event stack originates at cloudflare-internal:d1-apiD1DatabaseSession._sendOrThrow; application frames are ordinary query helpers (findSkill, findRelatedSkills, getGeneratedBatch, findSkillCommitSource, listDuplicateCandidateRows, tag/org/repo handlers). Largest: SKILLD-1F, 1047 events, still firing 2026-09-13. Evidence: upstream Cloudflare D1 capacity saturation under request bursts. Mitigation: cached handler paths and wide events absorb the blast; issues stay open to watch for regression; no mute.
D1_ERROR: Currently processing a long-running export. (2 issues: SKILLD-15, 16): same D1 seam; a long-running export holds the database. Last seen 2026-08-20; not recurring since. Mitigation: no mute, watch.
TypeError: t.toString is not a function (SKILLD-25, 1 event, 2026-09-11, Chrome 144 zh-CN, culprit /__nuxt_error.md): all 18 frames are minified Vue 3.5.42 / Nuxt 4.5.2 internals; last frame nuxt-error-page.vueLg.setup; zero application frames. No local fix attributable; client sourcemaps do not match events (release naming gap noted in shared/sentry.ts comments). Mitigation: no mute, monitor recurrence.
Resolutions
Plan: empty (resolution-plan.txt in the run dir). No resolve call, no --apply, no status re-reads required. No issues are eligible while every row is third-party.
Code repair Candidates
None. A D1 retry layer would touch the shared platform DB seam and every write/read path, exceeding the small-repair bar and risking retry amplification during saturation; it is an infrastructure design decision, not a defect fix, so the D1 rows stay third-party. No prior rejections on file.
History: /home/harlan/.local/state/sentry-checkin/history.tsv (32 rows appended for run skilld-dev/skilld.dev:sentry-checkin:2026-09-13T20:20:00.000Z, 2026-09-13)
Resolution plan: .../resolution-plan.txt
Failures and missing evidence
None. All script steps succeeded; no credentials, deployment, or mapping evidence missing.
Agent triage by Codex, 2026-10-05. This is an agent assessment.
Sentry evidence now belongs to the daily check-in. The runbook removes the separate Sentry routine. Current D1 escalation and monitoring remain in #393. Closing this retired log does not resolve any Sentry issue.
Activity
harlan-github-agent commentedon Aug 28, 2026
2026-08-26T20:20:00.000Z — Skipped. This run was due more than 6 hours ago, so it was skipped.
harlan-github-agent commentedon Aug 28, 2026
2026-08-27T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 over 5 files | 0 issues requested
The scheduled sentry-checkin runtime has no Sentry issue-read token, so every run reports missing_observability and cannot see open issues such as SKILLD-11.
Target:
/home/harlan/.sentryclircVerify with:
python3 /home/harlan/.local/share/harlan-github-agent/service/harlan-agent-kit/skills/sentry-checkin/scripts/sentry_api.py --org harlan-zw snapshot --project skilld --output /tmp/opencode/skilld.snapshot.jsonEstimated to change 1 file.
skills-raw caches a missing marker and returns 404 when the upstream tree fetch fails, while skill-asset returns 503 without caching for the same failure.
Target:
layers/registry/server/api/skills-raw/[...slug].get.tsVerify with:
pnpm vitest run test/unit/skills-raw-tree-outage.test.tsEstimated to change 2 files.
harlan-github-agent commentedon Aug 29, 2026
2026-08-28T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 found | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
harlan-github-agent commentedon Aug 29, 2026
2026-08-29T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 2 issues requested
When ungh.cc returns 404 for the repo tree (no cached index for the branch), skills-raw throws 503
Skill source is unavailable upstreamand pages Sentry (SKILLD-11, event 2026-08-29T18:31Z on deployed release 7457344), even thoughskills.rendered_skill_pathalready records the SKILL.md path needed to fetch the raw file directly from raw.githubusercontent.com without any tree listing.Target:
layers/registry/server/api/skills-raw/[...slug].get.tsVerify with:
pnpm vitest run test/unit/skills-raw-tree-outage.test.tsEstimated to change 2 files.
The skill-asset handler shares the skills-raw ungh.cc tree dependency and answers the same 503
Skill source is unavailable upstreamwhen ungh has no tree for the branch, thoughskills.rendered_skill_pathjoined alongsides.assetsalready names the skill directory needed to build the raw URL directly.Target:
layers/registry/server/api/skill-asset/[...slug].get.tsVerify with:
pnpm vitest run test/unit/skill-asset-tree-outage.test.tsEstimated to change 2 files.
harlan-github-agent commentedon Sep 1, 2026
2026-09-01T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 1 found | 1 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 1 issues requested
Nitro's built-in route cache (defineCachedEventHandler) forwards its already-caught best-effort KV write failures to Sentry as unhandled errors (SKILLD-17, KV PUT failed: 429), while project policy in shared/server/cache.ts records the same failure class as a wide event, so the server Sentry config needs a beforeSend filter for this exact signature with the wide event kept as the visibility path.
Target:
shared/sentry.ts + server/plugins/sentry.tsVerify with:
pnpm test:run test/unit/sentry-cache-write-filter.test.tsEstimated to change 2 files.
harlan-github-agent commentedon Sep 2, 2026
2026-09-02T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 3 found | 3 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 3 issues requested
retryD1MaintenanceRead only retries long-running import/export errors, so transient 'D1 DB is overloaded' read failures 500 across 24 Sentry issues (SKILLD-13/14/18/19/1A-1K/1M-1T) during crawler sweeps instead of being replayed with the existing jittered backoff.
Target:
server/utils/db.ts (retry classifier alongside isLongRunningD1Maintenance)Verify with:
pnpm vitest run test/unit/platform-d1.test.tsEstimated to change 2 files.
nuxt-skew-protection 1.5.2 closes its BroadcastChannel on app:error while the app:manifest:update hook can still fire, so a later postMessage throws InvalidStateError on /gh/ file pages (SKILLD-12); multi-tab broadcast is redundant here because updateStrategy polling already reloads each tab.
Target:
nuxt.config.ts skewProtection block (set multiTab: false)Verify with:
pnpm build && rg --no-ignore -c "multiTab" .output/server | head -3Estimated to change 1 file.
nitro cached-handler SWR writes to the KV_CACHE mount exceed the 1 write/sec per-key limit and captureError raises each rejected best-effort write as an error even though the request succeeds, so SKILLD-17 and SKILLD-1V are recurring noise rather than a live defect.
Target:
shared/sentry.ts plus server/plugins/sentry.ts (add a beforeSend that drops cache-tagged 'KV PUT failed: 429' rejections)Verify with:
pnpm vitest run test/unit/sentry-observability.test.tsEstimated to change 3 files.
harlan-github-agent commentedon Sep 3, 2026
2026-09-03T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 1 found | 0 new | 1 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry check-in — skilld.dev (project
skilld) 2026-09-04, read-onlyVerdict: AMBER. 34 open issues. No new defect needs new code beyond one small fix. Delivery is the real problem: production last deployed 2026-09-02T01:31Z and sits 4 commits behind
main, so the merged #119 upstream-retry fix is undeployed andSKILLD-1Estill fires.Scope and mapping
$SITES_FILE(unset),~/SITES.md,~/sites/SITES.md. Ran read-only against the user-named site. No edits, commits, pushes, or Sentry mutations.skilld-dev; no such org exists. Sole orgharlan-zwused. Projectskilld(4511781692506112) maps to theskilld-dev/skilld.devcheckout. No unmatched projects, no zero-issue sites in scope.~/.local/state/sentry-checkin/run-jvGq09zU/skilld.snapshot.json. 34 unresolved ids, checksumc70fe319c58b…,duplicate_ids_droppedempty. Bundles reused from runrun-BKLXtjvF(identical snapshot checksum), so evidence is from the same frozen set.new, 0recurring, 0unclosed. First recorded run for this project. History file:~/.local/state/sentry-checkin/history.tsv. Nothing recorded this turn (read-only).Deploy-state finding
wrangler deployments list: newest production deployment 2026-09-02T01:31:45Z, one version at 100%. The newestSKILLD-1Eevent (2026-09-03T17:50Z) reports release1f5dcb9, the build that deployment carried. Production serves1f5dcb9.mainis 4 commits ahead:eafbfd5(fix(registry): retry a transient ungh tree read before answering 503 #119 tree-retry),827faaf(fix(copy): align site copy with v3 run-first positioning #112),8fdb2b2(chore(digest): pause the AI summary behind an explicit flag #121),4fcf0d9(chore(routines): schedule the daily check-in #125).827faaf(created 2026-09-02T02:35Z, 0 events) that no Cloudflare deployment carries. The deploy workflow builds (which creates the Sentry release) then deploys, smokes, and rolls back. Reading: the827faafdeploy never landed or was rolled back. GitHub Actions state unreadable this run (401).SKILLD-1Estaysblockedon deploy. Do not resolve it yet.Triage, one row per frozen id
fixed-via-candidate +covered.SKILLD-13,14,18,19,1A,1B,1C,1D,1F,1G,1H,1J,1K,1M,1N,1P,1Q,1R,1S,1T, allD1_ERROR: D1 DB is overloaded, on read endpoints, in 4-5 second crawler-sweep windows (Aug 31 06:06Z, Sep 2 09:17Z). The known ledger fingerprint, exit condition still unmet. No layer retries this message:@harlan-zw/nuxt-cloudflareTRANSIENT_D1_SIGNALSlacks it, andserver/utils/db.tsretries only long-running import/export. One PR adds it to the replayable-read retry inserver/utils/db.ts. The owning fix covers all 20 ids if a later sweep confirms.SKILLD-17,SKILLD-1V:expected. Nitro route-cache writes are best-effort; thesetItemrejection is caught and reported viacaptureError(singleObject.setItemframe,auto.function.nuxt.nitro). The request succeeds, the write is dropped. KV allows one write per key per second. No code change.SKILLD-11(256 events, last 2026-08-31T22:10Z):already-fixed. Fixed by24a14b5(fix(registry): answer 410 for gone sources on skill-files and skill-asset #109), carried by the deployed1f5dcb9build. Last event precedes that deployment; quiet since. Resolve--in-release 1f5dcb92378e….SKILLD-1E(16 events, last 2026-09-03T17:50Z):blocked. Fix merged aseafbfd5(fix(registry): retry a transient ungh tree read before answering 503 #119); production does not carry it. Next action: land the pending deploy ofmain, confirm one clean window, then resolve in that release.SKILLD-15,SKILLD-16:third-party. Cloudflare D1 maintenance window. Thee3045fcretry (4 attempts, ≤~480ms backoff) is deployed but cannot clear a minutes-long maintenance inside a request. Counts 2 and 1, stale since 2026-08-20.SKILLD-10:already-fixed. Fixed bye3045fc(fix(d1): recover transient read failures #26); last event 2026-08-13T14:08Z predates it.SKILLD-S:already-fixed. Fixed by04dc7c7(fix(registry): stop a KV outage 500ing every /gh page #40,readCache); last event 2026-08-18, quiet 16 days.SKILLD-V,SKILLD-W:already-fixed. og-props coercion landed in56b6c56; ledger confirmed 2026-08-18; quiet since 2026-08-12.SKILLD-X:already-fixed.ba8ede4(fix(registry): keep D1 reads within platform limits #21) +0349755(fix(registry): guard the cluster page against the D1 parameter cap #50) chunking; quiet since 2026-08-13.SKILLD-Y:already-fixed.withD1ResetRecovery+e3045fc; one event, 2026-08-12.SKILLD-Z:already-fixed. Nuxt Content route removed in97a0d39; quiet since 2026-08-13.SKILLD-12:third-party. nuxt-skew-protection multi-tab plugin, 1 event, 2026-08-19. Upstream module owns the channel lifecycle; no local fix.Proposed actions
mainand find why827faafnever served. This unblocksSKILLD-1Eand theSKILLD-11resolution.D1 DB is overloadedto the replayable-read retry matcher inserver/utils/db.ts, with a failing-first unit test intest/unit/platform-d1.test.ts. See the Candidate.SKILLD-11in1f5dcb9, resolve the six stalealready-fixedids (S,V,W,X,Y,Z,10) per the release evidence above, and leaveSKILLD-1E, the overload family, theexpectedandthird-partyrows open.No Sentry issue was resolved this turn. No branch, worktree, or PR was created.
Confidence: 88/100. Verified: snapshot checksum, all 34 bundles, Cloudflare deployment history, release-to-event mapping, retry code paths. Unverified: GitHub CI state (401) and whether the
827faafdeploy failed smoke or never ran.harlan-github-agent commentedon Sep 4, 2026
2026-09-04T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 1 found | 0 new | 1 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry check-in — skilld.dev (read-only)
Verdict: AMBER. 34 open issues on project
skilld(orgharlan-zw), allnewto this run's ledger. 20 of 34 are one live D1-overload family with events through 2026-09-04; one small code fix covers it. Most remaining ids are already fixed onmainand are stale. Production lags HEAD, which holds one merged fix this family needs.Scope
skilld, checkout/home/harlan/sites/skilld.dev.harlan-agent-routine-sentry-checkin-2026-09-04-7d58f4eaff46(default branch, read-only this turn).$SITES_FILEunset,~/SITES.mdmissing,~/sites/SITES.mdmissing — the repo's owndocs/ops/triage-ledger.mdserved as prior-disposition evidence.c70fe319c58bd34493a8af5d377d0e3da26353b8af7db89ee0f8d788c0a32be5, no dropped duplicates, all statesnew. Run dir:~/.local/state/sentry-checkin/run-sPenhpR7.1f5dcb92(deployed 2026-09-02T01:31Z). HEAD5d2e6519is two days ahead; PR fix(registry): retry a transient ungh tree read before answering 503 #119 (ungh tree-read retry) is on HEAD and not in production.Findings by cluster
retryD1MaintenanceReadinserver/utils/db.tsnor@harlan-zw/nuxt-cloudflare'sTRANSIENT_D1_SIGNALSlists the overload message, so replayable reads fail instead of retrying. Fix: extend the repo retry to replayable reads on this error. Candidate below.cachedEventHandlerKV write ([cache] Cache write error), caught and logged; the request succeeds. RepowriteCache/readCachealready degrade best-effort on their paths. No code change ≤5 files without muting, which is forbidden. Dispositionexpected; wide events carry the signal.readCachelanded 2026-08-19 (#40), in production. Last event 2026-08-18T06:24Z precedes it. Resolve in the carrying release.withD1ResetRecoverylanded 2026-08-14 (#26). Single event 2026-08-12.withSession is not a functionon content querye58.split)56b6c56, og-props coercion), in production; last event 2026-08-12.b6c4caf), in production, with guard test. Last event 2026-08-19.Proposed actions
harlan-github-agent commentedon Sep 6, 2026
2026-09-05T20:20:00.000Z — Skipped. This run was due more than 6 hours ago, so it was skipped.
harlan-github-agent commentedon Sep 6, 2026
2026-09-06T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 2 issues requested
Sentry check-in: skilld-dev/skilld.dev (read-only)
Verdict: 2 live defect classes need code, 11 already-fixed ids wait on Sentry resolution once deploy state is confirmed, 0 regressions. Frozen snapshot
skilld.snapshot.json(checksumc70fe319c58bd34493a8af5d377d0e3da26353b8af7db89ee0f8d788c0a32be5, no duplicate ids dropped), 34 open issues, allnew(no prior run history). No mutations made: no branch, no PR, no ledger recorded; history at/home/harlan/.local/state/sentry-checkin/history.tsvstays untouched.Coverage (34/34)
Live, needs a PR (22 ids).
D1_ERROR: D1 DB is overloaded. Requests queued for too long.(7683331480, 7683331513, 7701851775, 7701851777, 7701851783, 7701851784, 7701851793, 7701851846, 7706489539, 7706489557, 7706489559, 7706489573, 7706489580, 7706489596, 7706489601, 7706489615, 7706489624, 7706489639, 7706489647, 7706489648; ~347 events). Latest events ran release1f5dc/11fe9b8(2026-08-31, 2026-09-02), which already carries every shipped mitigation (skill-related caching, canonical links, indexes). Verified missing: neitherretryD1MaintenanceReadinserver/utils/db.tsnorTRANSIENT_D1_SIGNALSin@harlan-zw/nuxt-cloudflare/d1matches the overload message, so a replayable read that hits a full D1 queue fails on first attempt. Candidate 1 fixes the category and covers all 20 ids.KV PUT failed: 429 Too Many Requests(7701833213, 7706553864). Both postdate thewriteCachefix (3ab8ea5, 2026-08-03). The 2026-09-02 bundle carries the breadcrumb[cache] Cache write error. Error: KV PUT failed: 429 Too Many Requests, which is Nitro 2.13.4's route cache (defineCachedEventHandler) writing hot keys straight toKV_CACHE; nitro catches the rejection butcaptureErrorraises a fresh Sentry issue per hot path on every crawler sweep. Candidate 2 fixes the category at the storage mount.Already fixed at HEAD, resolution evidence only (11 ids). Every one of these last fired on a release that predates the fix commit (release names verified with
git cat-file -e):KV GET 500→ fixed byreadCache(04dc7c7, fix(registry): stop a KV outage 500ing every /gh page #40); last event 2026-08-18 on2e4f9d6.e58.split→ fixed byog-props.ts(56b6c56); last events 2026-08-12 ond2616c5.too many SQL variableson/api/clusters→ fixed by the parameter-cap guard (0349755, fix(registry): guard the cluster page against the D1 parameter cap #50); last event 2026-08-13 ondf28e5e.D1_RESET_DO→ fixed bywithD1ResetRecovery(e3045fc, fix(d1): recover transient read failures #26); last event 2026-08-12 one0fe519.e57.withSession is not a function→ 2 events, silent since 2026-08-13 onb37cf91, one day before fix(d1): recover transient read failures #26 rewired the D1 proxy; watch for one recurrence before further work.long-running import/export→ fixed by the read retry (8ea5861, fix(d1): retry reads during exports #55, 2026-08-21); last events 2026-08-20 onaa64972, hours before the fix.Skill source is unavailable upstream(256 events) → fixed by the gone-source 410 boundary (fix(registry): answer 410 for gone sources on skill-files and skill-asset #109,24a14b5c); last event 2026-08-31T22:10Z ond4e951e.1f5dc, built 2026-09-02T01:23Z, one hour before fix(registry): retry a transient ungh tree read before answering 503 #119 (eafbfd5, ungh tree retry) merged; production evidently sat on the pre-fix(registry): retry a transient ungh tree read before answering 503 #119 build while deploy checks were unstable (fix(ci): stabilize main deploy checks #132, 2026-09-04).already-fixedonce the post-fix(registry): retry a transient ungh tree read before answering 503 #119 deploy is confirmed serving;blockedon that deploy confirmation if it has not happened.BroadcastChannel postMessage→ fixed upstream in nuxt-skew-protection 1.5.2, installed and guarded bytest/unit/skew-protection-multi-tab.test.ts.Proposed actions
server/utils/db.ts, 2 files). Covers the 20 overload ids.cachestorage so nitro route-cache KV rejections degrade to a miss with a wide event instead of a captured error (nuxt.config.ts+ driver + test, 3 files). Covers the 2 KV PUT ids.The maintenance read retry in retryD1MaintenanceRead only matches long-running import and export messages, so a D1 overload rejection fails a replayable read on its first attempt and 20 live endpoint issues keep growing.
Target:
server/utils/db.tsVerify with:
pnpm vitest run test/unit/platform-d1.test.tsEstimated to change 2 files.
Nitro's route cache writes hot keys straight to the KV_CACHE binding, so each 429 from the one-write-per-second limit is captured to Sentry as a fresh error issue per hot path during a crawler sweep.
Target:
nuxt.config.tsVerify with:
pnpm vitest run test/unit/nitro-cache-storage.test.tsEstimated to change 3 files.
harlan-github-agent commentedon Sep 7, 2026
2026-09-07T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 2 found | 2 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 2 issues requested
Sentry check-in: skilld.dev (project
skilld)Verdict: backlog is 34 issues, all
newto the ledger, zero prior dispositions. Every issue is accounted for. Two live noise sources get one small filter PR each. Everything else is already fixed in code; most of those fixes deployed on 2026-09-07 and just need a Sentry resolve with release evidence on the next mutating run.Scope and method
harlan-zw(the only organization;skilld-devis the GitHub owner, not a Sentry org). Projectskilld, matched to skilld.dev throughsentry.client.config.tsandshared/sentry.ts(DSN project id 4511781692506112).$SITES_FILE(empty),~/SITES.md,~/sites/SITES.md. Scope taken from the request instead.c70fe319c58b.... Run dir:~/.local/state/sentry-checkin/run-9gwt5G2X.~/.local/state/sentry-checkin/history.tsvis empty. Counts: 34new, 0recurring, 0unclosed.Triage, all 34 issues
f82a70a, 2026-09-07) addedd1 db is overloadedtoRETRYABLE_D1_READ_MESSAGESinserver/utils/db.ts. All events are 2026-09-02 to 09-04, from releases11fe9b8aand1f5dcb92, which predate the fix.f82a70ais an ancestor of release8b1af9f, built 2026-09-07; a Cloudflare deployment followed at 06:14Z. Resolve in8b1af9fonce its deploy SHA is confirmed.4025044) routes Nitro cache writes through the tolerant KV mount and drops the forwarded error inserver/plugins/sentry.tsbeforeSend, viaisBestEffortCacheWriteError. Events 2026-08-31 and 09-02 predate it. Same release evidence as above.8ea5861(2026-08-21) retries reads during D1 maintenance; ancestor of release11fe9b8a(2026-08-31). Events 2026-08-13 and 08-20 come fromb37cf91eandaa64972d.layers/registry/server/api/skill-files/[...slug].get.tsthrows 503 with Retry-After whenfetchUpstreamTreereportsunavailable. That is intended. The handler already emits an operational wide event for the outage, so the Sentry capture is duplicate noise. Last event 2026-09-05, so this recurs. Candidate 1.ba8ede4(2026-08-13 18:27 AEST) chunked the/api/clustersselectors atD1_BOUND_PARAMETER_LIMIT. The one event fired 08:35Z the same day fromdf28e5ec, minutes before the fix. No recurrence.04dc7c7(PR #40, 2026-08-19) madereadCachetreat a failed read as a miss. The single event, 2026-08-18 16:24 AEST, ran on2e4f9d6b, built 15:16 AEST the day before the fix.e3045fc(2026-08-14) wraps reads inwithD1ResetRecovery. Event 2026-08-12 frome0fe519a.e3045fcadded thewithSessionproxy increateMaintenanceTolerantDatabase. Event 2026-08-13 fromb37cf91e.56b6c56(2026-08-12); repo triage ledger row confirms exit condition met 2026-08-18. Events 2026-08-12 fromd2616c5e.nuxt-skew-protection's multi-tab client plugin, not repo code. One event, 2026-08-19. A clientbeforeSendfilter is the safe local mitigation. Candidate 2.Proposed actions
beforeSendfilter. Files:shared/sentry.ts,server/plugins/sentry.ts, one test file. Covers SKILLD-11, SKILLD-1E.postMessageerror in a clientbeforeSendfilter. Files:shared/sentry.ts,sentry.client.config.ts, one test file. Covers SKILLD-12.8b1af9fis the deployed SHA, then resolve the 29 already-fixed issues listed above in their carrying releases. Do not resolveexpectedorthird-partyrows.Unmatched projects: none. Unmatched inventory sites: none in scope. Zero-issue sites: not applicable, single project.
Confidence: 88/100. Verified: snapshot checksum, per-issue bundles, fix commits and their release ancestry, and the Cloudflare deployment timestamp. Unverified: the exact SHA inside the 2026-09-07 06:14Z deployment, and that the Sep 7 releases receive no new events under live traffic.
The skill-files, skill-asset and skills-raw handlers throw their intended upstream-outage 503 as an unhandled error, so Sentry records SKILLD-11 and SKILLD-1E although fetchUpstreamTree already reports the outage as an operational wide event.
Target:
shared/sentry.tsVerify with:
pnpm vitest run test/unit/sentry-cache-write-filter.test.tsEstimated to change 3 files.
The client Sentry config reports a benign tab-close race in nuxt-skew-protection's multi-tab plugin (SKILLD-12, InvalidStateError: Channel is closed) as an error.
Target:
shared/sentry.tsVerify with:
pnpm vitest run test/unit/sentry-cache-write-filter.test.tsEstimated to change 3 files.
harlan-github-agent commentedon Sep 8, 2026
2026-09-08T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 5 found | 5 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 5 issues requested
Sentry check-in, skilld.dev, 2026-09-08 (read-only)
Verdict: AMBER. 37 open issues, all frozen as new for this routine's history file. 14 are already-fixed in Sentry's eyes and only need resolving against deployed releases; 25 belong to two live families: D1 saturation during crawler sweeps (23 ids, events today) and upstream-blip 503s on skills-raw (SKILLD-1E, grew after the #119 retry fix). Five small cache candidates proposed below; no code was changed, committed, or pushed.
Scope and method
Dispositions
Already-fixed, resolve next run in the carrying release after confirming the deploy (14 ids, all with last-seen before their fix deployed and 5+ days clean): SKILLD-S (readCache, shared/server/cache.ts), SKILLD-V and SKILLD-W (og-props numeric-handle fix, 56b6c56), SKILLD-Z (content route removed, 97a0d39), SKILLD-X (D1 SQL variable chunking, ba8ede4), SKILLD-Y (D1 reset recovery, #26), SKILLD-10 (import retry, #55), SKILLD-15 and SKILLD-16 (export retry, #55), SKILLD-12 (BroadcastChannel skew fix #66), SKILLD-11 (gone-source 410 on skill-files/skill-asset, #109).
Watch, then resolve: SKILLD-17 and SKILLD-1V (KV PUT 429). The beforeSend drop (#176) and route-cache wide-event resolution (#159) deployed 2026-09-07/08, after both ids' last events. Expect the next burst window to be silent; then resolve.
Live, D1 overload family (23 ids): SKILLD-13, 14, 18, 19, 1A, 1B, 1C, 1D, 1F, 1G, 1H, 1J, 1K, 1M, 1N, 1P, 1Q, 1R, 1S, 1T, 1W, 1X, 1Y. Still firing today on the current release despite #158 (D1 read retry) and #168 (stale fallback on skill-related). Mechanism per the ledger: crawler sweeps of unique cold keys; no cache helps a never-cached key. Root mitigation is capacity or crawler shaping, which is a decision, not a small fix; the five candidates below remove the remaining uncached and short-TTL hot paths and would have covered 9 of today's 23 culprit endpoints.
Live, skills-raw outage 503s: SKILLD-1E. Five events 2026-09-03 to 09-05 across four repositories, after #119's tree retry deployed. Matches the ledger's own over-firing exit condition; candidate 5 is the mitigation.
Blocked: none.
Proposed actions
Five candidates, each one small PR: cache the org profile endpoint, cache the user skills endpoint, add stale serving to the tag profile cache, add stale serving to both cluster endpoints, and serve the stale skills-raw body when upstream blips. Resolve the 14 already-fixed ids in their carrying releases on the next non-read-only run. No Sentry resolutions were applied this run; nothing was muted.
Confidence: 91/100. Verified live Sentry state, deployed release, fix lineage in git, and handler cache shapes by reading code. Untested path: whether ungh (not skilld) was down during the 09-03 to 09-05 SKILLD-1E events; the events are consistent with either an ungh outage or classifier over-firing.
GET /api/orgs/:owner is a bare defineEventHandler with no route or read-through cache, so every crawler hit runs five-plus D1 queries plus per-repo upstream fetches, which is the recurring D1 overload culprit (SKILLD-1M, SKILLD-1N, and the 2026-08-05 orgs family).
Target:
layers/registry/server/api/orgs/[owner].get.tsVerify with:
pnpm vitest run test/unit/org-profile-cache.test.tsEstimated to change 2 files.
GET /api/users/:login/skills is a bare defineEventHandler with no cache, so each crawler hit repeats the same D1 reads and landed as SKILLD-1K in the D1 overload burst.
Target:
server/api/users/[login]/skills.get.tsVerify with:
pnpm vitest run test/unit/user-skills-cache.test.tsEstimated to change 2 files.
The tag profile handler caches for 60 seconds with swr disabled on a heavy FTS query plus per-row subqueries, so crawler sweeps recompute it continuously (SKILLD-19, SKILLD-1C, SKILLD-1H).
Target:
layers/registry/server/api/tags/[slug].get.tsVerify with:
pnpm vitest run test/unit/tag-profile-cache.test.tsEstimated to change 2 files.
Both cluster handlers cache for 60 seconds with swr disabled, so crawler sweeps re-run the cluster index D1 queries every minute (SKILLD-1A, recurring burst member).
Target:
layers/registry/server/api/clusters/index.get.ts and layers/registry/server/api/clusters/[slug].get.tsVerify with:
pnpm vitest run test/unit/cluster-cache.test.tsEstimated to change 3 files.
The raw endpoint keeps a fetched body for only 5 minutes with no stale fallback, so an upstream blip after expiry answers 503 retry-after on the npx skilld run surface although a last-good copy existed minutes earlier (SKILLD-1E kept growing after #119).
Target:
layers/registry/server/api/skills-raw/[...slug].get.tsVerify with:
pnpm vitest run test/unit/skills-raw-tree-outage.test.tsEstimated to change 2 files.
harlan-github-agent commentedon Sep 9, 2026
2026-09-09T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 code proposals | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry check-in, skilld-dev/skilld.dev, 2026-09-09T20:20:00.000Z
GREEN. 42 frozen issues, all covered in the audited ledger. 9 resolved in the verified deployed release
103991d0b34830f98e5b361c4c8665d8f0d75aaa. 33 stay open as third-party Cloudflare platform failures with mitigations already deployed. No code repairs needed, so no Candidates and no PR. Repository unchanged.Scope and access
skilld-dev/skilld.dev, controller worktreeskilld.dev.harlan-agent-routine-sentry-checkin-2026-09-09-9f3c9c18b5abon103991d(=origin/main).harlan-zw. Project:skilld.4511781692506112inshared/sentry.ts:1matches Sentry projectskilld(id4511781692506112). One project, exact match, no unmatched projects.sentry-cliinstalled and authenticated. No script failures. No duplicate ids dropped.Counts
First routine run against this history file, so every id tags
new. Prior manual triage indocs/ops/triage-ledger.mdwas used as leads only.Deployment evidence
Release
103991d0b34830f98e5b361c4c8665d8f0d75aaa:https://skilld.dev/200,/api/clusters200.git merge-base --is-ancestor.Resolved this run (9), all
--in-release 103991d0b34830f98e5b361c4c8665d8f0d75aaa7662446055KV GET 500readCachetreats a rejected KV read as a miss (acbd24c#40). Last event 2026-08-18 precedes the fix.7666848469OG island 500, digit loginog-propscoercion (56b6c56), test-guarded. Last event 2026-08-12T01:32Z.7666848478e58.split is not a function7667355409too many SQL variablesfindClusterIndexRowschunks at the D1 100-parameter cap (ba8ede4#21,0349755#50). Last event 2026-08-13; live endpoint 200 today.7669649767withSession is not a functionwithSession(e3045fc#26, 2026-08-14). Last event 2026-08-13T13:01Z.7676028614skill source unavailable upstream24a14b5c0#109), tree reads retry (eafbfd5#119), residual capture dropped inbeforeSend(c318148#176). Last event 2026-08-31T22:10Z.7701833213KV PUT 429 captured4025044#159);beforeSenddrops the signature. Last event 2026-08-31T05:48Z.7705072099skill source unavailable upstreameafbfd5) + capture filter (c318148). Last event 2026-09-05T01:14Z, before this release.7706553864KV PUT 429 captured4025044) + capture filter. Last event 2026-09-02T10:04Z.Resolution plan ran before
--apply. All 9 re-read through the API after applying:status=resolved,statusDetails.inRelease=103991d0b34830f98e5b361c4c8665d8f0d75aaa. Sentry reopens any of these as a regression if the error returns.Left open (33), all
third-party, never resolvedSKILLD-13/14/18/19/1A/1B/1C/1D/1F/1G/1H/1J/1K/1M/1N/1P/1Q/1R/1S/1T/1W/1X/1Y/1Z/20/21/22/23): Cloudflare D1 capacity rejection during crawler and ingest bursts. All frames terminate incloudflare-internal d1-api. Mitigations deployed: route caching (d56a917,bb607cc) and the replayable-read retry (f82a70afix(d1): retry replayable reads on D1 overload #158). Events at 2026-09-09T02:11Z continue after the retry fix, so the residual is platform capacity. Exit condition unchanged: a crawler sweep produces no burst.SKILLD-10/15/16: D1 refuses reads while a long-running import or export holds the database. Platform lock, no local frame.SKILLD-Y: Cloudflare D1 durable-object reset (D1_RESET_DO). Platform transient.SKILLD-12:nuxt-skew-protectionBroadcastChannelpostMessageafter close. Stack entirely in the dependency runtime, one event, 2026-08-19, no recurrence.Candidates
None. No disposition this run needed a code repair. The repository is unchanged (0 tracked modifications), no branch, no PR.
Artifacts
/home/harlan/.local/state/sentry-checkin/runs/766422606816d7c50ff67eb7914ba507b0e79c3e7ba9b3044ca945b81a8ff69bskilld.snapshot.json(issue_ids_sha256 8b1beecf19fbb0bb2c0a867d4dbb71315d8177173b3407f81d5d1dea9b8dc644)skilld.history.jsonartifacts/skilld/manifest.jsonartifacts/ledger.tsv(42 rows,ledger_sha256 978278b8b59234846a86e3d7c72292704ce3d4e2ab477b0acc9a9312e0893a6a, audit pass)skilld.resolve-plan.json,skilld.resolve-apply.json,skilld.resolve-verify.txt/home/harlan/.local/state/sentry-checkin/history.tsv(42 rows appended for run idskilld-dev/skilld.dev:sentry-checkin:2026-09-09T20:20:00.000Z)Confidence: 95/100. Verified end to end: frozen snapshot, 42-row audited ledger, resolution plan, applied resolutions, and per-issue API status checks. The untested remainder is future behaviour: a recurrence reopens any resolved id, and the D1 overload family depends on Cloudflare capacity, not on this run.
harlan-github-agent commentedon Sep 10, 2026
2026-09-10T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 code proposals | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry Check-in: skilld-dev/skilld.dev — 2026-09-10T20:20:00.000Z
Verdict: Backlog is one Cloudflare D1 capacity class plus one stale upstream bug. This run resolved SKILLD-12 in the verified live release. The 33 D1 rows stay open as third-party: the deployed read-retry mitigation is live and cannot remove Cloudflare capacity errors. No code repairs this run.
Scope and mapping
harlan-zw(sole org). Project:skilld.shared/sentry.ts:1points at project id4511781692506112, which is theskilldproject in Sentry. Not name similarity.duplicate_ids_dropped: none.git status --porcelainclean. No commits, pushes, PRs, or deploys.Coverage
skilld.snapshot.json, queryis:unresolved).ee5b3eb5…eaf5aequals audit checksum.Resolved this run
already-fixed103991d0b34830f98e5b361c4c8665d8f0d75aaab6c4caf(catalog → nuxt-skew-protection 1.5.2, local patch dropped), which is an ancestor of release103991d0b. That release is proven deployed: it carried production events dated 2026-09-10T15:36. Last SKILLD-12 event 2026-08-19 predates the fix; no recurrence across three weeks. Guarded bytest/unit/skew-protection-multi-tab.test.ts.Plan (
resolve-plan.json) ran before--apply(resolve-applied.json); API re-read (resolve-verify.json) confirmsstatus: resolved,inRelease: 103991d0b….Unresolved, with reasons
third-party(Cloudflare D1 capacity/maintenance):D1_ERROR: D1 DB is overloaded(SKILLD-13, -14, -18, -19, -1A, -1B, -1C, -1D, -1F, -1G, -1H, -1J, -1K, -1M, -1N, -1P, -1Q, -1R, -1S, -1T, -1W, -1X, -1Y, -1Z, -20, -21, -22, -23, -24).D1_ERROR: {"D1_RESET_DO":true}(Cloudflare Durable Object reset).retryReplayableD1Read(server/utils/db.ts:133, deployed inf82a70a, present in live release103991d0b), yet fresh failures on 2026-09-10 still surfaced from that release. The root cause is Cloudflare capacity, no local code can remove it. Mitigation decision: keep the read retries; accept residual 500s during D1 overload windows. Never resolved in Sentry; a regression would still surface.blocked. No issue was muted.Code repair Candidates
None. Every open issue is third-party with its mitigation already deployed; the one fixable issue was already fixed upstream and is now resolved in Sentry.
Artifacts
/home/harlan/.local/state/sentry-checkin/runs/c20bca4f77bd529927338dc052f0412a72b7984798eb146372a330ce01b86f56skilld.snapshot.jsonskilld.history.jsonskilld.bundles.json/(+manifest.json)ledger.tsv— audit:audit.jsonresolve-plan.json,resolve-applied.json,resolve-verify.json/home/harlan/.local/state/sentry-checkin/history.tsv(34 rows appended for runskilld-dev/skilld.dev:sentry-checkin:2026-09-10T20:20:00.000Z)Confidence: 93/100. Verified end to end: snapshot checksums, audit, resolve plan → apply → API re-read, history append. Untested: none within this run's scope; the D1 third-party verdict rests on Cloudflare-side behavior this run cannot exercise.
harlan-github-agent commentedon Sep 11, 2026
2026-09-11T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 code proposals | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry check-in: skilld-dev/skilld.dev, 2026-09-11
Verdict: backlog unchanged and all third-party. One new Nuxt error-page crash, no local fix. Zero eligible Sentry resolutions. No code Candidates, no PR.
Scope
skilld.dev.harlan-agent-routine-sentry-checkin-2026-09-11-7efb6baa95de(read only).harlan-zw(sole org). Project:skilld, matched by tracked DSN inshared/sentry.ts:1(project ID 4511781692506112). No unmatched projects, no exclusions.sentry-cli info.Coverage
c3e117218cc846bf3693c5a9732eff2eddd2da49f0c6e851f69c56ca9f550859).30badebbe33d0d4397f9c6ab100c207412bf691803ec26312dda60ad0e466543.Dispositions
third-party:D1_ERROR: D1 DB is overloaded/long-running import/export). Every stack terminates incloudflare-internal:d1-api(D1DatabaseSession._sendOrThrow) behind Nitro handlers. Events span releases up to103991d0b348with latest event 2026-09-10, so the platform failure is still live. The app already retries throughrunRecoverable. No local fix exists; mitigation is keep-open monitoring and Cloudflare escalation if volume grows.SKILLD-25(7726701629)TypeError: t.toString is not a function, single client event 2026-09-11 at/__nuxt_error.md, release103991d0b348. Mechanismauto.function.nuxt.vue-error; every frame isnuxt@4.5.2/vue@3.5.42dist code, innermostnuxt-error-page.vueLg.setup. The repo ships noerror.vueand no local code references__nuxt_error; the.mdsource plugin only answers/gh/*/*.md. No local fix; mitigation is monitor and add a customerror.vueor upgrade Nuxt if it recurs.Sentry resolutions
fixed,covered, oralready-fixedrows exist, so no--in-releaseplan ran and nothing was applied. All 33 rows stay open by rule (third-partyis never resolved).Code repairs
Artifacts
/home/harlan/.local/state/sentry-checkin/runs/2dc6ce5f4883f28e191b84cbc6fb2f559c2d5d4dd37daef9fa11396401e7771b/skilld.snapshot.json/home/harlan/.local/state/sentry-checkin/runs/2dc6ce5f4883f28e191b84cbc6fb2f559c2d5d4dd37daef9fa11396401e7771b/skilld.bundles.json//home/harlan/.local/state/sentry-checkin/runs/2dc6ce5f4883f28e191b84cbc6fb2f559c2d5d4dd37daef9fa11396401e7771b/skilld.history.json/home/harlan/.local/state/sentry-checkin/runs/2dc6ce5f4883f28e191b84cbc6fb2f559c2d5d4dd37daef9fa11396401e7771b/ledger.tsv/home/harlan/.local/state/sentry-checkin/runs/2dc6ce5f4883f28e191b84cbc6fb2f559c2d5d4dd37daef9fa11396401e7771b/audit.json/home/harlan/.local/state/sentry-checkin/history.tsv(33 rows appended for runskilld-dev/skilld.dev:sentry-checkin:2026-09-11T20:20:00.000Z, date 2026-09-11)Script failures and missing evidence
harlan-github-agent commentedon Sep 12, 2026
2026-09-12T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 code proposals | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry Check-in: skilld.dev (skilld) — 2026-09-12
Verdict: no action needed. All 32 open issues are already-attributed upstream classes (29x Cloudflare D1 capacity, 2x D1 export lock, 1x Nuxt error-page internals); zero eligible resolutions, zero code repairs this run.
Run identity
skilld-dev/skilld.dev:sentry-checkin:2026-09-12T20:20:00.000Zskilld-dev/skilld.dev, controller worktree at HEAD103991d0(clean, unchanged)harlan-zw, projectskilld(matched via DSN project id4511781692506112inshared/sentry.ts:1)Coverage
c7c9d6c8...53e2c6== ledger auditc7c9d6c8...53e2c6Dispositions (all 32 rows)
D1 DB is overloaded. Requests queued for too long.), 29 groupings103991d0/1f5dcb92; mitigation (SWR inflight dedup,shared/server/cache.ts) already deployed; kept open as upstream capacity signalCurrently processing a long-running export.)aa64972d; manual D1 export lock, no local fix; quiet 3+ weeks103991d0; all 18 frames inside vue/nuxt 4.5.2 deps, throw sitenuxt-error-page.vuesetup, zero app frames; mitigation: monitor, Sentry reopens on regressionResolutions
already-fixed/covered): none. Every issue's latest event landed on the currently deployed release103991d0(live events 28h before the run), so no issue is provably fixed by a deployed release.third-partyrows are never resolved.Code repairs
Notes
third-partyfor all 32; this run re-verified each against fresh event evidence and the repo's deployed mitigation before agreeing.Artifacts
/home/harlan/.local/state/sentry-checkin/runs/41d2b346f055602424dba3681bc9eb7b0b66cd6b14e649ff46d3228a0e15b0c9/skilld.snapshot.json/home/harlan/.local/state/sentry-checkin/runs/41d2b346f055602424dba3681bc9eb7b0b66cd6b14e649ff46d3228a0e15b0c9/skilld.history.json/home/harlan/.local/state/sentry-checkin/runs/41d2b346f055602424dba3681bc9eb7b0b66cd6b14e649ff46d3228a0e15b0c9/skilld.bundles.json/(32 bundles +manifest.json)/home/harlan/.local/state/sentry-checkin/runs/41d2b346f055602424dba3681bc9eb7b0b66cd6b14e649ff46d3228a0e15b0c9/ledger.tsv/home/harlan/.local/state/sentry-checkin/runs/41d2b346f055602424dba3681bc9eb7b0b66cd6b14e649ff46d3228a0e15b0c9/report.md/home/harlan/.local/state/sentry-checkin/history.tsvharlan-github-agent commentedon Sep 13, 2026
2026-09-13T20:20:00.000Z — sentry-checkin on skilld-dev/skilld.dev | 0 code proposals | 0 new | 0 already known | 0 outside allowed scope | 0 over 5 files | 0 issues requested
Sentry check-in: skilld.dev/skilld.dev (org harlan-zw, project skilld)
Verdict: healthy triage, no code defects. All 32 frozen issues are upstream or unattributable; 31 are Cloudflare D1 capacity/export-lock failures surfaced through
cloudflare-internal:d1-api, 1 is a single unattributable client TypeError inside minified Nuxt error-page internals. Zero eligible Sentry resolutions this run; zero code repair Candidates. Nothing was muted.Scope and mapping
skilld.dev/skilld.dev, controller worktree, read-only (git statusclean at end).sentry-cliauthenticated, sole orgharlan-zw.shared/sentry.ts:1(project id4511781692506112) maps exactly to projectskilld. No unmatched projects. No inventory exclusions apply.is:unresolvedviasentry-cli, 32 issues frozen, no duplicate IDs dropped.Counts
c7c9d6c8d554ca3c83d4e62ce6f08854513ae031757e0ac21b0a4fc26e53e2c6matches the snapshot.new0,recurring32,unclosed0.third-party32.fixed/already-fixed/coveredrows exist;third-partyis never resolved).Issue inventory (all third-party)
D1_ERROR: D1 DB is overloaded. Requests queued for too long.(29 issues: SKILLD-13, 14, 18, 19, 1A, 1B, 1C, 1D, 1F, 1G, 1H, 1J, 1K, 1M, 1N, 1P, 1Q, 1R, 1S, 1T, 1W, 1X, 1Y, 1Z, 20, 21, 22, 23, 24): every event stack originates atcloudflare-internal:d1-apiD1DatabaseSession._sendOrThrow; application frames are ordinary query helpers (findSkill,findRelatedSkills,getGeneratedBatch,findSkillCommitSource,listDuplicateCandidateRows, tag/org/repo handlers). Largest: SKILLD-1F, 1047 events, still firing 2026-09-13. Evidence: upstream Cloudflare D1 capacity saturation under request bursts. Mitigation: cached handler paths and wide events absorb the blast; issues stay open to watch for regression; no mute.D1_ERROR: Currently processing a long-running export.(2 issues: SKILLD-15, 16): same D1 seam; a long-running export holds the database. Last seen 2026-08-20; not recurring since. Mitigation: no mute, watch.TypeError: t.toString is not a function(SKILLD-25, 1 event, 2026-09-11, Chrome 144 zh-CN, culprit/__nuxt_error.md): all 18 frames are minified Vue 3.5.42 / Nuxt 4.5.2 internals; last framenuxt-error-page.vueLg.setup; zero application frames. No local fix attributable; client sourcemaps do not match events (release naming gap noted inshared/sentry.tscomments). Mitigation: no mute, monitor recurrence.Resolutions
resolution-plan.txtin the run dir). Noresolvecall, no--apply, no status re-reads required. No issues are eligible while every row isthird-party.Code repair Candidates
third-party. No prior rejections on file.Artifacts
/home/harlan/.local/state/sentry-checkin/runs/059a385f9a1dc4393e399d7d1c507d3763703ca1d583b76dd0ad5541c760e3f0/skilld.snapshot.json.../skilld.bundles.json/manifest.json(+ 32 per-issue bundles).../ledger.tsv; audit passed (32 rows, checksum match)/home/harlan/.local/state/sentry-checkin/history.tsv(32 rows appended for runskilld-dev/skilld.dev:sentry-checkin:2026-09-13T20:20:00.000Z, 2026-09-13).../resolution-plan.txtFailures and missing evidence
harlan-zw commentedon Oct 5, 2026
Agent triage by Codex, 2026-10-05. This is an agent assessment.
Sentry evidence now belongs to the daily check-in. The runbook removes the separate Sentry routine. Current D1 escalation and monitoring remain in #393. Closing this retired log does not resolve any Sentry issue.