# Reflection Index

Use this index for second-order workflow lessons.

| Date | Reflection | Trigger | Action | Detail |
|---|---|---|---|---|
| 2026-08-11 | Technical surfaces need explicit entry controls | The user corrected the Daily table because inspecting a business row unexpectedly opened a dense technical log | Keep ordinary rows informational, place technical utilities behind named controls, and remove interaction styling/semantics with the handler | [Case](cases/2026-08-11-technical-surfaces-need-explicit-entry-controls.md) |
| 2026-07-31 | Formatting is not business state | A yellow final Booking row was initially at risk of being interpreted as cancellation | Make cancellation text-based, preserve formatting as non-authoritative and keep a real-style regression | [Case](cases/2026-07-31-formatting-is-not-business-state.md) |
| 2026-07-30 | Coordinate hot static assets with the long-lived backend | Login static files activated before backend restart; later launchd ownership also hit macOS Desktop privacy | Feature-detect mixed versions, gate restart on all secrets, use a secret-free launcher and a desktop-authorized supervisor until deployment leaves Desktop | [Case](cases/2026-07-30-coordinate-hot-static-and-long-lived-backend.md) |
| 2026-07-30 | Distinguish a database snapshot from batch completeness | A 15:44 three-file snapshot was incorrectly declared the clean total before the 16:12 07-23 commit | Timestamp snapshots, enumerate expected dates and reconcile recent/in-flight runs before declaring completeness | [Case](cases/2026-07-30-distinguish-snapshot-from-batch-completeness.md) |
| 2026-07-30 | Current projections must exclude fixtures | A structurally valid `local_fixture` remained current during real uploads and contaminated BI/monthly outputs | Add a provenance-aware deployment/readiness gate and retire fixture pins without deleting audit history | [Case](cases/2026-07-30-current-projection-must-exclude-fixtures.md) |
| 2026-07-30 | Backend automation must reconcile the open UI | Worker publication was automatic but the page still required “刷新” | Add visible-tab synchronization, last-good-state retention and UI/API cadence verification | [Case](cases/2026-07-30-backend-automation-must-reconcile-the-open-ui.md) |
| 2026-07-30 | Derive report watermarks from business facts | User clarified that XML filenames have no date and “更新至” belongs to table `ARRIVAL` | Derive and revalidate the watermark against max included `ARRIVAL`; ignore filename/wall clock | [Case](cases/2026-07-30-derive-report-watermarks-from-business-facts.md) |
| 2026-07-30 | Keep deterministic results machine-to-machine | A complete 135-record processor result became a 20-record model/MCP submission | Remove the model serialization boundary; validate and ingest the original machine artifact directly | [Case](cases/2026-07-30-keep-deterministic-results-machine-to-machine.md) |
| 2026-07-29 | Probe stream semantics before trace capture | `include_trace` looked like a possible read/replay capability, but the endpoint contract was unknown | Verify method/event order/duplicate-key behavior with a harmless probe; keep one SSE connection and terminalize ambiguous sends | [Case](cases/2026-07-29-probe-stream-semantics-before-trace-capture.md) |
| 2026-07-29 | Verify runtime target and entrypoint before E2E | Debugging followed an obsolete local tunnel and a manual chat upload was mistaken for the accepted ingestion path | Record the exact active endpoint and classify the test entry before changing credentials or accepting results | [Case](cases/2026-07-29-verify-runtime-target-and-entrypoint-before-e2e.md) |
| 2026-07-29 | Verify every production container entrypoint | XML processing was enabled in Compose but omitted from Dockerfile CMD, so direct image launches stayed closed | Add a regression test for Dockerfile CMD and document platform command overrides | [Case](cases/2026-07-29-verify-all-container-entrypoints.md) |
| 2026-07-29 | Remote Agent success is not a database commit | Repeated live runs ended remotely without an MCP submission | Add a multi-signal acceptance gate and preserve failed-run cleanup evidence | [Case](cases/2026-07-29-remote-success-is-not-a-database-commit.md) |
| 2026-07-29 | Internal parameters are not user inputs | Human correction of the monthly-report workflow | Update docs and promote the boundary to ADR-001 | [Case](cases/2026-07-29-internal-parameters-are-not-user-inputs.md) |

## When To Reflect

Create a reflection only when work reveals a reusable lesson: skipped gates, repeated mistakes, durable debugging patterns, ineffective plans, human corrections, or candidates for new scripts or skills.

Routine task completion belongs in `30-worklog/task-history.md`.
