85 lines
3.9 KiB
Markdown
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.
|