Found while implementing #9041 (dispatch session session_01225pUjnCKWqxcc1PeqKFUq), filed rather than folded in: the #9041 triage fences scope that refusal to a present config.url ("a mongo config.url whose userinfo names NO user"), so the composed spelling of the identical defect stays accepted.
What happens
A mongo datasource with NO config.url, discrete fields naming no username, and a bound secret:
driver: mongodbconfig: { database: events, host: mongo.internal }external: { credentialsRef: "sys_secret:..." }buildMongoUrl in packages/services/service-datasource/src/default-datasource-driver-factory.ts composes the URI with const auth = user ? ... : ''; — no username, no credential, the bound secret is never used, and the datasource connects anonymously with the operator told nothing. Byte-for-byte the same "binding is a silent no-op at connect" defect #9041 closes for the URL-bearing spelling, one branch over (the #9041 card itself measured that the two branches have always agreed on this input).
Why #9041 did not close it
Its triage fences (adopted from the card, binding on the dispatch) scope the refusal to the pair with config.url present; the datasource-level refinement landed by the #9041 PR deliberately skips when url is absent, and its test file pins the composed branch as out of scope. Extending the refusal is a one-condition widening of the same refinement (url absent AND the discrete username key absent AND credentialsRef bound), but it is a fresh accept-set narrowing over a shape the fences deliberately excluded, so it needs its own triage rather than a rider.
Notes for triage
Backlink: #9041 (URL-bearing spelling; its PR carries the refinement this would extend), #8696 (the injection whose composed branch this is), #8153 (wizard reachability).
Found while implementing #9041 (dispatch session
session_01225pUjnCKWqxcc1PeqKFUq), filed rather than folded in: the #9041 triage fences scope that refusal to a presentconfig.url("a mongoconfig.urlwhose userinfo names NO user"), so the composed spelling of the identical defect stays accepted.What happens
A mongo datasource with NO
config.url, discrete fields naming nousername, and a bound secret:buildMongoUrlinpackages/services/service-datasource/src/default-datasource-driver-factory.tscomposes the URI withconst auth = user ? ... : '';— no username, no credential, the bound secret is never used, and the datasource connects anonymously with the operator told nothing. Byte-for-byte the same "binding is a silent no-op at connect" defect #9041 closes for the URL-bearing spelling, one branch over (the #9041 card itself measured that the two branches have always agreed on this input).Why #9041 did not close it
Its triage fences (adopted from the card, binding on the dispatch) scope the refusal to the pair with
config.urlpresent; the datasource-level refinement landed by the #9041 PR deliberately skips whenurlis absent, and its test file pins the composed branch as out of scope. Extending the refusal is a one-condition widening of the same refinement (urlabsent AND the discreteusernamekey absent ANDcredentialsRefbound), but it is a fresh accept-set narrowing over a shape the fences deliberately excluded, so it needs its own triage rather than a rider.Notes for triage
external.credentialsRefbound + aconfig.urlnaming no user" — the binding is a silent no-op at connect #9041: addusernametoconfig(the discrete key is live on this branch), or drop the binding.credentialsRefon managed datasources of any driver (Every wizard-created datasource with a password is badged invalid today — the service writes external.credentialsRef onto rows whose schemaMode defaults to 'managed', which the schema refuses #8153), so the pair is reachable from the Setup form as well as authored source.external.credentialsRefreaches the knex config but NOT the server on the postgres DSN branch —pgoverrides it with the connection string #8873 measuredpgreceiving the bound password regardless of the DSN naming a user.Backlink: #9041 (URL-bearing spelling; its PR carries the refinement this would extend), #8696 (the injection whose composed branch this is), #8153 (wizard reachability).