🔍 Upkeep Report
Generated 2026-07-06T22:19:33.863Z
The repository is in good overall health: three of six reviewers (spec_flow, duplicate_orphan, visual_icon) found nothing, and the surfaced findings are drift-and-convention issues rather than functional defects. The dominant signal is that the most recent release (PR #22, 'bump 2.1.1' with Marketplace-action support) was applied to canonical artifacts but not carried into the mirror locations CLAUDE.md requires to stay in lockstep. Top priority is closing that propagation gap: (1) restore the plugin-version lockstep by bumping skills/upkeep-audit/.claude-plugin/plugin.json from 2.0.1 to 2.1.1 to match .claude-plugin/marketplace.json (high-confidence, high-severity, single-line fix), and (2) port the English README's new 'Or as a Marketplace action' subsection into all four locale READMEs (ja, ko, zh-CN, zh-TW) in one coordinated change, keeping the wei18/upkeep@v2 YAML byte-identical. A distant third is the low-severity, currently CI-masked JSON-parse convention divergence in src/find-issue.ts, worth reusing readJsonOrNull() but not urgent.
Summary
| Severity |
Count |
| 🔴 High |
1 |
| 🟠 Medium |
4 |
| 🟡 Low |
1 |
| Total |
6 |
Themes
HIGH — The recent 2.1.1 Marketplace-action release was only partially propagated across the locations CLAUDE.md requires to move in lockstep
Five of the six findings trace back to a single systemic root cause: the last release cycle (commit a4e9a7d, PR #22 — 'shorten description under Marketplace 125-char limit; bump 2.1.1') introduced Marketplace-action support and a version bump into the English base and the marketplace manifest, but failed to carry that same change into its mandated mirror locations. Two distinct CLAUDE.md invariants were violated by the same omission: (1) the 5-locale doc-sync rule — README.md gained the '### Or as a Marketplace action' subsection (heading + prose + uses: wei18/upkeep@v2 YAML + requirements note), yet all four locale mirrors (docs/ja, docs/ko, docs/zh-CN, docs/zh-TW) still jump straight from their CI section to their Reviewers section with the block absent; and (2) the plugin-version lockstep rule — .claude-plugin/marketplace.json advanced to 2.1.1 while skills/upkeep-audit/.claude-plugin/plugin.json was left at 2.0.1, exactly one bump behind. In every case the English/canonical artifact moved forward and the mirror did not, so these are not independent defects but the residue of one incomplete propagation.
Files: README.md, docs/ja/README.md, docs/ko/README.md, docs/zh-CN/README.md, docs/zh-TW/README.md, .claude-plugin/marketplace.json, skills/upkeep-audit/.claude-plugin/plugin.json
HIGH — Localized READMEs are missing the new 'Or as a Marketplace action' subsection (5-locale structure drift)
A tighter sub-theme of the incomplete release: the four docs_staleness findings are mechanically distinct files but a single logical gap. Each locale README (ja, ko, zh-CN, zh-TW) omits the identical '### Or as a Marketplace action' block that README.md carries between its CI-automation and Reviewers sections, and in each the grep for 'Marketplace'/'wei18/upkeep@v2' matches only the unrelated plugin-install line. Because CLAUDE.md mandates byte-identical code blocks and the same section structure across all five locales, the remediation is one coordinated change (port the section, keep the YAML untranslated) landed in all four files together — not four independent edits. All four are ssot_direction stale_a (the locales lag the English base), so the base is treated as source of truth here.
Files: README.md, docs/ja/README.md, docs/ko/README.md, docs/zh-CN/README.md, docs/zh-TW/README.md
LOW — find-issue.ts parses JSON without the repo's 'degradation over crashing' guard
A standalone, lower-stakes convention divergence unrelated to the release above. src/find-issue.ts does a bare JSON.parse(readFileSync(...)) with no try/catch, whereas the sibling helper src/finalize.ts (readJsonOrNull) and the CLAUDE.md 'degradation over crashing' convention prescribe wrapping parses and returning a null/empty fallback. The finding is low severity and low confidence because CI currently masks it — .github/actions/report/action.yml writes '[]' on gh failure, so the input is always valid JSON — but the parser still diverges from the documented pattern and would throw on a malformed local input. Grouped alone as it shares no root cause with the release-propagation theme.
Files: src/find-issue.ts, src/finalize.ts
Findings
| Severity |
Conf |
File |
Category |
Reviewers |
Problem |
| high |
high |
skills/upkeep-audit/.claude-plugin/plugin.json |
convention |
convention |
The plugin version is out of lockstep between the two files that CLAUDE.md requires to be bumped together. skills/upkeep-audit/.claude-plugin/plugin.json declares version "2.0.1" while .claude-plugin/marketplace.json declares plugins[].version "2.1.1". |
| medium |
high |
docs/ja/README.md |
i18n_sync |
docs_staleness |
The Japanese README is missing the entire "Or as a Marketplace action" subsection that exists in the English base README. Its headings jump straight from "CI で自動化" to "レビュアー", so the whole wei18/upkeep@v2 step-action usage block (heading + prose + YAML example + requirements note) is absent. |
| medium |
high |
docs/ko/README.md |
i18n_sync |
docs_staleness |
The Korean README is missing the entire "Or as a Marketplace action" subsection present in the English base README; its headings go directly from "CI에서 자동화" to "리뷰어", omitting the wei18/upkeep@v2 step-action usage block. |
| medium |
high |
docs/zh-CN/README.md |
i18n_sync |
docs_staleness |
The Simplified-Chinese README is missing the entire "Or as a Marketplace action" subsection present in the English base README; headings go directly from "在 CI 中自动化" to "审查器", omitting the wei18/upkeep@v2 step-action usage block. |
| medium |
high |
docs/zh-TW/README.md |
i18n_sync |
docs_staleness |
The Traditional-Chinese README is missing the entire "Or as a Marketplace action" subsection present in the English base README; headings go directly from "在 CI 自動化" to "審查員", omitting the wei18/upkeep@v2 step-action usage block. |
| low |
low |
src/find-issue.ts |
convention |
code_hygiene |
find-issue.ts parses JSON with a bare JSON.parse(readFileSync(...)) and no error handling, diverging from the repo's stated 'degradation over crashing' parser convention. |
Full interactive HTML report: open this run → download the report-html artifact (expires 2026-10-04, ~90d).
🔍 Upkeep Report
Generated 2026-07-06T22:19:33.863Z
The repository is in good overall health: three of six reviewers (spec_flow, duplicate_orphan, visual_icon) found nothing, and the surfaced findings are drift-and-convention issues rather than functional defects. The dominant signal is that the most recent release (PR #22, 'bump 2.1.1' with Marketplace-action support) was applied to canonical artifacts but not carried into the mirror locations CLAUDE.md requires to stay in lockstep. Top priority is closing that propagation gap: (1) restore the plugin-version lockstep by bumping skills/upkeep-audit/.claude-plugin/plugin.json from 2.0.1 to 2.1.1 to match .claude-plugin/marketplace.json (high-confidence, high-severity, single-line fix), and (2) port the English README's new 'Or as a Marketplace action' subsection into all four locale READMEs (ja, ko, zh-CN, zh-TW) in one coordinated change, keeping the
wei18/upkeep@v2YAML byte-identical. A distant third is the low-severity, currently CI-masked JSON-parse convention divergence in src/find-issue.ts, worth reusing readJsonOrNull() but not urgent.Summary
Themes
HIGH — The recent 2.1.1 Marketplace-action release was only partially propagated across the locations CLAUDE.md requires to move in lockstep
Five of the six findings trace back to a single systemic root cause: the last release cycle (commit a4e9a7d, PR #22 — 'shorten description under Marketplace 125-char limit; bump 2.1.1') introduced Marketplace-action support and a version bump into the English base and the marketplace manifest, but failed to carry that same change into its mandated mirror locations. Two distinct CLAUDE.md invariants were violated by the same omission: (1) the 5-locale doc-sync rule — README.md gained the '### Or as a Marketplace action' subsection (heading + prose +
uses: wei18/upkeep@v2YAML + requirements note), yet all four locale mirrors (docs/ja, docs/ko, docs/zh-CN, docs/zh-TW) still jump straight from their CI section to their Reviewers section with the block absent; and (2) the plugin-version lockstep rule — .claude-plugin/marketplace.json advanced to 2.1.1 while skills/upkeep-audit/.claude-plugin/plugin.json was left at 2.0.1, exactly one bump behind. In every case the English/canonical artifact moved forward and the mirror did not, so these are not independent defects but the residue of one incomplete propagation.Files:
README.md,docs/ja/README.md,docs/ko/README.md,docs/zh-CN/README.md,docs/zh-TW/README.md,.claude-plugin/marketplace.json,skills/upkeep-audit/.claude-plugin/plugin.jsonHIGH — Localized READMEs are missing the new 'Or as a Marketplace action' subsection (5-locale structure drift)
A tighter sub-theme of the incomplete release: the four docs_staleness findings are mechanically distinct files but a single logical gap. Each locale README (ja, ko, zh-CN, zh-TW) omits the identical '### Or as a Marketplace action' block that README.md carries between its CI-automation and Reviewers sections, and in each the grep for 'Marketplace'/'wei18/upkeep@v2' matches only the unrelated plugin-install line. Because CLAUDE.md mandates byte-identical code blocks and the same section structure across all five locales, the remediation is one coordinated change (port the section, keep the YAML untranslated) landed in all four files together — not four independent edits. All four are ssot_direction stale_a (the locales lag the English base), so the base is treated as source of truth here.
Files:
README.md,docs/ja/README.md,docs/ko/README.md,docs/zh-CN/README.md,docs/zh-TW/README.mdLOW — find-issue.ts parses JSON without the repo's 'degradation over crashing' guard
A standalone, lower-stakes convention divergence unrelated to the release above. src/find-issue.ts does a bare
JSON.parse(readFileSync(...))with no try/catch, whereas the sibling helper src/finalize.ts (readJsonOrNull) and the CLAUDE.md 'degradation over crashing' convention prescribe wrapping parses and returning a null/empty fallback. The finding is low severity and low confidence because CI currently masks it — .github/actions/report/action.yml writes '[]' on gh failure, so the input is always valid JSON — but the parser still diverges from the documented pattern and would throw on a malformed local input. Grouped alone as it shares no root cause with the release-propagation theme.Files:
src/find-issue.ts,src/finalize.tsFindings
skills/upkeep-audit/.claude-plugin/plugin.jsondocs/ja/README.mdwei18/upkeep@v2step-action usage block (heading + prose + YAML example + requirements note) is absent.docs/ko/README.mdwei18/upkeep@v2step-action usage block.docs/zh-CN/README.mdwei18/upkeep@v2step-action usage block.docs/zh-TW/README.mdwei18/upkeep@v2step-action usage block.src/find-issue.tsJSON.parse(readFileSync(...))and no error handling, diverging from the repo's stated 'degradation over crashing' parser convention.Full interactive HTML report: open this run → download the
report-htmlartifact (expires 2026-10-04, ~90d).