Files
egg f14591c7dc feat(mid-section-defect): full-line bidirectional defect trace center with dual query mode
Transform /mid-section-defect from TMTT-only backward analysis into a full-line
bidirectional defect traceability center supporting all detection stations.

Key changes:
- Parameterized station detection: any workcenter group as detection station
- Bidirectional tracing: backward (upstream attribution) + forward (downstream reject rates)
- Dual query mode: date range OR LOT/工單/WAFER container-based seed resolution
- Multi-select filters for upstream station, equipment model (RESOURCEFAMILYNAME), and loss reasons
- Progressive 3-stage trace pipeline (seed-resolve → lineage → events) with streaming UI
- Equipment model lookup via resource cache instead of SPECNAME
- Session caching, auto-refresh, searchable MultiSelect with fuzzy matching
- Remove legacy tmtt-defect module (fully superseded)
- Archive openspec change artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:16:33 +08:00

3.6 KiB

ADDED Requirements

Requirement: Detection SQL SHALL be parameterized by workcenter group

The system SHALL replace hardcoded TMTT station filtering with a {{ STATION_FILTER }} template placeholder in station_detection.sql. The filter SHALL be built from WORKCENTER_GROUPS[station]['patterns'] and ['exclude'] defined in workcenter_groups.py, generating OR-LIKE clauses with bind parameters.

Scenario: Station filter built from workcenter group patterns

  • WHEN station='電鍍' is requested
  • THEN the system SHALL build a SQL fragment: UPPER(h.WORKCENTERNAME) LIKE :wc_p0 OR UPPER(h.WORKCENTERNAME) LIKE :wc_p1 OR ... with bind values ['%掛鍍%', '%滾鍍%', '%條鍍%', '%電鍍%', '%補鍍%', '%TOTAI%', '%BANDL%']

Scenario: Station filter respects exclude patterns

  • WHEN station='切割' is requested (which has exclude: ['元件切割', 'PKG_SAW'])
  • THEN the filter SHALL include patterns for '切割' AND exclude patterns via AND UPPER(h.WORKCENTERNAME) NOT LIKE :wc_ex0 AND NOT LIKE :wc_ex1

Scenario: Default station is 測試

  • WHEN no station parameter is provided
  • THEN the system SHALL default to station='測試' (patterns: ['TMTT', '測試'])
  • THEN results SHALL be equivalent to the previous hardcoded TMTT behavior

Requirement: station_detection.sql SHALL generalize tmtt_detection.sql

station_detection.sql SHALL be a new SQL file that replaces tmtt_detection.sql with parameterized station filtering. Column aliases SHALL use DETECTION_ prefix instead of TMTT_ prefix.

Scenario: SQL column renaming

  • WHEN station_detection.sql is executed
  • THEN output columns SHALL include DETECTION_EQUIPMENTID and DETECTION_EQUIPMENTNAME (not TMTT_EQUIPMENTID / TMTT_EQUIPMENTNAME)

Scenario: Both WIP and reject CTEs use station filter

  • WHEN the SQL is executed
  • THEN both the WIP history CTE and the reject history CTE SHALL apply {{ STATION_FILTER }} to filter by the selected station

Requirement: Station options endpoint SHALL return all workcenter groups

GET /api/mid-section-defect/station-options SHALL return the 12 workcenter groups from WORKCENTER_GROUPS as an ordered list with name and order fields.

Scenario: Station options response format

  • WHEN the endpoint is called
  • THEN it SHALL return a JSON array of 12 objects: [{"name": "切割", "order": 0}, {"name": "焊接_DB", "order": 1}, ...] sorted by order

Requirement: All API endpoints SHALL accept station and direction parameters

All /api/mid-section-defect/* endpoints (/analysis, /analysis/detail, /loss-reasons, /export) SHALL accept station (string, default '測試') and direction (string, 'backward' | 'forward', default 'backward') query parameters.

Scenario: Parameters passed to service layer

  • WHEN /api/mid-section-defect/analysis?station=成型&direction=forward is called
  • THEN query_analysis() SHALL receive station='成型' and direction='forward'

Scenario: Invalid station rejected

  • WHEN a station name not in WORKCENTER_GROUPS is provided
  • THEN the endpoint SHALL return HTTP 400 with an error message

Requirement: Cache key SHALL include station and direction

The cache key for analysis results SHALL include station and direction to prevent cross-contamination between different query contexts.

Scenario: Different station/direction combinations cached separately

  • WHEN station=測試, direction=backward is queried, then station=成型, direction=forward is queried
  • THEN each SHALL have its own independent cache entry