From 8570e5e21d84cded0c8eced54c72bbd20b9367f4 Mon Sep 17 00:00:00 2001 From: "Jeremy H. Carroll" Date: Mon, 2 Nov 2026 19:39:12 -0500 Subject: [PATCH] Document live Simplex deployment and reconcile wiki status --- IMPORT_GUIDE.md | 14 +- README.md | 9 +- docs/DEPLOYMENT.md | 70 ++++---- docs/MVP_SELECTION.md | 23 ++- docs/PROJECT_STATUS.md | 52 +++--- docs/verification/2026-11-02-deployment.md | 78 ++++++++ .../2026-11-02-public-live-http.json | 166 ++++++++++++++++++ .../2026-11-02-render-live-http.json | 166 ++++++++++++++++++ render.yaml | 4 +- wiki/Home.md | 5 +- wiki/Project-Status.md | 54 +++--- 11 files changed, 542 insertions(+), 99 deletions(-) create mode 100644 docs/verification/2026-11-02-deployment.md create mode 100644 docs/verification/2026-11-02-public-live-http.json create mode 100644 docs/verification/2026-11-02-render-live-http.json diff --git a/IMPORT_GUIDE.md b/IMPORT_GUIDE.md index 58df01a..d7c7e63 100644 --- a/IMPORT_GUIDE.md +++ b/IMPORT_GUIDE.md @@ -573,7 +573,7 @@ def check_strict_auditing_nf(schema: RelationalSchema) -> Tuple[bool, Optional[s ## 5. Deployment Guide: Companion Web Interface -The repository includes a companion web application, **Simplex-NF Studio ("The Normal Form Workbench")**, with a Render blueprint targeting `smplxnf.anomalon.com`. Configuration is not deployment evidence: see [current status](docs/PROJECT_STATUS.md) and the [deployment runbook](docs/DEPLOYMENT.md). +The repository includes a companion web application, **Simplex-NF Studio ("The Normal Form Workbench")**, deployed at [smplxnf.anomalon.com](https://smplxnf.anomalon.com) on the separate `smplxnf-live` Render service. HTTPS/API smoke checks passed on 2026-11-02; full live browser acceptance remains incomplete. See [current status](docs/PROJECT_STATUS.md), the [deployment record](docs/verification/2026-11-02-deployment.md) and the [deployment runbook](docs/DEPLOYMENT.md). The blueprint below matches the selected Free compute plan; Render separately disclosed a $0.25/month custom-domain charge approved by the user. ### 5.1 Local Development Server @@ -600,10 +600,10 @@ The repository includes a declarative `render.yaml` blueprint: ```yaml services: - type: web - name: smplxnf-studio + name: smplxnf-live env: python region: oregon - plan: starter + plan: free buildCommand: "pip install -e . && pip install -r web/requirements.txt" startCommand: "uvicorn web.app:app --host 0.0.0.0 --port $PORT" healthCheckPath: /healthz @@ -617,6 +617,10 @@ services: ``` #### Step-by-Step Render Deployment: +For the existing project, use the deployed `smplxnf-live` service described in the +[runbook](docs/DEPLOYMENT.md); do not create a duplicate. The following steps are +for a fresh deployment in another environment. + 1. Connect your GitHub repository to Render at [dashboard.render.com](https://dashboard.render.com). 2. Select **New > Blueprint** and link the repository. Render will automatically parse `render.yaml`. 3. Configure the custom domain in your DNS provider: @@ -647,7 +651,7 @@ In adherence to project claim discipline, the capabilities and operational bound - Does not assert that 3NF or BCNF normalization eliminates application-level semantic errors outside declared functional dependencies. ### 3. The narrowest defensible claim: -- In the declared discrete Python implementation, the relational synthesis algorithms, Chase tableau procedures, BQNF delta accumulation, and 4-layer NF-IR pipeline execute deterministically and pass all 136 automated tests in `simplex-normal-forms/tests/`. +- The original handoff reported 136 pytest items (89 unittest methods). Later correctness and packaging verification passed 232 tests, and all five hosted CI jobs passed for PR #21's tested head. These checks cover the declared implementation; the compiler workbench demonstrates FD lowering and a constructed subsumption comparison, not arbitrary execution of every catalog contract. See [current evidence and scope](docs/PROJECT_STATUS.md). ### 4. The next test needed: -- A high-concurrency multi-tenant benchmark measuring end-to-end latency and memory utilization when streaming 100,000 PostgreSQL WAL replication events through the deployed FastAPI service on Render. +- Complete the remaining live browser checklist when the user makes a browser available. Sustained-load and PostgreSQL WAL integration would require separately scoped implementation and experiments; the saved 15-check HTTP probe does not establish either capability. diff --git a/README.md b/README.md index f0f6055..fa0991b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **Boundary-Certified Data Architecture, Relational Normalization, Cochain Retraction & Representation Transport (`CODA_MUR`)** **Epistemic Standard:** Landau Rigor / Claim Discipline Compliant (`AuthorityEffect: None`, `certified_implies_authorized: false`) -[![Deployment status](https://img.shields.io/badge/Deployment-verification_pending-amber)](docs/PROJECT_STATUS.md) +[![Deployment status](https://img.shields.io/badge/Deployment-HTTPS_API_verified-green)](docs/PROJECT_STATUS.md) [![Deployment: Render](https://img.shields.io/badge/Deploy-onrender.com-46e3b7)](https://render.com) [![Adoption Guide: IMPORT_GUIDE.md](https://img.shields.io/badge/Adoption_Guide-IMPORT__GUIDE.md-10b981)](IMPORT_GUIDE.md) [![Architecture Spec: MVP_SELECTION.md](https://img.shields.io/badge/Architecture-MVP__SELECTION.md-8b5cf6)](docs/MVP_SELECTION.md) @@ -19,9 +19,10 @@ Experience the core theoretical and engineering capabilities of `simplex-normal-forms` in real time: -**Target URL:** [smplxnf.anomalon.com](https://smplxnf.anomalon.com). As of 2026-11-02, -the application is merged and locally tested; public DNS/HTTPS verification is -pending. See [project status](docs/PROJECT_STATUS.md) and the +**Live URL:** [smplxnf.anomalon.com](https://smplxnf.anomalon.com). On 2026-11-02, +HTTPS and all 15 API smoke checks passed on the separate `smplxnf-live` Render +service. Full live browser acceptance remains incomplete. See +[project status](docs/PROJECT_STATUS.md) and the [Render deployment and smoke-test runbook](docs/DEPLOYMENT.md). ### Four Flagship Engineering Workbenches diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 432f7e2..c261c70 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -1,57 +1,62 @@ # Render deployment and Phase 3 verification -The application and blueprint are implemented. Public deployment remains a -separate gate; see [the dated status](PROJECT_STATUS.md). PRs #17–19 are already -merged. Use the current reviewed `main`, not the old MVP feature branch. +The separate `smplxnf-live` service is deployed. On 2026-11-02, HTTPS and all 15 +API smoke checks passed on its Render origin and `smplxnf.anomalon.com`. +Full live browser acceptance remains incomplete. See [the dated status](PROJECT_STATUS.md) +and [deployment record](verification/2026-11-02-deployment.md). ## Render service -Inspect the existing [Render project](https://dashboard.render.com/project/prj-dbj5ei942hec73c30pu0) -before creating or syncing `smplxnf-studio` from [render.yaml](../render.yaml). +The [existing service](https://dashboard.render.com/web/srv-dbkh1v3ncjis73bbg3ug/settings) +is in the Production environment of the +[Render project](https://dashboard.render.com/project/prj-dbj5ei942hec73c30pu0). +[render.yaml](../render.yaml) now matches its name and compute plan. Inspect this +service before creating or syncing another resource. -| Setting | Blueprint value | +| Setting | Recorded deployment / blueprint value | | --- | --- | | Repository / branch | `https://github.com/dbccpage/simplex-normal-forms` / `main` | -| Runtime / region / plan | Python / Oregon / Starter | +| Service name | `smplxnf-live` | +| Runtime / region / plan | Python / Oregon / Free | | Build | `pip install -e . && pip install -r web/requirements.txt` | | Start | `uvicorn web.app:app --host 0.0.0.0 --port $PORT` | | Health check | `/healthz` | | Environment | `PYTHONUNBUFFERED=1`, `APP_ENVIRONMENT=production` | | Custom domain | `smplxnf.anomalon.com` | -Record the selected Python version and successful deploy's Git SHA. The blueprint -does not pin a Python version; Render's default depends on service creation date -([Render Python version documentation](https://render.com/docs/python-version)). -Record the actual instance plan and associated account commitment before provisioning. +The initial successful deploy used Python 3.14 and commit +`f9c289cc33f91c2b653f65e6267fde0073c3cd6f` (PR #21). The blueprint does not pin a +Python version. Capture the actual runtime and SHA again for future deployments. +The health response's application identifier remains `smplxnf-studio`; that +identifier is distinct from the Render resource name and does not identify a SHA. + +Compute is Free ($0/month). Render disclosed a separate $0.25/month custom-domain +charge and the user approved it; no billing invoice was audited. This deployment +does not establish cold-start performance or an always-on availability commitment. Run the check below against the **assigned** `https://…onrender.com` origin first. A service name alone does not establish its assigned hostname. ## DNS handoff -The supplied handoff assigns the GoDaddy update to the user. Report the verified -Render hostname, then wait for their confirmation that the record is updated: - -**2026-11-02 update:** The user has already created the canonical CNAME pointing -`smplxnf` to `smplxnf-live.onrender.com`; resolver `1.1.1.1` returned it with TTL -3600. This target returned HTTP 404 on `/healthz`. Confirm the new service's -assigned hostname before requesting another DNS change. The service still needs -`smplxnf.anomalon.com` added in **Settings → Custom Domains**. +The user configured the GoDaddy CNAME; resolver `1.1.1.1` returned it with TTL +3600. Render now associates `smplxnf.anomalon.com` with `smplxnf-live` and showed +both domain verification and certificate issuance complete. The 22:54 UTC +[canonical-domain receipt](verification/2026-11-02-public-live-http.json) verifies +HTTPS and Studio API behavior. -**Latest check, 22:25 UTC:** The certificate is valid, but the custom domain -serves **SmplCache Live** (`service: smplcache-live`, commit `810fc7cf0d99`). -The user's Render screenshot lists `smplcache-live.onrender.com` as the target. -Create/verify the separate Simplex service first, then move this custom-domain -association to it and align DNS with that service's actual hostname. Do not -replace or rename the existing SmplCache application to perform this migration. -See the [application-identity receipt](verification/2026-11-02-domain-service-mismatch.json). +Earlier checks encountered DNS propagation, an unprovisioned target and then an +association with the existing SmplCache service. The +[22:25 UTC mismatch receipt](verification/2026-11-02-domain-service-mismatch.json) +is historical. The user authorized moving only the Simplex domain; the separate +SmplCache service and `smplcache.anomalon.com` remained intact and healthy afterward. | GoDaddy field | Value | | --- | --- | | Type | `CNAME` | | Name / Host | `smplxnf` (within the `anomalon.com` zone) | -| Value / Target | Actual assigned Render hostname, without `https://` or a path | -| TTL | 600 seconds if available, otherwise provider default | +| Value / Target | `smplxnf-live.onrender.com` | +| TTL | 3600 seconds observed | Inspect any existing record for this name before replacing it. Leave unrelated zone records unchanged. Verify the custom domain in Render and wait for its @@ -65,7 +70,7 @@ Provider references: [Render custom domains](https://render.com/docs/custom-doma Requires only Python 3.10+ standard library; no application imports or credentials. ```sh -python scripts/http_smoke.py https://ACTUAL-HOST.onrender.com --output render-http.json +python scripts/http_smoke.py https://smplxnf-live.onrender.com --output render-http.json python scripts/http_smoke.py https://smplxnf.anomalon.com --output public-http.json # Small, bounded concurrency probe: 5 GETs then 10 POSTs across two clients. python scripts/http_smoke.py https://smplxnf.anomalon.com --workers 2 --repeats 2 --output public-concurrent.json @@ -98,5 +103,8 @@ Open the quickstart tab, check developer links, inspect browser errors, and inspect layout at desktop and narrow viewport sizes. Record the URL, deployed SHA, time, screenshots, observed results and any remaining failures. -Localhost results establish local behavior only. The deployment gate remains -open until these checks pass on the public custom domain. +Localhost results establish local behavior only. The live default relational +display was inspected; the remaining browser checklist was interrupted at the +user's request. HTTPS/API verification is complete for the recorded deploy, but +full browser acceptance remains open. Do not resume desktop automation without +the user making it available again. diff --git a/docs/MVP_SELECTION.md b/docs/MVP_SELECTION.md index a4a8d4c..6acce3d 100644 --- a/docs/MVP_SELECTION.md +++ b/docs/MVP_SELECTION.md @@ -6,6 +6,13 @@ **Classification:** Systems Architecture & Technical Product Specification **Epistemic Standard:** Landau Rigor / Claim Discipline Compliant (No Hype Terminology) +**Status reconciliation, 2026-11-02:** This specification includes original design +targets, not measured guarantees. The separate `smplxnf-live` service now serves +the canonical domain on Free compute; HTTPS/API smoke checks passed. Full live +browser acceptance remains incomplete. Availability, latency and broad compiler +claims below remain design targets where they exceed the +[current evidence and executable scope](PROJECT_STATUS.md). + --- ## 1. Executive Summary: The smplxnf.anomalon.com Vision @@ -18,7 +25,7 @@ The objective of this specification is to define, evaluate, and architect the si 2. Enable an external developer to clone the repository, install the package via standard tooling, and import the core normal-form logic into their own database, compiler, or AI workflows in under fifteen minutes to support the author's technical resume. ### 1.2 The Production Vision on Render -The application is designed for a lightweight Web Service on Render bound to the custom hostname `smplxnf.anomalon.com`. Public provisioning and HTTPS verification remain separate gates; see [current status](PROJECT_STATUS.md). Operating under a stateless ASGI process model powered by FastAPI and Uvicorn, the service serves: +The application is deployed as a lightweight Web Service on Render bound to the custom hostname `smplxnf.anomalon.com`. Public provisioning and HTTPS/API verification passed on 2026-11-02; see [current status](PROJECT_STATUS.md) for the remaining browser checks. The original production design below targets a stateless ASGI process model powered by FastAPI and Uvicorn: - A responsive, high-contrast single-page application (SPA) dashboard styled with modern systems-grade typography and Tailwind CSS. - Strongly typed REST endpoints exposing relational synthesis, Tableau Chase verification, streaming CDC delta repair, 4-layer NF-IR compilation to SQLite triggers and Python guards, and AI context compression with Merkle LossLedger generation. - Sub-50 millisecond algorithmic execution latencies for typical schemas and streams, executing purely in-process with zero external database dependencies. @@ -584,10 +591,10 @@ The application deploys as a standard Python Web Service on Render: ```yaml services: - type: web - name: smplxnf-studio + name: smplxnf-live env: python region: oregon - plan: starter + plan: free buildCommand: "pip install -e . && pip install -r web/requirements.txt" startCommand: "uvicorn web.app:app --host 0.0.0.0 --port $PORT" healthCheckPath: /healthz @@ -601,10 +608,10 @@ services: ``` #### 5.3.2 Subdomain Routing via CNAME -1. **Render Hostname:** Record the actual assigned public `onrender.com` endpoint from the service dashboard. `smplxnf-studio.onrender.com` below is an example, not a verified assignment. +1. **Render Hostname:** The separate `smplxnf-live` service was assigned `smplxnf-live.onrender.com` on 2026-11-02. See the [deployment record](verification/2026-11-02-deployment.md); the blueprint above matches the selected Free compute plan. 2. **DNS Configuration:** In the DNS control panel for `anomalon.com`, a canonical name record is created: ```text - smplxnf.anomalon.com. CNAME smplxnf-studio.onrender.com. + smplxnf.anomalon.com. CNAME smplxnf-live.onrender.com. ``` 3. **Automated TLS Termination:** Render automatically provisions and renews a Let's Encrypt SSL/TLS certificate for `smplxnf.anomalon.com`. @@ -847,17 +854,17 @@ In compliance with the project Claim Hygiene standard, all architectural evaluat 4. Does not assert that 3NF or BCNF normalization eliminates application-level anomalies outside declared functional dependencies. ### 7.3 Narrowest Defensible Claim -The original MVP handoff reported 136 pytest items (89 unittest methods). Subsequent correctness and packaging work was merged in PRs #18–19, with 232 tests passing in premerge verification and hosted CI passing on merged `da498e5`. These are bounded implementation checks, not certification of every contract or a live deployment. See [current evidence and scope](PROJECT_STATUS.md). +The original MVP handoff reported 136 pytest items (89 unittest methods). Subsequent correctness and packaging work was merged in PRs #18–19, with 232 tests passing in premerge verification. PR #21's lossy preset browser fix passed all five hosted CI jobs and was deployed at merge commit `f9c289c`. Separate HTTPS/API smoke checks passed on both public origins on 2026-11-02. These are bounded implementation and deployment checks, not certification of every contract or full live browser acceptance. See [current evidence and scope](PROJECT_STATUS.md). ### 7.4 Next Test Needed -The FastAPI presentation prototype is implemented and PRs #17–19 are merged. Inspect/provision the Render service, verify its assigned hostname, hand off the exact CNAME target to the user, then verify custom-domain TLS and all four workbenches. Use [DEPLOYMENT.md](DEPLOYMENT.md) and `scripts/http_smoke.py`; record measured latency rather than treating the original sub-200 ms target as an established result. +The separate Render service is live and both origins passed HTTPS/API checks. Finish the public browser checklist when the user makes a browser available; it was interrupted after the default relational result was inspected. Use [DEPLOYMENT.md](DEPLOYMENT.md) for the remaining checks and `scripts/http_smoke.py` for future deployment regression checks. Recorded request durations do not establish the original sub-200 ms target or sustained-load capacity. --- ## 8. Conclusion & Actionable Execution Sequence 1. **Approved Architecture:** Option E (Simplex-NF Studio) is established as the single canonical MVP for `smplxnf.anomalon.com`. -2. **Original implementation milestones (now implemented; live deployment pending):** +2. **Original implementation milestones (implemented; HTTPS/API verified, full live browser acceptance incomplete):** - **M2 (Web Prototype & Deployment):** Author `pyproject.toml`, implement `web/app.py`, author `render.yaml`, and build the responsive single-page studio dashboard. - **M3 (Documentation & Import Guide):** Author comprehensive `docs/IMPORT_GUIDE.md` and update `README.md` with complete installation and code usage instructions. - **M4 (Automated Tests & Verification):** Add test suites covering API endpoints, UI rendering, and external package import workflows. diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index 8e88ad6..380b163 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -1,6 +1,7 @@ # Project status — 2026-11-02 -Source baseline: `main` at `da498e507ebf6c35cac4355d711e3be30c23a07c`. +Deployed source baseline: `main` at `f9c289cc33f91c2b653f65e6267fde0073c3cd6f` +([PR #21](https://github.com/dbccpage/simplex-normal-forms/pull/21)). Implementation, catalog declarations, and public deployment have separate gates. ## Implementation and verification @@ -17,8 +18,11 @@ Implementation, catalog declarations, and public deployment have separate gates. | Corrected CNAME, 2026-11-02 22:07 UTC | Public resolver `1.1.1.1` returned `smplxnf.anomalon.com → smplxnf-live.onrender.com`, TTL 3600 | DNS record observed; assignment to the intended service not yet verified | | Supplied Render target, 2026-11-02 22:07 UTC | [Receipt](verification/2026-11-02-corrected-render-http.json): HTTPS `/healthz` returned 404 | Application health check failed | | Canonical hostname retry, 2026-11-02 22:08 UTC | [Receipt](verification/2026-11-02-corrected-domain-http.json): local resolver still failed | Propagation/cache discrepancy; no TLS verdict for this hostname | -| Latest custom-domain check, 2026-11-02 22:25 UTC | [Receipt](verification/2026-11-02-domain-service-mismatch.json): valid HTTPS, HTTP 200, health service `smplcache-live`, HTML title SmplCache Live | Wrong application attached to the domain; Studio acceptance failed | -| Render account/service state | User screenshot shows certificate issued and target `smplcache-live.onrender.com`; account inspection still unavailable | Custom domain is attached to the existing SmplCache application; intended Studio service remains unverified | +| Historical custom-domain check, 2026-11-02 22:25 UTC | [Receipt](verification/2026-11-02-domain-service-mismatch.json): valid HTTPS, HTTP 200, health service `smplcache-live`, HTML title SmplCache Live | Wrong application at that time; subsequently corrected | +| Lossy preset browser fix and status reconciliation | PR #21 merged at `f9c289c`; all five [hosted CI jobs](https://github.com/dbccpage/simplex-normal-forms/actions/runs/41537312875) passed at head `d2e331a`; merge tree matched that head | Implemented and deployed | +| Separate Render service | `smplxnf-live`, Oregon, Free compute, deployed `f9c289c`; [deployment record](verification/2026-11-02-deployment.md) | Live | +| Assigned Render origin, 2026-11-02 22:39 UTC | [Receipt](verification/2026-11-02-render-live-http.json): 15 checks passed with certificate validation enabled | HTTPS/API verified | +| Canonical domain, 2026-11-02 22:54 UTC | [Receipt](verification/2026-11-02-public-live-http.json): 15 checks passed with certificate validation enabled | HTTPS/API verified; full browser acceptance incomplete | GitHub Pages completing its own deployment does not establish that the FastAPI application is running on Render. The health response's fixed version `0.1.0` @@ -30,13 +34,14 @@ and a new-web-service URL. These are distinct from the proposed Simplex service. The earlier accidental `simplxnf` spelling and its failed HTTP/TLS probes are retained in the receipts as history. The canonical target remains `smplxnf`. -**Latest state:** DNS still points to `smplxnf-live.onrender.com`, but Render -serves SmplCache Live for the custom Host header. The certificate is now valid. -This is a routing/application mismatch, not a successful Studio deployment. -Create/verify the separate service from `dbccpage/simplex-normal-forms`, move -only this custom-domain association from the SmplCache service to it, and -align the CNAME with its assigned hostname. Preserve the existing SmplCache -service and its application. No Studio API POSTs were sent to that application. +**Latest recorded state:** [smplxnf.anomalon.com](https://smplxnf.anomalon.com) +serves Simplex-NF Studio from the separate `smplxnf-live` service. Render showed +the custom domain verified and its certificate issued. DNS points to the assigned +`smplxnf-live.onrender.com` hostname. The earlier mismatch is retained as history; +no Studio API POSTs were sent to SmplCache during that failed check. After the +move, `smplcache.anomalon.com/healthz` still identified `smplcache-live` at +`810fc7cf0d99`. Compute is on the Free plan; Render disclosed a $0.25/month +custom-domain charge, which the user approved. Billing was not audited. Local browser checks exercised relational synthesis, streaming, compiler and AI workbenches. Switching to the lossy decomposition preset exposed a frontend @@ -45,7 +50,13 @@ lossless result. The correction preserves the two components and renders the spurious-tuple witness; zero-step lossy traces also no longer claim an already distinguished tableau. `node tests/test_frontend.cjs` checks the actual request handler and rendering for parenthesized, semicolon and blank component inputs. -These changes require their own review/CI and are not part of baseline `da498e5`. +These changes passed review/CI in PR #21 and are included in deployed `f9c289c`. + +On the live custom domain, the default relational page displayed “Lossless Join +Verified (7 steps).” The lossy preset was selected, but its resulting witness +was not inspected before the user stopped computer control. Full live browser +acceptance remains incomplete. Subsequent documentation work uses the terminal +only; no further browser checks are claimed. ## How to read the catalog and wiki @@ -95,17 +106,14 @@ does. The original 136-test count is preserved as history, not current coverage. ## Next work, in order -1. Obtain authenticated Render access; inspect the supplied project before - creating a duplicate service. Deploy the current reviewed `main` and record - its exact SHA, service ID, deploy ID, region, plan and assigned hostname. -2. Verify the assigned `onrender.com` origin with the HTTP smoke script. Compare - the **actual** hostname with the user's existing CNAME target - `smplxnf-live.onrender.com`; report any needed correction. -3. Add `smplxnf.anomalon.com` to the service's Custom Domains, verify DNS and TLS; - run the same HTTPS checks and all four browser workflows on the public origin. -4. Record deployment receipts and measured latencies. A bounded concurrency - smoke is not evidence of sustained load capacity or a sub-200 ms SLA. -5. Continue contract-by-contract evidence audits and replace generic wiki +1. Complete the remaining public browser checklist when the user makes a browser + available for that purpose: lossy witness, streaming with cochain on/off, + compiler outputs, AI ledger, quickstart/developer links, console and layout. + The current documentation task does not resume computer control. +2. Rerun the HTTPS smoke after future application deployments and record the + deployed SHA separately. The saved bounded probe does not establish sustained + load capacity, cold-start latency or a sub-200 ms SLA. +3. Continue contract-by-contract evidence audits and replace generic wiki examples with executable witnesses where useful. Do not expand the MVP's advertised scope ahead of those checks. diff --git a/docs/verification/2026-11-02-deployment.md b/docs/verification/2026-11-02-deployment.md new file mode 100644 index 0000000..adf0b40 --- /dev/null +++ b/docs/verification/2026-11-02-deployment.md @@ -0,0 +1,78 @@ +# Deployment record — 2026-11-02 + +This records the observed deployment and saved HTTP results from this session. +It is not a new browser check, a billing audit or a sustained-load benchmark. + +## Source and service + +| Field | Observed value | +| --- | --- | +| Repository / branch | `dbccpage/simplex-normal-forms` / `main` | +| Deployed commit | `f9c289cc33f91c2b653f65e6267fde0073c3cd6f` | +| Source review | [PR #21](https://github.com/dbccpage/simplex-normal-forms/pull/21) | +| Tested PR head | `d2e331aea62c1c2eff3686ab03681c49e8107515`; merge tree matched this head | +| Hosted CI | All five jobs passed in [run 41537312875](https://github.com/dbccpage/simplex-normal-forms/actions/runs/41537312875) | +| Render project | `prj-dbj5ei942hec73c30pu0` | +| Production environment | `evm-dbj5ei942hec73c30pug` | +| Service | [`smplxnf-live`](https://dashboard.render.com/web/srv-dbkh1v3ncjis73bbg3ug/settings), `srv-dbkh1v3ncjis73bbg3ug` | +| Initial deploy | [`dep-dbkh1vbncjis73bbg4e0`](https://dashboard.render.com/web/srv-dbkh1v3ncjis73bbg3ug/deploys/dep-dbkh1vbncjis73bbg4e0) | +| Runtime / region | Python 3.14 observed in build logs / Oregon | +| Compute | Free, $0/month, 0.1 CPU / 512 MB | +| Build | `pip install -e . && pip install -r web/requirements.txt` | +| Start | `uvicorn web.app:app --host 0.0.0.0 --port $PORT` | +| Environment | `PYTHONUNBUFFERED=1`, `APP_ENVIRONMENT=production` | +| Health / auto-deploy | `/healthz` / On Commit | +| Assigned origin | | +| Canonical origin | | + +Render showed the deploy Live, with successful startup at 17:39:52 EST +(22:39:52 UTC). Source checkout in its logs identified the deployed commit above. +The fixed health identifier `smplxnf-studio` and version `0.1.0` alone do not +identify a deployed Git commit. The subsequent blueprint name/plan reconciliation +is documentation of the manually selected configuration, not part of that commit. + +## DNS, certificate and application identity + +The user configured `smplxnf.anomalon.com CNAME smplxnf-live.onrender.com`; +resolver `1.1.1.1` returned TTL 3600. The earlier domain binding to SmplCache was +removed and the domain appeared on the new Simplex service after the user +authorized the move. Render showed Domain Verified and Certificate Issued. +The final UI state was observed; this record does not attribute the final form +submission to the assistant. + +The user chose Free compute and separately approved the $0.25/month custom-domain +charge disclosed by Render after the two included domain slots were reported in +use. No invoice or subsequent billing state was audited. + +The existing SmplCache resource `srv-dbk076c9v7es73balvng` was preserved. After +the move, `https://smplcache.anomalon.com/healthz` returned `status: ok`, service +`smplcache-live`, API version `1.0.0`, and app/engine commit `810fc7cf0d99`. + +## Saved HTTPS/API checks + +| Origin | Receipt start (UTC) | Result | +| --- | --- | --- | +| Assigned Render origin | 2026-11-02T22:39:54.959208+00:00 | [15/15 passed](2026-11-02-render-live-http.json) | +| Canonical custom domain | 2026-11-02T22:54:43.678713+00:00 | [15/15 passed](2026-11-02-public-live-http.json) | + +Both runs used `scripts/http_smoke.py` with `--workers 2 --repeats 2`, normal +certificate validation, and timeouts of 40 and 45 seconds respectively. Five +GETs checked health, HTML, JavaScript, CSS and presets. Ten POSTs repeated five +semantic cases: relational lossless/lossy, streaming ledger, compiler lowering +and AI loss ledger. All returned HTTP 200 and passed the script's semantic checks. + +Canonical-domain request durations ranged from 113.68 to 452.34 ms. These are +client/network measurements from a bounded smoke probe; they do not establish +sustained capacity, cold-start behavior or a sub-200 ms SLA. Earlier failed +receipts are retained as history rather than replaced. + +## Browser acceptance boundary + +Local browser work exercised all four workbenches; PR #21 corrected lossy preset +component parsing and added a frontend regression check. On the live canonical +origin, the default relational display showed “Lossless Join Verified (7 steps).” +The lossy preset was selected, but its resulting witness was not inspected. +The user then stopped computer control. Full live browser acceptance, streaming +cochain on/off, compiler output tabs, AI output, quickstart/developer links, +console inspection and narrow viewport checks remain incomplete. No later +browser checks are claimed by this documentation update. diff --git a/docs/verification/2026-11-02-public-live-http.json b/docs/verification/2026-11-02-public-live-http.json new file mode 100644 index 0000000..71460e3 --- /dev/null +++ b/docs/verification/2026-11-02-public-live-http.json @@ -0,0 +1,166 @@ +{ + "checked_at_utc": "2026-11-02T22:54:43.678713+00:00", + "base_url": "https://smplxnf.anomalon.com", + "workers": 2, + "repeats": 2, + "tls_certificate_validation": "enabled", + "checks": [ + { + "method": "GET", + "path": "/healthz", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/healthz", + "response_sha256": "c7e0c2a5ccb41ba909833e6a4e943d254bdb4efd296c3b930c7dcdf45eed9a46", + "passed": true, + "elapsed_ms": 452.34 + }, + { + "method": "GET", + "path": "/", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/", + "response_sha256": "a4f86bbc503e80fed790367bb01adb2eb969c42259c44940f17dfb6aa73ce67a", + "passed": true, + "elapsed_ms": 169.29 + }, + { + "method": "GET", + "path": "/static/app.js", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/static/app.js", + "response_sha256": "5cfe4e15f0538b6abcae276ded326d5e4c872c93247bed40aa6b4de446ad2d0a", + "passed": true, + "elapsed_ms": 156.13 + }, + { + "method": "GET", + "path": "/static/style.css", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/static/style.css", + "response_sha256": "7e2f84b6662d0e645ed3541bb10763a0872c93e5cf2f8e584d881b470351de23", + "passed": true, + "elapsed_ms": 289.16 + }, + { + "method": "GET", + "path": "/api/presets", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/presets", + "response_sha256": "09de81e08ac6b20e42bbfcdf0141d87e763f3e037aa30977b37086c89d1d83ab", + "passed": true, + "elapsed_ms": 136.02 + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "8620280aa10745b8d19bd9cbe96dca19ba6b13e63a3577c04a33ffc412b2706b", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/relational/normalize", + "response_sha256": "4219493b7b65efbe3029fe703d780614f1e08fa37551b4425cffa1b0fad9e178", + "passed": true, + "elapsed_ms": 259.14, + "preset": "ecommerce" + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "6d60e85b14af5b7fe8b02df1e0621caa55b18f5ca79cb720aa07afcb20429d5d", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/relational/normalize", + "response_sha256": "effe7ca618c18e5cabac8ad6106093d98f7fe6153917d8efb56d35b76d33c3db", + "passed": true, + "elapsed_ms": 261.23, + "preset": "lossy_decomposition" + }, + { + "method": "POST", + "path": "/api/bqnf/simulate", + "request_sha256": "b129f3da473c83dd477e03e9154bc521c6fa07d1c0c8f9d7a4bbc5d79561d4dc", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/bqnf/simulate", + "response_sha256": "279027ce2a31f451ad1e03fb0e8c0ec63fe3b6e0bdcf1c8e265ca15f07e43c0a", + "passed": true, + "elapsed_ms": 346.38, + "preset": "financial_ledger" + }, + { + "method": "POST", + "path": "/api/compiler/lower", + "request_sha256": "33dac6350d1c2aacfa4744beec696030729e3a6b2521779748dcc441b456bcf5", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/compiler/lower", + "response_sha256": "4e37fefc27234f53411540e9e597e3da4df46fe2dff819f539dbf10d373def5b", + "passed": true, + "elapsed_ms": 124.58, + "preset": "employee_bcnf" + }, + { + "method": "POST", + "path": "/api/ai/lossledger", + "request_sha256": "59baf8400215a7d0fe4c330f1fdbd7ff04de370f3f991c9df6c2c8a1e0908138", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/ai/lossledger", + "response_sha256": "02012e08df212dd1f880e894633aea6cbb4b74893cb9820b29a1a2a98682729a", + "passed": true, + "elapsed_ms": 178.84, + "preset": "rag_research_context" + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "8620280aa10745b8d19bd9cbe96dca19ba6b13e63a3577c04a33ffc412b2706b", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/relational/normalize", + "response_sha256": "4219493b7b65efbe3029fe703d780614f1e08fa37551b4425cffa1b0fad9e178", + "passed": true, + "elapsed_ms": 389.81, + "preset": "ecommerce" + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "6d60e85b14af5b7fe8b02df1e0621caa55b18f5ca79cb720aa07afcb20429d5d", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/relational/normalize", + "response_sha256": "effe7ca618c18e5cabac8ad6106093d98f7fe6153917d8efb56d35b76d33c3db", + "passed": true, + "elapsed_ms": 348.87, + "preset": "lossy_decomposition" + }, + { + "method": "POST", + "path": "/api/bqnf/simulate", + "request_sha256": "b129f3da473c83dd477e03e9154bc521c6fa07d1c0c8f9d7a4bbc5d79561d4dc", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/bqnf/simulate", + "response_sha256": "279027ce2a31f451ad1e03fb0e8c0ec63fe3b6e0bdcf1c8e265ca15f07e43c0a", + "passed": true, + "elapsed_ms": 331.49, + "preset": "financial_ledger" + }, + { + "method": "POST", + "path": "/api/compiler/lower", + "request_sha256": "33dac6350d1c2aacfa4744beec696030729e3a6b2521779748dcc441b456bcf5", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/compiler/lower", + "response_sha256": "4e37fefc27234f53411540e9e597e3da4df46fe2dff819f539dbf10d373def5b", + "passed": true, + "elapsed_ms": 173.14, + "preset": "employee_bcnf" + }, + { + "method": "POST", + "path": "/api/ai/lossledger", + "request_sha256": "59baf8400215a7d0fe4c330f1fdbd7ff04de370f3f991c9df6c2c8a1e0908138", + "status": 200, + "final_url": "https://smplxnf.anomalon.com/api/ai/lossledger", + "response_sha256": "02012e08df212dd1f880e894633aea6cbb4b74893cb9820b29a1a2a98682729a", + "passed": true, + "elapsed_ms": 113.68, + "preset": "rag_research_context" + } + ], + "scope": "HTTP and semantic smoke only; deployment commit and browser UX require separate verification.", + "passed": true +} diff --git a/docs/verification/2026-11-02-render-live-http.json b/docs/verification/2026-11-02-render-live-http.json new file mode 100644 index 0000000..f6cd4e5 --- /dev/null +++ b/docs/verification/2026-11-02-render-live-http.json @@ -0,0 +1,166 @@ +{ + "checked_at_utc": "2026-11-02T22:39:54.959208+00:00", + "base_url": "https://smplxnf-live.onrender.com", + "workers": 2, + "repeats": 2, + "tls_certificate_validation": "enabled", + "checks": [ + { + "method": "GET", + "path": "/healthz", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/healthz", + "response_sha256": "c7e0c2a5ccb41ba909833e6a4e943d254bdb4efd296c3b930c7dcdf45eed9a46", + "passed": true, + "elapsed_ms": 376.18 + }, + { + "method": "GET", + "path": "/", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/", + "response_sha256": "a4f86bbc503e80fed790367bb01adb2eb969c42259c44940f17dfb6aa73ce67a", + "passed": true, + "elapsed_ms": 170.65 + }, + { + "method": "GET", + "path": "/static/app.js", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/static/app.js", + "response_sha256": "5cfe4e15f0538b6abcae276ded326d5e4c872c93247bed40aa6b4de446ad2d0a", + "passed": true, + "elapsed_ms": 941.71 + }, + { + "method": "GET", + "path": "/static/style.css", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/static/style.css", + "response_sha256": "7e2f84b6662d0e645ed3541bb10763a0872c93e5cf2f8e584d881b470351de23", + "passed": true, + "elapsed_ms": 340.36 + }, + { + "method": "GET", + "path": "/api/presets", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/presets", + "response_sha256": "09de81e08ac6b20e42bbfcdf0141d87e763f3e037aa30977b37086c89d1d83ab", + "passed": true, + "elapsed_ms": 297.71 + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "8620280aa10745b8d19bd9cbe96dca19ba6b13e63a3577c04a33ffc412b2706b", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/relational/normalize", + "response_sha256": "4219493b7b65efbe3029fe703d780614f1e08fa37551b4425cffa1b0fad9e178", + "passed": true, + "elapsed_ms": 345.47, + "preset": "ecommerce" + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "6d60e85b14af5b7fe8b02df1e0621caa55b18f5ca79cb720aa07afcb20429d5d", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/relational/normalize", + "response_sha256": "effe7ca618c18e5cabac8ad6106093d98f7fe6153917d8efb56d35b76d33c3db", + "passed": true, + "elapsed_ms": 364.64, + "preset": "lossy_decomposition" + }, + { + "method": "POST", + "path": "/api/bqnf/simulate", + "request_sha256": "b129f3da473c83dd477e03e9154bc521c6fa07d1c0c8f9d7a4bbc5d79561d4dc", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/bqnf/simulate", + "response_sha256": "279027ce2a31f451ad1e03fb0e8c0ec63fe3b6e0bdcf1c8e265ca15f07e43c0a", + "passed": true, + "elapsed_ms": 144.89, + "preset": "financial_ledger" + }, + { + "method": "POST", + "path": "/api/compiler/lower", + "request_sha256": "33dac6350d1c2aacfa4744beec696030729e3a6b2521779748dcc441b456bcf5", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/compiler/lower", + "response_sha256": "4e37fefc27234f53411540e9e597e3da4df46fe2dff819f539dbf10d373def5b", + "passed": true, + "elapsed_ms": 144.85, + "preset": "employee_bcnf" + }, + { + "method": "POST", + "path": "/api/ai/lossledger", + "request_sha256": "59baf8400215a7d0fe4c330f1fdbd7ff04de370f3f991c9df6c2c8a1e0908138", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/ai/lossledger", + "response_sha256": "02012e08df212dd1f880e894633aea6cbb4b74893cb9820b29a1a2a98682729a", + "passed": true, + "elapsed_ms": 360.61, + "preset": "rag_research_context" + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "8620280aa10745b8d19bd9cbe96dca19ba6b13e63a3577c04a33ffc412b2706b", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/relational/normalize", + "response_sha256": "4219493b7b65efbe3029fe703d780614f1e08fa37551b4425cffa1b0fad9e178", + "passed": true, + "elapsed_ms": 236.08, + "preset": "ecommerce" + }, + { + "method": "POST", + "path": "/api/relational/normalize", + "request_sha256": "6d60e85b14af5b7fe8b02df1e0621caa55b18f5ca79cb720aa07afcb20429d5d", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/relational/normalize", + "response_sha256": "effe7ca618c18e5cabac8ad6106093d98f7fe6153917d8efb56d35b76d33c3db", + "passed": true, + "elapsed_ms": 150.75, + "preset": "lossy_decomposition" + }, + { + "method": "POST", + "path": "/api/bqnf/simulate", + "request_sha256": "b129f3da473c83dd477e03e9154bc521c6fa07d1c0c8f9d7a4bbc5d79561d4dc", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/bqnf/simulate", + "response_sha256": "279027ce2a31f451ad1e03fb0e8c0ec63fe3b6e0bdcf1c8e265ca15f07e43c0a", + "passed": true, + "elapsed_ms": 130.19, + "preset": "financial_ledger" + }, + { + "method": "POST", + "path": "/api/compiler/lower", + "request_sha256": "33dac6350d1c2aacfa4744beec696030729e3a6b2521779748dcc441b456bcf5", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/compiler/lower", + "response_sha256": "4e37fefc27234f53411540e9e597e3da4df46fe2dff819f539dbf10d373def5b", + "passed": true, + "elapsed_ms": 126.64, + "preset": "employee_bcnf" + }, + { + "method": "POST", + "path": "/api/ai/lossledger", + "request_sha256": "59baf8400215a7d0fe4c330f1fdbd7ff04de370f3f991c9df6c2c8a1e0908138", + "status": 200, + "final_url": "https://smplxnf-live.onrender.com/api/ai/lossledger", + "response_sha256": "02012e08df212dd1f880e894633aea6cbb4b74893cb9820b29a1a2a98682729a", + "passed": true, + "elapsed_ms": 175.96, + "preset": "rag_research_context" + } + ], + "scope": "HTTP and semantic smoke only; deployment commit and browser UX require separate verification.", + "passed": true +} diff --git a/render.yaml b/render.yaml index 5002cbe..3b52e60 100644 --- a/render.yaml +++ b/render.yaml @@ -1,9 +1,9 @@ services: - type: web - name: smplxnf-studio + name: smplxnf-live env: python region: oregon - plan: starter + plan: free buildCommand: "pip install -e . && pip install -r web/requirements.txt" startCommand: "uvicorn web.app:app --host 0.0.0.0 --port $PORT" healthCheckPath: /healthz diff --git a/wiki/Home.md b/wiki/Home.md index 9ac0a1a..49c67e2 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -3,8 +3,9 @@ **AuthorityEffect:** `None` (`certified_implies_authorized: false`) **Total Canonical Normal Form Contracts:** **112** (each with its own dedicated Wiki treatise and visual SVG diagram) -**[Current project status and evidence levels](Project-Status):** PRs #17–19 are -merged; public Render deployment remains unverified. Contract pages describe +**[Current project status and evidence levels](Project-Status):** Studio is live at +[smplxnf.anomalon.com](https://smplxnf.anomalon.com); HTTPS/API checks passed on +2026-11-02. Full live browser acceptance remains incomplete. Contract pages describe declarations and intended behavior. Their diagrams and “Certified Output” labels are not execution receipts; see the status guide before interpreting those claims. diff --git a/wiki/Project-Status.md b/wiki/Project-Status.md index 3e7ae50..dab9f17 100644 --- a/wiki/Project-Status.md +++ b/wiki/Project-Status.md @@ -1,7 +1,8 @@ # Project status and evidence — 2026-11-02 -The web MVP, correctness fixes and packaging work are merged. Public Render -deployment is a separate, unfinished gate. +The web MVP, correctness fixes, packaging and lossy preset browser fix are merged. +[Simplex-NF Studio](https://smplxnf.anomalon.com) is deployed on its own Render +service. HTTPS/API verification passed; full live browser acceptance is incomplete. | Area | Verified state | | --- | --- | @@ -11,20 +12,28 @@ deployment is a separate, unfinished gate. | Tests | 232 tests passed in premerge Python 3.12/3.14 runs; [merged-main hosted CI](https://github.com/dbccpage/simplex-normal-forms/actions/runs/41529136846) passed | | Local HTTP | 15 smoke checks passed on 2026-11-02, including two repetitions of five API cases with two clients | | DNS | User corrected CNAME to `smplxnf → smplxnf-live.onrender.com`; observed through resolver `1.1.1.1` at 22:07 UTC, TTL 3600 | -| Render / HTTPS | At 22:25 UTC HTTPS succeeded and returned HTTP 200, but `/healthz` identified `smplcache-live` and the page title identified SmplCache Live. Certificate issuance is complete; the domain is attached to the wrong application | +| Browser fix / CI | [PR #21](https://github.com/dbccpage/simplex-normal-forms/pull/21) merged at `f9c289c`; all five [CI jobs](https://github.com/dbccpage/simplex-normal-forms/actions/runs/41537312875) passed at `d2e331a`, with the same merge tree | +| Render service | `smplxnf-live`, `srv-dbkh1v3ncjis73bbg3ug`, Oregon, Free compute; deployed `f9c289cc33f91c2b653f65e6267fde0073c3cd6f` | +| Assigned origin | `https://smplxnf-live.onrender.com`: 15/15 HTTPS/API checks passed at 22:39 UTC | +| Custom domain | `https://smplxnf.anomalon.com`: 15/15 HTTPS/API checks passed at 22:54 UTC; Render showed domain verified and certificate issued | +| Live browser | Default relational result inspected; full workbench/browser checklist interrupted at the user's request | The original Gemini/Teamwork notes' 136 pytest items / 89 unittest methods and instructions to merge PR #17 are historical. A Render blueprint is configuration, -not proof that a service was provisioned. The new service must have the custom -domain registered in Render; the CNAME alone does not establish routing or TLS. +not proof that a service was provisioned. The service and custom-domain assignment +were separately inspected in Render; both origins then passed the HTTP script. -The latest user screenshot lists `smplcache-live.onrender.com` as Render's -target, while public DNS still points to `smplxnf-live.onrender.com`. The custom -domain currently serves the existing SmplCache application, commit `810fc7cf0d99`. -Create/verify the separate service from `dbccpage/simplex-normal-forms`, then -move this custom-domain association to it and align the CNAME with its assigned -hostname. Preserve the existing SmplCache service. No Studio API POSTs were -attempted against that application; HTTP 200 alone does not pass acceptance. +The 22:25 UTC response identifying SmplCache was a historical routing mismatch, +subsequently corrected by moving the Simplex domain to the separate service. +SmplCache remains intact: its own hostname returned healthy service +`smplcache-live`, app/engine commit `810fc7cf0d99`, after the move. No Studio API +POSTs were sent to it during the failed identity check. + +The user chose Free compute and approved Render's disclosed $0.25/month custom +domain charge; billing was not audited. These bounded smoke results do not +establish cold-start performance, sustained capacity or a latency SLA. The app's +health identifier remains `smplxnf-studio`, distinct from the Render resource name. +See the [dated deployment record and raw receipts](https://github.com/dbccpage/simplex-normal-forms/blob/codex/render-deployment-receipt/docs/verification/2026-11-02-deployment.md). ## Catalog evidence levels @@ -52,17 +61,12 @@ catalog. AI token counts use whitespace splitting, not a model tokenizer. ## Next work -1. Create/inspect the Simplex service in the supplied Render project, deploy the - reviewed `main`, and record the deployed Git SHA and assigned hostname. -2. Confirm that hostname matches `smplxnf-live.onrender.com`; ask the user to - adjust their CNAME only if needed. Register `smplxnf.anomalon.com` as the - service's custom domain and verify its certificate. -3. Execute live HTTP and browser checks on the assigned Render origin and then - the custom domain. Fetch full request bodies from `/api/presets`; the old - handoff's `preset_id` examples do not match these API request models. -4. Review the follow-up browser fix for the lossy decomposition preset. Its - parenthesized components were being flattened into one component in the UI, - unlike the correct direct API call. Local verification now displays the - lossy witness; this follow-up is not included in baseline `da498e5`. -5. Audit contract evidence and replace generic wiki examples with executable +1. Complete live browser acceptance when the user makes a browser available: + inspect the lossy witness, streaming with cochain on/off, compiler and AI + outputs, quickstart/developer links, console and responsive layout. The user + stopped computer control; documentation work does not resume it. +2. Rerun HTTPS/API checks after future application deployments and record the + deployed SHA independently of `/healthz`. Fetch complete request objects from + `/api/presets`; the old handoff's `preset_id` examples do not match these APIs. +3. Audit contract evidence and replace generic wiki examples with executable witnesses. Catalog size does not establish implementation breadth.