release / govulncheck (push) Successful in 17s
release / web (push) Successful in 1m33s
release / go (push) Successful in 1m49s
release / integration (push) Successful in 5m42s
release / android (push) Successful in 5m59s
release / Build signed APK (releases and dev) (push) Successful in 6m9s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 16s
release / Verify release artifacts (tag releases only) (push) Skipped
Applies rule 32's migration exception: each header still says what the schema was, what changes and what it prevents, but task, milestone, decision and rule ids are replaced by the practice they stood for, the operator quotes by the decision, single-install counts are dropped, and pointers to a deleted package and an external design doc are gone. golang-migrate keeps no checksum, so editing applied migrations' comments is safe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
39 lines
2.0 KiB
SQL
39 lines
2.0 KiB
SQL
-- 0051_discover_tuning.up.sql — tunable knobs for the Discover request
|
|
-- surface.
|
|
--
|
|
-- A FOURTH tuning scope alongside radio / daily_mix / taste. Its own scope
|
|
-- rather than extra columns on taste_tuning, for a reason that matters:
|
|
-- snooze_days lives here, and a snooze must never be read as taste signal
|
|
-- (0049). Filing it under 'taste' would put it one careless join away from
|
|
-- exactly that leak.
|
|
--
|
|
-- These are DB-backed and editable in the admin UI with no restart — the
|
|
-- shipped values below are defaults, not settings.
|
|
CREATE TABLE discover_tuning (
|
|
singleton boolean PRIMARY KEY DEFAULT true
|
|
CONSTRAINT discover_tuning_singleton_check CHECK (singleton),
|
|
-- How strongly taste-tag overlap boosts a candidate's similarity score.
|
|
-- The blend is MULTIPLICATIVE: score * (1 + w * overlap), overlap in
|
|
-- [0,1]. So 0 disables the feature outright and leaves pure similarity
|
|
-- ranking, 1.0 lets a perfectly-matching candidate double its score, and
|
|
-- a candidate with no cached tags is unchanged rather than penalised
|
|
-- (tag coverage is permanently partial, so a missing tag is no signal).
|
|
tag_overlap_weight double precision NOT NULL,
|
|
-- Default snooze duration in days. Before this a Go constant in
|
|
-- internal/api/suggestions.go; now an admin setting.
|
|
snooze_days double precision NOT NULL,
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
INSERT INTO discover_tuning (singleton, tag_overlap_weight, snooze_days)
|
|
VALUES (true, 1.0, 90);
|
|
|
|
-- Rule #36: a new value for a CHECK-gated column needs the constraint
|
|
-- rewritten in the SAME change, or the first audit row written under the new
|
|
-- scope fails at runtime rather than at migrate time.
|
|
ALTER TABLE recommendation_tuning_audit
|
|
DROP CONSTRAINT recommendation_tuning_audit_scope_check;
|
|
ALTER TABLE recommendation_tuning_audit
|
|
ADD CONSTRAINT recommendation_tuning_audit_scope_check
|
|
CHECK (scope IN ('radio', 'daily_mix', 'taste', 'discover'));
|