Skip to content

First stable tree cleanup and release contracts - #1063

Merged
nick-potts merged 18 commits into
mainfrom
spec/986-stable-cleanup
Sep 25, 2026
Merged

nick-potts merged 18 commits into
mainfrom
spec/986-stable-cleanup

Conversation

@nick-potts

@nick-potts nick-potts commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Implements spec #986: the first stable tree. Cloud authors the Deploy Intent, and the CLI operates a Cluster over SSH. #987–#992 and #994 already landed on main (#994 in #1059). This branch adds the rest.

 dashboard/
-├── routes/ waitlist, org logs/deployments, docs/home/pricing   # #993
+├── routes/_public/index.tsx         # stub lander; /auth unchanged
-├── drizzle/ 12 migrations            # #995
+├── drizzle/<ts>_baseline/           # one fresh baseline, no waitlist
-├── github-ingestion.postgres-test-harness.ts  # promise harness, #995
+├── self-host/compose.yml, .env.example        # web·worker·Inngest·Redis·Postgres, #996
 └── server/config.server.ts          # names every missing var
 core/
-└── PLOYZ_SSH_CONTROL_PERSIST, PLOYZ_HEALTH_MONITOR_PERIOD,
-    PLOYZ_RELEASE_DIR, PLOYZ_UPGRADE_RELEASE_DIR, --release-dir  # #1025
-docs/{adr,audits,design}/  evidence/  Dockerfile  .dockerignore # #997
+docs/agents/domain.md                # only doc kept

Release flow (#996):

tag vX.Y.Z
  cloud job → ghcr.io/getployz/ployz-cloud:vX.Y.Z   (exact tag, no moving tags)
  publish   → attach ployz-cloud-compose.yml + ployz-cloud.env.example
self-host
  docker compose run --rm web npm run db:migrate
  docker compose up        # no Polar vars = billing off, unlimited Organizations

Missing config now fails like this:

ConfigError(SchemaError(Expected string at ["DATABASE_URL"]
                        Expected string at ["APP_URL"] … one line per var))

Evidence

  • Before: A missing variable gave a ConfigError that didn't say which one. There was no self-host compose, and there were 12 migrations plus two Postgres test harnesses.
    After:
    • The config test boots with an empty env and checks that all 12 required names appear in the error.
    • docker compose up on a fresh database with no Polar variables: web returns 200 on / and /api/auth/get-session, the worker is healthy, and the baseline applies.
    • baseline.postgres.test passes on an empty database. The dashboard's 975 tests passed after Squash Cloud schema to one fresh Postgres baseline #995, including 30 Postgres test files.
    • Core: cargo clippy and nextest pass on the merged tree. actionlint and scripts/test-ci.py pass.
    • Verify the cleaned 1.0 tree end to end #998: 1522 nextest tests, the SDK contract, installer and CI tests, and the dashboard's 989 tests all pass on the merged tree.
    • Four-axis review: Standards, Spec, Maintainability and Simplicity all PASS after 4 rounds.
    • Fast CI is green at 48efe0e, covering Rust, SDK types, contracts, macOS CLI, release builds and smoke tests, and Cloud static, test and build.

Merge Danger

Door: one-way

The migration history is squashed into one baseline, so the existing Railway Postgres has to be dropped (it's disposable per #986). ADRs, audits, design notes and evidence/ are deleted; they remain in git history.

Blast Radius: wide

Closes #986
Closes #993
Closes #995
Closes #996
Closes #997
Closes #998
Closes #1025

Codex added 17 commits September 25, 2026 04:30
Delete the waitlist endpoint and table binding, Organization logs and
deployments pages, docs/pricing/home marketing pages and their CSS and
assets, and three server functions nothing called (deleteServices,
restoreWorkingDocument, listDeploymentOperationEvidence) with their
backing operations. / is now a stub lander; auth is unchanged.
…_DIRECTORY (#1025)

- ControlPersist=10m is a constant; PLOYZ_SSH_CONTROL_PERSIST is gone.
- PLOYZ_HEALTH_MONITOR_PERIOD is gone; update.monitor or the 5s default.
- PLOYZ_RELEASE_DIR, ployzd install --release-dir and PLOYZ_UPGRADE_RELEASE_DIR
  are gone. The upgrade receipt stores no source; ReleaseSource::Local is
  cfg(test) only.
- setup_cli bootstrap scenarios run in-process with the bootstrap passed in.
- core/README.md documents PLOYZ_ACME_DIRECTORY.
Replace every Drizzle migration with one baseline generated from the
current schema plus the hand-written Organization change log triggers.
The retired waitlist table is gone. Postgres-backed tests share the
Effect container harness in src/test/postgres.ts; the duplicate
GitHub-ingestion harness is deleted. Rename the discard test to what it
covers.
Release tags publish ghcr.io/getployz/ployz-cloud:<tag> from the existing
Cloud build and attach a Compose file pinned to that tag. The self-host
Compose runs web and worker from one image beside Inngest, Redis, and
Postgres; migrations are an explicit one-shot command and the worker is
healthy only while Inngest Connect is active. README documents the env
contract and the operator-owned GitHub OAuth App and GitHub App.
Delete docs/ except docs/agents/domain.md, evidence/, the root Dockerfile and
its .dockerignore. Drop the release pack job's copies of Fast CI contract
scripts and evidence routing in CI selection. Rewrite the retained READMEs,
DESIGN, CONTEXT, RELEASE and agent guidance for the 1.0 tree: the CLI command
tree, the 1.x stable promise, Cloud's required environment, the release Cloud
image and self-host assets.
Fold main's open_started_deployments column into the squashed baseline;
point the new deployment-view Postgres test at the shared harness; drop
main's Organization logs route, which this branch retired.
Match the stable promise to #980 (v0.2.0, 0.x, v0/stable), push the Cloud release image only on Publish, drop ReleaseSource from production installer signatures, share the bootstrap archive name, read Cloud config once, and trim the Postgres test harness.
Restore the draft-run Cloud image push and document it, pass the release source explicitly to the installer, keep every config failure in the combined error, and close the Postgres test runtime through the scope.
# Conflicts:
#	dashboard/src/modules/github/github-ingestion.postgres-test-harness.ts
@nick-potts
nick-potts marked this pull request as ready for review September 25, 2026 07:48
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

# Conflicts:
#	core/CONTEXT.md
#	core/crates/ployz/tests/cloud_init/founder_resumption.rs
#	core/crates/ployz/tests/hosted_dns_cluster.rs
#	core/crates/ployz/tests/setup_cli.rs
#	dashboard/src/db/schema.ts
#	dashboard/src/modules/machines/enrollment.server.postgres.test.ts
#	dashboard/src/modules/runtime/teardown.server.postgres.test.ts
@nick-potts
nick-potts merged commit 665291d into main Sep 25, 2026
14 checks passed
nick-potts added a commit that referenced this pull request Sep 30, 2026
Deploy and Sign in open sign-in in a dialog over the page again, as
they did before #1063; /auth stays for direct links and before the page
is interactive. /auth no longer stands alone: the _public layout gives
both signed-out pages the same header, footer and light scope, and the
header's links reach the lander's sections from either page. On /auth
the frame drops its own sign-in links, and the sign-in panel loses its
placeholder tile.
nick-potts added a commit that referenced this pull request Sep 30, 2026
* Lander: keep the platform, drop the bill, for the #1225 launch

The public page at / replaces the stub with a page for a solo developer
who already pays a hosted platform. It follows the rhythm of Porter's
homepage: the dashboard on a server, the root prompt handed to
`ployz up`, the stack it deploys, preview environments and reviewed
changes, what Ployz runs, pricing, a founder quote, a comparison and
seventeen honest answers. Database moves and backups carry Soon tags.

The pictures are built from the product's own Card, status colours and
bottom bar, with wires in the canvas's edge shapes. The page is always
light: `.light` rescopes the tokens, and the dark variant skips a
`.light` subtree without changing its specificity. The glossary lets
the public site say "preview environment".

It launches with #1225: its CLI lines are checked against the shipped
CLI before merge.

* Lander: sign in over the page, and give /auth the lander's frame

Deploy and Sign in open sign-in in a dialog over the page again, as
they did before #1063; /auth stays for direct links and before the page
is interactive. /auth no longer stands alone: the _public layout gives
both signed-out pages the same header, footer and light scope, and the
header's links reach the lander's sections from either page. On /auth
the frame drops its own sign-in links, and the sign-in panel loses its
placeholder tile.
nick-potts added a commit that referenced this pull request Sep 30, 2026
* Lander: keep the platform, drop the bill, for the #1225 launch

The public page at / replaces the stub with a page for a solo developer
who already pays a hosted platform. It follows the rhythm of Porter's
homepage: the dashboard on a server, the root prompt handed to
`ployz up`, the stack it deploys, preview environments and reviewed
changes, what Ployz runs, pricing, a founder quote, a comparison and
seventeen honest answers. Database moves and backups carry Soon tags.

The pictures are built from the product's own Card, status colours and
bottom bar, with wires in the canvas's edge shapes. The page is always
light: `.light` rescopes the tokens, and the dark variant skips a
`.light` subtree without changing its specificity. The glossary lets
the public site say "preview environment".

It launches with #1225: its CLI lines are checked against the shipped
CLI before merge.

* Lander: sign in over the page, and give /auth the lander's frame

Deploy and Sign in open sign-in in a dialog over the page again, as
they did before #1063; /auth stays for direct links and before the page
is interactive. /auth no longer stands alone: the _public layout gives
both signed-out pages the same header, footer and light scope, and the
header's links reach the lander's sections from either page. On /auth
the frame drops its own sign-in links, and the sign-in panel loses its
placeholder tile.

* Dashboard: name you in the rail, and open the lander at Home

- The wide rail shows your name and organization; the canvas rail stays the avatar
- /home shows the lander to signed-in users, linked from the account menu
- Signed-in actions on public pages go straight to the dashboard
@nick-potts
nick-potts deleted the spec/986-stable-cleanup branch September 30, 2026 15:14
nick-potts added a commit that referenced this pull request Sep 30, 2026
* Lander: keep the platform, drop the bill, for the #1225 launch

The public page at / replaces the stub with a page for a solo developer
who already pays a hosted platform. It follows the rhythm of Porter's
homepage: the dashboard on a server, the root prompt handed to
`ployz up`, the stack it deploys, preview environments and reviewed
changes, what Ployz runs, pricing, a founder quote, a comparison and
seventeen honest answers. Database moves and backups carry Soon tags.

The pictures are built from the product's own Card, status colours and
bottom bar, with wires in the canvas's edge shapes. The page is always
light: `.light` rescopes the tokens, and the dark variant skips a
`.light` subtree without changing its specificity. The glossary lets
the public site say "preview environment".

It launches with #1225: its CLI lines are checked against the shipped
CLI before merge.

* Lander: sign in over the page, and give /auth the lander's frame

Deploy and Sign in open sign-in in a dialog over the page again, as
they did before #1063; /auth stays for direct links and before the page
is interactive. /auth no longer stands alone: the _public layout gives
both signed-out pages the same header, footer and light scope, and the
header's links reach the lander's sections from either page. On /auth
the frame drops its own sign-in links, and the sign-in panel loses its
placeholder tile.
nick-potts added a commit that referenced this pull request Sep 30, 2026
* Lander: keep the platform, drop the bill, for the #1225 launch

The public page at / replaces the stub with a page for a solo developer
who already pays a hosted platform. It follows the rhythm of Porter's
homepage: the dashboard on a server, the root prompt handed to
`ployz up`, the stack it deploys, preview environments and reviewed
changes, what Ployz runs, pricing, a founder quote, a comparison and
seventeen honest answers. Database moves and backups carry Soon tags.

The pictures are built from the product's own Card, status colours and
bottom bar, with wires in the canvas's edge shapes. The page is always
light: `.light` rescopes the tokens, and the dark variant skips a
`.light` subtree without changing its specificity. The glossary lets
the public site say "preview environment".

It launches with #1225: its CLI lines are checked against the shipped
CLI before merge.

* Lander: sign in over the page, and give /auth the lander's frame

Deploy and Sign in open sign-in in a dialog over the page again, as
they did before #1063; /auth stays for direct links and before the page
is interactive. /auth no longer stands alone: the _public layout gives
both signed-out pages the same header, footer and light scope, and the
header's links reach the lander's sections from either page. On /auth
the frame drops its own sign-in links, and the sign-in panel loses its
placeholder tile.

* Dashboard: name you in the rail, and open the lander at Home

- The wide rail shows your name and organization; the canvas rail stays the avatar
- /home shows the lander to signed-in users, linked from the account menu
- Signed-in actions on public pages go straight to the dashboard
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant