diff --git a/openspec/changes/2026-10-06-product-decision-convergence/design.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/design.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/design.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/design.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T01.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T01.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T01.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T01.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T02.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T02.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T02.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T02.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T03.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T03.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T03.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T03.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T04.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T04.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T04.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T04.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T05.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T05.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T05.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T05.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T06.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T06.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T06.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T06.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T07.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T07.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T07.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T07.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T08.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T08.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T08.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T08.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T09.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T09.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T09.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T09.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T10.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T10.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T10.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T10.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T11.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T11.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T11.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T11.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T13.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T13.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T13.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T13.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/evidence/T14.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T14.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/evidence/T14.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/evidence/T14.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/loop.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/loop.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/loop.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/loop.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/pr-description.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/pr-description.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/pr-description.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/pr-description.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/proposal.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/proposal.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/proposal.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/proposal.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-fitness.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-fitness.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-fitness.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-fitness.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-GLM-5.3-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-Flash-Next-adversarial.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-Flash-Next-adversarial.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-Flash-Next-adversarial.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/leg-Qwen3.8-Flash-Next-adversarial.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-1/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-Flash-Next-adversarial.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-Flash-Next-adversarial.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-Flash-Next-adversarial.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/leg-Qwen3.8-Flash-Next-adversarial.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/B-branch/round-2/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-GLM-5.3-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-GLM-5.3-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-GLM-5.3-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-GLM-5.3-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T01/round-2/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T02/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T03/round-2/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T04/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T05/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T06/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T07/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T08/round-2/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T09/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/leg-GLM-5.3-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/leg-GLM-5.3-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/leg-GLM-5.3-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/leg-GLM-5.3-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T10/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T11/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/L-tasks/T13/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-adversarial.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-adversarial.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-adversarial.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-adversarial.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-DeepSeek-V4.1-Flash-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-GLM-5.3-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-GLM-5.3-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-GLM-5.3-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-GLM-5.3-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-adversarial.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-adversarial.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-adversarial.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-adversarial.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/leg-Qwen3.8-Flash-Next-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/legs.log b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/legs.log similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/legs.log rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/legs.log diff --git a/openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/register.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/register.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/register.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/reviews/R-spec-set/round-2/register.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/specs/backend-pool/spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/specs/backend-pool/spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/specs/backend-pool/spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/specs/backend-pool/spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/specs/export-annotations/spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/specs/export-annotations/spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/specs/export-annotations/spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/specs/export-annotations/spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/specs/git-engine/spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/specs/git-engine/spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/specs/git-engine/spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/specs/git-engine/spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/specs/target-status/spec.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/specs/target-status/spec.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/specs/target-status/spec.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/specs/target-status/spec.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/task-prompt.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/task-prompt.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/task-prompt.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/task-prompt.md diff --git a/openspec/changes/2026-10-06-product-decision-convergence/tasks.md b/openspec/changes/archive/2026-10-06-product-decision-convergence/tasks.md similarity index 100% rename from openspec/changes/2026-10-06-product-decision-convergence/tasks.md rename to openspec/changes/archive/2026-10-06-product-decision-convergence/tasks.md diff --git a/openspec/changes/dead-exported-surface/.openspec.yaml b/openspec/changes/archive/2026-10-25-dead-exported-surface/.openspec.yaml similarity index 100% rename from openspec/changes/dead-exported-surface/.openspec.yaml rename to openspec/changes/archive/2026-10-25-dead-exported-surface/.openspec.yaml diff --git a/openspec/changes/dead-exported-surface/evidence/T1.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T1.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T1.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T1.md diff --git a/openspec/changes/dead-exported-surface/evidence/T10.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T10.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T10.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T10.md diff --git a/openspec/changes/dead-exported-surface/evidence/T2.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T2.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T2.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T2.md diff --git a/openspec/changes/dead-exported-surface/evidence/T3.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T3.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T3.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T3.md diff --git a/openspec/changes/dead-exported-surface/evidence/T4.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T4.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T4.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T4.md diff --git a/openspec/changes/dead-exported-surface/evidence/T5.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T5.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T5.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T5.md diff --git a/openspec/changes/dead-exported-surface/evidence/T6.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T6.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T6.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T6.md diff --git a/openspec/changes/dead-exported-surface/evidence/T7.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T7.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T7.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T7.md diff --git a/openspec/changes/dead-exported-surface/evidence/T8.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T8.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T8.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T8.md diff --git a/openspec/changes/dead-exported-surface/evidence/T9.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T9.md similarity index 100% rename from openspec/changes/dead-exported-surface/evidence/T9.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/evidence/T9.md diff --git a/openspec/changes/dead-exported-surface/loop.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/loop.md similarity index 100% rename from openspec/changes/dead-exported-surface/loop.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/loop.md diff --git a/openspec/changes/dead-exported-surface/proposal.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/proposal.md similarity index 100% rename from openspec/changes/dead-exported-surface/proposal.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/proposal.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-DeepSeek-V4.1-Flash-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-GLM-5.3-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-GLM-5.3-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-GLM-5.3-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-GLM-5.3-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-GLM-5.3-fitness.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-GLM-5.3-fitness.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-GLM-5.3-fitness.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-GLM-5.3-fitness.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-GLM-5.3-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-GLM-5.3-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-GLM-5.3-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-GLM-5.3-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-2.4T-A95B-NVFP4-spec.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/leg-Qwen3.8-Flash-Next-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/B/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/B/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/B/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/B/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T1/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T1/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T1/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T1/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T1/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T1/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T1/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T1/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T1/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T10/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T10/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T10/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T10/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T10/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T10/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T10/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T10/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T10/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T10/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T10/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T10/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T2/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T2/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T2/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T2/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T2/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T2/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T2/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T2/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T2/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T3/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T3/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T3/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T3/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T3/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T3/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T3/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T3/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T3/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T4/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T4/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T4/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T4/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T4/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T4/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T4/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T4/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T4/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T5/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T5/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T5/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T5/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T5/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T5/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T5/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T5/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T5/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T6/round-2/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T6/round-2/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T7/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T7/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T7/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T7/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T7/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T7/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T7/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T7/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T7/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T8/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T8/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T8/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T8/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T8/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T8/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T8/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T8/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T8/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T8/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T8/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T8/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T9/leg-DeepSeek-V4.1-Flash-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/leg-DeepSeek-V4.1-Flash-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T9/leg-DeepSeek-V4.1-Flash-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/leg-DeepSeek-V4.1-Flash-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T9/leg-Qwen3.8-Flash-Next-diff.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/leg-Qwen3.8-Flash-Next-diff.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T9/leg-Qwen3.8-Flash-Next-diff.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/leg-Qwen3.8-Flash-Next-diff.md diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T9/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T9/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/L-tasks/T9/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/L-tasks/T9/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/L-tasks/T9/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-spec.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-spec.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-spec.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-DeepSeek-V4.1-Flash-spec.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/leg-GLM-5.3-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-GLM-5.3-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/leg-GLM-5.3-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-GLM-5.3-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/leg-GLM-5.3-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-GLM-5.3-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/leg-GLM-5.3-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-GLM-5.3-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-spec.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-spec.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-spec.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/leg-Qwen3.8-Flash-Next-spec.md diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/R-round2/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R-round2/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R-round2/register.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-spec.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-spec.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-spec.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-DeepSeek-V4.1-Flash-spec.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/leg-GLM-5.3-adversarial.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-GLM-5.3-adversarial.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/leg-GLM-5.3-adversarial.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-GLM-5.3-adversarial.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/leg-GLM-5.3-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-GLM-5.3-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/leg-GLM-5.3-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-GLM-5.3-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-security.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-security.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-security.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-security.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-spec.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-spec.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-spec.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/leg-Qwen3.8-Flash-Next-spec.md diff --git a/openspec/changes/dead-exported-surface/reviews/R/legs.log b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/legs.log similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/legs.log rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/legs.log diff --git a/openspec/changes/dead-exported-surface/reviews/R/register.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/register.md similarity index 100% rename from openspec/changes/dead-exported-surface/reviews/R/register.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/reviews/R/register.md diff --git a/openspec/changes/dead-exported-surface/task-prompt.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/task-prompt.md similarity index 100% rename from openspec/changes/dead-exported-surface/task-prompt.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/task-prompt.md diff --git a/openspec/changes/dead-exported-surface/tasks.md b/openspec/changes/archive/2026-10-25-dead-exported-surface/tasks.md similarity index 100% rename from openspec/changes/dead-exported-surface/tasks.md rename to openspec/changes/archive/2026-10-25-dead-exported-surface/tasks.md diff --git a/openspec/changes/ci-workflow-hardening/evidence/post-merge.md b/openspec/changes/ci-workflow-hardening/evidence/post-merge.md new file mode 100644 index 000000000..2d3ef707c --- /dev/null +++ b/openspec/changes/ci-workflow-hardening/evidence/post-merge.md @@ -0,0 +1,190 @@ +# Evidence — ci-workflow-hardening (post-merge rows) + +Recorded 2026-10-25 against `PlatformRelay/Kollect` after #450 merged (2026-10-06, +`3ee21266`). Every row below cites real GitHub Actions runs; all calls are read-only except +the one throwaway probe PR in the CWS-3 section, which was closed unmerged and its branch +deleted. + +## CWS-1 — `workflow-security` green on real PR heads + +```bash +gh pr checks 494 -R PlatformRelay/Kollect | grep workflow-security +gh pr checks 495 -R PlatformRelay/Kollect | grep workflow-security +gh api repos/PlatformRelay/Kollect/actions/runs/ -q '[.id,.event,.head_sha,.conclusion]|@tsv' +``` + +| PR | PR head | CI run | event | `workflow-security` | +| --- | --- | --- | --- | --- | +| #494 | `13c70fb568d98f9cf8f2684fa5e21ef261d61c91` | 40223387529 | `pull_request` | pass (job 121259583355) | +| #495 | `6e18b5abee9dcb5b84bc3ef4c7052697825b9d6b` | 40227161572 | `pull_request` | pass (job 121270924131) | + +Each run's `head_sha` equals the PR head, so the job ran on the PR head, not on a merge +commit. The red side (template-injection fixture, no-`--offline` and skip-switch mutants) is +in `evidence.md`. + +**Result: pass.** + +## CWS-3 / task 4.2 — `dependency-review` red on a disallowed licence and on a vulnerable module + +```bash +gh api --allow-escape-sequences repos/PlatformRelay/Kollect/actions/jobs//logs \ + | sed -e 's/\x1b\[[0-9;]*m//g' | grep -E 'incompatible|vulnerab|License:|GHSA|##\[error\]' +``` + +### Disallowed licence (real PRs, no probe needed) + +| PR | Run / job | Dependency flagged | Log line | +| --- | --- | --- | --- | +| #470 | 39170622155 / 117802707914 | `go-task/setup-task@a00fbb05…` (Action) | `License: GPL-3.0` → `Dependency review detected incompatible licenses.` | +| #489 (Dependabot, open) | 39987119032 / 120529075026 | `pillow@13.0.0` (docs) | `License: MIT-CMU` → `Dependency review detected incompatible licenses.` | +| #457 (Dependabot) | 37910176591 / 113753166938 | `cairosvg@2.9.1` (docs) | `License: LGPL-3.0-or-later` | +| #456 | 37907543188 / 113744549550 | `golang.org/x/net@0.60.0` | `BSD-3-Clause AND LicenseRef-scancode-google-patent-license-golang` | + +In every one of these runs the Vulnerabilities group reports `did not detect any vulnerable +packages`, so the red is the licence policy alone. Each of the last three was resolved with a +package-scoped `allow-dependencies-licenses` exception (with a reason in `ci.yaml`), not by +widening `allow-licenses`; #489 is still red today. + +### Vulnerable module (throwaway probe) + +No real PR had gone red on a vulnerability, so one throwaway draft PR was opened: + +- PR #496, branch `probe/dependency-review-vulnerable`, one commit `a9c1adca` that pins + `golang.org/x/net` back from v0.60.0 to v0.17.0 in `go.mod` (no other change; x/net's licence + is already excepted, so only the vulnerability check can fire). +- Run 40231428226 (`pull_request`, head `a9c1adcadb04083a79d6022a15276913b43760c2`), + `dependency-review` job 121283803587: **fail**. + +```text +go.mod » golang.org/x/net@0.17.0 – net/http, x/net/http2: close connections when receiving too many headers (moderate severity) + ↪ https://github.com/advisories/GHSA-4v7x-pqxf-cx7m +go.mod » golang.org/x/net@0.17.0 – HTTP Proxy bypass using IPv6 Zone IDs in golang.org/x/net (moderate severity) + ↪ https://github.com/advisories/GHSA-qxp5-gwg8-xv66 +go.mod » golang.org/x/net@0.17.0 – golang.org/x/net vulnerable to Cross-site Scripting (moderate severity) + ↪ https://github.com/advisories/GHSA-vvgc-356p-c3xw +go.mod » golang.org/x/net@0.17.0 – Go Net HTML parser is vulnerable to denial of service (moderate severity) + ↪ https://github.com/advisories/GHSA-5cv4-jp36-h3mw +##[error]Dependency review detected vulnerable packages. +``` + +PR #496 was closed without merging and its branch deleted (`gh pr close 496 --delete-branch`). + +**Result: pass** — red on a disallowed licence (#470, #489) and on a vulnerable module (#496). + +## CWS-4 — a newer push cancels the PR's in-flight run + +`ci.yaml` groups by `${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}` +with `cancel-in-progress: ${{ github.event_name == 'pull_request' }}`. + +```bash +gh run list -R PlatformRelay/Kollect --workflow ci.yaml --event pull_request \ + --json databaseId,headBranch,headSha,conclusion,createdAt +gh api repos/PlatformRelay/Kollect/check-runs/121263420724/annotations -q '.[].message' +``` + +PR #495 (`docs/archive-synced-debounce-condition`), three pushes: + +| Run | Head | Started | Ended | Conclusion | +| --- | --- | --- | --- | --- | +| 40224677510 | `f8a96158` | 19:09:29Z | 19:20:50Z | cancelled | +| 40225572307 | `1f5a0487` | 19:20:34Z | 19:40:59Z | cancelled | +| 40227161572 | `6e18b5ab` | 19:40:41Z | — | success | + +Each run ends seconds after the next push's run starts. The cancelled job in run 40224677510 +carries the annotation `Canceling since a higher priority waiting request for CI-495 exists`, +naming the PR-keyed group. + +**Result: pass.** + +## CWS-4 — quick successive merges to `main` each get their own run + +The five merges of 2026-10-25 landed within about two and a half hours (17:29 to 20:05 +UTC). Filtered by `headSha` (not `--commit`, which can return zero rows): + +```bash +gh run list -R PlatformRelay/Kollect --workflow ci.yaml --branch main --limit 60 \ + --json databaseId,headSha,event,conclusion +gh run list -R PlatformRelay/Kollect --workflow e2e-smoke.yaml --branch main --limit 40 \ + --json databaseId,headSha,event,conclusion +``` + +| Merge | Committed (UTC) | `CI` run | `e2e-smoke` run | +| --- | --- | --- | --- | +| `d2ba2edbb` | 17:29:34 | 40216722422 push success | 40216722466 push success | +| `556f70d1f` | 18:42:33 | 40222532916 push success | 40222532873 push success | +| `44f7a240a` | 19:14:25 | 40225080731 push success | 40225080828 push success | +| `1353f7772` | 19:38:09 | 40226966266 push success | 40226966351 push success | +| `463c9401f` | 20:05:28 | 40229120503 push success | 40229120473 push success | + +Every SHA has exactly one push run of each workflow and none was cancelled. + +**Result: pass.** + +## CWS-6 / task 5.1 — required checks in `protect-main` + +```bash +gh api repos/PlatformRelay/Kollect/rulesets/18802410 \ + -q '.rules[]|select(.type=="required_status_checks")|.parameters.required_status_checks[].context' +gh api repos/PlatformRelay/Kollect/rulesets/18802410/history/ -q '.updated_at' +``` + +Ten required contexts today: `preflight`, `test`, `kind-smoke`, `Analyze (Go)`, `lint`, +`workflow-security`, `dependency-review`, `tool-pins-selftest`, `vulncheck`, `breaking-marker`. +The ruleset history shows when the four came in: `lint`, `workflow-security` and +`dependency-review` in version 53247538 (2026-10-15), `vulncheck` in version 53474785 +(2026-10-16). + +**Ruleset half: pass.** + +### Skipped required job counts as passing — not proven + +Which required jobs can be skipped on a PR: + +- `test` and `kind-smoke` are `if: always()` aggregators; `lint`, `workflow-security`, + `tool-pins-selftest`, `preflight`, `breaking-marker` and `Analyze (Go)` have no job-level + `if:`; `dependency-review` is `if: github.event_name == 'pull_request'`, so it always runs on + a PR. +- `vulncheck` is `if: needs.changes.outputs.code == 'true'`, so it **is skipped on every + docs-only PR**. + +Observed on real PRs (`gh pr checks `, and GraphQL `isRequired(pullRequestNumber:)`): + +- #489 (Dependabot, docs-only, open): `vulncheck=SKIPPED` while required (run 39987119032). + The PR is also blocked by the red `dependency-review`, so its merge state cannot show + whether the skipped `vulncheck` alone would block. +- #462 (docs-only): `vulncheck` skipped and the merge (`0c1456b5`, 2026-10-14) passed the + ruleset (rule suite 4517903794, `pass`), but `vulncheck` only became required on + 2026-10-16, so that merge is no proof either. +- A scan of every PR merged from 2026-07-17 (first ruleset version with required checks) to + 2026-10-25 found no other merged PR with a skipped check that was required at merge time. + +So the case is real (docs-only PRs skip a required job), but no observation yet shows GitHub +treating that skipped job as passing. The probe stays open until a docs-only PR with +otherwise green checks reaches a mergeable state (or does not). + +**Result: open.** Task 5.1 stays unticked. + +## Task 5.2 — `require_extra_approval_for_unattributed_changes` + +```bash +gh api repos/PlatformRelay/Kollect/rulesets/18802410 \ + -q '.rules[]|select(.type=="pull_request")|.parameters' +gh api "repos/PlatformRelay/Kollect/rulesets/rule-suites?ref=refs/heads/main&time_period=month" +``` + +The `pull_request` rule has `require_extra_approval_for_unattributed_changes: true`, with +`required_approving_review_count: 0`, `require_last_push_approval: false` and +`allowed_merge_methods: ["rebase"]`. + +It has not affected bot PRs in practice. Each of these merged with zero reviews and its push to +`main` evaluated as `pass` (not `bypass`) in the rule-suite log: + +| PR | Author of the commits | Merge | Rule suite | +| --- | --- | --- | --- | +| #475 (Renovate, Go toolchain digest) | `renovate-bot ` | `cf448c4a` | 4618177030 pass | +| #476 (Renovate, openspec 1.14.3) | `renovate-bot ` | `1353f777` | 4713611399 pass | +| #457 (Dependabot, cairosvg) | `dependabot[bot]`, plus one maintainer commit | `3f17512f` | 4460537403 pass | + +Dependabot PRs also get the normal check set (#489's list includes every required context). + +**Result: pass** — recorded: `true`; no observed effect on Renovate or Dependabot PRs. diff --git a/openspec/changes/ci-workflow-hardening/tasks.md b/openspec/changes/ci-workflow-hardening/tasks.md index 29ba8ada4..4f016e161 100644 --- a/openspec/changes/ci-workflow-hardening/tasks.md +++ b/openspec/changes/ci-workflow-hardening/tasks.md @@ -20,16 +20,18 @@ ## 4. dependency-review (CWS-3) - [x] 4.1 Add the `dependency-review` job (PR only, default threshold, `allow-licenses` list derived from `go-licenses` or the current dependency set, with reasons for each per-module exception) -- [ ] 4.2 Probe on a throwaway PR with a known-vulnerable module and one disallowed licence: job fails both times (needs two real throwaway PRs against the repo; the config-level mutants are covered by the meta-test's CWS-3 mutants) +- [x] 4.2 Probe on a throwaway PR with a known-vulnerable module and one disallowed licence: job fails both times (needs two real throwaway PRs against the repo; the config-level mutants are covered by the meta-test's CWS-3 mutants) — closed 2026-10-25, evidence: evidence/post-merge.md ## 5. Operator-owned (hard prerequisite of the later changes) - [ ] 5.1 (operator) Probe that a skipped required job counts as passing, then make `lint`, `vulncheck`, `workflow-security` and `dependency-review` required checks in `protect-main` -- [ ] 5.2 (operator) Read the ruleset JSON for `require_extra_approval_for_unattributed_changes` and record whether it affects bot PRs + - 2026-10-25: the four are required (ruleset versions 53247538 and 53474785). The skip probe is still open: `vulncheck` is skipped on every docs-only PR, and no docs-only PR has yet reached a state that shows whether the skipped job counts as passing (#489 is also red on `dependency-review`). Evidence: evidence/post-merge.md +- [x] 5.2 (operator) Read the ruleset JSON for `require_extra_approval_for_unattributed_changes` and record whether it affects bot PRs — closed 2026-10-25, evidence: evidence/post-merge.md (`true`; Renovate #475/#476 and Dependabot #457 merged with rule suite `pass`) ## 6. Land - [ ] 6.1 Merge with the `post-merge` rows below open; the archive commit lands in a small follow-up evidence PR once they pass + - 2026-10-25: merged as #450; every post-merge row passes except the CWS-6 skip probe (task 5.1), so the archive waits for it ## zizmor threshold decision (measured 2026-10-05, zizmor 1.30.1) @@ -55,13 +57,13 @@ findings are all cosmetic: | Req | Check | Expected | Status | Evidence | | --- | --- | --- | --- | --- | -| CWS-1 | `workflow-security` on the PR head; template-injection fixture; meta-test mutants (no `--offline`, skip switch) | green on tree, red on fixture and mutants | mutants red locally (12 mutants); PR-head run is post-merge | evidence/evidence.md | +| CWS-1 | `workflow-security` on the PR head; template-injection fixture; meta-test mutants (no `--offline`, skip switch) | green on tree, red on fixture and mutants | pass: mutants red locally (12 mutants); green on PR heads #494 (run 40223387529) and #495 (run 40227161572) | evidence/evidence.md, evidence/post-merge.md | | CWS-2 | meta-test bare-suppression mutant; review of each suppression | red on mutant; each justified | red on mutant; zero suppressions exist (`rules: {}`) | evidence/evidence.md | -| CWS-3 | `dependency-review` on throwaway PRs (vulnerable module, disallowed licence); meta-test mutants | job red twice; mutants red | mutants red; throwaway-PR probe post-merge (task 4.2) | evidence/evidence.md | -| CWS-4 | meta-test group check (ref-keyed, unprefixed mutants); two pushes to a PR | first run cancelled | mutants red locally; two-push cancellation is live post-merge | evidence/evidence.md | -| CWS-4 | three quick merges to main each get a run | each SHA has a run | post-merge | follow-up evidence PR | +| CWS-3 | `dependency-review` on throwaway PRs (vulnerable module, disallowed licence); meta-test mutants | job red twice; mutants red | pass: mutants red; licence red on #470 (run 39170622155) and #489 (run 39987119032); vulnerability red on throwaway #496 (run 40231428226) | evidence/evidence.md, evidence/post-merge.md | +| CWS-4 | meta-test group check (ref-keyed, unprefixed mutants); two pushes to a PR | first run cancelled | pass: mutants red locally; #495 runs 40224677510 and 40225572307 cancelled by the next push | evidence/evidence.md, evidence/post-merge.md | +| CWS-4 | three quick merges to main each get a run | each SHA has a run | pass: five 2026-10-25 merges, one push run each | evidence/post-merge.md | | CWS-5 | meta-test with `push` removed (mutant) | mutant red | red locally | evidence/evidence.md | | CWS-6 | meta-test: guard in non-required job, unpinned mode | red | red locally (19 pre-existing orphans wired into `lint`: 4 e2e-side + 15 docs-side) | evidence/evidence.md | -| CWS-6 | ruleset lists the four jobs as required | listed | post-merge | operator, task 5.1 | +| CWS-6 | ruleset lists the four jobs as required | listed; skipped required job counts as passing | listed (10 contexts); skip probe open | evidence/post-merge.md, task 5.1 | | CWS-7 | self-test mutants plus no-op control, by exit status | each mutant red, no-op green | green locally (34 mutants + no-op) | evidence/evidence.md | | all | independent review; CI on the PR head | APPROVE, green; reviewed and archive revisions recorded | not-run | this PR | diff --git a/openspec/specs/backend-pool/spec.md b/openspec/specs/backend-pool/spec.md new file mode 100644 index 000000000..93e8d2a48 --- /dev/null +++ b/openspec/specs/backend-pool/spec.md @@ -0,0 +1,60 @@ +# backend-pool Specification + +## Purpose +Defines the lifecycle of a pooled sink backend when its sink goes away: deleting a family sink +(`KollectSnapshotSink`, `KollectDatabaseSink`, `KollectEventSink`) evicts and closes the backend +at once, a backend whose build was in flight at the delete is discarded rather than pooled, +eviction is best-effort and idempotent, and the idle TTL stays only as the backstop. + +## Requirements + +### Requirement: BEP-1 Deleting a family sink evicts its pooled backend immediately + +When a `KollectSnapshotSink`, `KollectDatabaseSink` or `KollectEventSink` is deleted, the process +pool SHALL drop the cached backend entry for that sink's object UID and Close it, instead of +holding it for the idle TTL; when the delete event's object carries no UID, the eviction SHALL +fall back to the sink's namespace/name key. + +#### Scenario: Deleted sink's pooled entry is evicted and closed + +- **WHEN** a sink's backend is pooled (an export ran) and the sink object is then deleted +- **THEN** the pool no longer holds an entry for that sink's UID and the pooled backend's Close has run + +#### Scenario: Live sinks are untouched + +- **WHEN** a sink that was never deleted is reconciled or its spec changes +- **THEN** its pooled entry is not evicted by the delete hook (spec-hash changes are handled by the existing pool swap on acquire) + +### Requirement: BEP-1.2 A backend built during the delete is discarded, not pooled + +A backend whose build was still in flight when the delete event landed SHALL be discarded instead +of pooled for the deleted sink (delete-tombstone), so eviction cannot be undone by the re-store +race. + +#### Scenario: In-flight build cannot re-pool after eviction + +- **WHEN** an acquire-build for a sink is in flight and the sink is deleted before the build's store lands +- **THEN** the built backend is discarded, not pooled + +### Requirement: BEP-1.3 Eviction is best-effort and idempotent + +Eviction is best-effort and idempotent: it SHALL NOT re-export, retract, reconcile or clean up +anything, and SHALL NOT fail when no entry is pooled. An in-flight export that already holds the +evicted backend may fail against it; the sink no longer exists and no new acquire SHALL rebuild an +entry for that sink's UID. + +#### Scenario: Eviction without a pooled entry is a no-op + +- **WHEN** a sink is deleted while its backend is not pooled (never exported, or already TTL-pruned) +- **THEN** nothing fails and nothing is logged as an error + +### Requirement: BEP-2 The TTL remains the backstop, not the contract + +The idle-entry TTL SHALL keep its meaning (bound the pool and age out entries for sinks that +stopped being reconciled for any reason). The delete hook SHALL NOT change the TTL, the pooling +of live sinks, or the acquire-time spec-hash swap. + +#### Scenario: TTL still ages out stale entries + +- **WHEN** an entry is idle longer than `backendPoolTTL` +- **THEN** the next acquire prunes it, as today diff --git a/openspec/specs/export-annotations/spec.md b/openspec/specs/export-annotations/spec.md new file mode 100644 index 000000000..a2ad3b5f5 --- /dev/null +++ b/openspec/specs/export-annotations/spec.md @@ -0,0 +1,94 @@ +# export-annotations Specification + +## Purpose +Defines the two documented annotation keys that change export behaviour: changing +`kollect.dev/requestedAt` on a `KollectInventory` or `KollectClusterInventory` forces one export +past the per-sink debounce, and an exported source-object copy records the source object's +`metadata.generation` in `kollect.dev/collectedGeneration`. + +## Requirements + +### Requirement: ERA-1 Changing kollect.dev/requestedAt forces one immediate export past the debounce + +The inventory reconcilers SHALL read `kollect.dev/requestedAt` from the reconciled +`KollectInventory` / `KollectClusterInventory` object and treat a change of its value (including +its appearance on an object that had none, and its removal after being set) as an invalidation of +the per-sink export debounce: the next reconcile SHALL export to every sink binding that would +otherwise be debounced. + +#### Scenario: Changed annotation re-exports unchanged content + +- **WHEN** an inventory exported to a sink at t0, its content checksum and generation are unchanged, and the `requestedAt` annotation value is changed +- **THEN** the next reconcile exports to that sink instead of debouncing +- **AND** after that export, a reconcile with no further change debounces again + +#### Scenario: Cluster path behaves like the namespaced path + +- **WHEN** the annotation changes on a `KollectClusterInventory` +- **THEN** the same one-export bypass applies on the cluster export path + +#### Scenario: Preview does not report a debounce the export will not do + +- **WHEN** the annotation changes and a preview is rendered before the next export +- **THEN** the preview does not report the affected bindings as debounced + +#### Scenario: Absence is a value, not a wildcard + +- **WHEN** the annotation is removed after being set +- **THEN** the next reconcile exports once (absence-to-set and set-to-absence are both changes) +- **AND** the `Synced` condition message and requeue cadence stay as for any other export + +### Requirement: ERA-1.2 The debounce resumes after the forced export + +After the export that ERA-1 forces, the steady-state debounce SHALL resume unchanged: same content, same generation +and no further change to the annotation SHALL debounce again as before. + +#### Scenario: Unchanged annotation keeps the debounce + +- **WHEN** the annotation value is unchanged across reconciles with unchanged content +- **THEN** the per-sink debounce behaves exactly as without the annotation + +### Requirement: ERA-1.3 The requestedAt documentation names only the inventory kinds + +The annotation documentation SHALL scope the key to exactly the kinds whose reconcilers honour it +(the two inventory kinds), not to "reconciled Kollect CRs" generally. + +#### Scenario: Documentation scopes the key to the inventory kinds + +- **WHEN** the annotation documentation describes `kollect.dev/requestedAt` +- **THEN** it scopes the key to `KollectInventory` and `KollectClusterInventory` +- **AND** it does not scope the key to reconciled Kollect CRs generally + +### Requirement: ERA-2 Exported source-object copies record the collected generation + +When a profile exports in Resource mode, the embedded pruned copy of the source object SHALL carry +`kollect.dev/collectedGeneration: ""` in its `metadata.annotations` whenever the copy retains a +metadata section, where `` is the source object's `metadata.generation` at collection time. The +stamp SHALL be applied after pruning and scrubbing, so profile prune paths and scrub rules cannot +remove it. + +#### Scenario: Resource-mode copy is stamped + +- **WHEN** a target whose profile sets `export.mode: Resource` collects an object with generation 42 +- **THEN** the exported Item's embedded copy has `metadata.annotations["kollect.dev/collectedGeneration"] == "42"` + +#### Scenario: Stamp survives profile pruning of annotations + +- **WHEN** the profile's prune spec removes `metadata.annotations` from the embedded copy +- **THEN** the exported copy still carries the `kollect.dev/collectedGeneration` annotation + +#### Scenario: Attributes mode is untouched + +- **WHEN** a profile uses the default Attributes mode +- **THEN** the exported Item is byte-identical to today's output for the same input + +### Requirement: ERA-2.2 A copy without a metadata section is exported unstamped + +A profile whose include section drops metadata (the default `SpecAndStatus` does) SHALL export the +copy without the stamp: there is no metadata section to carry it. The annotation documentation +SHALL state that the stamp requires a metadata-retaining include section. + +#### Scenario: No metadata section, no stamp + +- **WHEN** the profile's include section excludes metadata so the embedded copy has no `metadata` map +- **THEN** the copy carries no stamp and the export succeeds diff --git a/openspec/specs/git-engine/spec.md b/openspec/specs/git-engine/spec.md new file mode 100644 index 000000000..925ea182d --- /dev/null +++ b/openspec/specs/git-engine/spec.md @@ -0,0 +1,73 @@ +# git-engine Specification + +## Purpose +Defines the git sink's single export engine, go-git: `spec.git.engine` admits only `go-git`, the +go-git SSH client offers the key exchanges x/crypto implements, and the documented engine +contract matches the code. + +## Requirements + +### Requirement: GTE-1 The git sink has one export engine, go-git + +The git snapshot sink SHALL export and delete through the go-git engine only. `spec.git.engine` +SHALL accept `go-git` (the default) and SHALL reject `cli` — at the CRD schema, at admission +validation, and at backend construction — with an error naming `go-git` as the engine. The +`file://` remote handling and the `git ls-remote` connection probe SHALL keep using the CLI +machinery they already use today, unchanged by the convergence. + +#### Scenario: engine=cli is rejected at admission + +- **WHEN** a `KollectSnapshotSink` with `spec.git.engine: cli` is created or updated +- **THEN** admission fails naming `go-git` as the engine +- **AND** backend construction independently rejects the same value (defence in depth) + +#### Scenario: go-git and default are accepted + +- **WHEN** a sink sets `spec.git.engine: go-git` or omits the field +- **THEN** export and delete behave as the go-git engine does today + +#### Scenario: Existing sinks' auth modes are unchanged + +- **WHEN** a sink authenticates with token over HTTPS, or with an SSH key, as it did before the convergence +- **THEN** its export path is the go-git one and its auth behaviour is unchanged + +#### Scenario: Persisted engine=cli sink after the upgrade + +- **WHEN** an existing `KollectSnapshotSink` still carries `spec.git.engine: cli` from before the upgrade and something next builds its backend +- **THEN** the build fails with an error naming `go-git` as the engine +- **AND** the sink object itself is not deleted or rewritten by the operator + +#### Scenario: file:// remotes are unchanged + +- **WHEN** a git sink targets a `file://` remote +- **THEN** export, delete and connection probing use the CLI machinery, as today + +### Requirement: GTE-2 The go-git SSH client offers the key exchanges x/crypto implements + +The go-git SSH key-exchange offer SHALL include, at minimum, the current list plus +`mlkem768x25519-sha256` and `diffie-hellman-group16-sha512`, in an order that keeps the existing +algorithms first. This closes the documented "SSH/KEX edge cases" gap: the algorithms are already +implemented by the pinned x/crypto; the offer, not the library, was the limiter. + +#### Scenario: KEX list carries the modern algorithms + +- **WHEN** the go-git SSH auth is built +- **THEN** the client's key-exchange offer contains `curve25519-sha256`, `mlkem768x25519-sha256` and `diffie-hellman-group16-sha512` (non-exhaustive) + +#### Scenario: Existing preferences are not demoted + +- **WHEN** the list is compared to today's +- **THEN** the eight existing algorithm names keep their relative order + +### Requirement: GTE-3 The documented engine contract matches the code + +`docs/crds/kollectsnapshotsink.md` and the API field description SHALL describe `go-git` as the +engine, SHALL NOT claim `cli` is required for SSH/KEX edge cases, and SHALL note the convergence +(ADR-0803). The other in-repo sites asserting `engine: cli` works (chart README template, +operator manual, coding standards, security architecture, image Dockerfile comments) SHALL be +truthed-up in the same change. + +#### Scenario: CRD reference does not advertise cli + +- **WHEN** a user reads the snapshot sink CRD reference for `spec.git.engine` +- **THEN** the only admitted value documented is `go-git`, with the convergence rationale linked diff --git a/openspec/specs/target-status/spec.md b/openspec/specs/target-status/spec.md new file mode 100644 index 000000000..0567e4d9c --- /dev/null +++ b/openspec/specs/target-status/spec.md @@ -0,0 +1,41 @@ +# target-status Specification + +## Purpose +Defines the collected-count status of a `KollectClusterTarget`: `status.collectedCount` and +`status.collectedCountUpdatedAt`, with the same fields, semantics and printer columns as on a +namespaced `KollectTarget`. + +## Requirements + +### Requirement: TSP-1 A KollectClusterTarget exposes the collected count and when it last changed + +`KollectClusterTarget` status SHALL carry `collectedCount` and `collectedCountUpdatedAt` with the +same semantics as `KollectTarget`: the count is the machine-readable number of resources the +cluster target was collecting at its last healthy refresh, `null` means never computed, and the +timestamp moves only when the number changes. Both fields SHALL be exposed as kubectl printer +columns (Collected / Updated) mirroring the namespaced target. + +#### Scenario: Cluster target persists its count + +- **WHEN** a `KollectClusterTarget` reaches Ready while its engine-registered synthetic targets hold 17 items +- **THEN** `status.collectedCount == 17` and `status.collectedCountUpdatedAt` is set + +#### Scenario: Steady count keeps its timestamp + +- **WHEN** two consecutive reconciles derive the same count +- **THEN** `collectedCountUpdatedAt` does not move and the count value is unchanged + +#### Scenario: Count change is persisted independently of the condition text + +- **WHEN** the derived count changes while the Ready condition payload stays byte-identical (the shared no-op-skip writer would skip the write) +- **THEN** the new count is still persisted (the PERF-FIX-05 escape hatch holds on the cluster path) + +#### Scenario: Count and filter move together, one write + +- **WHEN** a reconcile changes both the filter-status fields and the count while the condition payload is unchanged +- **THEN** one status write persists both (no second Status().Update site) + +#### Scenario: Degraded target keeps its last count + +- **WHEN** a previously Ready cluster target goes Degraded +- **THEN** its last known count and timestamp are not cleared