Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.14.0 · 2026-08-02 13:04 UTC

colinsurprenant / director

Coordination ledger for coding agents: what was decided, what's still open, where you parked — durable across sessions, repos, and weeks. Memory tools store what the agent knows; Director tracks the state of the work. Run both: they don't overlap. Claude Code + OpenAI Codex.

Go · ShellApache-2.0★ 11 зірок⑂ 2 форкиз черв. 2026 р.Переглянути на GitHub ↗

colinsurprenant/director має індекс здоров’я 55 зі 100, що відповідає смузі «Помірний». Найвищий показник — Engineering Quality (81/100), найнижчий — Community & Adoption (32/100). Останнє оновлення було 4 дні тому. Більшість нещодавньої роботи виконує один учасник.

55
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

55
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Colin SurprenantОсобистий обліковий запис
130 підписників192 публічні репозиторіїз бер. 2008 р.Balise AI

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/colinsurprenant/directorv1.10.0-1413 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

72Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 4 дн. тому
5.5/36Ритм комітів — 8/52 тижнів із комітами
18/18Обсяг комітів — 168 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year168
human_commit_share1
days_since_last_push4
active_weeks_last_year8
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 13 релізів
36/36Свіжість релізів — останній реліз 13 дн. тому
27/27Ритм релізів — реліз кожні ~1,7 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count13
latest_release_tagv1.10.0
releases_from_tagsні
days_since_latest_release13
mean_days_between_releases1,7

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

32У зоні ризику · 18% загального індексу
Як обчислюється оцінка
16.2/60Зірки — 11 зірок
0/25Форки — 2 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks2
stars11
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

49У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/46.8Вирішення issue — закрито 0% issue
38.2/38.3Прийняття PR — злито 48/48 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/22 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs48
open_issues10
closed_issues0
issue_closed_ratio0
closed_unmerged_prs0
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
15.2/25Охоплення власника — 130 підписників у colinsurprenant
25/25Послужний список — 192 публічних репозиторіїв, вік облікового запису ~18 р.
Використані вхідні дані
followers130
owner_typeUser
is_verified
owner_logincolinsurprenant
public_repos192
account_age_days6 725
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 13 дн. тому
20/20Історія версій — 14 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/colinsurprenant/director
ecosystemsgo
any_deprecatedні
min_days_since_publish13

Інженерна якість

Чи наявні базові інженерні практики та документація?

81Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 20 out of 20 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

100Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://colinsurprenant.github.io/director/
10/10Опис репозиторію
10/10Теми — 13 тем
10/10Wiki
Використані вхідні дані
topicsagent-coordination, ai-agents, claude-code, cli, developer-tools, golang, codex, openai-codex, event-sourcing, agentic, anthropic, claude, coding-agents
has_wikiтак
homepagehttps://colinsurprenant.github.io/director/
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

33У зоні ризику · 16% загального індексу

Стан безпеки

33У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 20 out of 20 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/22 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — немає даних
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,3
Виключено з оцінювання (немає даних або не застосовно): packaging. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

63Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
12.6/18Розгортання однією командою — go.mod (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 94 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,94
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
54.2/55Керовані розміри файлів — 1/68 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes74 257
source_files_sampled68
oversized_source_files1

Ключові факти

11зірок GitHub
1контриб'юторів
168комітів за останні 12 місяців
4днів від останнього пушу
13релізів
1бас-фактор
10відкритих issue
Goпакетних екосистем

Попередження щодо збору даних

  • 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

Докладніше

Історія зірок і форків 0 ★ / 2 ⇿
0Зірки
2Форки
7Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

111222212026-072026-072026-08
Мажорні 0Мінорні 6Патчі 1
OpenSSF Scorecard 3.3 / 10
3.3сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-08-02 13:04 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests20 out of 20 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/22 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 1
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/oklog/ulid/v2v2.1.1go.mod
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "agent-coordination",
        "ai-agents",
        "claude-code",
        "cli",
        "developer-tools",
        "golang",
        "codex",
        "openai-codex",
        "event-sourcing",
        "agentic",
        "anthropic",
        "claude",
        "coding-agents"
      ],
      "is_fork": false,
      "size_kb": 1527,
      "has_wiki": true,
      "homepage": "https://colinsurprenant.github.io/director/",
      "languages": {
        "Go": 643240,
        "HTML": 19573,
        "Shell": 98937,
        "JavaScript": 19703,
        "Go Template": 6604
      },
      "pushed_at": "2026-07-29T03:23:21Z",
      "created_at": "2026-06-09T13:23:13Z",
      "owner_type": "User",
      "updated_at": "2026-07-29T03:22:12Z",
      "description": "Coordination ledger for coding agents: what was decided, what's still open, where you parked — durable across sessions, repos, and weeks. Memory tools store what the agent knows; Director tracks the state of the work. Run both: they don't overlap. Claude Code + OpenAI Codex.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Shell"
      ]
    },
    "owner": {
      "blog": "https://linktr.ee/colinsurprenant",
      "name": "Colin Surprenant",
      "type": "User",
      "login": "colinsurprenant",
      "company": "Balise AI",
      "location": "Canada",
      "followers": 130,
      "avatar_url": "https://avatars.githubusercontent.com/u/2010?v=4",
      "created_at": "2008-03-03T14:08:54Z",
      "is_verified": null,
      "public_repos": 192,
      "account_age_days": 6725
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-07-19T14:32:17Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-07-19T03:45:31Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-07-16T13:49:47Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-07-07T20:21:30Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2026-07-07T15:21:01Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-07-06T21:26:06Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-07-06T19:35:19Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-07-04T20:20:28Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-07-04T03:22:21Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-07-03T21:27:17Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-07-03T21:10:58Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-07-03T16:58:53Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-07-03T02:13:45Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "5f38d7c4b3990430c9d1d39fdd0a1de0bf8ad4d5",
          "body": "* hooks: SessionEnd reaper archives the fleet row on session exit\n\nA session that registers at SessionStart but exits before any allowed\nStop (an /exit typed at the first prompt) left its fleet row live, and\nthe next session on the checkout reported a phantom \"1 other live\nsession\" for up to 4h (ren\n[…]\nadicting the file's new Stop =\nper-turn / SessionEnd = terminal-reaper split.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "hooks: SessionEnd reaper archives the fleet row on session exit (#60)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-29T03:22:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c1a0942353663406d1b15f43f931efa59386b77",
          "body": "Expands the canary README 'When to run it' section into a runbook covering the two lifecycles the harness serves (version-bump regression check; new-harness adapter acceptance) plus a red-response procedure generalizing the issue #50 park/unpark pattern. Fixes stale wording about the regression-diff target (last-tested.json is repointed at the fresh run by every probe). Docs only.",
          "is_bot": false,
          "headline": "docs(canary): runbook for when to run the harness (#52)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-24T16:39:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2161f33d3b3f46b89cea69ee67f2203fa35ae0d5",
          "body": "Adds the live-contract canary harness under hack/canary/ (repo dev tooling, no\nproduct-surface change): shared lib.sh plus per-harness modules for Claude Code,\nCodex, OpenCode, and Cursor CLI, each with a committed findings baseline from a\nlive run. Where `director doctor` checks wiring, the canary \n[…]\nmi-k3, sandboxed clone), and two Copilot rounds — all findings\napplied or dispositioned. Findings retention documented: only the latest baseline\nper harness lives in the tree (history holds the rest).",
          "is_bot": false,
          "headline": "canary: live-contract harness for all four supported harnesses (#51)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-24T14:52:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08f1ce56a55e1f6d4f278811c8d83e86d56fcfbd",
          "body": "Sub becomes the tagline + typed-facts line; lede becomes the hesitation\nopening (/clear chip styled via the extended code selector) closing on\n\"You direct.\"; divider is just \"session ends\"; caption cut to the\nseven-word README version; meta description rewritten under 160 chars so\nthe harness names \n[…]\n\"coordination ledger for coding agents\" deliberately (SEO category term,\nog card sync). Copy ported from the twice-reviewed README top (PR #48).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: port the skim-first hero rework from the README (#49)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-21T14:55:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d3a3a17de5886f22bd830de142bb851cdf67a5c",
          "body": "…red coins) (#48)\n\n* readme: hesitation-opening rework (mock for review)\n\nReplaces the four-paragraph hero essay with the distilled opening built\nin review with Colin: tagline, the push-the-degraded-session recognition\nparagraph, fear-of-losing-context payoff, straight into the transcript.\nThesis li\n[…]\nqualified in the harness section paragraph and the quality-gate contract row.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "readme: skim-first rework of the top section (hesitation opening, pai…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-21T03:53:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "817b0d8e008f5715ec9436e939c17544fabfb63d",
          "body": "README gains a \"One ledger, three harnesses\" section (review panel,\nlimit-wall switch, neutral ground) plus a pointer from the hero; the\ntour gets a matching \"across harnesses\" section between how-it-works\nand where-it-fits. Also clears the park-delay phrasing residue in the\nREADME opening and getting-started (every return to a parked repo,\nno explicit week counts).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs+site: promote the multi-harness use case to a top-level story (#47)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-20T22:58:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33736c2146cb38c964f8e89203f257957a34f259",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: install row mentions --all alongside --codex/--opencode",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-19T14:56:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4faf315e36286cc5faa3ec52166d72f6e2262d31",
          "body": "…all (CLI/installer parity) (#46)\n\n* feat(install): additive target flags --claude/--codex/--opencode + --all, CLI/installer parity\n\ndirector install/uninstall adopt the curl|sh installer's wire-flag\nsemantics (decision 01KXX8CF35): --claude/--codex/--opencode name\ntargets additively (the first expl\n[…]\nm>\n\n* TODOS: Windows-refusal entry covers --opencode too (stale since PR #42)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): additive target flags --claude/--codex/--opencode + --…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-19T14:28:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa405533e9cdbed7292a747bf9d453748daf241f",
          "body": "* docs+site: tri-harness consistency pass after v1.9.0\n\ngetting-started still said injection/liveness/close-out work identically on both agents (pre-OpenCode phrasing stated as current fact); now all three, with the CC-only nudges inert on Codex and OpenCode. The splash body gains its one plain-sigh\n[…]\nds both of those agents so a skim cannot mistake it for a current-fact claim.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs+site: tri-harness consistency pass after v1.9.0 (#45)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-19T04:04:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ffc278801b3dcda1bc02c64c49696233c3203264",
          "body": "… (#44)\n\n* feat(install.sh): OpenCode wire flag; --both removed in favor of --all\n\nThe curl|sh installer catches up with `director install --opencode` (PR #42):\n\n- --opencode wires OpenCode; --claude names the default explicitly\n- wire flags are now additive: the first explicit flag replaces the\n  C\n[…]\ne (OpenCode adapter noted as\nsince-v1/v1.9.0), and the site meta description.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install.sh): OpenCode wire flag (--opencode, --all); drop --both…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-19T03:47:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "627eb51477f7dcf8b143aa444d4768ab0db50673",
          "body": "…ext-rot framing) (#43)\n\n* docs+site: reset-is-free context-rot rework of README opening, splash hero, and vs-compaction comparison\n\nLead flips from the blank-session complaint to riding the context-rot cure consensus: everyone says reset and carry distilled state; the blank fresh session is why nob\n[…]\nect). getting-started opening aligned to the sessions-are-disposable framing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs+site: sessions-are-disposable rework of the public message (cont…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-19T01:03:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "97afd2e7a67c557811e449732463cdeb25a9936f",
          "body": "…mmands, flavor-aware injection (#42)\n\n* feat(install): OpenCode adapter (--opencode): managed plugin, flat commands, flavor-aware injection\n\nOpenCode hooks are in-process plugin calls, so the adapter ships one embedded\nzero-dependency JS plugin that fabricates CC-shaped payloads for the existing\nag\n[…]\node fallback tier requires executability, not mere existence (PR #42 Copilot)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): OpenCode adapter (--opencode): managed plugin, flat co…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-19T00:55:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59e499a667ca49e3f7691a9548a603791b0d0601",
          "body": "The generic boundary rule still named sub-task-done and wrapping-up as\nunconditional handoff triggers, leaving the exact resume-point-shadowing\nbehavior this PR eliminates as a valid reading for an ephemeral task\nsession — codex itself was the repro. The boundary line (injection +\nskill) is now scoped to work that will RESUME, and the two whats-done\nlines (SKILL.md, README) route terminal task outcomes to the note.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: handoff triggers scoped to work that resumes (codex adversarial)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T13:46:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29ab2eadc1e971694c26b68a2d99f3f919dd8a2b",
          "body": "…g rule\n\nThree small items bundled (decision 01KXNGKNJX), resolving 01KXMF36KX,\n01KXKXE45Q, and 01KWYY5T8X:\n\n1. Finished-task emission rule: a finished self-contained task (a PR\n   review, a one-shot investigation) records its outcome as a note — a\n   handoff is only for work that resumes, and start\n[…]\n  worktree/branch is deleted. Exceptions stated: main-checkout work just\n   resolves its items, and the main hub workstream is never closed out.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs+feat: task-outcome-as-note rule, brief date tags, complete-timin…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T13:46:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ca799b0f3168deab0d537b3c33f62e0a6e45d43",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: latest-handoff fold comment says un-concluded (PR #40 Copilot)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T03:24:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d8dc825690bf15ff5f2cfeb77c546f6c62bf29eb",
          "body": "…dening\n\nThe reserved meaning (a note ref naming a handoff concludes it) lived only\nin SKILL.md, which by the emitProtocol's own rationale never enters a\nworking session's context — the caution now rides the injection, plus the\nemit --refs flag help and the README emit section. Manifest field is never\nnil (diffable artifact must not flip null -> [...] on first conclusion),\nand the mark-direction fold case gains its shuffle assertion.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: plant the reserved-ref caution in the injected protocol + har…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T03:24:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0d4d68a053d9007dabaf73309560d3437503a469",
          "body": "Fixes the 01KWZ6212N LIE-TEST gap (design ratified as decision 01KXMAZSKV,\noption B): after /director:complete, a dead workstream's last handoff kept\nsurfacing in the injected digest as an apparent resume point, forever — and\nthe dead-sibling accumulation pushed the real collapsed payload past the\n1\n[…]\ning-started.\n\nOld binaries degrade exactly to today's behavior (the note folds as a\nplain note); no event kind, no schema change, no CLI change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(fold): completion-note refs conclude a workstream's handoffs",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T03:24:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed4ef99cbb811d366135cefb6f60754c4ef3c254",
          "body": "A shape-valid but impossible date (2026-99-99, reachable via a corrupt or\nhand-edited log) rendered an authoritative-looking tag, contradicting the\ndegrade-never-guess contract. time.Parse on the 10-char prefix now gates\nthe tag; the value still passes through verbatim (validation only, no\nnormalization — the offset boundary case is unchanged and re-asserted).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: dateTag validates calendar existence, not just shape (codex P2)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T01:59:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f404f508b117db301ab3f5f258af265814868dbb",
          "body": "…ad ends\n\nThree governed-context hardening changes (decision 01KXKWJ6PA, from the\nMinns context-rot article analysis):\n\n1. Digest date tags: open-item and handoff lines now carry their emission\n   date — \"(2026-07-07)\" — so a rehydrating session can weigh staleness\n   instead of taking every entry a\n[…]\nle line by 13B, which pushed the rung-2 payload 74B\nover its deliberately-tight window (the test's own comment prescribes\nexactly this re-tune).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(render): date-tag digest ground-truth lines; ask handoffs for de…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-16T01:59:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05750a1187e16f313fbd7377d5e44b301c8f7f9e",
          "body": "…lot follow-up)\n\n- The example captions glossed need-you as \"the open items waiting on a human\n  call\", which reads as the total open-item count; it is specifically the\n  [risk:escalate] subset. Both captions (README, site) now say so.\n- The --codex / --no-wire installer flags were shown as bare `sh\n[…]\nds; prefix them with `… |` so they\n  are unambiguously the same piped installer invocation (README and the\n  getting-started one-liner section).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: tighten need-you gloss and installer-flag snippets (PR #38 Copi…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-08T14:25:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "604cb4d012825952ba59545ae0154b7704fdb8be",
          "body": "Backports what the r/ClaudeAI post review settled into README, getting-started,\nwhy-director, and the site, so all reader-facing surfaces tell the same story\nthe same way.\n\n- getting-started: the curl one-liner is now the recommended install path (it\n  was absent entirely; the installer itself point\n[…]\neviewer:\nfactual claims verified against install.sh and the dependency graph; its\nbanner-fidelity and dangling-\"fold\" findings are incorporated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: port the Reddit-post messaging lessons into the user-facing docs",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-08T14:23:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fecd97193f181e1be666c2244606c17f8e93f31c",
          "body": "Remove em dashes from the four reader-facing docs (README.md,\ndocs/getting-started.md, docs/README.md, docs/dogfood.md), replacing each prose\nem dash with contextually-right punctuation (colon, comma, parentheses,\nsemicolon, or a sentence split). Also: table N/A cells for handoff/note\nlifecycle go f\n[…]\ncode,\nand numeric en-dashes. site/index.html and docs/why-director.md were already\nclean.\n\nDocs-only; gate green (go build ./...).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: general cleanup of reader-facing docs",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-08T13:03:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "994879332574e2cc090fe4719016f3bfb789b2f8",
          "body": "The README / why-director / getting-started openings led with \"you work across\nseveral projects\", which made single-project users self-select out, and framed\nthe reader as failing to track state (advanced users with good doc hygiene felt\naccused). They also headlined \"a standalone Go CLI\", which rea\n[…]\nhe lead.\n\nDocs-only; gate green (go test ./... -race). Implements diffusion decisions\n01KWZR3SEP + 01KWZSFZ4D and note 01KWZTT0R4.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: reframe hero copy around the session boundary, not project count",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-08T12:23:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4188f83fa19231d34a72a22d8a7651a630737c5b",
          "body": "The brief sample's outlook printed `# CHARTER: acme-api-main-...` (a\nworkstream id). `adopt` scaffolds `# CHARTER: <repo-key>` (adopt.go:91 fills\nws.RepoKey) and the CHARTER is per-project (projects/<repoKey>/CHARTER.md),\nso the handle was the wrong identifier and implied per-workstream CHARTERs.\nMa\n[…]\nream id stays on the\nstatus line and the handoff, where identity is genuinely per-workstream.\n\nAddresses Copilot review on PR #35.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: CHARTER header is the repo-key, not a workstream handle (review)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-08T01:48:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c213973c9515eaf564b965882e1939e636f024b",
          "body": "…l-POV GIF\n\nThe demo GIF showed Director from the model's POV (its emit calls), so it\ndid not carry the user's story and cluttered the first-run guide. Replace it\nwith authentic, user-facing captures of the two read views:\n\n- README hero: add the `director status` portfolio cockpit (one human, many\n\n[…]\nDME hero).\n\nPart of the Phase-0 seal-the-funnel arc (cold-start value gap). Gate green:\ngo test ./... -race, go build ./... clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: portfolio cockpit demo in README/getting-started; drop the mode…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-08T01:48:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f4ced05386ae97b8ad19e6a13e13c8279c70a68",
          "body": "…se example to v1.7.0\n\n0.5 (seal-the-funnel): state the single-machine assumption loudly in the install /\nonboarding copy (README Install + getting-started section 1), not buried in \"Status &\nscope\" — a laptop+desktop user otherwise gets two divergent hubs with no warning.\n\nPre-tag: bump the install\n[…]\nst), so a fresh install's `director version` example matches the tag that first\nships `director doctor` and the curl|sh installer.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: single-machine caveat in install copy + bump install-from-relea…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T20:18:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a2f3c81b843c55708f912d0627ac7d9023ac044",
          "body": "…urface\n\nSecond Copilot round on `director doctor`:\n\n- nearestExistingDir treated any os.Stat error as not-exist and climbed past it, so\n  a hub under a dangling-symlink (or otherwise inaccessible) ancestor read as\n  creatable while MkdirAll would fail — a false-healthy. Replace it with\n  nearestExi\n[…]\n the ratified scope decision (open-item 01KWYXM7ZE); the\nwrite side is atomic, so partial wiring is not a realistic false-healthy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot — hub ancestor walk fails loud on a broken/dangling s…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T19:53:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c34659f85e3479251c84123faa57b60920add1db",
          "body": "The Windows CI job failed (the Linux §13 gate passed): the doctor diagnose\ntests build a real install fixture and assert executable-shim and bin-symlink\nsemantics, but writeBinSymlink no-ops on native Windows and Go reports files\nwithout the 0o111 bits there, so the fixture is only valid on Unix. Pr\n[…]\njob now stays on the paths that actually run there\n(the native-Windows CLI-only guard and the pure-logic ancestor walk still run).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(doctor): skip the Unix-only diagnose tests on native Windows",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T19:53:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3099aee7a9d9adf011a80a02e2c233dad24dcd2c",
          "body": "… missing hooks\n\nCopilot's two doctor comments:\n\n- claudeHooksCheck printed \"no Director hooks — run `director install`\" even when\n  settings.json was unreadable or malformed JSON (ManagedEntriesPresent collapses\n  a parse error to the same false as \"no managed entries\"), pointing the user at a\n  re\n[…]\nctory and risk a false-healthy. The observation is\n  correct; faithfully honoring it is not possible and the alternative is worse.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot — doctor distinguishes a malformed settings.json from…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T19:53:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20891c5e7275e78a752a3c962be1a2a787ed0a3c",
          "body": "…ative Windows\n\nAddress the review pass on `director doctor` (codex adversarial + ce:code-reviewer):\n\n- P1 (codex): resolve the DIRECTOR_BIN the shim actually sees. It was read\n  only from the shell, missing the documented desktop-app pin in\n  settings.json's env block — a stale pin there let doctor\n[…]\nll four managed hook\nentries are wired, not just that one tagged entry exists (the write side is\natomic, so the real risk is low).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: codex + ce — doctor honors settings.json pin, hub ancestor, n…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T19:53:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91eb817c8f57e410656972d7b4d22182eaa05349",
          "body": "Add the install self-check to the command list, a confirm-it-took step\nafter `director install`, the stale-DIRECTOR_BIN callout, and the fresh\nwalkthrough (README); the verify step and the troubleshooting lead-in\n(getting-started). The wording states the exit contract precisely: exits\nnon-zero when the install is broken, and warns without failing on a\npartial one (e.g. a terminal-only install the desktop app would miss).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(doctor): document `director doctor` in README and getting-started",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T19:53:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca386261b6e03350194f88635a6a481158493a39",
          "body": "Add a doctor subcommand that walks the same binary-resolution ladder the hook\nshims walk (DIRECTOR_BIN -> director on PATH -> the install symlink) and reports,\nloudly, whether coordination will actually fire — turning the shims' deliberate\nsilent no-op into a checkable verdict. It also checks the Cl\n[…]\n doctor checks exactly what install writes, no drift.\n\nGate: build/vet/gofmt clean, full go test ./... -race green. Verified live.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(doctor): add `director doctor` install self-check",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T19:53:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e245fe05efc130bb50c924266a15babddc22a151",
          "body": "…ot) (#31)\n\n* feat(install): one-line curl|sh installer that installs and wires in one shot\n\nAdd install.sh: detect platform, resolve the latest release, download and\nsha256-verify the tarball, stage-and-atomic-install the binary to ~/.local/bin,\nsmoke-test it, then run `director install` to wire th\n[…]\nut, which the\n  script invokes to wire the agent.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): one-line curl|sh installer (installs + wires in one sh…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T17:08:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "736cda4f496cecf00a856493cc954e9217deacdb",
          "body": "A codex adversarial pass found two residual silently-empty paths on the\nsystem-of-record read surface:\n  1. logTrulyAbsent only re-checked the immediate parent, so a broken\n     ANCESTOR (<hub>/projects as a regular file or dangling symlink) still\n     read the log as empty on Windows, where every b\n[…]\npty. This surface now guards deeper\nthan fleet.dirTrulyAbsent, whose identical one-level bound is tracked as a\nseparate follow-up.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: codex — walk ancestors so a broken hub path never reads empty",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T17:04:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "765e7124873762ae77fad0d5fd8d55f7feaa8dac",
          "body": "ce:review of #29 found logTrulyAbsent still read a dangling symlink AT the\nlog path as empty: Open follows it to a missing target (not-exist) and the\nparent is a real dir, so the parent-only check returned \"absent\".\nPre-existing (the old os.IsNotExist branch did the same), but the PR's\n§9/LIE-TEST m\n[…]\nthe guarantee guards both the parent and the log path.\n\nTest: log-file-as-dangling-symlink errors (unix-only, guarded on Windows).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: ce:review — close the last §9 gap, a dangling-symlink log file",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T17:04:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "710c3c6cb1850fee5b683a92c1d6fc092023ded0",
          "body": "os.Stat follows symlinks, so a project-dir parent that is a dangling\nsymlink reported not-exist and logTrulyAbsent read the log as empty --\nthe LIE-TEST risk the helper exists to close, and inconsistent with its\nown doc.\n\nClassify a present parent with Stat (a symlinked project dir stays valid);\non \n[…]\n\nTests: dangling-symlink parent errors; symlink-to-real-dir reads empty\n(both unix-only, guarded on Windows via skipIfNoSymlinks).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot — logTrulyAbsent fails loud on a dangling-symlink parent",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T17:04:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b210d2693aef6b2e627977cd343d25721dba9ac",
          "body": "…ows)\n\nscan treated any os.IsNotExist Open error as an empty log. On Windows, a\npath component that exists as a regular FILE reports ERROR_PATH_NOT_FOUND\n(classifies as not-exist), so a broken hub surface would silently read the\nsystem-of-record as EMPTY -- the section 9 \"silence reads as healthy\" /\n[…]\nchanged.\n\nCloses the escalate residue found by ce:review of PR #24 (event-log\nsurface of the Windows not-exist misclassification).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(event-log): store scan fails loud on a non-dir project path (Wind…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T17:04:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f94066b75baf6694468d94b94ac194cd41220b2",
          "body": "README and getting-started attributed the write-side emit habit to\nskills/director/SKILL.md, a repo file `director install` never places in the\nuser's ~/.claude. The habit is delivered by the SessionStart emitProtocol\ninjection (managed repos only); the skill is only its readable source. Reword so\na new user is not sent hunting for a skill-install step that does not exist.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: credit the SessionStart injection, not the uninstalled skill file",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T16:17:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9876529b017ad946da97f2ba9cda92eefb66a062",
          "body": "… path\n\nCopilot round on the docs: the tier lists read as a fallback chain, but\na set DIRECTOR_BIN is used exclusively — a stale value exits 0 without\ntrying PATH or the symlink. Both docs now say so. The regular-file\npreservation note derives the fallback path instead of hard-coding the\ndefault.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: DIRECTOR_BIN is authoritative when set, derive the preservation…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af82b7c0cbbe8085139a8ddb0d171caeb91b0603",
          "body": "The bin symlink is unix-only (writeBinSymlink no-ops on native\nWindows), so the sparing assertions added in f5eace5 broke the windows\nCI leg; the shim assertions in the same tests still run there.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: guard the new symlink sparing assertions on windows",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "60d9511ecdcd68f05ceb1daa964c3ad1c1a34054",
          "body": "…inspect classification\n\nFrom the ce:code-reviewer second pass + Copilot re-review:\n\n- binDirFor now Cleans the hooks dir first: a trailing slash on a\n  DIRECTOR_HOOKS_DIR override derived hooks/bin while the shims probe\n  ../bin — a false-success install whose fallback tier never fires.\n  Pinned by\n[…]\nud.\n- Both UninstallCodex sparing tests now assert the bin symlink survives\n  alongside the shims, closing the sparing/reclaim assertion matrix.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: second pass — trailing-slash bin derivation, atomic replace, …",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "454f766d3d2899336cb1ab1124110dec6869c596",
          "body": "Rebased onto main after PR #28 (conditional shim reclaim on codex\nuninstall) merged. The bin symlink travels with the shims, so\nUninstallCodex reclaims it under the same neither-install-remains gate\nthat now reclaims the shims; TestBinSymlinkSharedWithCodex pins the\ncodex-only reclaim leg.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "rebase: fold PR #28 semantics into the symlink lifecycle",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da473b5455ceb1ea9003efb724b644b38b79b242",
          "body": "… wording\n\nwriteBinSymlink now errors on a directory/FIFO at the bin path instead of\nsilently skipping (only a regular file is left in place), with a test\npinning it. printBinLine and the README/getting-started docs stop\nhard-coding ~/.claude/director/bin/director (the path follows\nDIRECTOR_HOOKS_DIR) and no longer promise the shims run a non-executable\nfile.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot round — non-regular bin path fails loud, derived-path…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0bc0750992d13949cc370cd7b4346dd805472960",
          "body": "Address both review findings:\n- sessionstart.sh: the ../bin/director tier comment still described the\n  fallback as the repo build output; it is now the install-provisioned\n  symlink to the running binary, matching README/getting-started/Go docs.\n- writeBinSymlink docstring: state the EvalSymlinks t\n[…]\nnk, but a versioned-symlink distribution\n  (Homebrew Cellar style) leaves the link dangling after an upgrade until\n  director install is re-run.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: shim comment drift, writeBinSymlink resolved-target trade-off",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0330f95d51880b0a1b823ad4cad895a6e5996609",
          "body": "Claude Code desktop launched from the Dock/Launchpad inherits the bare\nlaunchd PATH (/usr/bin:/bin:/usr/sbin:/sbin — no /opt/homebrew/bin,\n/usr/local/bin, or ~/go/bin; anthropics/claude-code#44649). The shims\nresolve director via DIRECTOR_BIN, then PATH, then $here/../bin/director,\nand exit 0 by des\n[…]\nhe installed sessionstart shim now\nresolves director through the symlink and emits the full ground-truth\ninjection instead of the silent exit-0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(install): drop a bin symlink so desktop-app launches find director",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T14:10:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a671070a603c1bd2058dfbb0ecaf2da247f8def9",
          "body": "Review round on the codex-only shim reclaim, all five findings taken:\n\n- UninstallCodex now gates the shim reclaim on BOTH probes\n  (!claudeInstallPresent && !codexInstallPresent), closing the new\n  coexistence gap where a custom --settings codex uninstall would remove\n  shims the default ~/.codex/h\n[…]\n override, matching the codex form; probe\n  docstrings in install.go/codex.go updated for the two-signal gate.\n\nGate: go test ./... -race green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: shim-reclaim gate hardening, doc sync, env-var visibility",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T12:49:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cad3c33dd885bfb944b258786c5ca13ad6749d76",
          "body": "…l remains\n\nA codex-only machine kept the 3 shim files under ~/.claude/director/hooks\nforever: UninstallCodex always spared them (in case a Claude Code install\nstill referenced them) and the CC uninstall form no-ops on a missing\nsettings.json, so nothing ever removed them (verified against a virgin\n\n[…]\nodex + CC machine spares them, and a settings.json that exists without\nmanaged entries reclaims them while the probed file stays byte-identical.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(install): codex uninstall reclaims shared shims when no CC instal…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T12:49:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e4564390ae0d649955ecea7cdedfa4235674f4a",
          "body": "…ntry\n\ntar.gz is darwin/linux only; windows ships zip. The line read as\ntarballs-for-all-plus-zip.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot — per-OS archive format wording in release-pipeline e…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T12:49:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0d0f64410ccdeca6cb85fa1989b49ad67b5bf23",
          "body": "Match README.md, which hedges the same verb list with \", ...\" so the\nline does not go stale as verbs accrue (promote and open-items already\nexist beyond the listed six).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: hedge the Windows manual-verb list with a trailing ellipsis",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T12:49:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07284506c56686f14c8316908ebd547baecead9c",
          "body": "… v1.6.0)\n\nThe release-pipeline line still described the pre-Windows matrix and the\nCodex-adapter section predated the native-Windows install refusal.\n\n- Release pipeline: matrix is now darwin/linux/windows x amd64/arm64\n  (zipped director.exe for windows), publish is blocked by the tag-time\n  windo\n[…]\nross-checked against\n.github/workflows/{ci,release}.yml and cmd/director/installcmd.go and\nare already accurate (updated within the arc itself).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todos): sync TODOS.md with the Windows support arc (PRs #22/#24,…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T12:49:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cfd43b490d6915cf6f2a45b5f1e6e31231807cd7",
          "body": null,
          "is_bot": false,
          "headline": ".gitignore",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-07T02:18:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "093d6f1b6b351ab912473b6427760789393ffc26",
          "body": "RFC 3986 permits single-letter schemes; none is registered in practice and\na drive letter is indistinguishable from one, so they are deliberately\nsacrificed. Comment now says so instead of overclaiming.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot round 4 — comment accuracy on single-letter schemes",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T21:21:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea1bcee3a16bbd17c083a818a340edcfa3b39d65",
          "body": "- arg scan split into pure parsePromoteArgs; runPromote keeps only\n  context/store wiring; existing usage-error table unchanged\n- TestParsePromoteArgs pins all accepted forms: --to/-to, separate and\n  =-joined values, flag before/after/between positionals, doc trimming\n- MaxPromotedToBytes comment now states field caps alone do not bound the\n  line (refs unbounded); Store.Append is the final guard\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot round 3 — extract parsePromoteArgs, pin happy-path forms",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T21:21:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84b4fbfa242f7b345c943315581e41879d4dd92d",
          "body": "- checkPortableAddress: any <letter>: prefix is now rejected (drive-relative\n  C:foo is as machine-specific as rooted C:\\x; URL schemes are >=2 letters\n  so no collision), with a table case pinning it\n- write.go file header and runPromote comment updated to match the actual\n  validation rule and accepted flag forms\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot round 2 — drive-relative paths, comment drift",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T21:21:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b97c3b300a65de4e9d62e6accdeaa262a3f38718",
          "body": "…ring accuracy, boundary pin\n\n- checkPortableAddress: single-backslash rooted paths (\\Users\\me\\x.md)\n  now rejected; MaxPromotedToBytes enforced early so an over-cap --to is\n  ErrInvalidDoc (exit 2), not a validation exit 1\n- Promote docstring / README / spec: \"active decision\" reworded to the\n  act\n[…]\ns mid-file,\n  one byte over is refused; the suggested off-by-one does not exist\n  because the scanner buffer must hold the token AND its newline\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "review: Copilot round — rooted-path rejection, early cap check, docst…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T21:21:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7cbad0080a1406a8fb49293cec5731b78d9b2af3",
          "body": "… into the slow layer\n\ndirector promote <ulid>... --to <doc> appends one typed promote-marker:\ndecision + status:promoted + refs to the targets + new optional promoted_to\nfield carrying the destination. The fold needs no functional change —\npromotion rides the existing supersession rule (targets lea\n[…]\nde structured + subagent, Codex\nreview + adversarial): all confirmed findings fixed. Closes open-item\n01KWNGE2EH (L2 of Ground-Truth hardening).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(promote): the L2 promote ceremony — fold aged decision rationale…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T21:21:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e85925fc940ce70fdb536c343a39b4fa5bf4987",
          "body": "PR #21 (concurrency signal) and PR #22 (portable not-exist\nclassification) landed in parallel: LiveSessions was born with the\nos.IsNotExist-on-ReadDir pattern #22 was eliminating, and neither\nbranch could see the other. Same fix, same test twin: a fleet path\nthat exists as a regular file errors into the caller's health-logged\nfail-open path instead of silently reading as no siblings.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(fleet): LiveSessions gets the portable dir-read classification too",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T20:56:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d220300fac00cb0c28cf5d682902234a737bd22",
          "body": "…s install guard, tag-time windows gate, dirTrulyAbsent hardening, CRLF invariant test\n\nCodex adversarial pass on PR #22:\n- install/install --codex refuse on native Windows (GOOS seam, tested):\n  the shims are bash, so installing there plants hooks that can never\n  fire; uninstall stays available as\n[…]\na dangling symlink classifies as broken, not absent\n- TestEmbeddedShimsAreLF pins the no-CR invariant .gitattributes\n  enforces at the git layer\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(install),build(release): adversarial-review fixes — native-Window…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T20:42:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc77c28e9a9664a9a7d13084f63e37b5ac31fd45",
          "body": "Review gap-fill: TestListFleetPathAsFileErrors covered only fleet.List;\nthe same broken-surface contract now has tests at DoneWorkstream (must\nnot misread as ErrRowNotFound) and BriefFleet (must not render an empty\nfleet over a broken hub).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: coverage for the two remaining dirTrulyAbsent call sites",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T20:42:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "864e1de66a7f4ccad038fd12bd061e5cfd1de391",
          "body": "…mption stated before the install step contradiction\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(windows): review fixes — full verb list in README note, WSL assu…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T20:42:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f86a5ac0adb0d02f523502be2e82b414cac6bf8c",
          "body": "Caught by the new windows CI job on its first run: os.ReadDir on a path\nthat exists as a regular FILE classifies as not-exist on Windows\n(ERROR_PATH_NOT_FOUND) but not on unix (ENOTDIR), so fleet.List,\nfleet.DoneWorkstream, and the brief projectKeys scan silently read a\nbroken surface as an empty on\n[…]\nnly a genuinely absent dir reads as\nempty; anything else propagates. Unix behavior is unchanged. New unit\ntest pins the contract cross-platform.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(fleet,render): portable not-exist classification for dir reads",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T20:42:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc9e156729f6e031d643fb028fd65bd800388fe6",
          "body": "… docs\n\nTier 1-2 of Windows support (tier 3, native hook shims, deferred):\n- release.yml: add windows/amd64 + windows/arm64 targets, zipped\n  director.exe, checksums extended to *.zip\n- ci.yml: windows-latest job (build + test -race) proving the O_APPEND\n  log append and rename-over-existing writes \n[…]\nffix for the integration binary\n- docs: README + getting-started Windows status (WSL fully supported,\n  native = CLI-only until hook shims land)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build(windows): windows release binaries, CI gate, portability fixes,…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T20:42:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42d36a24f9c32cbdb6df97ebc25cfdccb20d2952",
          "body": "Copilot review on PR #21: when the latest handoff postdates every decision,\nDigestCompact keeps nothing and degenerates to DigestCollapsed, but the\nhealth log still claimed 'newest kept'. The hook now asks the new\nrender.KeptDecisions (the count-and-cap in one place) and with an empty\nband skips str\n[…]\nons collapsed' — no\nmisnamed rung on the diagnostic surface, no assembling the same digest\ntwice. Rung-1 health now also carries the kept count.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hook): empty kept band takes rung 2 directly — log the rung that ran",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T19:34:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "958545cdf5f049e51c377df8228069803ebad6fd",
          "body": "Copilot review on PR #21: the banner prints the sibling count (self\nexcluded) while status prints the total as xN, so the same collision read\n'1 concurrent session(s)' in one place and 'x2' in the other. The wording\nnow matches the note's frame: 'N other live session(s) on this checkout'.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(hook): banner counts OTHER sessions — say so",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T19:34:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d09eb78846ca52f9b96de06a361294df557e3b0b",
          "body": "Applies the ce:review findings on d6d2954 (no blockers, no regressions):\n\n- Pin the strict > anchor boundary: an anchor equal to the newest decision\n  id keeps nothing; a regression to >= would have passed the whole suite.\n- Pin \"gone xN\": the marker composes with non-active states deliberately -\n  \n[…]\n recent ungraceful death -\n  never a sibling idling at its prompt. Widening that is a row-lifecycle\n  design question, recorded as an open item.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test,docs: close review gaps on elision ladder + concurrency signal",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T19:34:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "54bd3a32771d21f010dd89557fe625a8f293c97f",
          "body": "…signal\n\nTwo read-side fixes from the 2026-07-06 stale-ground-truth incident (note\n01KWW146C7), where an all-or-nothing decisions collapse hid a sibling's\ncourse correction and two live sessions shared one checkout unnoticed.\n\nDigest degradation is now a ladder: over budget, DigestCompact keeps the\n\n[…]\nng note (handoffs interleave, the resume point may be a sibling's,\nprefer a worktree); status renders \"active xN\". Awareness only - never gates.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(render,hook,fleet): recency-immune elision + concurrent-session …",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T19:34:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a750bf8439a0b2bad9ee63078bc7156b2317420",
          "body": "…ision-aligned scope\n\n- link the splash (two-minute tour) at the top; sidebar-only was invisible\n- replace the screencast GIF with the splash's static two-session terminal\n  example (user-visible experience up front); the GIF moves to\n  getting-started §5 where the model's raw director calls are the\n[…]\ns its settled\n  shape (git-synced hub, the fold is the merge, no server ever) and\n  multi-user is stated as out of scope by design, not deferred\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): post-splash README pass — tour link, session example, v…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T19:11:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2157a079e6aab2cba5c5c77031ed6cacdc340cda",
          "body": "…card\n\nThe card is the hero itself at 1200x630: banner, headline, Q&A contrast,\ninstall one-liner. Shares on Slack/X/Discord now render the pitch\ninstead of a bare text link.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(design): FINDING-012 — og:image social card + og:url + twitter …",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5480d3534bc7d525d7d9e84651b2a7f17cd28f2a",
          "body": "…om design review\n\n005: --ink-faint 3.68:1 -> 4.6:1 (AA); functional text off the faint token\n006: <main> landmark wraps terminal + sections\n007: cell hover removed (fake affordance on non-interactive grid)\n008: .facts fragments wrap normally under 640px\n009: :focus-visible accent ring on all intera\n[…]\nX magic number), dead smooth-scroll removed, unused below-fold reveal removed\n\nFindings merged from live audit + codex + subagent design voices.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(design): FINDING-005..011,013 — a11y, copy, and polish batch fr…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41a155aca594148e75e3e9f38b963f8bb59d0bae",
          "body": "…added footer links, 44px hero buttons",
          "is_bot": false,
          "headline": "style(design): FINDING-003 — touch targets: expanded copy hit area, p…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9d0d5c084ecd37970263ce46230dfef31f67fe4",
          "body": "…han wraps",
          "is_bot": false,
          "headline": "style(design): FINDING-002 — text-wrap: balance on headings kills orp…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ef8f7dd79dcbfdbd8aa23c026d6edd441dd3664",
          "body": "…of clipping",
          "is_bot": false,
          "headline": "style(design): FINDING-001 — install command wraps on mobile instead …",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "874bdd4f8b183c3383e9db4c11bf01af9a62f4fa",
          "body": "Frame border .09 -> .22 alpha, title bar gets its own raised background\nand .18 border, traffic dots to dimmed classic red/amber/green, window\ntitle from faint to dim ink.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: raise terminal chrome contrast",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f39d3953340403b2639cecfd94a3885879c9ff38",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: Q&A labels in accent green for readability",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5d2e6797f5f3a35e1dd532e33ef46cd73a747a25",
          "body": "The contrast paragraph was secretly a Q&A, a list, and a punchline;\nthe layout now says so: mirrored answer lines (mono labels, questions\naligned, know/work underlined dim vs accent), the four facts as a mono\nscan line wrapping only at separators, and a two-line closer. Run-both\nmoved out of the hero (the compare section already ends on it).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: break the hero wall into a scannable Q&A structure",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9d20f59632427fcb1f5515aaf5e83f67a3f90669",
          "body": "'where were we?' before the banner: faithful to the real flow (the\nacknowledgment arrives in the first reply, not before input) and the\ndigest becomes the literal answer to the universal re-entry question.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: act two opens on the user's question",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32122cdc677abc387c50acf7e8ae49a87095caa4",
          "body": "'context compacted' out (users differ on compaction), 'three weeks' out\neverywhere (hours, days, or weeks: same loss of place), dates out of the\nprompt lines (they re-asserted the three weeks), a pacing ellipsis\nbetween decision and open-item so the recordings read as moments apart.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: genericize the gap, pace act one",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f37b668084405510637b70a8f0ac5d1ad539495b",
          "body": "Show, don't tell: act 1 records three facts as a session works, a gap\nline marks 'session ends · context compacted · three weeks pass', act 2\nboots and the same three facts arrive injected, with ULIDs and the\nescalate flag surfacing as 1 need-you. The recognition moment moves\nfrom arguable prose to a traceable picture; the hero shrinks to\ncontrast, effort-free closer, install.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: two-act terminal replaces the scenario paragraphs",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bea014dc889a6b3cc4670d5ece74e22dc455de99",
          "body": "Universal and jargon-free: rollbacks are never documented, so a fresh\nsession sees only the old version number and helpfully proposes the\nupgrade you already paid for. Second-person restored; both scenarios\nback in parallel voice. The terminal keeps the real push-not-skill\ndecision line as authentic log content.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: decision scenario is the re-proposed upgrade (user pick)",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "034dde73002749eadf8c2bcfac023e4c0544af01",
          "body": "The skill-that-never-fired (01KW0PCV9G): shipped the emit protocol as a\nCC skill, 0 invocations in 2.5h of real dogfood work, pivoted to push\ninjection. Real, measured, legible to CC users, and checkable: the\nterminal's decision line now shows the same event the story cites.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: decision scenario is now our real dead end, cross-referenced",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "119484f3ae00557a5b91daca6b35b8e6270cdebc",
          "body": "'Proper architectural docs would have recorded this' is a fair counter\nto an ADR-worthy rejection. A tried-and-abandoned path is the category\nno documentation culture captures: docs record what you did, not what\nyou ruled out. 'Nobody writes an ADR for a dead end' pre-empts the\nobjection in-text.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: decision scenario becomes the dead end nobody documents",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a472b836d522df43f8274ece05c8881ce856fbb",
          "body": "The previous version described the setup but not the wound. Now: the\nconcrete re-proposal, the tuition already paid (two days of production\npain), and why recall can't help (the transcript that knew is gone).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: decision scenario opens on the agent's voice and names the cost",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1c3cdc83370f96e35dd417b6733cc926267a164e",
          "body": "A memory-tool user can argue with 'context lives in your head'; they\ncannot argue with the re-litigated decision or the loop that died in\nscrollback, because each scenario concedes recall and shows the\nlifecycle gap. Tagged with the kind chips (decision/open-item) in the\nterminal's semantic colors. Effort-free closer kept.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: replace message-bus abstraction with two memory-proof scenarios",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44d1f9bd3bbb1221bb533078d6c78c6faeda1600",
          "body": "…nal)\n\nSecond lede paragraph names the role the visitor is playing (you are the\nmessage bus) and kills the journal objection (agents keep it; you never\nwrite a status update; you review). The terminal now shows the whole\nloop: rehydrate at session start, emit as the session works, with a\nshell-wrapped emit command and its returned ULID.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: message-bus beat + effort-free promise (hero), emit tail (termi…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83cce12b35dd3587bfd231797b85d2a8e0082475",
          "body": "Colons, semicolons, and sentence splits replace prose em dashes; the\nterminal title and the CLI render header keep theirs (tool output, not\nprose). Fixes the double colon the sweep left in the meta description.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: em dashes out of the prose; keep the two authentic terminal ones",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c1e52a66f425c487ff05c54156053b8dc2e791b3",
          "body": "One self-contained static page (inline CSS, system font stacks, no CDN,\nno build system): editorial serif over phosphor-tinted near-black, the\ninjected digest as the centerpiece terminal visual with the CLI's\nsemantic colors, five beats (hero/terminal/mechanics/compare/footer).\nCopy carries the ledg\n[…]\n-vs-state-of-work,\nnothing-in-a-memory-store-ever-closes, run-both. Deploys via\nactions/deploy-pages from site/ on main pushes touching site/**.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "site: terminal-dark splash page + GitHub Pages deploy workflow",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T18:19:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4585e4d43b72f7d90e941f798c3481b38af54f1b",
          "body": "…e UTC boundary\n\nRegister previously accepted a caller-formatted Heartbeat string verbatim:\nno parse, no normalization, no validation beyond non-empty. All three\ncallers happened to format UTC, but that is the same convention-in-\ncallers'-heads that produced the mixed-offset drift PR #18 fixed for\nH\n[…]\nrmalizedToUTC extended to cover Register;\nthe no-heartbeat rejection case is deleted (nothing to reject).\n\nCloses Director open-item 01KWQ94Q9G.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(fleet): Register takes time.Time — the last fleet writer joins th…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T01:40:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6782a6093ba460318679a97ef494ced58558688e",
          "body": "Speaks directly to the reader already invested in a memory tool; matches\nthe updated GitHub repo description and why-director's comparison line.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): complementarity beat — run both, they don't overlap",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T00:22:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e77b05df4275634d15f30713f4663ebf73ec0e53",
          "body": "'Deterministic folds project the log' parses first as a noun phrase and\nforces a re-read. Singular fold + 'collapses' (fold.go's own vocabulary)\nin both README and why-director.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix 'folds project' garden-path sentence",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-06T00:03:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b52da4662976827d6db30005baee4f7e3a36780c",
          "body": "User preference: 'parked baton' out everywhere it is user- or\nmodel-visible — README, why-director, getting-started, the SessionStart\ninjection, the embedded /director:handoff and /director:complete\ncommands, and render/hook comments. Replacements pick the concrete term\nper spot: 'where the work stopped', 'resume point', 'the latest\nhandoff'. Historical specs untouched. Gate green (go test ./... -race).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs,strings: retire the baton idiom for plain language",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-05T23:59:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "13bb4018a33162d9584da89c40a747534468527e",
          "body": "Day-1 feedback pattern ('I already use memory tool X') showed the daybook\ntagline files Director in the memory drawer. New opening plants the\ncategory noun (coordination ledger), makes the know-vs-state-of-work\ncontrast the second beat, and leads with the lifecycle knife: nothing in\na memory store ever closes. Daybook survives as color in why-director.\nPer the 2026-07-05 event-model vision (ledger-not-memory niche, decision\n01KWT2NQ).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: ledger-first positioning — category correction at first look",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-05T23:33:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f487bec6e3e361589e7b4d875c9f31755a76800",
          "body": "…, single-human ratification\n\nCondenses the 2026-07-05 brainstorm: Director as event sourcing with the\nlog-is-the-product inversion, human-rate write invariant, injection budget\nas the real scaling axis, promotion as semantic snapshotting, the five\ndistribution shapes and why single-human-by-design survived, ledger-not-\nmemory niche. LOG decisions 01KWT2N2 / 01KWT2ND / 01KWT2NQ.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(specs): event-model vision — scaling semantics, distribution map…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-05T21:25:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "917534a6abdebb8caa579200e1a06c47deeaf79b",
          "body": "…ory-landscape deep dives\n\nFold the source-6/7/8 research (Backlog.md, ADRs-as-agent-memory, OpenSpec)\ninto \"How it compares\": all three compose with Director, none occupies the\nfast coordination layer. Add the slow-layer validation paragraph to the\ndurability gradient (Nygard supersede-never-rewrite, ceremony threshold as\npromotion filter) and two TODOS entries: cross-branch state resolution\nreference and the ADR-promotion affordance.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(why): three comparison subsections + gradient paragraph from mem…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T20:14:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "706b7ef801ec3dee9c1a20c5b257a55cbe4e9810",
          "body": "…in TODOS\n\ngetting-started.md now resolves the latest release tag at install time, so\nthe curl example can no longer go stale between releases (closes the\nrecurring pre-tag bump toil). Verified end-to-end against v1.4.0.\n\nTODOS.md gains the two basic-memory reference pointers (rclone two-way\nsync under multi-machine sync; MCP behavior hints under Later).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: version-neutral install example + park basic-memory references …",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T20:10:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "506f413676cab1c4c667ba4864f96ffebe4ea1c2",
          "body": "…y; quiet already-archived stop\n\nTwo health-hygiene fixes from the open-set:\n\n- fleet.Heartbeat and archiveRow now normalize the injected clock to UTC\n  where the timestamp is formatted, so rows and archive date buckets never\n  carry mixed-offset timestamps regardless of caller. The convention lived\n[…]\nand the\n  daily false-failure lines were exactly the wallpaper the kill-criteria\n  warn about.\n\nBoth locked by tests; go test ./... -race green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(fleet,hooks): UTC-normalize fleet timestamps at the write boundar…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T20:08:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f33b52175ef09fdb50c14a134a1a13fc4e59803",
          "body": "…PR #17 review)\n\nWithin the tail, survival order still applies: the resume anchor is\nsession-critical while the close-out nudge is advisory and grows a line\nper gone sibling. Locked by an ordering assertion in the gone-sibling\ntest, whose main workstream now carries a handoff so the fixture holds\nboth tail blocks.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hook): resume anchor before close-out nudge in the payload tail (…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T20:03:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "78477915a37c9ade39f09128de2c25ebab22c765",
          "body": "…injection\n\nThe 'Acknowledge on entry' block rode the payload tail, exactly what a\nharness persisted-output preview (~2KB head) drops. On the persisted\npath the banner became conditional on the model completing the full-file\nread, so it could never lead the first reply (observed live 2026-07-04,\nope\n[…]\nit the resume-point anchor into its own tail block since it\nreferences the digest above it. Verified: banner at byte 582 of a live\n15KB payload.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hook): head-anchor the acknowledgment banner in the SessionStart …",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T20:03:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b600d582efe567d566c619ffb07e12c84cae4b7c",
          "body": "…he release checklist)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: bump the install-from-release example to v1.4.0 (pre-tag, per t…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T03:21:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d71cdd68d39e00443c665192884d58e3e3a359f",
          "body": "…ng-started\n\nThe digest became an index of capped headlines in this PR; the protocol\nskill's Ground-Truth section still described going deeper as a raw log/doc\nread. Name the sanctioned hop: director show <ulid>, and pull an area's\ndecision bodies before overriding their choices.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skill): teach the show pull path in the protocol skill and getti…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T03:20:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "35c21701eff26d0564f9cecf1c7395482dd59acb",
          "body": "…der budget\n\nThe compact fallback made the \"digest == render output, no drift\" sentence\nwrong for the over-budget case; state both behaviors (byte-for-byte render\noutput under budget; DigestCompact over it — deterministic, divergence\nannounced in the digest and health-logged).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(hook): buildGroundTruth docstring — no-drift claim holds only un…",
          "author_name": "Colin Surprenant",
          "author_login": "colinsurprenant",
          "committed_at": "2026-07-04T03:20:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 13,
      "commits_last_year": 168,
      "latest_release_at": "2026-07-19T14:32:17Z",
      "latest_release_tag": "v1.10.0",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 13,
      "mean_days_between_releases": 1.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/colinsurprenant/director",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/colinsurprenant/director",
          "is_deprecated": false,
          "latest_version": "v1.10.0",
          "repository_url": "https://github.com/colinsurprenant/director",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T14:28:49Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 13
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 11,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-05",
            "count": 1
          },
          {
            "date": "2026-08-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 12
    },
    "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": [
        "go.mod"
      ],
      "largest_source_bytes": 74257,
      "source_files_sampled": 68,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/oklog/ulid/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 48,
        "open_issues": 10,
        "closed_ratio": 0,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "colinsurprenant",
          "commits": 168,
          "avatar_url": "https://avatars.githubusercontent.com/u/2010?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "pages.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "20 out of 20 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/22 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "5f38d7c4b3990430c9d1d39fdd0a1de0bf8ad4d5",
        "ran_at": "2026-08-02T13:04:29Z",
        "aggregate_score": 3.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T03:23:59Z",
      "oldest_open_prs": [
        {
          "number": 19,
          "created_at": "2026-07-05T04:02:01Z",
          "last_comment_at": "2026-07-07T19:57:23Z",
          "last_comment_author": "mlhamel"
        },
        {
          "number": 33,
          "created_at": "2026-07-07T19:54:51Z",
          "last_comment_at": "2026-07-14T15:37:02Z",
          "last_comment_author": "colinsurprenant"
        }
      ],
      "last_merged_pr_at": "2026-07-29T03:22:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 25,
          "created_at": "2026-07-06T21:27:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 30,
          "created_at": "2026-07-07T15:50:55Z",
          "last_comment_at": "2026-07-07T18:40:36Z",
          "last_comment_author": "colinsurprenant"
        },
        {
          "number": 50,
          "created_at": "2026-07-21T15:53:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 53,
          "created_at": "2026-07-27T18:03:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 54,
          "created_at": "2026-07-27T18:03:36Z",
          "last_comment_at": "2026-07-27T18:04:28Z",
          "last_comment_author": "colinsurprenant"
        },
        {
          "number": 55,
          "created_at": "2026-07-27T18:03:37Z",
          "last_comment_at": "2026-07-27T18:04:29Z",
          "last_comment_author": "colinsurprenant"
        },
        {
          "number": 56,
          "created_at": "2026-07-27T18:03:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 57,
          "created_at": "2026-07-27T18:03:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 58,
          "created_at": "2026-07-27T18:03:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 59,
          "created_at": "2026-07-27T22:33:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/colinsurprenant/director",
    "host": "github.com",
    "name": "director",
    "owner": "colinsurprenant"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 33,
        "vitality": 72,
        "community": 32,
        "governance": 49,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 72,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 168,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 8
            },
            "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": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "168 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 168
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 13,
              "latest_release_tag": "v1.10.0",
              "releases_from_tags": false,
              "days_since_latest_release": 13,
              "mean_days_between_releases": 1.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "13 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 13 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "forks": 2,
              "stars": 11,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "11 stars",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "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": 49,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "merged_prs": 48,
              "open_issues": 10,
              "closed_issues": 0,
              "issue_closed_ratio": 0,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "0% of issues closed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 0
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "48/48 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 48,
                      "decided": 48
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/22 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 63,
            "inputs": {
              "followers": 130,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "colinsurprenant",
              "public_repos": 192,
              "account_age_days": 6725
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "130 followers of colinsurprenant",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 130,
                      "login": "colinsurprenant"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "192 public repos, account ~18 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 192
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 18
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/colinsurprenant/director"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 13
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 13 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "20 out of 20 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "agent-coordination",
                "ai-agents",
                "claude-code",
                "cli",
                "developer-tools",
                "golang",
                "codex",
                "openai-codex",
                "event-sourcing",
                "agentic",
                "anthropic",
                "claude",
                "coding-agents"
              ],
              "has_wiki": true,
              "homepage": "https://colinsurprenant.github.io/director/",
              "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://colinsurprenant.github.io/director/",
                "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": "13 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "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": 33,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 33,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.3
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "20 out of 20 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/22 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.94,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "94 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 94,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 74257,
              "source_files_sampled": 68,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/68 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 68,
                      "oversized": 1
                    }
                  }
                ],
                "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.14.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-08-02T13:04:43.265358Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/colinsurprenant/director.svg",
  "full_name": "colinsurprenant/director",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.14.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаGo.