Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 29835,
"has_wiki": true,
"homepage": "https://nahornyi.ai",
"languages": {
"Shell": 866251,
"Python": 2011397
},
"pushed_at": "2026-07-18T11:14:56Z",
"created_at": "2026-04-29T06:10:07Z",
"owner_type": "Organization",
"updated_at": "2026-07-14T11:27:50Z",
"description": "Your second inner voice. A proactive local AI partner that plans your day, runs routines, and leaves an auditable markdown trail.",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": "NOASSERTION",
"primary_language": "Python",
"significant_languages": [
"Python",
"Shell"
]
},
"owner": {
"blog": "https://nahornyi.ai",
"name": "Nahornyi AI Lab",
"type": "Organization",
"login": "nahornyi-ai-lab",
"company": null,
"location": "Spain",
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/280152101?v=4",
"created_at": "2026-04-28T21:59:37Z",
"is_verified": null,
"public_repos": 2,
"account_age_days": 84
},
"license": {
"state": "custom",
"spdx_id": null,
"raw_spdx": "NOASSERTION",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-07-11T15:16:50Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-07-02T18:05:49Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-07-02T11:23:25Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-06-22T16:49:56Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-06-20T15:14:36Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-05-29T19:57:29Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-05-29T19:54:02Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-05-02T13:47:01Z"
}
],
"recent_commits": [
{
"oid": "ce8049a3d5598b98ec4e1089bd4572eb943be892",
"body": "Cuts the v0.7.0 release covering the People Notebook and the BF16 local voice.\nBumps VERSION, rolls the changelog, and adds the release notes. No functional\ncode changes here — the features landed in the preceding commits and are\nalready running on the maintainer's node.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Release Vepol v0.7.0",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-14T07:57:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b8f29d42e2f39dc2dc02c9f9deb5122bba8528d1",
"body": "The on-demand local audio runtime pinned an 8-bit Qwen3-TTS build. This\nswitches the pin to the BF16 VoiceDesign snapshot, which produces cleaner\nspeech, and hardens the installer around it: a non-blocking install lock,\nverified immutable release directories, atomic install.json promotion, and\nbyte-\n[…]\nle\n release layout, atomic marker promotion, and render/exit lifecycle.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Move local Qwen TTS to the BF16 model snapshot",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T22:13:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a92cd7db1e618ca60ba97f674214662be5841783",
"body": "Resolving the rebase conflict with a whole-file checkout silently\ndropped the merged PR's non-conflicting install.sh changes: the\n--audio-backend flag, its validation and help text, the one-time\ninteractive route question for fresh installs, and the managed\nprocesses.yaml route application. Re-merge\n[…]\n; file now equals the PR version plus exactly\nthe People Notebook delta.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Restore the audio-backend installer options lost in the rebase",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:47:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "29afe58e4372d467b798898763090d90ac08ef6b",
"body": "Review found that two collector runs racing each other could strand\npeople: one advances the collection cursor while the other overwrites\nthe day's envelope with a partial result, leaving the first run's\ncontacts behind the cursor with no record. The whole run now holds an\nexclusive lock; a second i\n[…]\nreleased; the\ncollector suite is 22/22 with the full people sweep green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Run only one Telegram collector at a time",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fa9ace5e9c79993afb354c728fed364f303634bf",
"body": "One more loss path from review: if a collection run is interrupted while\nmerging with a same-day envelope the extractor hasn't consumed yet, the\nbounded write could evict the earlier run's people — and those rows sit\nbehind the already-advanced cursor, so the envelope was the only place\nthey existed\n[…]\nre the\nfix); collector suite 21/21; full people and entity sweeps green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Protect already-collected people when a Telegram retry is interrupted",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6d1e217ecdbbb58e555e1946b6d7dd437f607ae5",
"body": "A truncated or oversized collection window could permanently lose\npeople: the collector kept the most-active senders and dropped the rest\nwhile holding its cursor, so a marginal one-off contact fell off every\nenvelope and was never picked up again. Now an over-capacity window is\nsplit by time instea\n[…]\n on the next run; full people and\nentity sweeps green; real smoke clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Never drop a person when a Telegram window is over capacity",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c1a6134862a82af4651574216e05fb332e286f28",
"body": "The collect() docstring still said pinned chats are skipped\nunconditionally; it now matches the code (a pinned chat with fresh\nactivity is covered). Documentation only.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Fix a stale comment in the Telegram collector",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2e3ab2ad380994ed0807c0e97bc1ebc73f47e32d",
"body": "The completeness rewrite skipped pinned chats entirely so they couldn't\nbe mistaken for the end of the window — but that also dropped a pinned\nchat with a genuinely new incoming message, losing that person while the\nrun looked clean. Now a pinned chat with activity inside the window is\nwalked like a\n[…]\nl stops at the first old non-pinned chat; suite green, real\nsmoke clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Cover pinned Telegram chats that have fresh activity",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "39c04076c5cb91365fefaefb78eb596972f116ab",
"body": "A third review pass showed the previous coverage model could still lose\npeople: dialogs past a fixed scan cap were never visited, and hitting the\nper-dialog message cap wrongly marked a dialog done — so a sender sitting\nbehind a burst of your own outgoing messages could be skipped forever.\n\nThe coll\n[…]\n real double-run\nsmoke covered the window and merged the same-day retry.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Make the Telegram collector provably cover every dialog in its window",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fbeef54173b55b1f651f2f3365d5291fa7c36670",
"body": "A second review pass found the truncation handling could livelock: a\ncapped run kept its watermark but re-read the same newest dialogs every\ntime, so a large backlog never drained. The collector now walks eligible\ndialogs oldest-first and advances a monotonic coverage cursor — a\ntruncated run covers\n[…]\non the hub covered\nthe window cleanly and advanced the watermark to now.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Make the Telegram collector drain its backlog and never lose people",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "76268ea111db0be19b78b2f1a71473ba223111f7",
"body": "An adversarial implementation review found five real holes and they are\nnow closed: a truncated Telegram collection no longer advances the\nwatermark (identities beyond the caps were silently lost); a same-day\nre-collection merges with an unconsumed envelope instead of overwriting\nit; senders without\n[…]\n including the\noverride attempt; full people sweep green on this layout.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Close review findings in the Telegram collector and rollup wrapper",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6b211849370126248595a932dbe38e08b420fad3",
"body": "…eview\n\nThe notebook now hears about people from all four everyday surfaces —\nproject logs, mail, Telegram, and the calendar — and every new person\nstill lands in the owner's review queue first:\n\n- kb-telegram-people collects WHO wrote in private Telegram dialogs\n (name, username, phone when visibl\n[…]\nor and\na real calendar run staged 5 real people into the review buttons.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Feed the People Notebook from Telegram and Calendar, always through r…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "522ac4daa54860d029003bbb6642beaebfbaa7f8",
"body": "Vepol now maintains a relationship-memory address book. New people are\ndiscovered from project logs and from the mail brief's senders-identity\nenvelope, and are always staged for owner review — no source can write\na live card directly. Review happens over Telegram inline buttons\n(kb-people-review-bo\n[…]\nyout; a personal-identifier scan of the shipped people surface\nis clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Add the People Notebook: staged contact extraction with Telegram review",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cccf17b6f55de578f52b8b4bf8c514a1ce6320e5",
"body": "…TS, full-paper learning\n\nThe scheduled morning chain used to trust the clock and external\nbinaries: a brief could be swallowed silently after a failed send, a\nCodex app auto-update could vanish the launcher mid-flight, and the\nlearning digest read only abstracts. This train ships the reliability\nmo\n[…]\ndelivered the brief with verified markers and\nthe digest on snapshot v2.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GbdTu6i2z6XsGkwwiYm5KY",
"is_bot": false,
"headline": "Harden the daily pipeline: verified delivery, one Codex path, local T…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-13T16:39:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4526c222a6505db1fd984e01a2b0de651fab6617",
"body": "Add selectable NotebookLM and local Qwen audio",
"is_bot": false,
"headline": "Merge pull request #2 from nahornyi-ai-lab/agent/local-qwen-tts-v0.6.0",
"author_name": "Vadym Nahornyi",
"author_login": "aladin2907",
"committed_at": "2026-07-11T15:12:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c82b44d34127ed8c663a048b5dc4d98413c953b8",
"body": null,
"is_bot": false,
"headline": "Add selectable NotebookLM and local Qwen audio",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-11T15:11:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "849e727da570e2b1185f005c9ebfc82ac784246e",
"body": "…ts a voice\n\nYour day now has audio at both ends. The digest engine ships publicly: every\nmorning it folds your scheduled processes into one file (plus a NotebookLM\naudio overview when the CLI is connected), and a new evening mode delivers a\nshort spoken recap right after the retro — what got done, \n[…]\nest checks + 129-check mail regression green on the hub and against both distribution seeds; three-round adversarial implementation review clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add daily audio digests: morning digest goes public, evening retro ge…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-02T18:05:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "55688b89fa08b5b4c787722fee161a34113939cb",
"body": "\"No write or action tools\" implied a physical wall. Truthfully: Vepol ships no\nwrite code path and never requests one, but the Gmail connector in the Codex\nenvironment may expose write capabilities of its own — the reader's isolation\nis instruction- and policy-level in this release. Hard isolation lands with\nthe actions slice.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "State the Gmail action isolation honestly in the v0.4.0 notes",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-02T11:42:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0b3def2716d1ca4bce94bb13d1a3bccc7e740c24",
"body": "The notes overstated the boundary (\"wrapped before any model sees it\";\nabsolute \"cannot steer\"). Honest wording: minimized/validated/fenced summaries\ncarry no instruction authority, while the reading step itself is a read-only\nmodel with no action tools whose output is re-validated — full isolation of\nthat step ships with the future actions slice.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Clarify the mail injection boundary in the v0.4.0 notes",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-02T11:34:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4f5e29aa0e550f806c012dcad2d09e5d02e6dbc4",
"body": "Mail becomes part of the daily loops: a single background reader\n(kb-mail-brief, via the Codex CLI Gmail connector) minimizes inbox threads\ninto a bounded privacy-safe envelope; kb-brief, kb-retro, and the\norchestrator cycle inject it as untrusted data. Enabled by default; reads\nnothing until Gmail \n[…]\nndition re-read check.\n\nverified: mail test suite green against the live hub and both seed bins; live read-only Gmail smoke passed\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add read-only Gmail mail briefing to the daily brief and retro",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-07-02T11:23:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "39754d9819ed7bab9626a39bb0122bf7c0a5b7bc",
"body": "A real end-to-end smoke against Google Calendar showed an approved follow-up\nappearing twice in the agenda — once from the local ledger and once as its own\n\"[Vepol] ...\" calendar event read back from the connector — so the daily brief\nwould show the same reminder twice.\n\nkb-agenda now de-duplicates \n[…]\n dedup). Fake adapters only, no live calendar/MCP/network.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MinpCMDYMDVmaAvdiCAY2L",
"is_bot": false,
"headline": "calendar follow-ups: don't list an approved reminder twice in the agenda",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-29T09:05:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "daf4fb5d9d1be7a47b354846e3bd716f1b0e6fd6",
"body": null,
"is_bot": false,
"headline": "Clean v0.3.1 release notes",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-29T09:01:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a200b18b002383112c3a1e6aeddea1465a57c87c",
"body": "Completes the calendar follow-up surface in the product seed: the daily brief\nnow reads kb-agenda and injects the minimized agenda (date/time/title/source/\nstatus only) into its prompt, degrading to a short \"calendar unavailable\" note\nif the agenda can't be read so a calendar problem never breaks th\n[…]\n scanned clean against the leak-pattern set before commit.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MinpCMDYMDVmaAvdiCAY2L",
"is_bot": false,
"headline": "calendar follow-ups: let the daily brief read the approved agenda",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-26T23:40:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "781a5e669dbbfd683fbc99b045c8cf64a9597fcd",
"body": "The product seed shipped a direct Google Calendar writer: kb-task --calendar and\nkb-idea's calendar approve both created events via a `claude -p` call, with no\nowner-approval step and two parallel write paths. This brings the approval-gated\ncalendar follow-up surface into the seed and removes those \n[…]\n scanned clean against the leak-pattern set before commit.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MinpCMDYMDVmaAvdiCAY2L",
"is_bot": false,
"headline": "calendar follow-ups: gate the direct calendar writer in the product seed",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-26T23:38:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b0c2d6a87f03fde5cf8cfa0bc32a9e7c1424b8e5",
"body": null,
"is_bot": false,
"headline": "Release Vepol v0.3.1 package",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-22T16:49:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c1a5e6eba6604b207dc75ec722d857cbc060b26",
"body": "Complete the public methodology rollout for the owner-approved spec gate by documenting the gate in methodology docs, Idea Intake docs, and the Claude development-loop skill.\n\nAdd the owner_spec_gate methodology contract test and wire it into tests/run-all.sh.\n\nValidation: python3 tests/methodology/owner_spec_gate.py passed 9/9. tests/run-all.sh reaches and passes the new owner-gate block, then fails on pre-existing unrelated tests/install/agent-modes.sh synthetic HOME setup.",
"is_bot": false,
"headline": "Publish owner-spec approval gate docs",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-22T14:18:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d242cd2b61dd611790cc862811e774ba3abafac3",
"body": "Hotfix agent-card/v1 startup-loaded template and overwrite-only project state contract.",
"is_bot": false,
"headline": "Harden agent card and state templates",
"author_name": "Vadym Nahornyi",
"author_login": "aladin2907",
"committed_at": "2026-06-21T21:46:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f2aff046748d9ee47ec645b9b9be45b500e407c",
"body": "…fy consistency)\n\n--verify flags a $HUB/orchestrator-seed that is not a symlink-to-seed, but --apply\npreviously left a pre-existing real file there unchanged — so apply could succeed and\nverify then fail on the same state. --apply now backs up a conflicting non-symlink\norchestrator-seed to a .pre-ve\n[…]\naves a state verify accepts. Regression suite now 23 cases (incl. apply/verify\nconsistency on a pre-existing non-symlink pointer).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make install --apply self-heal a non-symlink seed pointer (apply/veri…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-20T15:45:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2d2ce870b9c038fef13cd4f47da0dd28f76821da",
"body": "The orchestrator-seed integrity check only caught a retargeted symlink; a pointer\nreplaced by a real file/dir (not a symlink) still passed green. A correctly wired\ninstall has $HUB/orchestrator-seed as a symlink resolving to the seed, so verify now\nflags any non-symlink seed locator (seed-pointer-not-symlink) as well as a mistargeted\none. Regression suite now 22 cases.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix install --verify: flag a seed pointer replaced by a non-symlink",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-20T15:40:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e6afa1bc98737418d1349134d80e2e955970e12e",
"body": "--verify previously checked managed bin symlinks but not the $HUB/orchestrator-seed\npointer (how agents locate the seed) — a missing/retargeted pointer passed green.\nIt now verifies the seed pointer resolves (realpath) to the seed, alongside the bin\nlinks. The verify JSON also carries a verify_scope\n[…]\ninstall-health is the full manifest/skills/\nlaunchd check (which the setup prompt runs separately). Regression suite now 21 cases.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden install --verify: check orchestrator-seed pointer + bound scope",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-20T15:35:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c7914aeee6f33fe7b4ba8d43e9c0d2f39faa27c4",
"body": "…nstall/upgrade)\n\ninstall.sh gains agent-readable modes: --probe/--dry-run/--verify/--capabilities\n(--json) and --apply, behind an argv parser that rejects unknown/conflicting flags\n(exit 2, empty stdout) so an old installer is detectable, never a silent full run.\nRead-only modes are python3-free or\n[…]\no tests/run-all.sh.\n\nDefault-hub install is verified end-to-end on isolated HOMEs; the real ~/knowledge is\nnever touched by tests.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add prompt-first agent self-install (install modes, SETUP.prompt, uni…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-20T15:26:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "85063f79106c5b9f8fa8cb3eb80fab43ec79b433",
"body": null,
"is_bot": false,
"headline": "Release Vepol Idea Intake v0.3.0",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-20T15:13:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "114b90140519651a4b5afc218fe100fc7ead010b",
"body": "Vepol previously spoke Russian in some places (morning brief, evening\nretro, learning digest) and English in others (follow-up reminders)\nregardless of who installed it. Now the user sets a language once in\npersonal/profile.yaml — the installer derives a default from the system\nlocale — and the brie\n[…]\nok pass produced English titles/summaries end-to-end in\n a temp hub (zero Cyrillic in the digest); Russian behavior unchanged\n on the live hub\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Deliver every user-facing process in the user's language",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-12T18:19:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "af9286b7cb6726b893337206f09a60f22d6b1ec1",
"body": "Owner feedback on the first delivered digest: the text mixed Russian\nlabels with English content and gave too little context about the\nselection. The digest now opens with how many fresh papers were\nscanned and how many matched the topics, and each paper carries a\nRussian title, a Russian selection \n[…]\n.sh: 11/11\n- Live: real Grok pass returned title_ru/studied_ru/found_ru/why_ru\n for all three papers; 3479-char digest delivered as one message\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make the learning digest fully Russian and more informative",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-12T16:22:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "381ce0f6302289c60f38cee3ce78909976a1c849",
"body": "The scheduled morning learning digest came from a broad AI-news radar\nwhere official blog links could outrank actual papers, and the daily\nbrief ran a hidden arXiv prefetch on the side. This replaces both with\na clean process boundary: daily runs only the brief, and the new\nkb-learning-arxiv owns th\n[…]\nrun.sh 94/94; tests/run-all.sh green\n- Live smoke: real arXiv fetch, real Grok pass with Russian summaries,\n Telegram delivery from stage cache\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add arXiv-only learning runner with Grok social check",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-12T15:03:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fc41b3bf4c8074029fff79af3f60c743cb37cac9",
"body": "The front page had drifted from the product: it still said alpha\nv0.1.x while the latest release is 0.2.1, described daily research as\na NotebookLM audio recap every morning when the default is now a\ntext-first digest with NotebookLM as an explicit on-demand mode,\npresented health/device ingestion a\n[…]\n for the\n [Unreleased] section)\n- Two independent agent reviews of the page against the codebase;\n all confirmed mismatches fixed before merge\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Align the README front page with what's actually shipped",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-11T18:24:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7fdc8d8a1261426872a5f793984fcb00f7bba703",
"body": "codex-cli 0.138 changed `codex exec` to read an inherited open stdin\nuntil EOF, appending it to the prompt. When the supervisor is started\nfrom a terminal (stdin = tty), every codex-backed agent spawn would\nhang forever with no output. Under launchd this was masked because\nstdin is already /dev/null\n[…]\naseAdapter.spawn of /bin/cat (hangs on open\n stdin, exits immediately on closed stdin) returned exit=0 in <10ms\n- full ./tests/run-all.sh green\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Close child stdin in multibot agent spawner",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-11T13:41:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4458cb5c940aaec69d9886fe7598dba12ec9ffe1",
"body": "processes.yaml run commands are shlex-split, not shell-expanded, so a\ndeclared `--hub ~/knowledge` reached the child process literally and\nresolved against launchd's cwd: the scheduled people-extract crashed on\nevery tick trying to write its audit under /~/knowledge. kb-tick now\nexpands a leading ~ \n[…]\n kb-extract-people --hub \"~/hub\" under a fixture HOME); full\ntests/run-all.sh, test-daily-research.sh, and\ntest-arxiv-tick-integration.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Expand ~ in process run-command arguments",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-11T05:22:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6835e409f6c4ec4a99144afed52af766cb956ddb",
"body": "A mixed legacy manifest whose last shared write was a successful text\ndigest carried status=completed without an audio artifact, which slid\npast the retry cap's status=failed condition and re-spent audio\nattempts the day had already exhausted. Migration now reassigns such a\ncompletion to the text si\n[…]\nws to 92 assertions with the\ntext-success bypass regression (zero NotebookLM calls expected);\ntest-daily-research.sh and tests/run-all.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Close the text-success bypass in mixed legacy manifests",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T15:20:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "be1b89e202dff7a742193d93724c46b402358000",
"body": "The legacy-state migration moved the shared attempts counter into the\ntext budget whenever mode said text_only — but a legacy text run could\nhave overwritten the mode of a day that already had genuine audio\nattempts, erasing real quota spend and granting up to a full extra\nretry budget. Migration no\n[…]\ny regression (attempts=3 plus notebook_id must keep the cap in\nforce: zero NotebookLM calls); test-daily-research.sh and\ntests/run-all.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep real audio attempts when migrating mixed legacy manifests",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T15:14:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "48dd0c949c7bbbf444138ce1cebecabeaeb60a8d",
"body": "The mode guard on the retry cap was not enough: inherited text-only\nattempts still lived in the shared attempts counter, so one genuinely\nfailed audio run after the legacy state pushed the counter past the cap\nand locked out further manual retries. Manifests with mode=text_only now\nmigrate their sta\n[…]\n, then one failed audio\nattempt, then a successful manual retry must still reach NotebookLM);\ntest-daily-research.sh and tests/run-all.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Migrate legacy text-only manifest state out of the audio budget",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T15:08:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "adcf2bdb321b54f482d4f0eb8513027d20855132",
"body": "Manifests written before per-mode state recorded text-only delivery\nfailures in the shared status/attempts keys with mode=text_only. The\nfull-mode retry cap now also requires the failed state to belong to a\ngenuine audio run, so inherited text failures cannot lock a manual\nfull-mode run out of Noteb\n[…]\nest regression (failed/text_only/attempts=3 must still\nallow a manual audio run to complete); test-daily-research.sh and\ntests/run-all.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Ignore legacy text-only failure state in the full-mode retry cap",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T15:01:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1c0ff3b5ebc041f77a7021f3862c92d61ef9ce44",
"body": "A failed background digest run used to overwrite the shared manifest\nstatus/mode/error fields, invalidating an already completed audio\nartifact: the next manual full-mode run would regenerate audio and\nspend NotebookLM quota for a result that already existed. Text-only\nruns now keep their state in t\n[…]\nl-mode rerun is an idempotent no-op (zero NotebookLM\ncalls); test-daily-research.sh, test-arxiv-tick-integration.sh, and\ntests/run-all.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Namespace text-only manifest state away from the audio record",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:55:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b936a82bf7687119c8b4bb64c3095f9eda06201e",
"body": "A manually generated audio artifact used to satisfy the shared\nalready-completed check, so the background text-only run exited 0 and\nthe tick marked the learning process fired without any Telegram\ndelivery. Idempotency is now per mode: text-only runs are done only\nonce their digest was delivered; fu\n[…]\next-only regression that requires the digest to\nactually go out (with zero NotebookLM calls); test-daily-research.sh\nand tests/run-all.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make text-only idempotency require a delivered digest",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:47:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "232a41bb643ed56313388271b544771c67db8110",
"body": "Text-only digest failures and refused background runs were incrementing\nthe same attempts counter that gates full-mode NotebookLM generation, so\na day of failed Telegram deliveries could lock an explicit manual audio\nrun out of NotebookLM it never touched. Text-only runs now count in\ntext_attempts a\n[…]\n followed by a manual\nfull-mode run that must still reach NotebookLM and complete; full\ntests/run-all.sh and tests/test-daily-research.sh green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep the NotebookLM retry cap exclusive to full-mode runs",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:40:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f76a8efc479b0f22cbd2d972a096de60ff2198cd",
"body": "Three hardening fixes from post-release review:\n\n- kb-daily-research: the retry cap no longer applies to text-only runs.\n Capped runs used to exit 0 after three failed Telegram deliveries,\n which let the tick mark the process fired with zero user delivery.\n Text-only attempts are cheap (no Notebo\n[…]\nun-all.sh,\ntests/test-daily-research.sh, tests/test-arxiv-tick-integration.sh all\ngreen; kb-tick module exec verified on /usr/bin/python3 3.9.6.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep undelivered digests unfired and survive stock Python",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:31:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "903b04b4c74994eaa42f9297ffcf87dd4914bb83",
"body": "The seed leak-scan rejects references to private dev-workspace paths in\ndistributed scripts; describe the contract inline instead.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove a workspace-specific spec path from process docstrings",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:20:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d5f6d0e3b40b0ef4536eae8b64712f9a729aae52",
"body": "Every recurring background process (morning brief, evening retro,\nresearch digest, people extraction, follow-up reminders, calendar,\nself-improvement) is now declared in knowledge/personal/processes.yaml\nwith exactly five fields: id, enabled, when, run, outputs. kb-tick\nreads that file and fires eac\n[…]\nases, 76 assertions),\ntests/test-arxiv-tick-integration.sh rewritten for the new contract\n(14 cases), and the full tests/run-all.sh suite green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Gate background processes through a single processes.yaml",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:18:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "170ff2799ceb84565ec2b5a5d237eacce8d3c503",
"body": "kb-daily-research now builds its default packet from a curated AI-agent\nradar (official feeds, Hacker News, Reddit, GitHub, arXiv snapshot)\ninstead of a single open-web research query, and adds a --text-only\nmode that writes the packet and delivers a short Telegram digest\nwithout calling NotebookLM \n[…]\nklm).\n\nTest plan: tests/test-daily-research.sh (21 cases) covers radar source\nselection, collector fixtures, text-only delivery, and retry caps.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Curate daily research sources and drop local audio downloads",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-10T14:18:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "38656e8ec85a46f389d2b6b657e836d8e636dbe6",
"body": "Follow-up to the personal-data sweep: the scanner module docstrings\nreferenced internal absolute paths, and the people-integration test\nhardcoded the maintainer's checkout path and used a real personal\nemail as a fixture (the privacy allowlist permits that address in\ndocs only, not code/tests).\n\nWha\n[…]\nepo checkout\n- _kb_scanner tests: 17 ran, OK (1 expected skip)\n- repo-wide marker scan: 0 hits outside the allowlist/ledger guards\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove maintainer markers from scanner docstrings and test fixtures",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T22:25:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3c75edf2a145ddcb8ef158e7dd67aee3480ca9a7",
"body": "The previous fix derived the hub path from the user home only, while\nthe rest of the codebase (_kb_backlog, _kb_multibot) resolves the hub\nas KB_HUB with a ~/knowledge fallback. A custom-hub install would have\nbypassed the hub-writer scanner requirement.\n\nTest plan:\n- guard verified for the default hub, a KB_HUB override, and a\n non-hub path; evolution fixtures pass\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Honor KB_HUB in the evolution hub-writer guard",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T22:21:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c284528f04bc2b7fb991434a29768a0b01bc5fe5",
"body": "The shipped knowledge/AGENTS.md was a verbatim copy of the\nmaintainer's hub schema, while the sibling orchestrator seed\nsanitized the same file. The sync tool now sanitizes this copy too\n(workspace slugs -> example-project, personal handles removed, home\npaths -> __HOME__), and install.sh renders th\n[…]\npersonal markers\n- bash -n install.sh passes; placeholder render matches the existing\n CLAUDE.managed.md/settings.json convention\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Route the shipped AGENTS.md through the seed sanitizer",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T22:17:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f5243ecd767ed8d12a5c0d3276c31cdcec950b3c",
"body": "The public repo carried leftovers from the maintainer's dev\nworkspace: internal project paths in the shipped AGENTS.md and\ninstall.sh messages, a personal bot handle and name in methodology\ndocs and code comments, a hardcoded home-directory path in the\nevolution policy (a portability bug as well as \n[…]\nres.py passes; tests/kb-board/contract.py\n 29/29; policy module imports and hub-writer check verified for\n hub and non-hub paths\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove maintainer-workspace data from shipped files",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T22:14:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "de13453c0c3c8ab4a21f58cc7f35ad7986822532",
"body": "The Development Loop compact pointed readers of the shipped AGENTS.md\nto a task board that only exists in the maintainer's dev workspace.\nReplaced with neutral wording: the deterministic guards are a tracked\nfollow-up; until they land the rules are enforced by instruction.\n\nTest plan:\n- grep confirms no workspace-specific board references remain in\n shipped guidance\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove a workspace-specific board reference from the shipped compact",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T22:08:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "23685ca02f50ed39c7271dd0195b2f7b14d1b782",
"body": "The loop reviewed specs but never the implementation diff, let authors\nverify their own acceptance criteria, counted reviewers instead of\nreview quality, and had no protocol for reviewer disagreement or stale\napprovals. Three independent review passes converged on the same gaps.\n\nWhat changed:\n- Pha\n[…]\n for this change passed two independent reviews (block -> revise\n -> approve on the final version hash), dogfooding the new gates\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add v2 quality gates to the Development Loop",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T22:03:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "00da887d7e60086ef6e08a152d8ca16943a9d7b9",
"body": "The skill was named vepol-develop, which contains the internal dev-workspace\nslug (vepol-dev) the seed leak-scan blocks from shipping. Renamed to\ndevelopment-loop — it matches the canonical docs/methodology/development-loop.md,\ncarries no internal slug, and is cleaner for a public artifact. AGENTS.md updated\nto match.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rename the Development Loop skill to avoid the dev-workspace slug",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T21:09:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "73d77f8320c53a5311d0af1ae2ed405daec34ee1",
"body": "Replaces a generic, Claude-specific dev skill with Vepol's own, reusable by any\nagent (Claude Code, Codex, Antigravity). The canonical process lives in\ndocs/methodology/development-loop.md and the compact form in AGENTS.md, so Codex\nand agy follow it natively (no skill system needed); the Claude ski\n[…]\nne-line note.\n\nDesigned and reviewed through the loop itself: the spec was cross-reviewed by\nCodex and Antigravity before writing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add the Development Loop — one vendor-neutral process for any agent",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T21:03:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a82f586a2bbae3f13536b70e1244afaaabf9cb73",
"body": "kb-cli-roster:\n- Parse a final registry line that lacks a trailing newline.\n- Detect bare-name candidates with `type -P` so a shell builtin/function can't\n be mistaken for an installed CLI.\n- Compare with cmp (byte-accurate) before skipping an --ensure rewrite, instead\n of \"$(cat)\" which strips tr\n[…]\ned), honoring \"every session knows the CLIs\".\n- Read KB files with errors='replace' so a stray non-UTF-8 byte can't kill the hook.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix roster parsing edge cases and cover wiki-less sessions",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T18:05:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e82ba83e182eda0b3beedec969650f31884acdcd",
"body": "The previous change removed a real directory at a managed bin/ target with\n`rm -rf`. If the hub is an existing ~/knowledge the installer doesn't own, that\ndeletes user data without any ownership check. Replace the delete with a\ntimestamped backup move: the directory is preserved as\n`<pkg>.pre-vepol.\n[…]\nnd the symlink is placed; if it can't be moved, the\nsymlink is skipped with a warning rather than forcing a destructive operation.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Never delete hub directories — move them aside instead",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T17:58:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1705d6e25d6492772e8402e82d1a104168eb80e5",
"body": "- Render __HOME__ in the managed ~/.claude/.vepol/CLAUDE.managed.md so the\n include path resolves; it was copied verbatim, leaving a literal\n @__HOME__/knowledge/AGENTS.md that never loads.\n- Always create the managed hub directories (bin/, _template, .orchestrator, …),\n not only when the hub is \n[…]\nes no literal __HOME__ and resolves the include path;\na real dir at a managed target is replaced by a symlink; syntax checks pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make hub setup robust on existing/partial/upgraded installs",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T17:52:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "257865ba3eceea776b40e2b7907a53e8a8404a0e",
"body": "The installer detected tool versions but didn't act on several, so a clean\nmachine could pass prerequisites and then fail at runtime:\n\n- macOS: enforce 13+ (the documented minimum) instead of only printing it.\n- bash: check the bash actually on PATH (what hooks run), not just two hardcoded\n Homebre\n[…]\n a warning, yielding a \"successful\" install\n with a broken hook.\n\nThe block now prints one clear list of what's missing/outdated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Enforce prerequisite versions in the installer",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T17:49:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "964cf21927cc7fc28855ddc11e9c71e8c73e7bc2",
"body": "- kb-session-start: hub-mode detection and roster refresh now honor KB_HUB\n (custom-hub installs), not just ~/knowledge.\n- kb-session-start: README/state/index are capped (5k each) so a large project\n doc can't push the triad, roster, and log out of the 20k context budget.\n- kb-cli-roster: validate that each fallback-of target names exactly one tool,\n warning on a typo instead of emitting a wrong fallback note.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Honor custom hub and bound injected context in session hook",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T17:47:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d1d2b6fc818e9e1a0cb5e37138a42eaf6a13f97c",
"body": "…ures\n\nBatch of robustness fixes from a deep review pass:\n\nkb-cli-roster:\n- Validate option operands (--out/--registry/--ttl) so a bare flag gives a clean\n error instead of an \"unbound variable\" crash under set -u.\n- Require the registry to be readable, not just present.\n- Warn (with line number) o\n[…]\ncp -n so a user's own added CLIs are never clobbered.\n- The upgrade-refresh cp/chmod is non-fatal so it can't abort the installer.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden roster scripts and installer against bad input and silent fail…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T17:42:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "641837fa891b0919b93ec74334eb4cd425bbe198",
"body": "Three fixes from a final review pass:\n\n- The roster pointed agents to ~/knowledge/solutions/cli-agent-runtime-launch.md\n for exact flags, but that file is dev-specific and not shipped, so a fresh\n client got a dead reference. The pointer is now conditional: included only when\n the matrix actually\n[…]\ns now\n emit a stderr warning (detection still falls back to generic candidate-shape\n matching) so typos don't drift in silently.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden roster for clean clients and custom hubs",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T16:57:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9a49de264386ad9acd6f6b4b88515b41525b64de",
"body": "--ensure used a registry-mtime + 24h TTL cache to skip regeneration. But the\nroster reflects which CLIs are *installed*, and that changes independently of\nthe registry file. So installing or removing a CLI left the roster wrong for up\nto 24 hours, and agents kept seeing stale availability.\n\nDetectio\n[…]\ne does not rewrite the file (mtime stable); flipping a\nCLI to \"not installed\" updates the roster on the very next run, not in 24h.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep the CLI roster fresh — drop the 24h staleness window",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T16:28:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a3bf514d930b458fb444e7e5a22c829316900c93",
"body": "The installer documents a detect-only, non-interactive contract (\"never\nauto-installs\", VEPOL_NONINTERACTIVE supported). The CLI offer broke that: it\nprompted (read) and auto-installed on consent (npm/pipx), so install.sh could\nblock on input and install software the contract says it must not.\n\ninst\n[…]\ni-roster uses whatever is present. kb-cli-offer also honors\nVEPOL_NONINTERACTIVE=1 as a hard guard against prompting/auto-install.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep the agent-CLI offer non-interactive and detect-only",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T16:23:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "505ea4831ac97ab3278d694e1142475c9e131219",
"body": "kb-cli-roster exited 1 on its success path: the final `[[ $PRINT -eq 1 ]] && …`\nreturns 1 when not printing, which became the script's exit code. A tool that\nsucceeds but reports failure breaks the \"empty/failed output = real failure\"\ndiscipline agents rely on. Added an explicit `exit 0`.\n\ninstall.s\n[…]\nut, --ensure no-op);\na simulated install with a temp hub generates the roster and the matrix path in\nit points at the install hub.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix kb-cli-roster exit code and pin installer to the install hub",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T16:13:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "076d8f8661e313a200436c6777ff12dccd3efa33",
"body": "Agents repeatedly failed to use the local agent CLIs (Codex, Antigravity,\nGrok, NotebookLM, OpenCode): they didn't know which were installed or when to\nreach for each, so the user had to correct them every session.\n\nThis ships a per-machine \"cheatsheet\" that every agent reads at startup:\n\n- bin/cli-\n[…]\n CLIs and\n their use cases from startup context alone, and correctly omits OpenCode\n (installed only as Grok's silent fallback).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add agent CLI roster so any agent knows which CLIs are available",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-06-09T16:01:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b15390fab3925cfb3b89345d975f59f7b14689c0",
"body": null,
"is_bot": false,
"headline": "Release v0.2.1",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-29T19:57:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c1d6a1af752b12f9265cad76973d045e87422c53",
"body": null,
"is_bot": false,
"headline": "Release v0.2.0",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-29T19:53:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb4bfc8a4bda2b00e66c597db7302bb5050c7b8f",
"body": "Adds a fast, rule-based scanner that gates untrusted text before it\nreaches an AI agent. Designed to catch the common families of prompt\ninjection — direct instruction overrides, jailbreak framings, data\nexfiltration prompts, hidden-Unicode payloads, encoded payloads, and\nmalformed control structure\n[…]\nk and\n security/scanner-signatures/ seeded with r001.md + current.yaml\n\nSpec: knowledge/decisions/context-injection-scanner-v2.md\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add context-injection scanner — deterministic prompt-injection detector",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-27T10:53:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3eed55915cebb0dfdf76a7c49f600f22e9e3988f",
"body": "Replaces the catch-all WebFetch and Bash(curl:*) grants with an explicit\nallowlist of vendor and platform hosts (Anthropic, OpenAI, Telegram,\nGitHub, Google APIs, Vercel, package registries, Homebrew distribution).\nAdds an explicit deny block for hosts that should only ever be reached\nvia the chrome\n[…]\npython3 -m py_compile bin/kb-doctor — module compiles\n- bin/kb-doctor fetch-allowlist --strict — exits 0 on a correctly wired host\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Restrict outbound HTTP to an explicit domain allowlist",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-27T10:33:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cfaee012647e8e77423f5b7279f78392d49e690e",
"body": "Tightens Vepol's local-install posture across three layers so new\ninstalls and existing machines start from a safer baseline.\n\nSettings defaults. Removes the permission-bypass mode shipped in\nprior templates so Claude Code now prompts before privileged actions.\ninstall.sh detects legacy bypass on ex\n[…]\nbypass keys\n- Manual: launch a fresh Claude Code session after the install\n migration; confirm tool calls now prompt as expected.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden Claude Code defaults and add token-leak protections",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-25T20:11:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5efcf4f8e18f08efb4978341e2e145fa545ef28c",
"body": "The public install path expects `knowledge/AGENTS.md`, `knowledge/CLAUDE.md`,\nand `knowledge/GEMINI.md` (see install.sh), but only `CLAUDE.md` was tracked.\nFresh clones therefore failed at the `cp knowledge/AGENTS.md` step, leaving\nnew machines without the canonical vendor-neutral contract.\n\n`.gitig\n[…]\nsynced into these paths automatically by `kb-seed-sync`, so the public\ndistribution stays in lockstep with the canonical contract.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(install): track canonical AGENTS.md and GEMINI.md in distribution",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-20T07:08:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "937539262ab85b10b654bc093fc995734cb9eb12",
"body": null,
"is_bot": false,
"headline": "fix: install global Gemini adapter",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-19T13:08:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ac8f3657d79e169307d2bf89e60021bbb95ed4b",
"body": null,
"is_bot": false,
"headline": "feat: make AGENTS.md the canonical agent entrypoint",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-19T11:50:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5664b3ea2f7b62c3427ccd6032e89a5ef96d6236",
"body": "When an agent's .orchestration.yaml has `warm_session: true`, the\nsupervisor now looks up the most recent successful run for the same\n(agent_slug, source_chat_id) pair and passes its captured Claude\nsession_id to the spawner. The agent's Claude process still starts\nfresh on every message, but it res\n[…]\nt loaded via the existing kb-session-start hook). Operators\nopt agents in per-project when they want continuous conversational\nmemory beyond the 15-message group context window.\n\nTests: 154/154 green.",
"is_bot": false,
"headline": "feat(multibot): wire warm_session resume in supervisor",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-12T14:27:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78567c9103832ec592c0f1138d27f265a3fcc2f3",
"body": "Replace the interactive kb-init-agent / kb-deactivate-agent pair with three\nfocused token-first commands plus an operational runbook.\n\nbin/kb-multibot-add <token> [--slug X] [--no-enable] [--no-group-add]\n [--no-kickstart]\n One command, token-first onboarding. Identifies \n[…]\nsor reads and writes.\n\nRemoves bin/kb-init-agent and bin/kb-deactivate-agent (deprecated by the\nabove; the interactive flow they offered did not match how operators\nactually onboard bots in practice).",
"is_bot": false,
"headline": "feat(multibot): standardize agent lifecycle CLIs",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-12T09:38:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ea4f9773ba628d2885b240d2254c70be74a43184",
"body": "A new module that gives each project agent its own Telegram bot\nidentity in a shared group while keeping compute on-demand.\n\nLayout:\n- bin/_kb_multibot/ — 14-module Python package (Python 3.9+, asyncio,\n Telethon, httpx). Pure-logic core (events, mention\n \n[…]\nn delegate via group\n mentions.\n\nREADME updated with module bullet + explicit self-hosting risk warning.\nCHANGELOG entry under [Unreleased].\n\nTests: 154/154 green under /usr/bin/python3 (Python 3.9).",
"is_bot": false,
"headline": "feat(multibot): add multi-bot agent runtime — Telegram supervisor",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-12T08:09:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5c12bc0a12843d534cd15f57c8a563de9ff66def",
"body": "…nstead\n\nUsing --plugin-dir without enabledPlugins caused a marketplace mismatch:\n--channels expects the plugin attributed to 'claude-plugins-official' but\n--plugin-dir loads it without marketplace attribution → MCP server failed.\n\nCorrect fix: keep telegram in enabledPlugins at project level\n(knowl\n[…]\ne bun server. Global enabledPlugins has no telegram → Desktop App\nsessions and subagents in other projects don't start competing bun servers.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(channel): revert --plugin-dir, use project-level enabledPlugins i…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-09T06:31:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "24214296160d93f830726d8f784151513334f7d3",
"body": "When telegram was in global enabledPlugins, every new Claude session\n(Desktop App, subagents) started its own bun server and killed the\nchannel's bun via Telegram's single-consumer enforcement. The channel\nlost its reply tool silently.\n\nFix: remove telegram from global enabledPlugins; channel loads \n[…]\nhe sole bun owner.\nAlso add CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL=1 to\nsuppress the cosmetic startup error in the LaunchAgent.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(channel): load telegram plugin explicitly to prevent bun conflicts",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-05T21:25:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "49c3a0520f2a3887394c5df4799305f41e0ec418",
"body": "Two related hardenings to the evening retrospective cycle.\n\n1. Duplicate retro fix:\n - kb-orchestrator-cycle (Step 5) marks retro_fired=true in\n today-plan.json after successful inline kb-retro, so kb-tick\n won't fire a second Telegram retro at retro_hm.\n - kb-tick: fire() switched from \n[…]\nded missing hub log.md\n to sandbox setup (was an invariant of any real hub).\n - tests/run-all.sh: include wave-rollup suite.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Evening cycle: fix duplicate retro + wave-rollup to parent/hub log.md",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-05T13:32:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4ec1cf04f6922b9d511071b195a2eafb4bdd57e8",
"body": "Newcomers reading the README couldn't tell which capabilities exist\nas concrete modules vs are aspirational. This adds a compact section,\npositioned right after \"What it does for you\" and before \"What makes\nit different — visible discipline\" so it lands while the reader is\nstill in product-fit terri\n[…]\norning dispatch.\n\nThe list grows release by release; CHANGELOG owns per-release\nhistory, this section owns \"what currently ships.\"\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "README: add \"What's shipped in v0.1.0\" section",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T18:00:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0a79698e49ff74cffcc6915cea31a6134cc7eae5",
"body": "VERSION: 0.1.0-dev → 0.1.0\nCHANGELOG: full [0.1.0] section listing initial scaffolding +\npost-open feature work (daily-plan generator, Stripe Payment Links,\nPeople + MCP-first sources). Codex pre-release review applied —\nlicense wording aligned with LICENSE+COMMERCIAL.md, leak prevention\ndescribed a\n[…]\n maintainer-only),\nimplementation internals dropped from release notes.\n\nLicense: FSL-1.1-MIT, auto-converts to MIT on 2028-05-02.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Release v0.1.0 — first tagged public release",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T13:46:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "96d925dd23df4bcc337962ceb57d0747ad6987b3",
"body": "…tuning\n\nAfter the first real-data sync against a 30-day Google Calendar\nexposed false-positives and gaps in v1.0, this round hardens the\nmodule across three axes:\n\nA) Integration test harness — bin/tests/test-people-integration.sh\n\n Six fixtures exercising the full pipeline end-to-end:\n T1 — fu\n[…]\nDown from 21 false-positive drafts → zero. The 3 lost\n contacts vs the prior 25 are exactly the 3 bot addresses dropped\n by C.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "People v1.1: integration tests, bot filter, review-drafts CLI, dedup …",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T10:39:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fb576062433f330b87834d6e87b01b37bbdbadf5",
"body": "Both surfaced when running `kb-calendar-sync --days 30` against a\nreal Google Calendar (25 attendees). Unit tests covered components\nin isolation but not the full pipeline.\n\n1. Empty-name attendees crashed kb-calendar-sync.\n\n Calendar event attendees with no `displayName` field produce a\n contac\n[…]\ner ones; user\n reviews and confirms/merges).\n- Channel test: send(\"vepol-test\", \"...\") delivered to Telegram,\n HTTP 200 ok=true.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "People: two bugs found in first real run, fixed",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T10:22:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ce2ad423eccd1396a652472cadedbaa92673c046",
"body": "Establishes Vepol's policy that external-data ingestion (calendar,\nmail, chat, etc.) routes through an MCP host rather than vendor SDKs.\nCalendar source is the first user of the pattern.\n\nDriver: Vadim 2026-05-02 — \"идти в ногу со временем, MCP это новая\nтехнология; АПИ это технологии прошлого\".\n\nWh\n[…]\nmcp-check: clean (P0=0 P1=0).\n- kb-calendar-sync --days 7 --dry-run: pulled 3 real contacts via\n MCP path. End-to-end loop works.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "MCP-first sources: methodology + Calendar source migration",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T10:15:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c79c6b199fa6fc3126f36c7b28c081eab78c087d",
"body": "…nt only)\n\nPer-user feedback (2026-05-02): \"зачем нам напоминать за неделю,\nтолько в день события\". The previous 7-day anticipation horizon\ngenerated noise — most reminders weren't actionable a week out, just\ninformational. Day-of (plus overdue) is the threshold that matches\nintent: \"today is the da\n[…]\nwledge.people-remind.plist.template: --horizon 0.\n\nExisting CLI users can still pass --horizon N for anticipation if\nthey want it.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "People reminders: change default horizon from 7 days to 0 (day-of-eve…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T09:03:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "af4024711956cd61ef2dbf7aabf1b956f67340a2",
"body": "A new module that turns the people in your life into agent-readable\nmarkdown cards living next to your project knowledge. This is not a\nCRM clone — it's a slice of Vepol's \"extension of self\" vision applied\nto relationships, where one substrate (the wiki) is human-editable,\nagent-readable, and cross\n[…]\ny of people, in markdown\". Existing\n category comparisons (CRM/PIM) are deferred to \"What this is not\"\n section, not the opener.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Vepol People v1: extension of memory-of-people, in markdown",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-05-02T08:09:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3fcd4f239010cc643078de8b393c036201648ba4",
"body": "Background:\nThe morning `kb-orchestrator-cycle plan` dispatch silently skipped 4 days\nin a row because nothing ever generated the input file `daily-plan/<date>.md`.\nThe cmd_plan code path was fully implemented but dormant — backlogs had 0 items\nwith `plan_item_id` because the cycle had literally nev\n[…]\nred — fix sits in cmd_plan\n F2 path which is documented existing behavior; v0.2 will add a\n closed-AFTER-generated_at heuristic.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "daily-plan generator v0.1: fix dormant 07:30 cycle plan-dispatch path",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-30T17:48:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0215006d3b980b1f917de67cf0927fd50c80df0a",
"body": "…€5000/y) commercial license tiers\n\n- Two annual auto-renewing subscriptions, EUR, processed by Stripe\n- buy.stripe.com links for Small + Mid tiers\n- Term, renewal, cancellation explicit; license scope clarified\n- Tax: EU B2B reverse charge (Art. 196), non-EU export, Spain/EU B2C routed to email\n- L\n[…]\n 2 passes, APPROVED FOR PUSH after VAT wording tightening\n+ Spanish NIF handling + term/renewal explicit + license scope explicit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "COMMERCIAL.md: add Stripe Payment Links for Small (€1500/y) and Mid (…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T22:11:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a8d8e5b294f93d864712a255c7a66576b6837ffa",
"body": "…text\n\nPer Vadim's instruction: 'people should be captured at first sight;\nREADME should explain everything in simple pictures, not just text.'\n\nThree new ChatGPT-generated section visuals (matching the cover's\ndeep-navy + warm-orange editorial style):\n\n- vepol-quickstart.png (1.3 MB) — embedded in \n[…]\nt names Vepol, Claude, Codex,\nand standard Vepol filenames). All four ChatGPT visuals (cover +\nthree new) are visually consistent (same color palette, same\ntypographic hierarchy, same Vepol 'V' mark).",
"is_bot": false,
"headline": "docs: embed 7 inline visuals in README — full visual story, not just …",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T16:58:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f453f4482c0276b66e8065dae976efb931e28828",
"body": "Vadim generated a second cover image via ChatGPT (DALL-E / GPT-Image-1\nin the OpenAI web UI) using the spec I provided. The result is\nmaterially better as a GitHub README hero than the NotebookLM\nversion:\n\n- Cleaner layout (more readable at typical README scroll width)\n- No watermark\n- Smaller file \n[…]\n personal-data leaks (none —\nonly product names Vepol, Claude, Codex, and the generic 'and\nothers' agent placeholder appear). File size and dimensions verified\nappropriate for GitHub README rendering.",
"is_bot": false,
"headline": "docs(visuals): replace README cover with ChatGPT version (cleaner)",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T15:52:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7bc575713e6e47b7fd2fad5c1a3a89504c54cfae",
"body": "Generated via NotebookLM from the latest README.md, AGENTS.md, and the\nsix other public-doc sources. The cover combines on one landscape\ncanvas:\n\n- Vepol: Your Second Inner Voice — the tagline\n- Substance-field architecture: human + AI agents + markdown field\n- The Autonomy Journey: Day 1 (drafting \n[…]\nregex scan clean (no\npersonal identifiers visible in the image; product names Vepol,\nClaude, Codex, and standard Vepol filenames backlog.md /\nescalations.md / incidents.md / strategies.md are all OK).",
"is_bot": false,
"headline": "docs(visuals): add cover image to top of README",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T15:39:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cc1cd41ab42afdc32419351044e9496225d6abb9",
"body": "This shifts Vepol's onboarding model fundamentally: the install path\nis no longer 'user runs ./install.sh by hand,' it's 'user tells Claude\nCode or Codex to install Vepol; the agent reads AGENTS.md and does\nit.' Per Vadim's instruction (paraphrased): 'people don't install\nsoftware with shell command\n[…]\n Codex on their Mac, says 'install Vepol on this\nmachine,' and gets a working AI partner that understands their\nprojects, watches for evolution opportunities, and keeps growing\nin autonomy from there.",
"is_bot": false,
"headline": "Add AGENTS.md (agent-driven onboarding) + Codex review feedback applied",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T15:28:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dcb9c7e9af773d8e81c4995bd42c8631919a4aac",
"body": "…tion\n\nAdds the seven whitelisted methodology concepts to docs/methodology/,\napplies all redlines from Codex's cross-agent review, and clarifies\nthat Claude Code and Codex are now full macOS products with GUI, not\n'just CLI tools.'\n\nNew methodology pages (~1428 lines total, all in policy/whitelist-c\n[…]\nse 2 acceptance: a\nnew user can clone the repo, run install.sh, see Vepol in motion via\nthe demo wiki, and read the methodology to understand the\ndiscipline. The public product foundation is complete.",
"is_bot": false,
"headline": "P2.6: methodology pages + apply Codex review feedback + GUI clarifica…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T11:42:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a55f38b1b1336d6d6451e977a5fb5cdd26675652",
"body": "The demo's personal/.secrets file is needed for kb-brief to start\n(without it, kb-brief fails with 'secrets file not found'). The values\nare all empty placeholders by design — there are no real credentials\nin this file.\n\nAdds an explicit gitignore exception (!demo/knowledge/personal/.secrets)\nunder \n[…]\nngle empty file makes it into\nthe repo while real secrets files (with the same pattern) elsewhere\nremain blocked.\n\nWithout this commit, kb-demo brief fails on first run, defeating the\npurpose of P2.5.",
"is_bot": false,
"headline": "demo: include empty .secrets placeholder (gitignore exception)",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T11:25:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0feb1d09625dbf3fede246dba9e1a70d666373ed",
"body": "Adds a fully synthetic Vepol knowledge base under demo/ that ships in\nthe public repo, so first-time users see the system in motion when\nrunning kb-demo brief / search / backlog after install. Without this,\nthose commands return empty output and Vepol's value isn't visible.\n\nWhat's included (42 file\n[…]\n\n\nVerification still pending — running kb-demo brief / search / backlog\nagainst the demo on a clean install will be the real test. Any\nremaining issues found during that test go in a follow-up commit.",
"is_bot": false,
"headline": "P2.5: demo wiki — synthetic populated example with 5 archetypal projects",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T11:24:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "45477e6696f237fbf4a3a62320b92c036cd50c0d",
"body": "… section\n\nAfter running the public-facing texts through Codex (the cross-agent review\ngate Vadim asked us to use for all marketing/product copy), applied\nall redlines except one: 'second inner voice' is preserved as the\nmaintainer's deliberate framing choice (Codex flagged it as 'memorable but\nstra\n[…]\nr voice. A proactive local AI partner that plans\n your day, runs routines, and leaves an auditable markdown trail.'\n\nOrg profile (separate repo nahornyi-ai-lab/.github) updated in parallel\ncommit.",
"is_bot": false,
"headline": "docs: apply Codex review feedback + add cross-linking knowledge graph…",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T09:46:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "00257251204547e5f8f17abbda8ba014875cc191",
"body": "Two new/updated visual artefacts that complete the reframing started in\nthe previous commit (abac66b):\n\n- docs/visuals/vepol-autonomy-growth.png (5.5 MB, landscape, editorial)\n\n The core product story in one image: how Vepol's autonomy compounds\n day by day. Day 1 (assisted drafting), Week 2 (inte\n[…]\nokLM (notebook ID\n26bbccc0-a78c-4968-9183-fda611b96a98). Old briefing was downloaded as\n'vepol-briefing (2).md' due to CLI's no-overwrite default; subagent\nmanually moved it to overwrite the original.",
"is_bot": false,
"headline": "docs(visuals): add autonomy-growth infographic + briefing-doc v2",
"author_name": "Nahornyi AI Lab",
"author_login": "web-flow",
"committed_at": "2026-04-29T09:34:17Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 8,
"commits_last_year": 107,
"latest_release_at": "2026-07-11T15:16:50Z",
"latest_release_tag": "v0.6.0",
"releases_from_tags": false,
"days_since_last_push": 4,
"active_weeks_last_year": 11,
"days_since_latest_release": 11,
"mean_days_between_releases": 10
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 62,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 0,
"stars": 10,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 2
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 37449,
"source_files_sampled": 130,
"oversized_source_files": 0,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md",
"_template/AGENTS.md",
"_template/CLAUDE.md",
"claude/CLAUDE.md",
"demo/knowledge/CLAUDE.md",
"knowledge/AGENTS.md",
"knowledge/CLAUDE.md"
],
"agent_instruction_max_bytes": 61856
},
"dependencies": {
"manifests": [
"requirements.txt"
],
"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": [
"pypi"
],
"dependencies": [],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 2,
"merged_prs": 2,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "web-flow",
"commits": 105,
"avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4"
},
{
"type": "User",
"login": "aladin2907",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/35692530?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.981
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 0,
"reason": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
"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/29 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"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": 9,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "ce8049a3d5598b98ec4e1089bd4572eb943be892",
"ran_at": "2026-07-22T18:50:51Z",
"aggregate_score": 3.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [
{
"number": 3,
"created_at": "2026-07-14T17:15:36Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 4,
"created_at": "2026-07-18T11:15:38Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-11T15:12:03Z",
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/nahornyi-ai-lab/vepol",
"host": "github.com",
"name": "vepol",
"owner": "nahornyi-ai-lab"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 46,
"inputs": {
"security": 32,
"vitality": 77,
"community": 29,
"governance": 38,
"engineering": 50
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"commits_last_year": 107,
"human_commit_share": 1,
"days_since_last_push": 4,
"active_weeks_last_year": 11
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "11/52 weeks with commits",
"points": 7.6,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 11
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "107 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 107
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 8,
"latest_release_tag": "v0.6.0",
"releases_from_tags": false,
"days_since_latest_release": 11,
"mean_days_between_releases": 10
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "8 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 8
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 11 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 11
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~10 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 10
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 29,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"forks": 0,
"stars": 10,
"watchers": 0,
"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": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "at_risk",
"name": "Community health",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "license file present, not a recognized license",
"points": 16.9,
"status": "partial",
"details": [
{
"code": "license_custom",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 38,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 12,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.981
},
"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.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 98
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 2,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "2/2 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 2,
"decided": 2
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/29 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 36,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "nahornyi-ai-lab",
"public_repos": 2,
"account_age_days": 84
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of nahornyi-ai-lab",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "nahornyi-ai-lab"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "2 public repos, account ~0 yr old",
"points": 3.9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 2
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 50,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "critical",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 24,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": "https://nahornyi.ai",
"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": "https://nahornyi.ai",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 32,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 32,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 13,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 5,
"scorecard_aggregate": 3.2
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/29 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"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": 1
},
"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": 57,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.94,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md",
"_template/AGENTS.md",
"_template/CLAUDE.md",
"claude/CLAUDE.md",
"demo/knowledge/CLAUDE.md",
"knowledge/AGENTS.md",
"knowledge/CLAUDE.md"
],
"agent_instruction_max_bytes": 61856
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md, _template/AGENTS.md, _template/CLAUDE.md, claude/CLAUDE.md, demo/knowledge/CLAUDE.md, knowledge/AGENTS.md, knowledge/CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md, _template/AGENTS.md, _template/CLAUDE.md, claude/CLAUDE.md, demo/knowledge/CLAUDE.md, knowledge/AGENTS.md, knowledge/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": "94 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 94,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 36,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.77,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "77 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 77,
"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": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 37449,
"source_files_sampled": 130,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/130 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 130,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"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-22T18:50:59.188286Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/nahornyi-ai-lab/vepol.svg",
"full_name": "nahornyi-ai-lab/vepol",
"license_state": "custom",
"license_spdx": null
}