Skip to content

feat: account-management wave — account_group, role, user (admin-gated, green) - #90

Merged
ShocOne merged 4 commits into
mainfrom
feat/account-management-wave
Aug 3, 2026
Merged

feat: account-management wave — account_group, role, user (admin-gated, green)#90
ShocOne merged 4 commits into
mainfrom
feat/account-management-wave

Conversation

@ShocOne

@ShocOne ShocOne commented Aug 3, 2026

Copy link
Copy Markdown
Member

What

Stage 5 of the Phase 6e program: thousandeyes_account_group, thousandeyes_role, thousandeyes_user — recorded live under an admin-scoped token, green through the full acceptance lifecycle under TFPFGEN_ACC_ADMIN, skipping cleanly without it (proven by the ungated sweep).

Live findings, curated with evidence

  • Role: a permission-less create answers 500 — a genuine ThousandEyes API bug; fixtures carry real permission ids, and permissions is modelled write-only (ids in, expanded objects echoed out).
  • User: needs a login account group and at least one role; emails are globally unique — the operator's own address was already taken by their real account, discovered as "already exists" on every first-round create. Fixtures use a plus-tagged variant; deletion frees the email immediately, so repeated runs work. all_account_group_role_ids is a curated omission (live ids, duplicating account_group_roles); the expanded allAccountGroupRoles echo is dropped as drift-prone.
  • Account group: aidid convention, sweep override, create returns its own CreatedAccountGroup type.

Toolkit fixes the wave forced

  • Proven-absence ledger resolution: a create the API refused after the intent was written (the 500-ing roles) left a ledger no sweep pass could clear — no id, no object. A complete collection read not containing the stamped name now resolves the intent as never-created, instead of holding every future record hostage to phantom debris.
  • Verify survives reproduced errors: the account_group snapshot legitimately contains a refused delete; replay reproducing it is replay working. Verify now runs the fact comparison regardless — fact purity is the claim, and the error is part of the transcript.

Gates

Root + pilot suites green · all snapshots replay-verify · every merge -check green · static facts match the pinned SDK · interop re-baselined · ungated sweep green (admin trio skips) · gated trio green under TFPFGEN_ACC_ADMIN.

🤖 Generated with Claude Code

ShocOne and others added 4 commits August 3, 2026 17:26
… green

account_group, role and user: ingested, curated, recorded live under an
admin-scoped token, and green through the full acceptance lifecycle --
which runs only under TFPFGEN_ACC_ADMIN and skips cleanly without it,
proven by the ungated sweep.

What the live rounds established, all recorded in the blueprints:

- A permission-less role create answers 500 -- a genuine ThousandEyes
  API bug -- so permissions is effectively required and the fixtures
  carry real permission ids. The response echoes permissions as
  expanded objects, never the id list, so the attribute is write-only
  with state carrying the configuration; user role assignments get the
  same request-shaped modelling (accountGroupRoles in, expanded
  allAccountGroupRoles out, the latter dropped as a drift-prone echo).
- Users need a login account group and at least one role, and emails
  are globally unique -- the operator's own address was already taken
  by their real account, which the first record round discovered as
  "already exists" on every create. Fixtures use a plus-tagged variant;
  deletion frees the email immediately, so sequential probe creates and
  repeated acceptance runs both work. all_account_group_role_ids is a
  curated omission: live role ids, duplicating the assignment the
  fixtures already exercise.
- account_group updates answered 403 under this token on the first
  round's maximal; the second round's rehearsal ran clean.

Two toolkit fixes the wave forced:

- The sweeper resolves phantom intents by proven absence. A create the
  API refused after the intent was written -- the 500-ing roles --
  left a ledger no pass could clear: no id for the ledger pass, no
  object for the prefix pass. When a complete collection read does not
  contain the stamped name, the intent resolves as never-created
  instead of holding every future record hostage to phantom debris.
- Verify compares facts even when the replay reproduces a recorded
  stopping error. The account_group snapshot legitimately contains a
  delete the API refused; replay reproducing that error is replay
  working, and what verify asserts is fact purity -- the error is part
  of the transcript.

Gates: root and pilot suites green, all snapshots replay-verify, every
merge -check green, static facts match the pinned SDK, interop
re-baselined, ungated sweep green with the admin trio skipping, gated
trio green under TFPFGEN_ACC_ADMIN.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The emitted code was already clean -- these were appended by hand and
never went through the formatter the emitted files are held to.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Generation was not finished when emit returned: five waves changed
schema descriptions and CI, not emit, noticed docs/ was stale -- the
"terraform validate" job failed before validate ever ran, at its
docs-drift first step. The battery now runs by default after every
write:

- go build ./... -- nothing else matters if the module does not compile
- go generate . -- tfplugindocs, when the module declares the directive;
  stale registry docs were this battery's founding failure
- terraform fmt -recursive -- advisory-fixing but still failing, because
  the emitter aligns its own output and a formatter rewrite means the
  alignment drifted; the diff is the bug report

terraform validate stays a CI job: it needs the provider compiled into
a dev-override, which is workflow plumbing rather than emission.
-skip-postcheck exists for tight inner loops, and nothing before a
commit should use it.

Also: merge -check treats an empty facts document as trivially
reflected. A rehearse-only recording whose bodies were refused
legitimately commits one -- the transcript and its notes are the
evidence -- and the CI gate was failing over that honesty. The stale
docs/ from the last three waves regenerate here.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A test's temp dir and an -only inspection have no module to compile or
docs to regenerate; the battery gates real provider roots, which carry
go.mod.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ShocOne
ShocOne merged commit 3e8e842 into main Aug 3, 2026
10 of 11 checks passed
@ShocOne
ShocOne deleted the feat/account-management-wave branch August 4, 2026 12:53
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