diff --git a/.changeset/1747-new-project-search-provider-keys.md b/.changeset/1747-new-project-search-provider-keys.md new file mode 100644 index 000000000..08f8fdbe0 --- /dev/null +++ b/.changeset/1747-new-project-search-provider-keys.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 1814 +--- +**`/gsd-settings` no longer warns about four search-provider keys on fresh projects (#1747)** — `buildNewProjectConfig` emits seven search-provider availability flags and `research-provider.cts` `providerAvailability()` consumes all seven, but only three were registered in `VALID_CONFIG_KEYS` (`config-schema.manifest.json`). Running `/gsd-settings` on a freshly generated `.planning/config.json` printed `unknown config key(s) … tavily_search, ref_search, perplexity, jina — these will be ignored` even though the user never hand-edited the config. The four missing keys are now registered alongside `brave_search`/`firecrawl`/`exa_search` and documented in `docs/CONFIGURATION.md`; a drift guard in `tests/bug-2530-valid-config-keys.test.cjs` now requires every config-driven research-provider flag to be in the schema, so a future provider addition cannot reintroduce the drift. diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index b3c8d066e..f845f9dcc 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -171,6 +171,10 @@ GSD stores project settings in `.planning/config.json`. Created during `/gsd-new | `brave_search` | boolean | `true`/`false` | auto-detected | Override auto-detection of Brave Search API availability. When unset, GSD checks for `BRAVE_API_KEY` env var or `~/.gsd/brave_api_key` file | | `firecrawl` | boolean | `true`/`false` | auto-detected | Override auto-detection of Firecrawl API availability. When unset, GSD checks for `FIRECRAWL_API_KEY` env var or `~/.gsd/firecrawl_api_key` file | | `exa_search` | boolean | `true`/`false` | auto-detected | Override auto-detection of Exa Search API availability. When unset, GSD checks for `EXA_API_KEY` env var or `~/.gsd/exa_api_key` file | +| `tavily_search` | boolean | `true`/`false` | auto-detected | Override auto-detection of Tavily Search API availability. When unset, GSD checks for `TAVILY_API_KEY` env var or `~/.gsd/tavily_api_key` file | +| `ref_search` | boolean | `true`/`false` | auto-detected | Override auto-detection of Ref search API availability. When unset, GSD checks for `REF_API_KEY` env var or `~/.gsd/ref_api_key` file | +| `perplexity` | boolean | `true`/`false` | auto-detected | Override auto-detection of Perplexity API availability. When unset, GSD checks for `PERPLEXITY_API_KEY` env var or `~/.gsd/perplexity_api_key` file | +| `jina` | boolean | `true`/`false` | `true` | Override auto-detection of Jina API availability. Jina is a terminal fallback in the docs waterfall and defaults to available (`true`); GSD checks for `JINA_API_KEY` env var or `~/.gsd/jina_api_key` file when an explicit override is needed | | `search_gitignored` | boolean | `true`/`false` | `false` | Legacy top-level alias for `planning.search_gitignored`. Prefer the namespaced form; this alias is accepted for backward compatibility | > **Note:** `granularity` was renamed from `depth` in v1.22.3. Existing configs are auto-migrated. @@ -190,6 +194,10 @@ API key fields accept a string value (the key itself). They can also be set to t | `brave_search` | string \| boolean \| null | `null` | Brave Search API key used for web research. Displayed as `****` in all UI / `config-set` output; never echoed plaintext | | `firecrawl` | string \| boolean \| null | `null` | Firecrawl API key for deep-crawl scraping. Masked in display | | `exa_search` | string \| boolean \| null | `null` | Exa Search API key for semantic search. Masked in display | +| `tavily_search` | string \| boolean \| null | `null` | Tavily Search API key used in the web-discovery waterfall. Masked in display | +| `ref_search` | string \| boolean \| null | `null` | Ref search API key used in the docs-discovery waterfall. Masked in display | +| `perplexity` | string \| boolean \| null | `null` | Perplexity API key used in the web-discovery waterfall. Masked in display | +| `jina` | string \| boolean \| null | `null` | Jina API key (docs / scrape fallback). Masked in display | **Masking convention (`gsd-core/bin/lib/secrets.cjs`):** keys 8+ characters render as `****`; shorter keys render as `****`; `null`/empty renders as `(unset)`. Plaintext is written as-is to `.planning/config.json` — that file is the security boundary — but the CLI, confirmation tables, logs, and `AskUserQuestion` descriptions never display the plaintext. This applies to the `config-set` command output itself: `config-set brave_search ` returns a JSON payload with the value masked. diff --git a/gsd-core/bin/shared/config-schema.manifest.json b/gsd-core/bin/shared/config-schema.manifest.json index fcd88656c..5933a2159 100644 --- a/gsd-core/bin/shared/config-schema.manifest.json +++ b/gsd-core/bin/shared/config-schema.manifest.json @@ -10,6 +10,10 @@ "brave_search", "firecrawl", "exa_search", + "tavily_search", + "ref_search", + "perplexity", + "jina", "workflow.plan_check", "workflow.verifier", "workflow.auto_advance", diff --git a/tests/bug-2530-valid-config-keys.test.cjs b/tests/bug-2530-valid-config-keys.test.cjs index 0518fa243..6e2d053d7 100644 --- a/tests/bug-2530-valid-config-keys.test.cjs +++ b/tests/bug-2530-valid-config-keys.test.cjs @@ -9,6 +9,9 @@ * #2535 — sub_repos and plan_checker legacy keys need CONFIG_KEY_SUGGESTIONS migration hints * #3162 — resolve_model_ids missing from VALID_CONFIG_KEYS; workflow._auto_chain_active must be * accepted by isValidConfigKey (written by workflows) without being user-visible + * #1747 — buildNewProjectConfig emits four search-provider keys (tavily_search, ref_search, + * perplexity, jina) that research-provider.cts consumes but were missing from + * VALID_CONFIG_KEYS, causing /gsd-settings unknown-key warnings on fresh projects */ const { describe, test } = require('node:test'); @@ -74,6 +77,48 @@ describe('VALID_CONFIG_KEYS correctness', () => { }); }); +describe('#1747: new-project config emits only schema-recognized provider keys', () => { + // buildNewProjectConfig emits seven search-provider availability flags and + // research-provider.cts providerAvailability() consumes all seven, but only + // three were in VALID_CONFIG_KEYS → /gsd-settings warned on the four + // unregistered keys (tavily_search, ref_search, perplexity, jina) for every + // freshly generated .planning/config.json. + + // The four keys that were emitted + consumed but missing from the schema. + const MISSING_KEYS = ['tavily_search', 'ref_search', 'perplexity', 'jina']; + + // Every config-driven provider flag read by providerAvailability() in + // src/research-provider.cts. context7/websearch are excluded: hardcoded + // `true`, not config-gated, so no config key to register. + const PROVIDER_CONFIG_KEYS = [ + 'brave_search', + 'firecrawl', + 'exa_search', + 'tavily_search', + 'ref_search', + 'perplexity', + 'jina', + ]; + + test('the four previously-missing provider keys are in VALID_CONFIG_KEYS', () => { + const absent = MISSING_KEYS.filter((k) => !VALID_CONFIG_KEYS.has(k)); + assert.deepStrictEqual( + absent, + [], + `These provider keys are emitted by buildNewProjectConfig and consumed by research-provider.cts but missing from VALID_CONFIG_KEYS:\n ${absent.join('\n ')}\n\nAdd them to gsd-core/bin/shared/config-schema.manifest.json (validKeys).` + ); + }); + + test('every config-driven research-provider flag is registered in the schema (drift guard)', () => { + const drifted = PROVIDER_CONFIG_KEYS.filter((k) => !VALID_CONFIG_KEYS.has(k)); + assert.deepStrictEqual( + drifted, + [], + `These research-provider config flags are not in VALID_CONFIG_KEYS — a fresh /gsd-new-project config would trigger an unknown-key warning under /gsd-settings:\n ${drifted.join('\n ')}\n\nWhen you add a provider to providerAvailability() in src/research-provider.cts, also register its config key in gsd-core/bin/shared/config-schema.manifest.json.` + ); + }); +}); + describe('ADR-857 Phase 6 capability config ownership', () => { test('migrated capability config keys are valid through the registry, not central schema residue', () => { const capabilityKeys = Object.keys(capabilityRegistry.configSchema || {}).sort(); diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 60863fea4..01ac8e2f5 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -41,7 +41,7 @@ "gsd-core/bin/gsd-tools.cjs": "5cf26d5f9e588cf8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "8bc541aabc2e143c", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index 0442c8d93..b5533158e 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -110,7 +110,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index e835da86c..56968938c 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -40,7 +40,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index ccba55dd2..7418471c7 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -44,7 +44,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index beb73b7b9..fbcc0922b 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -110,7 +110,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 44c7fae7d..c90373780 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -76,7 +76,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index cae745c94..1d322b817 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -42,7 +42,7 @@ "gsd-core/bin/gsd-tools.cjs": "5cf26d5f9e588cf8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "10226e9512dd44bf", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 2c83e4abe..7a727c6b5 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -110,7 +110,7 @@ "gsd-core/bin/gsd-tools.cjs": "5cf26d5f9e588cf8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/gemini.json b/tests/fixtures/golden-install-parity/gemini.json index 6f9c35449..69dfc87fd 100644 --- a/tests/fixtures/golden-install-parity/gemini.json +++ b/tests/fixtures/golden-install-parity/gemini.json @@ -110,7 +110,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 2f1dae88f..5e455d4e4 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -41,7 +41,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index 8daa73294..15d193cfd 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -110,7 +110,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index e150c8f97..a1137ad5c 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -77,7 +77,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index 704970c27..cfe7647f7 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -110,7 +110,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 0c61006b9..89988598d 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -41,7 +41,7 @@ "gsd-core/bin/gsd-tools.cjs": "74594e8bf36e5580", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 2bcc9e85b..14f69c2cc 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -41,7 +41,7 @@ "gsd-core/bin/gsd-tools.cjs": "5cf26d5f9e588cf8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index f12c4b968..a36878343 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -41,7 +41,7 @@ "gsd-core/bin/gsd-tools.cjs": "5cf26d5f9e588cf8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "65dea848d50969a2", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", "gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6", "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",