From d2f78e2e77f09078866895ccb5161553bfcfcf5b Mon Sep 17 00:00:00 2001 From: 1sdv <2476235939@qq.com> Date: Mon, 7 Sep 2026 19:44:50 +0800 Subject: [PATCH] fix(shared): register live runtime error codes --- docs/spec/03-runtime/08-error-codes.md | 4 ++++ docs/spec/06-delivery/04-e2e-test-plan.md | 16 ++++++++++++++++ packages/shared/src/errors.test.ts | 23 +++++++++++++++++++++++ packages/shared/src/errors.ts | 14 ++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/docs/spec/03-runtime/08-error-codes.md b/docs/spec/03-runtime/08-error-codes.md index f482d8ef5..4da57ffc0 100644 --- a/docs/spec/03-runtime/08-error-codes.md +++ b/docs/spec/03-runtime/08-error-codes.md @@ -32,6 +32,10 @@ Rules: 2. `message` is English source text (i18n key may map separately) 3. UI should prefer i18n key derived from `code` when available +The shared test suite verifies every live runtime and Edit code listed below +is present in `ErrorCodes`; reserved codes in ยง3.7 remain intentionally absent +until an implementation emits them. + ## 3. Code registry ### 3.1 App / protocol diff --git a/docs/spec/06-delivery/04-e2e-test-plan.md b/docs/spec/06-delivery/04-e2e-test-plan.md index df2ad1575..e17d15cc7 100644 --- a/docs/spec/06-delivery/04-e2e-test-plan.md +++ b/docs/spec/06-delivery/04-e2e-test-plan.md @@ -7850,3 +7850,19 @@ are withdrawn with ADR 0165. - **Status**: Unit-covered (`bundled-plugins.test.mjs`, `plugin-complete.test.mjs`); full UI journey Draft (do not run E2E locally unless explicitly requested) + +#### E2E-190: Live AppError codes stay registered + +- **Preconditions**: The shared package test suite is available. +- **Steps**: + 1. Run the shared error helper tests. + 2. Inspect the live runtime and Edit code list used by the test. +- **Expected**: Every live code in the error-code specification, including + context-compaction, empty-response, and Edit recovery failures, exists in + `packages/shared/src/errors.ts` with an identical key and value. Reserved + codes remain excluded until they are emitted. +- **Specs linked**: `03-runtime/08-error-codes.md` +- **Acceptance**: Quality +- **Milestone**: M5 +- **Status**: Unit-covered (`packages/shared/src/errors.test.ts`); full UI + journey not applicable diff --git a/packages/shared/src/errors.test.ts b/packages/shared/src/errors.test.ts index 937c5d263..461fa0c4c 100644 --- a/packages/shared/src/errors.test.ts +++ b/packages/shared/src/errors.test.ts @@ -30,4 +30,27 @@ describe("result helpers", () => { expect(ErrorCodes.SHELL_NOT_FOUND).toBe("SHELL_NOT_FOUND"); expect(ErrorCodes.COMMAND_SHELL_INVALID).toBe("COMMAND_SHELL_INVALID"); }); + + it("registers every live runtime and Edit error code", () => { + const liveCodes = [ + "CONTEXT_COMPACTION_FAILED", + "EMPTY_MODEL_RESPONSE", + "EDIT_TAG_REQUIRED", + "EDIT_TAG_MISMATCH", + "EDIT_TAG_UNKNOWN", + "EDIT_LINES_UNSEEN", + "EDIT_PARSE_FAILED", + "EDIT_RANGE_INVALID", + "EDIT_BLOCK_UNRESOLVED", + "EDIT_REGISTER_EMPTY", + "EDIT_REGISTER_AMBIGUOUS", + "EDIT_REPAIR_AMBIGUOUS", + "EDIT_NO_CHANGE", + "EDIT_AMPLIFICATION_LIMIT", + ] as const; + + for (const code of liveCodes) { + expect(ErrorCodes[code]).toBe(code); + } + }); }); diff --git a/packages/shared/src/errors.ts b/packages/shared/src/errors.ts index ecb631848..02846b9ef 100644 --- a/packages/shared/src/errors.ts +++ b/packages/shared/src/errors.ts @@ -49,7 +49,9 @@ export const ErrorCodes = { PROVIDER_RATE_LIMITED: "PROVIDER_RATE_LIMITED", PROVIDER_SECRET_MISSING: "PROVIDER_SECRET_MISSING", CONTEXT_TOO_LARGE: "CONTEXT_TOO_LARGE", + CONTEXT_COMPACTION_FAILED: "CONTEXT_COMPACTION_FAILED", STREAM_FAILED: "STREAM_FAILED", + EMPTY_MODEL_RESPONSE: "EMPTY_MODEL_RESPONSE", PROMPT_ENHANCEMENT_EMPTY: "PROMPT_ENHANCEMENT_EMPTY", SUBAGENT_IDLE_TIMEOUT: "SUBAGENT_IDLE_TIMEOUT", SUBAGENT_DURATION_TIMEOUT: "SUBAGENT_DURATION_TIMEOUT", @@ -66,6 +68,18 @@ export const ErrorCodes = { MUTATION_RETRY_BUDGET_EXHAUSTED: "MUTATION_RETRY_BUDGET_EXHAUSTED", PROCESS_RESOURCE_EXHAUSTED: "PROCESS_RESOURCE_EXHAUSTED", TOOL_ABORTED: "TOOL_ABORTED", + EDIT_TAG_REQUIRED: "EDIT_TAG_REQUIRED", + EDIT_TAG_MISMATCH: "EDIT_TAG_MISMATCH", + EDIT_TAG_UNKNOWN: "EDIT_TAG_UNKNOWN", + EDIT_LINES_UNSEEN: "EDIT_LINES_UNSEEN", + EDIT_PARSE_FAILED: "EDIT_PARSE_FAILED", + EDIT_RANGE_INVALID: "EDIT_RANGE_INVALID", + EDIT_BLOCK_UNRESOLVED: "EDIT_BLOCK_UNRESOLVED", + EDIT_REGISTER_EMPTY: "EDIT_REGISTER_EMPTY", + EDIT_REGISTER_AMBIGUOUS: "EDIT_REGISTER_AMBIGUOUS", + EDIT_REPAIR_AMBIGUOUS: "EDIT_REPAIR_AMBIGUOUS", + EDIT_NO_CHANGE: "EDIT_NO_CHANGE", + EDIT_AMPLIFICATION_LIMIT: "EDIT_AMPLIFICATION_LIMIT", COMMAND_SHELL_CHANGED: "COMMAND_SHELL_CHANGED", SHELL_NOT_FOUND: "SHELL_NOT_FOUND", COMMAND_SHELL_INVALID: "COMMAND_SHELL_INVALID",