Skip to content

docs(web): stop implying Ghost calls external APIs today - #415

Merged
mohabbis merged 2 commits into
masterfrom
claude/ghost-project-debug-4qd46z
Aug 7, 2026
Merged

docs(web): stop implying Ghost calls external APIs today#415
mohabbis merged 2 commits into
masterfrom
claude/ghost-project-debug-4qd46z

Conversation

@mohabbis

@mohabbis mohabbis commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Summary

Follow-up to #414, correcting a claim I introduced there.

The landing page's "So is this just browser automation?" section said:

Where a real API exists that is the better path, and the same controls sit on top of it unchanged.

Read in the present tense — which is how a visitor reads a homepage — that claims Ghost executes API steps. It does not. Checked against the code rather than assumed:

  • apiCall and sendEmail parse (schema/step.ts, under a // --- Post-MVP step types (reserved; no executor yet) --- heading)
  • the sensitivity classifier gates them, and compensate.ts / expr.ts handle them
  • but applyStep in apps/worker/src/browser/driver.ts returns {} for both — they do nothing
  • both are listed in UNIMPLEMENTED_ACTION_TYPES and excluded from EDITABLE_STEP_TYPES, with editable-steps.test.ts enforcing it
  • the Connector model is schema-only: "no UI or command reads these yet"

The reason the editor withholds the step is stated in the source and is the same reason the page shouldn't have implied the capability:

Offering them would let someone author a workflow that silently performs no action while reporting success, which is worse than not offering the step at all.

Trust & safety

  • Touches files / filesystem mutation: none
  • Touches OS input: none
  • Touches screenshots / screen contents: none
  • Touches network: none
  • Touches authentication / secrets: none
  • Touches app / window state: none

Copy-only change to one public marketing section. No runtime behaviour, no route, no schema.

  • Risky actions remain deny-by-default
  • Reversible mutations write undo data before executing — n/a
  • No silent delete or silent overwrite
  • New Tauri commands have a module and a risk class — n/a, cloud app
  • Experimental features stay gated or labeled

This is CLAUDE.md rule 10 enforcement — marketing must not promise capabilities the app cannot support — applied to a sentence added two commits earlier.

Changes

cloud/apps/web/src/app/page.tsx — the section now:

  1. states outright that today every step runs through a browser;
  2. names precisely what exists (the apiCall step type, the connector model, the rules that classify an API action as sensitive) and what does not (the executor);
  3. explains why the step is deliberately withheld from the editor;
  4. keeps the actual argument intact — the browser is how Ghost reaches a system, not what Ghost is, and most of the systems this work lives in have no usable API anyway.

The honest version reads as more convincing than the vague one, because it is the same reasoning the codebase already applies to itself.

Validation

Cloud app; nothing in src-tauri/ changed, so no Rust check was run.

  • pnpm typecheck
  • pnpm lint
  • pnpm build
  • pnpm test

All exit 0.

Risks / follow-up

🤖 Generated with Claude Code

https://claude.ai/code/session_01VLqLtoLgi4RDrWaYVJVGuX


Generated by Claude Code

The "So is this just browser automation?" section said "where a real API
exists that is the better path, and the same controls sit on top of it
unchanged". Read in present tense that claims API execution works. It does
not.

`apiCall` and `sendEmail` parse, the classifier gates them as sensitive, and
compensate/expr handle them — but applyStep returns `{}` for both, they are
listed in UNIMPLEMENTED_ACTION_TYPES, and editable-steps.test.ts enforces that
the editor never offers them, precisely so nobody can author a step that
silently does nothing while the run reports success. The Connector model is
schema-only: "no UI or command reads these yet."

So the page now states outright that today every step runs through a browser,
names what exists (step type, connector model, sensitivity rules) and what
does not (the executor), and explains why the step is withheld from the
editor. The honest version is also the more convincing one: it is the same
reasoning that keeps the step out of the editor in the first place.

CLAUDE.md rule 10 — marketing must not promise capabilities the app cannot
support. This is that rule applied to a sentence I wrote two commits ago.

Validation: typecheck, lint, build, web test suite all pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLqLtoLgi4RDrWaYVJVGuX
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ghost Ready Ready Preview Aug 7, 2026 4:22pm

@mohabbis
mohabbis marked this pull request as ready for review August 7, 2026 16:20
@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.

No code change. GitHub Actions has created no workflow run for this PR, or
for #414, or for #414's merge commit on master — every workflow is active and
every trigger matches, so the runs are being suppressed rather than failing.

This commit is a discriminator. #414 and #415 were both opened through a
GitHub App installation token, and the merge was performed the same way. A
push from the git credential here is a different token class (an OAuth app —
it was refused `workflow` scope earlier, which GITHUB_TOKEN would not have
been). If a `pull_request: synchronize` run appears from this push, the cause
is token-related. If nothing appears, it is repository-level: exhausted
Actions minutes or an Actions restriction, neither of which any workflow file
can fix.

Worth knowing because the PR currently reports mergeable_state "blocked" with
no check runs in existence — a required check that was never created sits
"Expected — Waiting for status" forever, which is the exact failure mode
described in the header of .github/workflows/rust.yml.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLqLtoLgi4RDrWaYVJVGuX
@mohabbis
mohabbis merged commit d15619c into master Aug 7, 2026
19 checks passed
mohabbis added a commit that referenced this pull request Aug 7, 2026
master shipped a substantially more complete landing page and dashboard
(#414, #415) while this branch had its own smaller landing-page pass in
flight — same files (page.tsx, dashboard/page.tsx, globals.css). Resolved
in favor of master's version everywhere they overlapped: it's more honest
(built/not-built status, the "is this just browser automation" section),
fixes a real dark-mode CSS bug (@theme nested inside @media doesn't survive
Tailwind v4's hoisting), and renders real org data on the dashboard instead
of static nav cards. Dropped the Fraunces/IBM Plex Mono font experiment
from layout.tsx/globals.css along with it, since nothing references those
tokens anymore and master's design intentionally stays on one font.

Kept from this branch: the themed sign-out page (signout/page.tsx,
auth.ts pages.signOut) and the CLAUDE.md env-var doc fix, neither of
which master touched.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants