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
[services half of #7990] Close the datasource/connector credential write/read paths: scrub getDatasource().config, fix the false "credential-stripped" claim, and write the stored-cleartext-rows migration story #8081
Filed by the domain:spec PM seat (session session_0123k4cam2jEAkPmbJeoaY3r) at ACCEPT of PR #8078, executing the maintainer's Option-A ruling on #7990 (comment 5266068845, verbatim): 「Contract-first split: the spec half (schema refusals + guidance) first; the services write/read-path halves (including the false "credential-stripped" claim at datasource-admin-service.ts and the migration story for existing cleartext rows) as Blocked-by: sub-cards in their lanes. The existing-rows migration is in scope of the programme, not optional.」 Lane label set per that ruling's explicit lane naming; provenance also in #7990's claim comment 5266425167.
Stored-cleartext-rows migration story — in scope of the programme, not optional (ruling). No mechanical D2 conversion exists (a cleartext credential cannot be auto-encrypted into sys_secret without a decision about the secret's identity); the shape of the migration (admin tooling? one-time script? read-time refusal with re-entry prompt?) is this card's to propose — escalate the chosen shape if it is destructive.
turso encryptionKey (dev report Q2): credential-shaped, still writable — the binder injects exactly one secret slot and credentialsRef resolution cannot target encryptionKey. Option B (multi-slot binder) belongs here where the binder lives; until then the spec deliberately left it writable.
Managed datasources' credential slot (dev report Q3): DatasourceSchema refuses external when schemaMode: 'managed' (datasource.zod.ts:550), yet datasource-admin-service writes external.credentialsRef onto wizard records regardless of schemaMode — a re-parse would refuse managed rows. Dev recommendation A (allow external.credentialsRef, or a top-level ref, on managed) matches what the service already does; decide here alongside the write path, and hand the spec-side schema change back to domain:spec if A is chosen (contract change = spec seat + fable per the standing model clause).
Filed by the
domain:specPM seat (sessionsession_0123k4cam2jEAkPmbJeoaY3r) at ACCEPT of PR #8078, executing the maintainer's Option-A ruling on #7990 (comment 5266068845, verbatim): 「Contract-first split: the spec half (schema refusals + guidance) first; the services write/read-path halves (including the false "credential-stripped" claim atdatasource-admin-service.tsand the migration story for existing cleartext rows) asBlocked-by:sub-cards in their lanes. The existing-rows migration is in scope of the programme, not optional.」 Lane label set per that ruling's explicit lane naming; provenance also in #7990's claim comment 5266425167.Blocked-by:#8078Scope (the ruling's services half)
getDatasource()returns driverconfigverbatim (datasource-admin-service.ts:199) while:179carries a "credential-stripped" comment that never coveredconfig— the code claims a protection it does not perform ([security]sys_metadata.metadatais a general cleartext sink: any authored artefact whose schema permits an inline credential lands it there (datasourceconfig.password, connectorauthentication) #7990 body, survey-verified). With feat(spec)!: refuse inline credentials at publish — driver config + connector authoring door (#7990, spec half) #8078 landed, new rows cannot carryconfig.password/config.authToken, but stored rows still can — the read path must stop serving them in cleartext.PUT /meta, datasource-admin plugin) actually returns for it, and that the refusal guidance (secret binder /external.credentialsRef) surfaces to the caller rather than a generic 500.sys_secretwithout a decision about the secret's identity); the shape of the migration (admin tooling? one-time script? read-time refusal with re-entry prompt?) is this card's to propose — escalate the chosen shape if it is destructive.encryptionKey(dev report Q2): credential-shaped, still writable — the binder injects exactly one secret slot andcredentialsRefresolution cannot targetencryptionKey. Option B (multi-slot binder) belongs here where the binder lives; until then the spec deliberately left it writable.DatasourceSchemarefusesexternalwhenschemaMode: 'managed'(datasource.zod.ts:550), yetdatasource-admin-servicewritesexternal.credentialsRefonto wizard records regardless ofschemaMode— a re-parse would refuse managed rows. Dev recommendation A (allowexternal.credentialsRef, or a top-level ref, on managed) matches what the service already does; decide here alongside the write path, and hand the spec-side schema change back todomain:specif A is chosen (contract change = spec seat + fable per the standing model clause).Evidence trail
sys_metadata.metadatais a general cleartext sink: any authored artefact whose schema permits an inline credential lands it there (datasourceconfig.password, connectorauthentication) #7990 (the class card; stays open until this card and the migration land) — dev report comment 5268367568ExternalDataSourceSchema.authentication(clientSecret/apiKey) andMessageQueueConfigSchema.sasl.password— census toward #7990's parked boundary-guard reopen trigger #8075 (two further inline-credential schemas — census toward the parked Option-B boundary guard; separate card, not this one's scope)