Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/anushka404_mini-exception-inbox.json
T
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
20 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "anushka404/mini-exception-inbox", "files": {"INSTRUCTIONS.html": {"c887c1b9fd7dd6d3a68e8633246af8582496311f": {"t": 1786068567.1168926, "n": 19761, "h": "4ffd0506f4b8c466", "c": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Intern Hiring Test — Mini Exception Inbox</title>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n<style>\n :root {\n --canvas: #F7F7F5;\n --surface-1: #FFFFFF;\n --surface-2: #F0F0F0;\n --surface-3: #E7E5E4;\n --ink: #1A1A1A;\n --ink-strong: #0A0A0A;\n --ink-muted: #6B6B6B;\n --ink-subtle: #9A9A9A;\n --brand: #C45C26;\n --brand-hover: #A84B1F;\n --brand-soft: #F2DBCC;\n --brand-on: #FFFFFF;\n --brand-secondary: #D4A574;\n --signal-positive: #3D7A3D;\n --signal-warning: #C49426;\n --signal-critical: #A84B1F;\n --data-1: #C45C26;\n --data-2: #D4A574;\n --data-3: #1A1A1A;\n --data-4: #6B6B6B;\n --data-5: #E7E5E4;\n --hairline: rgba(26,26,26,0.08) 0 0 0 1px;\n --hairline-strong: rgba(26,26,26,0.16) 0 0 0 1px;\n --card: rgba(26,26,26,0.08) 0 0 0 1px, rgba(26,26,26,0.04) 0 2px 2px;\n --card-lifted: rgba(26,26,26,0.08) 0 0 0 1px, rgba(26,26,26,0.04) 0 2px 2px, rgba(26,26,26,0.04) 0 8px 12px -6px, #FAFAFA 0 0 0 1px inset;\n --radius-sm: 6px;\n --radius-md: 8px;\n --radius-lg: 12px;\n --radius-xl: 16px;\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n html { font-size: 16px; -webkit-font-smoothing: antialiased; }\n body {\n font-family: \"Geist\", \"Inter\", \"SF Pro Display\", -apple-system, system-ui, sans-serif;\n background: var(--canvas);\n color: var(--ink);\n line-height: 1.55;\n letter-spacing: -0.05px;\n }\n .container { max-width: 880px; margin: 0 auto; padding: 64px 24px 96px; }\n\n /* Header */\n .header { margin-bottom: 48px; text-align: center; }\n .header-eyebrow {\n font-size: 12px; font-weight: 500; letter-spacing: 0.6px;\n text-transform: uppercase; color: var(--ink-muted);\n margin-bottom: 16px;\n }\n .header-title {\n font-size: 48px; font-weight: 600; line-height: 1.10;\n letter-spacing: -1.8px; color: var(--ink-strong);\n margin-bottom: 12px;\n }\n .header-sub {\n font-size: 18px; font-weight: 400; line-height: 1.55;\n letter-spacing: -0.1px; color: var(--ink-muted);\n max-width: 640px; margin: 0 auto;\n }\n .header-deadline {\n display: inline-block;\n margin-top: 20px;\n background: var(--surface-1);\n box-shadow: var(--hairline);\n border-radius: var(--radius-pill, 9999px);\n padding: 6px 18px;\n font-size: 13px;\n font-weight: 500;\n color: var(--ink-muted);\n }\n .header-deadline strong { color: var(--brand); }\n\n /* Section */\n .section { margin-bottom: 40px; }\n .section-number {\n font-size: 12px; font-weight: 500; letter-spacing: 0.6px;\n text-transform: uppercase; color: var(--brand);\n margin-bottom: 6px;\n }\n .section-title {\n font-size: 28px; font-weight: 600; line-height: 1.20;\n letter-spacing: -0.6px; color: var(--ink-strong);\n margin-bottom: 16px;\n }\n .section-body { font-size: 16px; color: var(--ink); }\n .section-body p { margin-bottom: 12px; }\n .section-body p:last-child { margin-bottom: 0; }\n\n /* Card */\n .card {\n background: var(--surface-1);\n box-shadow: var(--card-lifted);\n border-radius: var(--radius-lg);\n padding: 24px;\n margin-bottom: 20px;\n }\n .card-title {\n font-size: 22px; font-weight: 500; line-height: 1.25;\n letter-spacing: -0.4px; margin-bottom: 12px;\n }\n .card-body { font-size: 15px; color: var(--ink); line-height: 1.55; }\n\n /* Sub-card */\n .sub-card {\n background: var(--canvas);\n box-shadow: var(--hairline);\n border-radius: var(--radius-md);\n padding: 16px 20px;\n margin-bottom: 12px;\n }\n .sub-card:last-child { margin-bottom: 0; }\n .sub-card-title {\n font-size: 14px; font-weight: 500; margin-bottom: 6px; color: var(--ink-strong);\n }\n\n /* Lists */\n .task-list { list-style: none; counter-reset: task; }\n .task-list > li {\n counter-increment: task;\n padding: 20px 0;\n border-bottom: 1px solid var(--surface-3);\n position: relative;\n padding-left: 44px;\n }\n .task-list > li:last-child { border-bottom: none; }\n .task-list > li::before {\n content: counter(task);\n position: absolute; left: 0; top: 20px;\n width: 28px; height: 28px;\n background: var(--brand-soft);\n color: var(--brand-hover);\n font-size: 13px; font-weight: 600;\n display: flex; align-items: center; justify-content: center;\n border-radius: var(--radius-sm);\n }\n .task-label { font-weight: 500; font-size: 16px; margin-bottom: 4px; }\n .task-desc { font-size: 14px; color: var(--ink-muted); line-height: 1.50; }\n\n .dot-list { list-style: none; }\n .dot-list li {\n padding: 6px 0 6px 20px;\n position: relative;\n font-size: 14px;\n color: var(--ink-muted);\n }\n .dot-list li::before {\n content: \"\";\n position: absolute; left: 0; top: 13px;\n width: 6px; height: 6px;\n background: var(--data-4);\n border-radius: 50%;\n }\n .dot-list li strong { color: var(--ink); }\n\n /* Code */\n code {\n font-family: \"Geist Mono\", \"JetBrains Mono\", \"SF Mono\", ui-monospace, monospace;\n font-size: 13px;\n background: var(--surface-2);\n padding: 1px 6px;\n border-radius: 4px;\n color: var(--brand-hover);\n }\n pre {\n font-family: \"Geist Mono\", \"JetBrains Mono\", \"SF Mono\", ui-monospace, monospace;\n font-size: 13px;\n background: var(--surface-2);\n padding: 14px 16px;\n border-radius: var(--radius-md);\n overflow-x: auto;\n margin: 12px 0;\n line-height: 1.55;\n box-shadow: var(--hairline);\n }\n .inline-highlight {\n background: var(--brand-soft);\n color: var(--brand-hover);\n padding: 1px 6px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 13px;\n }\n\n /* Badges */\n .badge {\n display: inline-block;\n background: var(--brand-soft);\n color: var(--brand-hover);\n font-size: 12px; font-weight: 500;\n padding: 2px 10px;\n border-radius: 9999px;\n letter-spacing: 0;\n }\n .badge-required { background: #FEE2E2; color: #991B1B; }\n .badge-bonus { background: #DCFCE7; color: #166534; }\n\n /* Delivery box */\n .delivery-box {\n background: var(--surface-1);\n box-shadow: var(--card);\n border-radius: var(--radius-lg);\n padding: 24px;\n margin-bottom: 20px;\n border-left: 3px solid var(--brand);\n }\n .delivery-box h4 { font-size: 16px; font-weight: 500; margin-bottom: 8px; }\n .delivery-box p, .delivery-box li { font-size: 14px; color: var(--ink-muted); line-height: 1.50; }\n\n /* Rules */\n .rules-box {\n background: var(--surface-inverse, #1A1A1A);\n color: var(--ink-on-dark, #F7F7F5);\n border-radius: var(--radius-xl);\n padding: 32px;\n margin-bottom: 20px;\n }\n .rules-box p { font-size: 15px; line-height: 1.55; margin-bottom: 12px; letter-spacing: -0.02px; }\n .rules-box p:last-child { margin-bottom: 0; }\n .rules-box a { color: var(--brand-secondary); }\n .rules-box .highlight { color: var(--brand-secondary); font-weight: 500; }\n\n /* Attribution */\n .attribution {\n font-size: 12px; color: var(--ink-subtle);\n text-align: center;\n padding-top: 48px;\n border-top: 1px solid var(--surface-3);\n margin-top: 16px;\n line-height: 1.60;\n }\n\n /* hr */\n hr { border: none; border-top: 1px solid var(--surface-3); margin: 32px 0; }\n\n /* Template link */\n .template-link {\n display: inline-flex; align-items: center; gap: 6px;\n font-size: 13px; font-weight: 500;\n color: var(--brand);\n text-decoration: none;\n padding: 4px 12px;\n background: var(--brand-soft);\n border-radius: var(--radius-sm);\n }\n .template-link:hover { background: #E8C9B4; }\n\n /* File list */\n .file-list { list-style: none; }\n .file-list li {\n font-family: \"Geist Mono\", \"JetBrains Mono\", \"SF Mono\", ui-monospace, monospace;\n font-size: 13px;\n padding: 4px 0;\n color: var(--ink-muted);\n }\n .file-list li::before { content: \"→ \"; color: var(--brand); }\n\n @media (max-width: 600px) {\n .container { padding: 32px 16px 64px; }\n .header-title { font-size: 32px; letter-spacing: -1.2px; }\n .header-sub { font-size: 16px; }\n .card { padding: 20px; }\n .rules-box { padding: 24px; }\n }\n</style>\n</head>\n<body>\n<div class=\"container\">\n\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-eyebrow\">Intern Hiring Test</div>\n <h1 class=\"header-title\">Mini Exception Inbox</h1>\n <p class=\"header-sub\">Ingest messy factory data, detect deficits, serve through an API, and render a timeline inbox.</p>\n <div class=\"header-deadline\"><strong>Deadline:</strong> 4 days from receipt.</div>\n </div>\n\n <!-- Context -->\n <div class=\"section\">\n <div class=\"section-number\">Context</div>\n <div class=\"section-body\">\n <p>Factory data is messy. Turning it into decisions is the job. Instead of dashboards that show planners 500 alerts a day, the system we're building reasons across disruptions and writes the response back into the ERP. That means every piece of code — from data pipelines to API endpoints to the UI a planner clicks through — has to handle real-world messiness.</p>\n <p>This test is a miniature of that exact work. You're given two CSV files derived from real (Kaggle) store-item demand data, reframed as a manufacturing scenario: a <strong>production plan</strong> (what we said we'd make) and <strong>actual production</strong> (what we actually made). The gap between them — exceptions — is what needs to surface in an inbox someone acts on.</p>\n </div>\n </div>\n\n <!-- The Task -->\n <div class=\"section\">\n <div class=\"section-number\">The Task</div>\n <h2 class=\"section-title\">Build a Mini Exception Inbox</h2>\n\n <ol class=\"task-list\">\n <li>\n <div class=\"task-label\">Ingest</div>\n <div class=\"task-desc\">Load both CSVs into a relational database. Keep raw data and cleaned data separable (separate raw vs clean tables, or an equivalent pattern).</div>\n <ul class=\"file-list\" style=\"margin-top:8px\">\n <li>actual_production.csv — daily units actually produced</li>\n <li>production_plan.csv — daily planned production</li>\n </ul>\n </li>\n <li>\n <div class=\"task-label\">Detect Exceptions</div>\n <div class=\"task-desc\">A <strong>deficit exception</strong> exists for a given product on a given day when <code>units_produced &lt; 0.9 × planned_units</code>. Severity: <span class=\"inline-highlight\">high</span> if <code>units_produced &lt; 0.7 × planned_units</code>, otherwise <span class=\"inline-highlight\">medium</span>. Exceptions <strong>must be materialized as rows</strong> in a database table with a <code>status</code> column (<code>open</code>, <code>acknowledged</code>, <code>resolved</code>).</div>\n </li>\n <li>\n <div class=\"task-label\">API</div>\n <div class=\"task-desc\">Build a REST API (any language — FastAPI/Python scores familiarity points):</div>\n <ul class=\"dot-list\" style=\"margin-top:6px\">\n <li><strong>GET /exceptions</strong> — list, filterable by <code>product_code</code> and <code>severity</code>, sorted by date descending (worst deficit first within day)</li>\n <li><strong>GET /exceptions/{id}</strong> — detail with planned, actual, deficit %, and last-7-days trend</li>\n <li><strong>PATCH /exceptions/{id}</strong> — set status to <code>acknowledged</code> or <code>resolved</code>; must persist</li>\n </ul>\n </li>\n <li>\n <div class=\"task-label\">Frontend</div>\n <div class=\"task-desc\">Build a <strong>day-by-day timeline inbox</strong> (React preferred, any framework accepted):</div>\n <ul class=\"dot-list\" style=\"margin-top:6px\">\n <li>Exceptions grouped by date (newest first), worst deficit first within each day</li>\n <li>Collapsible day groups</li>\n <li>Severity badges + filters (by product, by severity) across the timeline</li>\n <li>Click → detail panel with numbers and 7-day trend (table or chart)</li>\n <li>Acknowledge/resolve without full page reload</li>\n </ul>\n </li>\n </ol>\n </div>\n\n <!-- Data Files -->\n <div class=\"section\">\n <div class=\"section-number\">Data</div>\n <h2 class=\"section-title\">Provided Files</h2>\n <div class=\"card\">\n <div class=\"sub-card\">\n <div class=\"sub-card-title\">actual_production.csv <span class=\"badge\" style=\"margin-left:6px\">Clean</span></div>\n <div style=\"font-size:13px; color:var(--ink-muted)\">1,080 rows · Columns: date, plant_id, product_code, units_produced</div>\n </div>\n <div class=\"sub-card\">\n <div class=\"sub-card-title\">production_plan.csv</div>\n <div style=\"font-size:13px; color:var(--ink-muted)\">~1,085 rows · Columns: plan_date, plant, sku, planned_units</div>\n </div>\n <p style=\"font-size:13px; color:var(--ink-muted); margin-top:12px\"><strong>Note:</strong> Column names differ between the two CSVs — you'll need to map them. Look at the data before you load it.</p>\n </div>\n </div>\n\n <!-- Submission -->\n <div class=\"section\">\n <div class=\"section-number\">Submission</div>\n <h2 class=\"section-title\">What to Submit</h2>\n\n <div class=\"delivery-box\">\n <h4>1. Code Archive</h4>\n <p>GitHub link or zip file. One command to run everything in <code>README.md</code>; <code>docker-compose up</code> is a bonus.</p>\n </div>\n\n <div class=\"delivery-box\">\n <h4>2. Presentation</h4>\n <p><strong>5–10 minutes max</strong> — PPT, video, HTML page, or any format you're comfortable with, covering:</p>\n <ul class=\"dot-list\" style=\"margin-top:6px\">\n <li>Demo of the app working end-to-end</li>\n <li>Walkthrough of your database schema and key decisions</li>\n <li>Explanation of your process: what you did, what you found in the data, tradeoffs you made</li>\n <li>Walkthrough of your <strong>process flow diagram</strong></li>\n <li>Anything you'd do differently</li>\n </ul>\n </div>\n\n <div class=\"delivery-box\">\n <h4>Inside the Code Archive — Supporting Documents</h4>\n <ul class=\"dot-list\" style=\"margin-top:6px\">\n <li><strong>APPROACH.md</strong> — use <code>templates/APPROACH_TEMPLATE.md</code> (~1 page). Include a <strong>process flow diagram</strong> showing your pipeline from data to UI.</li>\n <li><strong>AI_USAGE.md</strong> — use <code>templates/AI_USAGE_TEMPLATE.md</code>. <span class=\"badge badge-required\">Mandatory & Graded</span> Tools used, key prompts verbatim, where AI was wrong, % split.</li>\n <li><strong>README.md</strong> — architecture overview (use <code>templates/ARCHITECTURE_README_TEMPLATE.md</code> if helpful). Include a <strong>system architecture diagram</strong>.</li>\n </ul>\n </div>\n </div>\n\n <!-- Templates -->\n <div class=\"section\">\n <div class=\"section-number\">Resources</div>\n <h2 class=\"section-title\">Templates</h2>\n <div class=\"card\">\n <div style=\"display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px\">\n <span class=\"template-link\">📄 APPROACH_TEMPLATE.md</span>\n <span class=\"template-link\">📄 AI_USAGE_TEMPLATE.md</span>\n <span class=\"template-link\">📄 ARCHITECTURE_README_TEMPLATE.md</span>\n <span class=\"template-link\">📄 INSTRUCTIONS.html</span>\n </div>\n <p style=\"font-size:14px; color:var(--ink-muted)\">All templates are in the <code>templates/</code> folder. A markdown version of these instructions is in <code>ASSIGNMENT.md</code>.</p>\n </div>\n </div>\n\n <!-- Scoring -->\n <div class=\"section\">\n <div class=\"section-number\">Scoring</div>\n <h2 class=\"section-title\">What Matters</h2>\n <p class=\"section-body\" style=\"margin-bottom:16px\">We evaluate submissions on five dimensions (in priority order):</p>\n <div style=\"display:grid; gap:12px\">\n <div style=\"display:flex; align-items:flex-start; gap:12px; padding:12px 16px; background:var(--surface-2); border-radius:var(--radius-md)\">\n <span style=\"background:var(--brand); color:white; font-size:12px; font-weight:600; width:22px; height:22px; display:flex; align-items:center; justify-content:center; border-radius:50%; flex-shrink:0; margin-top:1px\">1</span>\n <div><strong>Data &amp; database</strong> — Did you inspect the data, handle its quirks, and design a sensible schema?</div>\n </div>\n <div style=\"display:flex; align-items:flex-start; gap:12px; padding:12px 16px; background:var(--surface-2); border-radius:var(--radius-md)\">\n <span style=\"background:var(--brand); color:white; font-size:12px; font-weight:600; width:22px; height:22px; display:flex; align-items:center; justify-content:center; border-radius:50%; flex-shrink:0; margin-top:1px\">2</span>\n <div><strong>Backend completeness</strong> — Working API with correct exception counts, filtering, and status mutation.</div>\n </div>\n <div style=\"display:flex; align-items:flex-start; gap:12px; padding:12px 16px; background:var(--surface-2); border-radius:var(--radius-md)\">\n <span style=\"background:var(--brand); color:white; font-size:12px; font-weight:600; width:22px; height:22px; display:flex; align-items:center; justify-content:center; border-radius:50%; flex-shrink:0; margin-top:1px\">3</span>\n <div><strong>Frontend</strong> — Inbox works end-to-end, detail view is correct, status updates without reload.</div>\n </div>\n <div style=\"display:flex; align-items:flex-start; gap:12px; padding:12px 16px; background:var(--surface-2); border-radius:var(--radius-md)\">\n <span style=\"background:var(--brand); color:white; font-size:12px; font-weight:600; width:22px; height:22px; display:flex; align-items:center; justify-content:center; border-radius:50%; flex-shrink:0; margin-top:1px\">4</span>\n <div><strong>AI usage quality</strong> — Quality of prompts, evidence of verifying AI output, honest reporting.</div>\n </div>\n <div style=\"display:flex; align-items:flex-start; gap:12px; padding:12px 16px; background:var(--surface-2); border-radius:var(--radius-md)\">\n <span style=\"background:var(--brand); color:white; font-size:12px; font-weight:600; width:22px; height:22px; display:flex; align-items:center; justify-content:center; border-radius:50%; flex-shrink:0; margin-top:1px\">5</span>\n <div><strong>Communication</strong> — Clear approach doc, architecture diagram, and presentation.</div>\n </div>\n </div>\n </div>\n\n <!-- Rules -->\n <div class=\"section\">\n <div class=\"section-number\">Rules</div>\n <h2 class=\"section-title\">Expectations</h2>\n <div class=\"rules-box\">\n <p>Using AI (Claude Code, Cursor, ChatGPT, Copilot&hellip;) is <span class=\"highlight\">expected and encouraged</span>. We are evaluating how well you drive it, not whether you avoided it. Hiding AI use, or an empty <code>AI_USAGE.md</code>, is a rejection signal.</p>\n <p><span class=\"highlight\">If you're looking for AI help:</span> <a href=\"https://opencode.ai\">Open Code</a> has free built-in LLMs (DeepSeek V4 Flash Free, Nemotron Ultra) that are enough to get the work done. If you already have a subscription to another tool, use whatever you're comfortable with.</p>\n <p><span class=\"highlight\">One hint:</span> Look at the data before you load it.</p>\n </div>\n </div>\n\n <!-- Data Attribution -->\n <div class=\"attribution\">\n Dataset derived from the <a href=\"https://www.kaggle.com/c/demand-forecasting-kernels-only\" style=\"color:var(--brand)\">Store Item Demand Forecasting Challenge</a> (Kaggle). Licensed under the competition rules.<br>\n \n </div>\n\n</div>\n</body>\n</html>\n"}}}}