Repository navigation
fix(topology): complete live ENI reads and tighten owner resolution - #259
Conversation
- Page the live ENI read to completion (it runs ~500 per account, so one 500-row page left the live resolver inert) and stop fetching RDS sources the live page always treated as incomplete. - Recognize EC2's real `natGateway` InterfaceType. - Merge one ENI seen under several accounts of a shared VPC; two different ENIs claiming one IP now report owner_ambiguous instead of a silent null. - Report owner_not_synced when every DB names one cluster that the complete cluster read lacks. - Rank ENIs, which are excluded from the fleet total, below real resources in the trend chip ordering. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🤖 AI Code Review (two independent reviewers)Reviewer responses: codex/ALL claude/ALL Status: PASSED — No blocking issues found All claims verified. Codex's stated mechanism for the PR #259 Chair Review — fix(topology): complete live ENI reads and tighten owner resolutionSummaryThis PR fixes three real defects: NAT gateway ENIs were never matched by Issues per lensL2 — Code correctnessNo CRITICAL/MAJOR. Both panels confirmed all new symbols resolve against BASE plus the patch (
L3 — Security / AWS mutation safetyNo findings — both models agree. No AWS-mutating path, Terraform, IAM, or worker change; the AWS-facing surface shrinks (three read types dropped from the live loader). ADR-005's frozen mutation boundary and the ADR-015/ADR-023 exceptions are untouched. No hardcoded secrets; account IDs are documentation-range test fixtures. The ENI projection continues to keep private addresses only, and the new L4 — Observability / data-integration correctnessNo CRITICAL/MAJOR. One model verified the substantive data claims in depth; the other concurred that incomplete-source handling stays fail-closed:
L5 — Docs/ADR consistencyNo CRITICAL/MAJOR. The runbook, API reference, CHANGELOG (English and Korean, kept 1:1, amending the existing feature bullet in place per the CHANGELOG rule), and all four docs-site locales are mutually consistent with the code. No ADR needed touching.
Suggestions
VerdictNo CRITICAL or MAJOR findings from either panel survived verification; the one finding both models converged on was adopted only in its verified (MINOR) form, with codex's stated failure mechanism disproven against the base code. The image manifest lists no images, deletions, or omitted/unavailable entries. IMAGE_COVERAGE: NOT_REQUIRED Triggered by commit |
- api-reference and source-sync-observability now name network interfaces in the critical paged-read set the live topology page uses. - graph-read-contract states that the live page never reads RDS sources. - Core Resources chips exclude fleet-total-excluded types, so ENIs never take one; the trend ranking uses one fleet-total predicate. - Copies of one ENI merge only when every owner-identifying field agrees; disagreeing copies resolve as owner_ambiguous in either order. - Accept both natGateway and nat_gateway interface types. - Tests: ENI paging offsets, no live RDS reads, disagreeing copies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Core chips excluded ENIs by predicate while Other was still a positional slice, so on a fleet with four or fewer counted types the ENI series fell into no legend group and was visible by default. trendLegendGroups() now builds the charted series and both groups from one rule: Core is the top 5 fleet-counted types, Other is the next 3 plus attachment-only types (ENIs), and derived security series keep their own group. ENIs stay reachable however many types the fleet has. The guide (four locales) and the CHANGELOG bullet describe this. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Follow-up to the ENI/DB-endpoint discovery change, addressing the non-blocking review findings and a live observation.
Why
After the dev rollout, the inventory sync collects about 970 ENIs across the registered accounts. The live
/topologypage read ENIs as a single 500-row page, so the read was always capped and the resolver correctly refused every live ENI owner.Changes
enijoins the paged ownership reads (CRITICAL_TYPES), so it is read to completion within the existing 20-page bound.rds/rds_cluster/rds_proxy. It always treated them as incomplete (RDS placement inference stays saved-graph-only), so the three reads could never affect output. They are now passed to the resolver as incomplete without a request.natGatewayInterfaceType. The previousnat_gatewaycomparison never fired, and the test fixture used the same wrong value.owner_ambiguousinstead of anullthat was indistinguishable from "no ENI".owner_not_synced, notowner_ambiguous.Verification
npx tsc --noEmit -p .: clean.npx vitest run: 380 files passed, 4 skipped; 5,815 tests passed, 281 skipped. No SQL changed, so the PostgreSQL-backed suites were not rerun.No IAM, Terraform or collector change.
🤖 Generated with Claude Code