Add managed content and keyboard usage insights
CI / verify (push) Has been cancelled
CI / publish (push) Has been cancelled

Introduce versioned official content workflows and privacy-safe keyboard analytics, while preventing repeat DeviceCheck sign-ins from incorrectly restricting eligible accounts.
This commit is contained in:
Rocky
2026-08-21 13:34:03 +08:00
parent b5212dcdc2
commit d0abe27623
55 changed files with 4690 additions and 111 deletions
@@ -0,0 +1,14 @@
-- Accounts with an immutable signup-trial grant were incorrectly restricted
-- when a later sign-in supplied a fresh ephemeral DeviceCheck token.
UPDATE accounts AS account
SET
account.anti_abuse_restricted = FALSE,
account.updated_at = CURRENT_TIMESTAMP(6)
WHERE account.anti_abuse_restricted = TRUE
AND EXISTS (
SELECT 1
FROM credit_ledger AS ledger
WHERE ledger.user_id = account.id
AND ledger.entry_type = 'SIGNUP_TRIAL'
AND ledger.idempotency_key = CONCAT('internal:signup-trial:', account.id)
);
@@ -0,0 +1,55 @@
-- Official content is immediately published. The singleton catalog row
-- serializes revision changes and also protects first-write hint versions.
CREATE TABLE official_content_catalog (
id TINYINT UNSIGNED NOT NULL,
revision BIGINT UNSIGNED NOT NULL DEFAULT 0,
generated_at DATETIME(6) NULL,
PRIMARY KEY (id),
CONSTRAINT chk_official_content_catalog_singleton CHECK (id = 1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO official_content_catalog (id, revision, generated_at)
VALUES (1, 0, NULL);
CREATE TABLE official_skills (
id VARCHAR(128) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
system_image VARCHAR(128) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
sort_order INT NOT NULL,
thinking_enabled BOOLEAN NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT FALSE,
created_at DATETIME(6) NOT NULL,
updated_at DATETIME(6) NOT NULL,
PRIMARY KEY (id),
KEY idx_official_skills_enabled_sort (enabled, sort_order, id),
CONSTRAINT chk_official_skills_id CHECK (id LIKE 'official.%')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE official_skill_localizations (
skill_id VARCHAR(128) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
locale VARCHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
name VARCHAR(120) NOT NULL,
summary VARCHAR(500) NOT NULL,
prompt TEXT NOT NULL,
PRIMARY KEY (skill_id, locale),
CONSTRAINT fk_official_skill_localizations_skill
FOREIGN KEY (skill_id) REFERENCES official_skills (id) ON DELETE CASCADE,
CONSTRAINT chk_official_skill_localizations_locale
CHECK (locale IN ('zh-Hans', 'en'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE official_hint_packs (
locale VARCHAR(8) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
generated_at DATETIME(6) NULL,
expires_at DATETIME(6) NULL,
interval_hours INT NULL,
version INT UNSIGNED NOT NULL,
cards_json MEDIUMTEXT NOT NULL,
updated_at DATETIME(6) NOT NULL,
PRIMARY KEY (locale),
CONSTRAINT chk_official_hint_packs_locale CHECK (locale IN ('zh', 'en')),
CONSTRAINT chk_official_hint_packs_interval
CHECK (interval_hours IS NULL OR interval_hours BETWEEN 1 AND 168),
CONSTRAINT chk_official_hint_packs_version CHECK (version >= 1),
CONSTRAINT chk_official_hint_packs_expiry
CHECK (expires_at IS NULL OR generated_at IS NULL OR expires_at > generated_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
@@ -0,0 +1,51 @@
-- Privacy-minimized daily counters for text manually committed by OSGKeyboard.
-- Raw text, key sequences, surrounding context and host application identifiers
-- are intentionally absent.
CREATE TABLE keyboard_usage_daily_summaries (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
installation_hash CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
client_summary_id CHAR(36) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
summary_date DATE NOT NULL,
chinese_character_count BIGINT UNSIGNED NOT NULL,
english_character_count BIGINT UNSIGNED NOT NULL,
other_character_count BIGINT UNSIGNED NOT NULL,
input_session_count BIGINT UNSIGNED NOT NULL,
chinese_only_session_count BIGINT UNSIGNED NOT NULL,
english_only_session_count BIGINT UNSIGNED NOT NULL,
mixed_language_session_count BIGINT UNSIGNED NOT NULL,
other_only_session_count BIGINT UNSIGNED NOT NULL,
app_version VARCHAR(32) CHARACTER SET ascii COLLATE ascii_bin NULL,
os_version VARCHAR(32) CHARACTER SET ascii COLLATE ascii_bin NULL,
payload_hash CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
received_at DATETIME(6) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uq_keyboard_usage_installation_id (installation_hash, client_summary_id),
UNIQUE KEY uq_keyboard_usage_installation_date (installation_hash, summary_date),
INDEX ix_keyboard_usage_summary_date (summary_date),
CONSTRAINT fk_keyboard_usage_installation
FOREIGN KEY (installation_hash)
REFERENCES product_analytics_installations (installation_hash)
ON DELETE CASCADE,
CONSTRAINT chk_keyboard_usage_chinese_count
CHECK (chinese_character_count <= 1000000),
CONSTRAINT chk_keyboard_usage_english_count
CHECK (english_character_count <= 1000000),
CONSTRAINT chk_keyboard_usage_other_count
CHECK (other_character_count <= 1000000),
CONSTRAINT chk_keyboard_usage_session_count
CHECK (input_session_count BETWEEN 1 AND 100000),
CONSTRAINT chk_keyboard_usage_session_partitions CHECK (
chinese_only_session_count <= 100000
AND english_only_session_count <= 100000
AND mixed_language_session_count <= 100000
AND other_only_session_count <= 100000
AND chinese_only_session_count
+ english_only_session_count
+ mixed_language_session_count
+ other_only_session_count = input_session_count
),
CONSTRAINT chk_keyboard_usage_characters CHECK (
chinese_character_count + english_character_count + other_character_count
>= input_session_count
)
) ENGINE = InnoDB;