docs(policy): add Form Builder scope discipline policy

Deferred-work guidance for Form Builder expansions. Prevents
speculative building for hypothetical use cases while preserving
the one justified forward-looking investment (polymorphic subject
picker in S3b). Based on April 2026 coverage analysis of ~60
practical form use cases.
This commit is contained in:
2026-04-24 10:18:44 +02:00
parent 7df37b8823
commit 2b16d4fd8f

View File

@@ -0,0 +1,132 @@
# Form Builder — Scope Discipline Policy
**Status:** Guidance policy. Applies to all Form Builder and adjacent
module work in Crewli until explicitly superseded.
## Context
April 2026: analysis of ~60 practical form use cases against the
current Form Builder architecture confirmed that the polymorphic
owner/subject model, the 17 field types, and the event-listener
integration pattern form a generic foundation that scales. Of the
60 use cases surveyed, ~70% fit the existing architecture with
incremental work (new listener or new field type per use case), and
~19% require separate domain architectures outside the Form Builder.
**This is reassurance, not a work order.** The full coverage of 60
use cases represents 4-5 months of fulltime solo work. Bert's actual
near-term needs — his own volunteer organisation plus the first
handful of potential SaaS customers — are estimated at 5-8 concrete
form types, not 60.
## Policy
### 1. No speculative purpose-specific work
Do not build listeners, field types, purpose enum values, or UI
flows for form purposes that no current user (Bert's own
organisation or a named prospect) has concretely requested.
This explicitly includes:
- Artist advance module — defer until a festival with real tech
riders needs it
- Supplier intake module — defer until a supplier-intensive event
is in the pipeline
- Post-event evaluation module — defer until Bert's own event
actually finishes and needs retrospective tooling
- Compliance flows (W9, insurance claims, GDPR workflows beyond
existing ARCH §13) — these are separate projects, not Form
Builder features
- Real-time operational forms (meal tickets, inventory counts,
live capacity) — these belong to dedicated modules (check-in,
inventory), not Form Builder
Any prompt that asks to extend the Form Builder for one of these
should be questioned back to Bert with: "Do you have a concrete
user who needs this in the next 8 weeks, or is this speculative?"
### 2. One architectural exception: polymorphic subject picker in S3b
The organiser-facing form creation UI in S3b must include a
subject-type picker (dropdown or equivalent) that writes to
`form_schemas.subject_type` when configured, even though only
`person` is functionally wired in S3b.
Options to surface in the picker:
- Vrijwilliger / deelnemer (subject_type='person') — functional
- Artiest (subject_type='artist') — disabled / "binnenkort beschikbaar"
- Leverancier (subject_type='company') — disabled / "binnenkort beschikbaar"
- Anoniem publiek (subject_type=null) — functional for PUBLIC_COMPLAINT / PUBLIC_RSVP / POST_EVENT_EVALUATION
**Why this is the exception:** retrofitting a subject-type picker
later requires touching the create/edit/list views, the schema
configuration form, the binding config UI, and the sibling-endpoint
logic — days of rework. Building the UI shell with disabled options
now is ~2 extra hours in S3b and eliminates that future refactor.
This is the only forward-looking architectural investment permitted
without a concrete user request.
### 3. Economic triggers for future Form Builder expansion
Unlock categories of work only when one of these signals fires:
| Expansion | Trigger |
|---|---|
| FILE_UPLOAD + IMAGE_UPLOAD + SIGNATURE field types | A required form (VOG upload, minor consent, press accreditation) has a concrete submitter waiting |
| Artist advance module | A festival with >3 booked artists needs digital tech riders |
| Supplier intake module | An event has >3 suppliers where paper/email intake has become painful |
| New purpose enum value | A concrete form use case requires it AND that use case has a named user |
| Shift-swap request flow | Volunteers have asked for it twice in production |
Explicitly do NOT unlock expansions because:
- The architecture supports it elegantly
- It would be "nice to have"
- A competitor has it
- It appears on an aspirational feature list
### 4. When reviewing prompts for Form Builder work
If a prompt asks Claude Code to extend the Form Builder in ways
not justified by a concrete user or by the S3b subject-picker
exception above, push back before implementing. Ask Bert:
1. Which concrete user needs this in the next 8 weeks?
2. Is there a simpler path (manual admin action, existing UI,
out-of-scope) that would work for now?
3. If we defer this 6 months, what actually breaks?
Proceed only when answers are concrete (named person / event /
deadline), not hypothetical ("a customer might want this").
### 5. Where this policy does NOT apply
This policy scopes Form Builder and its direct integrations. It
does NOT apply to:
- The S3b organiser UI itself (build it well, it unlocks Category A
use cases immediately)
- Bug fixes and polish on shipped Form Builder features
- Documentation of existing behaviour
- Refactors that reduce technical debt in already-shipped code
- Unrelated modules (check-in, accreditation, briefings,
communication, production) — those have their own prioritisation
### 6. Record of decisions
When this policy causes a feature to be deferred, record it briefly
in `/dev-docs/BACKLOG.md` with the trigger that would unblock it.
This keeps the deferred list visible without pretending it's
actionable today.
## Closing note for Claude Chat
If planning work that would touch Form Builder scope beyond this
policy, flag it at the start of the session: "This touches
scope-deferred Form Builder work; confirming trigger before
proceeding." Then wait for Bert's confirmation. This is a
discipline guardrail, not a veto — but the default answer is "not
yet" until a concrete trigger exists.