Roadmap restructure v038 v039 (#231)
Co-authored-by: gobha <jasafpro@gmail.com> Co-committed-by: gobha <jasafpro@gmail.com>
This commit is contained in:
139
docs/ROADMAP.md
139
docs/ROADMAP.md
@@ -15,10 +15,12 @@ No compatibility guarantees before 1.0.
|
|||||||
|
|
||||||
## Dependency Graph
|
## Dependency Graph
|
||||||
|
|
||||||
Two parallel implementation tracks converge at v0.50.0 (MVP). The
|
Three parallel implementation tracks converge at v0.50.0 (MVP). The
|
||||||
extension track builds the package ecosystem and workflow capabilities.
|
extension track (v0.38.x) builds the package ecosystem that dynamic
|
||||||
The operations track builds production readiness for multi-team
|
workflows depend on. The workflow track (v0.39.x) builds both simple
|
||||||
deployment. Neither blocks the other until the MVP gate.
|
and dynamic workflow capabilities on that foundation. The operations
|
||||||
|
track builds production readiness. A polish series (v0.40.x) follows
|
||||||
|
to stabilize for MVP.
|
||||||
|
|
||||||
```
|
```
|
||||||
v0.9.x–v0.28.7 Foundation through Platform Polish ✅
|
v0.9.x–v0.28.7 Foundation through Platform Polish ✅
|
||||||
@@ -52,17 +54,23 @@ v0.9.x–v0.28.7 Foundation through Platform Polish ✅
|
|||||||
│ v0.37.17–18 Surfaces ✅ │
|
│ v0.37.17–18 Surfaces ✅ │
|
||||||
│ v0.37.19 Tag │
|
│ v0.37.19 Tag │
|
||||||
│ │ │
|
│ │ │
|
||||||
│ v0.38.x Workflow │
|
v0.38.0–.4 │ │
|
||||||
│ Product Maturity │
|
Extension │ │
|
||||||
|
Continuation │ │
|
||||||
│ │ │
|
│ │ │
|
||||||
v0.39.0 │ │
|
├────────────┤ │
|
||||||
v0.39.1 │ │
|
│ │ │
|
||||||
v0.39.2 │ │
|
│ v0.39.x Workflow │
|
||||||
v0.39.3 │ │
|
│ Product Maturity │
|
||||||
|
│ (simple + dynamic) │
|
||||||
|
│ │ │
|
||||||
|
│ v0.40.x Polish │
|
||||||
|
│ (bug hunt, dead │
|
||||||
|
│ code, stabilize) │
|
||||||
│ │ │
|
│ │ │
|
||||||
══════╪════════════╪═════════════════╪══════
|
══════╪════════════╪═════════════════╪══════
|
||||||
│ MVP v0.50.0 │
|
│ MVP v0.50.0 │
|
||||||
│ (all three tracks complete │
|
│ (all tracks complete │
|
||||||
│ + mobile + deploy docs) │
|
│ + mobile + deploy docs) │
|
||||||
══════╪════════════╪═════════════════╪══════
|
══════╪════════════╪═════════════════╪══════
|
||||||
│
|
│
|
||||||
@@ -254,36 +262,81 @@ light mode CSS audit, dead code hunt. Every capability has a UI.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.x — Workflow Product Maturity
|
## v0.38.x — Extension Track Continuation
|
||||||
|
|
||||||
See [ROADMAP-0.38](Workflow/ROADMAP-0.38.md) for full version plan.
|
|
||||||
|
|
||||||
Visual workflow builder series. Bridges .37 plumbing to MVP gate
|
|
||||||
("team admins build workflows visually").
|
|
||||||
|
|
||||||
| Version | Summary | MVP Role |
|
|
||||||
|---------|---------|----------|
|
|
||||||
| v0.38.0 | Form Builder | **Blocker** — visual field editor replaces JSON textarea |
|
|
||||||
| v0.38.1 | Stage Reorder + Bulk Ops | DnD reorder, multi-select operations |
|
|
||||||
| v0.38.2 | SLA Alerting | Scheduled scanner, breach notifications |
|
|
||||||
| v0.38.3 | Visitor Experience | Branding, progress indicator, email notifications |
|
|
||||||
| v0.38.4 | Workflow Templates + Clone | 5 built-in templates, deep copy |
|
|
||||||
| v0.38.5 | Analytics Dashboard | Throughput, cycle time, SLA compliance |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## v0.39.x — Extension Track Continuation
|
|
||||||
|
|
||||||
Resumes the extension track (v0.29–v0.31 ✅) with three new platform
|
Resumes the extension track (v0.29–v0.31 ✅) with three new platform
|
||||||
primitives: multi-file Starlark packages, extension connections, and library
|
primitives: multi-file Starlark packages, extension connections, and
|
||||||
packages. See design docs for full specifications.
|
library packages. Culminates in a git-board rewrite that validates the
|
||||||
|
entire stack. **Must ship before v0.39.x** — dynamic workflows depend
|
||||||
|
on `load()`, connections, and libraries.
|
||||||
|
|
||||||
|
See design docs for full specifications.
|
||||||
|
|
||||||
| Version | Summary | Design Doc |
|
| Version | Summary | Design Doc |
|
||||||
|---------|---------|------------|
|
|---------|---------|------------|
|
||||||
| v0.39.0 | Multi-file Starlark | [DESIGN-MULTI-FILE-STARLARK.md](DESIGN-MULTI-FILE-STARLARK.md) — `load()` support, disk-based scripts, package-scoped loader. Prerequisite for libraries. 5 backend changesets. |
|
| v0.38.0 | Multi-file Starlark | [DESIGN-MULTI-FILE-STARLARK.md](DESIGN-MULTI-FILE-STARLARK.md) — `load()` support, disk-based scripts, package-scoped loader. Prerequisite for libraries. 5 backend changesets. |
|
||||||
| v0.39.1 | Extension Connections | [DESIGN-EXT-CONNECTIONS-LIBRARIES.md](DESIGN-EXT-CONNECTIONS-LIBRARIES.md) Part 1 — `ext_connections` table, scoped CRUD (personal → team → global resolution), `connections` Starlark module, 3 management UIs. |
|
| v0.38.1 | Extension Connections | [DESIGN-EXT-CONNECTIONS-LIBRARIES.md](DESIGN-EXT-CONNECTIONS-LIBRARIES.md) Part 1 — `ext_connections` table, scoped CRUD (personal → team → global resolution), `connections` Starlark module, 3 management UIs. |
|
||||||
| v0.39.2 | Library Packages | Part 2 — `library` package type, `ext_dependencies` table, `lib.load()` with per-library permission context, dependency resolution, uninstall protection. |
|
| v0.38.2 | Library Packages | Part 2 — `library` package type, `ext_dependencies` table, `lib.load()` with per-library permission context, dependency resolution, uninstall protection. |
|
||||||
| v0.39.3 | Full Composition | Part 3 — Libraries declare connection types for consumers, reference `gitea-client` library, migrate `git-board` to library-backed surface. |
|
| v0.38.3 | Full Composition | Part 3 — Libraries declare connection types for consumers, reference `gitea-client` library. |
|
||||||
|
| v0.38.4 | Git-board Rewrite | Capstone validation — rewrite git-board as multi-package, multi-platform extension (Gitea/GitLab/GitHub). Proves the entire extension architecture works end-to-end. Reference implementation for future extension authors. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v0.39.x — Workflow Product Maturity
|
||||||
|
|
||||||
|
See [ROADMAP-0.39](Workflow/ROADMAP-0.39.md) for full version plan.
|
||||||
|
|
||||||
|
Dual workflow architecture: **simple** (static stages, fixed forms,
|
||||||
|
declarative rules) and **dynamic** (Starlark-driven branching, API-backed
|
||||||
|
pre-screening, tailored data collection). A single workflow graph can
|
||||||
|
mix both types.
|
||||||
|
|
||||||
|
Depends on: v0.38.x (dynamic stages require `load()`, connections,
|
||||||
|
and libraries for external API calls and reusable logic).
|
||||||
|
|
||||||
|
### Stage Graph Architecture
|
||||||
|
|
||||||
|
Three node types in the workflow graph:
|
||||||
|
|
||||||
|
- **Simple stage** — declarative form, fixed fields, built-in renderer.
|
||||||
|
Team admins author these visually (form builder).
|
||||||
|
- **Dynamic stage** — Starlark hook runs at entry, returns form
|
||||||
|
config/routing based on customer data. Developers author these.
|
||||||
|
- **Automated stage** — no UI, Starlark execution only (API calls,
|
||||||
|
data transforms, pre-screening). Invisible to visitors.
|
||||||
|
|
||||||
|
**Branching:** layered approach — declarative rules (`if customer.type
|
||||||
|
== enterprise → stage A`) for simple cases, optional Starlark hook for
|
||||||
|
complex branching logic. Progressive complexity.
|
||||||
|
|
||||||
|
**Visitor surface:** standalone portal (branded URL, no chat chrome).
|
||||||
|
The portal renders whatever the current stage dictates — it doesn't
|
||||||
|
care whether the stage config came from static definition or Starlark.
|
||||||
|
|
||||||
|
### Version Plan
|
||||||
|
|
||||||
|
| Version | Summary | MVP Role |
|
||||||
|
|---------|---------|----------|
|
||||||
|
| v0.39.0 | Stage Graph Engine + Form Builder | **Blocker** — graph execution engine with simple/dynamic/automated node types; visual field editor replaces JSON textarea |
|
||||||
|
| v0.39.1 | Stage Reorder + Bulk Ops | DnD reorder, multi-select operations |
|
||||||
|
| v0.39.2 | SLA Alerting | Scheduled scanner, breach notifications |
|
||||||
|
| v0.39.3 | Visitor Portal | Standalone branded portal, progress indicator, email notifications, session resume |
|
||||||
|
| v0.39.4 | Workflow Templates + Clone | Built-in templates, deep copy |
|
||||||
|
| v0.39.5 | Analytics Dashboard | Throughput, cycle time, SLA compliance |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v0.40.x — Polish
|
||||||
|
|
||||||
|
Bug hunt, dead code hunt, stabilization. As many sub-versions as
|
||||||
|
needed to reach a polished MVP-ready product. May pull in features
|
||||||
|
from ongoing stakeholder meetings.
|
||||||
|
|
||||||
|
- [ ] UI bug fixes
|
||||||
|
- [ ] Dead code removal
|
||||||
|
- [ ] Performance audit
|
||||||
|
- [ ] Accessibility pass
|
||||||
|
- [ ] Additional features TBD from stakeholder input
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -294,13 +347,19 @@ on a 3-node cluster. An IT team can operate the platform without
|
|||||||
reading Go source code. Team admins build workflows visually.
|
reading Go source code. Team admins build workflows visually.
|
||||||
|
|
||||||
**Requires all of:**
|
**Requires all of:**
|
||||||
- Extension track through v0.31.2 (full package ecosystem, visual
|
- Extension track through v0.31.2 (package ecosystem, SDK-based
|
||||||
workflow builder, SDK-based surfaces, team workflow self-service)
|
surfaces, team workflow self-service) ✅
|
||||||
- Operations track through v0.34.0 (multi-replica HA, observability,
|
- Operations track through v0.34.0 (multi-replica HA, observability,
|
||||||
data portability) ✅
|
data portability) ✅
|
||||||
- Workflow product v0.35.0 (form rendering, data pipeline, conditional
|
- Workflow product v0.35.0 (form rendering, data pipeline, conditional
|
||||||
routing, structured review, monitoring dashboard)
|
routing, structured review, monitoring dashboard) ✅
|
||||||
- Full OpenAPI spec v0.36.0 (complete API documentation for all domains)
|
- Full OpenAPI spec v0.36.0 (complete API documentation) ✅
|
||||||
|
- UI rewrite v0.37.x (Preact+htm migration, all surfaces) ✅
|
||||||
|
- Extension continuation v0.38.x (multi-file Starlark, connections,
|
||||||
|
libraries, git-board rewrite)
|
||||||
|
- Workflow maturity v0.39.x (stage graph engine, simple + dynamic
|
||||||
|
workflows, visitor portal, analytics)
|
||||||
|
- Polish v0.40.x (bug hunt, dead code, stabilization)
|
||||||
|
|
||||||
**Additionally requires:**
|
**Additionally requires:**
|
||||||
- [ ] Deployment guide: step-by-step for IT team (PG cluster,
|
- [ ] Deployment guide: step-by-step for IT team (PG cluster,
|
||||||
|
|||||||
@@ -1,11 +1,56 @@
|
|||||||
# ROADMAP-0.38 — Workflow Product Maturity
|
# ROADMAP-0.39 — Workflow Product Maturity
|
||||||
|
|
||||||
Everything deferred from v0.37.15 plus what the MVP gate actually
|
Everything deferred from v0.37.15 plus what the MVP gate actually
|
||||||
requires: "Team admins build workflows **visually**."
|
requires: "Team admins build workflows **visually**."
|
||||||
|
|
||||||
v0.37.15 delivers the plumbing — cancel, unclaim, reassign, stage CRUD
|
v0.37.15 delivers the plumbing — cancel, unclaim, reassign, stage CRUD
|
||||||
in the FE, queue views. This series builds the product on top of that
|
in the FE, queue views. v0.38.x delivers the extension infrastructure
|
||||||
plumbing.
|
(multi-file Starlark, connections, libraries) that dynamic workflows
|
||||||
|
depend on. This series builds the product on top of both foundations.
|
||||||
|
|
||||||
|
**Two workflow camps:**
|
||||||
|
- **Simple workflows** — static stages, fixed forms, declarative rules.
|
||||||
|
Team admins author these visually.
|
||||||
|
- **Dynamic workflows** — Starlark-driven branching, API-backed
|
||||||
|
pre-screening, tailored data collection based on customer context.
|
||||||
|
Developers author these for team admins to deploy.
|
||||||
|
|
||||||
|
A single workflow graph can mix simple, dynamic, and automated stages.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage Graph Architecture
|
||||||
|
|
||||||
|
Three node types in the workflow graph:
|
||||||
|
|
||||||
|
| Node Type | UI | Author | Example |
|
||||||
|
|-----------|-----|--------|---------|
|
||||||
|
| **Simple** | Declarative form, fixed fields, built-in renderer | Team admin (form builder) | "Collect name, email, issue type" |
|
||||||
|
| **Dynamic** | Starlark hook returns form config/routing at runtime | Developer | "Check CRM, skip fields we already know, route by customer tier" |
|
||||||
|
| **Automated** | No UI — Starlark execution only | Developer | "Call external API, transform data, pre-screen eligibility" |
|
||||||
|
|
||||||
|
**Branching:** Layered approach — declarative rules for simple cases
|
||||||
|
(`if customer.type == enterprise → stage A`), optional Starlark hook
|
||||||
|
for complex branching. Progressive complexity: team admins use rules,
|
||||||
|
developers add hooks when needed.
|
||||||
|
|
||||||
|
**Visitor surface:** Standalone portal (branded URL, no chat chrome).
|
||||||
|
The portal renders whatever the current stage dictates — it doesn't
|
||||||
|
care whether the stage config came from static definition or Starlark.
|
||||||
|
|
||||||
|
### Example Mixed Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
[Pre-screen (automated: CRM lookup via Starlark)]
|
||||||
|
│
|
||||||
|
[Branch: known customer?]
|
||||||
|
yes → [Verify Info (simple: pre-filled form)]
|
||||||
|
no → [Full Intake (dynamic: Starlark picks fields)]
|
||||||
|
│
|
||||||
|
[Review (simple stage)]
|
||||||
|
│
|
||||||
|
[Provision (automated: external API call)]
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -13,17 +58,21 @@ plumbing.
|
|||||||
|
|
||||||
```
|
```
|
||||||
v0.37.15 Workflow Ownership & Lifecycle (plumbing)
|
v0.37.15 Workflow Ownership & Lifecycle (plumbing)
|
||||||
v0.37.16 Projects Surface
|
v0.37.16–18 Projects, Workspaces, Debug surfaces
|
||||||
v0.37.17 Debug / Model Surface
|
v0.37.19 Tag ("UI Complete")
|
||||||
│
|
│
|
||||||
── 0.37 tag ──
|
v0.38.0–.4 Extension Continuation (Starlark, connections, libraries, git-board)
|
||||||
│
|
│
|
||||||
v0.38.0 Form Builder ← team admins stop writing JSON
|
── 0.38 tag ──
|
||||||
v0.38.1 Stage Reorder + Bulk Ops ← queue management at scale
|
│
|
||||||
v0.38.2 SLA Alerting ← stale queues self-report
|
v0.39.0 Stage Graph Engine + Form Builder ← graph execution + visual editing
|
||||||
v0.38.3 Visitor Experience ← the public face
|
v0.39.1 Stage Reorder + Bulk Ops ← queue management at scale
|
||||||
v0.38.4 Workflow Templates + Clone ← reuse across teams
|
v0.39.2 SLA Alerting ← stale queues self-report
|
||||||
v0.38.5 Analytics Dashboard ← throughput, bottlenecks, SLA compliance
|
v0.39.3 Visitor Portal ← standalone branded experience
|
||||||
|
v0.39.4 Workflow Templates + Clone ← reuse across teams
|
||||||
|
v0.39.5 Analytics Dashboard ← throughput, bottlenecks, SLA compliance
|
||||||
|
│
|
||||||
|
v0.40.x Polish (bug hunt, dead code, stabilize)
|
||||||
│
|
│
|
||||||
─ ─ ─ MVP v0.50.0 gate ─ ─ ─
|
─ ─ ─ MVP v0.50.0 gate ─ ─ ─
|
||||||
```
|
```
|
||||||
@@ -33,23 +82,65 @@ v0.38.5 Analytics Dashboard ← throughput, bottlenecks, SLA compl
|
|||||||
| Milestone | Gate | Meaning |
|
| Milestone | Gate | Meaning |
|
||||||
|-----------|------|---------|
|
|-----------|------|---------|
|
||||||
| v0.37 tag | **UI Complete** | Every platform capability has a surface; no features require raw API calls |
|
| v0.37 tag | **UI Complete** | Every platform capability has a surface; no features require raw API calls |
|
||||||
| v0.38.0 | **Self-service** | A team admin can build a complete workflow without touching JSON or asking a global admin |
|
| v0.38 tag | **Extensible** | Extensions can load modules, manage connections, and compose libraries; git-board proves it |
|
||||||
| v0.38.2 | **Operational** | Stale work surfaces automatically; team admins can manage queues without monitoring dashboards |
|
| v0.39.0 | **Self-service** | Team admins build simple workflows visually; developers can add dynamic stages |
|
||||||
| v0.38.5 | **Measurable** | Team leads can answer "how long does stage X take" and "where are we bottlenecked" |
|
| v0.39.2 | **Operational** | Stale work surfaces automatically; team admins can manage queues without monitoring dashboards |
|
||||||
|
| v0.39.5 | **Measurable** | Team leads can answer "how long does stage X take" and "where are we bottlenecked" |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.0 — Form Builder
|
## v0.39.0 — Stage Graph Engine + Form Builder
|
||||||
|
|
||||||
|
**The foundational version.** Two deliverables:
|
||||||
|
|
||||||
|
### 1. Stage Graph Engine
|
||||||
|
|
||||||
|
The workflow execution engine gains awareness of node types. Each stage
|
||||||
|
in the workflow definition includes a `stage_type` field:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Stage model additions:
|
||||||
|
type StageType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
StageSimple StageType = "simple" // declarative form, built-in renderer
|
||||||
|
StageDynamic StageType = "dynamic" // Starlark hook returns form/routing
|
||||||
|
StageAutomated StageType = "automated" // no UI, Starlark only
|
||||||
|
)
|
||||||
|
|
||||||
|
// Branching rule (declarative):
|
||||||
|
type BranchRule struct {
|
||||||
|
Field string `json:"field"` // form field key or context var
|
||||||
|
Op string `json:"op"` // eq, neq, gt, lt, contains, exists
|
||||||
|
Value any `json:"value"` // comparison value
|
||||||
|
NextStage string `json:"next_stage"` // stage ID to route to
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stage additions:
|
||||||
|
type Stage struct {
|
||||||
|
// ... existing fields ...
|
||||||
|
StageType StageType `json:"stage_type"`
|
||||||
|
BranchRules []BranchRule `json:"branch_rules,omitempty"` // declarative
|
||||||
|
StarlarkHook string `json:"starlark_hook,omitempty"` // package:function
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The engine evaluates branch rules first; if no rule matches and a
|
||||||
|
Starlark hook is configured, it calls the hook. Default fallback is
|
||||||
|
next ordinal (existing behavior).
|
||||||
|
|
||||||
|
For automated stages, the engine calls the Starlark hook immediately
|
||||||
|
on entry and auto-advances when it returns.
|
||||||
|
|
||||||
|
### 2. Form Builder
|
||||||
|
|
||||||
**The single biggest gap.** `form_template` is currently raw JSON in a
|
**The single biggest gap.** `form_template` is currently raw JSON in a
|
||||||
textarea. The MVP gate says "build workflows visually" — this is the
|
textarea. The MVP gate says "build workflows visually" — this is the
|
||||||
make-or-break.
|
make-or-break.
|
||||||
|
|
||||||
### Scope
|
|
||||||
|
|
||||||
A visual form builder embedded in the stage editor (E2 from the .15
|
A visual form builder embedded in the stage editor (E2 from the .15
|
||||||
design). Not a standalone surface — it's a panel that opens when you
|
design). Not a standalone surface — it's a panel that opens when you
|
||||||
click "Edit Form" on a `form_only` or `form_chat` stage.
|
click "Edit Form" on a `simple` or `form_chat` stage.
|
||||||
|
|
||||||
### Fields supported (matching existing TypedFormTemplate)
|
### Fields supported (matching existing TypedFormTemplate)
|
||||||
|
|
||||||
@@ -87,7 +178,6 @@ function FormBuilder({ initial, onSave, onCancel }) {
|
|||||||
required: false,
|
required: false,
|
||||||
};
|
};
|
||||||
if (useFieldsets && targetFieldset !== undefined) {
|
if (useFieldsets && targetFieldset !== undefined) {
|
||||||
// Add to specific fieldset
|
|
||||||
setFieldsets(fs => fs.map((f, i) =>
|
setFieldsets(fs => fs.map((f, i) =>
|
||||||
i === targetFieldset ? { ...f, fields: [...f.fields, field] } : f
|
i === targetFieldset ? { ...f, fields: [...f.fields, field] } : f
|
||||||
));
|
));
|
||||||
@@ -209,27 +299,24 @@ function FieldEditor({ field, onChange, onRemove, allFields }) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### BE changes
|
|
||||||
|
|
||||||
None. The form builder is pure FE — it produces the same
|
|
||||||
`TypedFormTemplate` JSON that already exists. The BE validation
|
|
||||||
in `models/workflow.go` is unchanged.
|
|
||||||
|
|
||||||
### Deliverables
|
### Deliverables
|
||||||
|
|
||||||
| File | What |
|
| File | What |
|
||||||
|------|------|
|
|------|------|
|
||||||
|
| `server/models/workflow.go` | `StageType`, `BranchRule` types; stage model additions |
|
||||||
|
| `server/engine/graph.go` | Graph execution: branch rules → Starlark hook → ordinal fallback |
|
||||||
|
| `server/engine/automated.go` | Automated stage runner (call hook, auto-advance) |
|
||||||
| `src/js/sw/components/form-builder/index.js` | FormBuilder root |
|
| `src/js/sw/components/form-builder/index.js` | FormBuilder root |
|
||||||
| `src/js/sw/components/form-builder/field-editor.js` | FieldEditor, type-specific validators |
|
| `src/js/sw/components/form-builder/field-editor.js` | FieldEditor, type-specific validators |
|
||||||
| `src/js/sw/components/form-builder/fieldset-editor.js` | Fieldset grouping |
|
| `src/js/sw/components/form-builder/fieldset-editor.js` | Fieldset grouping |
|
||||||
| `src/js/sw/components/form-builder/condition-editor.js` | Conditional visibility |
|
| `src/js/sw/components/form-builder/condition-editor.js` | Conditional visibility |
|
||||||
| `src/js/sw/components/form-builder/preview.js` | Live form preview |
|
| `src/js/sw/components/form-builder/preview.js` | Live form preview |
|
||||||
| `src/css/form-builder.css` | Styles |
|
| `src/css/form-builder.css` | Styles |
|
||||||
| Integration into StageEditor (E2 from .15) | "Edit Form" button opens builder |
|
| Integration into StageEditor (E2 from .15) | "Edit Form" button opens builder; stage type picker |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.1 — Stage Reorder + Bulk Ops
|
## v0.39.1 — Stage Reorder + Bulk Ops
|
||||||
|
|
||||||
### Stage drag-and-drop
|
### Stage drag-and-drop
|
||||||
|
|
||||||
@@ -297,7 +384,7 @@ patch. YAGNI for now.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.2 — SLA Alerting
|
## v0.39.2 — SLA Alerting
|
||||||
|
|
||||||
The monitor already computes `sla_breached`. This version makes it
|
The monitor already computes `sla_breached`. This version makes it
|
||||||
proactive instead of requiring someone to check the dashboard.
|
proactive instead of requiring someone to check the dashboard.
|
||||||
@@ -340,31 +427,37 @@ The queue items (E1, E4) already render `sla_breached` badges. Add:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.3 — Visitor Experience
|
## v0.39.3 — Visitor Portal
|
||||||
|
|
||||||
The visitor currently gets a raw workflow surface. After .15 they get
|
The visitor currently gets a raw workflow surface embedded in the
|
||||||
a terminal screen (E5) when their stages are done. This version makes
|
app shell. This version delivers a **standalone branded portal** —
|
||||||
the visitor experience feel like a product.
|
a dedicated URL with no chat chrome, optimized for the visitor
|
||||||
|
experience.
|
||||||
|
|
||||||
### Scope
|
### Scope
|
||||||
|
|
||||||
1. **Branded entry page** — the workflow landing page already supports
|
1. **Standalone portal surface** — `/w/:id/:slug` renders a
|
||||||
|
full-page portal outside the app shell. No sidebar, no user menu,
|
||||||
|
no chat chrome. The portal renders the current stage's form
|
||||||
|
(simple or dynamic) and handles stage transitions.
|
||||||
|
|
||||||
|
2. **Branded entry page** — the workflow landing page already supports
|
||||||
branding (`accent_color`, `logo_url`, `tagline`). Extend with:
|
branding (`accent_color`, `logo_url`, `tagline`). Extend with:
|
||||||
- Custom welcome text (markdown)
|
- Custom welcome text (markdown)
|
||||||
- Background image/gradient
|
- Background image/gradient
|
||||||
- "Powered by" toggle (hide/show Switchboard branding)
|
- "Powered by" toggle (hide/show Switchboard branding)
|
||||||
|
|
||||||
2. **Progress indicator** — visitor sees "Step 1 of N" for their
|
3. **Progress indicator** — visitor sees "Step 1 of N" for their
|
||||||
visible stages only. Internal team stages are invisible. The
|
visible stages only. Internal team stages are invisible. The
|
||||||
progress bar counts only stages where the visitor is the audience.
|
progress bar counts only stages where the visitor is the audience.
|
||||||
|
|
||||||
3. **Email notifications** — optional. When configured on the workflow:
|
4. **Email notifications** — optional. When configured on the workflow:
|
||||||
- Collect email at stage 0 (or extract from form data)
|
- Collect email at stage 0 (or extract from form data)
|
||||||
- Send "request received" confirmation
|
- Send "request received" confirmation
|
||||||
- Send "your request is complete" when workflow completes
|
- Send "your request is complete" when workflow completes
|
||||||
- No notifications for internal stage transitions
|
- No notifications for internal stage transitions
|
||||||
|
|
||||||
4. **Session resume** — visitor who closes the browser can return to
|
5. **Session resume** — visitor who closes the browser can return to
|
||||||
`/w/:id/:slug` and resume where they left off. Already partially
|
`/w/:id/:slug` and resume where they left off. Already partially
|
||||||
implemented via `sb_session` cookie. Polish the UX: show "Welcome
|
implemented via `sb_session` cookie. Polish the UX: show "Welcome
|
||||||
back, pick up where you left off" instead of starting fresh.
|
back, pick up where you left off" instead of starting fresh.
|
||||||
@@ -401,16 +494,15 @@ the workflow editor with a hint.
|
|||||||
/**
|
/**
|
||||||
* VisitorProgress — step indicator for visitor-facing stages
|
* VisitorProgress — step indicator for visitor-facing stages
|
||||||
*
|
*
|
||||||
* Mount: workflow surface, above the stage content
|
* Mount: workflow portal, above the stage content
|
||||||
* Only counts stages where audience = visitor.
|
* Only counts stages where audience = visitor.
|
||||||
*/
|
*/
|
||||||
function VisitorProgress({ stages, currentStage }) {
|
function VisitorProgress({ stages, currentStage }) {
|
||||||
// Filter to visitor-facing stages only
|
|
||||||
const visitorStages = stages.filter(s => !s.assignment_team_id);
|
const visitorStages = stages.filter(s => !s.assignment_team_id);
|
||||||
const visitorIndex = visitorStages.findIndex(s => s.ordinal === currentStage);
|
const visitorIndex = visitorStages.findIndex(s => s.ordinal === currentStage);
|
||||||
const total = visitorStages.length;
|
const total = visitorStages.length;
|
||||||
|
|
||||||
if (total <= 1) return null; // Single stage = no progress bar
|
if (total <= 1) return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="visitor-progress">
|
<div className="visitor-progress">
|
||||||
@@ -431,7 +523,7 @@ function VisitorProgress({ stages, currentStage }) {
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.4 — Workflow Templates + Clone
|
## v0.39.4 — Workflow Templates + Clone
|
||||||
|
|
||||||
Team admins shouldn't rebuild common patterns from scratch. Two
|
Team admins shouldn't rebuild common patterns from scratch. Two
|
||||||
features:
|
features:
|
||||||
@@ -439,8 +531,9 @@ features:
|
|||||||
### Clone workflow
|
### Clone workflow
|
||||||
|
|
||||||
"Duplicate" button on the workflow editor. Creates a new workflow with
|
"Duplicate" button on the workflow editor. Creates a new workflow with
|
||||||
the same stages, form templates, and routing rules. New slug, new name
|
the same stages, form templates, branch rules, and Starlark hooks.
|
||||||
(appended "- Copy"). No versions carried over (must re-publish).
|
New slug, new name (appended "- Copy"). No versions carried over
|
||||||
|
(must re-publish).
|
||||||
|
|
||||||
```
|
```
|
||||||
POST /api/v1/teams/:teamId/workflows/:id/clone
|
POST /api/v1/teams/:teamId/workflows/:id/clone
|
||||||
@@ -451,15 +544,16 @@ Pure BE operation — deep-copies workflow + stages, generates new IDs.
|
|||||||
|
|
||||||
### Built-in templates
|
### Built-in templates
|
||||||
|
|
||||||
Seed a `workflow_templates` table with 3-5 common patterns:
|
Seed a `workflow_templates` table with common patterns covering both
|
||||||
|
simple and mixed workflows:
|
||||||
|
|
||||||
| Template | Stages | Description |
|
| Template | Stages | Type |
|
||||||
|----------|--------|-------------|
|
|----------|--------|------|
|
||||||
| Customer Intake | form → review | Public form, team reviews |
|
| Customer Intake | form → review | Simple |
|
||||||
| IT Help Desk | LLM chat → triage → resolution | AI-assisted intake |
|
| IT Help Desk | LLM chat → triage → resolution | Simple |
|
||||||
| Approval Chain | form → approve → approve → notify | Multi-level approval |
|
| Approval Chain | form → approve → approve → notify | Simple |
|
||||||
| Feedback Survey | form (multi-step) → analytics | Data collection |
|
| Smart Intake | automated (CRM lookup) → dynamic (tailored form) → review | Mixed |
|
||||||
| Onboarding | form → team A → team B → team A | Multi-team handoff |
|
| Onboarding | form → team A → team B → automated (provision) | Mixed |
|
||||||
|
|
||||||
"New from template" in the team-admin workflow creation flow.
|
"New from template" in the team-admin workflow creation flow.
|
||||||
Templates are read-only platform data, not user-editable. They
|
Templates are read-only platform data, not user-editable. They
|
||||||
@@ -469,11 +563,11 @@ serve as starting points — clone and customize.
|
|||||||
|
|
||||||
- "Duplicate" button in workflow editor header
|
- "Duplicate" button in workflow editor header
|
||||||
- "New from Template" option in workflow creation flow
|
- "New from Template" option in workflow creation flow
|
||||||
- Template picker modal with descriptions
|
- Template picker modal with descriptions and type badges
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v0.38.5 — Analytics Dashboard
|
## v0.39.5 — Analytics Dashboard
|
||||||
|
|
||||||
Team leads need to answer: how long does each stage take, where are
|
Team leads need to answer: how long does each stage take, where are
|
||||||
we bottlenecked, what's our SLA compliance rate.
|
we bottlenecked, what's our SLA compliance rate.
|
||||||
@@ -555,30 +649,38 @@ too high on large datasets (unlikely at 50-user scale).
|
|||||||
|
|
||||||
| Version | Estimated CS | Heaviest piece |
|
| Version | Estimated CS | Heaviest piece |
|
||||||
|---------|-------------|----------------|
|
|---------|-------------|----------------|
|
||||||
| v0.38.0 | 4 | Form builder component tree (5+ files) |
|
| v0.39.0 | 5 | Graph engine + form builder (10+ files) |
|
||||||
| v0.38.1 | 2 | Drag-and-drop is fiddly but small |
|
| v0.39.1 | 2 | Drag-and-drop is fiddly but small |
|
||||||
| v0.38.2 | 3 | SLA scanner + notification plumbing |
|
| v0.39.2 | 3 | SLA scanner + notification plumbing |
|
||||||
| v0.38.3 | 4 | Visitor branding + email + progress |
|
| v0.39.3 | 4 | Standalone portal + branding + email + progress |
|
||||||
| v0.38.4 | 2 | Clone is one BE endpoint + FE button |
|
| v0.39.4 | 2 | Clone is one BE endpoint + FE button |
|
||||||
| v0.38.5 | 3 | Analytics query + chart components |
|
| v0.39.5 | 3 | Analytics query + chart components |
|
||||||
| **Total** | **~18** | |
|
| **Total** | **~19** | |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Risk Notes
|
## Risk Notes
|
||||||
|
|
||||||
**v0.38.0 (Form Builder) is the long pole.** If this slips, the MVP
|
**v0.39.0 (Graph Engine + Form Builder) is the long pole.** Two
|
||||||
gate phrase "build workflows visually" fails. Prioritize this over
|
major deliverables in one version. If this slips, the MVP gate phrase
|
||||||
everything else in the series. If time is tight, ship a simplified
|
"build workflows visually" fails. Prioritize this over everything
|
||||||
version (no fieldsets, no conditional visibility) and add those in a
|
else in the series. If time is tight, ship the graph engine with
|
||||||
patch.
|
simple stages only (dynamic/automated as stubs) and a simplified
|
||||||
|
form builder (no fieldsets, no conditional visibility), then add
|
||||||
|
dynamic/automated execution and form builder polish in a patch.
|
||||||
|
|
||||||
**v0.38.3 (Email) depends on platform SMTP.** If SMTP isn't
|
**v0.39.3 (Email) depends on platform SMTP.** If SMTP isn't
|
||||||
configured, the feature is invisible. Consider making the email
|
configured, the feature is invisible. Consider making the email
|
||||||
config a prerequisite admin step with a setup wizard, or defer email
|
config a prerequisite admin step with a setup wizard, or defer email
|
||||||
to v0.38.5 and keep .3 focused on branding + progress.
|
to v0.39.5 and keep .3 focused on the standalone portal + branding
|
||||||
|
+ progress.
|
||||||
|
|
||||||
**v0.38.5 (Analytics) can be cut.** If the series is running long,
|
**v0.39.5 (Analytics) can be cut.** If the series is running long,
|
||||||
analytics is the most deferrable item — it's nice-to-have, not
|
analytics is the most deferrable item — it's nice-to-have, not
|
||||||
gate-blocking. The existing monitor + funnel endpoints cover the
|
gate-blocking. The existing monitor + funnel endpoints cover the
|
||||||
critical "is anything stuck" question.
|
critical "is anything stuck" question.
|
||||||
|
|
||||||
|
**Dynamic stage authoring DX.** Developers need clear docs and
|
||||||
|
examples for writing Starlark hooks. The git-board rewrite (v0.38.4)
|
||||||
|
should establish patterns, but workflow-specific examples are needed.
|
||||||
|
Consider a "dynamic stage cookbook" as part of v0.39.0.
|
||||||
Reference in New Issue
Block a user