Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
5.8 KiB
5.8 KiB
Scratchpad — Invoice Designer Alignment Constraint Controls
- Plan slug:
invoice-designer-alignment-constraints-ui - Created:
2026-02-10 - Scope status:
draft
What This Is
Working notes for adding UI authoring/management controls for existing pairwise layout constraints in the invoice designer.
Decisions
- (2026-02-10) Scope focuses on exposing existing constraint primitives in UI (
align-left,align-top,match-width,match-height) rather than adding new solver math. - (2026-02-10) MVP will center on core authoring and editing workflows in inspector; full multi-select transform UX is out of scope.
- (2026-02-10) Constraint state remains client-side in designer store and reuses existing
addConstraint/removeConstraintAPIs. - (2026-02-10) Keep production-readiness additions (metrics/telemetry/rollout hardening) out of this plan unless explicitly requested.
- (2026-02-10) Pair constraints are same-parent only for MVP.
- (2026-02-10) Pair-constraint strength is fixed to
strongin MVP. - (2026-02-10) Constraint rows support jump-to-counterpart navigation in MVP.
- (2026-02-10) Dangling constraints are auto-pruned when referenced nodes are deleted/hydrated.
- (2026-02-10) Canonical pair-constraint IDs are now normalized by relation + sorted node IDs (
pair-${type}-${minId}-${maxId}) to block duplicate forward/reverse pairs. - (2026-02-10) Undo/redo history now snapshots both
nodesandconstraintsso pair add/remove is fully reversible. - (2026-02-10) Kept jump-to-counterpart behavior as selection-only for MVP (no auto-pan), matching the PRD open question default.
- (2026-02-10) Solver edit-variable strengths were lowered (
x/ymedium,w/hweak) so authoredstrongconstraints can actually override positional/size suggestions.
Discoveries / Constraints
- (2026-02-10)
DesignerConstraintalready supports:- pair constraints:
align-left,align-top,match-width,match-height - aspect constraint:
aspect-ratioinpackages/billing/src/components/invoice-designer/state/designerStore.ts.
- pair constraints:
- (2026-02-10) Solver implementation already applies pair constraints via Cassowary in
packages/billing/src/components/invoice-designer/utils/constraintSolver.ts. - (2026-02-10) Inspector currently exposes only aspect ratio lock, not pair-constraint authoring.
- (2026-02-10) Single-node selection model (
selectedNodeId) implies pair authoring needs a temporary “reference node” UI state or a wider selection-model change. - (2026-02-10) Presets can inject constraints during insertion (
insertPresetmaps preset constraints), so constraints already participate in runtime layout solving. - (2026-02-10)
DesignerShellnow includes a first-class Constraints inspector section with reference-state actions, pair action buttons, list/jump/remove rows, and integrated aspect toggle. - (2026-02-10)
DesignCanvasnow acceptsactiveReferenceNodeIdandconstrainedCounterpartNodeIdsto render distinct visual cues for reference and counterpart nodes. - (2026-02-10) Store-side constraint sanitization now runs on load/delete/insert/remove paths to auto-prune dangling constraints and dedupe normalized pair constraints.
- (2026-02-10) Conflict/error messaging is surfaced in inspector with recovery guidance and stable automation IDs for QA coverage.
- (2026-02-10) Added focused constraints tests:
DesignerShell.constraints.test.tsx(authoring workflow, keyboard interactions, list/jump/remove, fit-with-constraints, persistence flows)designerStore.constraints.test.ts(normalization, dedupe, validation, undo/redo, export/import, coexistence, pruning)DesignCanvas.constraintHighlights.test.tsx(reference/counterpart visual cues).
- (2026-02-10) Full invoice-designer suite is green after refactor (
23 files / 171 tests).
Commands / Runbooks
- Scaffold plan folder:
python3 /Users/roberisaacs/.codex/skills/alga-plan/scripts/scaffold_plan.py "Invoice Designer Alignment Constraint Controls" --slug invoice-designer-alignment-constraints-ui
- Validate plan files:
python3 /Users/roberisaacs/.codex/skills/alga-plan/scripts/validate_plan.py ee/docs/plans/2026-02-10-invoice-designer-alignment-constraints-ui
- Validate JSON syntax:
jq empty ee/docs/plans/2026-02-10-invoice-designer-alignment-constraints-ui/features.jsonjq empty ee/docs/plans/2026-02-10-invoice-designer-alignment-constraints-ui/tests.json
- Validate invoice-designer test suite after constraints refactor:
npx vitest run packages/billing/src/components/invoice-designer
- Targeted constraints test runs:
npx vitest run packages/billing/src/components/invoice-designer/DesignerShell.constraints.test.tsx packages/billing/src/components/invoice-designer/state/designerStore.constraints.test.ts packages/billing/src/components/invoice-designer/canvas/DesignCanvas.constraintHighlights.test.tsx
- Full regression run:
npx vitest run packages/billing/src/components/invoice-designer
Links / References
ee/docs/plans/2026-02-10-invoice-designer-alignment-constraints-ui/PRD.mdpackages/billing/src/components/invoice-designer/DesignerShell.tsxpackages/billing/src/components/invoice-designer/state/designerStore.tspackages/billing/src/components/invoice-designer/utils/constraintSolver.tspackages/billing/src/components/invoice-designer/utils/constraints.tspackages/billing/src/components/invoice-designer/canvas/DesignCanvas.tsxpackages/billing/src/components/invoice-designer/toolbar/DesignerToolbar.tsxpackages/billing/src/components/invoice-designer/DesignerShell.constraints.test.tsxpackages/billing/src/components/invoice-designer/state/designerStore.constraints.test.tspackages/billing/src/components/invoice-designer/canvas/DesignCanvas.constraintHighlights.test.tsx
Open Questions
- Should jump-to-counterpart also auto-pan canvas in MVP, or only change selection?