Adds a new "procedural" tree type for linear step-by-step project workflows (domain controller setup, M365 onboarding, VPN config, etc). Includes intake form builder, two-panel step navigation, variable resolution, procedural exports, 3 seed templates, and UI rename from "Trees" to "Flows". Also archives 19 implemented plan docs and creates deferred features backlog. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
466 lines
28 KiB
Markdown
466 lines
28 KiB
Markdown
# Procedural Flows — Unified Implementation Plan
|
|
|
|
## Plan Comparison & Analysis
|
|
|
|
Before diving into the merged plan, here's how the three source plans compared and why specific choices were made.
|
|
|
|
### Plan 1 (Design Document — Claude + Michael)
|
|
**Strengths:** Richest feature vision. Best product thinking — pre-flight forms with field grouping, rich step types (action/informational/verification/warning), PowerShell snippets with variable injection, section headers within procedures, verification checks with multiple types (checkbox/text/screenshot), time estimates per step, and a strong example template library (DC Build, M365 Onboarding). Excellent as a product requirements document.
|
|
|
|
**Weaknesses:** Created entirely new database tables (ProcedureTemplate, FormField, ProcedureStep, ProcedureInstance) rather than extending the existing Tree model. This would duplicate a huge amount of existing infrastructure — authentication, CRUD endpoints, export pipelines, session management — all of which already work. No awareness of the existing codebase's file structure, variable resolution system (`[VAR:name]`), Zustand stores, or migration numbering. Not directly actionable by Claude Code without significant translation.
|
|
|
|
**Verdict:** Best product vision, weakest implementation strategy.
|
|
|
|
---
|
|
|
|
### Plan 2 (Procedural Flow Framework v1)
|
|
**Strengths:** Strong architectural awareness — adds `flow_mode` to the existing Tree model rather than creating parallel tables. Introduces dedicated procedural node types (`procedure_step`, `procedure_end`) which gives clean separation. Thorough validation rules (acyclic graph, single end node, no branching). Good test case coverage. Handles markdown parser/serializer compatibility (code-mode). Warning-only policy for missing required fields is pragmatic.
|
|
|
|
**Weaknesses:** Introduces new node types which adds complexity to the existing node system — every component that switches on node type needs updating. Six implementation phases is a lot of surface area. The intake form is "warning-only" for required fields, which could let techs start procedures with missing critical data (like no IP address for a DC build). Doesn't specify the runtime UX in much detail — no two-panel layout, no progress tracking specifics. Doesn't reference specific existing files or infrastructure to reuse.
|
|
|
|
**Verdict:** Strongest validation and publish constraints, but over-engineered node type approach.
|
|
|
|
---
|
|
|
|
### Plan 3 (Implementation Plan)
|
|
**Strengths:** Most implementation-ready by far. References exact file paths, existing infrastructure (variable_service.py, variableResolver.ts, session_variables JSONB field from migration 028, treeEditorStore patterns), and specific migration numbering (035). Uses `tree_type` on the existing Tree model — minimal schema changes. Creates a separate `proceduralEditorStore.ts` (clean separation) while reusing existing patterns. The two-panel navigation UX (step checklist + step detail) is concrete and buildable. Flat step array is simpler than a node graph for linear procedures. Four focused phases instead of six. The file manifest table makes it crystal clear what gets created vs modified.
|
|
|
|
**Weaknesses:** Lighter on product features — no step types (action/warning/verification), no PowerShell snippet support, no time estimates, no section headers, no verification checks. Uses `[VAR:name]` syntax (existing) rather than `{{variable}}` (more intuitive but would require a new resolver). Doesn't include template seeding in its phases. Less detail on the intake form field types compared to Plans 1 and 2.
|
|
|
|
**Verdict:** Highest chance of successful implementation, needs feature enrichment from Plans 1 and 2.
|
|
|
|
---
|
|
|
|
### Summary Matrix
|
|
|
|
| Criteria | Plan 1 (Design Doc) | Plan 2 (Framework v1) | Plan 3 (Impl Plan) |
|
|
|---|---|---|---|
|
|
| Codebase awareness | ❌ None | ⚠️ Partial | ✅ Exact file paths |
|
|
| Reuses existing infra | ❌ New tables | ✅ Extends Tree model | ✅ Extends Tree + reuses variable system |
|
|
| Feature richness | ✅ Richest | ⚠️ Medium | ⚠️ Lean |
|
|
| UX detail | ✅ Runner + Builder + Dashboard | ⚠️ Runtime mentioned | ✅ Two-panel layout specified |
|
|
| Implementation clarity | ❌ Conceptual | ⚠️ Phased but abstract | ✅ File-level specificity |
|
|
| Validation rules | ⚠️ Basic | ✅ Thorough | ⚠️ Basic |
|
|
| Chance of success | ⚠️ Low (too much new) | ⚠️ Medium (complex) | ✅ High (incremental) |
|
|
| Claude Code ready | ❌ No | ⚠️ Partially | ✅ Yes |
|
|
|
|
### Merge Strategy
|
|
|
|
**Use Plan 3 as the structural backbone** (file paths, migration approach, store patterns, reuse strategy), **enrich with Plan 1's product features** (rich step types, PowerShell snippets, verification checks, time estimates, section headers, template examples), and **incorporate Plan 2's validation rules** (publish constraints, acyclic enforcement, explicit end node requirement).
|
|
|
|
---
|
|
|
|
## Unified Implementation Plan
|
|
|
|
### Architecture Decision
|
|
|
|
Add a `tree_type` enum field (`'troubleshooting' | 'procedural'`) to the existing Tree model. Same table, same API endpoints, different behavior based on type. Procedural flows store steps as a flat ordered array (not a node graph) and include an intake form schema for pre-flight data collection. This avoids duplicating the entire tree infrastructure while giving procedural flows their own editor, navigation, and validation.
|
|
|
|
### Variable Syntax
|
|
|
|
Use the existing `[VAR:name]` infrastructure from `variable_service.py` and `variableResolver.ts`. This is already battle-tested in the codebase. No need to introduce `{{variable}}` syntax and a parallel resolver.
|
|
|
|
### Scope
|
|
|
|
**In scope:**
|
|
- `tree_type` + `intake_form` fields on Tree model (migration 035)
|
|
- Procedural tree validation (linear steps only, no decision nodes, explicit end)
|
|
- Rich step model (types, warnings, time estimates, verification, PowerShell, section headers)
|
|
- Intake form builder in the editor with field validation
|
|
- Intake form modal before session start
|
|
- Two-panel procedural navigation (step checklist + step detail)
|
|
- Variable resolution in step content via existing `[VAR:name]` infrastructure
|
|
- Procedural-aware exports
|
|
- Dashboard tabs (Troubleshooting | Procedures)
|
|
- Two seeded templates (DC Build, M365 User Onboarding)
|
|
|
|
**Out of scope (deferred):**
|
|
- Conditional steps (steps that show/hide based on form values)
|
|
- Procedural code-mode editor
|
|
- Step templates / reusable step library
|
|
- Approval workflows
|
|
- Screenshot verification type
|
|
- Session assignment/handoff
|
|
- AI-assisted template generation
|
|
- Automated PowerShell execution
|
|
|
|
---
|
|
|
|
## Data Model
|
|
|
|
### Migration 035: `035_add_tree_type_and_intake_form.py`
|
|
|
|
```
|
|
tree_type: String(20), NOT NULL, server_default='troubleshooting'
|
|
- Check constraint: IN ('troubleshooting', 'procedural')
|
|
- Indexed for filtering
|
|
|
|
intake_form: JSONB, nullable, default NULL
|
|
- Stores the intake form field definitions (see IntakeFormField schema below)
|
|
```
|
|
|
|
Existing trees automatically get `tree_type='troubleshooting'` and `intake_form=NULL`. No data migration needed.
|
|
|
|
### Intake Form Field Schema
|
|
|
|
Each field in the `intake_form` JSONB array supports:
|
|
|
|
| Property | Type | Required | Description |
|
|
|---|---|---|---|
|
|
| `variable_name` | string | Yes | Variable key used in `[VAR:name]` tokens. Pattern: `^[a-z][a-z0-9_]*$` |
|
|
| `label` | string | Yes | Display label (e.g., "Server Name") |
|
|
| `field_type` | enum | Yes | `text`, `textarea`, `number`, `ip_address`, `email`, `select`, `multi_select`, `checkbox`, `password` |
|
|
| `required` | boolean | Yes | Whether the field must be filled before starting |
|
|
| `options` | string[] | Conditional | Required for `select` and `multi_select` types |
|
|
| `placeholder` | string | No | Hint text shown in empty field |
|
|
| `help_text` | string | No | Tooltip or description explaining the field |
|
|
| `default_value` | string | No | Pre-filled default |
|
|
| `group_name` | string | No | Section grouping header (e.g., "Network Settings") |
|
|
| `display_order` | integer | Yes | Position in form (1, 2, 3...) |
|
|
| `validation` | object | No | Validation config (see below) |
|
|
|
|
#### Field Validation Config
|
|
|
|
```json
|
|
{
|
|
"min_length": 1,
|
|
"max_length": 15,
|
|
"pattern": "^[A-Za-z0-9-]+$",
|
|
"pattern_message": "Only letters, numbers, and hyphens allowed",
|
|
"format": "ipv4",
|
|
"min_value": 1,
|
|
"max_value": 4094,
|
|
"min_selections": 1,
|
|
"max_selections": 5
|
|
}
|
|
```
|
|
|
|
Format validators by field type:
|
|
- `ip_address` → validates IPv4 format (e.g., `192.168.1.10`)
|
|
- `email` → validates email format
|
|
- `number` → validates numeric range
|
|
- `text` → validates length and optional regex pattern
|
|
- `password` → validates minimum length
|
|
- `select` → value must match one of the defined options
|
|
- `multi_select` → values must match defined options, respects min/max selections
|
|
|
|
### Procedural Step Schema
|
|
|
|
Procedural trees store steps as a flat ordered array in the tree's node structure. Each step has:
|
|
|
|
| Property | Type | Required | Description |
|
|
|---|---|---|---|
|
|
| `id` | string | Yes | Unique step identifier |
|
|
| `type` | enum | Yes | `procedure_step` or `procedure_end` |
|
|
| `step_number` | integer | Yes | Order position (1, 2, 3...) |
|
|
| `title` | string | Yes | Step title (e.g., "Configure Static IP Address") |
|
|
| `description` | string | Yes | Instruction text with `[VAR:name]` placeholders |
|
|
| `content_type` | enum | Yes | `action`, `informational`, `verification`, `warning` |
|
|
| `estimated_minutes` | integer | No | Time estimate for this step |
|
|
| `warning_text` | string | No | Caution/warning banner text |
|
|
| `verification_prompt` | string | No | What to verify before marking complete |
|
|
| `verification_type` | enum | No | `checkbox` (confirm done) or `text_input` (enter observed value) |
|
|
| `commands` | string | No | PowerShell/CLI command block with `[VAR:name]` support and copy-to-clipboard |
|
|
| `expected_outcome` | string | No | What should happen after executing the step |
|
|
| `notes_enabled` | boolean | Yes | Whether tech can add freeform notes (default: true) |
|
|
| `section_header` | string | No | Section divider text (e.g., "Phase 2: AD Configuration") |
|
|
| `reference_url` | string | No | Link to external documentation |
|
|
| `next_node_id` | string | Conditional | Required for `procedure_step`, points to next step. Not present on `procedure_end`. |
|
|
|
|
### Procedural Publish Validation Rules
|
|
|
|
When publishing a procedural tree, enforce:
|
|
|
|
1. Tree must contain at least one `procedure_step` and exactly one `procedure_end`
|
|
2. Only `procedure_step` and `procedure_end` node types are allowed (no decision nodes)
|
|
3. No branching — each `procedure_step` points to exactly one `next_node_id`
|
|
4. Graph must be acyclic (no loops)
|
|
5. All steps must be reachable from the root node
|
|
6. The chain must terminate at the single `procedure_end` node
|
|
7. No orphan nodes
|
|
8. If `intake_form` is defined, all `variable_name` values must be unique
|
|
9. `select` and `multi_select` fields must have at least one option defined
|
|
|
|
### Session Variables
|
|
|
|
`SessionCreate` accepts optional `session_variables: dict[str, str]` to store intake form values. These are persisted in the existing `session_variables` JSONB field (already exists from migration 028).
|
|
|
|
At session start for procedural trees:
|
|
- If `intake_form` exists → validate required fields are present
|
|
- Required fields that are missing → **block start** (not warning-only; these are critical operational data)
|
|
- Optional fields that are missing → allowed, unresolved `[VAR:name]` tokens render as highlighted placeholders: `[server_name — not provided]`
|
|
|
|
---
|
|
|
|
## Phase 1: Backend Foundation
|
|
|
|
### Files to Modify
|
|
|
|
| File | Changes |
|
|
|---|---|
|
|
| `backend/alembic/versions/035_add_tree_type_and_intake_form.py` | **CREATE** — Migration adding `tree_type` and `intake_form` columns |
|
|
| `backend/app/models/tree.py` | Add `tree_type` and `intake_form` mapped columns |
|
|
| `backend/app/schemas/tree.py` | Add `IntakeFormField` schema, field type enum, validation schema. Add `tree_type` + `intake_form` to `TreeCreate`, `TreeUpdate`, `TreeResponse`, `TreeListResponse`. Add `session_variables` to `SessionCreate`. |
|
|
| `backend/app/core/tree_validation.py` | Add `validate_procedural_structure()` — enforces all publish rules (linear chain, single end, no branching, no cycles, no orphans). Update `can_publish_tree()` to dispatch by `tree_type`. |
|
|
| `backend/app/api/endpoints/sessions.py` | `start_session`: accept `session_variables`, validate required intake fields for procedural trees, store in session. Include `tree_type` in `tree_snapshot`. |
|
|
| `backend/app/api/endpoints/trees.py` | Add optional `tree_type` query filter to tree listing. Ensure fork copies `tree_type` + `intake_form`. |
|
|
|
|
### Tests
|
|
|
|
- Existing trees default to `tree_type='troubleshooting'` and `intake_form=NULL`
|
|
- Create/update/list/filter by `tree_type`
|
|
- Procedural publish rejected when: branching exists, cycles exist, missing end node, multiple end nodes, orphan nodes
|
|
- Procedural publish accepted for valid linear chain
|
|
- Session start with `session_variables` populated from intake
|
|
- Required intake fields missing → session start blocked
|
|
- Optional fields missing → session starts, variables unresolved
|
|
- Fork preserves `tree_type` and `intake_form`
|
|
- All existing troubleshooting tests still pass
|
|
|
|
### Deliverable
|
|
A procedural tree can be created, validated, published, and started via API with intake form variables stored in the session.
|
|
|
|
---
|
|
|
|
## Phase 2: Procedural Editor (Frontend)
|
|
|
|
### Files to Create
|
|
|
|
| File | Purpose |
|
|
|---|---|
|
|
| `frontend/src/store/proceduralEditorStore.ts` | New Zustand store (immer + zundo for undo/redo). Flat step array operations: add, remove, update, reorder. Intake form field operations: add, remove, update, reorder. `getTreeForSave()` builds the API payload. Follows patterns from `treeEditorStore.ts`. |
|
|
| `frontend/src/pages/ProceduralEditorPage.tsx` | Route: `/flows/new?type=procedural` and `/flows/:id/edit` (when tree_type=procedural). Three sections: metadata (name, description, category, tags), intake form builder, step list editor. |
|
|
| `frontend/src/components/procedural-editor/IntakeFormBuilder.tsx` | Add/remove/reorder form field definitions. Drag-to-reorder via existing DnD library. Live preview panel showing how the form will appear to techs. |
|
|
| `frontend/src/components/procedural-editor/IntakeFieldEditor.tsx` | Single field configuration: label, variable_name, field_type, required toggle, options list (for select/multi_select), placeholder, help_text, default_value, group_name, validation rules. |
|
|
| `frontend/src/components/procedural-editor/StepList.tsx` | Ordered step list with drag handles. Inline title editing. Section header support — steps grouped under optional section dividers. Step type badges (action/verification/warning/informational). |
|
|
| `frontend/src/components/procedural-editor/StepEditor.tsx` | Expanded step editing: title, content_type selector, description with markdown support, warning_text, estimated_minutes, verification_prompt + verification_type, commands (PowerShell block), expected_outcome, reference_url, notes_enabled toggle, section_header. Highlights `[VAR:name]` tokens and shows available variables from intake form. |
|
|
|
|
### Files to Modify
|
|
|
|
| File | Changes |
|
|
|---|---|
|
|
| `frontend/src/types/tree.ts` | Add `TreeType = 'troubleshooting' \| 'procedural'`. Add `IntakeFormField`, `IntakeFieldValidation`, `ProceduralStep`, `StepContentType` interfaces. Add `tree_type` + `intake_form` to `Tree`, `TreeListItem`, `TreeCreate`. |
|
|
| `frontend/src/pages/MyTreesPage.tsx` | "New" button offers type choice (troubleshooting vs procedural). Route to appropriate editor. |
|
|
| `frontend/src/pages/TreeLibraryPage.tsx` | Add tab filter by `tree_type`. Different icon for procedural flows (`ListOrdered` or similar). |
|
|
| `frontend/src/router.tsx` | Add routes for `ProceduralEditorPage` and `ProceduralNavigationPage`. |
|
|
|
|
### Deliverable
|
|
Admins/editors can create and edit procedural flow templates with intake forms and rich steps through a dedicated editor UI. Dashboard shows procedures in a filtered view.
|
|
|
|
---
|
|
|
|
## Phase 3: Procedural Navigation & Runtime (Frontend)
|
|
|
|
### Files to Create
|
|
|
|
| File | Purpose |
|
|
|---|---|
|
|
| `frontend/src/pages/ProceduralNavigationPage.tsx` | Route: `/flows/:id/navigate`. Two-panel layout: step checklist (left sidebar, ~280px) + step detail (right). Progress bar: "Step X of Y" with percentage. "Mark Complete & Next" button. Running time tracker (elapsed vs estimated). Collapsible sidebar showing intake form data for reference. |
|
|
| `frontend/src/components/procedural/IntakeFormModal.tsx` | Modal rendered before session start. Renders form from `intake_form` definitions with proper input types, validation, and grouping by `group_name`. Required fields enforced. Validates on submit. |
|
|
| `frontend/src/components/procedural/StepChecklist.tsx` | Left panel: numbered list, completed checkmarks, current step highlighted, section header dividers. Click to jump to any step. |
|
|
| `frontend/src/components/procedural/StepDetail.tsx` | Right panel: step title + number, content_type indicator badge, resolved description (variables injected), warning banner (if warning_text exists), commands block with copy-to-clipboard, expected outcome, verification prompt + input, notes field, reference link, estimated time badge. |
|
|
| `frontend/src/components/procedural/ProgressBar.tsx` | Step count + percentage bar + elapsed time vs total estimated time. |
|
|
| `frontend/src/components/procedural/CompletionSummary.tsx` | Shown when all steps complete. Displays: all form data, step completion timestamps, tech notes per step, verification values, total time elapsed. This is the audit trail view. |
|
|
|
|
### Session Lifecycle
|
|
|
|
1. User clicks "Start" on a procedural flow
|
|
2. If `intake_form` exists → show `IntakeFormModal`, collect and validate values
|
|
3. Call `POST /sessions` with `session_variables` from the form
|
|
4. Navigate to step 1, render two-panel layout
|
|
5. Each step: tech reads instructions (with variables resolved), performs work, optionally adds notes, fills verification if required, clicks "Mark Complete & Next"
|
|
6. Step completion creates a `DecisionRecord` (reuses existing session update API)
|
|
7. Completing last step → `CompletionSummary` view → session marked complete
|
|
|
|
### Variable Resolution Behavior
|
|
|
|
- Resolved variables render as highlighted/bold inline text (visually distinct from surrounding content)
|
|
- Unresolved optional variables render as `[server_name — not provided]` with a muted/highlighted style
|
|
- Variables in commands blocks also resolve, so PowerShell is copy-paste ready
|
|
- Intake form data panel remains visible in a collapsible sidebar for quick reference
|
|
|
|
### Deliverable
|
|
Technicians can fill out a pre-flight form, step through a procedure with injected variables, track completion, add notes, and see a completion summary.
|
|
|
|
---
|
|
|
|
## Phase 4: Export, Polish & Template Seeding
|
|
|
|
### Export Changes
|
|
|
|
| File | Changes |
|
|
|---|---|
|
|
| `backend/app/services/export_service.py` | Detect `tree_type` from `tree_snapshot`. Procedural format: numbered checklist with completion status, step times, tech notes. Include "Project Parameters" section from `session_variables`. All 4 formats (markdown, text, html, psa). |
|
|
|
|
### Session Detail Changes
|
|
|
|
| File | Changes |
|
|
|---|---|
|
|
| `frontend/src/pages/SessionDetailPage.tsx` | Detect procedural sessions from `tree_snapshot.tree_type`. Show step checklist layout with completion data instead of decision timeline. |
|
|
|
|
### Dashboard Tab Integration
|
|
|
|
| File | Changes |
|
|
|---|---|
|
|
| `frontend/src/pages/MyTreesPage.tsx` | Add tab bar: **Troubleshooting** | **Procedures**. Each tab filters by `tree_type`. Procedure cards show: title, category, step count, estimated total time. |
|
|
| Navigation sidebar | Add dedicated "Procedures" menu item linking to the Procedures tab. |
|
|
|
|
### Template Seeding
|
|
|
|
Create two seed templates that demonstrate all features:
|
|
|
|
#### Template 1: New Domain Controller Build
|
|
|
|
**Intake Form Fields:**
|
|
|
|
| Variable | Label | Type | Required | Validation |
|
|
|---|---|---|---|---|
|
|
| `server_name` | Server Name | text | Yes | Max 15 chars, no spaces |
|
|
| `static_ip` | Static IP Address | ip_address | Yes | IPv4 format |
|
|
| `subnet_mask` | Subnet Mask | ip_address | Yes | IPv4 format |
|
|
| `default_gateway` | Default Gateway | ip_address | Yes | IPv4 format |
|
|
| `preferred_dns` | Preferred DNS Server | ip_address | Yes | IPv4 format |
|
|
| `alternate_dns` | Alternate DNS Server | ip_address | No | IPv4 format |
|
|
| `domain_name` | Domain Name (FQDN) | text | Yes | Must contain a dot |
|
|
| `netbios_name` | NetBIOS Domain Name | text | Yes | Max 15 chars |
|
|
| `dsrm_password` | DSRM Password | password | Yes | Min 12 chars |
|
|
| `server_roles` | Roles to Install | multi_select | Yes | Options: AD DS, DNS, DHCP, File Services |
|
|
| `site_name` | AD Site Name | text | No | Default: Default-First-Site-Name |
|
|
| `ticket_number` | Ticket / Change # | text | No | For documentation |
|
|
|
|
**Steps (abbreviated — full steps would include descriptions, commands, warnings, and verifications):**
|
|
|
|
| # | Section | Title | Type | Est. Time | Has Verification |
|
|
|---|---|---|---|---|---|
|
|
| 1 | OS Configuration | Rename Server to [VAR:server_name] | action | 5 min | Yes — confirm hostname |
|
|
| 2 | OS Configuration | Configure Static IP [VAR:static_ip] | action | 5 min | Yes — confirm IP set |
|
|
| 3 | OS Configuration | Install Server Roles: [VAR:server_roles] | action | 15 min | Yes — confirm roles |
|
|
| 4 | AD Installation | Promote to Domain Controller | action | 20 min | Yes — confirm reboot |
|
|
| 5 | AD Installation | Verify AD DS Service Running | verification | 5 min | Yes — service status |
|
|
| 6 | DNS Configuration | Configure DNS Forwarders | action | 5 min | No |
|
|
| 7 | DNS Configuration | Create Reverse Lookup Zone | action | 5 min | No |
|
|
| 8 | Verification | Run dcdiag /v | verification | 10 min | Yes — enter pass/fail |
|
|
| 9 | Verification | Run repadmin /replsummary | verification | 5 min | Yes — enter pass/fail |
|
|
| 10 | Cleanup | Document Completion | informational | 5 min | No |
|
|
| — | — | Procedure Complete | procedure_end | — | — |
|
|
|
|
#### Template 2: Microsoft 365 New User Onboarding
|
|
|
|
**Intake Form Fields:**
|
|
|
|
| Variable | Label | Type | Required |
|
|
|---|---|---|---|
|
|
| `first_name` | First Name | text | Yes |
|
|
| `last_name` | Last Name | text | Yes |
|
|
| `display_name` | Display Name | text | Yes |
|
|
| `email_address` | Email Address | email | Yes |
|
|
| `job_title` | Job Title | text | No |
|
|
| `department` | Department | text | No |
|
|
| `manager_email` | Manager Email | email | No |
|
|
| `license_type` | License Type | select | Yes |
|
|
| `security_groups` | Security Groups | multi_select | No |
|
|
| `distribution_lists` | Distribution Lists | multi_select | No |
|
|
| `shared_mailboxes` | Shared Mailboxes | multi_select | No |
|
|
| `temp_password` | Temporary Password | password | Yes |
|
|
|
|
**Steps:** Create user account → Assign [VAR:license_type] license → Add to security groups [VAR:security_groups] → Add to distribution lists → Configure shared mailbox access → Set manager → Verify user can sign in → Document completion → Procedure Complete (end)
|
|
|
|
### Deliverable
|
|
Procedures export cleanly with all data. Dashboard has tabs. Two real-world templates are available out of the box.
|
|
|
|
---
|
|
|
|
## Key Files Manifest
|
|
|
|
| Action | File |
|
|
|---|---|
|
|
| **CREATE** | `backend/alembic/versions/035_add_tree_type_and_intake_form.py` |
|
|
| **CREATE** | `frontend/src/store/proceduralEditorStore.ts` |
|
|
| **CREATE** | `frontend/src/pages/ProceduralEditorPage.tsx` |
|
|
| **CREATE** | `frontend/src/pages/ProceduralNavigationPage.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural-editor/IntakeFormBuilder.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural-editor/IntakeFieldEditor.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural-editor/StepList.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural-editor/StepEditor.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural/IntakeFormModal.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural/StepChecklist.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural/StepDetail.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural/ProgressBar.tsx` |
|
|
| **CREATE** | `frontend/src/components/procedural/CompletionSummary.tsx` |
|
|
| **MODIFY** | `backend/app/models/tree.py` — add `tree_type`, `intake_form` columns |
|
|
| **MODIFY** | `backend/app/schemas/tree.py` — add schemas, update CRUD schemas |
|
|
| **MODIFY** | `backend/app/core/tree_validation.py` — add procedural validation |
|
|
| **MODIFY** | `backend/app/api/endpoints/sessions.py` — accept `session_variables` |
|
|
| **MODIFY** | `backend/app/api/endpoints/trees.py` — add `tree_type` filter, fork support |
|
|
| **MODIFY** | `backend/app/services/export_service.py` — procedural export format |
|
|
| **MODIFY** | `frontend/src/types/tree.ts` — add procedural types |
|
|
| **MODIFY** | `frontend/src/router.tsx` — add procedural routes |
|
|
| **MODIFY** | `frontend/src/pages/MyTreesPage.tsx` — tabs + type selector |
|
|
| **MODIFY** | `frontend/src/pages/TreeLibraryPage.tsx` — type filter |
|
|
| **MODIFY** | `frontend/src/pages/SessionDetailPage.tsx` — procedural session view |
|
|
|
|
---
|
|
|
|
## Reusable Existing Infrastructure
|
|
|
|
These already exist and should be reused directly:
|
|
|
|
- **Variable resolution:** `backend/app/services/variable_service.py` + `frontend/src/lib/variableResolver.ts` — already handles `[VAR:name]` tokens
|
|
- **Session model:** `session_variables` JSONB field already exists (migration 028)
|
|
- **Drag and drop:** existing DnD library used in tree editor
|
|
- **Export pipeline:** redaction + variable resolution already in place, just needs procedural formatting branch
|
|
- **Zustand patterns:** `treeEditorStore.ts` as reference for `proceduralEditorStore` (immer + zundo)
|
|
- **Authentication & RBAC:** existing auth middleware, no changes needed
|
|
- **Organization scoping:** existing org/client filtering applies automatically
|
|
|
|
---
|
|
|
|
## Compatibility Notes
|
|
|
|
- Existing troubleshooting trees remain default (`tree_type='troubleshooting'`) and are completely unchanged
|
|
- Existing sessions, exports, and navigation behavior remain intact
|
|
- No migration of existing tree data required beyond adding the new columns with defaults
|
|
- All existing tests must continue to pass
|
|
|
|
---
|
|
|
|
## Verification Checklist
|
|
|
|
### Backend
|
|
- [ ] `pytest --override-ini="addopts="` — all existing + new tests pass
|
|
- [ ] Migration 035 applies cleanly and rolls back cleanly
|
|
- [ ] Existing trees get `tree_type='troubleshooting'` automatically
|
|
|
|
### Frontend
|
|
- [ ] `npm run build` — clean tsc + vite build
|
|
- [ ] All existing troubleshooting flows work identically
|
|
|
|
### Manual QA
|
|
- [ ] Create procedural flow with intake form in editor
|
|
- [ ] Publish procedural flow (validation passes for valid, rejects invalid)
|
|
- [ ] Start procedure → fill intake form → navigate all steps → complete
|
|
- [ ] Verify variables resolve correctly in step text and commands
|
|
- [ ] Verify unresolved optional variables show placeholder text
|
|
- [ ] Verify step completion tracking (checkboxes, timestamps, notes)
|
|
- [ ] Verify completion summary shows all data
|
|
- [ ] Export completed procedure in all 4 formats
|
|
- [ ] Both seeded templates run end-to-end correctly
|
|
- [ ] Dashboard tabs filter correctly
|
|
- [ ] No regressions in troubleshooting flow functionality
|
|
|
|
---
|
|
|
|
## Future Considerations (Deferred)
|
|
|
|
These are documented for future planning but are explicitly out of scope:
|
|
|
|
- **Conditional steps:** Steps that show/hide based on intake form values
|
|
- **Branching hybrid:** Mini decision-tree within a procedure step
|
|
- **AI-assisted template generation:** Use Claude API to generate templates from descriptions
|
|
- **Approval workflows:** Manager sign-off before procedure can start
|
|
- **Sub-checklists within steps:** A step containing its own checklist
|
|
- **Template marketplace:** Share templates between organizations
|
|
- **Automated execution:** Execute PowerShell commands remotely and capture output
|
|
- **Screenshot verification:** Attach image proof to verification checks
|
|
- **Code-mode editor:** Markdown-based authoring for procedural flows
|