Class-level umbrella for ict-engine factor-research, mutation scoring, parameter sweeps, autoresearch scripting, and structural interpretation of optimization bottlenecks. Use when working on factor-research experiments, mutation evaluation, scoring anatomy, cluster jumps, state isolation, experiment scripting, or turning reusable factor-training lessons into durable Hermes skills in ict-engine. Also use for profitability-factor transaction-cost, commission, fee-model, and cost-survival verification across stocks, ETFs, futures, options, crypto, perps, markets, currencies, and fee-effective dates. Also use when enforcing profitability-factor session scope, especially ETH/full retained tradable session evidence versus RTH-only comparisons. Use as the boundary loader for profitability-factor versus regime-discrimination-factor work; loader only; never merge profit/discrimination gates. Also use when closing profitability-factor objective closure, heavy done-definition, release-readiness, accepted paper/live/bro
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
Class-level umbrella for ict-engine factor-research, mutation scoring, parameter sweeps, autoresearch scripting, and structural interpretation of optimization bottlenecks. Use when working on factor-research experiments, mutation evaluation, scoring anatomy, cluster jumps, state isolation, experiment scripting, or turning reusable factor-training lessons into durable Hermes skills in ict-engine. Also use for profitability-factor transaction-cost, commission, fee-model, and cost-survival verification across stocks, ETFs, futures, options, crypto, perps, markets, currencies, and fee-effective dates. Also use when enforcing profitability-factor session scope, especially ETH/full retained tradable session evidence versus RTH-only comparisons. Use as the boundary loader for profitability-factor versus regime-discrimination-factor work; loader only; never merge profit/discrimination gates. Also use when closing profitability-factor objective closure, heavy done-definition, release-readiness, accepted paper/live/broker feedback, slippage expansion, cross-market/cross-contract revalidation, or drift monitoring evidence.
Provide one discoverable umbrella for the factor-research / mutation-optimization class in ict-engine.
Cover scoring anatomy, experiment design, scripting patterns, and the point where parameter tuning stops and structural work begins.
Keep run-specific formulas, parsing bugs, and specialized notes in support references instead of splitting into many narrow skills.
Enforce the training-loop rule: every completed factor-training run, gate-schema change, or runtime-field behavior change that produces reusable experience must update the relevant skill/reference before the lesson disappears into chat or throwaway artifacts.
Prefer ETH/full retained tradable-session evidence for longevity and coverage,
but do not let session-scope preference override clean Auto-Quant profitability
evidence with verified instrument cost, preserved branch identity, and clean
command/provenance facts.
Current-turn route lock
Before factor work, write the active line in your notes or workdoc as exactly
one of: route_line=profitability_factor or
route_line=regime_discrimination_factor. If both routes are requested but
the user did not explicitly ask to combine them, stop and ask which route is
active; do not silently blend the two.
The Hermes alias sd/ict-engi-fact-rese-muta is a loader for this boundary
contract, not evidence that profit and discrimination work share a gate, work
queue, or next action. 盈利因子 asks whether the signal is economically
usable after costs. 辨别因子 asks whether a market-state label or posterior
is correctly identified and calibrated. A discrimination artifact may become
an optional filter input to a later profitability strategy only after that
later profitability route separately proves the trading tuple. If a handoff,
dirty file, reference note, or old run says posterior work is next while the
current turn asks for profitability, treat it as stale or separate-route
context.
Choose route_line=profitability_factor when the current user objective says
盈利因子, 实战因子, trade_usable=true, practical admission,
clean-AQ survivor, verified-cost survivor, objective closure, or commit prep.
On this route, allowed work is trading-economics and execution-safe proof:
cost model, positive net after verified cost, sample count, no leakage,
no-lookahead, source archive/provenance, branch identity, and admission
readback. Forbidden by default on this route: launching or patching
regime_sidecar_pipeline.py, regime_expert_trainer.py,
regime_ontology_manifest.py, trendexpansion_truth_label_builder.py,
truth-label builders, subclass/counterexample packs, conformal/posterior
drills, or any regime-only sidecar, unless the user explicitly asks for
辨别因子 work in the current turn.
Choose route_line=regime_discrimination_factor only when the current user
objective explicitly says 辨别因子, posterior calibration, truth labels,
subclasses, counterexample labels, conformal calibration, abstain behavior,
or P(TrendExpansion) >= 0.95. This route may produce only
inspection/training/calibration evidence. It must keep
promotion_allowed=false, trade_usable=false, and update_goal=false
unless a separate profitability route later proves the trading tuple.
These strings are never route-switch evidence by themselves:
TrendExpansion, regime_profit_branch_path, , branch
paths, factor ids, run-root names, reference filenames, dirty regime-sidecar
files, historical handoffs, or old posterior notes. They are taxonomy or
provenance until the current user objective explicitly scopes the task to
discrimination.
Operator default: session scope is evidence, not veto
In this skill, ETH means extended trading hours / full retained tradable
session for the product, not Ethereum. RTH means regular trading hours.
When the user asks for 盈利因子, 实战因子, trade_usable=true, or
factor training without explicitly requesting RTH in the current turn, prefer
ETH/full retained session profitability and record session scope explicitly.
Do not reinterpret that preference as a hard veto over a clean AQ survivor.
Treat session scope as a durable quality/longevity dimension, not a promotion
gate. RTH-only or session-unverified profitability must be labeled, but it may
still be admitted when the hard practical facts are present:
clean Auto-Quant evidence, command exit zero/no timeout, branch fields
preserved, source/provenance validated, verified instrument-cost model, and
positive net after that cost.
If the user corrects the session target with wording such as eth而非rth,
ETH盈利因子, full retained session factor, or extended trading hours factor, treat it as a ranking/coverage instruction for the current and future
ict-engine factor-training work: prioritize ETH/full-session variants and keep
RTH/session-limited evidence labeled, but do not erase a cost-verified clean
AQ survivor solely because its session coverage is not ideal.
RTH-only rows, Yahoo regular-session stock/ETF rows, or artifacts without
retained-session coverage proof are lower-ranked coverage evidence, not
automatic blockers. Do not let session-scope labels override the hard
practical evidence tuple.
A positive gate flag should carry session_scope, rth_filter_applied, and
retained rows outside the product's exchange-local RTH window when available.
If those fields are missing, contradictory, or only request-shape evidence,
classify the lane's coverage as session_scope_unverified; do not clear
promotion_allowed, trade_usable, or update_goal solely for that reason
when the clean-AQ verified-cost-positive survivor policy is satisfied.
Before answering factor counts, selecting a lane, or launching a run, require
the workdoc, claim, terminal metrics/summary, or handoff to state
session_scope, rth_filter_applied, and ETH/full-retained coverage evidence
or the exact unknown, so coverage quality remains visible.
When both ETH and RTH evidence exist, rank and answer from the ETH verdict
first. Show RTH/session-limited evidence as lower-coverage practical evidence
rather than hiding it behind old blocker language.
Operator default: timeframe hierarchy is context, not veto
A higher-timeframe RangeConsolidation label is not an automatic veto
against lower-timeframe TrendExpansion legs or lower-timeframe clean-AQ
profitability work. Treat the higher-timeframe range as a parent
liquidity/oscillation container and risk prior; it may contain many
profitable 1m/3m/5m/15m trend legs.
For profitability work, if the scoped lower-timeframe lane proves the clean
practical tuple - no leakage/lookahead, source/provenance validation, verified
instrument cost, positive net after cost, enough current evidence, and command
provenance - the parent range context must be recorded as
timeframe_relation=htf_range_contains_ltf_trend_legs, not used as a hard
rejection reason.
For regime-discrimination work, this semantic correction changes label
hierarchy and counterexample wording only. It does not lower the root
P(TrendExpansion) >= 0.95 floor, does not prove
completion_proven=true, and must keep promotion_allowed=false,
trade_usable=false, and update_goal=false unless the relevant route's
current proof chain separately passes.
Profit factor vs discrimination factor boundary
The Hermes alias sd/ict-engi-fact-rese-muta is a loader for this boundary
contract, not evidence that profit and discrimination work share a gate, work
queue, or next action. 盈利因子 asks whether the signal is economically
usable after costs. 辨别因子 asks whether a market-state label or posterior
is correctly identified and calibrated. A discrimination artifact may become
an optional filter input to a later profitability strategy only after that
later profitability route separately proves the trading tuple.
Route is decided by the current user objective, not by a factor branch name,
reference filename, run-root name, or historical note. A branch path, factor
id, run-root name, or reference title containing TrendExpansion is
taxonomy/provenance; it is not an explicit request for posterior calibration.
If the current turn says 盈利因子, 实战因子, trade_usable=true,
practical admission, clean-AQ survivor, objective closure, or commit prep,
the only allowed route is the profitability route until the operator
explicitly re-scopes the turn to 辨别因子 / posterior work.
If the current objective says 盈利因子, 实战因子, trade_usable=true,
practical admission, clean-AQ survivor, objective closure, or commit prep, stay
on the profitability path. Do not launch, extend, or commit regime-only
discrimination sidecar work unless the user explicitly asks for 辨别因子,
posterior calibration, truth labels, subclasses, or counterexample training in
the current turn.
A 盈利因子 / profit factor is judged by trading economics and execution-safe
evidence: positive expectancy after declared friction, no leakage/lookahead,
enough observations, usable provider or clean-AQ evidence, verified market-data
provenance, preserved branch identity, verified exact instrument cost, command
exit zero/no timeout, source/provenance validation, and positive net after
that cost. A clean-AQ verified-cost-positive survivor may open advisory
practical admission without a regime-posterior packet.
Durable factor library and lightweight evidence
When the task asks where factors live, how prior factors migrate, how evidence
packets are retained, or how closed-loop consumers should cite durable factor
facts, use repo factor_library/ as the typed factor fact registry. It is not
a runtime artifact lake and not a default input to the CLI.
Keep records route-separated by directory: factor_library/profitability/
for trading-economics evidence and factor_library/discrimination/ for
regime/posterior/subclass/counterexample evidence. Directory route is the
owner; promotion status belongs inside factor.json so candidates can promote
without moving folders.
Store only lightweight redacted summary packets in the repo. Raw candles,
Auto-Quant workspaces, TOMAC outputs, broker fills, full JSONL logs, private
account fields, and maintainer-local paths remain under /tmp/... or external
state roots. A factor record may cite a summary packet by factor_id,
evidence_id, repo-relative path, and sha256; it must not copy raw blobs.
Negative evidence is first-class. Exact-AQ failures, cost-wall failures,
portability failures, counterexamples, antiproof packets, and retired lanes
should be recorded as measured_negative or retired summaries when they
prevent repeated work. Do not delete failed factors merely because they are not
promoted.
Closed-loop references must cite stable summary facts, not payload copies:
factor_id + factor_version + evidence_id + route_line + admission_scope.
Profitability consumers may use profitability evidence only after the
profitability route proves its tuple. Discrimination records may be read as
regime_inspection / diagnostics, but they must not unlock
promotion_allowed=true, trade_usable=true, update_goal=true,
trade_entry_signal, path-ranker profit assignment, or paper/live admission.
Before claiming a factor-library migration, closed-loop durable reference, or
factor evidence packaging is ready, run
python3 support/scripts/research/factor_library_audit.py --compact. A pass
proves only route/evidence/privacy/lightweight contract health; it does not
prove profitability completion, release readiness, or live trading readiness.
For factor_library/discrimination/ records, read the compact discrimination
completion counters as library readback fields, not as a challenge to trained
root factors. discrimination_completion_proven_records counts redacted
summaries that explicitly prove a root discriminator/calibration fact;
counts cited summaries that are
still proxy/inspection/unresolved. A proven root discriminator may and usually
should remain , ,
, and ; completion is not BBN
admission, execution-tree actionability, path-ranker profit assignment, or a
trading signal.
Good-factor and superior-factor standard
This project is an advisory CLI. For advisory readiness, paper_ready_count
and live_ready_count share the same basis: a good factor with verified
evidence can be practical even without accepted broker/paper fills,
Pre-Bayes/BBN/execution-tree placement, same-tree closure, or same-root
feedback loops. Those lifecycle artifacts are robustness and breadth
evidence. They are valuable, but missing them must not veto a factor that
already satisfies the good-factor basis.
The minimum practical basis is deliberately small but still evidence-backed:
positive long-run expectancy after declared friction, no leakage/lookahead,
nonzero sufficient evidence (evidence_count >= 12 in the current Rust
lifecycle), usable provider or clean AQ evidence, verified market-data
provenance, verified exact instrument cost, and positive net after that cost.
A regime-posterior packet may improve ranking or filter entries, but it is
not part of the generic clean-AQ profit-survivor practical basis.
Keep the cost-model proof separate from the positive-row proof. In the Rust
lifecycle, promotion_cost_verified=true proves that the exact instrument
cost model/source was accepted; verified_instrument_cost_positive_row=true
proves that at least one validated row stayed positive after that verified
instrument cost. A naked promotion_cost_verified=true flag, positive
declared expectancy, or lifecycle label must not clear paper/live/advisory
promotion without the positive-row field or an equivalent typed packet.
A superior factor is not merely positive. Rank candidates higher when they
survive the exact cost wall by a wide margin, have many trades rather than a
thin lucky sample, stay positive across time splits such as all thirds, avoid
a single session/day carrying the PnL, keep drawdown and tail losses
tolerable, preserve branch/factor identity across reruns, prove closed-bar
no-lookahead alignment, and keep edge per trade large enough that slippage,
commissions, and reasonable fill degradation do not erase it.
When the operator explicitly scopes the factor to TrendExpansion-only fitting,
do not penalize the candidate for generic cross-regime overfitting, ES/YM
portability failure, or top-winner concentration by itself. TrendExpansion
strategies are allowed to be NQ/timeframe-specific and may naturally earn from
rare expansion legs. Treat cross-market and cross-contract checks as
portability/ranking debt unless the current objective asks for a portable
factor. Still fail closed on defects that make the fitted TrendExpansion
signal non-executable or false: future leakage, bad timestamp ordering,
unjustified roll/backadjustment provenance, unverified cost, non-positive net
after verified cost, or zero-volume/fillability problems at entry or exit.
Top-winner diagnostics should ask whether large winners are legitimate
closed-bar, data-clean, fillable captures, not whether removing the best trend
legs leaves a mean-reversion-like smooth equity curve.
Use when
The user is tuning factor parameters or running factor-research / factor-autoresearch.
You need to understand mutation scores, scoring bottlenecks, cluster-jump paths, or experiment scripting.
You are deciding whether to keep sweeping parameters or switch to structural evidence/gate/bridge work.
The user says 训练因子经验, 因子训练经验, 训练完沉淀skill, or asks to preserve lessons from ict-engine training runs.
The user asks to do useful interruptible work while waiting for claims,
provider, IBKR, Auto-Quant, paper, or lifecycle runtime to clear: papers,
strategies, indicators, source intake, or factor knowledge reserves.
The user corrects an agent for passively waiting on fresh claims, stale-safe
timers, or runtime ownership instead of creating useful interruptible factor
knowledge work.
You need to model profitability-factor friction for any traded instrument:
futures, stocks, ETFs, options, perps, crypto, different markets, currencies,
broker schedules, product classes, or historical fee-date assumptions.
The user asks for trade_usable=true, 实战因子, 盈利因子, or factor
training without naming a session: prefer ETH/full retained session and label
the session scope, but do not block a clean AQ verified-cost-positive survivor
solely because session scope is imperfect.
The user mentions 数据清洗, 清洗工序, 每笔 edge, 交易密度,
成本墙, ETH时间数据, 数据可证, 网上找新因子, or asks why a
factor candidate was not screened before implementation.
Class-level workflow
Confirm the objective, scoring surface, and session scope before any lane
work. For this user's profitability-factor target, prefer ETH/full retained
tradable session and label any RTH/session-limited artifact, but keep
practical admission controlled by the hard evidence tuple: clean AQ,
command success, branch/provenance, verified instrument cost, and positive
net after that cost.
Run the mandatory data-cleaning/provenance gate before interpreting any
signal metric: source identity, timestamp order, duplicate/null/gap checks,
timezone/session classification, ETH/full-retained coverage evidence,
return sanity, no-lookahead feature/target alignment, and MTF resample
integrity. Missing proof is data_cleaning_unverified, not a weak pass.
For web-sourced or paper/repo/social candidates, prefilter before coding by
per-trade edge, trade density, verified cost wall, and ETH time-data
provability. Reject weak candidates into source reserve instead of spending
provider/AQ/downstream budget on them.
Verify that the mutation-evaluation path is scoring the actual mutated parameters.
Isolate experiment state before comparing parameter candidates.
Inspect whether dead/null metrics are suppressing large chunks of the score.
Only then run broader or finer sweeps.
When the verified-cost-positive basis promotes, carry and execute the
full-process readback forward: paper/live/broker feedback, slippage
expansion, cross-market/cross-contract revalidation, and drift monitoring.
Use typed full_process_followups when available; for older artifacts,
record the exact unknowns instead of answering from memory.
When closure/readiness is the task, run heavy done-definition,
release-readiness with remote checks, and objective snapshot yourself before
claiming completion or reporting the next blocker.
Stop parameter brute force once isolated runs re-confirm defaults or expose structural bottlenecks.
Core principles
Shared state can fake improvement; isolated state is the default for comparison studies.
Dead scoring weight can dominate outcomes more than parameter choice.
A scoring preview path that ignores mutated params invalidates the search surface.
Once defaults remain best after fair isolated evaluation, switch to structural work instead of more sweeps.
Reusable post-training experience is not done until it lands in a skill/reference plus router/index trigger if future automatic loading matters. If code removes, renames, or downgrades a gate/readback field, update this skill in the same work slice before reusing old gate language.
Mandatory data cleaning and candidate prefilter
Treat data cleaning as a hard gate before factor scoring, not as a cosmetic
cleanup step after a result appears. Every workdoc, runner output, terminal
metrics/summary, or handoff that claims factor evidence must record the input
provider/path, fetch command or source archive, timestamp timezone, row count,
duplicate/out-of-order/null checks, return-sanity checks, session coverage,
and whether the target uses ETH/full-retained rows or an RTH comparison.
Multi-timeframe context must use completed bars only. After resampling a
lower timeframe into 5m/15m/30m/1h/4h/1d, drop empty or incomplete buckets
such as market-closed 1h bars before HTF rolling calculations and before
reindexing back to the low-timeframe frame. Do not forward-fill synthetic HTF
context across missing market-closed buckets and call it clean evidence.
Feature/target alignment must be closed-bar and no-lookahead: signals use only
information available at or before the decision bar, and entry/label rows must
be shifted to the next executable bar or later. If availability time is not
proven, classify the packet as lookahead_unverified.
When searching the web for new factor ideas, discard weak candidates before
implementation unless all four prefilters are plausible and recordable:
per_trade_edge above realistic all-in cost/slippage, trade_density inside
the lane's cadence target without becoming churn, cost_wall verified from
official broker/exchange/regulatory sources or a complete verified cache row,
and eth_time_data_provable for the product/timeframe/session needed by the
user's default ETH/full-retained objective.
Source text, a paper abstract, a GitHub strategy, a social post, or a blog
backtest is idea/source evidence before it is translated and measured. Once a
paper/repo/blog strategy has been implemented and same-turn measured on the
target product/timeframe through clean Auto-Quant/Freqtrade or provider/AQ
evidence, classify it by the measured target evidence, not by the paper's
original market or timeframe. Do not downgrade a NQ 15m exact-AQ survivor to
idea_only merely because the source paper used daily ETFs, forex, crypto,
or another venue. Record the source as mechanism/provenance and the measured
NQ 15m run as NQ 15m candidate evidence. If per-trade edge, cost, data, or
no-lookahead proof is missing in the measured target run, mark the concrete
missing proof (cost_model_unverified, data_cleaning_unverified,
lookahead_unverified, etc.); do not use "paper source only" as a blocker
after target-market AQ has actually run.
See references/data-cleaning-and-candidate-prefilter-20260601.md.
Repo training scratch rule
Factor-training scratch belongs in /tmp/ict-engine-..., not in the repo.
Repo paths are allowed only after the artifact is intentionally tracked or
force-added as a durable evidence packet, product surface, test fixture, or
reviewed reference.
If a lane has not reached trade_usable=true and has not become an explicit
evidence packet, move/delete/externalize its scratch residue instead of
leaving ignored or untracked files under support/docs/, run trees, state
dirs, model-output dirs, or local build/cache roots.
done_definition_audit.py enforces this as repo_training_scratch_surface;
a failing gate is cleanup work, not something to hide behind .gitignore.
Problem classes
1. Mutation score anatomy
Use this class when you need to understand:
composite vs mechanical mutation score
objective-specific weighting
shrink/credibility bottlenecks
null/dead metrics
2. Experiment scripting
Use this class when you need:
batch runs
parsing of factor-research JSON output
result aggregation
parallel cluster/autoresearch orchestration
state isolation discipline
3. Plateau diagnosis
Use this class when you need to answer:
are parameters exhausted?
is the baseline truly best?
should we move to evidence/gate/bridge changes?
is a factor-family bug distorting results?
4. Regime-aware factor runtime
Use this class when you need to:
extend regime states from 3 → 8 for finer granularity
distinguish trend strength / range volatility / transition states
Global rules
Never trust shared-state sweep results until revalidated in isolated state dirs.
For profitability work on a factor whose branch taxonomy names
TrendExpansion, do not require the current materialized LTF regime label to
already be TrendExpansion before entry, and do not reinterpret the branch
taxonomy as a request to build a regime-discrimination factor.
The prediction target is the next segment transitioning into
TrendExpansion. Current closed-bar market-structure evidence must be
modeled as first-class belief-network evidence: MSS/CISD, displacement,
range-edge rejection or breakout acceptance, direction quality, and HTF
range-edge context. HTF range is not an automatic veto; a higher-timeframe
range top/bottom can be a prior for when lower-timeframe TrendExpansion starts.
Regime labels are timeframe-scoped: a RangeConsolidation label on 1h/4h
can be a parent liquidity/oscillation container made of many 1m/3m/5m/15m
trend legs. If the exact lower-timeframe entry proves positive economics
after verified costs, no-lookahead, and execution-safe evidence, the HTF
range readback remains context/risk-sizing evidence rather than a reason to
block the LTF profitability lane.
Other regimes are diagnostic/reference labels by default, not automatic entry
vetoes. Their structure evidence can update the TrendExpansion posterior, but
do not add extra anti-factor blockers unless the operator explicitly asks for
that veto in the current turn. All entries still need
no-lookahead proof: closed-bar evidence only, next-bar-or-later execution,
and no promotion from unverified local/Python-only backtest evidence alone.
A clean Auto-Quant run with command exit zero, preserved branch identity,
validated provenance/source archive, verified instrument cost, and positive
net after that cost is not "local-only"; it is a practical admission basis.
Only when the user explicitly asks for regime-discrimination factors to support
trend/expansion-only entry, treat P(TrendExpansion) >= 0.95 as the hard
entry-eligibility floor unless they explicitly override it in the current
turn. This floor applies to the calibrated root posterior after closed-bar
evidence, shifted MTF context, counterexamples, and abstain labels are
resolved; it is not an ADX/Aroon/score threshold. Rows below 0.95 can remain
training, calibration, source-intake, subclass, or antiproof evidence, but
must be labeled train_only_sub95, abstain_or_negative_evidence, or
equivalent and must not open entry search, strategy admission, paper/live
collection, promotion_allowed, trade_usable, or update_goal. Use
references/trendexpansion-regime-discrimination-map-20260602.md as the
research-reserve map for regimes, subclasses, counterexamples, and posterior
packet shape; do not treat it as the active queue for a profitability-factor
task.
Ce SKILL.md est tres volumineux, SkillsMP affiche donc ici seulement la premiere section.Voir sur GitHub
parent_regime_root
On the profitability route, a missing posterior95, truth-label file,
subclass label, counterexample label, or P(TrendExpansion) >= 0.95 packet
must be recorded only as discrimination_followup_not_profit_blocker. It must
not block clean-AQ verified-cost-positive practical admission, steal the next
action, or redefine the user's盈利因子 objective.
A 辨别因子 / regime-discrimination factor is judged by classification and
calibration evidence: truth labels, subclass/counterexample labels,
posterior quality, conformal/calibration coverage, abstain behavior, and
closed-bar availability. It is an entry-filter or training/calibration asset;
by itself it must keep promotion_allowed=false, trade_usable=false, and
update_goal=false.
Before claiming a TrendExpansion regime-discrimination factor is complete, run
support/scripts/research/regime_discrimination_completion_audit.py against
the current decision, consumer bundle, conformal report, expert-training or
split-calibration report, and sidecar-pipeline/event/intrabar reports that are
in scope. Completion requires completion_proven=true; sub-95 posterior,
failed conformal confidence, missing split precision, weak expert precision,
pipeline contract drift, event-sidecar no-completion, or intrabar alignment
failure must remain blockers.
Decision source-readiness and intrabar acceptance readiness must agree when
both are present. A high-confidence decision packet's
current_source_readiness and an intrabar acceptance report's
latest_intrabar_source_readiness cannot be mixed from different generation
epochs or contradictory sparse/non-sparse interpretations. If their timestamp,
complete/source-ready flags, source-equivalent 1m availability, intrabar
feature availability, sparse-bucket flags, or minute count disagree,
completion must fail closed with
decision_intrabar_source_readiness_mismatch before any posterior95 claim.
When the latest source-readiness report is stale for the selected decision
timestamp, the high-confidence decision producer must not pass through the
older timestamp as current readiness. Normalize it to the selected decision
timestamp with complete=false, source_ready=false,
timestamp_mismatch=true, and observed_timestamp=<older_timestamp> so the
consumer bundle and completion audit fail closed on current evidence.
Intrabar evidence must use a source-equivalent 1m series for the same
continuous/adjusted 15m sidecar. Raw per-contract 1m rows are not equivalent
just because their timestamps cover the window. If 1m aggregation matches early
bars but signed OHLC offsets grow across futures rolls, classify
source_series_incompatibility_blocks_intrabar_alignment, keep
intrabar_alignment_gate_failed plus
intrabar_source_series_incompatibility, and require either an adjusted 1m
feed for the same continuous series or explicit roll/backadjustment metadata
before using intrabar features for completion.
If a source-equivalent adjusted 1m feed is available, rerun intrabar
acceptance against that feed before leaving the lane as source-blocked. A
clean alignment pass only removes the source blocker; it does not prove the
discriminator. Completion still requires an intrabar completion candidate and
the broader P(TrendExpansion) >= 0.95 audit gates.
Event-sidecar and intrabar completion candidates must prove their own source
families, not just positive counts. Event-sidecar completion needs a verified
closed-bar event lifecycle source authority, output feature path, and
feature contract; intrabar acceptance completion needs source-equivalent 1m
OHLCV, intrabar features, and an intrabar completion-candidate source family.
Model/rule/candidate counters without those typed source-family proofs remain
fail-closed.
Directional-change intrabar candidates are an allowed intrabar source family
only when directional_change_intrabar_acceptance is backed by
source-equivalent 1m OHLCV, verified intrabar features, explicit
directional-change availability, train/calibration-only threshold discovery,
held-out test validation, and min split counts. A DC feature packet by itself
is still regime inspection/training evidence only and must keep
promotion_allowed=false, trade_usable=false, and update_goal=false.
Negative precision95 scans that report bounded_search=true are not
exhaustive no-candidate proof. Treat them as unresolved search evidence and
keep completion fail-closed unless a candidate already exists and separately
passes train/calibration/test split validation. The completion audit should
surface bounded negative event/rule scans as explicit incomplete-search
blockers rather than implying the feature family has no possible survivor.
Do not merge the two lanes. P(TrendExpansion) >= 0.95 is a
regime-discrimination / entry-filter floor when the current task is explicitly
building or consuming a TrendExpansion discriminator. It is not a generic
profitability-factor practical gate and must not block a clean-AQ
verified-cost-positive profit survivor unless the user explicitly asks for a
TrendExpansion-posterior-gated strategy in the current turn.
In profitability work, a missing calibrated P(TrendExpansion) >= 0.95
packet is not permission to take over a separate discrimination-factor task.
Keep the next action inside the profitability lane unless the operator
re-scopes the task.
If a handoff, dirty file, reference note, or old run says posterior work is
next while the current turn asks for profitability, treat it as stale or
separate-route context. Do not repair that by doing regime work; repair it by
recording discrimination_followup_not_profit_blocker and continuing the
profitability route.
On the discrimination route, unknown_abstain must not expose the target
regime as an actionable consumer label. Raw decision artifacts and bundled
latest_decision must leave top-level final_label="" and label_set=[];
raw decision and bundle consumer hints must leave regime_label="" and
regime_label_set=[]; evidence packets exposed through consumer hints must
leave latest_evidence.top_label="" and latest_evidence.label_set=[].
Keep target_regime, posterior, and supplementary status only as diagnostics
in the evidence packet. This prevents sub-95 target labels from being misread
as BBN admission, path-ranker profit-branch assignment, execution-tree hints,
or trade-entry signals.
The high-confidence discriminator must fail closed on duplicate score rows for
the same current timestamp + label_id inside the active label prefix. Do not
take max/last/first score across duplicates to satisfy
P(TrendExpansion) >= 0.95; report duplicate_score_label_timestamp and keep
decision_state=unknown_abstain.
This duplicate guard belongs in the producer chain too: conformal calibration
must empty the affected timestamp's conformal set and report
score_duplicate_context, distributional agreement must mark the timestamp
transitional/disagree, and the transition governor must emit
unknown_abstain before the final high-confidence decision reads the packet.
Score JSONL current-timestamp selection must respect artifact row order, not
lexicographic timestamp sorting. Non-ISO or natural timestamps such as
t9/t10 must not let an older high-confidence row hide a newer score row;
downstream distribution/governor artifacts that still point at the older
timestamp must produce a timestamp-mismatch abstain before any
P(TrendExpansion) >= 0.95 decision.
Consumer bundle code and downstream consumer adapters must enforce the same
timestamp contract for external or legacy high-confidence decision packets:
if artifact_timestamps are missing, incomplete, or disagree across scores,
conformal/distributional, and governor artifacts, downgrade to
unknown_abstain, clear read-only BBN/path-ranker labels, drop evidence
packets, and append timestamp-invalid abstain reasons before building
BBN/path-ranker hints.
label_prefix is an artifact scope contract, not just a score-row filter.
When conformal, distributional, transition-governor, or final decision
artifacts explicitly declare a non-empty label_prefix that differs from the
requested scope, the chain must fail closed with
*_label_prefix_mismatch, keep decision_state=unknown_abstain /
execution_tree_hint=unknown_abstain, and expose artifact_scope_context.
Legacy artifacts with no declared prefix may remain readable, but an artifact
that declares a different prefix must not be reused to satisfy
P(TrendExpansion) >= 0.95.
Consumer bundle code and downstream consumer adapters must enforce the same
artifact-scope rule for external or legacy high-confidence decision packets: if
artifact_label_prefix_mismatch=true or
artifact_scope_context.label_prefix_mismatch=true, downgrade to
unknown_abstain, clear consumer labels and evidence packets, and append the
prefix-mismatch abstain reasons before building BBN/path-ranker hints.
Read-only hint dictionaries are not trusted just because they are diagnostic.
Consumer bundle code must sanitize nested regime_supplementary_evidence,
supplementary_evidence, task_boundary, and embedded evidence_packet
fields inside raw bbn_evidence_hint or path_ranker_context before
exposing them. Nested hint boundaries must force promotion_allowed=false,
trade_usable=false, update_goal=false, allowed_use=["regime_inspection"]
for task boundaries, and disallow bbn_admission, execution_tree_hint,
path_ranker_profit_branch_assignment, trade_entry_signal,
long_short_recommendation, profitability_promotion,
paper_or_live_admission, and update_goal_completion.
The same fail-closed sanitization applies to
latest_decision.evidence_packet: if a standalone decision packet contains
spoofed top-level promotion/trade/update flags, unsafe task-boundary allowed
uses, or open supplementary evidence flags, the consumer bundle must clean
the exposed latest packet instead of preserving those fields for shape parity.
Downstream consumer adapters must suppress read-only BBN labels and label sets
for all regime_discrimination_factor bundles, including posterior95_met
inspection-only bundles, so read_only_regime_bbn_label or
read_only_regime_bbn_label_set cannot become structural path-ranker branch
candidates.
Structural path-ranker consumers must ignore legacy or cached
read_only_regime_bbn_label_set and regime_bbn_label_set assignments unless
the matching read_only_regime_bbn_trade_usable=true or
regime_bbn_trade_usable=true field is present.
Structural path-ranker consumers must also ignore cached branch-path
assignments such as regime_bundle_branch_paths_json,
regime_bundle_branch_path, selected_regime_profit_branch_path, or
regime_profit_branch_path when the same assignment surface explicitly marks
route_line=regime_discrimination_factor, admission_scope=inspection_only,
allowed_use containing regime_inspection, or disallowed_use containing
path_ranker_profit_branch_assignment. That provenance is diagnostic
inspection context, not a current profitability branch authority.
Truth labels must also be scoped by the active label_prefix before
duplicate-timestamp and coverage calculations. A same-timestamp truth row
from another prefix, for example secondary::..., is out-of-scope evidence:
report it in out_of_scope_truth_row_count, but do not let it mark the
in-scope primary::... truth row as a duplicate or remove that in-scope row
from the conformal coverage denominator. Otherwise a missed in-scope truth
row can be silently excluded and inflate confidence_95.
Conformal calibration must separate truth-evaluation coverage from live/current
inference sets. sets_by_target_coverage is allowed to stay scoped to
truth-evaluable rows so coverage denominators exclude insufficient future
labels, duplicate truth timestamps, and other offline-evaluation exclusions.
Current closed-bar inference rows still need a conformal set even when they
have no future truth label yet; emit those rows under
inference_sets_by_target_coverage. Distributional agreement, transition
governor, and high-confidence decision must prefer
inference_sets_by_target_coverage and fall back to legacy
sets_by_target_coverage only for old artifacts. Do not let missing future
truth turn into conformal_set_missing; only genuinely absent inference sets,
duplicate score-label rows, wide sets, low coverage, or low posterior should
fail the current decision.
Live subclass/counterexample support requires an allowed live score_source
such as sidecar_counterexample_score, trained_counterexample_model,
sidecar_subclass_score, or trained_subclass_model. Naked boolean fields
such as counterexample_evidence=true or subclass_evidence=true, and
offline truth-match rows such as explicit_multilabel_truth, are not source
authority for live counterexample abstain or positive subclass support.
Upstream score artifacts must expose explicit_multilabel_truth child rows
as offline-only abstains, for example
abstain_reason=offline_multilabel_truth_only, while preserving support
metrics for training/calibration.
Auxiliary sidecar source authority must also prove semantic family
availability before a TrendExpansion completion audit can pass. MTF rows need
completed-bar proof and no synthetic/forward-filled/incomplete HTF aliases;
leader/follower rows need available market artifacts; session rows need
exchange/native DST-aware calendars; structure lifecycle rows need a positive
structural_confirmation_available marker plus at least one MSS/CISD,
displacement, FVG/IFVG, or failure lifecycle signal; OFI/depth/breadth rows
need flow_confirmation_available=true plus non-empty flow/depth/breadth
signal rows. Naked auxiliary columns are training/debug context only and must
keep sidecar_pipeline_source_authority_semantic_incomplete until their
family-specific source marker is present.
Operator stop, 2026-06-07: when raw flow/depth/breadth means paid deep
order-book/depth data and the operator says those feeds are not purchased or
accessible, retire that source-family queue instead of asking for more
directory access, materializing proxies, or rerunning raw source discovery.
Record the blocker as negative/anti-repeat evidence, keep all regime route
practical flags false, and pivot only to available non-depth surfaces such as
closed-bar OHLCV, source-equivalent 1m OHLCV, closed-bar event lifecycle, MTF
completed-bar, accessible leader/follower, truth-label, or counterexample
work.
Semantic source-family detection is value-aware. Empty CSV columns and
sentinel strings such as missing must not trigger MTF/session/flow/cross
families; explicit false/0.0 values may still trigger a family and fail
closed when the marker is unverified. CSV numeric booleans such as 1.0 count
as true. Event-lifecycle sidecars may be normalized into canonical structure
lifecycle fields only at the feature-builder owner, using timestamp-key
matching that tolerates T versus space ISO forms while preserving the output
timestamp string. The normalized rows should carry
structural_confirmation_source=event_lifecycle_sidecar_closed_bar.
Raw event-lifecycle auxiliary files that expose event_* MSS/FVG/swing fields
without normalized structural_confirmation_available may satisfy
auxiliary_structure_lifecycle only when the same directory contains
event_lifecycle_sidecar_prep_report.json whose output_features points to
that auxiliary file, route/practical flags stay fail-closed, and
feature_contract explicitly proves closed-bar, prior/past, lagged,
shifted-history, and completed-MTF availability. Missing or weak prep reports
keep the semantic family unverified.
discrimination_completion_unproven_records
admission_scope=inspection_only
promotion_allowed=false
trade_usable=false
update_goal=false
For profitability factors, evidence-packet success is not durable pipeline
closure by itself. Once a clean-AQ, same-tree/full-process, or
accepted-feedback packet proves promotion_allowed=true / trade_usable=true,
the lane enters contractized library closure. The factor is not a completed
training product until factor_library/profitability/<factor_id>/factor.json
carries the redacted evidence ref plus strategy_recipe,
activation_contract, bbn_hooks, and tree_hooks.
Contractized profitability closure requires all of:
strategy_recipe.schema_version=profit-strategy-recipe/v1,
activation_contract.schema_version=profit-activation-contract/v1,
bbn_hooks.schema_version=profit-bbn-hooks/v1 with
target_node=trade_outcome and states win, scratch, loss, and
tree_hooks.schema_version=profit-tree-hooks/v1 with safe consumer uses such
as profitability_bbn_posterior_query, profitability_execution_plan, and
profitability_branch_context. The hook objects are BBN/tree/path-ranker
consumer contracts; they do not authorize order placement or bypass current
activation, BBN, execution-tree, risk, or operator-scope gates.
Before calling a profitability factor-training lane complete, run and record:
python3 support/scripts/research/factor_library_audit.py --compact,
python3 support/scripts/research/factor_library_profitability_bundle.py --output-json /tmp/factor_library_profitability_consumer_bundle.json --compact,
python3 support/scripts/research/factor_library_runtime_boundary_audit.py --compact,
plus a bundle readback proving the factor is present and has all four contract
objects. The audit must have zero schema, route-boundary, evidence, privacy,
and lightweight violations; the bundle must report the expected
factor_count and runtime_actionability=requires_current_activation_and_runtime_gates.
Objective closure must read the contractized profitability bundle as a typed
practical-proof source. A practical_admitted profitability record with
admission_scope=practical_admission, valid contract objects, and validated
clean-AQ verified-cost-positive evidence may clear the practical proof gap in
objective_closure_snapshot.py, but it must not clear
profitability_full_process_incomplete. A factor-library record may count as
full-process proof only when the record or admission scope claims full process,
the referenced evidence has full_process_complete=true, at least one typed
full-process stage proof/resolution is present, no weak resolution status such
as backlog, deferred, not_in_scope, optional, out_of_scope,
preference, or preferred is used to satisfy a required stage, and
full_process_required_followups is empty.
A contractized profitability factor is a valid local end state for the current
training lane once the coherent factor-library slice is committed. Push or
remote readback is required only when the user asks to push, the objective
includes remote sync/release, or a release-readiness audit is in scope. If
push is blocked or out of scope, report the local commit and exact remote-sync
status instead of continuing to mutate the same factor.
After contractized closure, choose one explicit next decision in the workdoc or
handoff: Decision: stop_after_contractized_factor or
Decision: loop_new_factor. For loop_new_factor, close or terminalize the
old factor claim, preserve the /tmp run root as external evidence, rerun the
current claim/process collision audit, start a fresh claim/run root/factor id,
and do not reuse the closed factor's scratch state as the new lane authority.
Migration defaults: existing support/examples/factor_candidate_packs/**
migrate as candidate-only records, runtime code under src/factors/ or
src/factor_lab/ migrates as code seed references only, validated clean-AQ or
full-process packets migrate only as redacted durable summary evidence, and
old regime artifacts migrate only under discrimination/ with practical flags
false.
New factor ingress must use the staged ingest flow, not hand-edited orphan
packets. Build a staging directory outside the repo with factor.json plus
evidence/*.redacted.json; the refs inside factor.json must already point
to final repo-relative paths under
factor_library/<profitability|discrimination>/<factor_id>/evidence/ and
must carry matching SHA-256 values. Preflight with
python3 support/scripts/research/factor_library_ingest.py --staging-dir <dir> --compact.
Only after that passes may an agent run the explicit write:
python3 support/scripts/research/factor_library_ingest.py --staging-dir <dir> --commit --compact.
The durable transfer path is:
/tmp run evidence or source artifact -> redacted summary packet -> staged
factor.json -> factor_library_ingest.py -> factor_library/<route>/<factor_id>/
-> factor_library/indexes/current_factor_inventory.json ->
factor_library_audit.py -> git commit -> non-force git push -> remote
ref readback. For discrimination records, continue with
factor_library_consumer_bundle.py --output-json /tmp/factor_library_regime_consumer_bundle.json
-> existing --regime-consumer-bundle -> RegimeConsumerBundleAdapter ->
BBN/execution-tree/path-ranker diagnostics. Rust runtime must not read
factor_library/ directly; factor_library_runtime_boundary_audit.py is the
guard.
Profitability and discrimination keep different transfer semantics. A
profitability record may carry promotion_allowed=true / trade_usable=true
only when the profitability tuple is proven by validated clean-AQ,
same-tree/full-process, or accepted-feedback summary evidence. A
discrimination record transfers only root-owner trace, calibration/proxy
evidence, and diagnostic context; it must keep practical flags false and must
not become a BBN admission, execution-tree hint, path-ranker profit assignment,
paper/live admission, or trade-entry signal.
Treat trade density, ETH/full-session coverage, downstream lifecycle rows,
accepted feedback, Pre-Bayes/BBN/path-ranker/execution-tree placement, and
same-tree closure as ranking and robustness dimensions unless a current typed
gate proves a concrete defect such as unverified cost, bad provenance,
lookahead, or non-positive net. When present, report them because they make a
good factor stronger; when absent, record followup debt instead of clearing
promotion_allowed, trade_usable, or update_goal.
Practical admission is the start signal for lifecycle work, not a done signal.
Do not report the profitability-factor objective complete while
full_process_required_work_queue or full_process_required_followups is
non-empty. Not every lifecycle stage requires a blind positive pass for every
factor. Resolve the current queue by current objective, operator preference,
and evidence gap. Valid resolutions include accepted feedback, terminalized
failure with downscoped market/contract authority, packaged data blocker, or
explicit preference deferral. Keep preferred/deferred/backlog stages visible
in full_process_work_queue / full_process_followups, but do not let
hardcoded all-seven-positive requirements override an explicit market-specific
or preference-scoped lifecycle plan. "Optional downstream evidence" only means
optional to the relaxed practical-admission basis; after practical admission,
the next work is to close, downscope, or explicitly defer the lifecycle queue
with typed evidence.
A complete profitability-factor refining process is larger than the relaxed
practical-admission gate. After a good factor reaches the verified-cost
positive basis, keep these lifecycle followups visible as typed debt:
paper feedback, live feedback, broker feedback, slippage expansion,
cross-market revalidation, cross-contract revalidation, and drift monitoring.
Missing proof in those seven areas must surface as stable
full_process_followups, not disappear into prose and not silently become
hard relaxed-admission blockers. It remains full_process_complete=false
only while the missing stage is in full_process_required_followups; a typed
explicit preference deferral, packaged data blocker, or downscoped/terminalized
stage may remain visible as non-required debt without blocking completion. A
naked boolean such as
paper_feedback_verified=true, cross_market_revalidated=true, or
drift_monitoring_active=true is not proof by itself; every true flag must
carry its corresponding positive *_evidence detail field. Non-empty detail
that declares failed, blocked, pending, missing, invalid, timeout,
todo, unverified, not_rate_verified, HTTP 403/404, non-positive
revalidation, non-empty violations, or similar non-proof status/reason/
verification-basis diagnostics is preserved as evidence context but does not
satisfy full-process proof; *_blocker detail fields preserve
false/blocked states but never satisfy proof, and any non-empty *_blocker
field makes its stage unverified even when the boolean flag is true and the
paired *_evidence detail looks positive. However,
full-process proof is stage-specific, not just boolean-plus-nonempty detail:
paper feedback needs an accepted paper execution/trade feedback source marker
plus positive accepted rows and a direct paper execution feedback JSONL or
capture path; live feedback needs an accepted live execution/trade feedback
source marker plus positive accepted rows and a direct live/shadow feedback
JSONL path; broker feedback needs accepted rows plus
broker_fill_evidence_rows, broker_realized_rows, and a direct IBKR
paper/broker capture JSONL or broker capture JSONL path covering those
accepted rows; slippage expansion needs expanded_cost_multiple > 1 and
positive net_after_expanded_cost_pct or an equivalent expanded-slippage net
field. No IBKR paper/broker capture JSONL means the paper/broker stage is
not proved; no live/shadow feedback JSONL means the live stage is not
proved. Do not treat capture_jsonl_validated=true,
feedback_jsonl_validated=true, Auto-Quant backtest trade exports, raw
trades, naked accepted_rows, or chat/prose as feedback proof without a
direct .jsonl/capture file path in the same proof row. The next action is to
generate or attach the accepted JSONL/capture file, or explicitly package a
typed blocker/preference deferral/downscope. Paper/live/broker feedback and
slippage expansion must prove their required fields inside one proof row or
one direct evidence object; do not stitch a feedback source marker,
accepted_rows, JSONL path, broker fill/realized counts, expanded-cost
multiple, and expanded-slippage net from sibling rows or unrelated nested
objects.
cross-market revalidation needs at
least two distinct identifiable market rows, using fields such as market,
market_id, symbol, pair, or instrument, with positive verified-cost
net and positive trade counts; cross-contract revalidation needs at least one
identifiable contract row, using fields such as contract, contract_id,
contract_symbol, symbol, pair, or instrument, with positive
verified-cost net and positive trade count; duplicate symbols, summary/map
keys, or positive rows without an identity do not complete proof; drift
monitoring needs a passing current check and
an armed, active, or scheduled next check. Generic details such as
status=accepted, fill_audit=accepted, expanded_ticks, market names,
positive net without trade count, or a drift window do not complete the
process by themselves. Stage-resolution readback must be status-specific. A
sibling market row with
positive trade count but non-positive verified-cost net terminalizes or
downscopes cross-market authority; preserve
cross_market_revalidation_blocker.status=terminalized_downscope and do not
relabel it as missing proof. A sibling-contract run with unavailable or
insufficient dense rows is data_blocker_packaged, not positive proof and
not a reason to rerun the same data-blocked shape blindly. Drift monitoring
may verify independently only when the current check passes and the next
check is armed/scheduled; it does not prove paper/live/broker feedback. If
slippage expansion and drift are verified, cross-market is terminalized or
downscoped, cross-contract is data-blocked or downscoped, and IBKR/paper/live
readback has only zero accepted rows, the remaining required queue should
reduce to execution_feedback_pending: attach accepted execution feedback or
keep the typed blocker, but do not inflate optional/deferred stages into a
false completion blocker.
However,
when the current objective is the complete profitability-factor refining
process, full_process_complete=false is an objective-closure blocker
(profitability_full_process_incomplete) until the in-scope required stages
are closed under the stage plan. The conservative all-positive
full_process_complete=true proof still needs every required positive
evidence field, but lifecycle work itself is not restricted to re-running
until everything is positive: if any area proves a concrete defect such as
non-positive net after expanded slippage, invalid broker fills, market-specific
failure, contract-specific failure, missing sibling-contract data, or drifted
live behavior, terminalize, downscope, package the blocker, or repair through
that concrete typed defect instead of reporting only a generic missing
followup.
Profitability full-process closure is agent-owned work after a verified-cost
practical survivor appears. Do not answer the operator with "paper feedback
missing", "broker feedback missing", "slippage expansion not run",
"cross-market/cross-contract not run", "drift monitoring not armed",
"heavy gates not run", or "release readiness not run" when the repo already
has scripts or artifacts that can advance that item. Run the readback,
converter, packet update, audit, or terminalization yourself in the same turn
when possible, then report the resulting proof path or the concrete external
blocker. For IBKR/paper/live feedback, read existing broker executions first,
convert them through the repo's accepted feedback JSONL path, validate
accepted_execution_feedback_ready=true plus broker fill and realized-PnL
rows, and attach the proof row to the practical packet. Do not ask the
operator to hand-write JSONL. If no existing fills exist and a paper/live
round trip is needed, ask for explicit order-placement scope; after approval,
execute only that approved scope and still perform the readback, conversion,
validation, flat-position check, and packet attachment yourself.
A zero-row IBKR readback is useful lifecycle evidence, but it is not positive
paper/live/broker feedback. The reusable sequence is: run read-only
support/scripts/research/ibkr_execution_readback.py, convert with
support/scripts/research/real_trade_feedback_labels.py, and inspect the
summary fields. If accepted_execution_feedback_ready=false,
accepted_feedback_rows=0, broker_fill_evidence_rows=0, and
broker_realized_rows=0, write adjacent
execution_feedback_blocker_<timestamp>.json and, when the current stage is
scope-aware optional/downscoped, execution_feedback_resolution_<timestamp>.json
beside each in-scope clean_aq_practical_admission.json. Keep
promotion_allowed=false, trade_usable=false, update_goal=false; include
the readback path, summary path, zero row counts, forbidden feedback sources
such as backtest trades / zero-row JSONL / paper preflight / market-data
bridge, and a non-required
stage_resolutions.execution_feedback_pending.status=blocker_packaged or an
explicit preference/downscope status. Then rerun
python3 support/scripts/factor_claim_terminalization_audit.py --compact to
prove the files are consumed. If the audit still reports this as preferred
work only and full_process_required_work_queue=[], report it as typed debt
or blocker packaging, never as verified execution feedback.
When summarizing many practical survivors, do not flatten
full_process_followups into hard blockers and do not count every
full_process_complete=true as all-positive lifecycle proof. Parse each
stage in this order: positive evidence field, blocker field, then
full_process_stage_resolutions. Only a stage-specific verified status
with the required evidence fields is positive proof. Statuses such as
preferred, not_in_scope, blocker_packaged, data_blocker_packaged,
explicit_preference_deferred, or terminalized_downscope are typed
lifecycle resolutions/debt. Put rollups under /tmp/..., include the current
IBKR feedback readback paths and counts, and state explicitly when no order
was submitted and true paper/live/broker proof still requires approved order
scope plus real fills, conversion, validation, and flat-position check.
Completion and release gates are also agent-owned verification, not optional
prose. When the operator asks whether a profitability-factor objective,
harness, commit slice, or release is complete or ready, run
python3 support/scripts/done_definition_audit.py --compact --run-all-heavy
and python3 support/scripts/release_readiness_audit.py --compact --check-remotes, store outputs under /tmp/ict-engine-..., and aggregate
them with objective_closure_snapshot.py. A prior light
done_definition_audit.py --compact with skipped heavy gates is not enough.
Do not report "heavy done-definition not run" or "check-remotes not run" as
the stopping point; run them unless a concrete same-turn blocker prevents it.
Release readiness must come from a clean sanitized export or explicitly
selected committed tree. A dirty shared worktree, local branch ahead of
origin, or flaky remote readback is agent repair work: create or request the
narrow clean-export/commit-readback path, retry remote checks when unstable,
and report exact evidence. Profitability-factor source publication has a
standing operator authorization recorded on 2026-06-05: when current evidence
proves the selected committed tree is the intended source, the worktree is
clean, remote checks or dry-run push show a non-force update, and the only
remaining release-readiness blocker is
source_origin_matches_selected_source, automatically run
git push origin HEAD:main and rerun the release/objective readback without
asking again. This authorization is limited to source publication for this
route; tags, GitHub releases, release mirrors, branch force-pushes,
paper/live orders, or publishing from dirty/unverified trees still require
explicit operator scope.
The current Rust lifecycle encodes this as promotion basis
good_factor_verified_cost_positive (policy
good_factor_verified_cost_positive_downstream_feedback_optional_20260602 in
src/application/factor_lifecycle/profitability_admission.rs): a
verified-cost-positive good factor promotes even with execution-tree
placement, path-ranker use, accepted execution feedback, or retained-session
scope verification still missing, so the prior blockers
accepted_execution_feedback_missing, execution_readiness_below_live_floor,
execution_tree_gate_status_not_ready, execution_tree_branch_not_live_ready,
path_ranker_score_not_used_by_execution_tree, ranker_validation_not_ready,
and retained_session_scope_unverified are robustness/longevity debt, not
practical vetoes. This is advisory practical, never funded-live-trade proof.
The same owner also exposes PROFITABILITY_FULL_PROCESS_POLICY and
ProfitabilityFullProcessEvidence so scripts and agents can read full-process
closure independently from relaxed practical admission. Workflow readback must
not trust good_factor_lifecycle_validated=true, promotion_allowed=true,
trade_usable=true, or update_goal=true by themselves; it must also see a
validated clean_aq_practical_admission packet or a validated
same_tree_practical_closure packet before surfacing good-factor practical
readiness. Coordination claim raw counters may remain fail-closed with
promotion_allowed_true=0 and trade_usable_true=0; that is a safety shell,
not negative evidence against a validated typed packet. Readbacks must surface
the typed positive packet as validated_practical_admission or
practical_proof, keep full_process_followups as the remaining debt list,
and expose full_process_stage_plan plus full_process_work_queue so agents
advance the missing stages instead of merely reporting them. They must also
expose full_process_required_followups and
full_process_required_work_queue, because only required unresolved lifecycle
work blocks objective completion; preferred/deferred work remains visible
debt. Multiple
validated clean-AQ practical packets are a candidate set, not a reason to
report clean_aq_practical_admission=null; the audit/readback owner must
select and expose a primary packet plus clean_aq_practical_admission_candidates
or equivalent candidate summaries, while raw claim counters remain
fail-closed. Do not convert
raw claim counter zeros into
same_tree_practical_closure_unproven when a validated
clean_aq_practical_admission packet is present. Do not re-request slippage
expansion or drift monitoring when those stage-specific proofs are already
verified in the packet. When a validated practical packet has unlocked
full_process_work_queue, prioritize required paper/live/broker,
cross-market/cross-contract, and other non-launch evidence actions ahead of
done-definition/heavy-gate proof, release-readiness cleanup, fresh-claim
waiting, and generic live-runtime waiting. Preferred/deferred stages are
lower-priority backlog unless the current operator preference makes them
required. Stage actions must be
status-specific: pending stages ingest or attach proof, failed stages
terminalize the concrete failure or downscope the validated factor, and
blocked stages package the typed blocker or unblock the missing data. Do
not relabel failed/blocked cross-market or cross-contract evidence as a vague
missing followup when the packet already carries blocker detail. A foreign live runtime blocks new provider/AQ
launches and shared-runtime mutation only; it must not become an excuse to
stop source repair, packet ingestion, broker/paper feedback attachment,
market-specific terminalization, cross-contract data-blocker packaging, or
skill/code contract updates. Regime-discrimination diagnostics must not echo
consumer-hint promotion_allowed, trade_usable, or update_goal values as
practical flag keys; use diagnostic names such as
consumer_hint_trade_usable so practical-admission source scans cannot
confuse inspection-only evidence with a profit-route promotion surface.
Factor-library ingress, migration, bundle export, and
factor_library_audit.py must also keep closed-loop admission scope aligned:
a profitability record whose top-level status is not
full_process_complete and whose top-level admission_scope is not
full_process must not expose any closed_loop_refs[].admission_scope as
full_process. Such refs must stay practical_admission or another
explicitly lower scope until the same record has validated full-process
evidence; otherwise fail closed and repair the record rather than allowing a
downstream consumer to read practical-only proof as full-process closure.
See references/clean-aq-profitability-practical-admission-20260602.md for the profit-route admission boundary.
Do not use references/trendexpansion-regime-discrimination-map-20260602.md as the source of truth for this profit-route admission policy.
Do not fight a TrendExpansion factor by inventing additional hard entry
blockers after the posterior floor. HMM state persistence counts,
counterexample-count ceilings such as mild <= 1, score >= N severe-veto
rules, wick/failure labels, chop/noise labels, or abstain-action proxies are
diagnostics, calibration features, or attribution fields unless the operator
explicitly approves them as entry vetoes in the current turn. If such fields
are useful, record them in terminal metrics and compare post-run behavior;
do not silently turn them into gates that suppress candidate trades.
Balance throughput and quality by keeping learning/flywheel admission
separate from optional quality improvement. A lower learning regime-confidence
floor may admit a positive-expectancy, non-leaking, evidence-backed candidate
to collect feedback, but practical promotion does not require the entire
downstream flywheel. The primary practical basis is the clean-AQ verified
cost-positive survivor policy: command exit zero/no timeout, clean
provenance/source archive, preserved branch/factor identity, verified
instrument-cost model, and positive net after that cost. Pre-Bayes, BBN,
path-ranker, execution-tree, lifecycle, paper/live/broker feedback, density,
and session-scope expansion are longevity and robustness followups unless a
current typed gate explicitly proves a concrete defect. A moderate-confidence
learning candidate remains safe_to_train, not automatically
safe_to_trade, unless it also satisfies the clean-AQ practical tuple. As of
the current lifecycle split,
paper_feedback_collection_ready may use the explicit 12/12/12 mature row
floor for raw-scored, production, and observation validation rows when the
quality plane is otherwise clean. On workflow-status structural readbacks,
this feedback-collection stage may open even before the branch is
ready/actionable; those fields remain execution/live-plane evidence, not
the feedback-flywheel gate. The full paper/live validation floor remains a
useful longevity standard, but missing paper/live rows cannot veto a clean-AQ
verified-cost-positive practical survivor. Because ict-engine is an advisory
CLI, policy-training readiness readback must treat paper_ready_count and
live_ready_count as the same advisory count; accepted execution feedback is
optional robustness evidence, not the source of the live-ready count.
The old one-trade-per-three-sessions / 0.333/session / 1/day style
density floor is retired as a hard blocker for this user's TrendExpansion
and profitability-factor work. Density remains telemetry and a ranking or
capacity dimension, but it must not set promotion_allowed=false,
trade_usable=false, update_goal=false, downstream_allowed=false, or
a terminal reject_low_density decision by itself when the measured target
run has nonzero trades, clean no-lookahead/data evidence, verified
instrument cost, positive net after that cost, and acceptable stability.
Do not describe 0.301414/session or similar as "below the floor" or as a
quality blocker. Use fields such as trades_per_session and
density_observed_telemetry for readback, and if density truly matters for
capacity, label it capacity_followup, not admission failure.
Session scope is a profitability quality dimension, not a hard gate. The
preferred target remains ETH / extended trading hours / full retained
tradable session, but RTH-only or session-unverified runs are labeled lower
coverage evidence rather than automatic non-practical evidence. Every new
factor workdoc, claim, runner output, terminal metrics, terminal summary, and
handoff should state session_scope, rth_filter_applied, and ETH/full
retained coverage evidence or unknown status. Coverage evidence should prove
retained tradable-session rows outside the RTH window, not merely omit an
explicit RTH filter flag. If an artifact cannot prove ETH/full retained
coverage, classify the lane as session_scope_unverified, but do not clear
promotion_allowed, trade_usable, or update_goal solely for that reason
when the clean-AQ verified-cost-positive survivor policy is satisfied. For
stock/ETF refetches through
fetch_external.py ibkr-historical, omitting --rth is the intended request
shape for all-session data, but it is only a request contract until the
returned rows prove retained tradable-session coverage outside RTH. The
workdoc/terminal packet should record both the omitted --rth argv and the
later row-coverage evidence. For US stocks and ETFs, row coverage must use
the exchange-local regular session window, for example NYSE/Nasdaq
09:30-16:00 America/New_York; a row at 13:30Z during daylight saving is
the RTH open, not ETH proof.
transition_hazard, hybrid_transition_hazard, and pda_hybrid_alignment
are retired as profitability, promotion, and live-trade hard gates. Do not
require them for branch_local_admitted, extension_complete,
promotion_allowed, trade_usable, update_goal, practical admission, or
candidate selection. If historical artifacts or execution-tree traces still
contain them, treat them as telemetry/legacy readback only and prefer
duration/readiness/path-ranker/lifecycle fields for current gates. If a
wrapper, policy template, report, or workflow-status surface uses these
fields as admission criteria, fix the source before continuing factor
training.
Transaction costs are a hard evidence gate, not a parameter default. For every
cost-sensitive factor run, identify the instrument class, exact product/root,
listed market or exchange, venue/routing assumption, currency, broker, pricing
plan, account region, unit convention, and fee-effective date before judging
cost survival. Do not guess fees for stocks, ETFs, futures, options, perps,
crypto, FX, or sibling products. If any fee or economic field is unknown, the
agent must actively search official broker/exchange/regulatory sources in the
same turn and record the source URL/timestamp in the workdoc and terminal
packet. If it still cannot be verified, write cost_model_unverified, keep
promotion_allowed=false / trade_usable=false / update_goal=false, and
stop before promotion or downstream practical admission. A cost-stressed Gate
1 survivor is still blocked if the exact instrument cost model is unverified:
downstream, Pre-Bayes, BBN, CatBoost, execution-tree, paper/sim, live, and
same-tree practical closure must remain false until promotion_cost_verified
is true for the product, venue/routing, account/pricing plan, currency, unit,
and fee-effective date. Similar-looking products are not interchangeable:
stocks may share a market schedule but differ by market/currency/year/
minimums/taxes; ETFs can differ by product, domicile, venue, borrow/financing,
and routing; futures vary by contract family, multiplier, tick value,
exchange, regulatory, and clearing charges; options require option-specific
per-contract, exchange/OCC/regulatory, exercise, and assignment schedules.
Official-source verification is mandatory: use live web/provider/API lookup
in the same work slice, or a local verified cache row that includes source
URL(s), fetch timestamp, fee-effective date, broker/pricing-plan/account
assumptions, instrument root, multiplier/tick geometry, currency, venue, and
per-unit components. A cache row without those fields is not verification.
Never infer, estimate, copy from a sibling script, or reuse a historical bps
stress label as a fee. If official lookup fails or the cache is incomplete,
fail closed and document the blocker instead of inventing a cost.
Fixed-bps cost or stress models are forbidden as current authority. This
applies to every value, not only 5bps: do not use 1bps, 2bps, 5bps,
10bps, cost_bps, fee_bps, bps_per_side, net5bps, fixed bps
ladders, or percent-space formulas such as gross - trades * bps * 0.02
for candidate screening, Gate 1, downstream/practical admission, feedback
labels, promotion, trade_usable, update_goal, or telemetry that can be
confused as gate evidence. Legacy bps field names may appear only as
readback constants for already-created artifacts and must not be emitted as
new authority. Bps/notional is valid only when it is the verified actual
commission model for that exact instrument/venue/date. See
references/instrument-cost-model-verification.md and
references/futures-contract-cost-models-ibkr.md.
In ict-engine code, futures scripts must reuse the canonical shared helper
support/scripts/research/instrument_cost_model.py for root normalization,
verified IBKR futures cost profiles, per-contract USD-to-return conversion,
and cost-model packets. Do not introduce or preserve a wrapper-local
FUTURES_COST_PROFILES table, wrapper-local FuturesCostProfile, hardcoded
cost_bps, fee_bps, bps_per_side, or fee=0.0005 as commission,
slippage, stress, telemetry, or gate authority. The cost authority for futures
is the verified survives_instrument_cost / instrument-cost packet, with
sample, density, session, validation, and lifecycle gates kept separate.
If a current artifact includes survives_instrument_cost, that field is
authoritative and must be typed boolean true to prove survival; explicit
false, string "false", or any non-true value vetoes the row even when
instrument_cost_total_profit_pct or net_after_instrument_cost_pct is
positive. Positive after-cost net may infer survival only for legacy rows
where the explicit survivor field is absent.
When source metrics include explicit cost_stress or cost_stress_rows,
those row-level records are the cost-survivor authority for clean-AQ practical
admission. Do not let a top-level cost_model shell or top-level positive net
override row-level survives_instrument_cost, trade count, label, or verified
cost fields. Fall back to a top-level single-row shell only when no explicit
cost-stress rows exist.
When terminal metrics accept a per-run cost_model packet, do not treat the
global wrapper default as promotion evidence and do not accept
promotion_cost_verified=true by itself. The packet must also populate the
exact instrument class, broker, pricing plan, venue/routing, currency, unit
convention, fee-effective date, and required official source refs; each
required source must have a same-turn readback proving official HTTP 200 plus
rate verification, with no unknown, unverified, not_rate_verified,
HTTP 403, or HTTP 404 residue. Only then may a Gate 1 exact-root survivor
become clean-AQ practical evidence or feed downstream
Pre-Bayes/BBN/path-ranker/execution-tree improvement evidence. Missing
downstream lifecycle stages remain optional improvement debt once the
clean-AQ verified-cost-positive practical tuple itself is proven; otherwise
keep promotion_allowed and trade_usable false until a stricter practical
lifecycle packet passes.
Cost-survival fields must describe cost economics only. New current artifacts
must use real instrument-cost fields such as survives_instrument_cost, not
fixed-bps names such as survives_5bps_per_side,
survives_2bps_per_side, survives_1bps_per_side, net5bps, or
*_bps_per_side_total_profit_pct. Do not fold sample size, trade density,
cadence, or validation readiness into cost-survival fields. Use separate fields
such as minimum_trade_sample_floor_met, density_target_1_to_3_per_day,
cadence, and validation-readiness gates as telemetry or optional ranking
dimensions, not as implicit gate1_survivor vetoes. Otherwise a strong