luplo.core.models

Data models for all 12 tables. Mirrors DB schema from 0001_init_schema.

Classes

Project

Actor

Attribution label — "who wrote this," not an authenticated principal.

WorkUnit

System

Item

ItemType

Registry entry for an item_type (e.g. 'task', 'qa_check', 'sprint').

Link

Idea

Append-only ideation note attached to a work unit.

Capture

Raw text intake outside the curated items graph.

CapturePromotion

Bridge from a raw capture to a curated item.

GlossaryGroup

GlossaryTerm

GlossaryRejection

HistoryEntry

AuditEntry

SyncJob

ItemCreate

Input for creating an item. id is auto-generated if omitted.

SearchResult

Module Contents

class luplo.core.models.Project
id: str
name: str
description: str | None
created_at: datetime.datetime
class luplo.core.models.Actor

Attribution label — “who wrote this,” not an authenticated principal.

luplo core treats actors like git commit authors: a free-form registry of name/email pairs referenced as FK on items, history, and audit. Authentication (password, OAuth, session) lives outside core.

id: str
name: str
email: str
role: str | None
external_ids: dict[str, str]
joined_at: datetime.datetime
class luplo.core.models.WorkUnit
id: str
project_id: str
title: str
description: str | None
system_ids: list[str]
status: str
created_by: str | None
created_at: datetime.datetime
closed_at: datetime.datetime | None
closed_by: str | None
context: dict[str, Any]
class luplo.core.models.System
id: str
project_id: str
name: str
description: str | None
depends_on_system_ids: list[str]
status: str | None
class luplo.core.models.Item
id: str
project_id: str
item_type: str
title: str
body: str | None
source_url: str | None
parent_item_id: str | None
work_unit_id: str | None
source_ref: str | None
actor_id: str
system_ids: list[str]
tags: list[str]
rationale: str | None
alternatives: Any
confidence: str | None
supersedes_id: str | None
deleted_at: datetime.datetime | None
expires_at: datetime.datetime | None
source_type: str | None
source_page_id: str | None
stable_section_key: str | None
current_section_path: str | None
start_anchor: str | None
content_hash: str | None
source_version: int
last_synced_at: datetime.datetime | None
created_at: datetime.datetime
updated_at: datetime.datetime
context: dict[str, Any]
class luplo.core.models.ItemType

Registry entry for an item_type (e.g. ‘task’, ‘qa_check’, ‘sprint’).

key: str
display_name: str
schema: dict[str, Any]
owner: str
created_at: datetime.datetime
updated_at: datetime.datetime
from_item_id: str
to_item_id: str
strength: int
note: str | None
created_by_actor_id: str | None
created_at: datetime.datetime
class luplo.core.models.Idea

Append-only ideation note attached to a work unit.

Separate from Item because lifecycle and intent differ: Idea is a 탐색 흔적 (exploratory trace), Item is a 확정된 기록 (committed record). Mistakes are recovered via the redact pattern (redacted_at / redacted_by) — never deleted.

id: str
work_unit_id: str
project_id: str
text: str
created_at: datetime.datetime
created_by: str | None
redacted_at: datetime.datetime | None = None
redacted_by: str | None = None
class luplo.core.models.Capture

Raw text intake outside the curated items graph.

id: str
text: str
summary: str | None
review_state: str
sensitivity_hint: str
signals: dict[str, Any]
created_by: str | None
created_at: datetime.datetime
updated_at: datetime.datetime
redacted_at: datetime.datetime | None = None
redacted_by: str | None = None
class luplo.core.models.CapturePromotion

Bridge from a raw capture to a curated item.

capture_id: str
target_item_id: str
promoted_as: str
created_by: str | None
created_at: datetime.datetime
class luplo.core.models.GlossaryGroup
id: str
project_id: str
scope: str
scope_id: str | None
canonical: str
definition: str | None
created_at: datetime.datetime
created_by: str | None
last_reviewed_at: datetime.datetime | None
last_reviewed_by: str | None
class luplo.core.models.GlossaryTerm
id: str
group_id: str | None
surface: str
normalized: str
is_protected: bool
status: str
source_item_id: str | None
context_snippet: str | None
decided_by: str | None
decided_at: datetime.datetime | None
created_at: datetime.datetime
class luplo.core.models.GlossaryRejection
group_id: str
rejected_term: str
rejected_by: str | None
rejected_at: datetime.datetime
reason: str | None
class luplo.core.models.HistoryEntry
id: int
item_id: str
version: int
content_before: str | None
content_after: str | None
content_hash_before: str | None
content_hash_after: str | None
diff_summary: str | None
semantic_impact: str | None
changed_at: datetime.datetime
changed_by: str
source_event_id: str | None
notification_sent: bool
class luplo.core.models.AuditEntry
id: int
timestamp: datetime.datetime
actor_id: str
action: str
target_type: str | None
target_id: str | None
metadata: dict[str, Any] | None
class luplo.core.models.SyncJob
id: int
source_type: str
source_page_id: str
source_event_id: str | None
payload: str | None
scheduled_at: datetime.datetime
status: str
attempts: int
last_error: str | None
created_at: datetime.datetime
updated_at: datetime.datetime
class luplo.core.models.ItemCreate

Input for creating an item. id is auto-generated if omitted.

project_id: str
item_type: str
title: str
actor_id: str
body: str | None = None
source_url: str | None = None
parent_item_id: str | None = None
work_unit_id: str | None = None
source_ref: str | None = None
system_ids: list[str] = []
tags: list[str] = []
rationale: str | None = None
alternatives: Any = None
confidence: str | None = None
supersedes_id: str | None = None
expires_at: datetime.datetime | None = None
context: dict[str, Any]
source_type: str | None = None
source_page_id: str | None = None
stable_section_key: str | None = None
current_section_path: str | None = None
start_anchor: str | None = None
content_hash: str | None = None
class luplo.core.models.SearchResult
item: Item
score: float
snippet: str | None = None