Files
govoplan-projects/docs/PROJECTS_DOMAIN_BOUNDARY.md
T

85 lines
3.9 KiB
Markdown

# Projects Domain Boundary
## Owns
- portfolio and project identity
- versioned goals, intended outcomes, benefits, status, dates, milestones, and
project structure
- portfolio dependencies, capacity assumptions, change impact, and benefit
review
- participant and responsibility references
- links to mandates, services, risks, controls, contracts, grants, resources,
indicators, tasks, tickets, cases, files, Wiki pages, and calendar objects
- project-level external references and synchronization provenance
## Does Not Own
- task execution or ticket queues
- formal administrative case procedure
- file storage or Wiki content
- workflow runtime
- OpenProject transport, credentials, or synchronization jobs
- policy decisions, risk/control lifecycle, resource booking, contract/grant
obligations, or report calculation
## OpenProject Boundary
Projects owns the native representation and decides which project concepts are
meaningful inside GovOPlaN. Connectors owns OpenProject discovery, transport,
mapping diagnostics, synchronization, and migration. A project may remain
external-only, linked, partially synchronized, imported, or native according
to the integration maturity level recorded on its external reference.
## Runtime Contract
The implemented aggregate uses stable identities and immutable revisions for
`portfolio`, `project`, and `milestone` objects. Writes require an expected
revision, an idempotency key, an aware timestamp, and a change reason. The
module records a durable module event in the same transaction and publishes a
platform event after commit.
Current normalized membership grants make restricted-object filtering and
authorization efficient while every historical revision retains the exact
owner and membership snapshot. Tenant-visible objects require the read scope;
restricted objects additionally require creator, owner, membership, or admin
access. Search stores only bounded document data and always rechecks the source
authorization before returning a result.
Parent rules are explicit: portfolios have no parent, projects may belong to a
portfolio, and milestones belong to a project. State changes use a per-kind
transition map. Physical deletion is deliberately absent from the object API;
cancelled/completed lifecycle state and governed module retirement preserve the
audit trail.
## User And Admin Operation
Users work in `/projects`, where they can search and filter the planning
catalogue, inspect outcome/governance summaries, and create or edit core
planning fields. The API record additionally accepts first-class outcomes,
benefits, dependencies, capacity assumptions, change impacts, benefit reviews,
resource links, memberships, and external references. Administrators grant the
Projects role templates and use ordinary module activation/migration controls;
there is no Projects-specific credential or transport configuration.
Use Reporting for measured indicators and Risk Compliance for risks and
controls; Projects retains planning intent and links. Use Tasks or Tickets for
actionable work. A canonical OpenProject reference may use any declared
integration maturity, but Connectors owns discovery, credentials, mapping,
synchronization, and migration.
## Recovery And Limits
Database backup and restore cover identities, immutable revisions, normalized
memberships, and events as one logical state set. Replaying a successful write
with its original idempotency key returns the recorded revision; reusing the
key with another request is rejected. A stale expected revision is rejected
without changing current state.
The first WebUI edits the common object fields. Advanced planning collections
are fully validated and persisted through the API but still need specialized
editors. OpenProject synchronization is future Connectors work. Projects does
not implement a native work-package lifecycle.
Do not create a separate Goals module until another domain proves a reusable,
independent goal lifecycle that Projects cannot own through references.