Skip to content

docs: correct four statements the Azure rebuild made false - #38

Open
mastermanas805 wants to merge 3 commits into
mainfrom
docs/azure-reality-corrections
Open

docs: correct four statements the Azure rebuild made false#38
mastermanas805 wants to merge 3 commits into
mainfrom
docs/azure-reality-corrections

Conversation

@mastermanas805

Copy link
Copy Markdown
Member

Found by agents dogfooding the published docs against the live platform. Each one cost a real
run time, and three of them are copy-paste-fatal for an agent following instructions literally.

1. Storage backend — wrong vendor, dead hostname, and a lifecycle rule that must not exist

llms.txt described DigitalOcean Spaces (nyc3) with connection_url of
https://s3.instanode.dev/instant-shared/<prefix>/. Object storage is Cloudflare R2 now, and
s3.instanode.dev still resolves to the retired DO load balancer — anything constructed from that
host is dead on arrival.

Also documented the presign contract properly: operation is required and must be
GET/PUT/HEAD. A caller guessing method gets 400 invalid_operation.

Removed the claim that anonymous objects are auto-deleted by a bucket lifecycle rule. There is
deliberately no bucket-wide rule. The tenant prefix is a bare resource-token UUID with no tier
marker, so a bucket rule cannot tell an anonymous object from a paying customer's — and the
previous whole-bucket rule silently deleted every backup within 24h. Expiry is enforced by the TTL
reaper deleting under the tenant prefix.

2. The stack deploy command cannot work as published

docs/stacks.md showed -F "manifest=@instant.yaml". The handler reads manifest from the
multipart values, so an @ upload lands in the file part and returns 400 missing_manifest.
Corrected to <, with a note on why the per-service tarball fields still use @.

3. Claim returns a usable session — documented nowhere a reader would look

POST /claim's 201 carries session_token, usable immediately as a Bearer token with no email
round-trip. That appeared only in the raw OpenAPI schema. Both agent-facing docs described only the
magic-link flow — which cannot complete today, because no mail provider is configured.

So per the published docs, an unattended agent could never obtain a session. It always could. Named
the exact field, since session_jwt / jwt / api_token are all plausible wrong guesses.

4. Redis keys must carry key_prefix

/cache/new returns key_prefix and the tenant's ACL is scoped to it, so the natural first
attempt — a bare SET mykey — fails with NOPERM No permissions to access a key. That is a native
Redis error, not a platform envelope, so there is no agent_action to recover from. Now explicit.

Deliberately not changed

The claim section still reads "owns every resource attached to your network fingerprint."

That is accurate today and is exactly the P0 under repair: claiming sweeps every unclaimed
resource sharing a /24 + ASN bucket, so two strangers behind one NAT means whoever claims first
inherits the other's live database. Rewriting it now would make the docs wrong in the other
direction. It changes with that fix, so behaviour and documentation land together.

Follow-up

instanode-web/public/llms.txt needs the matching fallback edit — the build syncs from this repo,
but the committed fallback should not diverge in the meantime.

🤖 Generated with Claude Code

mastermanas805 and others added 3 commits July 6, 2026 11:30
All four were found by agents dogfooding the published docs against the live
platform, and each one cost a real run time.

1. STORAGE BACKEND. llms.txt described DigitalOcean Spaces (nyc3) and a
   connection_url of https://s3.instanode.dev/... Object storage is Cloudflare
   R2 now, and s3.instanode.dev still resolves to the retired DO load balancer,
   so anything built from that host is dead. Also documented the presign
   contract properly: `operation` is REQUIRED and must be GET/PUT/HEAD — a
   caller guessing `method` gets 400 invalid_operation.

   Removed the claim that "anonymous-tier objects are auto-deleted at 24h by a
   bucket lifecycle rule". There is deliberately NO bucket-wide rule: the
   tenant prefix is a bare resource-token UUID with no tier marker, so a bucket
   rule cannot distinguish an anonymous object from a paying customer's — and a
   previous whole-bucket rule silently deleted every backup within 24h. Expiry
   is enforced by the TTL reaper deleting under the tenant prefix.

2. STACK MANIFEST SYNTAX (docs/stacks.md). The published command used
   `-F "manifest=@instant.yaml"`, which cannot work: the handler reads manifest
   from the multipart VALUES, so an @-upload lands in the file part and returns
   400 missing_manifest. Corrected to `<` with a note explaining why the
   per-service tarball fields still use `@`.

3. CLAIM RETURNS A USABLE SESSION. `POST /claim`'s 201 carries `session_token`,
   usable immediately as a Bearer token with no email round-trip — but that
   appeared ONLY in the raw OpenAPI schema. Both agent-facing docs described
   only the magic-link flow, which cannot complete today (no mail provider), so
   per the docs an unattended agent could never obtain a session. Named the
   exact field, since session_jwt / jwt / api_token are all wrong guesses.

4. REDIS KEY PREFIX. /cache/new returns `key_prefix` and the tenant ACL is
   scoped to it, so the natural first attempt — a bare `SET mykey` — fails with
   the native `NOPERM No permissions to access a key`. That is a raw Redis
   error, not a platform envelope, so it carries no agent_action to recover
   from. Now stated explicitly.

NOT changed here, deliberately: the claim section still says a session "owns
every resource attached to your network fingerprint". That is accurate today
and is precisely the P0 being fixed — claiming sweeps every unclaimed resource
sharing a /24+ASN bucket, so two strangers behind one NAT means whoever claims
first inherits the other's live database. Rewriting it before the fix ships
would make the docs wrong in the other direction; it lands with that PR so
behaviour and documentation change together.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant