Skip to content

Process Evolution ​

How the GSD workflow evolved across 8 milestones of VelaPay development.


Overview ​

The GSD (Get Stuff Done) workflow has been the backbone of VelaPay development from v1.0 through v1.8. This document traces how the process has evolved — what was added, what was abandoned, and what became permanent.

The core cycle remains: milestone → phases → plans → execute → verify. But the supporting structures around this cycle have matured significantly.


v1.0–v1.1: Establishing the Base (5–8 phases, 20–26 plans) ​

How It Worked ​

The initial workflow was minimal:

1. Define milestone in ROADMAP.md
2. Break into phases
3. For each phase: discuss → plan → execute → verify
4. Move to next phase

There was no workstream structure, no explicit validation phases, and no milestone audit. Phase directories were flat under .planning/.

What Worked ​

  • The basic phase → plan → execute cycle proved sound
  • SUMMARY.md files provided basic state recovery between sessions
  • Wave-based execution (plans grouped by dependency) emerged organically

What Didn't Work ​

  • No workstream structure meant all phases were sequential, even when they could have been parallel
  • No validation phases meant test debt accumulated silently
  • No milestone audit meant issues were only discovered during the next milestone's prerequisite checks
  • Phase numbering was linear (1, 2, 3...) with no way to insert urgent work

Carried Forward ​

  • The basic phase → plan → execute cycle
  • SUMMARY.md for state recovery
  • Wave-based plan grouping

Abandoned ​

  • Flat phase directory structure (replaced by workstreams in v1.2)
  • Linear phase numbering (replaced by decimal insertion in v1.7)

v1.2: Workstreams + Validation + Gap Closure (10 phases, 36 plans) ​

How It Changed ​

v1.2 was the first milestone that outgrew the simple linear workflow. With 10 phases, it needed structure:

.planning/
  milestones/
    v1.2/
      workstream-admin/      # Phases 1-4
      workstream-billing/    # Phases 5-10
      Phase-20/              # Validation/gap-closure
      Phase-21/
      Phase-22/
      Phase-23/

Key additions:

  1. Workstream directories — grouped related phases by domain
  2. Wave-0 test stubs — written upfront at the start of each wave
  3. Explicit validation phases (20-23) — dedicated to closing deferred test debt
  4. Service binding pattern — admin RPC isolated behind Cloudflare service binding

The Gap-Closure Discovery ​

Phases 20-23 were the first dedicated gap-closure phases. They addressed test stubs that had been deferred during feature development. The discovery: closing gaps in a dedicated phase is more effective than trying to close them in-band because:

  • The audit provides a complete inventory of gaps
  • Dedicated phases can focus exclusively on validation without feature distractions
  • Gap-closure phases have different acceptance criteria than feature phases

What Worked ​

  • Workstream structure kept related phases together
  • Validation phases caught real issues (keeper loop error handling, event emission gaps)
  • Service binding pattern prevented admin route exposure

What Didn't Work ​

  • Phases 20-22 were created outside the workstream directory, causing fragmentation
  • The validation phases were added reactively rather than planned upfront

Carried Forward ​

  • Workstream directory structure
  • Gap-closure phase pattern
  • Service binding for admin isolation
  • Wave-0 test stubs

v1.3: Milestone Audit Discipline (3 phases, 13 plans) ​

How It Changed ​

v1.3 was a focused milestone (auth migration + Better Auth) but introduced the most important process change: milestone audit before archival.

1. Execute feature phases
2. Run gsd-audit-milestone (mid-milestone, ~60% completion)
3. Execute remaining phases
4. Run gsd-audit-milestone (pre-archival)
5. Archive only after audit passes

Key additions:

  1. Mid-milestone audit — catches issues while context is fresh
  2. Pre-archival audit — catches anything missed before milestone closes
  3. Centralized auth redirect handling — Better Auth plugin for redirect management
  4. Playwright E2E for auth flows — automated testing of login/signup/logout

The Audit Discipline Discovery ​

The v1.3 audit found cross-plan integration testing gaps that were invisible during individual phase execution. Specifically:

  • Auth middleware wasn't applied to newly created webhook endpoints
  • Session migration had edge cases when wallet-only users encountered email-required routes
  • Better Auth plugin configuration was incomplete for the organization-based merchant model

What Worked ​

  • Milestone audit caught real integration bugs
  • Better Auth plugin ecosystem reduced custom auth code
  • Playwright E2E tests now guard auth regression

What Didn't Work ​

  • Auth was still partially mixed with feature work, causing integration churn
  • Security middleware was applied in a separate phase rather than co-located with features

Carried Forward ​

  • Milestone audit discipline (mid-milestone + pre-archival)
  • Centralized auth redirect pattern
  • Better Auth plugin adoption

v1.4: CU Profiling Gate (2 phases, 13 plans) ​

How It Changed ​

v1.4 was small (agent mandate protocol) but introduced a technical gate:

  • CU profiling gate — agent mandates required compute unit profiling before approval
  • This ensured that agent spending mandates wouldn't create pathological on-chain compute patterns

What Worked ​

  • CU profiling caught an edge case where recursive agent calls could exceed the compute budget
  • Small milestone scope meant focused execution

What Didn't Work ​

  • Only 2 phases, so limited process evolution
  • No validation phase (scope was too small to justify one)

Carried Forward ​

  • CU profiling as a gate for new instruction types

v1.5: Shared Patterns + Tech Debt Acceptance (7 phases, 37 plans) ​

How It Changed ​

v1.5 introduced two significant process changes:

  1. Shared checkout-session pattern — vela-checkout and vela-portal both use the same session creation flow
  2. Explicit tech debt tracking — rather than leaving deferred items implicit, they're tracked in REQUIREMENTS.md with explicit "deferred to v1.x" annotations

Key structural changes:

  • Public billing surfaces (vela-checkout, vela-portal) recognized as separate repos
  • Proxy pattern for public→internal routing
  • Checkout sessions as the shared abstraction between checkout and portal

The Tech Debt Acceptance Discovery ​

Previous milestones treated deferred items as failures. v1.5 recognized that some deferral is strategic:

  • The webhook SDK was deferred from v1.5 to v1.7+ because the event schema wasn't stable
  • Multi-token billing was deferred from v1.5 to v1.7 because USDC-only was sufficient for launch
  • The key insight: explicitly track what's deferred and why, rather than leaving it implicit

What Worked ​

  • Shared checkout-session pattern reduced code duplication
  • Explicit tech debt tracking provided clarity on what was intentionally deferred
  • High velocity (18.5 plans/day) — highest of any milestone

What Didn't Work ​

  • Some deferred items didn't get clear enough "why" annotations
  • The proxy pattern added latency to public-facing routes

Carried Forward ​

  • Shared checkout-session pattern
  • Explicit tech debt tracking in REQUIREMENTS.md
  • Strategic deferral with clear documentation

v1.6: Docs-Only Milestone Adaptation (4 phases, 16 plans) ​

How It Changed ​

v1.6 was the first docs-only milestone. It required adapting the GSD workflow for non-code work:

  1. Phase consolidation — originally 5 phases, consolidated to 3 content phases + 1 gap closure
  2. Build-time link validation — starlight-links-validator as quality gate
  3. Audience-based IA — starlight-sidebar-topics for multi-audience navigation
  4. Milestone audit for non-code work — demonstrated that audit discipline applies beyond code

The Phase Consolidation Discovery ​

Docs phases have lower coupling than code phases. Multiple docs chapters can be written in parallel because they don't share runtime dependencies. This means:

  • Docs phases can be merged more aggressively than code phases
  • The risk of consolidation is lower (broken links caught by validator)
  • Content phases benefit from batched writing (consistent voice, cross-referencing)

What Worked ​

  • Phase consolidation (5→4) saved a session without losing coverage
  • Build-time link validation caught 34 broken links
  • Audience-based IA (developers, merchants, protocol) improved navigation
  • Milestone audit caught docs-specific issues (missing migration guides, stale API references)

What Didn't Work ​

  • Docs milestones have different estimation characteristics — plans take longer to review than to write
  • rehype-mermaid SSR diagrams required custom configuration that took a full plan to set up

Carried Forward ​

  • Phase consolidation for docs work
  • Build-time link validation
  • Audience-based IA
  • Milestone audit for non-code work

v1.7: Protocol Refactoring + Gap-Closure Pattern (5 phases, 29 plans) ​

How It Changed ​

v1.7 was the most technically complex milestone, involving a full protocol/SDK refactor:

  1. Versioned accounts — every account gets version: u8 + _reserved: [u8; 64]
  2. Gap-closure phase pattern formalized — dedicated phases for closing validation gaps
  3. "Unit tests pass ≠ integration works" lesson — Phase 42 passed unit tests but had integration gaps
  4. IDL freshness as deployment concern — SDK IDL must match deployed program
  5. Two gap-closure phases — integration drift (Phase 43) + traceability drift (Phase 44)

The Double Gap-Closure Discovery ​

Phase 42 skipped the verifier because unit tests passed. This created two distinct categories of gaps:

  1. Integration drift — individual components worked in isolation but not together
  2. Traceability drift — SUMMARY.md files and requirements tracking fell behind actual implementation

These required separate gap-closure phases because:

  • Integration gaps require code changes and new tests
  • Traceability gaps require documentation and state file updates
  • Attempting both in one phase would mix code and docs concerns

The Account Versioning Discovery ​

Adding _reserved: [u8; 64] to every account costs ~64 bytes per account but provides:

  • Additive field migrations without account closure cycles
  • Streaming payments added without breaking existing mandates
  • Future multi-token support without redeployment
  • Cost: negligible. Benefit: significant.

What Worked ​

  • Versioned accounts enabled clean streaming addition in v1.8
  • Centralized PDAFactory eliminated seed derivation bugs
  • Dynamic program ID resolution removed hardcoded config

What Didn't Work ​

  • Skipping verifier on Phase 42 created 30% overhead (two gap-closure phases)
  • IDL freshness wasn't checked automatically — led to SDK/program mismatch

Carried Forward ​

  • Versioned accounts for all new account types
  • Gap-closure phase as formal pattern
  • Dynamic program ID resolution
  • Centralized PDAFactory

v1.8: Aggressive Phase Merging (3 phases, 47 plans) ​

How It Changed ​

v1.8 consolidated from a planned 5 phases to 3 phases:

Phase 45: Streaming + SDK builders
Phase 46: Dashboard UI + billing surfaces
Phase 47: Webhook events + staging validation

The merging rationale:

  • Phase 45+46 share SDK builders — streaming SDK methods are used by both dashboard and public surfaces
  • Phase 46+47 share dashboard UI — webhook configuration is a dashboard feature
  • Phase 47 must be last — webhook event types depend on streaming (45) and dashboard (46) events

The Sequencing Discovery ​

Phase merging works when phases share implementation artifacts. The key insight:

  • Streaming is net-new primitive (no dependencies on existing features)
  • Dashboard UI consumes streaming SDK (depends on Phase 45)
  • Webhooks tag events from both streaming and dashboard (depends on 45+46)

This creates a clean dependency chain: 45 → 46 → 47. Merging is safe because the dependency direction is unambiguous.

What Worked (So Far) ​

  • Phase merging increased velocity (47 plans across 3 phases)
  • Clear dependency chain prevented sequencing conflicts
  • Streaming as a net-new primitive had no coupling with existing features

What Didn't Work (So Far) ​

  • Higher plans-per-phase ratio means longer individual sessions
  • More plans means more context to maintain across the session

Process Maturity Summary ​

What Became Permanent ​

ProcessOriginWhy It Stuck
Phase → Plan → Execute cyclev1.0Fundamental workflow unit
Workstream directory structurev1.2Scales to multi-domain milestones
Gap-closure phasesv1.2Prevents validation debt accumulation
Milestone audit (mid + pre-archival)v1.3Catches real bugs at both checkpoints
Explicit tech debt trackingv1.5Provides clarity on strategic deferrals
Build-time link validationv1.6Zero-cost quality gate for docs
Versioned accountsv1.7Cheap insurance for protocol evolution
Phase merging for shared artifactsv1.8Increases velocity when dependencies are clear

What Was Abandoned ​

ProcessOriginWhy Abandoned
Flat phase directoriesv1.0Doesn't scale past 5 phases
Linear phase numberingv1.0Can't insert urgent work
In-band validation closurev1.0-v1.1Less effective than dedicated phases
Implicit tech debt trackingv1.0-v1.4Creates confusion about what's deferred
Mixed auth + feature phasesv1.0-v1.2Integration complexity exceeds cost of separate phase

Process Selection Guide ​

Milestone TypeRecommended Process
Feature-heavy (5+ phases)Workstreams + gap-closure phases + mid-milestone audit
Focused (2-4 phases)Linear phases + pre-archival audit
Docs-onlyAggressive consolidation + build-time validation + pre-archival audit
Protocol refactorVersioned accounts + PDAFactory + dedicated integration testing
Auth migrationSeparate auth phase + E2E tests + migration verification

Internal knowledge base for the Vela Labs workspace.