348 lines
12 KiB
Markdown
348 lines
12 KiB
Markdown
|
|
---
|
||
|
|
id: RMGR-ARCH-REP-0001
|
||
|
|
type: architecture
|
||
|
|
title: "Repository representation model v0.1"
|
||
|
|
status: draft-reviewable
|
||
|
|
version: "0.1"
|
||
|
|
created: "2026-08-09"
|
||
|
|
updated: "2026-08-09"
|
||
|
|
workplan_task: RMGR-WP-0001-T01
|
||
|
|
related:
|
||
|
|
- INTENT.md
|
||
|
|
- SCOPE.md
|
||
|
|
- docs/repository-representation_v0.1.yaml
|
||
|
|
- prj-state-hub-retirement/architecture/information-model_v0.1.md
|
||
|
|
- the-custodian/canon/standards/repo-classification-standard_v1.0.md
|
||
|
|
- the-custodian/canon/standards/work-record-types_v0.1.md
|
||
|
|
---
|
||
|
|
|
||
|
|
# Repository representation model v0.1
|
||
|
|
|
||
|
|
## Purpose
|
||
|
|
|
||
|
|
Define what Repo Manager **means** by a managed repository: identities,
|
||
|
|
locations, revisions, classification, declared records, relationships, health,
|
||
|
|
lifecycle, and agent roles — and which fields are **authoritative in the
|
||
|
|
repository (or forge)** versus **replaceable projections** in Repo Manager.
|
||
|
|
|
||
|
|
This is the data-model half of RMGR-WP-0001. Observation/command contracts
|
||
|
|
(T02) and extraction from State Hub (T03) build on these field definitions.
|
||
|
|
|
||
|
|
Companion machine-readable catalog:
|
||
|
|
[`repository-representation_v0.1.yaml`](repository-representation_v0.1.yaml).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Principles
|
||
|
|
|
||
|
|
1. **Repository autonomy.** A checkout must remain usable without HelixForge.
|
||
|
|
2. **Single authority per fact.** Projections cite `source_ref` + revision.
|
||
|
|
3. **Rebuildable indexes.** Dropping the Repo Manager DB must not destroy
|
||
|
|
repo-owned work or classification.
|
||
|
|
4. **Contract isolation.** External consumers use versioned DTOs (T02), never
|
||
|
|
raw SQLAlchemy models.
|
||
|
|
5. **Signals are not authority.** Health/drift/DoI are recomputable.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Entity: ManagedRepository
|
||
|
|
|
||
|
|
The HelixForge representation of one Git repository under management.
|
||
|
|
|
||
|
|
### Identity
|
||
|
|
|
||
|
|
| Field | Authority | Projection | Notes |
|
||
|
|
| --- | --- | --- | --- |
|
||
|
|
| `uuid` | **Repo Manager** (minted at first index) | primary key | Stable bookkeeping id; UUIDv7 preferred |
|
||
|
|
| `slug` | **Declared** in registration / forge naming | unique key | Lowercase kebab; matches hub `managed_repos.slug` |
|
||
|
|
| `name` | **Declared** (display) | cache | Human title; may differ from slug |
|
||
|
|
| `forge_repo_id` | **Forge** (Forgejo/Gitea id) | optional cache | External ref `{system, id}` |
|
||
|
|
| `remote_url` | **Git remote** / forge | cache | Canonical clone URL or alias (`forgejo-remote:…`) |
|
||
|
|
| `default_branch` | **Git / forge** | cache | Observed, not invented |
|
||
|
|
|
||
|
|
**Rule:** `slug` is the human primary name; `uuid` is the join key for events
|
||
|
|
and FKs. Renames require an explicit alias record + dual-read window.
|
||
|
|
|
||
|
|
### Lifecycle
|
||
|
|
|
||
|
|
| Status | Meaning |
|
||
|
|
| --- | --- |
|
||
|
|
| `draft` | Registration incomplete; not fully indexed |
|
||
|
|
| `active` | Normal management |
|
||
|
|
| `paused` | Temporarily skip automation (operator) |
|
||
|
|
| `archived` | Read-only provenance; no normal writes |
|
||
|
|
| `retired` | Removed from active fleet; history retained |
|
||
|
|
|
||
|
|
Authority for **intent to archive/retire** is human/operator policy; Repo
|
||
|
|
Manager records the status as a governed state (command + evidence). Forge
|
||
|
|
archive flags are correlated, not blindly copied without a command.
|
||
|
|
|
||
|
|
### Purpose and ownership
|
||
|
|
|
||
|
|
| Field | Authority | Notes |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| `description` | **INTENT.md** one-liner (or GOAL.md for `prj-`) | Projection may store copy for search |
|
||
|
|
| `intent_uri` | path `INTENT.md` or `GOAL.md` | Relative repo path + git SHA when indexed |
|
||
|
|
| `scope_uri` | path `SCOPE.md` | Optional |
|
||
|
|
| `owners` | **Declared** (INTENT/AGENTS/CODEOWNERS) | List of human/agent identities — not secrets |
|
||
|
|
| `domain` (primary) | **`.repo-classification.yaml`** | Market domain vocabulary |
|
||
|
|
| `repo_flavor` | **INTENT frontmatter** or inferred | e.g. `tooling`, `product`, `project` (`prj-`) |
|
||
|
|
|
||
|
|
### Classification
|
||
|
|
|
||
|
|
Authority: **`.repo-classification.yaml`** (Repo Classification Standard).
|
||
|
|
|
||
|
|
| Field | Authority | Projection |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| `category` | file | cache |
|
||
|
|
| `domain` | file | also binds market domain registry |
|
||
|
|
| `secondary_domains` | file | cache |
|
||
|
|
| `capability_tags` | file | cache |
|
||
|
|
| `business_stake` | file | cache |
|
||
|
|
| `business_mechanics` | file | cache |
|
||
|
|
| `classified_at` / `classified_by` | file | cache |
|
||
|
|
| `standard_version` | file | cache |
|
||
|
|
|
||
|
|
Invalid classification → registration/index **signal** (error), not silent
|
||
|
|
coercion beyond documented normalization.
|
||
|
|
|
||
|
|
### Locations and checkouts
|
||
|
|
|
||
|
|
| Field | Authority | Projection | Notes |
|
||
|
|
| --- | --- | --- | --- |
|
||
|
|
| `host_paths` | **Operator registration** | yes | Map `host_id → absolute path` |
|
||
|
|
| `primary_local_path` | operator / convention | cache | Workstation convenience; multi-host uses `host_paths` |
|
||
|
|
| `worktree_paths` | operator / git | optional | Additional worktrees |
|
||
|
|
| `sync_state` | **Observed** (git fetch/status) | yes | dirty/clean, ahead/behind — signal-like |
|
||
|
|
|
||
|
|
**Rule:** Host paths are **not** in Git. They are operator configuration with
|
||
|
|
audit (who registered which path). Lost host map does not lose repo authority.
|
||
|
|
|
||
|
|
### Revisions and fingerprints
|
||
|
|
|
||
|
|
| Field | Authority | Projection |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| `head_sha` | **Git** at observation time | cache |
|
||
|
|
| `git_fingerprint` | derived from remotes/HEAD | cache (State Hub field today) |
|
||
|
|
| `observed_at` | Repo Manager clock | yes |
|
||
|
|
| `last_state_synced_at` | Repo Manager reconciliation | yes |
|
||
|
|
|
||
|
|
Work-record index rows bind to `content_hash` or `git_sha` of the source file
|
||
|
|
revision, not only “latest HEAD”.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Declared records (indexed)
|
||
|
|
|
||
|
|
These are **repository-owned files** Repo Manager discovers and indexes.
|
||
|
|
Authority is always the file (+ Git history). The index row is a projection.
|
||
|
|
|
||
|
|
| Record class | Typical paths | Work-record kind / note |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| Workplan | `workplans/*.md` | `workplan` |
|
||
|
|
| Task (in workplan) | task blocks in WP | `task` |
|
||
|
|
| Intake | intakes / AWQ paths per repo convention | `intake` |
|
||
|
|
| Decision | decisions / DEC docs | `decision` |
|
||
|
|
| Engagement | engagements | `engagement` |
|
||
|
|
| Register entry | risks, TD, EP, ADR, CAP, … | `register-entry` |
|
||
|
|
| Ad-hoc tasks | `workplans/ADHOC-*.md` | `task` |
|
||
|
|
| Classification | `.repo-classification.yaml` | knowledge/entity |
|
||
|
|
| Intent/Goal | `INTENT.md` / `GOAL.md` | knowledge |
|
||
|
|
| Contribution artefacts | `contrib/**` | knowledge / contrib convention |
|
||
|
|
| Capability registry entries | `registry/capabilities/**` | knowledge |
|
||
|
|
| SBOM / lockfiles | lockfiles, sbom outputs | inventory knowledge |
|
||
|
|
| Agent instructions | `AGENTS.md`, `.claude/rules` | knowledge (not work) |
|
||
|
|
|
||
|
|
### Index projection spine (every indexed work record)
|
||
|
|
|
||
|
|
Aligned with fleet work-record spine:
|
||
|
|
|
||
|
|
| Field | Source |
|
||
|
|
| --- | --- |
|
||
|
|
| `id` (canonical name) | frontmatter / block |
|
||
|
|
| `uuid` | minted at first index; **writeback** to file when governed |
|
||
|
|
| `kind` | registry |
|
||
|
|
| `status` | file (reconciled) |
|
||
|
|
| `owner` | file |
|
||
|
|
| `repo_slug` / `repo_uuid` | anchor |
|
||
|
|
| `source_path` | relative path |
|
||
|
|
| `source_revision` | git SHA or content hash |
|
||
|
|
| `lane` | file or default |
|
||
|
|
| `indexed_at` | projection |
|
||
|
|
| `drift` | signal if file ≠ index |
|
||
|
|
|
||
|
|
**Writeback rule:** UUID and hub ids may be written into frontmatter only via
|
||
|
|
**governed command** (T02), never silent agent DB edits without Git evidence.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Relationships
|
||
|
|
|
||
|
|
| Relation | Authority | Notes |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| `member_of` domain | classification primary domain | Secondary domains as tags |
|
||
|
|
| `depends_on` workplan | workplan dependency blocks / frontmatter | First-class edges in index |
|
||
|
|
| `child_of` task→workplan | task block location | |
|
||
|
|
| `promoted_from` | intake/work links | |
|
||
|
|
| `related_repo` | declared in SCOPE/INTENT/docs | Optional graph; not inferred only from imports without policy |
|
||
|
|
| `extracts_from` / `replaces` | migration docs | e.g. state-hub → repo-manager capabilities |
|
||
|
|
|
||
|
|
Cross-repo dependencies that are **coordination truth** live in workplan files;
|
||
|
|
Repo Manager indexes them. Hub-core may project a fleet graph from those facts.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Health, maturity, and attention (signals)
|
||
|
|
|
||
|
|
All **derived** unless an operator pins an override (override is then a governed
|
||
|
|
annotation, not a silent replacement of the formula).
|
||
|
|
|
||
|
|
| Signal | Typical inputs | Materialize? |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| `consistency_ok` | C-rules / file vs index | yes (open findings) |
|
||
|
|
| `classification_valid` | allowed vocab | yes on fail |
|
||
|
|
| `sync_dirty` | git status | optional TTL |
|
||
|
|
| `doi` / attention score | DoI engine inputs | optional cache |
|
||
|
|
| `sbom_stale` | lockfile mtime vs last ingest | optional |
|
||
|
|
| `needs_human` | task flags in files/index | project from work records |
|
||
|
|
| `drift_count` | open findings | yes |
|
||
|
|
|
||
|
|
Signals feed hub-core orientation; they must not become the only store of work
|
||
|
|
status.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Agent representation (coach / lead / director)
|
||
|
|
|
||
|
|
| Role | Meaning | Authority for assignment |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| **coach** | Improves quality, orientation, day-to-day agent hygiene for the repo | Operator / policy file (e.g. AGENTS.md or registry) |
|
||
|
|
| **lead** | Coordinates active workplans and priorities for the repo | same |
|
||
|
|
| **director** | Escalation, cross-repo alignment, human bridge | same |
|
||
|
|
|
||
|
|
Stored as projection:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
agent_assignments:
|
||
|
|
coach: agt-…
|
||
|
|
lead: agt-…
|
||
|
|
director: agt-…
|
||
|
|
```
|
||
|
|
|
||
|
|
**Not** authority for:
|
||
|
|
|
||
|
|
- merging PRs without forge review policy;
|
||
|
|
- cross-domain inbox routing (hub-core);
|
||
|
|
- inventing workplans without files.
|
||
|
|
|
||
|
|
Assignments may live in a repo file (preferred) or operator registry; if only
|
||
|
|
in DB, they are **weak** and must be exportable.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Commands and evidence (representation hooks)
|
||
|
|
|
||
|
|
Commands themselves are T02. Representation requires:
|
||
|
|
|
||
|
|
| Field | Meaning |
|
||
|
|
| --- | --- |
|
||
|
|
| `accepted_commands` | Catalog of command types this repo allows |
|
||
|
|
| `last_command_id` | Correlation to command log |
|
||
|
|
| `last_command_result` | success/fail + git SHA evidence |
|
||
|
|
|
||
|
|
Evidence of mutation: **Git commit SHA** (and optional PR url) is the primary
|
||
|
|
proof; DB rows are secondary.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Mapping from State Hub `managed_repos` (today)
|
||
|
|
|
||
|
|
| State Hub column | Model field | Target authority |
|
||
|
|
| --- | --- | --- |
|
||
|
|
| `id` | `uuid` | RM mint |
|
||
|
|
| `slug` / `name` | identity | declared + forge |
|
||
|
|
| `domain_id` | domain link | classification domain |
|
||
|
|
| `local_path` / `host_paths` | locations | operator |
|
||
|
|
| `remote_url` | remote | git/forge |
|
||
|
|
| `description` | purpose | INTENT/GOAL |
|
||
|
|
| `status` | lifecycle | governed |
|
||
|
|
| `git_fingerprint` | fingerprint | observed |
|
||
|
|
| `category` + classification cols | classification | `.repo-classification.yaml` |
|
||
|
|
| `last_state_synced_at` | sync timestamp | RM |
|
||
|
|
| `topic_id` | **legacy** | replace with domain + tags (see inventory) |
|
||
|
|
| `sbom_*` | inventory signals | lockfiles + ingest job |
|
||
|
|
|
||
|
|
Workplans/tasks/decisions remain **file-backed**; State Hub tables for those
|
||
|
|
are indexes to migrate here (T03), not new authorities.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Minimal JSON sketch (contract-facing)
|
||
|
|
|
||
|
|
Illustrative only — normative schemas in T02:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"uuid": "…",
|
||
|
|
"slug": "repo-manager",
|
||
|
|
"name": "repo-manager",
|
||
|
|
"lifecycle": "active",
|
||
|
|
"domain": "infotech",
|
||
|
|
"classification": {
|
||
|
|
"category": "tooling",
|
||
|
|
"secondary_domains": ["agents"],
|
||
|
|
"capability_tags": ["platform", "coordination"]
|
||
|
|
},
|
||
|
|
"purpose": {
|
||
|
|
"description": "…",
|
||
|
|
"intent_path": "INTENT.md",
|
||
|
|
"intent_sha": "…"
|
||
|
|
},
|
||
|
|
"locations": {
|
||
|
|
"remote_url": "forgejo-remote:coulomb/repo-manager.git",
|
||
|
|
"host_paths": {"bnt-lap001": "/home/worsch/repo-manager"}
|
||
|
|
},
|
||
|
|
"revision": {
|
||
|
|
"head_sha": "…",
|
||
|
|
"observed_at": "…"
|
||
|
|
},
|
||
|
|
"agents": {
|
||
|
|
"coach": null,
|
||
|
|
"lead": null,
|
||
|
|
"director": null
|
||
|
|
},
|
||
|
|
"signals": {
|
||
|
|
"consistency_ok": true,
|
||
|
|
"open_findings": 0
|
||
|
|
},
|
||
|
|
"index": {
|
||
|
|
"workplan_count": 1,
|
||
|
|
"last_reconciled_at": "…"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Open questions (T02/T04)
|
||
|
|
|
||
|
|
1. **UUID writeback field names** — retire `state_hub_*_id` naming in favor of
|
||
|
|
neutral `repo_manager_*` / `helix_*` during migration.
|
||
|
|
2. **Agent assignment file format** — extend AGENTS.md vs dedicated YAML.
|
||
|
|
3. **Multi-remote repos** — primary remote only vs full remote set.
|
||
|
|
4. **Monorepo packaging** — one ManagedRepository vs nested packages (v0.1:
|
||
|
|
one Git repo = one ManagedRepository).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Acceptance (T01)
|
||
|
|
|
||
|
|
- [x] Identity, locations, revisions, classification specified
|
||
|
|
- [x] Declared records listed with authority = files
|
||
|
|
- [x] Relationships catalogued
|
||
|
|
- [x] Health/signals marked derived
|
||
|
|
- [x] Coach/lead/director roles defined without superseding human ownership
|
||
|
|
- [x] Authority vs projection explicit per field family
|
||
|
|
- [x] Machine-readable companion YAML
|
||
|
|
- [x] State Hub column mapping for extraction (T03)
|