Context
I am extending an existing ERD explorer into a browser-accessible tool for people investigating unfamiliar databases. The aim is to preserve its useful visualization while making source access, metadata coverage and relationship evidence understandable. Warehouse systems make a demanding test case: identifiers are often scoped by tenant, site or owner, and useful relationships may never have been declared as foreign keys.
This case study covers a personal Azure environment with invented database contents. The current hosted destination is SQL Server/Azure SQL. Earlier registered-mode results retain their own revisions; additional hosted-engine acceptance and evaluated AI assistance remain delivery goals.
Architecture
The current Node.js deployment uses session-only connections. Connection setup defaults to Microsoft Entra; an explicit database-password option is available only where the host policy permits it. This personal demo permits one approved synthetic SQL Server destination on its private Azure network.
Before metadata extraction, the application prepares the complete SQL for the selected scope. The user reviews and explicitly approves that exact plan; approval is single-use and invalidated by source, account or scope changes. Extraction does not assume a named schema, and the existing graph coloring is preserved.
Connection details, credentials and tokens, approvals and working models are held in memory for the session. Persistent model-store operations are unavailable in this deployment. Earlier saved versions were retained; this release did not migrate or delete them.
Earlier registered-mode releases used server-side source registrations and managed identities, with persistent model versions stored separately. The historical SQL and saved-model evidence below belongs to those releases.
A dedicated workspace on this website displays the protected application in a frame after the visitor chooses to load it. Microsoft sign-in opens separately, and a full-window option remains available when browser session policies prevent embedding. The static portfolio has no database access and does not proxy authentication.
Engineering Decisions
Keep catalog facts and proposed relationships distinct. A declared constraint carries different evidence from a naming guess, and a partially visible catalog must not appear complete. Discovery uses metadata permissions with row sampling disabled in this demo.
A database can be reachable yet paused. Connection establishment and later pool acquisition have bounded retry budgets. The application disables the driver's nested retry loop and retries only before handing a connection to caller work; queries, writes and transaction operations are never automatically replayed.
Earlier Control Center work used a structured grid, yellow connection panel, charcoal version area and restrained red accents to distinguish discovery, versioning and review. Keyboard focus, file selection and narrow layouts were checked in that registered-mode workflow. The session release preserves diagram colors while making connection setup and exact SQL approval explicit.
How It Breaks
The first retry implementation passed tests whose simulated login errors retained a SQL error number. The actual driver discarded that number when wrapping the error. Review also found that native retries could multiply the application's attempts and exceed the intended deadline.
Application activation is a separate failure mode. In an earlier rollout, selecting a package started activation before an explicit restart was issued. The restart overlapped the first warmup, which failed; a later demand-start succeeded. The logs prove the overlap but do not establish it as the cause. Subsequent registered-mode releases activated successfully without an explicit restart, and a healthy-package rollback cycle was later rehearsed. Database backup/restore, schema-migration recovery and broader outage recovery remain unproven.
During the website embedding check, one saved-model request reported a database sign-in error. Its log lacked the underlying SQL number, so that historical cause remains unknown. Follow-up driver tests reproduced a separate gap: the successful initial probe did not protect later physical connection acquisition. A later transient SQL error could therefore fail a request as an authentication error.
Testing & UAT
Current release 0ef82f9 was deployed on October 6, 2026 (UTC). Its CI package passed source/browser, container and Windows package checks. Live readback matched all 8,337 mounted files, confirmed a changed serving process and the approved session configuration, and verified health and unauthenticated access denials. These deployment checks did not execute SQL or complete a real database sign-in.
The new session flow still needs real Microsoft Entra database consent, database-rights and extraction checks, a previously unseen SQL Server source, hosted PostgreSQL and database access across resource tenants. MySQL remains planned. Authenticated representative-user UAT, fresh sign-in, session expiry and browser restrictions on embedded sessions remain open.
Historical registered-mode release 5ab5907 passed 203 local Node checks: 25 core, 143 unit and 35 HTTP, with zero skips. All three CI jobs passed on the first attempt. Three integration tests were rerun against actual Azure SQL with zero skips, covering identity/source isolation and cancellation, an independent catalog oracle, and transactional version/concurrency/rollback behavior. All four expected database identities matched.
At earlier release 5fb36ac, authenticated browser inspection generated a four-entity model with two declared relationships from an initially paused source, saved a baseline to an initially paused store and reopened it. The Control Center passed 21 existing browser UAT checks and responsive inspection from 320 to 1440 CSS pixels. These earlier observations retain their own revision.
Embedding release cb41d54 passed all three CI jobs and 23 Control Center browser checks in both framed and standalone harnesses. A fresh live four-entity/two-relationship model opened inside the published website. On earlier release aba7c91, both saved models listed successfully and the source-B baseline reopened in the same frame. These browser checks used an existing signed-in session.
Three authored warehouse scenarios exercise normalized SQL Server, a legacy WMS and PostgreSQL metadata. The two SQL Server seeds ran against a local Developer instance and matched an independent catalog check. Earlier registered-mode PostgreSQL 18.6 discovery passed 18 actual local integration checks over verified TLS, including native catalogs and HTTP preview/generate/save/reopen. Actual browser checks also confirmed Keep and Escape preserve an unsaved model, Continue loads the saved baseline, and Explorer renders its 12 entities and 25 relationships. The PostgreSQL adapter remains included in the package, but no hosted PostgreSQL destination is approved or verified for the current demo. Representative-user UAT, real role/tenant subjects, fresh sign-in and the complete demo walkthrough remain open.
AI: Now / Future
The inference goal is useful assistance that explains its evidence and can abstain. A confident-looking diagram is not enough if a suggested link joins records across warehouse or tenant boundaries.
Now
Relationship suggestions use deterministic complete-key naming rules, including composite key scope. The development result remains 20 of 23 selected missing links recovered. A separate post-hoc review supports 41 additional mappings through documented paths and leaves two stock-balance joins unresolved. Twenty-three additions duplicate declared paths, so support alone does not establish usefulness. Overall precision is unknown. No model-backed inference has been implemented or evaluated.
Future · Proposed
Reduce redundant suggestions and address the wrong join exposed by the frozen transfer challenge. Future revisions need stronger semantic evidence, further unseen evaluation and the same abstention requirements. Any provider integration needs an explicit metadata boundary. The current session connection flow is deployed; hosted PostgreSQL, new-source and cross-resource-tenant acceptance remain unverified. MySQL remains planned.
Observability & Measurements
At the earlier runtime revision 1f1ffb4, the first request after management readback confirmed a paused source finished in 57,992 milliseconds. Two connection attempts returned SQL 40613 before a third connected; extraction then ran once. This is one historical request, not a latency distribution or a new measurement for the current release.
The earlier metadata rehearsal at revision 5fb36ac returned four entities, two declared relationships and eight complete facets with no warnings. At the earlier registered-mode release 5ab5907, restricted-source discovery again returned one visible table and six warnings, and twelve anonymous or spoofed-header requests received HTTP 401. These establish specific behavior in this personal environment, not comprehensive security or production-scale acceptance.
What Changed After Testing
Earlier registered-mode recovery work captured numeric login errors per physical connection and covered pool acquisition after initialization. Tests retain the installed driver and pool while replacing external transport. Review caught a cancellation race that leaked an acquired connection, pool timers that masked native timeouts, and failed transaction-begin cleanup; regression tests passed after correction. Runtime source hashes and protected configuration were verified after deployment.
In the historical registered-mode work, the first read-only probe verified unchanged saved models after 35-second physical pool expiry while the database was warm. A later probe kept the same initialized store alive for over 61 minutes and confirmed Azure reported it paused. Its next request recovered through two SQL 40613 failures, then read both saved versions unchanged in 46.360 seconds. This closes that specific pause/resume check. A later healthy-package rollback moved from 5ab5907 to retained aba7c91 and back, preserving all five saved versions and reopening the diagram on each release. Database backup recovery, failed-deployment recovery and session acceptance remain separate.
During the earlier registered-mode embedding work, the first embedded handoff opened a new window with an empty model. Keeping model navigation inside the frame preserved its browser storage context and fixed the observed failure. Opening a different saved version then also respected the existing unsaved-change confirmation; standalone behavior remained unchanged.
Warehouse fixture evaluation exposed the limits of single-column naming guesses. Inference requires complete primary or unique keys, coherent relationship roles and compatible known types. It recovers 20 of 23 selected missing links. A separate post-hoc review now accounts for the 43 additional proposals: 41 follow documented relationship paths and two stock-balance joins have unresolved business meaning. Twenty-three of the supported additions repeat declared FK paths, exposing diagram clutter as well as the limits of an accuracy count. Overall precision remains unknown.
In the earlier registered-mode workflow, switching away from an unsaved model stalled at a native browser confirmation before any saved-model request reached the server. An in-page Keep/Continue dialog handled cancellation, duplicate prompts and stale decisions. The corrected flow passed 68 relevant browser harness checks and a separate interactive PostgreSQL walkthrough. A missing delegated sign-in bundle path was also corrected; serving that bundle is not evidence of a completed delegated sign-in.
What I’d Change at 10× Scale
First measure extraction duration, catalog size, memory, cancellation and model-version growth under representative workloads. Those results should determine whether discovery needs background jobs or further limits. Keep per-source identity and coverage visible as more engines are introduced.
A separate transfer scenario was authored and reviewed before inference, then frozen in Git. The unchanged rules recovered all 15 selected links but emitted one known wrong landlord-to-stock-owner join and 17 unjudged suggestions. That metadata-only challenge exposes the need for semantic evidence beyond names and keys. Preserve its baseline, measure false suggestions and explained abstention, and use further unseen cases before broader claims. Additional engines need actual connector and catalog tests.