obligations_build derives from receipt rows (sender/subject/label only). An organic recruiter thread with a neutral subject ("Your background and a Python Developer opening with our client" — the live JPMC lane, 2026-07-17) carries its protocol tokens (Engagement/Contract-to-Hire/recruiting language) in the BODY, so derive() lands it on the precedent rung and opportunity_sync never ingests it. Fix direction: capture a short snippet (first ~200 chars, PII-safe: stays in gitignored receipts) in inbox_sweep rows and pass it into derive()'s hay — parity with the classifier's design assumption. Workaround today: hand-seeded the register entry.
🤖 Generated with Claude Code
obligations_build derives from receipt rows (sender/subject/label only). An organic recruiter thread with a neutral subject ("Your background and a Python Developer opening with our client" — the live JPMC lane, 2026-07-17) carries its protocol tokens (Engagement/Contract-to-Hire/recruiting language) in the BODY, so derive() lands it on the precedent rung and opportunity_sync never ingests it. Fix direction: capture a short snippet (first ~200 chars, PII-safe: stays in gitignored receipts) in inbox_sweep rows and pass it into derive()'s hay — parity with the classifier's design assumption. Workaround today: hand-seeded the register entry.
🤖 Generated with Claude Code