feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
import uuid
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
2026-06-22 13:52:13 +02:00
|
|
|
from pydantic import AliasChoices, BaseModel, ConfigDict, Field
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
|
|
|
|
|
from api.models.technical_debt import TDStatus
|
|
|
|
|
|
|
|
|
|
VALID_SEVERITIES = {"low", "medium", "high", "critical"}
|
|
|
|
|
|
|
|
|
|
|
2026-03-18 00:57:34 +01:00
|
|
|
class TDNoteCreate(BaseModel):
|
|
|
|
|
step: str
|
|
|
|
|
author: str | None = None
|
|
|
|
|
content: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TDNoteRead(BaseModel):
|
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
|
|
|
|
id: uuid.UUID
|
|
|
|
|
td_id: uuid.UUID
|
|
|
|
|
step: str
|
|
|
|
|
author: str | None = None
|
|
|
|
|
content: str
|
|
|
|
|
created_at: datetime
|
|
|
|
|
|
|
|
|
|
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
class TDCreate(BaseModel):
|
|
|
|
|
td_id: str | None = None
|
2026-03-02 23:39:17 +01:00
|
|
|
domain: str # slug; router resolves to domain_id FK
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
title: str
|
|
|
|
|
description: str | None = None
|
|
|
|
|
location: str | None = None
|
|
|
|
|
debt_type: str = "other"
|
|
|
|
|
severity: str = "medium"
|
|
|
|
|
status: TDStatus = TDStatus.open
|
|
|
|
|
topic_id: uuid.UUID | None = None
|
2026-06-22 13:52:13 +02:00
|
|
|
workplan_id: uuid.UUID | None = Field(
|
|
|
|
|
default=None,
|
|
|
|
|
validation_alias=AliasChoices("workplan_id", "workstream_id"),
|
|
|
|
|
)
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class TDUpdate(BaseModel):
|
|
|
|
|
title: str | None = None
|
|
|
|
|
description: str | None = None
|
|
|
|
|
location: str | None = None
|
|
|
|
|
debt_type: str | None = None
|
|
|
|
|
severity: str | None = None
|
|
|
|
|
status: TDStatus | None = None
|
2026-06-22 13:52:13 +02:00
|
|
|
workplan_id: uuid.UUID | None = Field(
|
|
|
|
|
default=None,
|
|
|
|
|
validation_alias=AliasChoices("workplan_id", "workstream_id"),
|
|
|
|
|
)
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class TDRead(BaseModel):
|
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
|
|
|
|
id: uuid.UUID
|
|
|
|
|
td_id: str | None = None
|
2026-03-02 23:39:17 +01:00
|
|
|
domain_slug: str # derived from domain relationship
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
title: str
|
|
|
|
|
description: str | None = None
|
|
|
|
|
location: str | None = None
|
|
|
|
|
debt_type: str
|
|
|
|
|
severity: str
|
|
|
|
|
status: TDStatus
|
|
|
|
|
topic_id: uuid.UUID | None = None
|
2026-06-22 13:52:13 +02:00
|
|
|
workplan_id: uuid.UUID | None = None
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
created_at: datetime
|
2026-06-22 13:52:13 +02:00
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def workstream_id(self) -> uuid.UUID | None:
|
|
|
|
|
return self.workplan_id
|
feat(state-hub): add Extension Points and Technical Debt tracking
New entity types (DB tables, API routers, Pydantic schemas, Alembic
migration a3f1c2d4e5b6):
- extension_points: ep_id, domain, title, ep_type, status, priority,
location, description, topic_id, workstream_id
- technical_debt: td_id, domain, title, debt_type, severity, status,
location, description, topic_id, workstream_id
MCP server: 6 new tools — register_extension_point, list_extension_points,
update_ep_status, register_technical_debt, list_technical_debt,
update_td_status (each write emits a progress_event)
Dashboard: two new pages (extensions.md, techdept.md) with KPI sidebar,
charts, urgent-items section, and filterable card lists. Both added to
nav in observablehq.config.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 07:29:51 +01:00
|
|
|
updated_at: datetime
|
2026-03-18 00:57:34 +01:00
|
|
|
notes: list[TDNoteRead] = []
|