-- +goose Up -- Seed the tunable weights of the Capture Readiness bid pursue scorecard (Phase 1 of the Mission Workforce -- Technologies module set). It rides the SAME coefficient store as the learned models (no new tables), but it -- is a DETERMINISTIC WEIGHTED COMPOSITION, not a logistic model: the serve path (answerCaptureReadiness) reads -- these coefficients as the FACTOR WEIGHTS and computes an EXACT decimal weighted average of the four factors -- (each already in [0, 1]), never a logistic sigmoid, then maps the score to a GO / REVIEW / NO_GO recommendation. -- Storing the weights here (not in code) lets a governance owner tune the capture logic without a code change, -- and a later phase can fit a learned calibration on realized bid_outcomes on the same surface. The OutputKind -- is opportunity_score: it is an OPPORTUNITY level bid decision aid, never a per candidate score, so the frozen -- v1.4.0 engine stays the only per candidate scorer. A weighted average needs NO calibration bins, so none are -- seeded. The weights are the governance chosen defaults: staffing readiness 0.35, market win likelihood 0.30, -- incumbency position 0.20, past performance 0.15 (they sum to one). INSERT INTO aedt_learned_models (model_key, version, family, output_kind, feature_spec, champion, notes) VALUES ( 'opportunity_capture_readiness', 1, 'weighted_scorecard', 'opportunity_score', '{"factors": [{"name": "staffing_readiness", "source": "opportunity_requirements_green_coverage"}, {"name": "market_win_likelihood", "source": "bid_win_rate_by_segment"}, {"name": "incumbency_position", "source": "agency_award_concentration"}, {"name": "past_performance", "source": "segment_engagement_depth"}]}', true, 'Deterministic Capture Readiness scorecard v1. The coefficients are FACTOR WEIGHTS (staffing 0.35, market 0.30, incumbency 0.20, past performance 0.15) composed as an exact decimal weighted average, never a logistic sigmoid. GO at score >= 0.65, REVIEW 0.45 to 0.65, NO_GO below 0.45. OutputKind opportunity_score, an opportunity level bid pursue advisory, never a per candidate score.' ) ON CONFLICT (model_key, version) DO NOTHING; -- The four factor weights plus the reserved intercept (0.0; a weighted average has no bias term, stored only so -- the shape matches the other models). INSERT INTO aedt_model_coefficients (model_key, version, feature_name, coefficient) VALUES ('opportunity_capture_readiness', 1, 'intercept', 0.0000000000), ('opportunity_capture_readiness', 1, 'staffing_readiness', 0.3500000000), ('opportunity_capture_readiness', 1, 'market_win_likelihood', 0.3000000000), ('opportunity_capture_readiness', 1, 'incumbency_position', 0.2000000000), ('opportunity_capture_readiness', 1, 'past_performance', 0.1500000000) ON CONFLICT (model_key, version, feature_name) DO NOTHING; -- +goose Down DELETE FROM aedt_model_coefficients WHERE model_key = 'opportunity_capture_readiness'; DELETE FROM aedt_learned_models WHERE model_key = 'opportunity_capture_readiness';