Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
8b8a3d0
feat(29-01): scaffold mostlyrightmd-econ package skeleton
Tarabcak Jul 8, 2026
ea20a14
feat(29-01): wire mostlyrightmd-econ into workspace, release, hosted-…
Tarabcak Jul 8, 2026
36d4b81
test(29-02): add failing contract test for schema.econ.observations.v1
Tarabcak Jul 8, 2026
47e5881
feat(29-02): implement schema.econ.observations.v1 (vintage-first-class)
Tarabcak Jul 8, 2026
2a15354
test(29-02): add failing test for IndicatorNotYetReleasedError
Tarabcak Jul 8, 2026
f80135f
feat(29-02): add IndicatorNotYetReleasedError to core + re-export fro…
Tarabcak Jul 8, 2026
51ce05e
test(29-02): add failing test for FEDS-2026-010 first-contract floor
Tarabcak Jul 8, 2026
2e7d840
feat(29-02): encode FEDS-2026-010 first-contract floor + out-of-range…
Tarabcak Jul 8, 2026
761364e
fix(29): drop packages/econ/tests/__init__.py — resolve pytest tests-…
Tarabcak Jul 8, 2026
a96e8cc
test(29-03): add failing tests for econ schema + settlement-routing c…
Tarabcak Jul 8, 2026
7304334
feat(29-03): wire schema.econ.observations.v1 into the schema codegen…
Tarabcak Jul 8, 2026
ab44564
feat(29-03): codegen the Kalshi econ settlement-routing table (agency…
Tarabcak Jul 8, 2026
36a5c25
feat(29-05): add ALFRED first-print vintage fetcher (fredapi algorith…
Tarabcak Jul 8, 2026
1f59c86
feat(29-05): add BLS fetcher — keyless v1 / keyed v2, PPI final-deman…
Tarabcak Jul 8, 2026
ff17fdf
feat(29-06): add BEA GDP fetcher — NIPA T10101 quarterly, advance/sec…
Tarabcak Jul 8, 2026
c8147ae
feat(29-06): add DOL jobless-claims fetcher — FRED/ALFRED ICSA (BLOCK…
Tarabcak Jul 8, 2026
3174b99
feat(29-06): add Federal Reserve FOMC decision fetcher — Fed-not-FRED…
Tarabcak Jul 8, 2026
e86bd74
feat(29-07): standalone econ per-release cache island (keep-all-vinta…
Tarabcak Jul 8, 2026
983f51d
feat(29-04): add Kalshi econ resolver — per-series agency-NAME routing
Tarabcak Jul 8, 2026
185ac13
feat(29-08): econ.history + econ.releases — read-time vintage filter,…
Tarabcak Jul 8, 2026
a6b9777
feat(29-08): econ.research_econ — leakage-free settlement pairs + TE …
Tarabcak Jul 8, 2026
e7b3170
feat(29-08): Polymarket econ derive (in-package httpx) + Kalshi venue…
Tarabcak Jul 8, 2026
dc753f4
feat(29-09): scaffold @mostlyrightmd/econ + codegen econ schema/settl…
Tarabcak Jul 8, 2026
7ec6fae
test(29-09): add failing econ surface parity tests (RED)
Tarabcak Jul 8, 2026
6abcb0c
feat(29-09): port history/releases/researchEcon + kalshiEcon resolver…
Tarabcak Jul 8, 2026
393b253
test(29-10): parity-firewall regression — econ NEVER in the 4 weather…
Tarabcak Jul 8, 2026
523a986
test(29-10): property tests — leakage invariant + vintage partition
Tarabcak Jul 8, 2026
3070267
test(29-10): live real-API econ smoke + docs/econ-vertical.md
Tarabcak Jul 8, 2026
0d597ac
Merge remote-tracking branch 'origin/main' into phase29/econ-vertical
Tarabcak Jul 9, 2026
fe7a59f
chore(29): reconcile econ vertical with main — version lockstep 1.12.1
Tarabcak Jul 9, 2026
211ce77
Merge remote-tracking branch 'origin/main' into phase29/econ-vertical
Tarabcak Jul 9, 2026
c602ecf
chore(29): merge main 1.14.0 (phase 30+31 API unification) — econ loc…
Tarabcak Jul 9, 2026
0b79e64
fix(29): Fed fetcher — source openmarket.htm rate-change record; H.15…
Tarabcak Jul 9, 2026
72ff81b
feat(29-11): conform econ Python surface to source-identity contract
Tarabcak Jul 9, 2026
a0e2614
feat(29-11): mirror econ source-identity surface in the TS SDK
Tarabcak Jul 9, 2026
1acac05
docs(29-11): document econ source-identity surface + CHANGELOG entry
Tarabcak Jul 9, 2026
d2df2a1
test(29-11): rename econ snapshot tests — basename collision with cor…
Tarabcak Jul 10, 2026
4c99b6d
fix(29-12): wire ALFRED first-print into BLS-family read surface + co…
Tarabcak Jul 11, 2026
3cabfea
fix(29-13a): route GDP through ALFRED growth-rate series (A191RL1Q225…
Tarabcak Jul 11, 2026
25fbf13
fix(29-13a2): keyless historical reads land in-window (period-derived…
Tarabcak Jul 11, 2026
8c67735
fix(29-13c): fetch all ALFRED vintages so vintages='all' returns ever…
Tarabcak Jul 11, 2026
9b526d0
fix(29-13b): source= actually routes to the pinned authority (finding…
Tarabcak Jul 11, 2026
89b37cd
feat(29-13d): compute YoY contracts as the true 12-month % change (fi…
Tarabcak Jul 11, 2026
8d19c93
feat(29-13f): port compute_yoy + BEA/DOL-ICSA/Fed agency fetchers to TS
Tarabcak Jul 11, 2026
b720366
feat(29-13e): route econ dispatch through FRED ids + register all 12 …
Tarabcak Jul 11, 2026
ab9db10
test(29-13): injected-transport dispatch parity tests for the econ ve…
Tarabcak Jul 11, 2026
4d56929
docs(29): make the FRED-practically-required nuance explicit + fix st…
Tarabcak Jul 13, 2026
90af855
feat(29): D-LIC-2 — don't cache FRED-derived rows by default (FRED To…
Tarabcak Jul 13, 2026
f70cb9c
fix(29): codex review round 1 — Python fixes (1 CRITICAL security + 5…
Tarabcak Jul 13, 2026
48b688a
fix(29): C2 — sanitize econ transport errors so the API key never leaks
Tarabcak Jul 13, 2026
35e0295
fix(29): C3 — write TE settlement_grade to the canonical snake_case f…
Tarabcak Jul 13, 2026
f84512e
fix(29): C4 — window jobless_claims + fed decisions to the requested …
Tarabcak Jul 13, 2026
771aef4
fix(29): H6 — stamp the requested fed indicator (fed_funds vs fed_dec…
Tarabcak Jul 13, 2026
3de834a
fix(29): H5 (TS half) — normalize keyed GDP period to YYYYQ#
Tarabcak Jul 13, 2026
15ecafe
fix(29): H4 (TS half) — keyless jobless_claims fails fast, pre-network
Tarabcak Jul 13, 2026
9722f91
fix(29): L1 — drop the bare console.warn from researchEcon's TE path
Tarabcak Jul 13, 2026
87a9887
fix(29): codex review round 2 — Python (3 CRITICAL + 3 HIGH incl. 2 s…
Tarabcak Jul 13, 2026
5f03385
fix(29): C4 (TS) — keyless BEA parseBea defaults to settlement_grade=…
Tarabcak Jul 13, 2026
f3f7782
fix(29): H5 (TS) — window-filter the keyless BLS + GDP dispatch branches
Tarabcak Jul 13, 2026
1137aae
fix(29): H6 (TS) — sanitize fetchBls transport errors so BLS_API_KEY …
Tarabcak Jul 13, 2026
42c5f52
fix(29): M10 (TS) — resolver prefix routing requires the dated-ticker…
Tarabcak Jul 13, 2026
8e573ae
fix(29): C1 — keyless vintage consults the real release calendar (no …
Tarabcak Jul 13, 2026
c034345
fix(29): C2 — cap coverage at YESTERDAY so today is never frozen
Tarabcak Jul 13, 2026
ca2268e
fix(29): H1 — sanitize fed.py transport error to SourceUnavailableError
Tarabcak Jul 13, 2026
454660a
docs(29): M2 — correct bea.py parse() docstring to match round-2 C4 code
Tarabcak Jul 13, 2026
a00ef59
fix(29): M1 — KXUSPPIYOY points at its own PPIYOY.pdf, not CPI's
Tarabcak Jul 13, 2026
e2c509a
fix(29): C3 — TS keyless vintage consults the real release calendar (…
Tarabcak Jul 13, 2026
1ab9f2d
fix(29): H2 — fetchFed normalizes a transport error to SourceUnavaila…
Tarabcak Jul 13, 2026
2d68540
docs(29): M-r4-2 — correct fetch_gdp() docstring to match round-2 C4 …
Tarabcak Jul 13, 2026
4be8feb
fix(29): M-r4-1 — deriveReleaseVintage guards out-of-range period (TS…
Tarabcak Jul 13, 2026
d7933bf
test(29): pin the clock in the round-4 TS parity test (codex R5 LOW)
Tarabcak Jul 13, 2026
2f83330
test(29): fix false-green BEA GDP live smoke (A5) — assert the real f…
Tarabcak Jul 13, 2026
ddf9eff
style(29): clear ruff lint so the required fast-suite CI gate passes
Tarabcak Jul 13, 2026
fb0cad7
merge: integrate origin/main (Phase 32 general-first re-layering, v1.…
Tarabcak Jul 13, 2026
03b116a
fix(29): register econ delivery='hosted' seam in the D-28.2 grep-gate…
Tarabcak Jul 13, 2026
190f74d
style(29): ruff-format _history.py (missed in the prior format commit)
Tarabcak Jul 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
42 changes: 35 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
name: Release (PyPI trusted publishing)

# Phase 4 CI-03 (PKG-01): publish the three sibling distributions to PyPI on
# Phase 4 CI-03 (PKG-01): publish the sibling distributions to PyPI on
# every v* tag, using PEP 740 trusted publishing (no API tokens stored in
# secrets). Each package has its own job because trusted publishing is
# registered per-package on PyPI.
#
# Setup checklist (one-time, before the first tagged release):
# 1. Register the project as a "pending publisher" on PyPI for each of
# mostlyrightmd, mostlyrightmd-weather, mostlyrightmd-markets
# mostlyrightmd, mostlyrightmd-weather, mostlyrightmd-markets,
# mostlyrightmd-econ
# against owner=mostlyrightmd, repo=mostlyright-sdk.
# https://docs.pypi.org/trusted-publishers/adding-a-publisher/
# 2. Workflow ref must match: workflow filename `release.yml`,
Expand Down Expand Up @@ -37,16 +38,16 @@ permissions:

jobs:
# codex iter-1 HIGH fix: tag/version-match preflight.
# release.yml fires on every v* tag, but the 3 sibling pyproject.toml files
# release.yml fires on every v* tag, but the 4 sibling pyproject.toml files
# each carry their own version. Tagging v0.1.0 while one of the packages is
# still at 0.1.0a1 would publish stale alpha artifacts OR fail mid-job (a
# PyPI publish step that finds the version already exists fails the build,
# but the OTHER two jobs have already published their wheels — leaving PyPI
# but the OTHER jobs have already published their wheels — leaving PyPI
# in a half-released state). This preflight extracts the version from each
# pyproject and refuses to proceed unless GITHUB_REF_NAME == "v{version}"
# for ALL three.
# for ALL four.
version-guard:
name: Verify tag matches all 3 package versions
name: Verify tag matches all 4 package versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -85,7 +86,8 @@ jobs:
sys.exit(f"ERROR: tag {ref!r} is not a valid PEP 440 version: {exc}")
for pkg in ("packages/core/pyproject.toml",
"packages/weather/pyproject.toml",
"packages/markets/pyproject.toml"):
"packages/markets/pyproject.toml",
"packages/econ/pyproject.toml"):
with open(pkg, "rb") as f:
pyproj = tomllib.load(f)
raw_version = pyproj["project"]["version"]
Expand Down Expand Up @@ -159,3 +161,29 @@ jobs:
run: uv run python scripts/check_wheel_metadata.py
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1

# Phase 29 (29-01): the 4th published distribution. Mirrors the markets job
# verbatim (own trusted-publishing environment url; own `uv build --package`).
# NOTE: `mostlyrightmd-econ` must be registered as a PyPI "pending publisher"
# (owner=mostlyrightmd, repo=mostlyright-sdk, workflow=release.yml,
# environment=pypi) BEFORE the first tagged release, exactly like the other
# three (see the one-time setup checklist at the top of this file).
publish-econ:
name: Publish mostlyrightmd-econ
needs: version-guard
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/project/mostlyrightmd-econ/
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
- name: Set up Python
run: uv python install 3.12
- name: Build mostlyrightmd-econ wheel + sdist
run: uv build --package mostlyrightmd-econ
- name: Verify Requires-Dist pin (CI-04 gate)
run: uv run python scripts/check_wheel_metadata.py
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,30 @@ All notable changes to `mostlyright`. The format follows [Keep a Changelog](http

## [Unreleased]

### Added

- **Econ surface conformance to the 1.13/1.14 source-identity contract
(dual-SDK, plan 29-11).** The `mostlyright.econ` vertical now mirrors the
cross-vertical [`docs/source-identity.md`](docs/source-identity.md) surface it
was unified under: `series()` is the canonical read function (`history()` is a
byte-identical, docstring-`@deprecated` silent alias — no runtime warning this
release, warning next minor, removal at 2.0); `series()`/`research_econ()` gain
`source=` (contract §1 provenance: accepted `{None,"fred","bls","bea","dol",
"fed"}`, an unknown source OR a valid authority that cannot serve the indicator
raises `ValueError` **before any network call** — never a silent fallback) and
`delivery=` (contract §2: `"live"` default | `"hosted"` raises
`SourceUnavailableError` naming `ECON_HOSTED_URL` + `MOSTLYRIGHT_API_KEY`, the
reserved paid-tier seam); and a new `snapshot(indicator, *, as_of=None)` returns
the settlement-target state — the latest `settlement_grade=True` vintage with
`vintage_date <= as_of`, raising `IndicatorNotYetReleasedError` when nothing is
knowable. TS mirrors the whole surface (`series`/`snapshot`, `@deprecated`
`history` re-export, `source`/`delivery` options with the same loud validation).
The engine (fetchers/schema/cache/resolver/first-print logic) is untouched — a
default call is byte-identical to the pre-conformance output. Core's
`dataset()`/`research()` are **not** modified (an `include_econ` covariate seam
is an option-B question deferred to review); the econ↔weather firewall
(`test_firewall.py`) stays green.

## [1.15.0] — 2026-07-10 — General-first re-layering: the label axis, thin markets delegators, panels, and the contributor registry

Minor release, dual-SDK (PyPI 1.15.0 + npm 1.15.0 in lockstep). The SDK is now
Expand Down
Loading
Loading