entropy-check
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseEntropy
Entropy
Sensor. Detect, grade, report. Never fix.
Install via npx:
bash
npx skills add fellowship-dev/dogfooded-skills/skills/ops/entropy-check传感器:检测、评分、报告。绝不修复。
通过npx安装:
bash
npx skills add fellowship-dev/dogfooded-skills/skills/ops/entropy-checkWhen to Use
使用场景
- Event-driven (PR merge): Triggered after a PR merges. Scans affected domains for doc staleness.
- Weekly cron (full sweep): Runs against each product repo, updates QUALITY_SCORE.md with fresh grades.
- Manual: When you suspect docs have drifted or want a current health snapshot before a refactor.
- 事件驱动(PR合并后): PR合并后触发,扫描受影响领域的文档是否过时。
- 每周定时任务(全面扫描): 针对每个产品仓库运行,更新QUALITY_SCORE.md文件,写入最新等级。
- 手动触发: 当你怀疑文档已偏离代码现状,或在重构前需要当前的健康状况快照时使用。
What It Does
功能说明
Entropy is a read-only sensor. It computes domain quality grades from mechanical signals:
| Signal | What it measures | Weight |
|---|---|---|
| Doc coverage | Does | Binary |
| Flow coverage | FlowChad flow defined for critical paths? | Binary (frontend repos only) |
| Staleness delta | Days since last code commit vs. last doc update | >30d = stale |
| Open issues | Issues tagged to domain in GitHub | >3 open = signal |
| Test coverage | From coverage report if available | <60% = signal |
| Hookshot coverage | Is doc-coverage.json current vs docs? | Staleness |
Grade scale:
- A — All applicable signals green
- B — 1 applicable signal missing or yellow
- C — 2 applicable signals missing
- D — 3+ applicable signals missing
- F — No docs at all for this domain
Inapplicable signals are excluded from the grade denominator. A repo with 4 applicable signals all passing = grade A.
Entropy是一个只读传感器,它通过机械信号计算领域质量等级:
| 信号 | 测量内容 | 权重 |
|---|---|---|
| 文档覆盖率 | | 二元(是/否) |
| 流程覆盖率 | 关键路径是否定义了FlowChad流程? | 二元(仅前端仓库适用) |
| 过时差值 | 上次代码提交与上次文档更新的间隔天数 | >30天 = 过时 |
| 未解决问题 | GitHub中标记到该领域的问题 | >3个未解决 = 异常信号 |
| 测试覆盖率 | 若有覆盖率报告则读取数据 | <60% = 异常信号 |
| Hookshot覆盖率 | doc-coverage.json与文档是否同步? | 过时状态 |
等级标准:
- A — 所有适用信号均为绿色(正常)
- B — 1个适用信号缺失或为黄色(警告)
- C — 2个适用信号缺失
- D — 3个及以上适用信号缺失
- F — 该领域完全没有文档
不适用的信号不计入等级计算分母。例如,某个仓库有4个适用信号且全部达标,则等级为A。
Instructions
操作指南
0. Identify Target Repo
0. 确定目标仓库
bash
REPO_ROOT=$(git rev-parse --show-toplevel)
REPO_NAME=$(basename $(git remote get-url origin) .git)
ORG=$(git remote get-url origin | sed 's/.*github.com[:/]\([^/]*\).*/\1/')
FULL_REPO="$ORG/$REPO_NAME"
TODAY=$(date +%Y-%m-%d)Read if it exists — this is the baseline to update.
Read if it exists — extract domain list.
If neither exists, infer domains from directory structure (same logic as setup-harness).
QUALITY_SCORE.mdARCHITECTURE.mdbash
REPO_ROOT=$(git rev-parse --show-toplevel)
REPO_NAME=$(basename $(git remote get-url origin) .git)
ORG=$(git remote get-url origin | sed 's/.*github.com[:/]\([^/]*\).*/\1/')
FULL_REPO="$ORG/$REPO_NAME"
TODAY=$(date +%Y-%m-%d)读取已有的文件——这是需要更新的基准文件。
读取文件(若存在)——提取领域列表。
若两个文件都不存在,则从目录结构推断领域(逻辑与setup-harness相同)。
QUALITY_SCORE.mdARCHITECTURE.md1. Determine Signal Applicability
1. 确定信号适用性
Before grading, determine which signals apply to this repo. Record applicability for the report.
评分前,确定哪些信号适用于当前仓库,并在报告中记录适用性。
Frontend Detection (S2 FlowChad)
前端检测(S2 FlowChad)
bash
HAS_FRONTEND=false
if [ -f "$REPO_ROOT/package.json" ]; then
grep -q '"next"\|"react"\|"vue"\|"angular"\|"svelte"' "$REPO_ROOT/package.json" && HAS_FRONTEND=true
fi
if [ -d "$REPO_ROOT/app" ] || [ -d "$REPO_ROOT/pages" ] || [ -d "$REPO_ROOT/src/components" ]; then
HAS_FRONTEND=true
fiIf : S2 FlowChad is inapplicable — exclude from grade denominator.
HAS_FRONTEND=falsebash
HAS_FRONTEND=false
if [ -f "$REPO_ROOT/package.json" ]; then
grep -q '"next"\|"react"\|"vue"\|"angular"\|"svelte"' "$REPO_ROOT/package.json" && HAS_FRONTEND=true
fi
if [ -d "$REPO_ROOT/app" ] || [ -d "$REPO_ROOT/pages" ] || [ -d "$REPO_ROOT/src/components" ]; then
HAS_FRONTEND=true
fi若:S2 FlowChad 不适用 —— 不计入等级计算分母。
HAS_FRONTEND=falseHookshot Detection (S6)
Hookshot检测(S6)
bash
HOOKSHOT_EXISTS=false
git -C "$REPO_ROOT" log -1 --format="%ci" -- .claude/doc-coverage.json 2>/dev/null | grep -q . && HOOKSHOT_EXISTS=true
[ -f "$REPO_ROOT/.claude/doc-coverage.json" ] && HOOKSHOT_EXISTS=trueS6 is always applicable but the score message differs — see Signal 6 below.
bash
HOOKSHOT_EXISTS=false
git -C "$REPO_ROOT" log -1 --format="%ci" -- .claude/doc-coverage.json 2>/dev/null | grep -q . && HOOKSHOT_EXISTS=true
[ -f "$REPO_ROOT/.claude/doc-coverage.json" ] && HOOKSHOT_EXISTS=trueS6始终适用,但评分说明不同——见下方信号6的说明。
2. Determine Scope
2. 确定扫描范围
PR-triggered mode: Given a PR number, identify which files changed:
bash
undefinedPR触发模式: 给定PR编号,识别变更文件:
bash
undefinedGet changed files from PR
从PR获取变更文件
GH_TOKEN=$GH_TOKEN gh api repos/$FULL_REPO/pulls/{PR_NUMBER}/files
--jq '.[].filename'
--jq '.[].filename'
Map each changed file to its domain using directory prefixes. Only grade domains with changes.
**Full sweep mode:** Grade all domains. Read domain list from `ARCHITECTURE.md` or infer.GH_TOKEN=$GH_TOKEN gh api repos/$FULL_REPO/pulls/{PR_NUMBER}/files
--jq '.[].filename'
--jq '.[].filename'
通过目录前缀将每个变更文件映射到对应的领域,仅对有变更的领域进行评分。
**全面扫描模式:** 对所有领域评分。从`ARCHITECTURE.md`读取领域列表或进行推断。3. Per-Domain Grading
3. 逐领域评分
For each domain in scope:
针对每个范围内的领域:
Signal 1: Doc Coverage
信号1:文档覆盖率
bash
undefinedbash
undefinedIs this domain mentioned in docs/code-structure.md?
该领域是否在docs/code-structure.md中被提及?
grep -i "{domain_name}" $REPO_ROOT/docs/code-structure.md 2>/dev/null && echo "COVERED" || echo "MISSING"
Score: ✅ covered / ❌ missinggrep -i "{domain_name}" $REPO_ROOT/docs/code-structure.md 2>/dev/null && echo "COVERED" || echo "MISSING"
评分:✅ 已覆盖 / ❌ 未覆盖Signal 2: FlowChad Coverage
信号2:FlowChad覆盖率
Skip entirely if . Record as "N/A — no frontend detected" in applicability table.
HAS_FRONTEND=falsebash
undefined若则完全跳过,在适用性表格中记录为"N/A — 未检测到前端"。
HAS_FRONTEND=falsebash
undefinedOnly run if HAS_FRONTEND=true
仅当HAS_FRONTEND=true时运行
if [ "$HAS_FRONTEND" = "true" ]; then
ls $REPO_ROOT/.flowchad/flows/ 2>/dev/null | grep -i "{domain_slug}" && echo "COVERED" || echo "MISSING"
fi
Score (frontend only): ✅ has flow / ❌ no flowif [ "$HAS_FRONTEND" = "true" ]; then
ls $REPO_ROOT/.flowchad/flows/ 2>/dev/null | grep -i "{domain_slug}" && echo "COVERED" || echo "MISSING"
fi
评分(仅前端):✅ 有流程定义 / ❌ 无流程定义Signal 3: Staleness Delta
信号3:过时差值
Find the most recent code commit date for files in this domain:
bash
undefined查找该领域文件的最近代码提交日期:
bash
undefinedLast commit touching domain files
最后一次修改领域文件的提交
git -C $REPO_ROOT log -1 --format="%ci" -- "{domain_directory_glob}" 2>/dev/null
Find the last update date for the domain's doc section:
```bashgit -C $REPO_ROOT log -1 --format="%ci" -- "{domain_directory_glob}" 2>/dev/null
查找该领域文档章节的最近更新日期:
```bashLast commit touching docs/code-structure.md
最后一次修改docs/code-structure.md的提交
git -C $REPO_ROOT log -1 --format="%ci" -- docs/code-structure.md 2>/dev/null
Delta = days between last code commit and last doc update.
Score: ✅ delta ≤30 days / ⚠️ delta 31-60 days (yellow) / ❌ delta >60 daysgit -C $REPO_ROOT log -1 --format="%ci" -- docs/code-structure.md 2>/dev/null
差值 = 上次代码提交与上次文档更新的间隔天数。
评分:✅ 差值 ≤30天 / ⚠️ 差值31-60天(黄色警告) / ❌ 差值>60天Signal 4: Open Issues
信号4:未解决问题
bash
undefinedbash
undefinedOpen issues tagged to this domain (use domain name as label or search term)
标记到该领域的未解决问题(使用领域名称作为标签或搜索词)
GH_TOKEN=$GH_TOKEN gh issue list --repo $FULL_REPO
--state open --search "{domain_name}"
--json number,title | jq length 2>/dev/null || echo "0"
--state open --search "{domain_name}"
--json number,title | jq length 2>/dev/null || echo "0"
Score: ✅ 0-3 open / ⚠️ 4-6 open (yellow) / ❌ >6 openGH_TOKEN=$GH_TOKEN gh issue list --repo $FULL_REPO
--state open --search "{domain_name}"
--json number,title | jq length 2>/dev/null || echo "0"
--state open --search "{domain_name}"
--json number,title | jq length 2>/dev/null || echo "0"
评分:✅ 0-3个未解决 / ⚠️4-6个未解决(黄色警告) / ❌>6个未解决Signal 5: Test Coverage
信号5:测试覆盖率
bash
undefinedbash
undefinedLook for coverage reports
查找覆盖率报告
ls $REPO_ROOT/coverage/ $REPO_ROOT/.nyc_output/ $REPO_ROOT/tmp/coverage/ 2>/dev/null
cat $REPO_ROOT/coverage/index.html 2>/dev/null | grep -o '[0-9.]*%' | head -1
ls $REPO_ROOT/coverage/ $REPO_ROOT/.nyc_output/ $REPO_ROOT/tmp/coverage/ 2>/dev/null
cat $REPO_ROOT/coverage/index.html 2>/dev/null | grep -o '[0-9.]*%' | head -1
Rails: simplecov
Rails项目:使用simplecov
cat $REPO_ROOT/coverage/.last_run.json 2>/dev/null | jq '.result.covered_percent'
If no coverage report is available → skip this signal (treat as neutral, not ❌).
Score: ✅ ≥80% / ⚠️ 60-79% / ❌ <60% (only when coverage data is available)cat $REPO_ROOT/coverage/.last_run.json 2>/dev/null | jq '.result.covered_percent'
若没有可用的覆盖率报告 → 跳过该信号(视为中性,而非❌)。
评分:✅ ≥80% / ⚠️60-79% / ❌<60%(仅当有覆盖率数据时)Signal 6: Hookshot Coverage Staleness
信号6:Hookshot覆盖率过时状态
bash
COVERAGE_DATE=$(git -C $REPO_ROOT log -1 --format="%ci" -- .claude/doc-coverage.json 2>/dev/null)
DOCS_DATE=$(git -C $REPO_ROOT log -1 --format="%ci" -- docs/code-structure.md 2>/dev/null)Distinguish two cases:
-
Hookshot not configured —has never existed (no git history for it, file absent): Score: ❌ "Hookshot not configured — recommend setup"
.claude/doc-coverage.json -
Hookshot stale — file has existed (git history found) but docs were updated more recently: Compute delta days between COVERAGE_DATE and DOCS_DATE. Score: ⚠️ "Hookshot stale by {N} days"
-
Hookshot current — coverage was updated after or same day as docs: Score: ✅ "Hookshot current"
Detection logic:
bash
if [ -z "$COVERAGE_DATE" ] && [ ! -f "$REPO_ROOT/.claude/doc-coverage.json" ]; then
# Never been set up
S6_SCORE="❌"
S6_NOTE="Hookshot not configured — recommend setup"
elif [ -n "$DOCS_DATE" ] && [ -n "$COVERAGE_DATE" ]; then
# Both exist — compare dates
DOCS_EPOCH=$(date -d "$DOCS_DATE" +%s 2>/dev/null || date -j -f "%Y-%m-%d %H:%M:%S %z" "$DOCS_DATE" +%s 2>/dev/null)
COV_EPOCH=$(date -d "$COVERAGE_DATE" +%s 2>/dev/null || date -j -f "%Y-%m-%d %H:%M:%S %z" "$COVERAGE_DATE" +%s 2>/dev/null)
STALE_DAYS=$(( (DOCS_EPOCH - COV_EPOCH) / 86400 ))
if [ "$STALE_DAYS" -gt 0 ]; then
S6_SCORE="⚠️"
S6_NOTE="Hookshot stale by ${STALE_DAYS} days"
else
S6_SCORE="✅"
S6_NOTE="Hookshot current"
fi
else
S6_SCORE="❌"
S6_NOTE="Hookshot not configured — recommend setup"
fibash
COVERAGE_DATE=$(git -C $REPO_ROOT log -1 --format="%ci" -- .claude/doc-coverage.json 2>/dev/null)
DOCS_DATE=$(git -C $REPO_ROOT log -1 --format="%ci" -- docs/code-structure.md 2>/dev/null)区分两种情况:
-
未配置Hookshot ——从未存在(无git历史记录,文件不存在): 评分:❌ "未配置Hookshot — 建议设置"
.claude/doc-coverage.json -
Hookshot过时 —— 文件已存在(有git历史记录),但文档更新时间更近: 计算COVERAGE_DATE与DOCS_DATE的间隔天数。 评分:⚠️ "Hookshot已过时{N}天"
-
Hookshot同步 —— 覆盖率更新时间晚于或等于文档更新时间: 评分:✅ "Hookshot已同步"
检测逻辑:
bash
if [ -z "$COVERAGE_DATE" ] && [ ! -f "$REPO_ROOT/.claude/doc-coverage.json" ]; then
# 从未设置过
S6_SCORE="❌"
S6_NOTE="Hookshot not configured — recommend setup"
elif [ -n "$DOCS_DATE" ] && [ -n "$COVERAGE_DATE" ]; then
# 两者均存在 — 比较日期
DOCS_EPOCH=$(date -d "$DOCS_DATE" +%s 2>/dev/null || date -j -f "%Y-%m-%d %H:%M:%S %z" "$DOCS_DATE" +%s 2>/dev/null)
COV_EPOCH=$(date -d "$COVERAGE_DATE" +%s 2>/dev/null || date -j -f "%Y-%m-%d %H:%M:%S %z" "$COVERAGE_DATE" +%s 2>/dev/null)
STALE_DAYS=$(( (DOCS_EPOCH - COV_EPOCH) / 86400 ))
if [ "$STALE_DAYS" -gt 0 ]; then
S6_SCORE="⚠️"
S6_NOTE="Hookshot stale by ${STALE_DAYS} days"
else
S6_SCORE="✅"
S6_NOTE="Hookshot current"
fi
else
S6_SCORE="❌"
S6_NOTE="Hookshot not configured — recommend setup"
fiCompute Grade
计算等级
Collect only applicable signals. Count failing signals (❌) among applicable signals only:
APPLICABLE_SIGNALS = all signals minus inapplicable ones
FAILING = count of ❌ in APPLICABLE_SIGNALS
YELLOW = count of ⚠️ in APPLICABLE_SIGNALS
SCORE = FAILING + (YELLOW * 0.5), rounded up- SCORE = 0 → A
- SCORE = 1 → B
- SCORE = 2 → C
- SCORE ≥ 3 → D
- No docs at all → F
Example: repo with no frontend (S2 skipped), 5 applicable signals all green → grade A, not B.
仅收集适用信号,统计适用信号中的失败信号(❌)数量:
APPLICABLE_SIGNALS = 所有信号减去不适用的信号
FAILING = APPLICABLE_SIGNALS中❌的数量
YELLOW = APPLICABLE_SIGNALS中⚠️的数量
SCORE = FAILING + (YELLOW * 0.5),向上取整- SCORE = 0 → A
- SCORE = 1 → B
- SCORE = 2 → C
- SCORE ≥3 → D
- 完全无文档 → F
示例:无前端的仓库(跳过S2),5个适用信号全部达标 → 等级为A,而非B。
4. Update QUALITY_SCORE.md
4. 更新QUALITY_SCORE.md
Read the existing file. Update each graded domain's row. Add new domains if discovered.
Preserve existing rows for domains not in scope (only update what was re-scanned).
markdown
undefined读取现有文件,更新每个已评分领域的行。若发现新领域则添加。
保留未在扫描范围内的领域的现有行(仅更新重新扫描的内容)。
markdown
undefinedDomains
Domains
| Domain | Grade | Last audit | Notes |
|---|---|---|---|
| {domain} | {grade} | {TODAY} | {brief note on what's missing, or "All signals green"} |
Write the updated file. Commit with message: `chore: entropy scan — PR #{N} {title} [skip ci]` — the `[skip ci]` tag is **mandatory** to prevent triggering production deploys. Then append to the History section:
```markdown
| {TODAY} | {trigger: PR #{N} / weekly sweep / manual} | {N} domains scanned, {N} regressions, {N} improvements || Domain | Grade | Last audit | Notes |
|---|---|---|---|
| {domain} | {grade} | {TODAY} | {简要说明缺失内容,或"所有信号正常"} |
写入更新后的文件,提交信息为:`chore: entropy scan — PR #{N} {title} [skip ci]` —— `[skip ci]`标签**必须添加**,以避免触发生产部署。然后追加到History部分:
```markdown
| {TODAY} | {触发方式: PR #{N} / 每周扫描 / 手动} | {N}个领域已扫描,{N}个等级下降,{N}个等级提升 |5. Signal Applicability Section
5. 信号适用性部分
Include a "Signal Applicability" table in every report output:
markdown
undefined每份报告输出中都需包含"信号适用性"表格:
markdown
undefinedSignal Applicability
Signal Applicability
| Signal | Applicable? | Reason |
|---|---|---|
| S1 Doc Coverage | Yes | — |
| S2 FlowChad | No | No frontend framework detected (bash/python scripts only) |
| S3 Staleness | Yes | — |
| S4 Open Issues | Yes | — |
| S5 Tests | Yes | No test framework found — recommend adding bats for shell scripts |
| S6 Hookshot | Yes | — |
Populate the Reason column with specifics:
- S2 not applicable: "No frontend framework detected" + what was found (e.g., "bash/python scripts only", "Go/Rails repo")
- S2 applicable: list detected framework (e.g., "Next.js detected in package.json")
- S5 no data: "No coverage report found — signal skipped"
- S5 data found: leave Reason blank or note the coverage percentage
- S6: always applicable; Reason shows the hookshot status detail| Signal | Applicable? | Reason |
|---|---|---|
| S1 Doc Coverage | Yes | — |
| S2 FlowChad | No | No frontend framework detected (bash/python scripts only) |
| S3 Staleness | Yes | — |
| S4 Open Issues | Yes | — |
| S5 Tests | Yes | No test framework found — recommend adding bats for shell scripts |
| S6 Hookshot | Yes | — |
填写Reason列的具体内容:
- S2不适用:"未检测到前端框架" + 实际检测结果(例如:"仅包含bash/python脚本"、"Go/Rails仓库")
- S2适用:列出检测到的框架(例如:"package.json中检测到Next.js")
- S5无数据:"未找到覆盖率报告 — 信号已跳过"
- S5有数据:Reason留空或注明覆盖率百分比
- S6:始终适用;Reason显示Hookshot的状态详情6. Staleness Report
6. 过时报告
For any domain graded C, D, or F — or where grade regressed from previous — output a finding:
undefined对于等级为C、D或F的领域,或等级下降的领域,输出发现结果:
undefinedEntropy Findings — {TODAY}
Entropy Findings — {TODAY}
Regressions (grade dropped)
Regressions (grade dropped)
- {Domain}: {old grade} → {new grade} Missing: {list of failing signals} Last doc update: {date} Last code commit: {date} Delta: {N} days
- {Domain}: {old grade} → {new grade} Missing: {失败信号列表} Last doc update: {date} Last code commit: {date} Delta: {N} days
Stable issues (same low grade)
Stable issues (same low grade)
- {Domain}: {grade} (unchanged since {date}) Missing: {list}
- {Domain}: {grade} (unchanged since {date}) Missing: {列表}
Improvements (grade improved)
Improvements (grade improved)
- {Domain}: {old grade} → {new grade}
- {Domain}: {old grade} → {new grade}
Clean (A or B)
Clean (A or B)
- {Domain}: {grade}
undefined- {Domain}: {grade}
undefined7. Imported Lib Drift (Architecture Check)
7. 导入库偏差(架构检查)
This check moved here from maintenance. It is an architecture signal, not an infra check.
Compare installed speckit commands against the source of truth ():
fellowship-dev/spec-kitbash
undefined此检查已从维护模块移至此处,它属于架构信号,而非基础设施检查。
比较已安装的speckit命令与基准版本():
fellowship-dev/spec-kitbash
undefinedSource of truth: fellowship-dev/spec-kit templates/commands/
基准版本:fellowship-dev/spec-kit templates/commands/
GH_TOKEN=$GH_TOKEN gh api repos/fellowship-dev/spec-kit/contents/templates/commands
--jq '.[].name' 2>/dev/null
--jq '.[].name' 2>/dev/null
GH_TOKEN=$GH_TOKEN gh api repos/fellowship-dev/spec-kit/contents/templates/commands
--jq '.[].name' 2>/dev/null
--jq '.[].name' 2>/dev/null
For each active repo with speckit installed:
针对每个已安装speckit的活跃仓库:
for repo in Lexgo-cl/rails-backend fellowship-dev/booster-pack fellowship-dev/farmesa-v2
fellowship-dev/mtg-lotr fellowship-dev/inbox-angel fellowship-dev/inbox-angel-worker; do echo "=== $repo ===" for cmd in specify plan tasks implement analyze checklist clarify; do SOURCE=$(GH_TOKEN=$GH_TOKEN gh api repos/fellowship-dev/spec-kit/contents/templates/commands/${cmd}.md
--jq '.sha' 2>/dev/null) INSTALLED=$(GH_TOKEN=$GH_TOKEN gh api repos/${repo}/contents/.claude/commands/speckit.${cmd}.md
--jq '.sha' 2>/dev/null) if [ "$SOURCE" != "$INSTALLED" ]; then echo " DRIFT: speckit.${cmd}.md (source: $SOURCE, installed: $INSTALLED)" fi done done
fellowship-dev/mtg-lotr fellowship-dev/inbox-angel fellowship-dev/inbox-angel-worker; do echo "=== $repo ===" for cmd in specify plan tasks implement analyze checklist clarify; do SOURCE=$(GH_TOKEN=$GH_TOKEN gh api repos/fellowship-dev/spec-kit/contents/templates/commands/${cmd}.md
--jq '.sha' 2>/dev/null) INSTALLED=$(GH_TOKEN=$GH_TOKEN gh api repos/${repo}/contents/.claude/commands/speckit.${cmd}.md
--jq '.sha' 2>/dev/null) if [ "$SOURCE" != "$INSTALLED" ]; then echo " DRIFT: speckit.${cmd}.md (source: $SOURCE, installed: $INSTALLED)" fi done done
SHA mismatch = drift. Add drifted repos/commands to the staleness report.
Note: repos may have intentional customizations — flag for review, don't auto-fix.
**inbox-angel-worker exception**: speckit is installed locally and gitignored. Drift sync must be done locally on Spacestation.
Include drift findings in QUALITY_SCORE.md under a `## Tooling` section if any drift is found.for repo in Lexgo-cl/rails-backend fellowship-dev/booster-pack fellowship-dev/farmesa-v2
fellowship-dev/mtg-lotr fellowship-dev/inbox-angel fellowship-dev/inbox-angel-worker; do echo "=== $repo ===" for cmd in specify plan tasks implement analyze checklist clarify; do SOURCE=$(GH_TOKEN=$GH_TOKEN gh api repos/fellowship-dev/spec-kit/contents/templates/commands/${cmd}.md
--jq '.sha' 2>/dev/null) INSTALLED=$(GH_TOKEN=$GH_TOKEN gh api repos/${repo}/contents/.claude/commands/speckit.${cmd}.md
--jq '.sha' 2>/dev/null) if [ "$SOURCE" != "$INSTALLED" ]; then echo " DRIFT: speckit.${cmd}.md (source: $SOURCE, installed: $INSTALLED)" fi done done
fellowship-dev/mtg-lotr fellowship-dev/inbox-angel fellowship-dev/inbox-angel-worker; do echo "=== $repo ===" for cmd in specify plan tasks implement analyze checklist clarify; do SOURCE=$(GH_TOKEN=$GH_TOKEN gh api repos/fellowship-dev/spec-kit/contents/templates/commands/${cmd}.md
--jq '.sha' 2>/dev/null) INSTALLED=$(GH_TOKEN=$GH_TOKEN gh api repos/${repo}/contents/.claude/commands/speckit.${cmd}.md
--jq '.sha' 2>/dev/null) if [ "$SOURCE" != "$INSTALLED" ]; then echo " DRIFT: speckit.${cmd}.md (source: $SOURCE, installed: $INSTALLED)" fi done done
SHA不匹配 = 偏差。将存在偏差的仓库/命令添加到过时报告中。
注意:仓库可能有自定义修改——标记为需要审核,不要自动修复。
**inbox-angel-worker例外**:speckit为本地安装且已加入git忽略,偏差同步需在Spacestation本地完成。
若发现偏差,在QUALITY_SCORE.md的`## Tooling`部分添加偏差发现结果。8. PR-Triggered Output
8. PR触发输出
When triggered by a PR merge event, output a comment-ready summary:
undefined当由PR合并事件触发时,输出可直接作为评论的摘要:
undefinedEntropy Scan — PR #{N} merged
Entropy Scan — PR #{N} merged
Domains affected: {list}
| Domain | Grade | Change | Notes |
|---|---|---|---|
| {domain} | {grade} | {→ or unchanged or ↑ or ↓} | {note} |
{If any regressions:}
⚠️ Doc staleness detected in: {domain list}
Recommended: update docs/code-structure.md for these domains before the next PR in this area.
Include the Signal Applicability table (see step 5) at the end of the comment.Domains affected: {list}
| Domain | Grade | Change | Notes |
|---|---|---|---|
| {domain} | {grade} | {→ 无变化 / ↑ 提升 / ↓ 下降} | {说明} |
{若存在等级下降:}
⚠️ 检测到文档过时领域:{领域列表}
建议:在该领域的下一个PR前更新docs/code-structure.md。
在评论末尾添加信号适用性表格(见步骤5)。9. Full Sweep Output (weekly cron)
9. 全面扫描输出(每周定时任务)
undefinedundefinedEntropy Weekly Sweep — {DATE}
Entropy Weekly Sweep — {DATE}
{N} domains across {REPO_NAME}
{N}个领域(来自{REPO_NAME}仓库)
Grades
Grades
{Full grade table}
{完整等级表格}
Signal Applicability
Signal Applicability
{Signal applicability table}
{信号适用性表格}
Action Items
Action Items
{Domains graded D or F → create a GitHub issue if one doesn't already exist}
For D/F domains, create a GitHub issue in the repo:
```bash
GH_TOKEN=$GH_TOKEN gh issue create \
--repo $FULL_REPO \
--title "Entropy: {domain} docs critically stale (grade {grade})" \
--label "documentation" \
--body "Domain **{domain}** scored **{grade}** in the weekly entropy scan.
**Missing signals:**
{list}
**Last code commit to this domain:** {date}
**Last doc update:** {date}
Fix: update \`docs/code-structure.md\` and run \`/hookshot\` to regenerate hooks."Check for existing open issues before creating (dedup by title prefix).
{等级为D或F的领域 → 若不存在现有未解决问题,则创建GitHub issue}
对于等级为D/F的领域,在仓库中创建GitHub issue:
```bash
GH_TOKEN=$GH_TOKEN gh issue create \
--repo $FULL_REPO \
--title "Entropy: {domain} docs critically stale (grade {grade})" \
--label "documentation" \
--body "Domain **{domain}** 在每周Entropy扫描中获得**{grade}**等级。
**缺失信号:**
{列表}
**该领域最后一次代码提交:** {date}
**最后一次文档更新:** {date}
修复方案:更新\`docs/code-structure.md\`并运行\`/hookshot\`重新生成钩子。"创建前检查是否存在现有未解决问题(通过标题前缀去重)。