Project Management
Why a config-driven PM layer beats a hard-coded one
Project teams routinely track tasks in spreadsheets, status in email threads, and time in separate approval tools. When you hard-code each screen, you get three disconnected surfaces that share no permission model, no event bus, and no common data layer. AuraBoot's project management solution is a single plugin where portfolios, projects, tasks, time entries, and the approval workflow are all declared in JSON and wired together through the same command pipeline, permission engine, and activity feed that every other AuraBoot module uses.
Data model summary
Thirteen cooperating models cover the full PM surface:
pm_portfolio— Programme-level container; statesplanning → active → on_hold → closed.pm_project— The main work unit; code auto-generated asPRJ-{yyyyMMdd}-{seq}; statesplanning → in_progress → completed → archived. Creator is auto-added as an activepm_project_member.pm_task— Five types: Epic, Story, Task, Bug, Milestone. Self-referencingpm_task_parent_idfor sub-tasks. Rich-text description and file attachments included.pm_task_assignment— RACI assignments (Responsible / Accountable / Consulted / Informed) per task.pm_task_dependency— Four dependency types: finish-to-start, start-to-start, finish-to-finish, start-to-finish.pm_time_entry— Hours logged against a project and task; categories: Development, Design, Testing, Meeting, Management, Other; billable flag; statesdraft → submitted → approved/rejected.pm_label,pm_task_label,pm_task_comment,pm_task_watcher,pm_task_activity— Color-coded labels, threaded comments, notification subscriptions, and a full audit trail of every status change, assignment, and attachment event.pm_project_role— Master-data roles (Project Manager, Project Member, Project Viewer) that drive the permission matrix.
Task state machine
Task states
-----------
[create] ──> todo ──> in_progress ──> done
| | |
v v v (reopen)
cancelled cancelled todo
|
v (reopen)
todo
on complete: pm_task_done_at auto-set
on reopen: confirmation required
Key commands
The full solution defines 42 commands. A representative sample:
| Command | Type | Model | Permission |
|---|---|---|---|
pm:create_project | create | pm_project | pm.project.manage |
pm:activate_project | state_transition | pm_project | pm.project.manage |
pm:create_task | create | pm_task | pm.task.manage |
pm:start_task | state_transition | pm_task | pm.task.manage |
pm:complete_task | state_transition | pm_task | pm.task.manage |
pm:reopen_task | state_transition | pm_task | pm.project.manage |
pm:create_time_entry | create | pm_time_entry | pm.timesheet.manage |
pm:submit_time_entry | state_transition | pm_time_entry | pm.timesheet.manage |
pm:approve_time_entry | state_transition | pm_time_entry | pm.timesheet.approve |
pm:create_project carries two auto-set side effects: the project code is generated (PRJ-20260411-001 style) and a pm_project_member record is inserted for the creator — no extra API calls required.
Process orchestration
Portfolio (active)
└─ Project: planning ──> in_progress
│
┌────────────▼────────────┐
│ Task: todo │ ← pm:create_task
└────────────┬────────────┘
│ pm:start_task
┌────────────▼────────────┐
│ Task: in_progress │
└───────┬────────┬────────┘
│ │ pm:cancel_task
pm:complete_task │
┌───────▼──┐ ┌──▼──────────┐
│ done │ │ cancelled │
└───────┬──┘ └──────┬──────┘
│ │ pm:reopen_task
└─────┬──────┘
│
┌──────▼──────┐
│ Time Entry │ ← pm:create_time_entry
│ (draft) │
└──────┬──────┘
│ pm:submit_time_entry
┌──────▼──────┐
│ submitted │
└──────┬──────┘
┌─────────────┴────────────┐
pm:approve pm:reject
│ │
approved rejected
Permission example
A realistic multi-role deployment:
- Project Manager — Layer 3 ownership: full read/write/manage access to all data in their project (
pm.project.manage,pm.task.manage,pm.member.manage,pm.timesheet.approve). Sees budget and planned-progress fields. - Contributor (Layer 2 ReBAC) — Holds
pm.task.managebut only sees tasks wherepm_task_assignee_id = current_useror they are inpm_task_assignment. Cannot read tasks assigned to colleagues in the same project. - Budget field (Layer 5 field-level) —
pm_pf_budgetonpm_portfoliois hidden for any principal that does not holdpm.portfolio.manage. Contributors and viewers see the portfolio name and status but the budget cell is masked. - Cross-project view (Layer 4 ABAC) — The
pm_my_tasksnamed query scopes results to the caller's own assignments. Viewing another user's task list requires an explicitpm.task.readgrant scoped to that project — absent that grant, the cross-project table returns zero rows regardless of org hierarchy.
All four layers are evaluated in sequence before the page renders. No frontend branching required.
Dashboard and named queries
The pm_dashboard page delivers an executive overview through seven visualization blocks:
| Block | Type | What it shows |
|---|---|---|
| Key Metrics | stat-card | Total Projects, Active, Completed, Total Tasks, Overdue Tasks, Total Hours |
| Monthly Trend | line chart | Created vs. completed tasks by month |
| Project Status | pie chart | Distribution across planning / in_progress / completed / archived |
| Task Status | pie chart | Distribution across todo / in_progress / done / cancelled |
| Resource Utilization | bar chart | Total vs. billable hours per user (last 3 months) |
| Project Health | table | Per-project: task count, progress %, overdue count, health status |
| Overdue Tasks | table | Task, project, priority, due date, days overdue |
Twelve named queries back the dashboard and personal views (pm_my_tasks, pm_my_watching, pm_my_participating, pm_project_health_overview, and more).
Pages shipped
| Page | Kind | Description |
|---|---|---|
pm_dashboard | dashboard | Executive KPIs and health tables |
pm_project_list | list | Status-tab filtered project list |
pm_project_detail | detail | Project info with lifecycle action toolbar |
pm_task_list | list | Tasks with type / status / priority columns |
pm_task_form | form | Multi-section form: basic info, rich-text description, attachments |
pm_portfolio_list | list | Portfolio list with status tabs |
pm_time_entry_list | list | Time entries with search and approval actions |
Extending the solution
Because every definition is in JSON, extension does not require code changes:
- Add a new task type by appending a value to the
pm_task_typedictionary. - Add a time category (
client_meeting) by extendingpm_time_category. - Create a per-project burndown named query and add its block to
pm_dashboard.json. - Link projects to CRM accounts via a reference field — cross-plugin wiring that inherits the same permission model.
Enterprise note — Multi-tenant Portfolio Governance (cross-tenant rollup queries, tenant-scoped Project Manager delegation), License/Entitlement enforcement on
pm.timesheet.approve, AI-assisted task breakdown via the Agent Control Plane, and Observability Pro per-command trace spans are commercial-only capabilities. The open-core runtime described above is the same in every edition.
Next steps
- System overview — how plugins, commands, and the runtime fit together
- Command pipeline — the execution contract used by every command above
- Permissions — the five-layer model used in the role example
- Plugin manifest — how to declare dependencies and ship the solution as a package
- Agent readiness — designing
agentHintand risk fields for safe AI execution