Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .agent-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ snapshots/relational_snapshot_safe/tasks moved + relational.py split so the
shared write_relational_tables stays in the envelope) merged (#110). `LTV-Pg`
(schema reorg) split: Pg.1 (scaffold `schemes/lifecycle/` — lifecycle rows +
registries + LIFECYCLE_CONSTRAINTS moved there, stub LifecycleScheme registered)
opened as **#111**; Pg.2 (split the lead-scoring schema out of shared `schema/`)
pending. All M2 moves byte-identical. Sibling `leadforge-datasets-private`
merged (#111); Pg.2 (split lead-scoring schema: entity rows/ALL_ROW_TYPES/
ALL_CONSTRAINTS/LEAD_SNAPSHOT_FEATURES/CONVERTED_WITHIN_90_DAYS moved to
`schemes/lead_scoring/`; shared primitives stay in `schema/`) opened as **#112**. All M2 moves byte-identical. Sibling `leadforge-datasets-private`
consumes bundle files, not internals — no lockstep update needed (heads-up
issue #8). Next: `LTV-Pg.2`, then `LTV-Pc` (pLTV feature/task specs, authored in
`schemes/lifecycle/`), then `LTV-M3` (lifecycle population).
Expand Down
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ leadforge/
cli/ main.py, commands/{generate,list_recipes,inspect,validate}.py
core/ rng.py, ids.py, time.py, enums.py, models.py, exceptions.py, ...
narrative/ spec.py, company.py, product.py, personas.py, market.py, funnel.py, dataset_card.py
schema/ entities.py, relationships.py, events.py, features.py, tasks.py, dictionaries.py
schema/ entities.py (EntityRowProtocol, make_empty_dataframe, AccountRow — shared primitives),
features.py (FeatureSpec), relationships.py (FKConstraint, validate_fk),
tasks.py (SplitSpec, TaskManifest), dictionaries.py, tables.py
schemes/ base.py (GenerationScheme protocol + SCHEME_REGISTRY);
lead_scoring/ — the lead-scoring scheme: __init__.py (build_world/
write_bundle) + simulation/, mechanisms/, structure/, render/
Expand Down
4 changes: 2 additions & 2 deletions docs/ltv/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ protocol + registry, with the package physically reorganized into
|-----------|------------|-----|------------|
| `LTV-M0` | Planning + design lock | `LTV-Pa` | #102, #103 (+ scheme reframe) |
| `LTV-M1` | Lifecycle schema foundation | `LTV-Pb`, `LTV-Pc` | #104 (Pb) |
| `LTV-M2` | Generation-scheme architecture + physical reorg | `LTV-Pd`, `LTV-Pe`, `LTV-Pf`, `LTV-Pg` | #107 (Pd), #108 (Pe), #109 (Pf.1), #110 (Pf.2), #111 (Pg.1) |
| `LTV-M2` | Generation-scheme architecture + physical reorg | `LTV-Pd`, `LTV-Pe`, `LTV-Pf`, `LTV-Pg` | #107 (Pd), #108 (Pe), #109 (Pf.1), #110 (Pf.2), #111 (Pg.1), #112 (Pg.2) |
| `LTV-M3` | Customer population + lifecycle world | `LTV-Ph`, `LTV-Pi` | |
| `LTV-M4` | Lifecycle simulation engine | `LTV-Pj`, `LTV-Pk` | |
| `LTV-M5` | Customer snapshots + pLTV targets (both regimes) | `LTV-Pl`, `LTV-Pm` | |
Expand Down Expand Up @@ -142,7 +142,7 @@ Total: ~19 PRs across 9 milestones.
Shared primitives (`EntityRowProtocol`, `_empty_df`, `AccountRow`,
`FKConstraint`) stay in `schema/` and are imported. Byte-identical;
full suite green. (**PR #111**)
- [ ] **`LTV-Pg.2`** — split the **lead-scoring** schema: move the
- [x] **`LTV-Pg.2`** — split the **lead-scoring** schema (**PR #112**): move the
lead-scoring entity rows / `ALL_ROW_TYPES` / `ALL_CONSTRAINTS` /
`LEAD_SNAPSHOT_FEATURES` / task specs into `schemes/lead_scoring/`, leaving
only genuinely shared primitives in `schema/`. (The lifecycle `LTV-Pc`
Expand Down
2 changes: 1 addition & 1 deletion leadforge/exposure/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

The per-feature redaction policy lives separately on
:attr:`leadforge.schema.features.FeatureSpec.redact_in_modes` and is queried
via :func:`leadforge.schema.features.redacted_columns_for`. ``BundleFilter``
via :func:`leadforge.schemes.lead_scoring.features.redacted_columns_for`. ``BundleFilter``
deliberately does *not* duplicate that information so that the writer and
the validator both consult the same source of truth.

Expand Down
2 changes: 1 addition & 1 deletion leadforge/narrative/dataset_card.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from collections import Counter
from typing import TYPE_CHECKING

from leadforge.schema.features import LEAD_SNAPSHOT_FEATURES, FeatureSpec
from leadforge.schemes.lead_scoring.features import LEAD_SNAPSHOT_FEATURES, FeatureSpec

if TYPE_CHECKING:
from leadforge.core.models import WorldSpec
Expand Down
3 changes: 2 additions & 1 deletion leadforge/schema/dictionaries.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@

import pandas as pd

from leadforge.schema.features import LEAD_SNAPSHOT_FEATURES, FeatureSpec
from leadforge.schema.features import FeatureSpec
from leadforge.schemes.lead_scoring.features import LEAD_SNAPSHOT_FEATURES

_COLUMNS = ("name", "dtype", "description", "category", "is_target", "leakage_risk")

Expand Down
Loading
Loading