From b6a5a89a84cfba15842ea6c47100ea4949e10dbc Mon Sep 17 00:00:00 2001 From: Jim Lancaster <40281233+zoltan57@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:22:06 -0500 Subject: [PATCH] gpt-5.3-codex review phase 2 - update instructions & skills --- .../error-handling.instructions.md | 69 +++++++++++++++ .github/instructions/services.instructions.md | 37 ++++---- .github/instructions/ui.instructions.md | 25 +++++- .../evidence-provenance-auditor/skill.md | 79 ++++++++++++++++++ .github/skills/python-code-reviewer/skill.md | 5 +- pytest_ui_errors.log | Bin 51392 -> 0 bytes ui_test_documents.log | Bin 394704 -> 0 bytes 7 files changed, 187 insertions(+), 28 deletions(-) create mode 100644 .github/instructions/error-handling.instructions.md create mode 100644 .github/skills/evidence-provenance-auditor/skill.md delete mode 100644 pytest_ui_errors.log delete mode 100644 ui_test_documents.log diff --git a/.github/instructions/error-handling.instructions.md b/.github/instructions/error-handling.instructions.md new file mode 100644 index 0000000..bfb7278 --- /dev/null +++ b/.github/instructions/error-handling.instructions.md @@ -0,0 +1,69 @@ +--- +description: Cross-cutting error handling rules for services, API, and UI. +applyTo: 'src/transcription/**/*.py' +--- + +# Error Handling (Cross-cutting) + +Primary references: + +- `docs/ver4/error_handling_v4.md` +- `docs/invariant/error_handling.md` +- `docs/ver4/requirements_v4.md` + +## Taxonomy and Categories + +Use category-driven semantics aligned to canonical V4 policy: + +- `validation` +- `not_found` +- `conflict` +- `external` +- `timeout` +- `internal` + +Do not invent ad hoc categories in user/API-facing envelopes unless canonical docs are updated. + +## Translation Boundaries + +- **Provider/adapters:** raise provider/domain exceptions; do not emit UI text. +- **Services:** map raw exceptions into domain categories and preserve causal chain (`raise ... from ...`). +- **UI/API:** emit user-safe, actionable messages based on category + operation context. + +## Retry Rules + +- No auto-retry for `validation`, `not_found`, `conflict`. +- `external`/`timeout` may be retried when operation semantics are safe. +- Preserve each retry as new evidence where applicable (no history rewrite). + +## Job/Page Failure Semantics + +- Page-level (`JobSource`): `pending`, `transcribed`, `failed`, `cancelled`. +- Job terminals: `transcribed`, `partial_success`, `failed`. +- Cancellation must keep job-level and page-level semantics explicit and consistent. + +## User-Safe Messaging + +- Never leak stack traces, credentials, auth headers, or local filesystem paths in user-facing output. +- Include actionable remediation guidance aligned to category. +- Keep envelope structure consistent across API endpoints. + +## Logging and Diagnostics + +- Log operation identifiers and error IDs where available. +- Preserve category + cause-chain context. +- Distinguish no-response timeout/network failures from returned provider error responses. + +## Guardrails + +- No broad catch-and-swallow patterns. +- No success-shaped fallback values after exceptions. +- Category mapping must remain deterministic and testable. + +## Contract Sync Rule + +If taxonomy, retries, or envelope semantics change: + +1. Update canonical docs (`docs/ver4/error_handling_v4.md`, and invariant docs if needed). +2. Update tests in the same change. +3. Update related instruction/skill references. diff --git a/.github/instructions/services.instructions.md b/.github/instructions/services.instructions.md index bd29d76..1ae82e7 100644 --- a/.github/instructions/services.instructions.md +++ b/.github/instructions/services.instructions.md @@ -20,6 +20,8 @@ applyTo: 'src/transcription/services/*.py' - Not every module in this package is a service. Helper modules that define no `*Service` class (`base`, `errors`, `normalization`, `prompts`, `quality`, `media_storage`, `source_media`) are free-function modules and are exempt from the service rules below. +- Cross-cutting error behavior must follow + [error-handling instructions](./error-handling.instructions.md). ## Model Ownership @@ -69,14 +71,17 @@ module, not in a cross-service import. which defines no service class and is therefore importable by any of them. - Use a context manager for large `try/except` blocks, like `handle_transcription_errors` in [sources](../../src/transcription/services/sources.py). +- Category mapping, retry behavior, and translation boundaries are defined in + [error-handling instructions](./error-handling.instructions.md). ## Checklist - [ ] Uses `ServiceBase` for common logic - [ ] Session kwarg for `AsyncSession` to pass a session object into each method - [ ] Services use `self._session_scope` in their methods to pass the session through - - Multiple operations on the same object(s) require sharing a session between all the methods used + - Multiple operations on the same object(s) require sharing a session between all the methods used - [ ] Every model the module touches is either owned by it or reached read-only +- [ ] Evidence writes preserve append-only semantics ## CRUD Methods @@ -98,18 +103,9 @@ When a service method accepts an optional `session` kwarg, write methods must us - If `session` is provided: the method must **not** commit; it should `flush()` so IDs and FK values are available to the caller's transaction. - Use `refresh()` on returned ORM objects when the caller needs DB-populated values (defaults, triggers, merged state). -Recommended helper behavior: - -- Inputs: active session object, original `session` arg (or a boolean ownership flag), and an optional list of objects to refresh. -- Logic: `commit` when service-owned session, `flush` when caller-owned session, then refresh requested objects. - -This keeps orchestration functions atomic: they can pass one shared session across multiple services and commit exactly once at the workflow boundary. - ## Workflow Transaction Boundaries -For multi-step job lifecycles (for example queued transcription jobs), orchestration functions must use explicit transaction phases. - -Required boundary model: +For multi-step job lifecycles, orchestration functions must use explicit transaction phases. - **Transaction A (claim):** transition `JobStatus.QUEUED -> JobStatus.PROCESSING` and commit immediately. - Perform provider/network work **outside** database transactions. @@ -123,28 +119,23 @@ Atomicity rules: - Terminal state (`TRANSCRIBED` or `FAILED`) and transcript row changes must succeed or roll back together. - Retry persistence (`QUEUED` + retry increment + error detail) must succeed or roll back together. -Separation of concerns: - -- Worker modules should stay lightweight and delegate lifecycle transitions to service/workflow orchestration functions. -- In `workflows.py`, `process_queued_job` should own one complete attempt lifecycle: `QUEUED -> PROCESSING -> TRANSCRIBED|FAILED`. -- In `workflows.py`, `advance_job` should coordinate broader status progression around attempts (for example retry scheduling from `FAILED -> QUEUED`). -- Services should expose session-aware write helpers (flush on caller-owned session) so orchestration controls commit boundaries. -- Backoff/sleep behavior must run outside transactional scopes. - ## V4 Contract Alignment - Treat `docs/ver4/` as the active architecture and requirements baseline. +- Treat `docs/ver4/history.md` and `docs-v4x-archive` as historical-only references. - `Job.status` success path is `TRANSCRIBED`. - `JobSource.status` is queue/projection state only (`PENDING`, `TRANSCRIBED`, `FAILED`, `CANCELLED`). - Source ingest may normalize media before persistence; persisted bytes/hash are canonical for processing and provenance. +- `ExecutionAttempt` is append-only evidence history; do not mutate historical attempt rows in runtime code. +- `Source.raw_transcription` is a projection, not authoritative history. +- Service/UI read paths that touch relationships must be eager-loaded for `lazy="raise"` compatibility. +- If evidence-related model fields change, update `docs/ver4/schema_v4.md` in the same change. # Service Composition A service method may read across models it does not own, using eager loads from its own aggregate root. What it may not do is import another service. -Operations that must **write** models owned by more than one service — uploading a picture, -for example — are composed in an orchestration module +Operations that must **write** models owned by more than one service are composed in an orchestration module ([store](../../src/transcription/services/store.py), -[workflows](../../src/transcription/services/workflows.py)). Orchestration modules define no -service class, may import any service, and own the commit boundary. +[workflows](../../src/transcription/services/workflows.py)). diff --git a/.github/instructions/ui.instructions.md b/.github/instructions/ui.instructions.md index ca99ba6..6e4f1e0 100644 --- a/.github/instructions/ui.instructions.md +++ b/.github/instructions/ui.instructions.md @@ -11,6 +11,9 @@ Keep dependencies flowing in this direction: Pages may depend on application services and framework-provided dependencies. Components may depend on smaller components and shared presentation helpers. Services and domain modules must never depend on the UI. +Cross-cutting error behavior must follow +[error-handling instructions](./error-handling.instructions.md). + ## Package Root - Keep `ui/__init__.py` as the UI composition root: register global assets, register pages, and mount NiceGUI on FastAPI. @@ -44,17 +47,31 @@ Pages may depend on application services and framework-provided dependencies. Co - Keep all application CSS in `ui/static/theme.css`; do not add page- or component-specific stylesheets or embed style blocks in Python components. - Load `theme.css` once from the composition root with `ui.add_css(..., shared=True)`. - Read stylesheet text through `importlib.resources.files(...)` so loading works from installed packages and is independent of the working directory. -- Centralize CSS reading in one typed helper cached by resource path with `functools.cache` or an equivalent unbounded `lru_cache`. Cache the immutable stylesheet text to avoid repeated resource I/O; keep NiceGUI registration at the composition root. +- Centralize CSS reading in one typed helper cached by resource path. - Do not encode application behavior in CSS or other static assets. ## State and Side Effects - Limit component state to ephemeral interaction state such as loading flags, form values, dialogs, and expansion state. -- Application and worker state must be resolved at the page or application boundary and passed through narrow interfaces such as callbacks or notifier protocols. -- Keep filesystem, network, provider, and worker orchestration behind application services or dedicated adapters. UI code may trigger those operations but must not implement them. +- Application and worker state must be resolved at the page or application boundary and passed through narrow interfaces. +- Keep filesystem, network, provider, and worker orchestration behind application services or dedicated adapters. + +## Media Route Safety Rules + +Two patterns are approved: + +1. **Record-validated API routes** for print/export contexts. +2. **Controlled upload URL resolver** (`components/media_urls.py`) for general UI media. + +Prohibited patterns: + +- Direct `file://` links or exposing local filesystem paths. +- Manual URL construction from raw `Path` values in pages/components. +- User-facing payloads containing local absolute paths. ## V4 Contract Alignment - Treat `docs/ver4/` as the active baseline and `docs/ver4/history.md` as historical reference only. - Use status vocabulary exactly as modeled (`queued`, `processing`, `transcribed`, `partial_success`, `failed`; and `pending`, `transcribed`, `failed`, `cancelled`). -- Print/export media flows must use record-validated routes from API modules; direct local filesystem paths are prohibited. +- Print/export media flows must use record-validated routes; direct local filesystem paths are prohibited. +- If lifecycle wording/behavior changes, update corresponding `docs/ui/pages/*.md` contracts in the same change. diff --git a/.github/skills/evidence-provenance-auditor/skill.md b/.github/skills/evidence-provenance-auditor/skill.md new file mode 100644 index 0000000..9355a74 --- /dev/null +++ b/.github/skills/evidence-provenance-auditor/skill.md @@ -0,0 +1,79 @@ +--- +name: evidence-provenance-auditor +description: Deterministic reviewer for transcription evidence/provenance guarantees. Use when changes touch execution attempts, source storage, retries, transport evidence, artifact provenance, or evidence exports. +--- + +# Evidence & Provenance Auditor + +Perform focused, deterministic audits of evidence integrity and provenance behavior. + +## When to Use + +- Reviewing changes in: + - `src/transcription/services/sources.py` + - `src/transcription/services/store.py` + - `src/transcription/services/workflows.py` + - `src/transcription/services/evidence.py` + - `src/transcription/db/models.py` +- Auditing evidence exports/imports or evidence-display behavior. +- Verifying no drift from canonical provenance invariants. + +## Normative References (must be used) + +1. `docs/invariant/ai_evidence_and_provenance.md` +2. `docs/ver4/schema_v4.md` +3. `docs/ver4/requirements_v4.md` +4. `docs/ver4/error_handling_v4.md` +5. `docs/ver4/history.md` (archive boundary) +6. `docs-v4x-archive` tag (historical context only) + +## Deterministic Pass/Fail Checks + +### A. Append-only history +- Every provider call results in a new `ExecutionAttempt`. +- Runtime paths do not mutate historical attempts to represent new outcomes. +- Retry behavior appends attempts rather than rewriting prior rows. + +### B. Projection vs authority separation +- `Source.raw_transcription` and preferred pointers are mutable projection surfaces. +- Attempt rows remain authoritative historical evidence. +- Candidate promotion updates projection pointers without rewriting history. + +### C. Transport evidence semantics +- Transport evidence is correctly labeled as application-boundary capture. +- SDK snapshots/normalized metadata are not mislabeled as native upstream payload. +- No-response timeout/network states are explicit. + +### D. Canonical source identity +- Canonical stored bytes/hash/size are internally consistent. +- If ingest normalization is applied, code/docs consistently represent resulting canonical identity. +- Post-ingest derivatives do not overwrite canonical source bytes. + +### E. Secret safety +- No credentials/auth headers/cookies/unrestricted headers persisted. +- Header persistence uses explicit allowlist semantics. + +### F. Route/path safety +- Print/export source access is record-validated. +- UI/media path construction does not expose local filesystem paths. + +### G. Schema/docs alignment +- Evidence-related model fields and semantics align with canonical docs. +- Evidence model changes require same-change doc updates. + +## Review Workflow + +1. Read normative references first. +2. Inspect model + service + workflow write paths. +3. Inspect evidence read/display/export paths. +4. Report high-confidence findings with concrete path/line evidence. +5. Classify each finding by invariant family (A-G). + +## Output Format + +Use this structure: + +- Verdict by invariant family (A-G) +- Findings with `Location`, `Observed Behavior`, `Risk`, `Recommended Fix` +- Drift table (`Doc claim` vs `Code reality` vs `Action`) +- Regression guards needed diff --git a/.github/skills/python-code-reviewer/skill.md b/.github/skills/python-code-reviewer/skill.md index 8193351..13f7aa5 100644 --- a/.github/skills/python-code-reviewer/skill.md +++ b/.github/skills/python-code-reviewer/skill.md @@ -39,7 +39,10 @@ When reviewing this repository, always include explicit pass/fail checks for: 2. **UI boundary rule:** pages/components do not perform persistence access (`tests/test_ui_boundaries.py`). 3. **Status vocabulary conformance:** `JobStatus`/`JobSourceStatus` usage matches current enums in `src/transcription/db/models.py`. 4. **Evidence ownership conformance:** append-only attempt history is preserved and projection writes are not mistaken for history mutation (`src/transcription/services/sources.py`, `src/transcription/services/evidence.py`). -5. **Canonical V4 authority:** findings must resolve against `docs/ver4/*` first, and treat `docs/ver4/history.md` plus `docs/ver4.x/*` as historical context. +5. **Canonical V4 authority:** findings must resolve against `docs/ver4/*` first, and treat `docs/ver4/history.md` plus `docs-v4x-archive` as historical context. +6. **Media boundary conformance:** print/export media is record-validated and UI media URL generation uses controlled resolver paths. +7. **Eager-loading conformance:** service/UI read paths satisfy `lazy="raise"` expectations. +8. **Cross-cutting error conformance:** service/API/UI translation and retry behavior align with `.github/instructions/error-handling.instructions.md`. ## Core Review Areas diff --git a/pytest_ui_errors.log b/pytest_ui_errors.log deleted file mode 100644 index c465c2d5a4133175a68686bbe185a039137fb591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51392 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 diff --git a/ui_test_documents.log b/ui_test_documents.log deleted file mode 100644 index f359b4c159b8c85865e1b7462f811f580eb0d018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394704 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 Kc>kg*C*=lGsXgrIBZ8c`{Ts>#-`&8D)x3S{4DE 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 ad<6A@&@04coHQK3XdS8C|I22s^8Wz>cfjHR