You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
✅ COMPLETE (2026-07-13). All six platform sections shipped (#1381–#1385), docs landed, config-supplied L1 secrets feed the #1373 startup warning (test-pinned per platform), and the conformance guard (#1387) prevents env-first regression workspace-wide. The invariant holds everywhere: [section] config → PLATFORM_* env → default, config always wins.
Summary
Guarantee every platform has a complete first-class config section ([telegram], [line], [feishu], [googlechat], [wecom], [teams]) covering all of its settings — credentials, connection, and behavior — with the invariant:
Resolution order: [section] config value → PLATFORM_* env var → default. Config always wins; env is a fallback only. Never consult env without checking the section first.
Today only the trust fields (allow_all_users / allowed_users, from #1356's Phase 1 PRs) follow this. Platform credentials and connection settings are still env-only for five of six platforms.
Parity Status (updated 2026-07-13 — ALL PLATFORMS DONE 🎉)
Platform
Section
Config-first today
Env-only remaining
Telegram
[telegram]
✅ ALL fields (resolve() → ResolvedTelegram, bridged via apply_telegram_config)
Core TelegramConfig with all fields Option<T> + resolve() applying config → TELEGRAM_* env → default per field (empty-string ${} expansion treated as unset)
Bridge struct (GatewayTelegramConfig) keeps openab-gateway free of an openab-core dependency
AppState::apply_telegram_config() overrides env-derived state after from_env
Env-only deployments keep working (fallback), config-only deployments work, mixed works — config wins per-field
Conformance guard (test(gateway): config-first conformance guard (#1375) #1387): workspace-wide source-scan test (openab-gateway/tests/config_first_conformance.rs) asserting every platform env var referenced in gateway/core/binary is in the canonical section-field mapping — negative-tested in all three locations; runs in the normal cargo test flow
Note
✅ COMPLETE (2026-07-13). All six platform sections shipped (#1381–#1385), docs landed, config-supplied L1 secrets feed the #1373 startup warning (test-pinned per platform), and the conformance guard (#1387) prevents env-first regression workspace-wide. The invariant holds everywhere:
[section]config →PLATFORM_*env → default, config always wins.Summary
Guarantee every platform has a complete first-class config section (
[telegram],[line],[feishu],[googlechat],[wecom],[teams]) covering all of its settings — credentials, connection, and behavior — with the invariant:Today only the trust fields (
allow_all_users/allowed_users, from #1356's Phase 1 PRs) follow this. Platform credentials and connection settings are still env-only for five of six platforms.Parity Status (updated 2026-07-13 — ALL PLATFORMS DONE 🎉)
[telegram]resolve()→ResolvedTelegram, bridged viaapply_telegram_config)[line][feishu][wecom][googlechat]from_partsDRY refactor)[teams]Reference Pattern (Telegram — already compliant)
TelegramConfigwith all fieldsOption<T>+resolve()applying config →TELEGRAM_*env → default per field (empty-string${}expansion treated as unset)GatewayTelegramConfig) keepsopenab-gatewayfree of anopenab-coredependencyAppState::apply_telegram_config()overrides env-derived state afterfrom_envPer-Platform Sub-Issues
channel_secret,channel_access_token,webhook_path[feishu]section (21 env vars; coordinate with #1357)PlatformTrustConfig)Shared Work
openab-gateway/tests/config_first_conformance.rs) asserting every platform env var referenced in gateway/core/binary is in the canonical section-field mapping — negative-tested in all three locations; runs in the normalcargo testflow[section]as primary and env as fallback (feat(line): full [line] section — credentials + connection config-first #1381–feat(feishu): full [feishu] section — all settings config-first #1385)line.channel_secret,feishu.encrypt_key,googlechat.audience) feed the feat(gateway): warn when webhook L1 auth is unenforceable (#1356 Phase 1) #1373 startup warning — eachapply_*_configruns beforewarn_unenforceable_l1, test-pinned per platform (feat(line): full [line] section — credentials + connection config-first #1381, feat(googlechat): full [googlechat] section — credentials + connection config-first #1383, feat(feishu): full [feishu] section — all settings config-first #1385)Refs
TelegramConfig::resolve()/apply_telegram_config(feat(telegram): add allow_all_users/allowed_users to [telegram] config #1297)