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.
1 line
20 KiB
JSON
1 line
20 KiB
JSON
{"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 < 0.9 × planned_units</code>. Severity: <span class=\"inline-highlight\">high</span> if <code>units_produced < 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 & 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…) 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"}}}} |