JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 9497,
"has_wiki": false,
"homepage": null,
"languages": {
"C++": 146580,
"CSS": 833,
"HTML": 1302,
"Rust": 3283,
"Shell": 762,
"JavaScript": 656,
"TypeScript": 4395005,
"Objective-C++": 18988,
"Tree-sitter Query": 2282
},
"pushed_at": "2026-07-21T11:24:38Z",
"created_at": "2026-06-16T23:35:51Z",
"owner_type": "User",
"updated_at": "2026-07-17T12:06:43Z",
"description": "abide — type-safe isomorphic framework on Bun + web standards",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": "http://briancray.com",
"name": "Brian Cray",
"type": "User",
"login": "briancray",
"company": null,
"location": null,
"followers": 141,
"avatar_url": "https://avatars.githubusercontent.com/u/493597?v=4",
"created_at": "2010-11-23T15:46:23Z",
"is_verified": null,
"public_repos": 22,
"account_age_days": 5719
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "@abide/abide@0.58.0",
"kind": "other",
"published_at": "2026-07-17T12:09:01Z"
},
{
"tag": "@abide/abide@0.57.1",
"kind": "other",
"published_at": "2026-07-16T19:13:06Z"
},
{
"tag": "@abide/abide@0.57.0",
"kind": "other",
"published_at": "2026-07-16T15:20:29Z"
},
{
"tag": "@abide/abide@0.56.0",
"kind": "other",
"published_at": "2026-07-16T11:23:14Z"
},
{
"tag": "@abide/abide@0.55.0",
"kind": "other",
"published_at": "2026-07-15T22:55:02Z"
},
{
"tag": "@abide/abide@0.54.0",
"kind": "other",
"published_at": "2026-07-14T18:31:41Z"
},
{
"tag": "@abide/abide@0.53.0",
"kind": "other",
"published_at": "2026-07-14T10:39:49Z"
},
{
"tag": "@abide/abide@0.52.0",
"kind": "other",
"published_at": "2026-07-13T00:42:08Z"
},
{
"tag": "@abide/inspector@0.3.5",
"kind": "other",
"published_at": "2026-07-13T00:42:05Z"
},
{
"tag": "@abide/abide@0.51.0",
"kind": "other",
"published_at": "2026-07-12T13:55:00Z"
},
{
"tag": "@abide/abide@0.50.1",
"kind": "other",
"published_at": "2026-07-12T11:47:00Z"
},
{
"tag": "@abide/abide@0.50.0",
"kind": "other",
"published_at": "2026-07-12T01:09:20Z"
},
{
"tag": "@abide/abide@0.49.0",
"kind": "other",
"published_at": "2026-07-08T10:32:31Z"
},
{
"tag": "@abide/abide@0.48.0",
"kind": "other",
"published_at": "2026-07-06T22:36:37Z"
},
{
"tag": "@abide/inspector@0.3.4",
"kind": "other",
"published_at": "2026-07-06T22:36:34Z"
},
{
"tag": "@abide/abide@0.47.0",
"kind": "other",
"published_at": "2026-07-06T19:56:27Z"
},
{
"tag": "@abide/abide@0.46.0",
"kind": "other",
"published_at": "2026-07-04T13:11:53Z"
},
{
"tag": "@abide/abide@0.45.0",
"kind": "other",
"published_at": "2026-07-03T13:42:26Z"
},
{
"tag": "@abide/abide@0.44.1",
"kind": "other",
"published_at": "2026-06-30T01:03:09Z"
},
{
"tag": "@abide/abide@0.44.0",
"kind": "other",
"published_at": "2026-06-29T17:42:29Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.2.1",
"kind": "other",
"published_at": "2026-06-29T17:42:27Z"
},
{
"tag": "@abide/abide@0.43.1",
"kind": "other",
"published_at": "2026-06-27T02:38:45Z"
},
{
"tag": "@abide/abide@0.43.0",
"kind": "other",
"published_at": "2026-06-26T22:57:50Z"
},
{
"tag": "@abide/inspector@0.3.3",
"kind": "other",
"published_at": "2026-06-26T22:57:47Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.2.0",
"kind": "other",
"published_at": "2026-06-25T14:13:58Z"
},
{
"tag": "@abide/abide@0.42.0",
"kind": "other",
"published_at": "2026-06-25T14:13:55Z"
},
{
"tag": "@abide/abide@0.41.1",
"kind": "other",
"published_at": "2026-06-24T16:53:25Z"
},
{
"tag": "@abide/abide@0.41.0",
"kind": "other",
"published_at": "2026-06-24T00:58:05Z"
},
{
"tag": "@abide/abide@0.40.2",
"kind": "other",
"published_at": "2026-06-23T22:04:26Z"
},
{
"tag": "@abide/abide@0.40.1",
"kind": "other",
"published_at": "2026-06-23T21:59:56Z"
},
{
"tag": "@abide/abide@0.40.0",
"kind": "other",
"published_at": "2026-06-23T01:18:31Z"
},
{
"tag": "@abide/inspector@0.3.2",
"kind": "other",
"published_at": "2026-06-22T16:29:29Z"
},
{
"tag": "@abide/anthropic@0.2.4",
"kind": "other",
"published_at": "2026-06-22T16:29:26Z"
},
{
"tag": "@abide/claude-code@0.5.5",
"kind": "other",
"published_at": "2026-06-22T16:29:23Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.1.4",
"kind": "other",
"published_at": "2026-06-22T16:29:20Z"
},
{
"tag": "@abide/abide@0.39.0",
"kind": "other",
"published_at": "2026-06-22T16:29:17Z"
},
{
"tag": "@abide/abide@0.38.1",
"kind": "other",
"published_at": "2026-06-21T23:34:55Z"
},
{
"tag": "@abide/anthropic@0.2.3",
"kind": "other",
"published_at": "2026-06-21T21:09:41Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.1.3",
"kind": "other",
"published_at": "2026-06-21T21:09:38Z"
},
{
"tag": "@abide/abide@0.38.0",
"kind": "other",
"published_at": "2026-06-21T21:09:35Z"
},
{
"tag": "@abide/inspector@0.3.1",
"kind": "other",
"published_at": "2026-06-21T21:09:32Z"
},
{
"tag": "@abide/inspector@0.3.0",
"kind": "other",
"published_at": "2026-06-21T15:49:32Z"
},
{
"tag": "@abide/abide@0.37.0",
"kind": "other",
"published_at": "2026-06-21T15:49:29Z"
},
{
"tag": "@abide/abide@0.36.0",
"kind": "other",
"published_at": "2026-06-21T12:24:44Z"
},
{
"tag": "@abide/abide@0.35.0",
"kind": "other",
"published_at": "2026-06-21T02:19:28Z"
},
{
"tag": "@abide/abide@0.34.2",
"kind": "other",
"published_at": "2026-06-20T14:56:31Z"
},
{
"tag": "@abide/abide@0.34.1",
"kind": "other",
"published_at": "2026-06-20T13:24:04Z"
},
{
"tag": "@abide/abide@0.34.0",
"kind": "other",
"published_at": "2026-06-20T12:50:32Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.1.2",
"kind": "other",
"published_at": "2026-06-19T00:28:17Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.1.1",
"kind": "other",
"published_at": "2026-06-19T00:11:07Z"
},
{
"tag": "@abide/abide@0.33.1",
"kind": "other",
"published_at": "2026-06-18T23:04:01Z"
},
{
"tag": "@abide/inspector@0.2.1",
"kind": "other",
"published_at": "2026-06-18T22:44:18Z"
},
{
"tag": "@abide/anthropic@0.2.2",
"kind": "other",
"published_at": "2026-06-18T22:44:15Z"
},
{
"tag": "@abide/abide@0.33.0",
"kind": "other",
"published_at": "2026-06-18T22:44:12Z"
},
{
"tag": "@abide/prettier-plugin-abide@0.1.0",
"kind": "other",
"published_at": "2026-06-18T15:24:07Z"
},
{
"tag": "@abide/abide@0.32.2",
"kind": "other",
"published_at": "2026-06-18T14:07:45Z"
},
{
"tag": "@abide/abide@0.32.1",
"kind": "other",
"published_at": "2026-06-18T12:45:35Z"
},
{
"tag": "@abide/abide@0.32.0",
"kind": "other",
"published_at": "2026-06-18T02:04:06Z"
},
{
"tag": "@abide/abide@0.31.1",
"kind": "other",
"published_at": "2026-06-17T23:24:49Z"
},
{
"tag": "@abide/abide@0.31.0",
"kind": "other",
"published_at": "2026-06-17T23:00:06Z"
},
{
"tag": "@abide/abide@0.30.0",
"kind": "other",
"published_at": "2026-06-17T19:53:59Z"
},
{
"tag": "@abide/abide@0.29.0",
"kind": "other",
"published_at": "2026-06-17T18:57:11Z"
},
{
"tag": "@abide/inspector@0.2.0",
"kind": "other",
"published_at": "2026-06-17T18:12:19Z"
},
{
"tag": "@abide/anthropic@0.2.1",
"kind": "other",
"published_at": "2026-06-17T18:12:16Z"
},
{
"tag": "@abide/claude-code@0.5.4",
"kind": "other",
"published_at": "2026-06-17T18:12:13Z"
},
{
"tag": "@abide/abide@0.28.0",
"kind": "other",
"published_at": "2026-06-17T18:12:10Z"
}
],
"recent_commits": [
{
"oid": "cfe64cc16764e0e0b3d910a6d196e5f646f75571",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#51)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-17T12:06:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39413145899b8e3f77d56ea4ca1ab4330ebe9475",
"body": "…R-0049)\n\nA component's range now ships as <!--abide:c:PATH-->…<!--/abide:c:PATH--> (the\nchild's render-path) in place of the anonymous <!--[-->…<!--]-->. On a hydration\ndesync inside the child — including a client-true / server-false {#if} gating an\nelement's presence (pending(), refreshing(), any \n[…]\n-claiming a diverged branch and desyncing the cursor.\n\nRegression: uiComponentBoundaryRecovery (bound + static + congruent arms).\nWire-format assertions updated across the SSR/hydrate component tests.",
"is_bot": false,
"headline": "feat(ui): address component mounts as per-boundary recovery seams (AD…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-17T12:00:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "276791ea3fde825d95be229c04b4c1b466d74691",
"body": "* chore: version packages\n\n* chore: dedupe each-reconcile changelog entry in 0.57.1\n\n---------\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\nCo-authored-by: Brian Cray <bcrayzie@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#50)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-16T19:10:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "866c96d23b1107cd5a0895847e496020b3b24bfc",
"body": null,
"is_bot": false,
"headline": "chore: add changeset for mangled __SSR__ payload cold-boot degrade",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T18:15:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "adfee024d570e8bf46230fac1fa2521fcaae056f",
"body": "readSsrPayload's JSON.parse was uncaught, so a corrupted abide-ssr script\ntext threw out of startClient and failed the whole mount. The old inline\n`window.__SSR__ = {…}` statement failed the same way but left the global\nundefined, so the `?? {}` fallback booted cold. Restore that resilience.",
"is_bot": false,
"headline": "fix(ui): degrade a mangled __SSR__ payload to a cold boot (ADR-0051)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T18:12:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7367a23820b5d8c76e1246adc7ecdabd21b932de",
"body": "…s (ADR-0051)\n\nThe boot payload was a <script>window.__SSR__ = {…}</script> statement the\nbrowser compiled+evaluated as a multi-MB program on the critical path, and each\njson cache body was double-encoded (a JSON string re-escaped inside the payload,\n~2.35x the bytes and parsed twice). Ship the payl\n[…]\n onto window.__SSR__ for debug), and seed a json body\npre-parsed as `data` — single-encoded, read without a second parse. Warm-seed\nsemantics unchanged (ADR-0011 value equivalence, ADR-0048 manifest).",
"is_bot": false,
"headline": "perf(ssr): ship __SSR__ as inert JSON, single-encode json cache bodie…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T18:12:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e1372429a0a76a1e7176fe1474fe78ac31708adf",
"body": "spreadAttrs guards the spread enumeration against a pending blocking await\nread, but not the per-key value read. When source() is a restProps proxy\n(<Button {...rest}>), its get invokes the prop thunk, so a key reading a\nstill-pending blocking cell suspends inside bindKeys — after the enumeration\ngu\n[…]\npend and bind the key as a\ndeferred attribute (attr's effect fills it in on settle), matching attr and the\ndeferred-enumeration branch. Event handlers never suspend, so they stay on the\nlistener path.",
"is_bot": false,
"headline": "fix(ui): swallow a per-key suspend on a {...rest} spread",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T18:12:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1abc9431b6eb6f394862ee46b35f721eee21446e",
"body": "Regression tests exercise the reused keys/resolved buffers across\ngrow -> shrink -> grow (tail-clear branch) + reorder, and a duplicate-key\ncollapse that reads keys[index] from the reused scratch.",
"is_bot": false,
"headline": "test(each): cover reused reconcile scratch; add changeset",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T15:53:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b695e2dc59bcf07b8c1d6e01763e4d492bbe3dd3",
"body": "Hoist the per-reconcile keys/resolved arrays into persistent scratch\nbuffers reused across passes, so a steady-state list reconcile allocates\nnothing (was 2 fresh arrays of length N per change). Fuse the keyOf pass\ninto the resolve loop (still one keyOf call per item) and clear the stale\ntail on shrink so no disposed-row refs are retained.",
"is_bot": false,
"headline": "perf(each): reuse reconcile scratch arrays across passes",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T15:53:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c9268e83847244e54769e595dd6fdc2b27629b34",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#49)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-16T15:17:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8fb01948b17d03b5b2290378f036a96f76f07a2",
"body": "…nding (ADR-0043), strip pending undefined for {#await cell} (ADR-0047)\n\nA bare `state.computed(getFoo())` (no `await`) whose seed resolves to a\npromise/stream is a STREAMING cell at runtime (`isPromiseComputed` /\n`isEagerStreamComputed` → `trackedComputed(…, true)`) — it peeks `undefined`\nwhile pen\n[…]\nell<V>(v): Exclude<V,\nundefined>` (mirroring the runtime `$$awaitSubject`, ADR-0047), so the resolved\n/`:then` bindings stay the resolved value. Plain-promise and blocking-cell\nsubjects are untouched.",
"is_bot": false,
"headline": "fix(compile): type a bare no-await promise/stream computed seed as pe…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T15:10:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3ce8963f70fbf5a3699867561887369efdd69b16",
"body": "…inal\n\nAn async cell's warm-seed key is `${scope.id}:${index}`, an index drawn in\nconstruction order and only by cells that actually become async. A `linked`\nbecomes async (drawing an index) only when its seed suspends on a pending\nblocking dep; otherwise it resolves synchronously to a plain `state`\n[…]\nthe wrong cell's value. `linked` now reserves its ordinal on the sync path too,\nso it always occupies exactly one index -- the invariant `computed` already has\nfrom its static isAsyncFunction routing.",
"is_bot": false,
"headline": "fix(ui): a synchronously-resolving linked reserves its async-cell ord…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T15:10:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d09e821f683fb8207176e30ba9b82c6bae39dedd",
"body": "…-0050)",
"is_bot": false,
"headline": "feat(cache): errorTtl opts a failed load into the negative cache (ADR…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T15:10:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b541792774281726e05d20ffb6f4f899b61f65b",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#48)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-16T11:20:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a034b2d8129a6edfe28355c9b9dffb462208f41f",
"body": "…seed async-lift)",
"is_bot": false,
"headline": "chore: changesets for forgiving script seeds (linked blocking seed + …",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T02:02:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b269f45d8ab2e117d62684620542cfd1199631e",
"body": "…uted seeds (ADR-0032, script side)\n\nA script seed argument whose sub-expression buries a promise/stream call —\n`state.linked(getSession()?.filteredSources ?? [])` — now lifts that call to an\ninjected streaming peek-cell, exactly as a `{#if getSession()?.x}` template\nposition does, so it reads `unde\n[…]\nved value. Both sides skip a bare call/identifier seed and a whole-seed\nasync span, so an existing whole-seed / probe (getRates(), chat.done()) is never\ndouble-wrapped and no probe receiver is lifted.",
"is_bot": false,
"headline": "feat(compile): lift buried async sub-expressions in state/linked/comp…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T02:01:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "83293652689d6a95c8cf4ffe66722e33be1aa63b",
"body": "…blocking AsyncState\n\nA linked() whose seed transitively reads a blocking (await-marked) async cell\nthrew a SuspenseSignal out of its eager reseed effect at construction, since a\nlinked reseed effect is a leaf with no reader to swallow the suspend. Route a\nseed that suspends in the classification pr\n[…]\nnchronously suspends so its own reads pause too — matching a\nlazy computed(() => blockingCell). This makes a blocking read behave the same\nin a linked seed as in a computed seed or a template binding.",
"is_bot": false,
"headline": "feat(ui): a linked seed that reads a pending blocking cell becomes a …",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-16T00:12:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b2ab0975be415ac14d0b15457eeb77ea41a23a2",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#47)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-15T22:52:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b000b4035fa866fcb312815bd48276ebe526aa38",
"body": "… + 36 unreleased commits)",
"is_bot": false,
"headline": "chore: add changesets for the pending release (async {#for} check fix…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T22:29:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "489163ff934ec70740a3265f0e1150ae8744c1f9",
"body": "…ixtures\n\nThe regenerated README component block drifted into code the doc-block\ncompile test (rightly) rejects:\n\n- `{:catch e}` bindings read `e.message` on `unknown` — narrow via\n `e instanceof Error ? e.message : String(e)` (×3), the old block's idiom.\n- `autofocus(node)` / `set(next)` / `{#snip\n[…]\nres caught up with the regen too: `normalizeAliases` now matches the\nidiomatic `$server/*.ts` extension, `DB_STUB` exports the renamed\n`listMessages`/`appendMessage`, and the Card stub carries `tone`.",
"is_bot": false,
"headline": "docs(readme): repair the kitchen-sink component block and doc-block f…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T22:28:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "10b78cfe46ef5c6719087ed29f6238ed0d91f348",
"body": "…olved peek\n\nA plain `{#for x of getRows()}` over a bare RPC/async read lifts to a\npeek-cell at build (ADR-0032) — the source reads the resolved collection,\nempty while pending. But `abide check`/the LSP type-check the RAW shadow,\nwhere the source is a `Promise<T[]>`, and `isSpuriousAsyncReadDiagnos\n[…]\nthe source classifies as a PROMISE whose\nawaited type is itself iterable: a raw AsyncIterable stays the sanctioned\nD4a error, and a `Promise<number>` source stays a real mistake the peek\ncan't rescue.",
"is_bot": false,
"headline": "fix(compile): abide check reads a bare async {#for} source as its res…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T22:28:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a87cb4fb0c187b291afefe37303e4df69d59d6ef",
"body": "ADR-0020 now lets a mutating helper opt into a cache policy when it is a\npure function of its args; the probes page still asserted the old\nkind-scoping rule. createEcho stays coalesce-only, but not because a POST\nis barred from caching.",
"is_bot": false,
"headline": "docs(kitchen-sink): drop stale 'a POST carries no cache policy' claim",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T21:58:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ddef71c8ffceab01dcea2a2e49397df29795be2e",
"body": "…urface\n\nReflect the new ./shared/amend export and the ADR-0020 change letting\nmutating helpers (POST/PUT/PATCH/DELETE) accept a cache policy.",
"is_bot": false,
"headline": "docs: regenerate AGENTS.md + README for amend and cache-on-mutating s…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T21:58:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2d16a967bc64a43653661665a900ef38b0cc0a7",
"body": "CodeBlock highlighted via a server-side shiki rpc read as a bare/streaming\nsmart call — machinery shiki's bundle weight forced (keep it off the client),\nnot something highlighting needs. Swap in sugar-high (~1 KiB, isomorphic) and\ncall it inline: the highlighted markup bakes into the SSR shell with \n[…]\n but now returns the\n raw declaration text; TypeDef highlights it with the same inline highlightCode.\n- app.css: --sh-* palette + pre.sh (shiki's inline theme is gone).\n- remove the shiki dependency.",
"is_bot": false,
"headline": "refactor(kitchen-sink): highlight inline with sugar-high, drop shiki",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T21:42:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ddc496a1a4c9250f83d6dcbb8711be96f1aeded",
"body": "`cache` moves from the read-only opts to RpcSharedOpts: a mutating rpc whose\nmethod is a transport choice (a POST carrying a large payload in its body yet\na pure function of its args) coalesces/memoises through readThrough like a\nread. `stream` stays read-only — a write has no replayable value to stream.\nKitchen-sink highlightCode demos it ({ cache: { shared: true } }), so shiki\nruns once per snippet process-wide instead of once per request; AGENTS.md and\nthe ADR-0020 handoff updated to match.",
"is_bot": false,
"headline": "feat(rpc): accept a cache policy on mutating helpers",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T21:30:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d91f491bc16f3120f1e513a0db0a6e2e225c77f",
"body": "… and {#await}\n\nCorrectness:\n- runNode/readNode: retain a compute's throw on the node (thrown) and rethrow\n while CLEAN, so a pause (SuspenseSignal) or error reaches EVERY reader, not\n just the one whose read ran the compute (ADR-0046 pending-propagates held\n for only the first reader per dirty c\n[…]\namend (was triplicated exact-key-vs-scan blocks)\n- componentOrdinals returns the throwing accessor (deletes the verbatim copy\n in both generators); appendTextAt restores the cursor through parkCursor",
"is_bot": false,
"headline": "fix(ui): code-review fixes across the reactive core, hydration seeds,…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T21:30:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a5f271d976af281c80a08a617a97d40cd847940d",
"body": "…or nested scripts\n\nCherry-picked 34c3d57c from the abide-nested-computed worktree (authored\nJul 14, pre-dating the runtime fix): nested-<script> state.computed/\nstate.linked bare seeds normalize through the shared wrapSeed at compile\ntime (wrapReactiveSeeds in lowerContext.script()), preserving reactive\nsemantics for wrapped seeds. Complements the runtime by-value routing in\ncomputed/linked (d33ed871), which stays as the guard for direct JS\ncallers.",
"is_bot": false,
"headline": "Merge fix/integrate-nested-seed-wrap: compiler-level bare-seed wrap f…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T17:11:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4aa0ebb686875236ba945c15de88278098b10b8",
"body": "A nested branch <script> keeps its state.computed/state.linked calls literal\n(it is not desugared to the doc), so a bare-value seed (state.computed(a * 2))\nreached the runtime primitive un-thunked — stored as the compute function and\ncalled on read (\"... is not a function\"), a hard crash on both SSR\n[…]\nnsformer (name-based recognition via\n NESTED_REACTIVE_BINDINGS), chained ahead of the reference rename in a new\n lowerContext.script() lowering used by both back-ends\n- regression + end-to-end tests",
"is_bot": false,
"headline": "fix(compile): auto-wrap nested-<script> state.computed/linked bare seeds",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T17:10:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "22ced23a3d7137729af5be9d2e5d044926d9aef7",
"body": "…nked",
"is_bot": false,
"headline": "Merge fix/bare-seed-runtime: bare seeds route by value in computed/li…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T16:42:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d33ed8719144900243b381efb3441e52175cb9e0",
"body": "A branch-nested <script> keeps its state.computed(...) calls literal\n(lowerScript — only the leading script goes through wrapSeed), so a\nbare seed reached the primitive raw: computed(names.length) stored 3\nas node.compute and the first read crashed the SSR stream mid-drain\n(TypeError: node.compute i\n[…]\nroute a\nnon-function seed by value — promise → streaming async cell, stream →\nframe cell, other → constant seed — so the ADR-0045 contract holds\nwherever the call arrives, including direct JS callers.",
"is_bot": false,
"headline": "fix(ui): computed/linked honor the bare-seed contract at runtime",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T16:42:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "90b3a4c361a60c1062d9779b66ddfe0f82f1e064",
"body": "… wire change ships separately",
"is_bot": false,
"headline": "docs(changeset): hydration consolidation wording — two-phase consume,…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:45:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70f5bb9e33598d4c46f9dc854b2d6b0f2880ac03",
"body": "…tchen-sink wire measurement)",
"is_bot": false,
"headline": "docs(adr): propose ADR-0049 — addressed component boundaries (with ki…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:43:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65c179da1717815103c0d5bee93304bfff708264",
"body": "…anifest (ADR-0048 4c)",
"is_bot": false,
"headline": "Merge refactor/one-seed-manifest: one kind-partitioned __abideSeeds m…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:40:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "171fdee2144b8b5549665d62fff61216dcf1ad43",
"body": "The four passive warm-seed globals (__abideResume/__abideCells/\n__abideDocs/__abideSockets) collapse into one window.__abideSeeds with\nresume/cells/docs/sockets partitions. The in-bundle names (RESUME,\nCELL_SEED, DOC_SEED, SOCKET_SEED) become views onto the partitions, so\nevery consumer and the cons\n[…]\nr run order. STREAMED_CELLS and __abideResumeCache stay separate\n(apply-timing phases, ADR-0040). ADR-0048 marked accepted with what\nshipped; the seedAddress module recorded as deliberately not built.",
"is_bot": false,
"headline": "refactor(ui)!: one kind-partitioned __abideSeeds manifest (ADR-0048 4c)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:39:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "55b64628f15057290ab4646e1b6db7bb4b85cdae",
"body": "… adopter, ADR-0048 slices\n\nrunHydrationPass owns the pass lifecycle (cursor + withhold window +\nrender pass + two-phase seed consume); claimMarker/claimText/claimRun/\nparkCursor own the cursor mechanics; discardAndRebuild carries the\ndivergence-recovery dance; mountChild is the single dual-mode chi\n[…]\nonsume (warmSeedBackup deleted) and one seed degradation\nsite (encodeSeedValue). Reconciled with dom-runtime-collapses\n(advanceClaim subsumed; parkAnchor + appendText before-param kept).\nVerify-green.",
"is_bot": false,
"headline": "Merge refactor/hydration-pass: hydration pass owner, claim verbs, one…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:28:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "01431f200b8955862f5398c82a48419f6d16a897",
"body": "Both branches consolidated the same hydration-cursor duplication from\ndifferent altitudes. Resolutions keep this branch's verb layer —\nclaimMarker/claimText/claimRun internalize the advance and parkCursor\nnames the explicit write, so main's advanceClaim (advance-only, park\nwrites stayed raw) is subs\n[…]\n now park through it).\nmountStreamedChild stays deleted — main made it delegate to mountChild;\nthis branch's mountChild IS the dual-mode adopter and the compiler\nemits only $$mountChild. Verify-green.",
"is_bot": false,
"headline": "Merge main: reconcile with dom-runtime-collapses",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:23:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5bb7fd490ba2b401cf5c88d616b5ba6c1e420aa5",
"body": "encodeSeedValue owns the serialize-or-degrade policy: ref-json-encode\nor drop just that entry with a warn naming what was dropped and what\nthe client does instead. Replaces seven independently-worded (or\nsilent) drop sites — tryEncodeResume, the cells/docs/sockets __SSR__\npartitions, and the two str\n[…]\nay (digit-terminal counters), so\nthe address module's job is enforcing that rule by construction, not\nfixing a live collision — and escapeKey must stay untouched (shared\nwith the doc-pointer grammar).",
"is_bot": false,
"headline": "refactor(server): one degradation site for every hydration seed",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:13:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b07997bb7cd01112161f5e67f698e438a96ce1b",
"body": "…covery\n\nA hydration pass MARKS each CELL_SEED/DOC_SEED entry it adopts\n(consumeSeed + SEED_MARKS) and deletes marked keys only on a clean\nexit; a desync throw leaves every value in place, so the router's\ndiscard-and-cold-rebuild re-adopts the SSR-resolved values directly.\nwarmSeedBackup/restoreWarm\n[…]\n\n(the shadow copy got that case right only by restoring everything).\nADR-0048 first slice; the one-shot contract (an SPA re-nav re-inits\nfresh) is unchanged and now regression-tested in uiConsumeSeed.",
"is_bot": false,
"headline": "refactor(ui): two-phase warm-seed consume replaces the shadow-copy re…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T15:08:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c5767cbadbf889139aeb8701dcd98a48c2e41a9",
"body": "…o-phase consume",
"is_bot": false,
"headline": "docs(adr): propose ADR-0048 — one seed store, one address grammar, tw…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:58:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "185b16bfda4b4df91c331b915298986d7a96d77a",
"body": "…/mount duplication\n\nmountStreamedChild delegates to mountChild; appendTextAt's create path delegates to\nappendText via an insertion reference; advanceClaim names the hydration-cursor advance\n(15 inlined sites); anchoredBranch.parkAnchor folds await/try's repeated anchor-park\ntriple. Verify-green; per-block settlement/boundary orchestration stays bespoke\n(ADR-0018 wave 2 line).",
"is_bot": false,
"headline": "Merge refactor/dom-runtime-collapses: single-source the dom hydration…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:58:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f2981d5ac49c14b693228c41c14dc54e92a3367",
"body": "…s decided once\n\nThree hand-mirrored SSR↔client congruence decisions move to single\nshared sites (the RANGE_MARKER / skeletonContext pattern):\n\n- BRANCH_SEGMENT: the render-path segment alphabet ('then'/'else',\n case index) is one module the when/switchBlock runtimes key their\n branches with and g\n[…]\nssion counters —\n numbering from the tree makes ordinal congruence hold by\n construction (emission order diverged for a switch default that\n isn't last, and for slot content vs its host component).",
"is_bot": false,
"headline": "refactor(compile): branch segments, await subjects, and child ordinal…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:58:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dcf986843d6bdb59efcf5d270427a9ed5e0ab3da",
"body": "discardAndRebuild carries the shared recovery mechanics (remove the SSR\nboundary, park the cursor, build fresh with the claim cursor cleared);\nawaitBlock, tryBlock, and the child adopter keep only their policy —\nwhen to give up on adoption.\n\nmountChild absorbs mountStreamedChild and becomes the sing\n[…]\nenders\n(inline-vs-stream stays a server-side, per-render decision). BREAKING\n(pre-1.0 minor): the abide/ui/dom/mountStreamedChild export is removed —\ncompiler-emitted plumbing an author never imports.",
"is_bot": false,
"headline": "refactor(ui)!: one divergence-recovery dance, one child adopter",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:42:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a624939eb2ff625e4a52c06bf324c45b02ec6d51",
"body": "claimMarker (claim a guaranteed marker + advance), claimRun (skip a\nstatic run + park), claimText (assert + split + advance one text\nconsumer's portion), and parkCursor (the one named cursor write)\nreplace the per-helper copies of claim-and-manually-advance across the\ndom helpers. Helpers keep their\n[…]\nsor invariant — every claim leaves the\ncursor on the next unclaimed sibling — now lives in four small verbs\ntyped against HydrationCursor instead of ~15 hand-rolled next.set\nsites. No behavior change.",
"is_bot": false,
"headline": "refactor(ui): hydration claim verbs own the cursor mechanics",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:30:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "473f2894ae02bcbcd67c4ca5d6b45b7de9b1439c",
"body": "…ceClaim\n\nThe create-text-node / assign branch.anchor / insertBefore triple repeated 7x across\nawaitBlock and tryBlock folds into branch.parkAnchor(before); their marker claims ride\nthe shared advanceClaim. Bespoke settlement/boundary orchestration stays per-block.",
"is_bot": false,
"headline": "refactor(ui): anchoredBranch owns anchor parking; await/try use advan…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:24:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a178acd4a2dc21477b722a95da99c63d77b794bd",
"body": "appendText takes a create-mode insertion reference (before); appendTextAt becomes a thin\npositioning wrapper on both paths (hydrate already delegated via a parked cursor). One\ntext-split / snippet / raw-html implementation, positioned two ways.",
"is_bot": false,
"headline": "refactor(ui): appendTextAt's create path delegates to appendText",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:24:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "50a2d3d69cfbd82effb2980ba53e58011928dc47",
"body": "The claim cursor's write side was hand-inlined as hydration.next.set(parent, node.nextSibling)\nat every claim site; advanceClaim is the counterpart of claimChild. Park-at-node writes stay\nraw — they set an explicit position, not an advance.",
"is_bot": false,
"headline": "refactor(ui): name the hydration-cursor advance (advanceClaim)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:24:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d794580572610304019b698340b5477b7a326241",
"body": "All four branches re-implemented mountChild's withOptionalPath -> mountRange -> owner-push\nwrapper inline; only the boundary probe is this module's own.",
"is_bot": false,
"headline": "refactor(ui): mountStreamedChild delegates every mount to mountChild",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:24:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0ede531971e6c351397c2c8c4eea248c37bdd399",
"body": "The claim cursor, the cache-withhold window, the block-id render pass,\nand the restore-on-throw of the consumed warm seeds were bracketed by\nhand at both entry sites (hydrate, the router's hydrating first mount).\nOne owner now runs the bracket, so the two sites can't drift and a\nthrowing pass always restores CELL_SEED/DOC_SEED before its caller's\ncold rebuild.",
"is_bot": false,
"headline": "refactor(ui): runHydrationPass owns the hydration pass lifecycle",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:19:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e38226ff6ba3febe346b361f3314bdb769252f8",
"body": "… (ADR-0047)",
"is_bot": false,
"headline": "Merge fix/await-cell-subject: {#await <cell>} awaits the cell subject…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T14:04:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "856901ed0fb164dd171158695c3bee9b8b8f33d0",
"body": "`{#await rates}` where `rates = state.computed(getRates(...))` lowered its subject to\n`$$readCell(rates)` — a peek — so a pending cell read `undefined`, fired `{:then}`\nimmediately, and `{:then data}` crashed dereferencing `data.foo` on `undefined`.\n`{#if}`/`{#switch}` cell subjects avoided this wit\n[…]\n(`{#await getFoo()}`) is byte-identical. Wired at all four emit sites — the\nclient `awaitBlock` and the SSR blocking / streaming / flight-hoist paths — reusing\nthe existing await machinery (ADR-0047).",
"is_bot": false,
"headline": "fix(ui): {#await <cell>} awaits the cell subject, not its peek",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T13:50:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f78d335f5c769692930fae3866227c3b0a2d738d",
"body": null,
"is_bot": false,
"headline": "Merge feat/pending-propagates: await blocks script reads too (ADR-0046)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T13:27:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1e925ef9c77bab4ba7e36d835fa6c4c42e2404a",
"body": "… the graph\n\nA read of a pending `await`-marked (blocking) cell now suspends its reader\nwherever it happens — script or template — so pending flows down the whole\ndependency graph, not just at template read sites (ADR-0046, amends ADR-0042).\n\n- One node-aware read: `readCell` consults the cell's own\n[…]\nover a blocking cell peeked\nundefined and dereferenced it on a cold client nav.\n\nBreaking: a script read of an await cell suspends where it previously peeked\nundefined; bare/streaming reads unchanged.",
"is_bot": false,
"headline": "feat(ui)!: await blocks script reads too — pending propagates through…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T13:11:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ec19dcc18a2858b99f73228b5456b08635f23d3a",
"body": null,
"is_bot": false,
"headline": "Merge branch 'main' of github.com:briancray/abide",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T12:56:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f4e98bd1bcd444e318dedeb8a4f55776e6059d20",
"body": "createRemoteFunction.callable already computes keyForRemoteCall(method, url,\nargs) for the rpc-error registry; readThrough then re-derived the identical\nstring (callable.raw shares method/url) on every read, warm hits included.\nThread the derived key into cache.read → readThrough so it's reused; the public\ncache() and raw paths still derive their own (precomputedKey is optional).",
"is_bot": false,
"headline": "perf(cache): derive a bare rpc read's key once, not twice",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T11:38:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8f2144135f8c0c3efb7140f3384b6cc7b87f6b2",
"body": "invalidate/refresh/amend with (fn, args) resolve to one key — Map.get it\ndirectly instead of scanning every entry in every store. The per-entry\ndrop/refetch/amend decision is extracted into a shared seam so the exact-key\nfast path and the scan (bare-fn / tag / wire-driven selectors) can't diverge\n(ADR-0041). amendReaderHook's disconnect refresh also passes the exact key.",
"is_bot": false,
"headline": "perf(cache): exact-key selectors skip the full-store scan",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T11:21:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "595692861152619c95a8a7eb83f48fd6d016ec37",
"body": "- reuse shared isAsyncIterable in peek/watch (drop local isSubscribable dupes)\n- reuse messageFromError in cachedShadowProgram/AsyncCellError\n- fold projectSet into projectArray (same T[] wire shape)\n- inline promiseIsPrefixEvaluable + awaitBlock isThenable\n- probe comment nodes via shared commentData in mountStreamedChild\n- hoist mappings lookup out of classifier closures\n- drop dead empty-keys guard in cache emit",
"is_bot": false,
"headline": "refactor: consolidate simplify cleanups across shared/ui",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-15T11:02:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd556e48f33ff227d6f0ef227913b60edd8a63fe",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#46)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-14T18:28:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5124ecb4b2d20016de21b32f753742e6cd3b66ef",
"body": "Both benches imported ../src/lib/ui/dom/text.ts (renamed to appendText.ts)\nand used the old text(read)->appendChild shape, so gate.ts threw on them and\nnever wrote a baseline — which the perf delta reported as origin/main's benches\npredating the tooling. Swap to appendText(parent, read), matching render.bench.",
"is_bot": false,
"headline": "fix(bench): repoint listChurn/controlFlow off the renamed dom/text.ts",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:26:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c27af8a4bb9a465f849cf4eada0f6d1bd771b4ab",
"body": null,
"is_bot": false,
"headline": "chore: keep patch→amend rename pre-1.0 (major→minor bump)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:24:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc4ddfc47adb1f82b9e615faf77ac98a79c165b3",
"body": null,
"is_bot": false,
"headline": "chore: add changesets for format-drift normalization",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:20:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7cd75d7d8a95ae780906b74b6a649d5cec5a3fea",
"body": "…fresh\n\namend is now isomorphic like invalidate/refresh (ADR-0043): on the client\nit mutates the local cache, but on the server with a concrete value it\nbroadcasts that value over a per-call reserved __abide/amend/<key> topic to\nevery client already reading the call — a push-refresh with zero refetc\n[…]\nly entry, reader hook, and side-swap slots wiring\nthrough serverEntry/startClient, plus kitchen-sink /reactive-state/push.\n\nBREAKING: amend's public signature now takes value | updater.\n\nSee ADR-0043.",
"is_bot": false,
"headline": "feat(cache)!: server-side amend broadcasts a keyed value as a push-re…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "42354bae17cd74f74b04e223275c62baf2597981",
"body": "…value cell\n\nA no-await state.computed(getFoo()) over an rpc now routes to an eager\nstreaming async cell that unwraps the resolved value and reactively\nre-resolves, instead of being held opaque as Computed<Promise> (the\nsuperseded ADR-0019 D1 routing). {foo?.field} now renders and updates.\n\nBREAKING: the bare binding is a reactive value cell, never a Promise.\n\nSee ADR-0045.",
"is_bot": false,
"headline": "feat(compile)!: bare state.computed(getFoo()) unwraps to a streaming …",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "88959d795eb2d0f23ba7dbe587e3eb734a9be092",
"body": "…acked\n\nwatch(source, handler) wrapped the handler in an effect that captured\nevery reactive read in the handler body, so watch(foo, () => id = bar.id)\nsilently re-ran on bar.id too. Read the cell(s) as the tracked trigger,\nthen run the handler inside untrack. This makes the two synchronous cell\nbranches match the socket/rpc branches, whose handlers already ran outside\nthe tracking window. Bare watch(thunk) still auto-tracks (it is the\ncompiler binding). See ADR-0044.",
"is_bot": false,
"headline": "feat(watch)!: the named source is the sole trigger; handler runs untr…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d9316ee4c7926c2cb38eb30faf6d7583ebe72f6",
"body": "…p'ing\n\nA member access on a cell (watch(s.foo, handler)) subscribes to nothing —\nabide has no per-property cells, so the source is read once as a plain value\nand the handler never fires. It was only a console.warn; promote it to an\nAbideCompileError pointing at the corrective forms (thunk, or watch the whole\ncell). A member of a cell is never itself a cell, so this can't reject a valid\nwatch.",
"is_bot": false,
"headline": "fix(compile): reject watch(cell.member, ...) instead of silently no-o…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "977388501dfcfd19dafc6d39a1f424ce5dc46517",
"body": "The type-directed async lowering depends on a warm shadow program built once\nper root; a build failure was swallowed, silently degrading every async\ninterpolation in the project to plain text (a bare {getFoo()} shipping as\n[object Promise]). Factor the get-or-build-cached block shared by the\ninterpolation and seed classifiers into cachedShadowProgram, which warns once\nper root on failure. Build still never breaks on program-build failure.",
"is_bot": false,
"headline": "fix(compile): warn when the shadow type program fails to build",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11965e9d7f1b7d222c764b4133f78c9c2abc51fc",
"body": "Logical assignments (??=/||=/&&=) on reactive state now short-circuit — the\nwrite fires only when the guard passes, so no needless patch/reseed. Postfix\nx++/x-- now evaluates to the previous value (prefix to the new), matching JS;\nreactive writes return the written value, so chained assignment works too.\n\nCell.set and Doc.replace return the written value; the two lowering sites\n(lowerDocAccess, renameSignalRefs) share lowerCompoundAssignment /\nlowerUpdateExpression helpers so they can't drift.",
"is_bot": false,
"headline": "fix(ui): correct reactive mutation-expression semantics (a5/a6)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "757f1420b4e37064da1b5048d2f5d3b1a556b6fe",
"body": null,
"is_bot": false,
"headline": "chore(format): normalize pre-existing format drift",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bc2bfb2936722d1da953b88e35c5dbd986aba4e",
"body": "BREAKING: `abide/shared/patch` is now `abide/shared/amend`, and the rpc\nselector method `fn.patch(...)` is now `fn.amend(...)`. Same intent — mutate\nthe retained value of matching cached reads in place, reactive, no network —\nrenamed to stop overloading \"patch\", which collided with the HTTP `PATCH`\nmethod export (`abide/server/PATCH`) and the internal DOM-tree `Patch` type.\nMechanical rename, no behavior change.",
"is_bot": false,
"headline": "refactor(cache)!: rename the mutation verb patch → amend",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "66e5d3bca9dd6dabc38f9943a595e88a5dccceb8",
"body": "…desync recovery\n\nA tail-retaining socket's peek(socket) returned its retained frame server-side\nbut undefined on the not-yet-connected client, so markup derived from it (e.g.\nstate.computed(() => peek(refreshStatus))) diverged from the SSR HTML and tripped\na hydration desync — which discards the se\n[…]\nalues instead of refetching. A cold refetch left blocking await cells\npending, and a top-level blocking read sits in no suspense region, so its\nSuspenseSignal escaped the rebuild and killed the mount.",
"is_bot": false,
"headline": "fix(ui): warm-seed socket tails across SSR→client + harden hydration-…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-14T18:17:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8e82a08a96c0530bec9923e9c82dc5a3ce096ac9",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#45)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-14T10:36:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6444eadc9a09e0bea4079084a1eb8d4221108de5",
"body": "The SSR $$cellPending guard clause and the client switchBlock `pending:` case field\nare two independent implementations of the cond-chain pending-halt rule; a co-located\ntest asserts both from one fixture so dropping the gate on either side fails here.",
"is_bot": false,
"headline": "test(compile): pin cross-side cond-chain pending parity (ADR-0042)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T22:43:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a915229caf92914b5bcd9e5625153831783049d",
"body": "The shadow projected a {:catch} error as `any`, so dereferencing it type-checked\ninside a template while strict TS's real `catch (err)` (useUnknownInCatchVariables)\nrejects it — the template was more permissive than plain TS. Both the await-catch and\ntry-catch bindings now project as `unknown`, forcing a narrow. Narrows the four\nkitchen-sink examples and the README hero that displayed err.message unguarded.",
"is_bot": false,
"headline": "fix(compile): type {:catch} bindings as unknown, not any (ADR-0042)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T22:43:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e58b538f477c2bfcec654fd1a7aab65466cc956c",
"body": "…jects (ADR-0042)\n\nA blocking `await` cell referenced in an {#await} subject or {#for await} source\nlowers to $$readCellBlocking, so on a cold client render the pending read threw a\nSuspenseSignal out of the synchronous build — a hard render crash. awaitBlock and\neachAsync now withhold (pending bran\n[…]\n stream) and re-run on settle, symmetric\nwith the guard each/when/switch already had. tryBlock.showTry additionally rethrows a\nSuspenseSignal instead of routing it to {:catch}, mirroring flushEffects.",
"is_bot": false,
"headline": "fix(ui): withhold pending blocking reads in {#await}/{#for await} sub…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T22:42:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48476bf83202166a94e657a6f37c8bee51d3d2f8",
"body": null,
"is_bot": false,
"headline": "Merge branch 'main' of github.com:briancray/abide",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T18:46:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f9fcbbec862eba6da3103a6aca77d505ef6f58d",
"body": "…2 review)\n\n- when/switchBlock: catch a SuspenseSignal from a blocking condition read (a\n member access / compound like `{#if !sources.length}` or `{#if user && await\n load()}`) so the block withholds instead of throwing out of the synchronous\n cold-nav build\n- spreadAttrs: defer key enumeration \n[…]\n appendText)\n- amend ADR-0042 with the as-shipped Implementation note\n- tests: {#if}-condition suspense regression + D5 parity (shadow type vs runtime\n flag agree, incl. the nested-method-await case)",
"is_bot": false,
"headline": "fix(ui): close await-suspense gaps and simplify the boundary (ADR-004…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T18:27:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "16ec341a6ea7da509919b37a1cdcc2f237e04c1c",
"body": "- README hero: `{await}` means resolved (server blocks + client suspends the region),\n not just an SSR marker; bare read streams\n- AGENTS: rewrite the async-reads paragraph for the two-mode model (bare=streaming\n T|undefined, await=resolved+client-suspend, no-await async thunk=streaming), and\n list the new `ui/dom/readCellBlocking` plumbing export\nFull verify green.",
"is_bot": false,
"headline": "docs(readme,agents): document await-means-resolved (ADR-0042)",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:59:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f58501ebb79e96405b4aa01f649b4782425edb93",
"body": "…ages (ADR-0042)\n\n- templating/async: reframe as two modes (bare=streaming T|undefined, await=resolved\n + client suspends the region); demo a member access with no ?. that compiles\n- cookbook/data/await-ssr: await is resolved on BOTH sides (server blocks + client\n suspends), not an SSR-only tier marker; fix a stale note (a bare async {#if} HOLDS\n while pending, it does not show {:else})\nKitchen-sink builds + typechecks clean.",
"is_bot": false,
"headline": "docs(kitchen-sink): demo await-means-resolved suspense in the async p…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:55:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fa7bfed7edf48120d52fe971eb4e7152e1668ce3",
"body": "…solved (ADR-0042)\n\n- runtime test: a member access on a pending blocking read ({items.length})\n withholds instead of crashing, then fills on settle — the motivating bug, fixed\n- changeset (minor): documents await-as-resolved + the two breaking changes\n (async-modifier→streaming, streaming cells type T|undefined)\nExamples needed no migration — full verify green (lint+typecheck+readme-tags+test).",
"is_bot": false,
"headline": "test(ui): prove blocking-cell suspense + changeset for await-means-re…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:35:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "034a384bdfb5b482f818de757e10c2e2e88ac52c",
"body": "…rier tripwire (ADR-0042 D5.2/D7)\n\n- $$cellValuePending shadow helper: a no-await async computed/linked types as\n resolved T|undefined (honest undefined-while-pending); blocking await + sync stay\n $$cellValue (resolved T). Selected by the same syntactic blocking bit as the runtime.\n- seedIsBlocking mirrors desugarSignals.isBlockingSeed (the one predicate, D5).\n- compileSSR asserts the post-barrier template constructs no cells (D7 tripwire).\n2187 abide tests green.",
"is_bot": false,
"headline": "feat(compile): shadow narrows streaming cells to T|undefined + D7 bar…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:30:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3468feacbb67ac9cd337ffa2e220b10af309324",
"body": "…king on the client (ADR-0042 D5/D6)\n\n- isBlockingSeed: await in the thunk body → blocking; async modifier alone → streaming\n- computedStatements routes the async branch through trackedComputed(thunk, streaming)\n- desugarSignals returns the union blocking-cell set; threaded desugar → lowerScript →\n \n[…]\nript pass keep $$readCell (barrier-resolved server-side; event reads never suspend)\n- each.ts treats a pending suspend as an empty list\nUpdated 7 codegen-snapshot expectations; 2187 abide tests green.",
"is_bot": false,
"headline": "feat(compile): flip async-thunk blocking marker + emit $$readCellBloc…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:26:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5db314fa3e0ce18294f609be5fb43e5128970d0",
"body": "…mplate effects (ADR-0042)\n\nUniform SuspenseSignal handling so a pending blocking await read withholds the\nNEAREST reactive range, never crashing on a pending undefined:\n- readTextOrSuspend: shared text withhold for appendText + (inline) appendTextAt\n- attr / spreadAttrs: unset the attribute / spread no keys while pending\n- watch binding form (class:/style:/bind:): skip the reaction while pending\nAll dead until the compiler emits blocking reads; 2187 tests green.",
"is_bot": false,
"headline": "feat(ui): complete the client suspense withhold surface across all te…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:14:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "88da27c998666b7cca9149effd5f171f3adca8d1",
"body": "…d (ADR-0042)\n\nappendText and attr now catch a SuspenseSignal from a blocking await read and\nwithhold (empty text / unset attribute) until the cell resolves, re-running via\nthe read's own cell subscription. Dead until the compiler emits blocking reads:\n- detection reads guarded so a suspend takes the text path\n- suspense only bites on cold CSR; warm-seed keeps hydration reads refreshing()\nBlocks already suspend via when.ts isPending — no change needed there.",
"is_bot": false,
"headline": "feat(ui): suspend interpolations/attributes on a pending blocking rea…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T16:03:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5f6104c41ea1d57d3347ae007cdb1b316a09784",
"body": "… (ADR-0042)\n\nAdditive, inert scaffolding for ADR-0042 — nothing throws SuspenseSignal yet,\nso no behavior change and verify stays green:\n\n- SuspenseSignal: pending-not-error sentinel (sibling of AsyncCellError)\n- readCellBlocking: throwing peek that suspends iff cell.pending()\n- CURRENT_SUSPENSE / \n[…]\nthe suspense channel, never\n to a boundary (dead code until the compiler emits blocking reads)\n- register $$readCellBlocking runtime import + package export\n\nRecords the full design in docs/adr/0042.",
"is_bot": false,
"headline": "feat(ui): dormant client-suspense foundation for await-means-resolved…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T15:59:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "da68a816a67b30e76d10e64c4f6762d917cd703b",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#44)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-13T00:38:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "83f4e5e1da421a182d5af69b979d2b0a59345593",
"body": "…eleased commits",
"is_bot": false,
"headline": "chore: add changesets for the checkAbide .ts-augmentation fix and unr…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T00:31:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5da85e2a2f411c221bb552b60b187ebee836d3ba",
"body": "The .ts-check pass (e0c200b1) type-checks each project's own .ts files —\nrpc handlers, app.ts, and test files — but those resolve app.rpc.<name>\nand typed url('/rpc/…') off the build-written RpcClient / RpcRoutes\naugmentations under src/.abide. That directory is gitignored and only\ngenerated by dev/\n[…]\nons at the top of checkAbide via the same\ngenerateDeclarations build() owns; it is idempotent and fails open, so a\ncodegen hiccup degrades to the pre-.ts-check behaviour instead of\naborting the check.",
"is_bot": false,
"headline": "fix(check): generate .d.ts augmentations before type-checking .ts files",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T00:29:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c11e7a67725dc3c9a6c330fe695300fce4962a66",
"body": "A same-day README rewrite renamed message/frame fields (author/body →\nuser/text), swapped MessageCard for Card/Avatar/Message, added countToday,\nand left several example locals un-annotated — but never updated\ndocCodeBlocks.test.ts, so its guard went red (the pre-push verify hook\nblocked all pushes)\n[…]\ne\n (getMessages/sendMessage/countToday/chat + Card/Avatar/Message components,\n recentMessages db), and stub chat with the real socket<T>() so its client\n import carries the .pending() stream probe.",
"is_bot": false,
"headline": "fix(docs): reconcile the README hero example with its drift guard",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-13T00:05:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b938e1058b10d0fa7881d9cd4e3f774bb1dc35c2",
"body": "…n pass\n\n- Extract setsIntersect, shared by selectorMatcher and matcherFromEnvelope\n (was a byte-identical private tag-overlap loop the comments said must mirror).\n- Extract COMPOUND_ASSIGNMENT_OPERATORS, shared by lowerDocAccess and\n renameSignalRefs (two identical compound-assignment maps that must not drift).\n- Skip the wrapReactionCellSources transform when no watch() is imported (the\n common case) — it's a pure identity full-tree walk otherwise.",
"is_bot": false,
"headline": "refactor(compile,cache): dedupe mirrored maps, skip the inert reactio…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:45:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d14ccd3aaa8467948fe78dbc4462b40c6ea6750",
"body": "zsh's $CURRENT is 1-based (words[1] is the program) while completeCli\nexpects bash's 0-based COMP_CWORD, so `myapp <TAB>` fell through to the\nflags branch with an empty command and returned nothing — command-name\ncompletion was dead in zsh. Forward CURRENT-1 to match bash/fish.",
"is_bot": false,
"headline": "fix(cli): forward a 0-based completion index from the zsh wrapper",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:45:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fccc4b4e833ea49871c1a955743ce807d1902a28",
"body": "Regenerate README/AGENTS and refresh the kitchen-sink cache, CLI, and\nreactive-state pages: cover the invalidate drop-verb, server-side\nrefresh/invalidate broadcast (ADR-0041), the /completions CLI command,\nand the bare-seed computed/linked form.",
"is_bot": false,
"headline": "docs: document invalidate, server-side broadcast, and CLI completions",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:23:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "129b40418a091eeb40dcc40f45a20738c6baafcf",
"body": "A `linked` cell is documented as writable, but a plain-assignment write from a\ncomponent script (`draft = draft + 1`, `+=`, `++`) failed to compile: the read\nlowering rewrote every `linked` reference to `$$readCell(name)` (a call), so an\nassignment target became `$$readCell(draft) = …` — \"Invalid as\n[…]\n) that dispatches `.value =` for a sync\nState seed and `.set(...)` for an async/stream AsyncState seed. The RHS and the\nfolded current-value read still go through $$readCell, so tracking is unchanged.",
"is_bot": false,
"headline": "fix(compile): lower script writes to a linked cell through $$writeCell",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f889416eedab23346c870d491c75b7e0f361bd8e",
"body": "Now that a bare seed type-checks and lowers identically to a thunk (the\ncompiler wraps it via wrapSeed, routing by the seed's actual type), flip\nevery example and the docs to pass the seed expression directly —\nstate.computed(count * 2), not state.computed(() => count * 2). The thunk\nform is kept on\n[…]\ntrings) plus\nthe reactive-state teaching pages, README, and AGENTS.md. No lazy/eager\nclaim is documented: routing is type-directed, so () => { ... } is only for\na multi-line body, not a laziness knob.",
"is_bot": false,
"headline": "docs(examples): make the bare seed the idiomatic computed/linked form",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "090d28e4f32edaea88467c9be7072e89e3a5c8a9",
"body": "…value\n\nstate.computed(await load()) and state.computed(async () => ...) are legal\nauthored forms (wrapSeed lowers them to an async cell), but the type-check\nshadow flagged the seed's await as a top-level-await error and projected\nevery seed as an invoked thunk. That mis-typed async seeds as a Promi\n[…]\nbinding types as its resolved value. collectTopLevelAwaitDiagnostics\nexempts a computed/linked seed argument; a bare state(await ...) is still\nflagged, since it genuinely breaks the synchronous build.",
"is_bot": false,
"headline": "fix(check): type-check computed/linked await seeds as their resolved …",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "554d3ffbdef39a40ccb77c58017b759dbdcb17c2",
"body": "A member access on a known cell (watch(s.foo, handler)) looks valid but\nsubscribes to nothing — abide has no per-property cells, so the source is\nread once as a plain value and the reaction is inert. It isn't foldable\nlike a bare cell, so emit a non-fatal compile warning naming the base\ncell and the corrective forms (thunk or whole-cell watch), mirroring the\nwarnPostAwaitReads console.warn precedent.",
"is_bot": false,
"headline": "feat(compile): warn on the inert watch(cell.member) source",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9154f36514902d6f78a9af9e9437279fbc3db949",
"body": "…dler file\n\nThe client build of an $rpc module now emits only the remoteProxy fetch plus the top-level statements the endpoint opts transitively reaches, instead of keeping the whole handler file and trusting tree-shaking. Server code reachable from module-level handler support (the common `const db\n[…]\nty reads its value symbol; anything only the handler touches is never emitted. Falls open to the previous keep-the-file transform when no warm program is available. Documented as an ADR-0022 addendum.",
"is_bot": false,
"headline": "fix(rpc): emit a minimal opts-rooted client module, not the whole han…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fca2f95bef2c79126bfe0d28ab150f40915515d8",
"body": "invalidate rejoins refresh as an isomorphic staleness verb: local drop/\nrefetch on the client, broadcast to connected clients from the server via\none cacheStalenessSlot (the cacheStoreSlot precedent). Server publishes a\nserialized selector to a reserved server-publish-only __abide/cache socket;\never\n[…]\nubscribes live-only and applies through the same\ninvalidate/refreshMatching seam as a local call. refresh's server behaviour\nchanges from a client-inert local refetch to a broadcast (minor). ADR-0041.",
"is_bot": false,
"headline": "feat(cache): isomorphic invalidate/refresh with cross-client broadcast",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7b20340ac936da8bb4c07d2edb0d3115654f8e4b",
"body": "Record the accepted design and relax the shared/* isomorphism note to\n'same intent, possibly side-swapped runtime' (as cache already is).",
"is_bot": false,
"headline": "docs(cache): ADR-0041 for isomorphic invalidate/refresh broadcast",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e97f0e0c3b4c5bafde99335663cb88d476ff64cc",
"body": "…eding",
"is_bot": false,
"headline": "docs(agents): reflect .ts checking, the hydrate channel, and state se…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee96a2e53668fca2e2ffe2520fea3bdc5b71211f",
"body": "A plain state(initial) re-ran its initializer on the client, so state(crypto.randomUUID())/state(Date.now()) diverged from the SSR HTML. Each rendered scope's doc snapshot is now serialized into __SSR__.docs keyed by render-path id, and on hydration the first write to each slot adopts the server value (consume-once). Rides the async-cell warm-seed rails; no new public API.",
"is_bot": false,
"headline": "feat(ui): server-seed synchronous state across hydration",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f42c33cf350fcf7678cf48a846638e635949ebe1",
"body": "…rate)\n\nChannel off: unchanged (the claim guard throws, the router recovers cold). Channel on: a text divergence warns with its render-path and keeps hydrating, a structural one names its path before throwing, and an attribute divergence — previously invisible — warns too.",
"is_bot": false,
"headline": "feat(ui): add a path-addressed hydration-divergence signal (DEBUG=hyd…",
"author_name": "Brian Cray",
"author_login": null,
"committed_at": "2026-07-12T23:02:01Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 66,
"commits_last_year": 1202,
"latest_release_at": "2026-07-17T12:09:01Z",
"latest_release_tag": "@abide/abide@0.58.0",
"releases_from_tags": false,
"days_since_last_push": 1,
"active_weeks_last_year": 10,
"days_since_latest_release": 5,
"mean_days_between_releases": 0.5
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@abide/abide",
"exists": true,
"license": "MIT",
"keywords": [
"bun",
"ssr",
"spa",
"framework",
"isomorphic",
"rpc",
"mcp",
"cli"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@abide/abide",
"is_deprecated": false,
"latest_version": "0.58.0",
"repository_url": "https://github.com/briancray/abide",
"versions_count": 45,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 4159,
"first_published_at": "2026-06-17T18:12:07.456000Z",
"latest_published_at": "2026-07-17T12:07:58.085000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@abide/anthropic",
"exists": true,
"license": "MIT",
"keywords": [
"abide",
"anthropic",
"claude",
"agent",
"mcp",
"llm"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@abide/anthropic",
"is_deprecated": false,
"latest_version": "0.2.4",
"repository_url": "https://github.com/briancray/abide",
"versions_count": 4,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 272,
"first_published_at": "2026-06-17T18:12:06.489000Z",
"latest_published_at": "2026-06-22T16:29:13.214000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 29
},
{
"name": "@abide/inspector",
"exists": true,
"license": "MIT",
"keywords": [
"abide",
"inspector",
"devtools",
"observability",
"debugging"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@abide/inspector",
"is_deprecated": false,
"latest_version": "0.3.5",
"repository_url": "https://github.com/briancray/abide",
"versions_count": 8,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 887,
"first_published_at": "2026-06-17T18:12:06.387000Z",
"latest_published_at": "2026-07-13T00:40:37.191000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@abide/claude-code",
"exists": true,
"license": "MIT",
"keywords": [
"abide",
"claude-code",
"agent",
"mcp",
"llm"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@abide/claude-code",
"is_deprecated": false,
"latest_version": "0.5.5",
"repository_url": "https://github.com/briancray/abide",
"versions_count": 2,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 211,
"first_published_at": "2026-06-17T18:12:06.392000Z",
"latest_published_at": "2026-06-22T16:29:13.368000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 29
},
{
"name": "@abide/prettier-plugin-abide",
"exists": true,
"license": "MIT",
"keywords": [
"abide",
"prettier",
"prettier-plugin",
"formatter"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@abide/prettier-plugin-abide",
"is_deprecated": false,
"latest_version": "0.2.1",
"repository_url": "https://github.com/briancray/abide",
"versions_count": 7,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 595,
"first_published_at": "2026-06-18T15:24:04.933000Z",
"latest_published_at": "2026-06-29T17:42:24.031000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 22
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"cookbook",
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"examples/barebones/tsconfig.json",
"examples/kitchen-sink/tsconfig.json",
"examples/scaffold/tsconfig.json",
"packages/abide/template/tsconfig.json",
"packages/abide/tests/support/fixtures/rpcServer/tsconfig.json",
"packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json",
"packages/abide/tsconfig.json",
"packages/anthropic/tsconfig.json",
"packages/claude-code/tsconfig.json",
"packages/inspector/tsconfig.json",
"packages/prettier-plugin-abide/tsconfig.json"
],
"toolchain_manifests": [
"editors/zed/abide/Cargo.toml"
],
"largest_source_bytes": 146580,
"source_files_sampled": 1329,
"oversized_source_files": 6,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md",
"packages/abide/AGENTS.md",
"packages/abide/template/CLAUDE.md"
],
"agent_instruction_max_bytes": 39231
},
"dependencies": {
"manifests": [
"package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "@happy-dom/global-registrator",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^20.10.6"
},
{
"name": "happy-dom",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^20.10.6"
},
{
"name": "svelte",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^5.56.4"
},
{
"name": "typescript",
"manifest": "packages/abide/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.3"
},
{
"name": "@anthropic-ai/sdk",
"manifest": "packages/anthropic/package.json",
"ecosystem": "npm",
"version_constraint": "^0.102.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 50,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 1,
"closed_unmerged_prs": 1
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "briancray",
"commits": 39,
"avatar_url": "https://avatars.githubusercontent.com/u/493597?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [
"biome.json"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"Cargo.lock"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 2,
"reason": "1 out of 5 merged PRs checked by a CI test -- score normalized to 2",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/25 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "15 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "cfe64cc16764e0e0b3d910a6d196e5f646f75571",
"ran_at": "2026-07-22T12:39:41Z",
"aggregate_score": 2.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-17T12:09:06Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-17T12:06:16Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/briancray/abide",
"host": "github.com",
"name": "abide",
"owner": "briancray"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"security": 22,
"vitality": 77,
"community": 34,
"governance": 59,
"engineering": 67
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"commits_last_year": 1202,
"human_commit_share": 0.92,
"days_since_last_push": 1,
"active_weeks_last_year": 10
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 1 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 1
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "10/52 weeks with commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 10
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "1202 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 1202
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 66,
"latest_release_tag": "@abide/abide@0.58.0",
"releases_from_tags": false,
"days_since_latest_release": 5,
"mean_days_between_releases": 0.5
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "66 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 66
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.5 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.5
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 34,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 63,
"inputs": {
"packages": [
"@abide/abide",
"@abide/anthropic",
"@abide/inspector",
"@abide/claude-code",
"@abide/prettier-plugin-abide"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 6124
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "6,124 downloads/month across npm",
"points": 50.5,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 6124,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 59,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"merged_prs": 50,
"open_issues": 0,
"closed_issues": 1,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 1
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "50/51 decided PRs merged",
"points": 37.5,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 50,
"decided": 51
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/25 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 59,
"inputs": {
"followers": 141,
"owner_type": "User",
"is_verified": null,
"owner_login": "briancray",
"public_repos": 22,
"account_age_days": 5719
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "141 followers of briancray",
"points": 15.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 141,
"login": "briancray"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "22 public repos, account ~15 yr old",
"points": 21.9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 22
}
},
{
"code": "account_age_years",
"params": {
"years": 15
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@abide/abide",
"@abide/anthropic",
"@abide/inspector",
"@abide/claude-code",
"@abide/prettier-plugin-abide"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "5 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 5,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "45 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 45
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 67,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": "biome.json",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "biome.json"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "1 out of 5 merged PRs checked by a CI test -- score normalized to 2",
"points": 4,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 22,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 22,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 2.2
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "1 out of 5 merged PRs checked by a CI test -- score normalized to 2",
"points": 0.5,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/25 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "15 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 73,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.935,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md",
"packages/abide/AGENTS.md",
"packages/abide/template/CLAUDE.md"
],
"agent_instruction_max_bytes": 39231
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md, packages/abide/AGENTS.md, packages/abide/template/CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md, packages/abide/AGENTS.md, packages/abide/template/CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "86 of 92 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 86,
"sampled": 92
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 67,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"Cargo.lock"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"examples/barebones/tsconfig.json",
"examples/kitchen-sink/tsconfig.json",
"examples/scaffold/tsconfig.json",
"packages/abide/template/tsconfig.json",
"packages/abide/tests/support/fixtures/rpcServer/tsconfig.json",
"packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json",
"packages/abide/tsconfig.json",
"packages/anthropic/tsconfig.json",
"packages/claude-code/tsconfig.json",
"packages/inspector/tsconfig.json",
"packages/prettier-plugin-abide/tsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [
"editors/zed/abide/Cargo.toml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "editors/zed/abide/Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "editors/zed/abide/Cargo.toml"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": "biome.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "biome.json"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "examples/barebones/tsconfig.json, examples/kitchen-sink/tsconfig.json, examples/scaffold/tsconfig.json, packages/abide/template/tsconfig.json, packages/abide/tests/support/fixtures/rpcServer/tsconfig.json, packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json, packages/abide/tsconfig.json, packages/anthropic/tsconfig.json, packages/claude-code/tsconfig.json, packages/inspector/tsconfig.json, packages/prettier-plugin-abide/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples/barebones/tsconfig.json, examples/kitchen-sink/tsconfig.json, examples/scaffold/tsconfig.json, packages/abide/template/tsconfig.json, packages/abide/tests/support/fixtures/rpcServer/tsconfig.json, packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json, packages/abide/tsconfig.json, packages/anthropic/tsconfig.json, packages/claude-code/tsconfig.json, packages/inspector/tsconfig.json, packages/prettier-plugin-abide/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 146580,
"source_files_sampled": 1329,
"oversized_source_files": 6
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "6/1329 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 1329,
"oversized": 6
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"cookbook",
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "cookbook, examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "cookbook, examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@abide/abide@0.58.0; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-22T12:39:50.031722Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/briancray/abide.svg",
"full_name": "briancray/abide",
"license_state": "standard",
"license_spdx": "MIT"
}