Select the types of activity you want to include in your feed.
flora is a fast and secure runtime that lets you write discord bots for your servers, with a rich TypeScript SDK, without worrying about running infrastructure. [mirror]
···11+flora deployments redesign plan (guild-scoped)
22+33+goals
44+- redesign deployments page as guild-scoped revision history
55+- capture metadata per deployment: id, actor, source, status, guild id, deployed_at, change summary
66+- support rollback
77+- show source-file diffs in frontend with @pierre/diffs (never bundle diff)
88+99+decisions
1010+- no global cross-guild deployments listing
1111+- current deployment = latest successful revision for guild
1212+- failed revisions are visible in guild history but never current
1313+- diff base = previous successful revision in same guild
1414+- rollback creates a new revision cloned from a selected successful revision
1515+- files are required for deployments; bundle may exist for runtime execution
1616+1717+phase 1: backend data + api
1818+1) add migration for immutable deployment_revisions table
1919+ - id uuid pk
2020+ - guild_id text indexed
2121+ - entry text not null
2222+ - files jsonb
2323+ - bundle text not null
2424+ - source_map jsonb
2525+ - status text (success|failed) not null
2626+ - deployed_at timestamptz default now
2727+ - deploy_source text (cli|webui|bootstrap|api|unknown) not null
2828+ - actor_user_id text null
2929+ - actor_username text null
3030+ - actor_type text (session|token|system) not null
3131+ - error_message text null
3232+ - build_id text null
3333+ - base_revision_id uuid null
3434+ - change_summary jsonb null
3535+2) backfill one success revision per existing deployments row
3636+3) extend deployment service with:
3737+ - create_revision(...)
3838+ - list_guild_revisions(guild_id, limit, cursor)
3939+ - get_revision(guild_id, revision_id)
4040+ - get_current_successful(guild_id)
4141+ - get_previous_successful_revision(guild_id)
4242+4) update deployments handlers:
4343+ - keep GET /deployments/{guild_id} => current successful deployment
4444+ - POST /deployments/{guild_id} => create revision (success/failed), include source + actor + summary
4545+ - add GET /deployments/{guild_id}/history
4646+ - add GET /deployments/{guild_id}/revisions/{id}
4747+ - add POST /deployments/{guild_id}/rollback/{id}
4848+ - remove global GET /deployments/
4949+5) actor/source capture
5050+ - parse x-flora-deploy-source header (validated enum)
5151+ - session auth => actor id + username + actor_type=session
5252+ - token auth => actor id + actor_type=token
5353+ - bootstrap path => actor_type=system, source=bootstrap
5454+6) runtime startup loads current successful deployments only
5555+5656+phase 2: clients
5757+7) cli deploy command sends x-flora-deploy-source: cli
5858+8) web editor deploy flow sends x-flora-deploy-source: webui
5959+6060+phase 3: frontend deployments page
6161+9) replace card list with guild-scoped history table
6262+ columns: id, actor, changes, guild id, deployed_at, source, status, entry/build id
6363+10) row click opens details panel
6464+ - metadata + errors + rollback action
6565+ - diff section rendered with @pierre/diffs/react against base successful revision
6666+ - only source files + package/lockfiles are diffed
6767+11) remove reliance on legacy global deployments context for this page
6868+6969+validation
7070+- runtime: cargo check -p flora
7171+- frontend: pnpm --filter frontend run typecheck
7272+- frontend lint: pnpm --filter frontend run lint
7373+- manual smoke:
7474+ - deploy via webui, history row appears as webui + success
7575+ - deploy via cli, history row appears as cli + success
7676+ - force failed deploy, history row appears as failed with error
7777+ - rollback creates new revision and updates current