Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a1a6f73
Merge pull request #400 from w7-mgfcode/chore/backmerge-v0.2.22
w7-mgfcode Jun 12, 2026
c74695c
Merge pull request #402 from w7-mgfcode/chore/backmerge-ci-action-bumps
w7-mgfcode Jun 12, 2026
fe32e7b
docs(docs): add showcase workspace runbook and domain model entries (…
w7-mgfcode Jun 12, 2026
5f3507a
docs(repo): track showcase workspace e5 prp (#401)
w7-mgfcode Jun 12, 2026
863fc1a
chore(repo): sync uv.lock to v0.2.22 (#401)
w7-mgfcode Jun 12, 2026
8ec1cb7
Merge pull request #403 from w7-mgfcode/docs/showcase-workspace-e5-gate
w7-mgfcode Jun 12, 2026
967588e
feat(api,ui): add showcase workspace delete endpoint and panel action…
w7-mgfcode Jun 12, 2026
bdf85f6
Merge pull request #405 from w7-mgfcode/feat/demo-workspace-delete
w7-mgfcode Jun 12, 2026
fc390bf
docs(repo): track showcase-completion e1-e5 prps (#406)
w7-mgfcode Jun 12, 2026
a68b0d0
Merge pull request #413 from w7-mgfcode/docs/showcase-completion-e1-e…
w7-mgfcode Jun 12, 2026
a5f7253
feat(db): extend showcase_workspace with metadata and provenance colu…
w7-mgfcode Jun 12, 2026
9e12aad
feat(api): add workspace patch lifecycle endpoint and replay provenan…
w7-mgfcode Jun 12, 2026
e26de84
feat(ui): send replayed_from_workspace_id on showcase replay (#407)
w7-mgfcode Jun 12, 2026
493a9a4
docs(docs): document workspace story slots and patch contract (#407)
w7-mgfcode Jun 12, 2026
3611908
Merge pull request #414 from w7-mgfcode/feat/showcase-completion-e1-m…
w7-mgfcode Jun 12, 2026
ab18715
feat(api): add workspace list filters and link-health endpoint (#408)
w7-mgfcode Jun 12, 2026
9f9993a
test(api): cover workspace filters and link-health probes (#408)
w7-mgfcode Jun 12, 2026
f26507f
feat(ui): add workspace lifecycle types and hooks (#408)
w7-mgfcode Jun 12, 2026
7012fd0
feat(ui): add safe replay and workspace lifecycle to showcase (#408)
w7-mgfcode Jun 12, 2026
c957de8
feat(ui): add two-workspace compare page (#408)
w7-mgfcode Jun 12, 2026
0560e0e
docs(api): document workspace lifecycle and health contracts (#408)
w7-mgfcode Jun 12, 2026
0708d7d
Merge pull request #415 from w7-mgfcode/feat/showcase-completion-e2-s…
w7-mgfcode Jun 12, 2026
890675b
feat(data): add allow-listed nested seed overrides to seeder contract…
w7-mgfcode Jun 12, 2026
859b24b
feat(api): thread seed overrides and user scope through demo pipeline…
w7-mgfcode Jun 12, 2026
e0dc2d8
test(api): cover replay-verbatim seed overrides and scope slots (#409)
w7-mgfcode Jun 12, 2026
ee59cbd
feat(ui): add advanced seed config panel and scope selector to showca…
w7-mgfcode Jun 12, 2026
bf0ccbf
docs(docs): document seed override contract and workspace slots (#409)
w7-mgfcode Jun 12, 2026
195b384
Merge pull request #416 from w7-mgfcode/feat/showcase-completion-e3-s…
w7-mgfcode Jun 13, 2026
c5e68e5
feat(api,db): showcase run-config start-frame contract + workspace co…
w7-mgfcode Jun 13, 2026
a750d7d
feat(api): honor run config in demo pipeline + catalog enabled overla…
w7-mgfcode Jun 13, 2026
061b85e
feat(ui): showcase run-config panel, preview, and replay wiring (#410)
w7-mgfcode Jun 13, 2026
3ece453
docs(docs): document showcase run-config contract (#410)
w7-mgfcode Jun 13, 2026
ce12037
Merge pull request #417 from w7-mgfcode/feat/showcase-run-config-phas…
w7-mgfcode Jun 13, 2026
de16625
feat(api): add hitl decision relay and story capture to demo pipeline…
w7-mgfcode Jun 13, 2026
8277e45
feat(ui): add reject button, run story panel and ops approval history…
w7-mgfcode Jun 13, 2026
d41f80b
docs(docs): document approval and rag story capture contracts (#411)
w7-mgfcode Jun 13, 2026
e38e66c
Merge pull request #418 from w7-mgfcode/feat/showcase-completion-e5-a…
w7-mgfcode Jun 13, 2026
0671264
feat(api): add showcase workspace export bundle endpoint (#412)
w7-mgfcode Jun 13, 2026
93282ed
feat(ui): add export button to saved-workspaces panel (#412)
w7-mgfcode Jun 13, 2026
9a4f12d
docs(docs): document workspace export bundle contract (#412)
w7-mgfcode Jun 13, 2026
0381edb
Merge pull request #419 from w7-mgfcode/feat/showcase-completion-e6-e…
w7-mgfcode Jun 13, 2026
4d1b9ae
docs(docs): reconcile domain model showcase export out-of-scope note …
w7-mgfcode Jun 13, 2026
3c49373
docs(repo): track showcase completion e7 release-gate prp (#420)
w7-mgfcode Jun 13, 2026
2332459
Merge pull request #421 from w7-mgfcode/docs/showcase-completion-e7-gate
w7-mgfcode Jun 13, 2026
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
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ FORECAST_ENABLE_LIGHTGBM=false
# FORECAST_ENABLE_XGBOOST defaults to false (opt-in; install ml-xgboost extra)
# FORECAST_ENABLE_RANDOM_FOREST=false # PRP-36 optional model — pure sklearn, no extra needed

# Demo / Showcase settings
# E6 (#412) — root for saved-workspace export bundles (manifest + checksums).
SHOWCASE_EXPORT_ROOT=./artifacts/showcase

# RAG Configuration
# Embedding Provider: "openai" or "ollama"
RAG_EMBEDDING_PROVIDER=openai
Expand Down
1,031 changes: 1,031 additions & 0 deletions PRPs/PRP-showcase-completion-E1-metadata-provenance-backbone.md

Large diffs are not rendered by default.

1,247 changes: 1,247 additions & 0 deletions PRPs/PRP-showcase-completion-E2-safe-replay-lifecycle.md

Large diffs are not rendered by default.

1,080 changes: 1,080 additions & 0 deletions PRPs/PRP-showcase-completion-E3-seed-config-scope.md

Large diffs are not rendered by default.

820 changes: 820 additions & 0 deletions PRPs/PRP-showcase-completion-E4-run-config-phase-controls.md

Large diffs are not rendered by default.

1,185 changes: 1,185 additions & 0 deletions PRPs/PRP-showcase-completion-E5-agent-rag-story-capture.md

Large diffs are not rendered by default.

751 changes: 751 additions & 0 deletions PRPs/PRP-showcase-completion-E7-release-gate.md

Large diffs are not rendered by default.

642 changes: 642 additions & 0 deletions PRPs/PRP-showcase-workspace-E5-release-gate.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""add showcase_workspace run_config column

Revision ID: b7c1d9e3f204
Revises: d45cf40dfe47
Create Date: 2026-06-13 12:00:00.000000

E4 of the showcase-completion initiative (umbrella #406, epic #410). Adds a
single nullable JSONB ``run_config`` column to ``showcase_workspace`` -- a
REPLAY-INPUT column in the same class as ``seed`` / ``scenario`` / ``reset`` /
``skip_seed`` (NOT an E1 story slot; see docs/_base/DOMAIN_MODEL.md D1). It
records the start-frame model set + backtest config a ``preservation="keep"``
run was launched with, so Load/Replay can reproduce it verbatim. NULL when the
run used default config. No index (the read path is by ``workspace_id``; the
column is a display/replay payload). Forward-only.
"""

from collections.abc import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

from alembic import op

# revision identifiers, used by Alembic.
revision: str = "b7c1d9e3f204"
down_revision: str | None = "d45cf40dfe47"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
"""Add the nullable ``run_config`` JSONB column."""
op.add_column(
"showcase_workspace",
sa.Column("run_config", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)


def downgrade() -> None:
"""Drop the ``run_config`` column."""
op.drop_column("showcase_workspace", "run_config")
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
"""add showcase_workspace metadata and provenance columns

Revision ID: d45cf40dfe47
Revises: 324a2fa37fcc
Create Date: 2026-06-12 12:00:00.000000

E1 of the showcase-completion initiative (umbrella #406, epic #407). Extends
``showcase_workspace`` with the metadata + provenance backbone every parallel
epic consumes: lifecycle columns (``archived`` / ``pinned`` / ``notes`` /
``tags`` / ``config_schema_version``), the replay-provenance soft reference
``replayed_from_workspace_id`` (deliberately NO ForeignKey -- not even
self-referential; ancestor rows stay independently deletable), and six
documented JSONB story slots (``seed_overrides`` / ``user_scope`` /
``approval_events`` / ``rag_events`` / ``job_ids`` / ``phase_summaries``)
that stay NULL until their writer epic lands. NOT NULL columns carry server
defaults so the migration applies on tables with existing rows. Forward-only.
"""

from collections.abc import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

from alembic import op

# revision identifiers, used by Alembic.
revision: str = "d45cf40dfe47"
down_revision: str | None = "324a2fa37fcc"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
"""Add the lifecycle, provenance, and story-slot columns plus indexes."""
op.add_column(
"showcase_workspace",
sa.Column(
"archived",
sa.Boolean(),
nullable=False,
server_default=sa.text("false"),
),
)
op.add_column(
"showcase_workspace",
sa.Column(
"pinned",
sa.Boolean(),
nullable=False,
server_default=sa.text("false"),
),
)
op.add_column(
"showcase_workspace",
sa.Column("notes", sa.Text(), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column(
"tags",
postgresql.JSONB(astext_type=sa.Text()),
nullable=False,
server_default=sa.text("'[]'::jsonb"),
),
)
op.add_column(
"showcase_workspace",
sa.Column(
"config_schema_version",
sa.Integer(),
nullable=False,
server_default=sa.text("1"),
),
)
op.add_column(
"showcase_workspace",
sa.Column("replayed_from_workspace_id", sa.String(length=32), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column("seed_overrides", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column("user_scope", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column("approval_events", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column("rag_events", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column("job_ids", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)
op.add_column(
"showcase_workspace",
sa.Column("phase_summaries", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
)
op.create_index(
"ix_showcase_workspace_tags_gin",
"showcase_workspace",
["tags"],
unique=False,
postgresql_using="gin",
)
op.create_index(
"ix_showcase_workspace_replayed_from",
"showcase_workspace",
["replayed_from_workspace_id"],
unique=False,
)


def downgrade() -> None:
"""Drop the two indexes, then the twelve columns (reverse order)."""
op.drop_index("ix_showcase_workspace_replayed_from", table_name="showcase_workspace")
op.drop_index(
"ix_showcase_workspace_tags_gin",
table_name="showcase_workspace",
postgresql_using="gin",
)
op.drop_column("showcase_workspace", "phase_summaries")
op.drop_column("showcase_workspace", "job_ids")
op.drop_column("showcase_workspace", "rag_events")
op.drop_column("showcase_workspace", "approval_events")
op.drop_column("showcase_workspace", "user_scope")
op.drop_column("showcase_workspace", "seed_overrides")
op.drop_column("showcase_workspace", "replayed_from_workspace_id")
op.drop_column("showcase_workspace", "config_schema_version")
op.drop_column("showcase_workspace", "tags")
op.drop_column("showcase_workspace", "notes")
op.drop_column("showcase_workspace", "pinned")
op.drop_column("showcase_workspace", "archived")
4 changes: 4 additions & 0 deletions app/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ class Settings(BaseSettings):
registry_artifact_root: str = "./artifacts/registry"
registry_duplicate_policy: Literal["allow", "deny", "detect"] = "detect"

# Demo / Showcase
# E6 (#412) — root for workspace export bundles (manifest + checksums).
showcase_export_root: str = "./artifacts/showcase"

# Analytics
analytics_max_rows: int = 10000
analytics_max_date_range_days: int = 730
Expand Down
Loading
Loading