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
${...} placeholders in authored metadata resolve to nothing and reach the consumer verbatim — the masked-failure escape #8078 measured, now load-bearing for two refusal messages #8336
Found while implementing #8082 (session session_01Euoy6wyfzgiWtgCg4s6JK2); measured originally during #8078 (#7990 census): a ${...} placeholder written in authored metadata (e.g. a datasource config.url of postgresql://${DB_HOST}/db) is resolved by nothing — it is stored verbatim in sys_metadata and handed verbatim to the database client at connect. The author believes environment substitution happens; the connection then fails (or connects somewhere unintended) with no error pointing at the unresolved placeholder — the masked-failure shape.
Why this now needs its own card
Two shipped refusal messages are written AROUND this defect rather than through it:
Implement resolution: define where ${ENV} in authored metadata is substituted (presumably at connect/render in services, never at rest), and which keys participate. Cost: a real capability with a security surface (env exfiltration via metadata authorship needs thought — who can author metadata that reads arbitrary server env vars?).
Refuse loudly at publish: placeholder syntax in connection-material keys is rejected with "placeholders are not resolved here" guidance, making the non-capability explicit (declared = enforced; startup-focus favors this until a real pull exists).
Either ends the silent half. The worst state is the current one: syntax that looks supported, stores fine, and fails at a distance.
Refs: #7990 (census measurement), #8078 (pinned "refuses a placeholder value exactly like a real one — the KEY is the sink"), #8082 (ruling naming this escape as binding context).
Found while implementing #8082 (session
session_01Euoy6wyfzgiWtgCg4s6JK2); measured originally during #8078 (#7990 census): a${...}placeholder written in authored metadata (e.g. a datasourceconfig.urlofpostgresql://${DB_HOST}/db) is resolved by nothing — it is stored verbatim insys_metadataand handed verbatim to the database client at connect. The author believes environment substitution happens; the connection then fails (or connects somewhere unintended) with no error pointing at the unresolved placeholder — the masked-failure shape.Why this now needs its own card
Two shipped refusal messages are written AROUND this defect rather than through it:
user:password@hostin driverconfig.url) remain a live cleartext door after #7990 — refuse at publish, or accept as residual risk? #8082's URL-userinfo refusal both had to say "do NOT substitute a placeholder" instead of offering substitution as the escape, because the escape is broken. The [Decision] URL-embedded credentials (user:password@hostin driverconfig.url) remain a live cleartext door after #7990 — refuse at publish, or accept as residual risk? #8082 maintainer ruling (on-card comment, 2026-08-12) explicitly names this as the alternative to fixing it in-card: keep the guidance honest, file the escape fix separately. The fix lives in the services/runtime resolution path (or in a publish-time refusal of placeholder syntax), outsidepackages/spec/src/data/driver/**— hence this card rather than a rider on [Decision] URL-embedded credentials (user:password@hostin driverconfig.url) remain a live cleartext door after #7990 — refuse at publish, or accept as residual risk? #8082's PR.getDatasource().config, fix the false "credential-stripped" claim, and write the stored-cleartext-rows migration story #8081 scopes the write/read scrub + stored-cleartext migration story, not placeholder resolution.Decision shape (for triage)
Two honest directions, mutually exclusive:
${ENV}in authored metadata is substituted (presumably at connect/render in services, never at rest), and which keys participate. Cost: a real capability with a security surface (env exfiltration via metadata authorship needs thought — who can author metadata that reads arbitrary server env vars?).Either ends the silent half. The worst state is the current one: syntax that looks supported, stores fine, and fails at a distance.
Refs: #7990 (census measurement), #8078 (pinned "refuses a placeholder value exactly like a real one — the KEY is the sink"), #8082 (ruling naming this escape as binding context).
Generated by Claude Code