soroush.asadi d83ad87151 M5: action gate + review inbox — edit distance captured for real
SharedKernel:
- ActionRisk (risk lives on the action) + GatePolicy (the pure autonomy x risk matrix:
  Read never holds, Draft/Publish hold unless Autonomous, Destructive ALWAYS holds).
- IActionGate (AgentActionProposal -> execute|hold) and IBoardWriter.AttachArtifactAsync.

Governance:
- ReviewItem (held action: artifact, child titles, trace, decision, edit distance) in a new
  review_items table (AddReviewItems migration).
- ActionGate: hold -> ReviewItem + "action.held" audit; autonomous -> execute + audit.
- HeldActionExecutor: writes the artifact onto the task and creates the child tasks via
  IBoardWriter (implemented by OrgBoard — no cross-module table access).
- Review inbox API: GET /api/governance/reviews (scope-filtered to where the caller may
  approve), POST /reviews/{id}/approve (optional edited content/children -> normalized
  edit distance recorded — the north-star metric), POST /reviews/{id}/sendback. Deciding
  twice is 409; Members are 403.

Assembler:
- OutputParser (numbered-list child titles, conservative) and the executor now hands every
  completed run's proposal to the gate.

OrgBoard: WorkItem.AttachArtifact + BoardWriter.AttachArtifactAsync.

Verified: build green; ArchitectureTests 8/8; IntegrationTests 41/41 incl. the full M5
acceptance — Aria (gated) proposes a spec, it waits in the inbox with its trace, a Member is
403'd, the owner edits-and-approves, the spec + four child stories land on the board, edit
distance > 0 is recorded and audited; Quill (autonomous) executes straight to the board;
destructive holds even for an autonomous seat and can be sent back. Plus the GatePolicy matrix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 07:45:35 +03:30
2026-06-10 00:02:59 +03:30
2026-06-09 06:41:28 +03:30
2026-06-09 06:41:28 +03:30
2026-06-09 06:41:28 +03:30

TeamUp.AI

Build human + AI teams. A live org chart that does work: model the org, fill open role-seats with governed AI agents, run delivery on one board. A product of AliaSaaS.

Status: pre-M1 skeleton — the repo builds, tests green, and runs, but carries no feature code yet. See docs/V1_BUILD_PLAN.md for what M1M6 add.

Stack

.NET 10 modular monolith (web + worker on one image) · PostgreSQL 17 + pgvector · EF Core 10 · React 19 + Vite SPA into wwwroot · Docker Compose for local dev. Full bill of materials in docs/V1_BUILD_PLAN.md.

Layout

src/Shared/TeamUp.SharedKernel     IModule seam, base Entity, IModuleDbContext
src/Shared/TeamUp.Infrastructure   PlatformDbContext (pgvector + schemas), MigrationRunner, wiring
src/Bootstrap/TeamUp.Bootstrap     the explicit module catalog (the only thing that knows all modules)
src/Modules/TeamUp.Modules.*       OrgBoard · Identity · Skills · Assembler · Governance · Memory · Integrations
src/Hosts/TeamUp.Web               ASP.NET Core API host (also serves the SPA)
src/Hosts/TeamUp.Worker            Generic Host worker (background jobs; M4+)
client/                            React/Vite SPA → builds into TeamUp.Web/wwwroot
tests/                             ArchitectureTests (boundary rules) · IntegrationTests (Testcontainers)
docker/                            Dockerfile (one image, two roles) · docker-compose.yml

Boundary rule: each module is its own assembly; everything but its IModule and public contracts is internal, so no module can touch another's persistence. TeamUp.ArchitectureTests backstops this — it fails the build if a module references another module / Infrastructure / a host.

Prerequisites

.NET SDK 10 · Node 22 · Docker. Packages and container images are pulled through a Nexus mirror — see Package & image sources below.

Quick start

# Backend: build, run the boundary + integration tests (integration needs Docker)
dotnet build TeamUp.slnx
dotnet test  TeamUp.slnx

# Local dev — two terminals, with the Vite dev server proxying /api to the .NET host
docker compose -f docker/docker-compose.yml up postgres -d   # Postgres 17 + pgvector
dotnet run --project src/Hosts/TeamUp.Web                     # http://localhost:5180  (applies migrations in Dev)
cd client && npm install && npm run dev                       # http://localhost:5173  (proxies /api, /health)

# Or run the whole thing in containers (web + worker + postgres, single image, RUN_MODE picks the role)
docker compose -f docker/docker-compose.yml up --build

GET /health is the DB health check; GET /api/<module>/ping proves each module seam; the OpenAPI document is at /openapi/v1.json (Development only).

EF Core migrations

dotnet ef migrations add <Name> \
  --project src/Shared/TeamUp.Infrastructure --startup-project src/Shared/TeamUp.Infrastructure \
  --context PlatformDbContext --output-dir Persistence/Migrations

The initial InitialPlatform migration enables the vector extension and creates one schema per module. Module-owned contexts (M1+) get their own migrations and apply after Platform via MigrationRunner.

Package & image sources

NuGet packages (nuget.config) and container base images (docker/Dockerfile, docker/docker-compose.yml) are pulled through the self-hosted Nexus mirror mirror.soroushasadi.com, which proxies nuget.org / Docker Hub / MCR and is reachable from Iran. To build against the public registries instead, point nuget.config at api.nuget.org and replace the mirror.soroushasadi.com/... image prefixes with docker.io/library (node) and mcr.microsoft.com (dotnet). Testcontainers picks up the mirror via TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX=mirror.soroushasadi.com/.

More

S
Description
No description provided
Readme 696 KiB
Languages
C# 67%
TypeScript 29.8%
CSS 2.6%
Dockerfile 0.3%
HTML 0.2%