326 lines
5.9 KiB
Markdown
326 lines
5.9 KiB
Markdown
# Domain model
|
|
|
|
## Installation and workspace
|
|
|
|
### Installation
|
|
|
|
Represents system-wide configuration and bootstrap state.
|
|
|
|
Invariants:
|
|
|
|
- exactly one installation record;
|
|
- owner bootstrap can complete only once;
|
|
- configured schema/product version is traceable;
|
|
- primary locale and timezone are validated.
|
|
|
|
### Workspace
|
|
|
|
The first release exposes one active workspace, but content rows carry `WorkspaceId` to
|
|
make authorization boundaries explicit.
|
|
|
|
Fields:
|
|
|
|
- ID
|
|
- Name
|
|
- Slug
|
|
- CreatedAt
|
|
- Settings version
|
|
- ArchivedAt (future-safe)
|
|
|
|
### Membership
|
|
|
|
Connects an interactive user to a workspace role:
|
|
|
|
- Reader
|
|
- Editor
|
|
- Administrator
|
|
|
|
Invariants:
|
|
|
|
- at least one enabled administrator exists;
|
|
- disabled users cannot act through existing sessions;
|
|
- service accounts are not memberships and receive no implicit role.
|
|
|
|
## Knowledge
|
|
|
|
### Page
|
|
|
|
The current published state and tree location.
|
|
|
|
Core fields:
|
|
|
|
- ID / WorkspaceId
|
|
- ParentPageId
|
|
- SortKey
|
|
- Title
|
|
- Slug
|
|
- Markdown
|
|
- DocumentType
|
|
- DocumentStatus
|
|
- CurrentRevisionNumber
|
|
- ConcurrencyVersion
|
|
- CreatedBy / UpdatedBy
|
|
- CreatedAt / UpdatedAt / PublishedAt
|
|
- TrashedAt / PurgeAfter
|
|
|
|
Invariants:
|
|
|
|
- title is non-empty and bounded;
|
|
- parent is in the same workspace;
|
|
- a page cannot parent itself or create a cycle;
|
|
- current revision number increases monotonically;
|
|
- ordinary changes cannot mutate immutable revisions;
|
|
- trashed pages are excluded from normal navigation/search.
|
|
|
|
### PageRevision
|
|
|
|
Immutable snapshot of semantically relevant page state:
|
|
|
|
- Page identity and revision number
|
|
- Title, slug and Markdown
|
|
- Parent/order snapshot
|
|
- Document type/status
|
|
- typed metadata snapshot
|
|
- author/source/change summary
|
|
- created timestamp
|
|
- content hash
|
|
|
|
Restoring creates a new revision.
|
|
|
|
### Draft
|
|
|
|
User-private mutable work based on a specific page revision:
|
|
|
|
- User / Page or draft key
|
|
- Base revision/concurrency version
|
|
- Markdown and metadata
|
|
- UpdatedAt / ExpiresAt
|
|
|
|
A draft never silently publishes.
|
|
|
|
### PageLink
|
|
|
|
Derived relation from an authored internal link:
|
|
|
|
- SourcePageId
|
|
- target stable PageId when resolved
|
|
- original target text
|
|
- display label
|
|
- occurrence/anchor information
|
|
- resolution state
|
|
|
|
Derived records can be rebuilt from revisions.
|
|
|
|
### PageRelation
|
|
|
|
Explicit semantic relationship:
|
|
|
|
- Source / Target
|
|
- relation type
|
|
- label
|
|
- creator/time
|
|
|
|
### Tag and PageTag
|
|
|
|
Tags are case-insensitively unique per workspace. Display casing is preserved.
|
|
|
|
### Favorite and RecentVisit
|
|
|
|
User-specific convenience records. They never grant content access.
|
|
|
|
## Attachments
|
|
|
|
### AttachmentBlob
|
|
|
|
Physical deduplicated content:
|
|
|
|
- SHA-256 key
|
|
- byte length
|
|
- detected media type
|
|
- storage state
|
|
- created timestamp
|
|
- integrity status
|
|
- preview state
|
|
|
|
Blob paths are derived only from the hash.
|
|
|
|
### AttachmentReference
|
|
|
|
Logical attachment:
|
|
|
|
- ID / WorkspaceId
|
|
- Blob hash
|
|
- Original filename
|
|
- Description / alt text / caption
|
|
- Uploader
|
|
- created/trashed timestamps
|
|
|
|
### AttachmentUsage
|
|
|
|
Connects a reference to a page, project update or other supported owner.
|
|
|
|
Deleting a usage does not remove shared content. Orphan cleanup follows retention.
|
|
|
|
## Projects
|
|
|
|
### Project
|
|
|
|
- ID / WorkspaceId
|
|
- Name / Slug
|
|
- Summary
|
|
- Lifecycle status
|
|
- Priority
|
|
- Start/target/completion dates
|
|
- Repository/live/documentation links
|
|
- Current-state Markdown
|
|
- Owner
|
|
- Created/updated metadata
|
|
- concurrency version
|
|
|
|
### ProjectDocument
|
|
|
|
Connects a project to a page with a role:
|
|
|
|
- Overview
|
|
- Architecture
|
|
- Deployment
|
|
- Testing
|
|
- Troubleshooting
|
|
- Security
|
|
- Release
|
|
- Other
|
|
|
|
### ProjectUpdate
|
|
|
|
Immutable chronological update:
|
|
|
|
- project
|
|
- timestamp and author/source
|
|
- category
|
|
- title
|
|
- summary Markdown
|
|
- verification status
|
|
- optional commit/release/issue/URL
|
|
- linked pages/decisions/milestones
|
|
- correction/supersession link
|
|
|
|
Corrections append; they do not rewrite historical audit.
|
|
|
|
### ProjectMilestone
|
|
|
|
Named project milestone, distinct from repository build milestones:
|
|
|
|
- state
|
|
- target/completion date
|
|
- summary
|
|
- order
|
|
- linked updates/pages
|
|
|
|
### TechnologyTag
|
|
|
|
Normalized project technology classification.
|
|
|
|
## Decisions
|
|
|
|
### DecisionRecord
|
|
|
|
Typed profile linked to one canonical page:
|
|
|
|
- ID / ProjectId / PageId
|
|
- Decision number
|
|
- Status
|
|
- DecisionDate
|
|
- SupersedesDecisionId
|
|
- SupersededByDecisionId
|
|
- Summary
|
|
|
|
The page holds durable Markdown sections. The profile holds queryable lifecycle metadata.
|
|
|
|
Invariants:
|
|
|
|
- accepted numbering is unique per project;
|
|
- supersession cannot cycle;
|
|
- a superseded record identifies its replacement;
|
|
- decision history is not deleted during ordinary project deletion.
|
|
|
|
## Runbooks
|
|
|
|
### RunbookProfile
|
|
|
|
Typed profile linked to a canonical page:
|
|
|
|
- ID / PageId
|
|
- Owner
|
|
- Risk level
|
|
- LastValidatedAt / ValidatedBy
|
|
- validation status
|
|
- expected section anchors
|
|
|
|
The page's Markdown must contain or explicitly mark:
|
|
|
|
- Purpose
|
|
- Scope
|
|
- Prerequisites
|
|
- Steps
|
|
- Validation
|
|
- Rollback
|
|
- Risks
|
|
|
|
The platform displays and validates structure; it never executes steps.
|
|
|
|
## Imports
|
|
|
|
### ImportJob
|
|
|
|
- ID / adapter/version
|
|
- source fingerprint and safe descriptor
|
|
- status
|
|
- preflight plan version
|
|
- started/completed timestamps
|
|
- actor
|
|
- counts and validation outcome
|
|
- rollback status
|
|
|
|
### ImportItem
|
|
|
|
One discovered source item and its target mapping:
|
|
|
|
- stable source identity/hash
|
|
- source kind/path descriptor
|
|
- target entity ID
|
|
- planned action
|
|
- status
|
|
- conflict/diagnostic data
|
|
|
|
All imported entities carry import provenance sufficient for scoped rollback.
|
|
|
|
## Audit and integration
|
|
|
|
### AuditEvent
|
|
|
|
Append-only security and content action record:
|
|
|
|
- actor kind and ID
|
|
- source (web, API, import, system)
|
|
- action
|
|
- target type/ID
|
|
- safe summary
|
|
- correlation ID
|
|
- timestamp
|
|
- network/user-agent metadata under retention policy
|
|
|
|
Page bodies, passwords and token secrets are excluded.
|
|
|
|
### OutboxMessage
|
|
|
|
Transactional integration event:
|
|
|
|
- ID
|
|
- event type/version
|
|
- aggregate identity
|
|
- safe payload
|
|
- occurred/available time
|
|
- processing attempts/status
|
|
|
|
The initial product may use it for cache/index repair and future integrations.
|