公开记录
软件健康报告模式 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年6月在 GitHub 上查看 ↗

colinsurprenant/director 的健康指数为 100 分中的 55 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(81/100),最低的是Community & Adoption(32/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

55
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

55
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Colin Surprenant个人账户
130 关注者192 个公开仓库始于 2008年3月Balise AI

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/colinsurprenant/directorv1.10.0-1413 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

72良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
5.5/36提交节奏 — 52 周中有 8 周有提交
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

发布纪律

90优秀
评分方式
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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
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议题解决 — 0% 的议题已关闭
38.2/38.3PR 接受 — 已裁定的 PR 中 48/48 已合并
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所有者影响力 — colinsurprenant 有 130 位关注者
25/25既往记录 — 192 个公开仓库,账户约 18 年
所用输入
followers130
owner_typeUser
is_verified
owner_logincolinsurprenant
public_repos192
account_age_days6,725
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 13 天前
20/20版本历史 — 14 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/colinsurprenant/director
ecosystemsgo
any_deprecated
min_days_since_publish13

工程质量

基础的工程与文档实践是否到位?

81良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
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。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

63中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 99 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.99
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — go.mod(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 94 次由代理编写或署名代理
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可控的文件大小 — 采样的 68 个源文件中有 1 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes74,257
source_files_sampled68
oversized_source_files1

关键数据

11GitHub 星标
1贡献者
168最近 12 个月提交数
4距最近推送天数
13发布版本数
1巴士系数(bus factor)
10开放议题
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

更多细节

Star 与 Fork 历史 0 ★ / 2 ⇿
0Star
2Fork
7发布

每颗 star 和每个 fork 的添加时间,来自 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.