research: park Phase B fip breadth; race guard and compact evidence
Log the 21:14 orphan as a snapshot-build race, rewrite the context table to authoritative ICs only, and soften the vol-tilt warning. Add extender completion manifest + breadth refuse guard; strip intermediate/orphaned reports; park the thread (no book sim, no deploy).
This commit is contained in:
@@ -10,8 +10,13 @@ Pipeline
|
||||
3. Fetch ~5y daily bars from Alpaca for symbols missing (or short) in the copy.
|
||||
4. Insert new tickers + OHLCV; mark them in side table ``research_rank_only``
|
||||
so the harness can feed signal IC without GTL/candidate replay.
|
||||
5. Write a **completion manifest** (``<output>.manifest.json``) with ticker /
|
||||
OHLCV / rank_only counts and finished-at. Breadth runners refuse to start
|
||||
without a matching complete manifest — same class of guard as calendar
|
||||
truncation (see 2026-07-18 21:14 race: orphaned +0.0575 on a partial pool).
|
||||
|
||||
Resume-friendly: re-running skips symbols that already have ≥ ``--min-bars``.
|
||||
A ``--limit`` smoke run writes ``complete: false`` so breadth mode still refuses.
|
||||
|
||||
Example
|
||||
-------
|
||||
@@ -197,12 +202,21 @@ async def _fetch_symbol_bars(
|
||||
|
||||
|
||||
async def _main() -> None:
|
||||
# ROOT is already on sys.path; keep the helper import path-local.
|
||||
from research_snapshot_manifest import ( # type: ignore[import-not-found]
|
||||
clear_manifest,
|
||||
write_completion_manifest,
|
||||
)
|
||||
|
||||
args = _parse_args()
|
||||
source = Path(args.source)
|
||||
output = Path(args.output)
|
||||
if not source.exists():
|
||||
raise SystemExit(f"Source snapshot not found: {source}")
|
||||
|
||||
# Any rebuild/update invalidates prior completion until we finish cleanly.
|
||||
clear_manifest(output)
|
||||
|
||||
if args.force_copy or not output.exists():
|
||||
output.parent.mkdir(parents=True, exist_ok=True)
|
||||
if output.exists():
|
||||
@@ -375,12 +389,40 @@ async def _main() -> None:
|
||||
text("SELECT COUNT(*) FROM ohlcv_records")
|
||||
).scalar_one()
|
||||
|
||||
# Full planned work only when --limit is unset. Smoke runs stay incomplete
|
||||
# so breadth mode cannot mythologize a 50-symbol toy pool.
|
||||
is_complete = args.limit is None
|
||||
manifest_path = write_completion_manifest(
|
||||
output,
|
||||
complete=is_complete,
|
||||
sources=sources,
|
||||
history_days=int(args.history_days),
|
||||
min_bars=int(args.min_bars),
|
||||
fetch_ok=ok,
|
||||
fetch_fail=fail,
|
||||
limit=args.limit,
|
||||
extra={
|
||||
"prod_symbols_at_start": len(prod_symbols),
|
||||
"pool_size": len(pool),
|
||||
"to_fetch": len(to_fetch),
|
||||
},
|
||||
)
|
||||
|
||||
print("Done.")
|
||||
print(f" output: {output}")
|
||||
print(f" tickers: {ticker_n}")
|
||||
print(f" ohlcv rows: {ohlcv_n}")
|
||||
print(f" research_rank_only: {rank_only_n}")
|
||||
print(f" fetched ok/fail: {ok}/{fail}")
|
||||
print(
|
||||
f" completion manifest: {manifest_path} "
|
||||
f"(complete={is_complete})"
|
||||
)
|
||||
if not is_complete:
|
||||
print(
|
||||
" NOTE: --limit set → complete=false; breadth runners will refuse "
|
||||
"this snapshot until a full extend finishes."
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user