Migrate Genesys CX Cloud TEI study to the pattern; retire Streamlit app

studies/202512_GenesysCX -> studies/202512_TEI_Genesys_CX_Cloud,
rebuilt as pattern Variant 4 (TEI composite reproduction):

- teicalc/ self-contained engine: Forrester's tables as the never-edited
  verbatim anchor (incl. the p.14 typo note and the $0 AI-token line),
  generic model/scenarios/staging carried over from the Amazon Connect
  study, ClientDrivers overlay (agents / weekly interactions / revenue,
  flat composite so no growth re-base) with ai_tokens_annual as a direct
  input for the token line the published study models at $0
- one deliverable notebook (business_case.ipynb): widget-pair sidebar
  drivers incl. the AI-token price, published-vs-overlay KPI columns,
  cash-flow/waterfall/scenario charts, verification gate, backstage JSON
  data appendix
- gate + tests reproduce the published totals within $2: NPV $10.8M /
  ROI 266% (engine $10,783,466 / 265.79%; payback 3.3 months, not
  headlined in the PDF); 29 study tests, headless nbconvert green,
  stage simulation leak-free, exports carry the appendix
- old Athena workflow (00_provision..04_export, config.py, seed_data.py,
  PALLADIUM_GENESYSCX_* keys, ATHENA_EXPECTED reconciliation) deleted;
  git history preserves it

With the last legacy study migrated, the retirement lands too:
- app/ (Streamlit UI) and core/notebook_helpers deleted; nothing else
  imported them
- streamlit stripped from pyproject extras, requirements.txt, Makefile;
  .env.example reduced to the Athena keys; 00_setup.ipynb and
  core/bootstrap.py repointed at the pattern studies
- root README reworked: self-contained studies + slim core/ Athena
  toolkit (tei_client, calculations, export, cli)

All suites green: Genesys 29, Amazon Connect 27, CTM 55, template 7,
root 58.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 16:38:51 -04:00
parent a420af230b
commit e88449d15a
54 changed files with 8462 additions and 6427 deletions

View File

@@ -20,7 +20,6 @@ dependencies = [
[project.optional-dependencies]
notebooks = ["jupyter>=1.0", "ipython>=8.0"]
app = ["streamlit>=1.30"]
dev = ["pytest>=7.4", "ruff>=0.1"]
[project.scripts]
@@ -28,7 +27,7 @@ palladium = "core.cli.main:main"
[tool.setuptools.packages.find]
include = ["core*", "palladium*"]
exclude = ["tests*", "studies*", "app*", "docs*"]
exclude = ["tests*", "studies*", "docs*"]
[tool.pytest.ini_options]
testpaths = ["tests"]
@@ -46,4 +45,3 @@ ignore = ["E501"] # line length handled by formatter
[tool.ruff.lint.per-file-ignores]
"studies/*/notebooks/*.ipynb" = ["E402"]
"tests/*" = ["F401"]
"app/main.py" = ["E402"] # sys.path bootstrap before app imports