D-2 · Deadline Friday 2026-05-22

Upload · Parse · Place — PPS Excellent Product Evaluation

By Friday, deliver the golden path: an HWPX spec gets uploaded → auto-parsed → mapped data lands on the comparison UI. Backend and extraction engine already work — the frontend integration is the focus.

Infrastructure · Branches · Where to Work

Two repos

RepoBranch you useRole
pps-mono-repo feat/onprem-h100-deploy Excellent-product frontend + BFF (all this week's code lives here)
hwpx-intelligence main HWPX extraction engine (separate repo · no changes needed)

Excellent-product frontend — component map

AreaKey components / role
Entry point LandingClient — landing page with the "Start evaluation" CTA, opens the eval screen as a popup
Eval-screen container HomeClient — currently renders only mock data (authors-mock · bid-items-mock)
Vendor-comparison main AuthorComparePanel — per-vendor (= Proposal) comparison panel
Bid / notice cards BidItemSelector · noticeDetail/* (basic-info, tech, requirements, evaluation tabs)
Five comparison sections analysis/compare/CompareTechSection · CompareEvaluationSection · CompareRequirementsSection · CompareKpiMatrix · each Detail section
Compare center panels center/CompareCenterPanel · ItemCompare* (per-item core tech / evaluation / requirements)
AI chat panel ChatPanel (question-answer alongside AuthorComparePanel)
Admin area admin/(auth)/login · admin/(protected)/{analysis · usage · system · settings}

LLM Call Policy — must go through the ai_engine layer

Guidance from Park Chan-ho. Any LLM call from the excellent-product frontend / BFF (AI chat, evaluation analysis, etc.) must be routed through the ai_engine layer. The layer exists so prompts and LLM calls from multiple services are managed in one place.

AreaAllowed to call?Notes
services/ai_engine/online recommended entry Realtime service entry points — eval_chatbot · rfp_gen_chatbot · rfp_gen_doc_assistant. Call here.
services/ai_engine/core internal infra LLM engines (Gemini / Qwen), clients, caching, etc. Used by the online layer. Avoid direct use.
services/ai_engine/core/prompts central prompts Single source for RFP · proposal · evaluation · chat prompt templates. Add new prompts here.
services/ai_engine/offline do NOT call directly Batch-only. Intentionally isolated from external services.
App layer calling an LLM SDK directly forbidden Do not import OpenAI · Gemini · Qwen clients in app code.

References — jodal-eval-ai/pps-mono-repo/tree/main/services/ai_engine/offline · core/prompts

Notice for external development (Suman, read this) The on-premise models (e.g. in-house H100 vLLM) are reachable only from inside the corporate network. When testing from outside, use an external LLM (OpenRouter · OpenAI · Anthropic, etc.) — do not point at the in-house endpoints from your dev machine. The call site is unchanged: still go through ai_engine/online. Only the base URL and API key in environment variables differ. Switching to the in-house vLLM for the demo / production environment is handled by the infra team.

Friday Deliverables — three tasks (requirements only)

① Upload

Add an HWPX upload entry to the eval screen

Today the eval screen (HomeClient) pulls only mock data, and there is no upload UI yet. The BFF and extraction engine already work, so only the UI surface needs to be added.

UX requirements
① Drag-and-drop area + file picker, placed in HomeClient (top) or as a separate entry
② Accept only .hwp / .hwpx — reject other extensions with a toast
③ Show a progress indicator area (optional but nice)
Data flow
Selected file → BFF upload endpoint → receive spec_id → register as a new comparison item on the eval screen
Status
new component + entry route to decide
② Parse

Provide the extraction-engine API key — parsing is already wired

The BFF auto-calls the extraction engine on upload, and the webhook flow that persists the result on the BFF side is complete. What you still need is the LLM/VLM API key.

What's needed
Extraction engine LLM/VLM API key — for external dev, use an external LLM (OpenRouter · OpenAI etc.); for in-house network / demo, the in-house vLLM endpoint. The in-house endpoint is not reachable from outside.
When verified
Upload one real HWPX (e.g. JK알에스티 2025057) and confirm that company name, designation number, certifications and test items are extracted correctly.
Status
issue API key + apply to demo env
③ Place

Replace mock data on the comparison UI with the real extracted result

HomeClient / AuthorComparePanel currently render hardcoded mock data only. The BFF already returns the mapped Proposal, so swap the data source and decide UX placement.

Mocks to replace
authors-mock (vendor list) · bid-items-mock (bid items)
→ BFF mapped-proposal response
9 fields to display
company_name · designation_no · product_category · title_ko · features summary · extraction_confidence · parser_version · proposal_id · raw (original)
Decision needed
Where each of the 9 fields lives in the comparison UI — company / designation in the AuthorComparePanel header, features summary in the card body, confidence as a badge, and so on. Confirm in a UX review meeting.
Target components
HomeClient · AuthorComparePanel · BidItemSelector · the five comparison sections (Compare*Section)
When AI is called
For LLM responses (e.g. ChatPanel), go through ai_engine/online (eval_chatbot service). No direct LLM SDK call from the app (see policy above).
Status
data-source swap + UX placement meeting

Starting Point — progress snapshot

AreaStatusNotes
BFF upload → extraction triggerworkingAuto-attaches callback_url + idempotent webhook receive
ProductRecord → Proposal mapping (9 fields)workingMapping logic encapsulated in one place
Compare-result query APIworkingSingle spec_id + full list
Frontend upload componentmissingCore of task ①
Frontend comparison UI with real datamock onlyCore of task ③
Extraction engine API keyunsetCore of task ②
Automated regression guard (e2e + pytest)196 scenariosRuns in 3.8s on every change
ai_engine layer (online · prompts)in placeLLM entry point + central prompt store — excellent-product UI goes through this

Source Links — repos, branches, files