原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 859,
"has_wiki": true,
"homepage": null,
"languages": {
"TypeScript": 302648
},
"pushed_at": "2026-07-20T16:14:18Z",
"created_at": "2026-02-02T01:37:02Z",
"owner_type": "Organization",
"updated_at": "2026-07-20T16:14:52Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": "www.inixiative.com",
"name": "Inixiative",
"type": "Organization",
"login": "inixiative",
"company": null,
"location": "Uruguay",
"followers": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/217591721?v=4",
"created_at": "2025-06-23T11:50:51Z",
"is_verified": null,
"public_repos": 15,
"account_age_days": 398
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "316d85aa2e8119763bfd8f1ad840be68e286d02f",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-20T16:14:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a95285dbe3523cd39ab411420f9facb98ceabc2d",
"body": "…ations\n\nAdds an aggregate facet to ArrayNode so the builder can author the AggregateRule\nshape json-rules already supports: mode (sum/avg) + numeric-field picker over the\nrelated model + comparison operator/value, with the element window reusing the\nexisting condition sub-builder. Surface tags fiel\n[…]\nte mirrors the engine's toPrisma guards. min/max left for when the\nengine adds them; element count stays the existing count facet.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(builder): author numeric aggregate rules (sum/avg) over many-rel…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-20T16:05:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "70f763f8473cbe81402aa5b8a7634c733a511334",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-20T14:00:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d7f0f71c13a260b10758c3625f3240a7624deae",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-17T04:31:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21b2388f36a90c3626561e6882ddba8ffe0f36cb",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-17T04:06:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "513cd9160a4d43adca41da97c8be7ba41b6c92f3",
"body": "…selectors\n\nThe pin infers from conjoined sibling clauses on the field's surface\naxes and narrows enumValues so validity gates on the partition.\nFacet.group removed; collection identity is order-tolerant subset\nmatch, most-specific wins; Facet.selectors declares inner rows so\nrenderers stop hardcoding paths. Requires json-rules ^2.18.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.20.0 — sibling-derived partition pinning, subset matchFacet, facet …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-17T03:31:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e559179c44df42e4ddc3da31f62b0aff78828ac4",
"body": "BuilderField.options carries the surface option set verbatim (group\nincluded); Facet.group pins a facet's value picker to one partition.\nIdentity and rehydration stay path + fixed where — group is\npresentation only. Peer dep raised to json-rules ^2.17.1.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.19.0 — grouped sources reach the picker",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-17T02:41:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "98043dc2edda5dd97f88cf22785ec8fee4dd95e4",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-17T01:57:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "94acfd17044929e18ad3b96126b4a4393e8451e8",
"body": "…lockedLeading/label\n\nFacets sort ahead of anchor fields in the builder's field list — the named,\ncurated entries a decoration exists to surface open the picker. Example\nrenderers backfilled to the contract the types spec: hoist collapses to the\nfacet badge, lockedLeading identity rows hide, group label renders as title.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.18.1 — facets lead the picker; drop-in renderers demonstrate hoist/…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-15T00:52:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8e79f142187b9946c65d73782f12d551e9270fd4",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-14T04:47:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c7a478097a6bfe15b3a7060e731034ce1f63f16",
"body": "…ng-qnvisb\n\nfeat: Decoration/Facet — hoist & relabel lens paths into the root selector (0.18.0)",
"is_bot": false,
"headline": "Merge pull request #2 from inixiative/claude/rules-builder-lens-mappi…",
"author_name": "Aron",
"author_login": "agreenspan",
"committed_at": "2026-07-14T04:45:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e75881423163b57f6ecb67dc930104105522aea",
"body": "The Decoration/Facet primitive shipped in this PR without a changelog entry\nor version bump. Documents the four facet kinds, two-wheres, validateDecoration\nguarantee, and the new exports; bumps 0.17.0 → 0.18.0.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: 0.18.0 — CHANGELOG entry for Decoration/Facet + version bump",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-14T04:42:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "45feb53449968b43fcef34aea25da359d7b1aa6c",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "docs: document splitting one relation into N tagged sources",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T03:42:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "18efe2fbe4e43a82b78aeca21ca1db155454f54c",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "test: same relation adjoined N times, split into tagged sources by slug",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T03:40:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9b0df35391bec6374230c6fe58365e9be5631c5e",
"body": "Proves you can divide one physical enrichment table into logical sources with no\nnew primitive: each integration is a facet whose fixed `where` leads with the\nsystem slug (`{all:[slug=salesforce, key=nps]}` vs `slug=gong`). The two are\ncollision-free, each seeds `customFields any (slug=… AND key=nps\n[…]\nis fully\nsupported today; only the ergonomic `scope` remains, deferred.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "test: demonstrate the manual source-split by system slug",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T03:36:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "07ece7fd263616fdfcaee58becf5d60d07990b64",
"body": "A single physical EAV/enrichment table is often N logical sources split by a\n`source`/`integrationId` column (integration A vs B custom fields). Captures:\nit's the same where-slice one level up (expressible by hand today: facet\n`where: {all:[source=A, key=nps]}`); the only gap is ergonomics (declare\n[…]\novenance, so the source→fieldset\nmapping must be authored, not derived.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "docs: capture the source-splitting open question",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T03:21:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "369b52620f90b87086f355395c800f8ccdb00a3e",
"body": "PickOption gains `icon?`, and the field selector's options carry each field's\nicon (leaf/collection/branch/preset facets, and relations retagged via\nlabels.models). Previously the icon only reached the collapsed node (hoist.icon)\nand BuilderField.icon — not the menu you pick from. Now the sectioned picker can\nshow icons on the options too.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: propagate facet icons to picker menu options",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T03:13:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ed5980ce8e64af7f51b6edc5eaec13104ab94887",
"body": "…tion\n\nA facet can now carry `condition` instead of `path`: an alias for a whole\npre-authored rule (e.g. \"Mature\" = tier=gold AND account.industry=tech).\nSelecting it drops the entire condition in as one atomic node — no field /\noperator / value pickers — and it simply works as a rule. A saved node \n[…]\n, passes the lens gate, evaluates,\n and rehydrates as the atomic chip.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: preset facets — a named alias for a complete pre-authored condi…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T03:02:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ce8241870ecb4f7e9bb54ad38de081febbae8a85",
"body": "…the gate\n\nDrives each facet kind (leaf, sliced collection, branch) through useRuleBuilder,\nsets a value, emits the Condition, and asserts it both passes\ncheckRuleAgainstLens (the lens gate) and evaluates correctly via check() —\nincluding that the NPS facet's locked `where` actually scopes it (a `csat`\nelement doesn't satisfy it).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "test: end-to-end — a decoration facet compiles to a rule that passes …",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T02:35:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bc2f0b7220e3368e63fed5403380cb8382859de6",
"body": "Wires the previously-reserved `labels.models` dictionary:\n- the root/anchor group carries a `label` (GroupNode.label) from\n labels.models[map:Model | Model] — \"overwrite root with a label\";\n- relation fields (list + to-one) are retagged by their target model's label\n wherever a surface is built (r\n[…]\neling half so\nanything can be retagged too. labels.maps stays reserved.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: retag the root and relations via labels.models",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T02:31:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "07df7b979c63e376fbed217979bbd6be00b178f9",
"body": "…tion\n\n- Correctness: the ROOT group could be captured by a whereless branch facet's\n prefix heuristic (when every root rule sat under one relation), swapping the\n root picker to the branch scope. buildGroup now gates branch recognition on\n path.length > 0 — a branch is always a nested group, nev\n[…]\nit that made operators editable defaults (dropped from match identity).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "fix: address Steven's PR review — root capture, match honesty, valida…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T02:24:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9ce05c7d360e77420fca9a89dfa4ed893c13f433",
"body": "…rrayOperator\n\nThe traversal layer now carries an operator for EVERY array boundary the path\ncrosses (each defaults to `any`), not just the ones \"before the destination\".\nIts length must equal the path's array-traversal count — validateDecoration\nrejects a mismatch. The separate `arrayOperator` fiel\n[…]\nwhere` only; it descends to the innermost and checks\nthe leading where.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: defaultWhere is one operator per array traversal; drop single a…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T02:09:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8bd5bd05618b6a030d1c301e3a8f601602cb32cd",
"body": "… at destination\n\ndefaultWhere is now a list of ArrayOperators (default `any`, the contains\nsemantic), one per array boundary the path crosses before its destination —\n\"just enough to cross the boundaries and get to where the path has traveled to.\"\nIt is no longer a Condition.\n\nA collection seed now\n[…]\nd: multi-boundary seeds round-trip and\nevaluate correctly with check().\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: defaultWhere is the upstream array-traversal layer; where lands…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T02:03:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "40b0accaac568525581a657c76b226e13f87e53b",
"body": "- defaultWhere now seeds only collection (array-traversal) facets — removed from\n branchSeed. A branch takes only its fixed identity where. Doc updated: leaf and\n branch facets ignore defaultWhere.\n- Confirmed the decoration traversal carries no non-rule-nesting depth checks:\n branchFields walks \n[…]\n path segments. The lens's finite\n narrowed surface bounds everything.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "fix: defaultWhere is array-only; decoration traversal has no depth caps",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T01:49:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "41a8ae568dd4cb655ae194df0c5aa67c7ac040f3",
"body": "The exposed lens is already a finite, narrowing-bounded surface, so an arbitrary\nBRANCH_DEPTH cap second-guessed it. branchFields now walks the branch model's\nsurface with only the per-chain `seen` guard for termination on recursive\nschemas — the same mechanism exposedSurface uses. The narrowing decides depth.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "refactor: drop the branch-depth cap; trust the lens's fixed depth",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T01:45:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8741e109a222faa78f333b2300169306badbe93f",
"body": "Nesting is no longer bounded to one level.\n\n- Collection facets recurse: a path crossing several list relations\n (`orders.items.sku`) seeds nested array nodes — `orders any (items any (sku …))`\n — instead of a flat two-list path that json-rules silently mis-evaluates\n (verified with check()). col\n[…]\nat each level as\n nested array nodes rather than descending them flat.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: full nesting — nested array facets and nested branch pickers",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T01:39:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a1c0e3abf6cc04bf3c477e4492d170fc54149d9e",
"body": "Completes the leaf/branch/collection trio. A facet path ending at a to-one\nrelation (`account`, `salesforce:Contact`) is a **branch**: selecting it seeds a\ngroup whose field picker is scoped to the related model, and leaves emit real\n`account.*` dotted paths (json-rules resolves them in a flat group\n[…]\nenum fields only — nested branches (a to-one inside a branch) deferred.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: branch facets — hoist a to-one relation as a scoped group",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T01:22:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2a0a4c50274df34df818432a03932bca79a3d02d",
"body": "Rename the primitive per review (not \"lens\" anything): the mapping is a\n`Decoration`, each entry a `Facet`. Plus the model refinements:\n\n- Two distinct `where`s. `where` is FIXED/non-editable — the facet's identity,\n prepended as the leading condition(s) and the only thing rehydration matches\n on.\n[…]\nelation as a scoped group) and nested-list paths remain the\nnext slice.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "refactor: LensView → Decoration/Facet; two wheres; collision validator",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T01:14:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "54d0205a1c6ae1304bd1053c63e5fd46710e51d3",
"body": "Addresses the review directives on top of the hoist templates:\n\n- `slice` → `where`, consistent with the lens/engine vocabulary; authored and\n non-editable (the array node's locked filter).\n- Multi-hop: a hoist path may traverse any number of to-one relations (and\n bridges) before its list/leaf — \n[…]\nked/hidden.\nNested-list paths (two array levels) are not collapsed yet.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: where-slice, multi-hop, hidden-editable operator, rehydration",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T00:52:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3c8b75b4e5e3568415403934995473342dd97257",
"body": "Generalizes a hoisted root from \"a field\" to a rule template, so a view can\nraise more than flat leaves to the root selector:\n\n- Collection hoist: a path whose first segment is a list relation seeds a\n top-level array node (a scalar operator over a list path silently mis-matches,\n so it must be a \n[…]\nook\nconcats collection roots and applies the move-not-copy subtraction.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: collection & sliced hoists, move-not-copy, round-trip matcher",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T00:38:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "03b54cc4b0a50feb72f757ac74991d5281e76f29",
"body": "json-rules silently mis-evaluates a scalar operator over a list-crossing path\n(`orders.total > 100` returns no-match even when an element is 200), and\ncheckRuleAgainstLens does not catch it. walkToOwner now drops any path with an\n`isList` segment so slice-1 never emits a broken flat leaf; array-node hoisting\nis a separate, still-to-design node kind.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "fix: never flat-hoist a path crossing a list relation",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T00:17:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ade724d3fdfae5829e43926f19784c1ffa252a29",
"body": "Adds a presentation-only display view over a lens. `roots` moves chosen lens\nlocations (any dotted path from the anchor, crossing `map:Model` bridge\nsegments) up to the builder's root field selector, additive to the anchor\nmodel's own fields. Each hoisted entry emits its real path as the rule `field\n[…]\nd rendering map/model/bridge labels mid-drill-down) are the next slice.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013JBMaiAdm6feKJUXx3XwEd",
"is_bot": false,
"headline": "feat: LensView — hoist pre-traversed lens paths to the root selector",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-14T00:13:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "de180ac851f43a3f84a0cab4403ddb5041eb7614",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-09T17:55:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47abd76f389371af3f826fea4f5e8d8bcea61178",
"body": "…17.0)",
"is_bot": false,
"headline": "feat: configurable empty scaffold; setCondition(undefined) clears (0.…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-09T17:54:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b46844aaf8253d048f4a58dd88f39a5c4f396a0",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-07T01:56:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f142fcc30ecfe13e963c629ad43a90e637fbae0d",
"body": "…+ slight fuzzy (0.16.0)\n\nOptions extend the engine string settings (Partial<EngineGlobalsState['string']>);\nthe filter pass applies them via engineGlobals.with(). Defaults to\ncase-insensitive + slight typo-tolerance ({ maxRatio: 0.2, maxDistance: 1 }),\noverridable per call. Scoped to the sync pass, global config untouched.\nBumps @inixiative/json-rules to ^2.16.0.",
"is_bot": false,
"headline": "feat: useFilteredCollection string-match defaults — case-insensitive …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-07T01:40:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9316d1aa081fd1845aefdc1b89a4c3a15cd68bdd",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-07T01:17:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0aec77366383fab726847ccf09ac1c316756431",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-07T00:37:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e830f002ae26ba002911ce709e4cd3ca28655fa8",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-07T00:02:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03b1b3ea5302e2b2c342e1d3d1bbf9cefbad47d6",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T18:28:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b7b800e3434525f77772f42ef01a2d5e519f590",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T17:44:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62399453b9e443800299a06dbb4dd7c2a09ee188",
"body": "…ion in hand",
"is_bot": false,
"headline": "feat: 0.15.0 — useFilteredCollection, headless builder over a collect…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T17:42:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9adb1cf74f7c1fbc149c1b3a5ea401395ee89013",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T17:29:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fefb5df6cb8a90af84dd49518f3f26cefc18e436",
"body": "…tion in hand (0.15.0)\n\nComposes useRuleBuilder with the in-memory half of the rules duality for\ncollections fetched whole (calendar ranges, Kanban boards): one Condition\nowner, one option-folding seam (sourceValuesFromRows through resolve),\nstamp-once. useRuleBuilder.value is now memoized so downst\n[…]\nolve for the shared\npre-projection lens. Peer floor: json-rules ^2.14.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017Zq9H6g79PM1uEyPqHQcLk",
"is_bot": false,
"headline": "feat(builder): useFilteredCollection — headless builder over a collec…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-03T16:54:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "94a007899911e0f3922a2db547cdcd9abfb71b2d",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T05:25:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af71ac936a54dbdb40b6ac99295679cb344890fc",
"body": null,
"is_bot": false,
"headline": "chore: sync ecosystem deps to blessed set",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T05:11:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "605fb5053fe325a5a45c6ac5863e6df9c791c76f",
"body": "…ime coercion)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: release 0.14.1 — json-rules ^2.13.1 floor (deterministic DateT…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T04:35:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0ae51942396a6c06db9011ee2dddb86352bda1db",
"body": "…-memory check demos\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: evaluate panel + coerceType docs; enrich sample rows for in…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T03:28:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "292aa865cf596866790b012e05d3921c2b9477a0",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: adopt @inixiative/config 0.3.0 (2.13 blessed set)",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T02:45:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6201c5a6354341e1c9e0934922024ed28212a8cd",
"body": "… url\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: commit train re-lock (json-rules 2.13.0); normalize repository…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T02:39:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2cde0304130a9fe2122be9d5217fe24a1cfbe5a3",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: align json-rules devDep floor with peer (^2.13.0)",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T02:36:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e9ec4b36f0b5fc391e95784240b3761c8e1fd08b",
"body": "…oercions (0.14.0)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(builder): emit coercion-stamped rules via json-rules 2.13 stampC…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T02:31:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e140d86316b5206c1c424e2b8295daf397dac83f",
"body": "…l failure at publish)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: build via @inixiative/config tsup preset (fixes TS6 dts baseUr…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T02:25:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a61cecba8e375b77ff8cab91a60026a21ded91ac",
"body": "…ok, committed lockfile, CI)\n\n- biome 2.5.2 via config stubs; first-ever format pass (61 files); src at\n full enforcement, examples override off noLabelWithoutControl +\n noArrayIndexKey (demo playground); tailwind css excluded from parsing\n- tsconfig slimmed to react preset stub; examples get vite\n[…]\npublishOnly deduped\n- bun.lockb -> bun.lock (committed), lefthook pre-commit, ci.yml caller\n reusing inixiative/config lib-ci.yml\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: adopt @inixiative/config 0.2.1 (biome + tsconfig stubs, leftho…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-03T01:50:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e5139bae80beeeead8424f0ffd055d483183f128",
"body": "…array-root remove; test hooks (0.13.0)\n\n- adopt json-rules 2.12.1 options: runSources → SourceValues.options {value,label}[], describeModelFields reads field.options; example narrowing editor handles Condition | SourceSpec\n\n- fix: bare array-root remove() no longer throws (clears to empty group); junk 'undefined' node id guarded\n\n- tests: lifecycle coverage for all five hooks (+42, 176 total)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: bind value-source + adopt json-rules 2.12 labeled options; fix …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-07-02T16:07:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7b58446107822ae2cbe91d539b5a9310d7457a9b",
"body": "…le-9p39jf",
"is_bot": false,
"headline": "Merge pull request #1 from inixiative/claude/bind-rules-builder-examp…",
"author_name": "Aron",
"author_login": "agreenspan",
"committed_at": "2026-06-30T23:05:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7734b1dd500a70ced4731654cbbdcab7162ba14e",
"body": "…ion builders) (0.12.0)\n\nThe two uncontrolled leaf builders (useRuleBuilder, useActionRuleBuilder) read\ntheir seed once at mount via lazy useState, but named the prop `value` — the\ncontrolled name. That invited consumers to round-trip it (value={state}) expecting\ncontrolled semantics it silently ign\n[…]\n (usePermissionBuilder/useTransitionBuilder),\n`defaultValue` = uncontrolled seed. Reseed via remount key or the imperative setter.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: rename uncontrolled seed prop value -> defaultValue (rule + act…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-30T22:05:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9454435cb4054a2cfe880d5a632461cf08cd9991",
"body": "Pin to the bind key-presence contract fix (2.11.1).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TNattabTfrjmM1i127vUPs",
"is_bot": false,
"headline": "chore: require json-rules ^2.11.1",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-06-30T16:56:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "61a9f8ba869ce221cf1cee5630e4ed5ab9251670",
"body": "…12.0)\n\nAdd `{ bind }` as a third leaf value-source alongside literal `value` and\nfield `path`. A bind references a named binding resolved at execution time\n(json-rules 2.11). `ValueControl` gains `mode: 'bind'` and a `bind` control\nmirroring `path`; both reference renderers (plain + shadcn) render \n[…]\nules to ^2.11.0 (where `bind` lands in the\nCondition type and runtime).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TNattabTfrjmM1i127vUPs",
"is_bot": false,
"headline": "feat: bind value-source in the rule builder + reference renderers (0.…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-06-30T14:47:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8e5ef13340f6e0e3d1810cbad9952c1fe9ae1f8b",
"body": "…11.0)\n\nBooleans are first-class everywhere a condition or ActionRule leaf can go:\n\n- Condition builder: a leaf is a field comparison OR a `true`/`false` literal\n (`leafKind` + `setLeafKind` flip between them; `literal` holds the value).\n buildNode routes a raw boolean to a literal leaf instead of\n[…]\n(RuleTree, RuleTreeShadcn, ActionRuleTree) updated for the\nleaf-kind toggle, the literal value control, and the allow/deny badges.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: raw booleans as a leaf; bare root (no synthetic group wrap) (0.…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T13:30:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7a65a81a25056603ec68ff0525dba2a62d68a3f2",
"body": "…ges\"; demo the rel-walk + transition authz\n\n- buildActionRoot: editing a rel hop now resets `action` — changing the\n relation path can move the target resource, so a previously-picked action\n (belonging to the old target) would ship stale and incoherent. Only\n picking the action keeps the path. \n[…]\n a `from.permission` that delegates to app:Order's\n `manage` — demonstrating transition authz is aware of the permissions object.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(transitions/permissions): reset stale rel action; \"paths\" not \"ed…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T10:58:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "89566aaff66db1634eab0d364b3ba6ca1f0b08e2",
"body": "Adds the headless transition-schema builder (src/transitions/) and a\nTransitions tab to the example: resource (`map:model`) → action → edges,\neach edge a from/to side with a predicate (rule builder) + optional\npermission (ActionRule builder), `to` carrying a serializable merge.\n\nNav: drop the nested\n[…]\nowings, actions\nunder permissions) — the tree grew unwieldy. Sidebar items are now flat;\nnarrowings render `name ← parent` inline.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: useTransitionBuilder + Transitions tab; flatten nav (0.10.0)",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T10:44:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "391cc7e403e7d65d1eb0d39ed9d59f80c146ed28",
"body": "A rule's value control now toggles literal `value` ↔ `path` — comparing a field to\nANOTHER field's value by dotted path (`{ field, operator, path: 'user.email' }`), which\nContact's rebac uses. ValueControl gains mode/setMode + a path sub-control; switching modes\ndrops the other key. Both reference renderers render the `= value` / `→ field` toggle and a\npath input. Benefits Rules and the embedded permission abac leaf alike.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: abac value-by-reference (path) control in the rule builder (0.9.1)",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T05:13:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5cf0fa6d6f5097bbcf657e8462f0df0794c00092",
"body": "… (0.9.0)\n\nActionRule `rel` is now a multi-hop path: one segment per relation crossed, each scoped to\nthe resource reached so far (RelControl.segments + addSegment/removeLast + target). Only\nto-one relations are walkable — list relations and the one→many bridge direction are\nexcluded (the check eval\n[…]\n checked bridges become the schema's `bridges`.\n- ActionRuleTree renders the rel path (segment selects + hop add/remove + action).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: multi-hop rel paths, to-one gating, permissions scope selectors…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T05:04:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fb7db14cc89a893adb9c92dd14d025f2d6ad5abf",
"body": "…e (0.8.0)\n\nBREAKING: rules-builder's re-declared permission API now matches the engine's 0.2.0\nself-contained schema so the builder emits what the checker consumes.\n\n- RebacSchema = { bridges?, permissions } (was flat Record<model, ModelPermission>).\n- ResourcePermission (was ModelPermission); reso\n[…]\n Permissions tab is resource-keyed; emitted JSON is { bridges, permissions };\n sample + workspace carry `app:User`. Docs updated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat!: sync permissions builder to @inixiative/permissions 0.2.0 shap…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T04:50:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2bbb4ded2ddeb7cb3e14be23fcddda278ed5e7ce",
"body": "…ma (0.7.0)\n\nThe permission artifact is the entire schema (model → { actions }), not a per-model\nentry with an entrypoint. usePermissionBuilder now takes the whole schema (value/onChange)\n+ the fieldMaps, manages every model (addModel/removeModel/...), and builds each model's\nRAW record surface from\n[…]\n).\nThe Permissions tab is now a whole-schema view: models list + per-model actions + the\nActionRule editor + the full schema JSON.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(permissions): usePermissionBuilder owns the whole rebac sche…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T03:41:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d0bde4e69258b0e65531bb9c92d978930fb345e1",
"body": "…the raw model\n\n- buildActionRoot crashed on a null node (deny): it fell through to the `rule`\n branch and read `null.rule`. Add the explicit deny branch (kind-only node).\n- Permissions are now authored against the RAW model record (full surface, relations\n via bridges), not a lens/narrowing — aut\n[…]\n needs every field,\n not a projection. SavedPermission.source → { mapName, model }; the Permissions tab\n picks a model directly.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(permissions): handle the deny (null) ActionRule + author against …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T03:32:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ac267caf161c3f16c375a1157a387c93df09f678",
"body": "…er (0.6.0)\n\nPermission primitives over a lens/narrowing base (src/permissions):\n- ActionRule algebra (delegate / rel / self / { rule } abac / any / all / deny),\n declared zero-dep over json-rules; tree ops + buildActionRoot descriptor.\n- useActionRuleBuilder: the atom — one model-aware ActionRule.\n[…]\nOOLS, with Docs + Settings bottom-aligned; Docs gains a Permissions section; sample\nrebac entry on User. 21 new tests (112 total).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(permissions): headless useActionRuleBuilder + usePermissionBuild…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T03:25:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "df91cadb67646c9cf06038728969b1e7faf460e3",
"body": "…form)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(examples): trim Related links to GitHub (drop npm + conditional-…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T02:55:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b9a93f87e81c4a9c60aa59a38b29d1e59ff281db",
"body": "Link the builder (GitHub + npm), the json-rules engine, conditional-form, and the\nplatform site — not just json-rules.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(examples): expand the Docs \"Related\" links to the full ecosystem",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T02:47:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d9a7d138f7da6efd3ab4c34cf0f000274fdf9dc2",
"body": "FieldMaps had a two-mode header (New fieldMap/Add vs Edit fieldMap/Save+Close)\nwhile Lens/Narrowing use a single name-driven form. Make it consistent: one\n\"FieldMap\" header (name + Save, no Close), Save creates or updates/renames by\nname, with a live MapView preview of the JSON draft.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(examples): unify the FieldMaps editor with the other forms",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T02:46:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "284d269f0d0266ec0b1eb1e08efbd174d16ac2f3",
"body": "…Node from entry\n\n- NarrowingEditor crashed (`Button is not defined`) — the import was dropped when\n the editor moved to the shared EditorHeader, but Button is still used in the\n mapDefaults section.\n- Re-export the `ArrayNode` type from the package entry (it was only reachable via\n the internal \n[…]\n slipped through. Add tsconfig.examples.json + a typecheck:examples script and gate\n example:build (and the Pages deploy) on it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(examples): restore Button import in NarrowingEditor; export Array…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T02:40:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0eb9498017045f04bc450b3cdb34b00f623da4d3",
"body": "…validity (0.5.0)\n\nLibrary (@inixiative/rules-builder):\n- Array/relation rules: a new ArrayNode in the descriptor tree — presence\n (empty/notEmpty), count (atLeast/atMost/exactly + count), and predicate\n (all/any/none) with a nested `condition` + window `filter` sub-builder scoped\n to the related\n[…]\n\n to every rule field; fix the lenses/narrowings counts.\n- Ref-based saved rules in the workspace (source ref + captured values).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: array rules, sourced-values helper, serialization, per-control …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T02:33:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "14ffb7263ef1088a18386c6d736549fc1c583384",
"body": "The nav is a CSS grid; its grid-item children (section and item\nwrappers) defaulted to min-width:auto, so the widest label's intrinsic\nwidth forced the tracks past the 196px content box — pushing the ✕\nremove buttons ~5px past the panel border and jamming long labels\n(`admins-only ← vip-active`) to \n[…]\nink:0 on the ✕ so it keeps a fixed slot, overflow:\nhidden on the nav as a backstop, and widen the rail 220→240 for\nbreathing room.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(examples): stop inventory nav from overflowing its panel",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T00:40:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1d19515df248520cd7f5d3b5f26a2462711c2711",
"body": "…ions) as separate top-level concepts\n\nNarrowings pick a parent (lens or narrowing) and restrict its EXPOSED surface — controls + options reduce down the chain; resolveRef walks the chain; inventory gains a Narrowings section (each shows its parent, sources nested under it); builder + value picker author against any lens or narrowing; sample = 1 lens + 2 chained narrowings.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: split Lens (anchor+bridges) vs Narrowing (parent + restrict…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T00:31:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7c2b2d5238dc875db13266744edc26ac128db441",
"body": "…; item click loads it\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: Lenses header click starts a fresh lens (matches FieldMaps)…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T00:13:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b717e0a2df0bb9fa0d5c160843da80173213fc27",
"body": "…ng; edit view has a name field (rename), no Add (Add lives in the list view)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: FieldMaps editor — clicking the section header clears editi…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T00:12:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "addd98863fd640fd2f0631db9d2c2042b68628a5",
"body": "… + nesting bg, so a group reads as a conditions block and nesting is legible\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: rule-group clarity — CONDITIONS label + colored left-accent…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T00:10:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "33b38539f7e62a4911be76b95ca51994c3fab008",
"body": "…t); boolean value → true/false dropdown (not checkbox); label narrowing JSON as the reference form (vs projected surface)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: editable FieldMaps (per-map JSON editor + add, click-to-edi…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-29T00:08:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "eff79d20e7928f7d93ae5b26767ae33e51369814",
"body": "…sted under it in the inventory; drop standalone Sources tab/flat list; sourceValues via runSources(lens)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: sources live in the lens narrowing — edited in the lens, ne…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:56:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a1dfdd3dd5643a4cd220515722e3b0bce3784750",
"body": "…omposed against a lens)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: revert order — Lenses before Sources (a source's where is c…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:40:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5180fe76f15268e1ffb33a4e461e7ccba851f913",
"body": "…emove (✕); sample cross-map lens in default; Sources before Lenses\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: rules as a saved collection (+ Save rule); inventory item r…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:37:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fd92462b6263c7d3b93090e11496d396818c5b1b",
"body": "…lation affordance, value picker lens→fieldMap→model, Select sweep\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: per-lens bridges (attach + stitched relations), 'extend' re…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:33:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "97ae20e64477b07754b81c2c714de1e3ed03c080",
"body": "…N import); header is title-only; FieldMaps tab view-only\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: Settings entry in nav (export/import/clean/load + typed JSO…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:26:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "80d3cab25d834ad6415f073b357eb9b981dfd32f",
"body": "…shared Select primitive; lens loads from sidebar\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: inventory sidebar (replaces tab flow) + Clean/Load-sample; …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:21:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d0f3ace508abcb484d76eac3937ae37a16cfb20e",
"body": "…oing the same none/picks/omits as enum values)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: standardize field-visibility on the dropdown (was a radio d…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:09:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1bf009d5a61ea5369497b38a94cdb5e1f629e51d",
"body": "…aps (flow) casing\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: load the sample bridge by default; FieldMaps (tab) / fieldM…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:07:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9c62790678585eb53e2960a3a8bc21ec0c22d10c",
"body": "…nk live demo\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: host the example on GitHub Pages (vite base + Actions deploy); li…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T23:01:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "35348a34c80d49a5d12296b61ac85e040cad93c0",
"body": "… demo; 0.4.0\n\ndescribeModelFields + lensValuePicker flag Json columns (acceptsSubPath); the rule builder's field control resolves a base Json column + freeform subPath and recomposes the rule's field; RuleTree/RuleTreeShadcn render a json.path input; new '6 · Value Picker' tab demos lensValuePicker freeform descent; sample User gains a Json metadata field.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: freeform Json sub-path entry across both pickers + value-picker…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T22:47:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "94988a0b8faf1cb5f24f056e9c0129efde05b410",
"body": "…sub-path entry\n\nA Json column has no declared sub-fields, but the json-rules kernel resolves a dotted JSON path on the operand across all three targets (check via lodash get, toPrisma via walkFieldPath → { path: [...] }, toSql via quoteField → ->>). The picker now signals this with LensValueOption.acceptsSubPath so a renderer can let the user append a freeform sub-path (metadata → metadata.theme).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(lensValuePicker): flag Json columns acceptsSubPath for freeform …",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T22:28:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e6f5350d8dd85ea26dd8fb1d56cad1c9fc9cd9db",
"body": "…ker + shadcn drop-in (0.2.0–0.3.0)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: pure-headless descriptor builder + resolve() + lensValuePic…",
"author_name": "Aron Greenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-28T13:20:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "992db9c3f6f20a0717f5e8731857bdde23a7f191",
"body": "https://claude.ai/code/session_01N5FYPb4FZ81f1rZrkjaeQZ",
"is_bot": false,
"headline": "chore: add check script and run check+test on prepublish",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-06-13T18:13:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bde73cdc1fdb5c9116c2167b4aad3c62219ee86e",
"body": "- examples/slots.tsx: a concrete ComponentSlots implementation (dependency-light;\n swapping in shadcn is a styling change), factored out from the app.\n- examples/App.tsx: wires RuleBuilder + the slots over a sample User lens and shows\n the live clean condition; main.tsx/index.html/vite.config.ts.\n- `bun run example` (dev) / `example:build`. Verified: `vite build` bundles the\n full stack (35 modules) and 42 tests stay green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Example app: minimal Vite app + factored-out slot set",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:54:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1bc55202807cae2bfe3ffb08b727479423898957",
"body": "- useRuleBuilder: holds decorated tree state, emits CLEAN conditions at the editor\n boundary (withIds in / stripMeta+trimEmptyGroups out); exposes path-addressed\n mutations + fields()/describe()/validate() over the composed surface.\n- Components (slot-injected, BYO via ComponentSlots): RuleBuilder\n[…]\n(happy-dom + @testing-library/react, React 19); 42 tests incl.\n render/add-rule-emits-clean/remove/enum-value-select. Full src typecheck clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "React layer: useRuleBuilder hook + recursive RuleBuilder components",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:50:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bfafff747e37071d3058e55a552ed4dfe198a348",
"body": "Convention: editor meta keys are _-prefixed, so one deep stripper cleans any\nartifact (conditions, maps, lenses, bridges) at the editor→DB boundary. Decoration\nstays artifact-specific — only the Condition tree's positional arrays need synthetic\nids (withIds); maps/bridges/lenses key on names/registry ids naturally.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make stripMeta artifact-agnostic (strip any _-prefixed key on any tree)",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:36:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "32f3c353a1d987c75bbfbd89c5d724adbf94f23d",
"body": "Locks the semantic: unwrap removes the group wrapper (promotes children); an\nempty group dissolves to nothing. Deleting contents too is removeNode, not unwrap.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: unwrapping an empty group deletes the wrapper entirely",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:33:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6a3baf3c491bb8c5ecf28c548f1b476780e73b64",
"body": "…a layer)\n\n- groupSiblings(parentPath, indices, kind): wrap arbitrary selected siblings of a\n compound into a new subgroup at the earliest position — pushes a subset down a layer.\n- unwrapCompound now dissolves: splices a compound's children into an all/any parent\n (any child count) to move them up a layer; single-slot parents/root still require\n a single child. Inverse of wrap/group.\n\n35 tests, typechecked.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Tree engine: group N siblings (down a layer) + dissolve compound (up …",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:31:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f9dfc30e4091de23e838a2cb42692228cba716d8",
"body": "…t tests\n\n- Strip explanatory comments across src (lean on names/docs/tests per house style).\n- toFieldKind: unknown (non-Prisma) scalar types fall back to String so the\n generic builder stays usable without a per-source importer (none exists yet).\n- describeModelFields surfaces enumValues for any \n[…]\nown-type\n fallback, valueShapeForOperator slot mapping, and the editor boundary\n (stripMeta(withIds(clean)) === clean). 31 tests, typechecked.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Lean comments; generic-map type fallback; pseudo-enum values; contrac…",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:20:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "80b2b2aee08547c7c2e460672ab15e5d8e0982fa",
"body": "…ties\n\n- composeSurface(RuleBuilderSource): build the leak-safe exposed surface from\n prisma-map-shaped maps + bridges + entrypoint (+ optional narrowing) — callers\n pass plain JSON, never a live Lens. The builder composes/reduces internally.\n- core/decorate.ts: UI-decoration layer over the pure C\n[…]\nts a pure Condition engine.\n- json-rules 2.8.0 installed from the registry (dev symlink retired).\n\nTypechecked (core+schema) + 27 tests passing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Accept serializable maps for composing lenses + tree-decoration utili…",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T15:08:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "983cd3be8276b638174bdcb022a9a5e170b008d0",
"body": "Replaces the pre-lens v0 skeleton (hand-rolled field types + operator registry)\nwith a lens-driven core that consumes json-rules ≥ 2.8:\n\n- schema/surface.ts: describeModelFields() adapts an exposedSurface Lens into\n BuilderField metadata — per-field kind, valid operators intersected across the\n co\n[…]\nassing. React\nlayer (useRuleBuilder hook, renderer, example shadcn slots, preview) is staged in\nPLAN.md — needs react installed + a DOM harness.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rebuild rules-builder headless core on the json-rules lens surface",
"author_name": "agreenspan",
"author_login": "agreenspan",
"committed_at": "2026-06-13T14:24:19Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 0,
"commits_last_year": 100,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 6,
"active_weeks_last_year": 6,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": false,
"has_contributing": false,
"health_percentage": 37,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@inixiative/rules-builder",
"exists": true,
"license": "MIT",
"keywords": [
"json-rules",
"rule-builder",
"visual-editor",
"react",
"form-builder"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@inixiative/rules-builder",
"is_deprecated": false,
"latest_version": "0.21.0",
"repository_url": "https://github.com/inixiative/rules-builder",
"versions_count": 19,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 15338,
"first_published_at": "2026-06-28T02:03:35.080000Z",
"latest_published_at": "2026-07-20T16:07:36.444000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
}
]
},
"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,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 33730,
"source_files_sampled": 82,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"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": [],
"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": 2,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "agreenspan",
"commits": 76,
"avatar_url": "https://avatars.githubusercontent.com/u/1390546?v=4"
},
{
"type": "User",
"login": "claude",
"commits": 24,
"avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.76
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"pages.yml"
],
"has_docs_dir": true,
"linter_configs": [
"biome.json"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"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": 10,
"reason": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
"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 1/11 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"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": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"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": 8,
"reason": "2 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "316d85aa2e8119763bfd8f1ad840be68e286d02f",
"ran_at": "2026-07-27T04:59:15Z",
"aggregate_score": 4,
"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-20T16:14:38Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-14T04:45:53Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/inixiative/rules-builder",
"host": "github.com",
"name": "rules-builder",
"owner": "inixiative"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"security": 40,
"vitality": 41,
"community": 35,
"governance": 56,
"engineering": 76
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 41,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"commits_last_year": 100,
"human_commit_share": 1,
"days_since_last_push": 6,
"active_weeks_last_year": 6
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "6/52 weeks with commits",
"points": 4.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 6
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "100 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 100
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"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": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"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": 35,
"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": "good",
"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": 70,
"inputs": {
"packages": [
"@inixiative/rules-builder"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 15338
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "15,338 downloads/month across npm",
"points": 55.8,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 15338,
"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": 56,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.76
},
"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 76% of commits",
"points": 5.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 76
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 2,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "2/2 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 2,
"decided": 2
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 1/11 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 46,
"inputs": {
"followers": 4,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "inixiative",
"public_repos": 15,
"account_age_days": 398
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "4 followers of inixiative",
"points": 5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 4,
"login": "inixiative"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "15 public repos, account ~1 yr old",
"points": 10.9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 15
}
},
{
"code": "account_age_years",
"params": {
"years": 1
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@inixiative/rules-builder"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 6
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 6 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 6
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "19 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 19
}
}
],
"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": "good",
"name": "Engineering Quality",
"value": 76,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 84,
"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 1 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": false
},
"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": 0,
"status": "missed",
"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": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 40,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"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": 40,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4
},
"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 1 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"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 1/11 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"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": "2 existing vulnerabilities detected",
"points": 6,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 55,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"tsconfig.json"
],
"agent_commit_share": 0.78,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "78 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 78,
"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": 33730,
"source_files_sampled": 82,
"oversized_source_files": 0
},
"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": "0/82 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 82,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"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": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "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"
],
"report_type": "repository",
"generated_at": "2026-07-27T04:59:28.803375Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/inixiative/rules-builder.svg",
"full_name": "inixiative/rules-builder",
"license_state": "standard",
"license_spdx": "MIT"
}