From f397216aa0a256c5d7b3fb0a57b50d1cc13835c6 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Sun, 17 May 2026 14:45:41 -0400 Subject: [PATCH] Track legacy localization tail in readiness dashboard --- docs/ECC-2.0-GA-ROADMAP.md | 6 +-- docs/legacy-artifact-inventory.md | 6 ++- docs/stale-pr-salvage-ledger.md | 4 +- scripts/operator-readiness-dashboard.js | 50 +++++++++++++++++-- tests/docs/legacy-artifact-inventory.test.js | 13 ++++- tests/docs/stale-pr-salvage-ledger.test.js | 7 ++- .../operator-readiness-dashboard.test.js | 28 ++++++++++- 7 files changed, 101 insertions(+), 13 deletions(-) diff --git a/docs/ECC-2.0-GA-ROADMAP.md b/docs/ECC-2.0-GA-ROADMAP.md index 315ea921..81756308 100644 --- a/docs/ECC-2.0-GA-ROADMAP.md +++ b/docs/ECC-2.0-GA-ROADMAP.md @@ -324,8 +324,8 @@ As of 2026-05-17: and classifies `legacy-command-shims/` as an opt-in archive/no-action surface. - `docs/stale-pr-salvage-ledger.md` records stale PR salvage outcomes, - skipped PRs, superseded work, and the remaining #1687 translator/manual - review tail. + skipped PRs, superseded work, and the remaining #1687, #1609, #1563, #1564, + and #1565 translator/manual review tail now attached to Linear ITO-55. - AgentShield PR #53 reduced two context-rule false positives and closed the remaining AgentShield issues. - AgentShield PR #55 added GitHub Action organization-policy enforcement with @@ -625,7 +625,7 @@ is not complete unless the evidence column exists and has been freshly verified. | Keep public issues below 20 | Repo-family issue recheck | 0 open issues across `everything-claude-code`, AgentShield, JARVIS, `ECC-Tools/ECC-Tools`, and `ECC-Tools/ECC-website` on 2026-05-17; #1951 closed with #1953 | Complete | | Manage repository discussions | Repo-family discussion recheck | Platform audit reports 0 discussion maintainer-touch gaps and 0 answerable Q&A missing accepted answers; trunk still has 58 total discussions | Complete | | Manage PR discussions | PR review/comment closure plus merge/close state | ECC #1961, #1963, and #1953 merged after maintainer validation; no open tracked PRs remain | Complete | -| Salvage useful stale work | `docs/stale-pr-salvage-ledger.md` | Ledger records salvaged, superseded, skipped, and manual-review tails; #1815-#1818 added cost tracking, skill scout, frontend design guidance, code-reviewer false-positive guardrails, and the May 12 gap pass | Complete except translation/manual review tail | +| Salvage useful stale work | `docs/stale-pr-salvage-ledger.md` plus `docs/legacy-artifact-inventory.md` | Ledger records salvaged, superseded, skipped, and manual-review tails; #1815-#1818 added cost tracking, skill scout, frontend design guidance, code-reviewer false-positive guardrails, and the May 12 gap pass; #1687, #1609, #1563, #1564, and #1565 localization tails are attached to Linear ITO-55 for language-owner review and no automatic import remains release-blocking | Complete; repeat legacy scan before release | | ECC 2.0 preview pack ready | Release docs, quickstart, publication readiness, release notes | `docs/releases/2.0.0-rc.1/` and readiness docs are in-tree; May 17 evidence records queue-zero state, localized docs merge, supply-chain recheck, lint/test/security gates, operator dashboard, and successful GitHub CI on `99dd6ac0` | Needs final clean-checkout release approval | | Hermes specialized skills included safely | Hermes setup/import docs and sanitized skill surface | Hermes setup and import playbook are public; secrets stay local | Needs final release review | | Naming and rename readiness | Naming matrix across package/plugin/docs/social surfaces | `docs/releases/2.0.0-rc.1/naming-and-publication-matrix.md` records current package, repo, Claude plugin, Codex plugin, OpenCode, and npm availability evidence | Complete for rc.1; post-rc rename remains future work | diff --git a/docs/legacy-artifact-inventory.md b/docs/legacy-artifact-inventory.md index d7ec91d1..739fe3ee 100644 --- a/docs/legacy-artifact-inventory.md +++ b/docs/legacy-artifact-inventory.md @@ -54,7 +54,11 @@ Expected result: | `_legacy-documents-*` directories | Archive/no-action | No matching directories exist in the tracked checkout as of 2026-05-12. | Re-run the scan before release. If any appear, add each directory to this table before publishing. | | `legacy-command-shims/` | Archive/no-action | `legacy-command-shims/README.md` states these retired short-name shims are opt-in and no longer loaded by the default plugin command surface. | Keep as an explicit compatibility archive. Do not move these back into the default plugin surface without a migration decision. | | Closed-stale PR salvage ledger | Landed | `docs/stale-pr-salvage-ledger.md` records useful stale work recovered through maintainer PRs. | Continue using the ledger pattern for future stale closures. | -| #1687 zh-CN localization tail | Translator/manual review | Large safe subsets landed in #1746-#1752; remaining pieces require translator/manual review per salvage ledger. | Do not blindly cherry-pick. Split by docs, commands, agents, and skills if a translator review lane opens. | +| #1687 zh-CN localization tail | Translator/manual review | Large safe subsets landed in #1746-#1752; remaining pieces are attached to Linear ITO-55 for language-owner review. | Do not blindly cherry-pick. Split by docs, commands, agents, and skills if a translator review lane opens; no automatic import remains release-blocking. | +| #1609 Persian README translation | Translator/manual review | Recorded in the stale salvage ledger and attached to Linear ITO-55 for language-owner review. | Do not import stale README/version/count text without a Persian reviewer and a current catalog refresh. | +| #1563 zh-TW README sync | Translator/manual review | Recorded in the stale salvage ledger and attached to Linear ITO-55 for language-owner review. | Do not import stale README/version/count text without a zh-TW reviewer and a current catalog refresh. | +| #1564 Turkish README sync | Translator/manual review | Recorded in the stale salvage ledger and attached to Linear ITO-55 for language-owner review. | Do not import stale README/version/count text without a Turkish reviewer and a current catalog refresh. | +| #1565 pt-BR README sync | Translator/manual review | Recorded in the stale salvage ledger and attached to Linear ITO-55 for language-owner review. | Do not import stale README/version/count text without a pt-BR reviewer and a current catalog refresh. | ## Workspace-Level Legacy Repos diff --git a/docs/stale-pr-salvage-ledger.md b/docs/stale-pr-salvage-ledger.md index 062bbd9d..c79d50eb 100644 --- a/docs/stale-pr-salvage-ledger.md +++ b/docs/stale-pr-salvage-ledger.md @@ -122,7 +122,9 @@ porting. ## Remaining Manual-Review Backlog The remaining plausibly useful backlog is translation/localization work that is -unsafe to auto-port without language-owner review: +unsafe to auto-port without language-owner review. This tail is attached to +Linear ITO-55 and is not a release-blocking salvage task; release work should +only verify that the backlog remains recorded and excluded from blind imports: - #1687 zh-CN localization tail - #1609 Persian README translation diff --git a/scripts/operator-readiness-dashboard.js b/scripts/operator-readiness-dashboard.js index 8554fbd2..014dad93 100644 --- a/scripts/operator-readiness-dashboard.js +++ b/scripts/operator-readiness-dashboard.js @@ -243,6 +243,14 @@ function includesAll(text, needles) { return needles.every(needle => text.includes(needle)); } +const LOCALIZATION_MANUAL_REVIEW_TAIL = [ + '#1687 zh-CN localization tail', + '#1609 Persian README translation', + '#1563 zh-TW README sync', + '#1564 Turkish README sync', + '#1565 pt-BR README sync', +]; + function hasLegacySalvageTracking({ stalePrSalvage, legacyInventory, roadmap }) { return stalePrSalvage.includes('Manual review tail') || stalePrSalvage.includes('Remaining Manual-Review Backlog') @@ -251,6 +259,39 @@ function hasLegacySalvageTracking({ stalePrSalvage, legacyInventory, roadmap }) || roadmap.includes('ITO-55'); } +function hasAttachedLegacyManualReviewTail({ stalePrSalvage, legacyInventory, roadmap }) { + return stalePrSalvage.includes('Linear ITO-55') + && legacyInventory.includes('ITO-55') + && roadmap.includes('ITO-55') + && LOCALIZATION_MANUAL_REVIEW_TAIL.every(item => ( + stalePrSalvage.includes(item) && legacyInventory.includes(item) + )); +} + +function legacySalvageStatus(context) { + if (hasAttachedLegacyManualReviewTail(context)) { + return 'current'; + } + + return hasLegacySalvageTracking(context) ? 'in_progress' : 'not_complete'; +} + +function legacySalvageEvidence(context) { + if (hasAttachedLegacyManualReviewTail(context)) { + return 'legacy salvage ledger and inventory are current; all localization tails are attached to Linear ITO-55 for manual language-owner review'; + } + + return 'legacy salvage ledger and ITO-55 tracking are present'; +} + +function legacySalvageGap(context) { + if (hasAttachedLegacyManualReviewTail(context)) { + return 'repeat legacy scan before release'; + } + + return 'final translation/manual-review tail remains'; +} + function hasAgentShieldEnterpriseTracking(roadmap) { return roadmap.includes('AgentShield Enterprise Iteration') && ( @@ -396,6 +437,7 @@ function buildRequirements(rootDir, platformReport) { const supplyChainWorkflow = readText(rootDir, '.github/workflows/supply-chain-watch.yml'); const packageJson = readPackage(rootDir); const scripts = packageJson.scripts || {}; + const legacyContext = { stalePrSalvage, legacyInventory, roadmap }; const githubLive = !platformReport.github.skipped && platformReport.github.totals.errors === 0; const queuesCurrent = githubLive @@ -518,11 +560,9 @@ function buildRequirements(rootDir, platformReport) { 'legacy-salvage', 'Audit, prune, or attach legacy work', 'docs/stale-pr-salvage-ledger.md and legacy inventory', - hasLegacySalvageTracking({ stalePrSalvage, legacyInventory, roadmap }) - ? 'in_progress' - : 'not_complete', - 'legacy salvage ledger and ITO-55 tracking are present', - 'final translation/manual-review tail remains' + legacySalvageStatus(legacyContext), + legacySalvageEvidence(legacyContext), + legacySalvageGap(legacyContext) ), buildRequirement( 'linear-roadmap-and-progress', diff --git a/tests/docs/legacy-artifact-inventory.test.js b/tests/docs/legacy-artifact-inventory.test.js index 8a349741..60398d17 100644 --- a/tests/docs/legacy-artifact-inventory.test.js +++ b/tests/docs/legacy-artifact-inventory.test.js @@ -131,9 +131,20 @@ test('legacy command shim table tracks the current archive contents', () => { test('stale salvage backlog records the remaining manual-review tail', () => { const source = read('docs/legacy-artifact-inventory.md'); - assert.ok(source.includes('#1687 zh-CN localization tail')); + for (const pr of [ + '#1687 zh-CN localization tail', + '#1609 Persian README translation', + '#1563 zh-TW README sync', + '#1564 Turkish README sync', + '#1565 pt-BR README sync', + ]) { + assert.ok(source.includes(pr), `Missing manual-review inventory row for ${pr}`); + } + assert.ok(source.includes('Translator/manual review')); assert.ok(source.includes('#1746-#1752')); + assert.ok(source.includes('ITO-55')); + assert.ok(source.includes('no automatic import remains release-blocking')); }); if (failed > 0) { diff --git a/tests/docs/stale-pr-salvage-ledger.test.js b/tests/docs/stale-pr-salvage-ledger.test.js index d4a8fc62..18d23c44 100644 --- a/tests/docs/stale-pr-salvage-ledger.test.js +++ b/tests/docs/stale-pr-salvage-ledger.test.js @@ -88,7 +88,9 @@ test('stale PR salvage ledger keeps localization tails manual-review only', () = assert.ok(source.includes('#1609 Persian README translation')); assert.ok(source.includes('#1563 zh-TW README sync')); assert.ok(source.includes('translator/manual review')); + assert.ok(source.includes('Linear ITO-55')); assert.ok(source.includes('Do not import stale top-level docs')); + assert.ok(source.includes('not a release-blocking salvage task')); }); test('legacy inventory and roadmap link to the durable salvage ledger', () => { @@ -97,7 +99,10 @@ test('legacy inventory and roadmap link to the durable salvage ledger', () => { assert.ok(inventory.includes('docs/stale-pr-salvage-ledger.md')); assert.ok(roadmap.includes('docs/stale-pr-salvage-ledger.md')); - assert.ok(roadmap.includes('#1687 translator/manual')); + assert.ok(roadmap.includes('#1687, #1609, #1563, #1564')); + assert.ok(roadmap.includes('Linear ITO-55')); + assert.ok(roadmap.includes('#1609')); + assert.ok(roadmap.includes('no automatic import remains release-blocking')); }); test('stale PR salvage ledger records the May 12 gap pass', () => { diff --git a/tests/scripts/operator-readiness-dashboard.test.js b/tests/scripts/operator-readiness-dashboard.test.js index 401edcbf..90ad074b 100644 --- a/tests/scripts/operator-readiness-dashboard.test.js +++ b/tests/scripts/operator-readiness-dashboard.test.js @@ -77,7 +77,26 @@ function seedRepo(rootDir, overrides = {}) { ].join('\n'), 'docs/HERMES-SETUP.md': 'Hermes setup', 'skills/hermes-imports/SKILL.md': 'Hermes imports', - 'docs/stale-pr-salvage-ledger.md': 'Manual review tail', + 'docs/stale-pr-salvage-ledger.md': [ + 'Remaining Manual-Review Backlog', + 'Linear ITO-55', + '#1687 zh-CN localization tail', + '#1609 Persian README translation', + '#1563 zh-TW README sync', + '#1564 Turkish README sync', + '#1565 pt-BR README sync', + 'not a release-blocking salvage task' + ].join('\n'), + 'docs/legacy-artifact-inventory.md': [ + 'Translator/manual review', + 'ITO-55', + '#1687 zh-CN localization tail', + '#1609 Persian README translation', + '#1563 zh-TW README sync', + '#1564 Turkish README sync', + '#1565 pt-BR README sync', + 'no automatic import remains release-blocking' + ].join('\n'), 'docs/architecture/progress-sync-contract.md': 'GitHub PRs/issues/discussions Linear project local handoff repo roadmap scripts/work-items.js', 'docs/architecture/observability-readiness.md': 'observability-readiness.js', 'docs/security/supply-chain-incident-response.md': 'TanStack Mini Shai-Hulud node-ipc scan-supply-chain-iocs.js supply-chain-advisory-sources.js', @@ -214,7 +233,14 @@ function runTests() { && item.evidence.includes('unsupported npm age-key drift') && item.gap === 'repeat advisory/source refresh and Linear sync after each significant supply-chain batch' ))); + assert.ok(report.requirements.some(item => ( + item.id === 'legacy-salvage' + && item.status === 'current' + && item.evidence.includes('all localization tails are attached to Linear ITO-55') + && item.gap === 'repeat legacy scan before release' + ))); assert.ok(report.top_actions.some(item => item.id === 'naming-and-plugin-publication')); + assert.ok(!report.top_actions.some(item => item.id === 'legacy-salvage')); } finally { cleanup(rootDir); }