Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"ai",
"claude-code",
"cli",
"cursor",
"developer-tools",
"golang",
"knowledge-graph",
"local-first",
"mcp",
"memory"
],
"is_fork": false,
"size_kb": 3275,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 2116782,
"CSS": 25061,
"HTML": 15746,
"Shell": 7136,
"Makefile": 2995,
"JavaScript": 54209
},
"pushed_at": "2026-07-24T12:58:26Z",
"created_at": "2026-04-30T03:22:14Z",
"owner_type": "User",
"updated_at": "2026-07-24T12:58:57Z",
"description": "Persistent cross-tool memory for AI coding agents. Single binary. Zero dependencies.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://jhol.dev",
"name": "Jhol Hewres",
"type": "User",
"login": "jholhewres",
"company": "@altaforja ",
"location": "127.0.0.1",
"followers": 37,
"avatar_url": "https://avatars.githubusercontent.com/u/9128062?v=4",
"created_at": "2014-10-10T05:30:09Z",
"is_verified": null,
"public_repos": 13,
"account_age_days": 4309
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-07-24T12:59:37Z"
},
{
"tag": "v0.15.2",
"kind": "patch",
"published_at": "2026-07-21T15:24:46Z"
},
{
"tag": "v0.15.1",
"kind": "patch",
"published_at": "2026-07-21T15:11:55Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-07-21T14:30:36Z"
},
{
"tag": "v0.15.0-beta.1",
"kind": "prerelease",
"published_at": "2026-07-21T01:07:34Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-07-19T23:32:35Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-07-15T16:54:43Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-07-06T11:04:40Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-06-30T12:31:20Z"
},
{
"tag": "v0.9.1",
"kind": "patch",
"published_at": "2026-06-21T11:34:08Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-06-21T00:04:33Z"
},
{
"tag": "v0.8.9",
"kind": "patch",
"published_at": "2026-06-15T14:22:11Z"
},
{
"tag": "v0.8.8",
"kind": "patch",
"published_at": "2026-06-11T23:17:57Z"
},
{
"tag": "v0.8.7",
"kind": "patch",
"published_at": "2026-06-11T15:54:05Z"
},
{
"tag": "v0.8.6",
"kind": "patch",
"published_at": "2026-06-11T12:35:07Z"
},
{
"tag": "v0.8.5",
"kind": "patch",
"published_at": "2026-06-11T00:36:14Z"
},
{
"tag": "v0.8.4",
"kind": "patch",
"published_at": "2026-06-11T00:10:39Z"
},
{
"tag": "v0.8.3",
"kind": "patch",
"published_at": "2026-06-10T23:52:14Z"
},
{
"tag": "v0.8.2",
"kind": "patch",
"published_at": "2026-06-10T23:34:34Z"
},
{
"tag": "v0.8.1",
"kind": "patch",
"published_at": "2026-06-10T00:37:33Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-06-10T00:14:36Z"
},
{
"tag": "v0.7.3",
"kind": "patch",
"published_at": "2026-06-08T15:52:52Z"
},
{
"tag": "v0.7.2",
"kind": "patch",
"published_at": "2026-06-08T13:34:35Z"
},
{
"tag": "v0.7.1",
"kind": "patch",
"published_at": "2026-06-08T12:07:36Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-06-08T12:01:09Z"
},
{
"tag": "v0.6.14",
"kind": "patch",
"published_at": "2026-06-06T15:53:04Z"
},
{
"tag": "v0.6.13",
"kind": "patch",
"published_at": "2026-06-05T20:01:55Z"
},
{
"tag": "v0.6.12",
"kind": "patch",
"published_at": "2026-06-05T19:19:30Z"
},
{
"tag": "v0.6.11",
"kind": "patch",
"published_at": "2026-06-05T16:43:53Z"
},
{
"tag": "v0.6.10",
"kind": "patch",
"published_at": "2026-06-04T17:14:36Z"
},
{
"tag": "v0.6.9",
"kind": "patch",
"published_at": "2026-06-04T16:16:02Z"
},
{
"tag": "v0.6.8",
"kind": "patch",
"published_at": "2026-06-04T12:35:31Z"
},
{
"tag": "v0.6.7",
"kind": "patch",
"published_at": "2026-06-04T02:48:16Z"
},
{
"tag": "v0.6.6",
"kind": "patch",
"published_at": "2026-06-04T02:40:07Z"
},
{
"tag": "v0.6.5",
"kind": "patch",
"published_at": "2026-06-04T02:11:24Z"
},
{
"tag": "v0.6.4",
"kind": "patch",
"published_at": "2026-06-04T01:52:49Z"
},
{
"tag": "v0.6.3",
"kind": "patch",
"published_at": "2026-06-04T01:47:26Z"
},
{
"tag": "v0.6.2",
"kind": "patch",
"published_at": "2026-06-04T00:29:37Z"
},
{
"tag": "v0.6.1",
"kind": "patch",
"published_at": "2026-06-04T00:02:19Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-06-03T12:52:17Z"
},
{
"tag": "v0.5.9",
"kind": "patch",
"published_at": "2026-05-30T02:38:39Z"
},
{
"tag": "v0.5.8",
"kind": "patch",
"published_at": "2026-05-28T20:37:23Z"
},
{
"tag": "v0.5.7",
"kind": "patch",
"published_at": "2026-05-28T18:18:49Z"
},
{
"tag": "v0.5.5",
"kind": "patch",
"published_at": "2026-05-26T01:51:12Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-05-24T23:42:21Z"
},
{
"tag": "v0.4.10",
"kind": "patch",
"published_at": "2026-05-11T01:14:12Z"
},
{
"tag": "v0.4.9",
"kind": "patch",
"published_at": "2026-05-11T00:57:19Z"
},
{
"tag": "v0.4.8",
"kind": "patch",
"published_at": "2026-05-11T00:44:40Z"
},
{
"tag": "v0.4.7",
"kind": "patch",
"published_at": "2026-05-11T00:34:45Z"
},
{
"tag": "v0.4.6",
"kind": "patch",
"published_at": "2026-05-10T13:04:40Z"
},
{
"tag": "v0.4.5",
"kind": "patch",
"published_at": "2026-05-10T12:47:48Z"
},
{
"tag": "v0.4.4",
"kind": "patch",
"published_at": "2026-05-08T13:06:16Z"
},
{
"tag": "v0.4.3",
"kind": "patch",
"published_at": "2026-05-06T12:06:30Z"
},
{
"tag": "v0.4.2",
"kind": "patch",
"published_at": "2026-05-06T03:27:10Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2026-05-06T01:16:57Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-05-05T16:08:38Z"
},
{
"tag": "v0.3.3",
"kind": "patch",
"published_at": "2026-05-05T13:11:34Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2026-05-05T13:08:28Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-05-04T02:08:41Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-05-02T17:47:47Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2026-05-02T03:05:06Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-05-02T01:37:42Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-05-01T15:42:32Z"
},
{
"tag": "v0.1.7",
"kind": "patch",
"published_at": "2026-04-30T06:19:40Z"
},
{
"tag": "v0.1.6",
"kind": "patch",
"published_at": "2026-04-30T05:48:11Z"
},
{
"tag": "v0.1.5",
"kind": "patch",
"published_at": "2026-04-30T05:43:38Z"
},
{
"tag": "v0.1.4",
"kind": "patch",
"published_at": "2026-04-30T05:40:31Z"
},
{
"tag": "v0.1.3",
"kind": "patch",
"published_at": "2026-04-30T05:37:26Z"
},
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2026-04-30T05:30:11Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2026-04-30T05:22:59Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-04-30T04:52:32Z"
}
],
"recent_commits": [
{
"oid": "704b66c72b04fca7de6482ce3218eff2b235dab8",
"body": "…p, Windows install\n\nAlso syncs plugin manifests (were stale at 0.12.0) and VERSION (was v0.14.0)\nup to the current release; v0.15.x were tag-only and never changelogged, so\nthe [Unreleased] Cockpit section is left untouched for later reconciliation.",
"is_bot": false,
"headline": "chore(release): v0.16.0 — cross-project leak fix, cold-start bootstra…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-24T12:58:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47d927e72d9b08321f49149b86b3089f79bee9d5",
"body": "install.sh aborted with 'Unsupported OS: MINGW64_NT-...' on Git Bash even\nthough a Windows build is published. Map MINGW*/MSYS*/CYGWIN* to windows and\npick archive format, extractor, and binary name up front: the Windows release\nis a .zip containing anchored.exe (vs .tar.gz + anchored on unix). Extraction\nnow goes through an extract_archive helper, and the MCP config snippet uses\nthe right binary name per OS.",
"is_bot": false,
"headline": "fix(install): support Windows Git Bash / MSYS / Cygwin",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-24T12:51:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7348b7485a98588fc537b84d16db1389135468e3",
"body": "A brand-new project starts with an empty store, so anchored_context/search\nreturn nothing and the tool reads as broken. On SessionStart, when a project\nis cold (zero memories) and cfg.Plugin.AutoBootstrap is on (default), spawn\n'anchored bootstrap' as a detached child to seed memory from README/docs\n[…]\nnBootstrap wholesale (dedup by content_hash covers the\nsession race); the hook never blocks, and a short notice tells the model\nseeding is underway so an empty first recall isn't mistaken for failure.",
"is_bot": false,
"headline": "feat(hook): auto-bootstrap cold-start projects from repo signal",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-24T12:50:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "558fcf4e7b190b3699c86ea76760f6d823375092",
"body": "Bare nunca/never matched any negated sentence ('senha nunca exposta') and\nbare 'padrão é'/'regra é' matched config/domain facts, dumping them into the\npreference bucket — which then fed the identity block. Anchor nunca/never to\na usage verb (mirroring sempre+usa) and require a personal possessive for\npadrão/regra. Adds regression cases for the fixed false positives.",
"is_bot": false,
"headline": "fix(memory): anchor preference regex to cut false positives",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-24T12:50:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1c787cd4b8455db40c13c80abee0d2e0912b3fc1",
"body": "synthesizeIdentity listed all preference memories globally with no project\nor curation filter, so a fresh project's <identity> block surfaced\npreferences captured while working in unrelated projects. Scope the lookup\nto user-level (no project) plus the current project via a new\nscopedPreferences helper, and drop hard curation rejections\n(near_duplicate/rejected) while keeping the soft low_signal band visible.\nAdds a regression test proving another project's preference never leaks.",
"is_bot": false,
"headline": "fix(mcp): stop other projects' preferences leaking into identity",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-24T12:50:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "60c791e5d5a4b3a7053837f1d7f68ee90cbd3c57",
"body": "The ONNX session was created with nil options, so onnxruntime parallelized every\ninference across ALL cores. Run by a background worker living in the hub daemon\nAND each per-session MCP, a corpus-wide re-embed (tens of thousands of jobs after\nan embedding-generation change) pegged the machine (load \n[…]\ns ~1\ncore; combined with the v0.15.1 batch throttle, background re-embedding stays\ngentle. Embeds are short single-sequence inferences, so single-threaded latency\nis negligible for interactive search.",
"is_bot": false,
"headline": "fix(memory): cap ONNX threads to stop CPU saturation during re-embed",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T15:23:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fffca8a1688389c3bf568efe8ccf1040dbe543e0",
"body": "The durable embedding worker drained flat-out for up to the 30s lease window on\nevery 250ms tick. After an embedding-generation change enqueues a corpus-wide\nre-embed (tens of thousands of jobs), that ran ONNX back-to-back — and with the\nhub daemon plus every per-session process each running it, tim\n[…]\nhes instead of spinning. Large backlogs still drain steadily, but background\nprocessing no longer pegs the CPU. Small backlogs (tests, normal saves) finish\nin a single sub-cap pass and are unaffected.",
"is_bot": false,
"headline": "fix(memory): throttle durable processing worker to stop CPU saturation",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T15:10:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "db83f1363dc7efd7ee8fc86c9267c2c44afa6b92",
"body": "The plugin is versioned independently from the binary, so the marketplace\nmirror routinely trails the binary version even when fully current. Drift was\nmeasured against the binary, which reported a permanent 'plugin lags the\nbinary' in doctor and nagged an 'auto-updated' notice on every session, and\n[…]\n the mirror, so upstream plugin updates still flow.\nThe doctor and the session-start notice speak up only when the cache actually\ntrails the mirror or a sync/install fails; the steady state is silent.",
"is_bot": false,
"headline": "fix(plugin): stop false 'plugin lags the binary' drift warning",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T02:21:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8209be31d1f58a5ad68818408755db052a168355",
"body": ".gitignore: add .omx/ (local ONNX model cache) and normalise .omc to .omc/\nfor consistency. Remaining changes are gofmt struct-field alignment in\nsanitizer.go, query_expansion.go, metadata_v2_test.go, and import-order fix\nin perf_test.go; entity_detector.go drops a trailing blank line.",
"is_bot": false,
"headline": "chore: ignore .omx/ + gofmt alignment fixes",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:02:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3832dee123afd0fe18f973c304a6a84138625c7b",
"body": "remote.go resolves multiple linked remotes concurrently rather than sequentially\nso the CLI does not block on slow remotes when listing or unlinking.",
"is_bot": false,
"headline": "feat(cmd): parallel remote-link resolution",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:02:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f748d7350881c3fb451183dc6e79619d25538476",
"body": "stats.go calls Service.DerivedWorkHealth and renders per-state counts plus\noldest_pending_age for both the processing queue and the remote outbox so\noperators can quickly spot a stuck or backed-up delivery worker without\nquerying SQLite directly.",
"is_bot": false,
"headline": "feat(cli): stats for processing queue and remote outbox",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68a7197374b1612eff35ea4559def914ab41a7a3",
"body": "retrieval_metrics.go defines RunRetrievalAblation which evaluates an explicit\nstream combination (BM25, vector, KG, federation) against a RankedQuery corpus\nand returns per-query and mean Recall@k, MRR, and NDCG. RetrievalRunMetadata\nrecords the semantic-space ID and FTS5 availability so results fro\n[…]\nt.go covers the metric formulae (MRR, NDCG, perfect/zero/\npartial rankings). pipeline_integration_test.go runs a full ablation over a\nreal in-process SQLite store to guard end-to-end metric stability.",
"is_bot": false,
"headline": "feat(eval): retrieval/ranking metrics + ablation harness",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bfadf6b6f149e251460267c70d7c5e1387156ae0",
"body": "client.go adds SaveRemoteIdempotent which sends an Idempotency-Key header so\noutbox workers can safely replay an ambiguous delivery without creating duplicates.\ndoRequestWithHeaders is the shared low-level path; remoteErrorDetails wraps\nRemoteError with code/retryAfter for callers that need richer f\n[…]\nemoteSearchHit (with rank/score/origin metadata) and\nRemoteSearchResponse. types_compat_test.go and client_search_metadata_test.go\nguard the wire shapes against accidental positional-literal breakage.",
"is_bot": false,
"headline": "feat(sync): idempotency keys + search response metadata",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e374231b8ad21dead2191e65718b112ebd9dcc6b",
"body": "…fallback)\n\nfederation.go runs local HybridSearcher and remote SearchRemoteDetailed in\nparallel, deduplicates hits by content fingerprint across project-ID namespaces,\nand fuses ranks with Reciprocal Rank Fusion (k=60). federationCandidateLimit\nbounds per-origin work before fusion.\n\nserver.go routes\n[…]\n-\norigin deduplication, 422 fallback, empty-remote pass-through, and score\nconsistency under k limits. federation_eval_test.go runs an ablation over the\nfused stream vs local-only to guard regression.",
"is_bot": false,
"headline": "feat(mcp): federated search (RRF local+remote, semantic default, 422 …",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "68cdf18a8d45dd2365cfd0b3353f9321284c9392",
"body": "remote_outbox.go wraps the memory.RemoteOutboxDeliverer contract for the MCP\nserver layer. saveRemoteIdempotent resolves the current auto-route target\n(cwd → linked remote/project) immediately before delivery so the outbox payload\nstays CWD-relative; if the remote is not reachable the item stays pen\n[…]\nke cycle.\n\nserver_save_destination_test.go covers the save-destination routing logic:\nlocal-only, remote-only, and dual-destination paths, including the case where\nauto-route is disabled at save time.",
"is_bot": false,
"headline": "feat(mcp): local-first auto-saves via outbox",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78b7e32f4167cb1448f46b1bc448de2329b6d323",
"body": "remote_outbox.go defines RemoteOutboxSpec, DurableSaveOptions, RemoteOutboxItem,\nRemoteOutboxStore, and RemoteOutboxDeliverer interfaces. Outbox rows are committed\natomically in the same SQLite transaction as the revision (via TemporalWriteOptions.\nRemoteOutbox) so no save is ever lost to a crash be\n[…]\ng → processing → delivered / dead_letter under a lease-until TTL.\n\nservice_close_test.go verifies that Service.Close() is idempotent and safe for\nconcurrent callers (double-close, race-free shutdown).",
"is_bot": false,
"headline": "feat(memory): durable remote outbox for local-first saves",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d41a509ff3dd94bee80bbf0ee482433d448f39fc",
"body": "temporal.go defines TemporalMode (supersede/correct/tombstone), TemporalStore,\nTemporalMutationStore, and TemporalQueryOptions. The revision ledger in\nmemory_revisions records every write with (valid_from, valid_to, system_from,\nsystem_to) intervals so point-in-time and as-of queries are supported w\n[…]\nrying soft-deleted rows as closed valid-time\nintervals plus explicit tombstone revisions.\n\ntypes_compat_test.go guards the exported struct shapes relied on by downstream\npositional composite literals.",
"is_bot": false,
"headline": "feat(memory): bitemporal revision ledger + tombstones",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:01:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c8d6347ddcb80147a69de4a1a3fc290050b22c5",
"body": "…alization)\n\nEmbeddingIdentity names a semantic space so two models with the same output\nwidth cannot contaminate each other's vector cache. SemanticSpaceID() is a\nstable SHA-256 over the canonical identity fields.\n\nEmbeddingGeneration records are persisted in sqlite_embedding_generations so\nrestart\n[…]\nings_onnx.go exposes EmbeddingPurpose (document/query), Model(), and\nIdentity() so the ONNX provider satisfies IdentifiableEmbeddingProvider.\nvector_cache.go adds Replace() for atomic full-cache swap.",
"is_bot": false,
"headline": "feat(memory): embedding generation identity (provider/model/dims/norm…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:00:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c55f721e5a98bb312d84aa494ee8ccf469341e9b",
"body": "Introduces a SQLite-backed durable processing-job queue (memory_processing_jobs)\nand a remote outbox table (committed together via migrations 018/019). Workers\nclaim jobs under a lease-until TTL; service_workers.go starts the embedded loop\nlazily on first SaveDurable/SaveTemporal call.\n\nqueue_health\n[…]\n service.go adds SaveDurable, persistSave, and ensureDurableWorkers;\nUpdate/Restore use the temporal mutation path when the queue is present so every\nrevision gets its own embedding-generation record.",
"is_bot": false,
"headline": "feat(memory): durable processing queue + queue health",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-21T01:00:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8cf857a56f640c282f664cb49ee2840696fb81b3",
"body": "…sions\n\nNew Projects menu listing every project anchored has memory for: readable\nname, link status (🔗 linked to a remote when it has a remote_key, ⛓\nlocal-only otherwise), memory count, live-session count per project (joined\nfrom /api/sessions/live), last activity and path. Reuses the existing\n/api/projects endpoint; header summarizes total vs. linked.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(dashboard): Projects tab — linked/local-only, memories, live ses…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T02:12:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "766e958d7d5dd22b42179a88056290686cd86460",
"body": "- Replace the prompt()/alert() flow with a proper modal: search existing open\n tasks to link, or create-and-link a new task by key (empty = auto). Errors\n now surface as toasts, not alerts.\n- Cockpit cards resolve the project id to its readable name (projectLabel)\n instead of showing the raw UUID\n[…]\nask cards show a \"● live\" indicator when a live session is linked\n (live_session_id), surfacing data the API already returned.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(dashboard): cockpit link/create-task modal + correct data wiring",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T02:07:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fa9d0bfe5183dc7257960ba1ea513add67c4e554",
"body": "…n + backlog\n\n- Full i18n to English across the dashboard (nav, sections, toolbars, modals,\n toasts, empty states).\n- Nav reorganized into Knowledge / Operations groups with Tasks prioritized;\n \"Conexões\" renamed to Connectors.\n- Cockpit cards redesigned: tool avatar, provider chip, pulsing state \n[…]\nsk\n modal with a status side panel and journal.\n\nBackend: task status vocabulary gains \"backlog\" (additive; PATCH accepts it).\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(dashboard): v0.15 UI overhaul — English, cockpit redesign, kanba…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T02:02:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "df1984f383db78ba865c27bad92624d05e86cce6",
"body": "…e onclick)\n\nReview follow-up: the cockpit card buttons inlined the session id into onclick\nstrings escaped only for HTML context. Session ids are server UUIDs so it was\nnot exploitable, but the pattern is fragile. Actions now use data-* attributes\n+ a delegated click handler, so the id never crosses into a JS context.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "fix(dashboard): cockpit card actions via event delegation (drop inlin…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:41:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4363bdaf503535ed2767d4327f233e85bfeb7604",
"body": "…ns, task link)\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "docs(changelog): Unreleased — Session Cockpit slice (hub, live sessio…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:33:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf42622d2816f2c946aee41bcdcb28b86dca168a",
"body": "New `anchored hub` command: `hub serve` runs the dashboard (reusing the same\nAPI/assets/guard) plus upkeep workers on a ticker (end stale sessions, prune\nold events) so the cockpit's live view stays honest even with no tool\nconnected. `hub install/uninstall/status` manage a systemd --user\nanchored-h\n[…]\nthe\ndashboard service. serve --stdio is unchanged — the per-tool servers remain\nlightweight producers writing to the shared DB.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(hub): anchored hub daemon — always-on dashboard + session upkeep",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:32:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dc097492c4ce4028c2b1865d2d6f49374c0d03a0",
"body": "New Cockpit tab renders /api/sessions/live as cards (tool + provider/model,\nproject, intent, recent events, state dot) and lets you link a session to a\nboard task, create a task from it (promote), or unlink — calling the cockpit\nAPI. Empty state when nothing is live; a refresh button re-polls.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(dashboard): Cockpit tab — live session cards with task linking",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:29:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c02cef4c7638fa6727086700d7f80ecf71f6a07",
"body": "…te-task\n\nAdds the read + write endpoints behind the Cockpit:\n- GET /api/sessions/live: live sessions with provider/model/intent, derived\n active|idle state, linked task, and recent events.\n- POST/DELETE /api/sessions/{id}/link and POST /api/sessions/{id}/promote-task\n bind or create a task for a \n[…]\n now carry live_session_id when a live session is linked.\nNo new MCP tools; all writes go through the existing dashboard guard.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(dashboard): cockpit API — /api/sessions/live + link/unlink/promo…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:27:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "709d24c2bdf3e65db2f3ddb9592a6d9070659661",
"body": "…tart\n\nsessionstart now calls StartSession (previously nothing did in production, so\nthe sessions table stayed empty), and stamps the session's provider/model from\nthe environment via a pure detectProvider(env): an Anthropic base URL pointing\nat z.ai/bigmodel/glm reads as \"glm\", otherwise ANTHROPIC_* is \"anthropic\" and\nOPENAI_* is \"openai\". Best-effort — a failure never blocks session start.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(hook): register live session + detect provider/model on sessions…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:24:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "02fa9820e54f6d59990779751fcd640696e1fd90",
"body": "Adds the cockpit's manager layer:\n- UpdateSessionMeta / SetSessionIntent record provider/model/intent (StartSession\n stays as-is, so existing callers are unaffected).\n- GetLiveSessions(idle) returns non-ended sessions with derived active|idle\n state, the linked task, and recent events.\n- LinkTask \n[…]\nskKey, PromoteTaskFromSession (create + link), and\n AppendSessionJournal (notable events flow into the linked task's journal).\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(session): live sessions + session<->task link in the manager",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:22:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bc4bf21919557d92346de93909cbefaa03a2a7f9",
"body": "…sion_task_link\n\nAdditive migration 017: adds sessions.provider/model/intent columns (to tell\nClaude Code from Claude Code + GLM, etc.) and a session_task_link table.\nsession_id is the PK so a session maps to one task at a time; task_key\nrepeats so a task accumulates many sessions. Idempotent via the existing\nmigration runner; applies cleanly on a v0.14 DB.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(schema): session cockpit migration — provider/model/intent + ses…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-20T01:19:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "64b14199467373a9461f79db41eb2f709676cfa6",
"body": "Removes a host entry that was never a real target — from the init tool\nflags, install detection, config paths, the dashboard Connections list, and\nthe docs. gatorclaw is now listed as its own distinct host (still the same\ndevclaw-derived YAML mcp.servers[] shape) rather than grouped under devclaw.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "fix(init): drop an invalid host target, list gatorclaw as its own host",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T23:42:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1640092d150091f3ab9a279dd70e75ddbc673967",
"body": "…elemetry & dashboard\n\n- Host table gains OpenClaw, Hermes, devclaw/gatorclaw/supergator and pi, with a\n Format column and a deep-plugin table.\n- Core features note token telemetry, broad host support and the local dashboard.\n- CLI reference adds `anchored stats --tokens` and `anchored dashboard`.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "docs(readme): document v0.13/v0.14 — new hosts, deep plugins, token t…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T23:36:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df53f9034e36a61957cdedfb0830ac5b0115765a",
"body": "Addresses the correctness findings from the high-effort review of v0.14:\n\n- .bak now pins the pre-init original across a double-write (MCP registration\n then plugin edit) via backupOnce, instead of the second write clobbering it.\n- openclaw.json / pi settings.json edits decode with json.Number (Use\n[…]\nser's project dir.\n\nYAML edits still normalize comments/key order (documented; .bak is the recovery\npath). Tests lock each fix.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "fix(init,dashboard): harden config integrity from v0.14 code review",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T22:12:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0978e00b888cf181a21757cf963a9ac39dbac1cc",
"body": "…onnections\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "chore(release): v0.14.0 — broader host support + dashboard tokens & c…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T22:00:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b99e18d19dbed62c5afa641a3ebb08654e6c716",
"body": "Targeted UX polish (not a redesign): wide tables now scroll inside their own\npanel instead of pushing the page sideways, the body never scrolls\nhorizontally, card grids collapse to one column under 560px, and the muted\nempty-text color is unified. Existing screens unchanged.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "polish(dashboard): contain wide content and tighten small-screen layout",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T21:59:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7b27bc99d0aed227ef53649bd0a46ec90e13bde",
"body": "On top of MCP registration, `anchored init --tool <host>` now installs a deep\nmemory plugin for hosts that support one, bridging the agent lifecycle to the\nlocal anchored binary (recall via `anchored search`, capture via\n`anchored save`) — no REST daemon, unlike agentmemory:\n\n- openclaw — plugin fol\n[…]\ngs/ mirrors and configs/README-v14.md document them. All\ninstalls preserve foreign config, back up to .bak, and are idempotent.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(init): deep host plugins for openclaw, hermes and pi",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T21:58:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9660e4d7b39704949fb84575e92baf79b74e465c",
"body": "Surface two things the dashboard was missing:\n- Overview shows a \"Tokens economizados (7d)\" card from the v0.13 recall_logs\n telemetry (GET /api/tokens), reusing the stats --tokens aggregation. Shown\n only once there's data so a fresh install doesn't display a misleading 0%.\n- A new Conexões tab (\n[…]\nt\n `anchored init --tool <name>` hint for the ones not wired up yet.\n\nBoth endpoints are read-only. Handlers covered by tests.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(dashboard): tokens-saved card + connections tab",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T21:54:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "26d5208e8cf6e09c7908726386884dcef1cc172a",
"body": "…mily hosts\n\nExtends `anchored init --tool` to five more hosts, mirroring how agentmemory\nconnects to them:\n- openclaw — ~/.openclaw/openclaw.json, standard mcpServers map (reuses the\n existing JSON path).\n- hermes — ~/.hermes/config.yaml, mcp_servers YAML map (new registerMCPYAMLMap).\n- devclaw / \n[…]\nurvive, back up to .bak, and are idempotent with bare-command repair.\n`--tool all` includes each host only when it's installed.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(init): register anchored MCP in openclaw, hermes and the claw-fa…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T21:48:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ceae194c79d015fb9df11f30664fcea21eb30a40",
"body": "…, token budget & telemetry)\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "chore(release): v0.13.0 — context quality (identity, dedup, diversify…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T20:03:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "186e53d133f1d784f9c8728bfed9487cda10eda5",
"body": "Measure the value anchored delivers: every context injection now records\ntokens injected vs. the static-context baseline (CLAUDE.md/AGENTS.md +\nskills) it replaces, in a new recall_logs table. The baseline is computed\nfrom disk at most once per day per project (project_baseline cache). Both\nthe Sess\n[…]\nfort, never blocking\nthe injection. `anchored stats --tokens` reports injected vs. baseline and\nsavings % over the last 7 days.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(telemetry): recall_logs + anchored stats --tokens",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T20:01:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a7e816d0ba05ac76e5a34e713ad3643a4e2f7df8",
"body": "The SessionStart rich block was budgeted in bytes, which under-counts\nmulti-byte content and doesn't match what fills a model's context window.\nAssemble now measures cost in approximate tokens via the shared\nApproxTokens helper (~4 chars/token). SessionStart resolves a token budget\n(default 2000, ya\n[…]\n sessionstart_budget_tokens); a legacy byte config is\nconverted ÷4 so existing setups — including the 0 opt-out — keep working.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "refactor(contextbudget): budget in tokens instead of bytes",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T19:57:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "912a86bfc73be14954739af319bc420b99f9613a",
"body": "Claude Code can fire the same PostToolUse repeatedly during a tight\nedit/read loop, filling the session timeline with duplicates that add no\nsignal. Before the event-only insert, skip when an identical tool_call\n(same session + tool + summary) was recorded in the last 5 minutes. Uses\nonly existing columns (no migration) and is fail-open — any query error\nfalls through to the insert so a real event is never dropped.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "fix(hook): dedup near-identical PostToolUse events within 5min",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T19:53:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "633e6076afe4fbaa3853f4ead3368686dd7102b3",
"body": "A single prolix session could dominate the top-k, drowning out other\nsources. After fusion+sort, cap results to DiversifyPerOrigin (default 3)\nper origin — the source session, or the creation day when no session id is\nknown — keeping the highest-scoring result from each. Set to 0 to disable.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(search): diversify hybrid results per origin",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T19:50:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5fd581cc02152557b8e9643fd17840a2eb7f9df1",
"body": "… template\n\nanchored_context shipped an empty <identity> block whenever\n~/.anchored/identity.md was still the install template — the header-only\nskeleton passed the non-empty check, and stored preferences never fed the\nidentity layer. Now:\n\n- IdentityHasContent() detects a template-only body (header\n[…]\nmd is an empty template\" instead of \"present\".\n\nA curated identity.md keeps full precedence — no synthesis when it has content.\n\nClaude-Session: https://claude.ai/code/session_01DeJ8jN6EjEwERBQw89JHFT",
"is_bot": false,
"headline": "feat(mcp): synthesize identity from preferences when identity.md is a…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-19T19:48:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "51e86d7ed93019f68cbe64f3abee67fa2f3bc18f",
"body": "…server fix\n\nCross-project task threads now have a dashboard Kanban, an anchored_task MCP\ntool, and a shared backend; the dashboard got a dark-first sidebar redesign;\nand orphaned stdio servers now terminate on client exit instead of leaking the\nONNX model in RAM. Includes merged PR #4 (centralized ONNX detection).",
"is_bot": false,
"headline": "chore(release): v0.12.0 — task management (dashboard + MCP) & orphan-…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T16:48:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5726cb5881f9dddf4f160049d2891a92c89c62bb",
"body": "Addresses review findings on the anchored_task tool:\n\n- status on a non-existent key no longer spawns a phantom closed task: the\n terminal-status close-path would create-then-close via UpsertTaskThread.\n Guard existence first (M1).\n- start/note on a done/cancelled thread no longer falsely report s\n[…]\n reopening (M2).\n- firstLine truncates on a rune boundary so multi-byte UTF-8 (PT-BR notes) is\n never sliced mid-codepoint (M4).\n\nTests cover the phantom-task guard and the terminal-freeze messaging.",
"is_bot": false,
"headline": "fix(mcp): honest anchored_task responses on terminal threads + guards",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T16:45:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "767638bbedb8e0b65b26d9bb7cc915ec58c640ec",
"body": "…ng sync-bin\n\n- bootstrap: count pending embeddings via svc.PendingEmbeddings() instead of a\n raw SQL query, and surface the (previously ignored) error.\n- Makefile sync-bin: use `sudo -n` so the target never blocks on a password\n prompt, and print an actionable hint when a root-owned target can't be\n written.",
"is_bot": false,
"headline": "refactor(cmd): PR #4 follow-ups — reuse PendingEmbeddings, non-blocki…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T16:32:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "794a5d9158b2a520e9dc8eb52e12d55b980925df",
"body": "Adds a multiplexed anchored_task tool so agents can manage task threads\nduring a session, not just humans via the dashboard/CLI:\n\n- start — create/resume a task, linking the current session_id + project\n (resolved from cwd); resuming reactivates a paused thread.\n- note — append a journal note, lin\n[…]\nintent — never inferred, never on\nconversation end. A task is cross-session by design, so anchored_session_end\nnever closes one. Same-key upsert means agent, dashboard, and CLI converge\non one thread.",
"is_bot": false,
"headline": "feat(mcp): anchored_task tool for cross-session task threads",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T15:13:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e105e6865e27bfdefed31eb429ccd8edd96fd7f5",
"body": "Surfaces the existing cross-project task_threads backend (migration 016)\nin the dashboard, and refreshes the UI.\n\nBackend (pkg/session):\n- ListTaskThreads(status, limit) lists every thread (dashboard board),\n not just the active few.\n- TaskThreadDelta.KeepStatus decouples session/project linking fr\n[…]\n mono for data; new Tasks tab with a 4-column Kanban\n(active/paused/done/cancelled), native drag-and-drop status changes, and a\ncreate/detail modal with a journal timeline. Vanilla JS, still embedded.",
"is_bot": false,
"headline": "feat(dashboard): task management Kanban + visual redesign",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T15:13:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0ff33a54f3665920756d685eb08f369763cdf5cd",
"body": "The MCP stdio server only stopped on stdin EOF, so when a client (Claude\nCode, Cursor, ...) exited abnormally — crash, SIGKILL, or a lingering\nparent still holding the pipe — EOF never arrived and the process leaked.\nEach orphan pins the ~450MB ONNX model resident, so a handful of closed\nIDE windows\n[…]\nitative fallback.\n- forceExitAfterShutdown is a last-resort os.Exit backstop if graceful\n teardown stalls past the grace window.\n\nPromotes golang.org/x/sys to a direct dependency (used by PDEATHSIG).",
"is_bot": false,
"headline": "fix(serve): terminate orphaned stdio servers on client exit",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T15:13:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f1fa671eddee9103ecc33fc67df327bcee5e3d9d",
"body": "fix(cmd): centralize ONNX model detection in doctor and init",
"is_bot": false,
"headline": "Merge PR #4: centralize ONNX model detection in doctor and init",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-15T15:11:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "135ed7f134dd2bce19cfb63c854f2bae17cd50d4",
"body": null,
"is_bot": false,
"headline": "fix(cmd): centralize ONNX model detection in doctor and init",
"author_name": "Rafael Passarela",
"author_login": "rafaelpassarela",
"committed_at": "2026-07-13T18:53:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82f1e9fb2383fe02dab52dd8e905d460df693802",
"body": "Real Cursor support (hooks + activation rule + init), a fix for the\ntokenizer stall that had left the store at ~6% embedding coverage, the\nbackfill maintenance step, absolute-path MCP registration, and new\ndoctor checks.\n\nClaude-Session: https://claude.ai/code/session_01HVxQjChKS51zGedLKqNVmQ",
"is_bot": false,
"headline": "chore(release): v0.11.0 — Cursor activation + embedding backfill fix",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-06T11:02:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4d67585f6ebdeb6879c07885e9c4868a2004511",
"body": "…g log\n\nNew checks so a broken install is visible instead of silently passing:\nCursor hooks.json/rule presence and absolute-path commands (skipped\nwhen ~/.cursor is absent), embedding coverage (warns below 80% with an\n`anchored backfill` remedy), maintenance timer status, debug-log\nstaleness, and config-vs-disk model label. Also fixes the doubled `v`\nin the version banner (the version string already carries its prefix).\n\nClaude-Session: https://claude.ai/code/session_01HVxQjChKS51zGedLKqNVmQ",
"is_bot": false,
"headline": "feat(cmd): doctor checks for Cursor activation, coverage, timer, debu…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-06T11:02:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "881487fa31afe9ab4e8fa8c5f841639c4d0a31a9",
"body": "Cursor registration previously wrote only mcp.json, and the shipped\nhooks template used Claude Code's event names. Cursor never actually\nactivated.\n\n- Payload adapter (pkg/hookroute/cursor.go): detects Cursor's envelope\n (camelCase hook_event_name + workspace_roots/conversation_id) and\n emits its \n[…]\nntries in place across all tools.\n- configs/cursor/probe-hooks.json: a logging-only template to capture\n real Cursor payloads.\n\nClaude-Session: https://claude.ai/code/session_01HVxQjChKS51zGedLKqNVmQ",
"is_bot": false,
"headline": "feat(cursor): real Cursor activation via hooks, rule, and init",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-06T11:02:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "764704ffe7e611f869e8f7d927585acc91ee320b",
"body": "`init` wrote a bare `anchored` command into MCP configs, which only\nresolves via PATH and breaks when a tool launches its MCP server\noutside a login shell (a GUI app launch). Resolve the running\nexecutable (symlink-resolved), falling back to ~/.anchored/bin/anchored\nthen bare `anchored`, and write t\n[…]\nn install, the\nplugin's hooks.json commands are rewritten the same way (non-fatal:\na parse/write error just logs and proceeds).\n\nClaude-Session: https://claude.ai/code/session_01HVxQjChKS51zGedLKqNVmQ",
"is_bot": false,
"headline": "fix(cmd): resolve absolute binary path for MCP and plugin hook commands",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-06T11:02:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2dfc3e2b5ba2f4e69eebbc5b6a8a5ef16edd2d6",
"body": "Add `anchored backfill --max N` to bound embeddings per run (0 =\nunlimited) so a large backlog drains in slices instead of one\nmulti-hour pass, and insert `backfill --max 2000` as a step of\n`maintenance run` (import → backfill → dream → curation) with a\n`--skip-backfill` flag, so the daily timer wor\n[…]\ntstrap actually downloads (paraphrase-multilingual-MiniLM-L12-v2);\nthe loader keys off model_dir, so this was label-only drift.\n\nClaude-Session: https://claude.ai/code/session_01HVxQjChKS51zGedLKqNVmQ",
"is_bot": false,
"headline": "feat(cmd): backfill --max flag + maintenance backfill step",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-06T11:01:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f8e782ef2f1cb54337f181c43519a661f094b49c",
"body": "A single very long unbroken token (a minified or base64 blob in an\nimported memory) drove FastTokenizer's Unigram/word encoding into\nO(n²) work and hung the ONNX embedder indefinitely at full CPU. This\nstalled `anchored backfill` and left the historical store at ~6%\nembedding coverage.\n\nCap the inpu\n[…]\nx_input_chars_per_word guard. The model window is ~128\ntokens, so the truncated tail could never have reached the model anyway.\n\nClaude-Session: https://claude.ai/code/session_01HVxQjChKS51zGedLKqNVmQ",
"is_bot": false,
"headline": "fix(memory): bound tokenizer input to prevent O(n²) stall on giant words",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-07-06T11:01:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "550424cb7fbdee841fe6b92841ed6470a4d8759d",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.10.0 — dashboard + maintenance + security fix",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-30T12:30:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a2b15a800c262965d98a58a953fd64df4f108e0",
"body": "PR #2 (dashboard) and PR #3 (maintenance) each declared an identical runCmd\nsystemd helper; merged together they collided (\"runCmd redeclared\") and broke\nthe build. Rather than have one file implicitly depend on the other's helper,\nmove runCmd to a dedicated systemd.go that both installers share.",
"is_bot": false,
"headline": "fix(cmd): extract shared systemd runCmd into systemd.go",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-30T12:30:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "06b5c65d4eb7e8d1aa159b6608322192ac6eb40a",
"body": "# Conflicts:\n#\tcmd/anchored/main.go",
"is_bot": false,
"headline": "Merge PR #3: security fix + mcp unit tests + maintenance timer",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-30T12:15:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00c2f92f0e697cc6714dcb6b44e3e4c6decde479",
"body": null,
"is_bot": false,
"headline": "Merge PR #2: local web dashboard for the anchored store",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-30T12:14:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19d5963610540e50bc275b274535749c011f39dd",
"body": "anchored serve is STDIO on-demand: its background workers (curation, indexer)\nonly run while an agent is connected, and dream/import have no background path.\n`anchored maintenance` adds a persistent upkeep loop independent of any MCP\nclient connection.\n\nSubcommands:\n- maintenance run chains imp\n[…]\nnables lingering + the timer\n- maintenance uninstall / status\n\nFlags for run: --config, --aggressiveness, --max-deletions,\n--skip-import/-dream/-curation. Linux-only install; other platforms use cron.",
"is_bot": false,
"headline": "feat(cmd): anchored maintenance — systemd timer for periodic upkeep",
"author_name": "Aron Peyroteo",
"author_login": "aronpc",
"committed_at": "2026-06-29T00:08:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5bfabf7eaf53f0bde41a1d4645e8aad62db91a2d",
"body": "…Writer\n\nAdds unit tests for previously-uncovered helpers:\n- SetDebugLogger: nil-safe setter\n- headTail: UTF-8-aware truncation with omission marker\n- MarshalResponse: marshal-failure fallback to InternalError\n- searchHitWriter: hit budget-omit path + <omitted> note emission\n\nIntegration coverage for tool handlers already exists in server_ctx_test.go\n(newTestServer/callToolJSON), so these fill the pure-helper gaps.",
"is_bot": false,
"headline": "test(mcp): cover SetDebugLogger, headTail, MarshalResponse, searchHit…",
"author_name": "Aron Peyroteo",
"author_login": "aronpc",
"committed_at": "2026-06-29T00:06:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a57c1de639d89a858f6ce773ffd78e86488db8f",
"body": "newID (project/detector.go) and newUUID (memory/sqlite_store.go) called\nrand.Read and discarded the error, so a PRNG failure would silently yield\nall-zero, non-unique ids. Panic on failure instead — crypto/rand failing\nindicates a seriously broken system where aborting is correct.",
"is_bot": false,
"headline": "fix(security): check crypto/rand errors in id generators",
"author_name": "Aron Peyroteo",
"author_login": "aronpc",
"committed_at": "2026-06-29T00:03:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a8d7dc3534d6bde23c759882683465d5799f449",
"body": "Explain that calling anchored_context/search clears the gate for the\nsession and that the gate auto-relents after a few denies, replacing the\ninaccurate \"runs once per session\" wording.",
"is_bot": false,
"headline": "fix(hooks): clarify context-gate denial message",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T20:37:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e540a37120ddca2d475d0b206fdf05648f0dec0",
"body": "created_at lives in several text shapes in the corpus; a bare lexical\nORDER BY sorted rows from different formats out of chronological order.\nOrder on COALESCE(datetime(created_at), created_at) so ISO and SQLite-text\nrows compare chronologically, with a lexical fallback for rows datetime()\ncan't parse. No data mutation, no impact on remote sync.",
"is_bot": false,
"headline": "fix(dashboard): chronological ORDER BY via datetime(created_at)",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T18:41:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5f30007eb668b3260a0dcd09ca22af93fe0998b",
"body": "Previously --token protected only the write path (soft-delete/restore),\nso pairing it with --allow-remote still left the entire corpus readable by\nanyone who could reach the host. Now, when --token is set, every request —\nreads included — requires the bearer header or the anchored_dash cookie\n(minte\n[…]\n ?token= on first load, so the browser session still works\nunchanged). Locally with no token it is a no-op; same-origin writes and\ncurl are unaffected. TestDashboardGuard expanded to cover both modes.",
"is_bot": false,
"headline": "fix(dashboard): --token now gates reads too (full corpus privacy)",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T18:38:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "63aa4063e0b482bf412fd753c5aeb493cf04da4a",
"body": "- TestDashboardAPI_Restore: soft-delete -> Get hides it -> restore -> Get\n returns it, plus the re-restore 404 contract.\n- TestDashboardGuard: non-loopback Host blocked, cross-origin write blocked,\n empty Host allowed, write requires the bearer token.\n- vendor/LICENSES.md: attribution for Chart.js, vis-network, marked, DOMPurify\n (versions + licenses + copyright) to satisfy OSS redistribution notices.",
"is_bot": false,
"headline": "test(dashboard): cover restore path + security guard; vendor LICENSES",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T16:58:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2bafd2b6baaca40c226aa6bab3eb2eb0757a45b8",
"body": "Delete and restore now go through Service.SoftForget / Service.Restore\ninstead of raw UPDATE, so the in-memory cache is invalidated and observers\n(sync/KG/events) fire — matching 'anchored forget' semantics instead of\nsilently bypassing them.\n\nDate-range filtering compares on substr(created_at,1,10)\n[…]\nre lexical compare\nmade 'until' drop rows of a different format.\n\nAdds rows.Err() checks after every data-serve loop, and labels db_bytes as\nthe allocated size (page_count x page_size) it actually is.",
"is_bot": false,
"headline": "fix(dashboard): service-backed writes, reliable date filter, rows.Err",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T16:58:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5ce7dd2f518b36f49c0dcd2cc9d4c47f3de04fc",
"body": "… CSP, token)\n\nThe dashboard has no auth layer, so default to loopback-only and add\ndefence-in-depth for the write path:\n- refuse to bind a non-loopback --addr unless --allow-remote is passed\n- guard middleware rejects non-loopback Host headers (DNS-rebinding defence)\n- state-changing methods are bl\n[…]\n headers\nAlso: noDirListing suppresses the FileServer directory index, install honors\n--addr in the generated unit, and 'dashboard status' propagates systemctl's\nexit code instead of always exiting 0.",
"is_bot": false,
"headline": "fix(dashboard): harden local server (loopback bind, Host guard, CSRF,…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T16:58:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c04e85fd85e81dd32adc155f1cc2cb2620b0ba6",
"body": "Restore is the inverse of SoftDelete: clears deleted_at for an already-\nsoft-deleted row and evicts the cache. Service.Restore mirrors SoftForget —\nit resolves the project id directly (Get excludes deleted rows) and fires\nOnMemoryRestored so sync/KG observers stay accurate when any caller restores.\n- store.Store: Restore(ctx, id)\n- SQLiteStore.Restore: UPDATE deleted_at=NULL WHERE deleted_at IS NOT NULL\n- MemoryObserver: OnMemoryRestored\n- mock store + observer implement the new methods",
"is_bot": false,
"headline": "fix(memory): add Restore + OnMemoryRestored to store/service/observer",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-28T16:58:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d85d7187daba8d42e6ecd23136e038fa45b3f2ca",
"body": "`anchored dashboard` starts a localhost HTTP server (default :17777) that\nvisualizes the SQLite store in real time. Read-mostly; the only write path\nis soft-deleting/restoring a single memory.\n\nBackend (cmd/anchored/dashboard{,_api}.go):\n - net/http server + //go:embed SPA; cache-control middleware\n[…]\nsubcommand.\n\nTested: go build/vet ok, TestDashboardAPI covers stats/list/search/get/\ndelete/kg/projects/sessions/health/timeline; node --check on app.js;\nvalidated live against the ~11k-memory corpus.",
"is_bot": false,
"headline": "feat(dashboard): local web dashboard for the anchored store",
"author_name": "Aron Peyroteo",
"author_login": "aronpc",
"committed_at": "2026-06-28T14:57:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d830e49ad7e3da1d53ddc887566765c3b60be68f",
"body": "Embedded (//go:embed) so the dashboard is fully offline — no CDN, no\nnetwork dependency for rendering. Vendored minified bundles, pinned:\n - chart.umd.min.js Chart.js v4.4.7 (doughnut/bar/line charts)\n - vis-network.min.js vis-network v9.1.9 (knowledge graph)\n - marked.min.js marked v12.0.2 (memory markdown rendering)\n - purify.min.js DOMPurify v3.1.6 (sanitize rendered html)",
"is_bot": false,
"headline": "chore(dashboard): vendor Chart.js, vis-network, marked, DOMPurify",
"author_name": "Aron Peyroteo",
"author_login": "aronpc",
"committed_at": "2026-06-28T14:57:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43849c43b403f639cf4eb65cf2601aebb6cdeb77",
"body": null,
"is_bot": false,
"headline": "chore: changelog + bump to v0.9.1",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-21T11:33:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e84d5ab5a5a8dc6db5da2dbf8a2d8f8ee12c8419",
"body": "Mirrors context-mode's fix for the 'agent stalls on a deferred tool' problem\n(their issue #724): the bootstrap that loads the anchored_* schemas via\nToolSearch lived only in AnchoredSubagentBlock. Add it to AnchoredRoutingBlock\n(SessionStart) and a compact line to AnchoredMCPInstructions so the main\n[…]\nall\nsite (gate, sandbox redirects, secret-block, miss-nudge) systemically, not just\nthe per-deny hints. AnchoredMCPInstructions stays under the 2048-char budget\n(1968B), enforced by the existing test.",
"is_bot": false,
"headline": "fix(mcp): teach the deferred-tool bootstrap in the main routing block",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-21T11:30:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d8eaefc1a978e3fee61eab07e786b992ab583e8d",
"body": "…ools\n\nThe optimizer redirects (curl/wget, WebFetch, inline HTTP, build tools) point\nthe agent at anchored_execute / anchored_fetch_and_index, but when those tools\nare deferred in the harness a direct call fails as not-found and the agent\nabandons anchored entirely — falling back to nothing since the original\ncommand is blocked. Append a shared hint telling it to ToolSearch-load the\ntools first and not to drop the task or stop using anchored on a not-found.",
"is_bot": false,
"headline": "fix(hooks): sandbox redirects tell the agent to ToolSearch deferred t…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-21T11:26:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e3ba0bc07a6a86f9752ccbefa0cfcf84841dcfa",
"body": null,
"is_bot": false,
"headline": "chore: changelog + bump to v0.9.0",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-21T00:03:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "79657d0a369541018d41e7134249c3fd3b98a23c",
"body": "… tools\n\nWhen the anchored_* tools are deferred in the agent's harness, a direct\nanchored_context call fails as not-found, so the agent retries the blocked\nwork tool and eats repeated gate denies until the relent budget. The deny\nreason now instructs the agent to first ToolSearch-load anchored_context/\nanchored_search, then call anchored_context — collapsing the friction to a\nsingle deny in deferred-tool sessions.",
"is_bot": false,
"headline": "fix(hooks): gate deny tells the agent to ToolSearch deferred anchored…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:56:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f77a1ddf72c5fedf1f6006f1bbe220182ebc44fb",
"body": "The v0.8.9 release bumped VERSION + CHANGELOG but left .claude-plugin/\nplugin.json and marketplace.json at 0.8.8. Because the binary reads its\nversion from VERSION (v0.8.9) and drift detection reads the manifest\n(0.8.8), every SessionStart saw the plugin as perpetually behind and\nre-ran the mirror+cache sync each time. Aligning the manifests stops the\nspurious per-session re-sync.",
"is_bot": false,
"headline": "fix(plugin): bump manifest versions to 0.8.9 to match VERSION",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:52:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e824a7f197db09fe57c6e811164b4ede182ec84f",
"body": "The recall push was BM25-only and missed semantic matches. Raw-prompt\nembedding is infeasible in-hook (separate process, ONNX cold-start + mutex),\nso use the top BM25 hit's precomputed embedding as a seed and pull its nearest\nneighbours from the vector cache (memory-to-memory expansion) with no embe\n[…]\n mode on a\nnon-saturated hit set. When keyword recall finds nothing for a threshold-passing\nprompt, inject a directed nudge to call anchored_search (serve-side hybrid)\ninstead of the generic reminder.",
"is_bot": false,
"headline": "feat(hooks): vector recall + semantic-miss nudge in UserPromptSubmit",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:48:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "89069ae363e01b6145e7cb7380bdba5b24fc2f20",
"body": "Claude Code truncates the MCP instructions field to 2048 chars, cutting the\n3897-char routing block mid-<when_to_save> and dropping the save rules and\n<forbidden>. Feed the handshake a separate AnchoredMCPInstructions constant\n(~1.6KB) that keeps every load-bearing directive; the rich block still ships\nverbatim via the (untruncated) SessionStart hook. A test pins the byte budget\nand the presence of the critical directives.",
"is_bot": false,
"headline": "fix(mcp): compact server instructions to survive 2048-char truncation",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:48:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "33b4e63ce1c0befcf50342315f1fcb963f7472cc",
"body": "The gate was satisfied only via PreToolUse; a stale plugin matcher that does\nnot fire PreToolUse for mcp__ tools would let it deny work three times and\nrelent without ever crediting the memory call. PostToolUse now also marks the\ngate satisfied when it sees a satisfying anchored tool. No-op unless the gate\nis enforced and the tool qualifies.",
"is_bot": false,
"headline": "feat(hooks): credit the context gate from PostToolUse as a fallback",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:48:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fea6db2baf331a50bc3e6c7c4e875c7f50ebeb33",
"body": "A hand-edited or dirty marketplace mirror makes git pull --ff-only fail and\npermanently pins the user to a stale plugin (the documented 'local changes\nwould be overwritten by merge' wedge). Since the mirror is a managed read-only\ncache, recover by hard-resetting it to its upstream (fetch + reset --hard\n@{u}|origin/HEAD|origin/main + clean -fd) and retry once, within the existing\ntimeout. This lets a binary update heal the plugin install instead of wedging.",
"is_bot": false,
"headline": "fix(plugin): self-heal a stale marketplace mirror on failed fast-forward",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:48:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4f427a3122b2d013938f8ce935b08b8c2b02bf0",
"body": "…h defaults\n\nContextGateMode() now defaults to enforce (only an explicit context_gate:\ndisabled opts out; the legacy off the old default serialized into existing\nconfigs also resolves to enforce), so a version bump alone arms the gate\nwithout a config edit. AutoRecallMode() defaults to full. Defaults() turns on\nMMR + temporal decay so fresh installs get ranked, deduplicated,\nfreshness-aware results out of the box.",
"is_bot": false,
"headline": "feat(plugin): force context gate on by default; richer recall + searc…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-20T23:48:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c44fa5c5f2bcb453155bfab662dba43d6444638f",
"body": null,
"is_bot": false,
"headline": "chore: changelog + bump to v0.8.9",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-15T14:13:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa7cb909e855bf6d0818a8b713fd9674858e3f28",
"body": "…CP clients\n\nThe serve logger used slog.Default() (INFO to stderr). STDIO MCP clients such\nas Cursor render every stderr line as an [error], so routine operational INFO\n(vector cache loaded, ONNX init, recurring eviction cycles) flooded the\nclient's error pane with false alarms. Default to WARN; override with\nANCHORED_LOG_LEVEL=debug|info|warn|error when diagnosing the server.",
"is_bot": false,
"headline": "fix(serve): default log level to WARN to stop false [error] spam in M…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-15T14:12:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4685cc244f08b1959edd5626823417d08081b8dc",
"body": "mcp__ -> mcp__.* and split the PostToolUse matcher so Write|Edit|Bash and\nmcp__anchored__.* are matched independently.",
"is_bot": false,
"headline": "fix(hooks): correct MCP matchers",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-15T14:12:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fbbaef843a7ea216655541b047ccd671ee875ad9",
"body": "Deterministic enforcement that the agent consult anchored memory before its\nfirst substantive tool call in a session. Bounded and fail-open: relents\nafter ctxGateMaxDenies and never hard-blocks the user; missing session id or\nunwritable state dir passes through. Armed via plugin.context_gate=enforce.",
"is_bot": false,
"headline": "feat(plugin): optional PreToolUse context gate (off by default)",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-15T14:12:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e7b6dbe70ed1d2d8c28dcff02019f8f06e04284",
"body": "Observable one-shot that embeds every memory still missing a vector, with\n--batch and --pause (throttled, ctx-cancellable BackfillEmbeddingsThrottled).\nIdempotent and resumable; does not require the MCP server to be running.",
"is_bot": false,
"headline": "feat(cmd): add 'anchored backfill' standalone embeddings backfill",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-15T14:12:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "064f15db03430474a86208f05263c47dcab2b57f",
"body": "…d cwd\n\nCap anchored_search/list/execute output (per-hit rune cap + whole-response\nbyte budget; head/tail previews for large execution output and stderr) so an\noversized result is never persisted to a file by the host. Add full=true to\nanchored_search to read one memory in full. Resolve an omitted cwd to the\nserver working dir so the auto remote merge finds the linked project instead\nof silently degrading to local-only.",
"is_bot": false,
"headline": "feat(mcp): bound tool responses, add search full mode, resolve omitte…",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-15T14:12:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7b5240092e42821bc7918895191f01284d24184",
"body": null,
"is_bot": false,
"headline": "chore: bump version to v0.8.8",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T23:16:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0168e69db791a8fa4ceaed05e7306819fdd3aa8e",
"body": "anchored_context discarded errors from RecordActivity, recent-memory\nList and KG ListByProject; anchored_execute ignored IndexRaw failures;\na failed remote merge in anchored_search only logged at debug, silently\ndegrading team search to local-only. All are now logged (warn in the\nserver via s.logger, debug in the fail-safe hook) with behavior\nunchanged. Also drop dead _ = p.CWD placeholders in forget/update.",
"is_bot": false,
"headline": "fix(mcp): surface swallowed errors in tools and sessionstart hook",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T23:16:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebcdc507b32b44c61766bbc481ca1ecd1ec1ef77",
"body": "v0.8.6 emitted hook output Claude Code's schema rejects, spamming\n'PreToolUse:Read hook error — (root): Invalid input' on nearly every tool call.\n\n- PreToolUse has no additionalContext channel (only permissionDecision/\n permissionDecisionReason/updatedInput). The soft memory-first nudges on\n Read/\n[…]\ncision\":\"allow\"}, but the schema types decision as\n enum(approve,block); \"allow\" is invalid. Emit {} instead (valid no-op).\n- Drop now-unused pkg/hookroute/throttle.go and guidance.go; rewrite tests.",
"is_bot": false,
"headline": "fix(hooks): emit only PreToolUse-valid output (stop Invalid-input spam)",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T15:52:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "be90d4dfd3f6cda33bac85cc1bcfba4705db4503",
"body": null,
"is_bot": false,
"headline": "chore: changelog + bump to v0.8.6",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T12:33:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a463e3a604767d72f005bee013a5f49f61e25e0e",
"body": "- SKILL.md: mandatory memory-first rule, decision tree, anti-patterns.\n- README: note that anchored now ships its own routing and context-mode should\n be uninstalled to avoid two competing routing blocks.",
"is_bot": false,
"headline": "docs: memory-first skill rule + context-mode coexistence note",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T12:33:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5fd13b5cb4577932bcb952fa82ad1edbc7350b2",
"body": "The sandbox tools (anchored_execute*, _fetch_and_index, _ctx_search) and the\nPreToolUse redirects that target them only work with the optimizer on; shipping\nit off made those tools hard-error and trained the model to stop using them.\nThe sandbox is a subprocess with a timeout and output cap, so on-by-default is\nlow-risk.",
"is_bot": false,
"headline": "feat(config): enable context_optimizer by default",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T12:33:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cdfef0a083e822f196713b9544bf5696d19beb25",
"body": "Steer native exploration tools toward anchored's memory + sandbox tools at the\npoint of action, instead of leaving them silently bypassed.\n\n- pkg/hookroute: RoutePreToolUse + Decision + FormatDecision (Claude Code wire\n shape), guidance throttle (O_EXCL markers, once-per-session + periodic),\n RE2-\n[…]\ns.json: PreToolUse matchers expanded to Read|Grep|Glob|Bash|WebFetch|\n Agent|Task and mcp__.\n- pkg/mcp/routing.go: AnchoredSubagentBlock with ToolSearch bootstrap for the\n deferred anchored_* tools.",
"is_bot": false,
"headline": "feat(hooks): port context-mode PreToolUse routing into anchored",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T12:33:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c26557061f2480073d9e0fee3c3ea7871070d6b",
"body": null,
"is_bot": false,
"headline": "chore: release v0.8.5 (personal kanban sync)",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T00:35:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52858c03583681b997903baa596ef8ce55caddee",
"body": "Every task mutation pushes the thread to the resolved remote as a card\nfor the dashboard's My tasks board (PUT /v1/me/task-threads, account\nderived from the API key). Best-effort: no remote, no key or a network\nfailure never fails the local command — the next mutation pushes the\nconverged state. PRI\n[…]\nd routing resolves to a team server\nthe card syncs as metadata only (key/status/projects) and the command\nsays so on stderr. Projects travel as NAMES — local project IDs are\nmeaningless to the server.",
"is_bot": false,
"headline": "feat(task): mirror task threads to the personal kanban",
"author_name": "Jhol Hewres",
"author_login": "jholhewres",
"committed_at": "2026-06-11T00:35:20Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 71,
"commits_last_year": 286,
"latest_release_at": "2026-07-24T12:59:37Z",
"latest_release_tag": "v0.16.0",
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 12,
"days_since_latest_release": 3,
"mean_days_between_releases": 3.7
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/jholhewres/anchored",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/jholhewres/anchored",
"is_deprecated": false,
"latest_version": "v0.16.0",
"repository_url": "https://github.com/jholhewres/anchored",
"versions_count": 72,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T12:58:10Z",
"latest_version_yanked": null,
"days_since_latest_publish": 3
}
]
},
"popularity": {
"forks": 3,
"stars": 10,
"watchers": 1,
"fork_history": {
"days": [
{
"date": "2026-05-13",
"count": 1
},
{
"date": "2026-05-23",
"count": 1
},
{
"date": "2026-07-13",
"count": 1
}
],
"complete": true,
"collected": 3,
"total_forks": 3
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 72419,
"source_files_sampled": 293,
"oversized_source_files": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 572
},
"dependencies": {
"manifests": [
"go.mod"
],
"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": [
"go"
],
"dependencies": [
{
"name": "github.com/JohannesKaufmann/html-to-markdown/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.5.0"
},
{
"name": "github.com/mattn/go-sqlite3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.14.28"
},
{
"name": "github.com/yalue/onnxruntime_go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.29.0"
},
{
"name": "github.com/yuin/goldmark",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.8.2"
},
{
"name": "golang.org/x/sys",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.42.0"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
},
{
"name": "modernc.org/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.50.1"
}
],
"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": 4,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "jholhewres",
"commits": 279,
"avatar_url": "https://avatars.githubusercontent.com/u/9128062?v=4"
},
{
"type": "User",
"login": "aronpc",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/181354?v=4"
},
{
"type": "User",
"login": "b92c",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/63520341?v=4"
},
{
"type": "User",
"login": "rafaelpassarela",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/13123625?v=4"
}
],
"contributors_sampled": 4,
"top_contributor_share": 0.976
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"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": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 4 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow 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": "no SAST tool detected",
"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": 0,
"reason": "Project has not signed or included provenance with any releases.",
"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": 1,
"reason": "9 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "704b66c72b04fca7de6482ce3218eff2b235dab8",
"ran_at": "2026-07-28T07:44:26Z",
"aggregate_score": 2.8,
"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-24T13:00:53Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-15T15:11:03Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/jholhewres/anchored",
"host": "github.com",
"name": "anchored",
"owner": "jholhewres"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"security": 28,
"vitality": 73,
"community": 42,
"governance": 58,
"engineering": 70
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 73,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"commits_last_year": 286,
"human_commit_share": 1,
"days_since_last_push": 3,
"active_weeks_last_year": 12
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "12/52 weeks with commits",
"points": 8.3,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 12
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "286 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 286
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 71,
"latest_release_tag": "v0.16.0",
"releases_from_tags": false,
"days_since_latest_release": 3,
"mean_days_between_releases": 3.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "71 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 71
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~3.7 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 3.7
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": 42,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 18,
"inputs": {
"forks": 3,
"stars": 10,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "10 stars",
"points": 15.5,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 10
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "3 forks",
"points": 2.5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 3
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"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": 18,
"status": "met",
"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
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 58,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 4,
"top_contributor_share": 0.976
},
"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 98% of commits",
"points": 0.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 98
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "4 contributors",
"points": 5.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 4
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 4 contributing companies or organizations",
"points": 10,
"status": "met",
"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": 4,
"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": "4/4 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 4,
"decided": 4
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 52,
"inputs": {
"followers": 37,
"owner_type": "User",
"is_verified": null,
"owner_login": "jholhewres",
"public_repos": 13,
"account_age_days": 4309
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "37 followers of jholhewres",
"points": 11.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 37,
"login": "jholhewres"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "13 public repos, account ~11 yr old",
"points": 20.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 13
}
},
{
"code": "account_age_years",
"params": {
"years": 11
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/jholhewres/anchored"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 3
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 3 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 3
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "72 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 72
}
}
],
"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": 70,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"ai",
"claude-code",
"cli",
"cursor",
"developer-tools",
"golang",
"knowledge-graph",
"local-first",
"mcp",
"memory"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "10 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 10
}
}
],
"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": "critical",
"name": "Security",
"value": 28,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 28,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 2.8
},
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 4 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"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": "no SAST tool detected",
"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": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": "9 existing vulnerabilities detected",
"points": 0.8,
"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": 6
},
"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": 68,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 572
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "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": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 72419,
"source_files_sampled": 293,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/293 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 293,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "critical",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"example_dirs": [],
"has_mcp_signal": true,
"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": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T07:44:33.985223Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jholhewres/anchored.svg",
"full_name": "jholhewres/anchored",
"license_state": "standard",
"license_spdx": "MIT"
}