Repository navigation
fix(web): show datasource completeness, limits and shared scope - #185
Conversation
🤖 AI Code Review (two independent reviewers)_Reviewer responses: codex/ALL claude/ALL _ Status: BLOCKED — CRITICAL/MAJOR issues must be resolved before merge All verification is complete. Both panels declared image coverage NOT_REQUIRED and the manifest is empty and complete, so no pixel evidence is needed. Here is the synthesized chair review. Chair Review — PR #185: fix(web): show datasource completeness, limits and shared scope1. SummaryThe web-tier hardening in this PR is genuinely good — the test-route credential-spread override fix, the malformed-id guard, the honest Stacked-PR note: the CHANGELOG says "Deploy the Lambda producers before the dependent Web changes," implying producer commits elsewhere. The producers live in this tree ( 2. Issues per lensL2 — Code correctness
L3 — Security / AWS mutation safetyBoth panels agree: no blocking security finding. ADR-005 boundary intact — only
L4 — Observability / data-integration correctnessNo Steampipe/CIS/AgentCore-diagnosis logic is touched; findings concern the datasource layer.
L5 — Docs / ADR consistency
3. Suggestions
4. VerdictConfirmed MAJORs in L2 (unreachable/false timeout limits, dead IMAGE_COVERAGE: NOT_REQUIRED Triggered by commit |
55ad447 to
ca77596
Compare
221d8e9 to
e40488f
Compare
ca77596 to
8b66c8d
Compare
e40488f to
662cfac
Compare
8b66c8d to
cf85a32
Compare
|
Status note for reviewers:
Full web suite on this head: 5532 passed, 275 skipped. |
a4efa72 to
6f300cf
Compare
The datasource API and UI report instance-specific configuration only, show effective execution/response limits, pass the selected window to trace and SaaS kinds, reject unsupported SQL range shapes, and label shared default datasources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-ups: the datasource guides (ko/en/ja/zh) and API reference describe the shared timeout contract, the real-query connection test and the Mimir API prefix; the reference doc records Loki saturation disclosure, the shared request deadline and the oauth_3lo posture. The form no longer offers oauth_3lo. A Datadog instance's legacy key pair counts as configured and survives a settings-only PATCH regardless of the row's authType. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The enable-time transport check is superseded by the merged default-off governance gate, which admits only api_key and oauth_client_credentials; registration validation and the form still reject oauth_3lo. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6f300cf to
b32c18f
Compare
Reverts the #185 squash (b5bfb94). It was merged into this branch instead of dev, which pushed this PR's diff to 245 KB — past the AI review input limit, so the reviewers were never called. The web and documentation change returns as a dev-based PR after this one merges. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…183) * fix(datasources): bound connector reads and verify real query access Datasource Lambdas cap success (4 MiB) and error (64 KiB) bodies before parsing and close streams on every exit. Missing explicit instance IDs fail closed. Connection tests run the real bounded query operation, and Jaeger/Dynatrace/Datadog/Loki report partial or unverified results instead of absence. Prometheus/Mimir enforce the saved execution ceiling inside the connector. Optional Jaeger/Dynatrace VPC attachment stays default-off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(datasources): share one request deadline and disclose limit saturation Review follow-ups for the connector bounds: connect, headers and body share one monotonic deadline so a slow upstream cannot double the aligned HTTP timeout past the Lambda wall; oversized or slow error bodies keep their HTTP status. Loki and Jaeger report limit saturation as partial with requested/returned counts, separately from byte-bound loss. Connection probes return latency_ms, accept empty or warned results, and keep the SSRF classification. The default kind mirror is stamped with its instance id, the id-keyed lookup accepts only that default's mirror (legacy unstamped mirrors keep working with a warning until the next save), and timeoutS rides the console conn config for every kind. Restores the resolve-and-recheck disclosure that the stacked agent change replaces. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * test(web): expect the stamped instance id on default re-mirrors Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: bind datasource credentials to their registered identity * fix: address review feedback (iteration 2/5) * fix(agent): pin custom MCP connections to the validated address (#184) Custom MCP transports connect to the address set validated at request time while preserving Host, TLS SNI and certificate verification, and reject every 3xx. IPv6 addresses are bracketed so AAAA-only endpoints connect. The transport deadline and the MCP session read timeout follow a 60s read budget separate from the 8s connect budget. A malformed port is an SSRF-classified rejection, discarded per-address failures are logged, and pasted trailing whitespace in an api_key value is stripped. The pin composes with the default-off custom MCP governance: spec validation and the attested secret version run first, then the validated addresses are pinned for that session. Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(web): show datasource completeness, limits and shared scope (#185) * fix(web): show datasource completeness, limits and shared scope The datasource API and UI report instance-specific configuration only, show effective execution/response limits, pass the selected window to trace and SaaS kinds, reject unsupported SQL range shapes, and label shared default datasources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): align datasource guides with the stacked connector contract Review follow-ups: the datasource guides (ko/en/ja/zh) and API reference describe the shared timeout contract, the real-query connection test and the Mimir API prefix; the reference doc records Loki saturation disclosure, the shared request deadline and the oauth_3lo posture. The form no longer offers oauth_3lo. A Datadog instance's legacy key pair counts as configured and survives a settings-only PATCH regardless of the row's authType. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: address review feedback (iteration 1/5) * fix: address review feedback (iteration 2/5) * fix(web): defer oauth_3lo enablement to the custom MCP governance gate The enable-time transport check is superseded by the merged default-off governance gate, which admits only api_key and oauth_client_credentials; registration validation and the form still reject oauth_3lo. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * revert: move the web/datasource contract change out of this PR Reverts the #185 squash (b5bfb94). It was merged into this branch instead of dev, which pushed this PR's diff to 245 KB — past the AI review input limit, so the reviewers were never called. The web and documentation change returns as a dev-based PR after this one merges. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * chore: move the web credential-contract changes to the web PR The instance-id stamp on the default kind mirror, the console-path timeoutS forwarding and the default/delete mirror handling are web changes that ship with the datasource web contract PR. Keeping them here pushed this PR against the review input limit; the connector side already fails closed without an id-bound credential, and the runbook's backfill (re-save the default) writes the id key with today's web code. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: address review feedback (iteration 2/5) * fix: address review feedback (iteration 3/5) * fix: address review feedback (iteration 4/5) * chore: keep this PR within the review input limit The optional Jaeger/Dynatrace VPC flags move to their own PR and the datasource-development FAQ wording moves to the web contract PR; both are independent of the connector changes reviewed here. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * chore: carry the connector CHANGELOG entry in the web contract PR The feature-level bullet describes the net behavior of the connector and web changes together, so it ships with the final PR of the pair; this keeps the connector PR within the review input limit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: address review feedback (iteration 5/5) * chore: move connector regression tests to a stacked follow-up PR The AI review input limit is 128 KiB and this PR's diff was 131 KiB, so the review never reached a model. The 544-line test_external_connections.py moves unchanged to a follow-up PR stacked on this branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: address review feedback (iteration 6/10) * fix: address review feedback (iteration 7/10) * fix: address review feedback (iteration 8/10) * fix: address review feedback (iteration 9/10) * fix: address review feedback (iteration 10/10) * chore: keep this PR within the review input limit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: address review feedback (iteration 11/12) * chore: move the Dynatrace connector regressions to the stacked test PR Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#191) * fix(datasources): bound connector reads and verify real query access Datasource Lambdas cap success (4 MiB) and error (64 KiB) bodies before parsing and close streams on every exit. Missing explicit instance IDs fail closed. Connection tests run the real bounded query operation, and Jaeger/Dynatrace/Datadog/Loki report partial or unverified results instead of absence. Prometheus/Mimir enforce the saved execution ceiling inside the connector. Optional Jaeger/Dynatrace VPC attachment stays default-off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(datasources): share one request deadline and disclose limit saturation Review follow-ups for the connector bounds: connect, headers and body share one monotonic deadline so a slow upstream cannot double the aligned HTTP timeout past the Lambda wall; oversized or slow error bodies keep their HTTP status. Loki and Jaeger report limit saturation as partial with requested/returned counts, separately from byte-bound loss. Connection probes return latency_ms, accept empty or warned results, and keep the SSRF classification. The default kind mirror is stamped with its instance id, the id-keyed lookup accepts only that default's mirror (legacy unstamped mirrors keep working with a warning until the next save), and timeoutS rides the console conn config for every kind. Restores the resolve-and-recheck disclosure that the stacked agent change replaces. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * test(web): expect the stamped instance id on default re-mirrors Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: bind datasource credentials to their registered identity * fix: address review feedback (iteration 2/5) * fix(agent): pin custom MCP connections to the validated address (#184) Custom MCP transports connect to the address set validated at request time while preserving Host, TLS SNI and certificate verification, and reject every 3xx. IPv6 addresses are bracketed so AAAA-only endpoints connect. The transport deadline and the MCP session read timeout follow a 60s read budget separate from the 8s connect budget. A malformed port is an SSRF-classified rejection, discarded per-address failures are logged, and pasted trailing whitespace in an api_key value is stripped. The pin composes with the default-off custom MCP governance: spec validation and the attested secret version run first, then the validated addresses are pinned for that session. Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(web): show datasource completeness, limits and shared scope (#185) * fix(web): show datasource completeness, limits and shared scope The datasource API and UI report instance-specific configuration only, show effective execution/response limits, pass the selected window to trace and SaaS kinds, reject unsupported SQL range shapes, and label shared default datasources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): align datasource guides with the stacked connector contract Review follow-ups: the datasource guides (ko/en/ja/zh) and API reference describe the shared timeout contract, the real-query connection test and the Mimir API prefix; the reference doc records Loki saturation disclosure, the shared request deadline and the oauth_3lo posture. The form no longer offers oauth_3lo. A Datadog instance's legacy key pair counts as configured and survives a settings-only PATCH regardless of the row's authType. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: address review feedback (iteration 1/5) * fix: address review feedback (iteration 2/5) * fix(web): defer oauth_3lo enablement to the custom MCP governance gate The enable-time transport check is superseded by the merged default-off governance gate, which admits only api_key and oauth_client_credentials; registration validation and the form still reject oauth_3lo. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * revert: move the web/datasource contract change out of this PR Reverts the #185 squash (b5bfb94). It was merged into this branch instead of dev, which pushed this PR's diff to 245 KB — past the AI review input limit, so the reviewers were never called. The web and documentation change returns as a dev-based PR after this one merges. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * chore: move the web credential-contract changes to the web PR The instance-id stamp on the default kind mirror, the console-path timeoutS forwarding and the default/delete mirror handling are web changes that ship with the datasource web contract PR. Keeping them here pushed this PR against the review input limit; the connector side already fails closed without an id-bound credential, and the runbook's backfill (re-save the default) writes the id key with today's web code. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: address review feedback (iteration 2/5) * fix: address review feedback (iteration 3/5) * fix: address review feedback (iteration 4/5) * chore: keep this PR within the review input limit The optional Jaeger/Dynatrace VPC flags move to their own PR and the datasource-development FAQ wording moves to the web contract PR; both are independent of the connector changes reviewed here. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * chore: carry the connector CHANGELOG entry in the web contract PR The feature-level bullet describes the net behavior of the connector and web changes together, so it ships with the final PR of the pair; this keeps the connector PR within the review input limit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: address review feedback (iteration 5/5) * chore: move connector regression tests to a stacked follow-up PR The AI review input limit is 128 KiB and this PR's diff was 131 KiB, so the review never reached a model. The 544-line test_external_connections.py moves unchanged to a follow-up PR stacked on this branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(datasources): add connection identity and bounded I/O regressions Restores test_external_connections.py, split from the connector-bounds PR to keep that PR under the AI review input limit. Covers connection identity, bounded reads, query proof and result-completion behavior (121 tests). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: address review feedback (iteration 6/10) * test(datasources): count only emitted Jaeger traces in returnedCount Matches the connector change in the base PR: when the byte bound drops every trace, returnedCount is now the length of the emitted (empty) traces array. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: address review feedback (iteration 7/10) * fix: address review feedback (iteration 8/10) * fix: address review feedback (iteration 9/10) * fix: address review feedback (iteration 10/10) * chore: keep this PR within the review input limit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: address review feedback (iteration 11/12) * chore: move the Dynatrace connector regressions to the stacked test PR Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(datasources): carry the Dynatrace connector regressions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Part 3 of 3, stacked on #184 (
fix/custom-mcp-pinned-transport), which is stacked on #183. Merge last and retarget todevonce #184 merges. This PR holds the web/UI contract and all documentation for the three parts, so every claim is backed by code below it in the stack.configured,connectionStatus,scope: 'shared'), never a borrowed kind default or a connectivity claim. A Datadog instance's legacyapiKey/appKeypair counts as configured and survives a settings-only PATCH regardless of the row'sauthType.apiPrefixis validated, persisted and read by the connector.{ok, latencyMs, verified, error?}from the real-query probe.oauth_3lois rejected at registration and enablement and the form no longer offers it; a historical row fails closed at connect.docs/reference/external-connections.md(indexed),docs/api-reference.mddatasource rows, the datasource guides in ko/en/ja/zh (both theobservabilityandmonitoringpages — the latter had still described the old 10s/12s behavior), and the CHANGELOG datasource entries (EN/KO, amended in place).Review follow-ups (round 1)
The MAJORs about unreachable 55s / unread
timeoutS/ deadapiPrefix/ missingverified/ undisclosed truncation were all "connector code lives in another PR" — resolved by stacking on #183, which implements each one. Remaining items fixed here: themonitoring/datasources.mdguide (4 locales) andapi-reference.mdwere stale; Datadog legacy keys for the badge and the prune;oauth_3loremoved from the dropdown; CHANGELOG wording now matches the stacked code (it no longer claims anything the stack does not do). The ADR-007 custom-MCP finding was rejected by the chair and is settled by #177.Tests
bash scripts/v2/merge-verify.shon Python 3.12 on this branch (full stack): web vitest PASS (5451 passed), Terraform fmt PASS, deployment Node tests PASS; only the codec-sandbox tests fail for the known environmental reason (same ondev).npx tsc --noEmit -p .→ 96 errors, identical to thedevbaseline (existing test files, none in this diff).🤖 Generated with Claude Code