Skip to content

Bound paper sell quote age independently of entry freshness - #1015

Merged
seathatflowsinourveins merged 4 commits into
mainfrom
foundation/engine-qual-exit-quote-freshness-20261011
Oct 12, 2026
Merged

seathatflowsinourveins merged 4 commits into
mainfrom
foundation/engine-qual-exit-quote-freshness-20261011

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

Owned paper exits currently share the entry's 3-second quote-freshness budget. Add optional exit_quote_max_age_seconds, bounded at 30 seconds from the measured pull, through the ledger, mover exit pricing, recovery and final pre-POST guard. Its effective default is the entry bound; entries and held-entry marks retain their <=3-second ceiling.

  • Current head: 5dea1e2452e3cc950dd709444cecfb342eb2e4ce (four commits: original sell bound, adaptive propagation, CC B1/F5 correction, and the FINAL docs-only clarification). All four commits were rebased without patch changes outside manifests/evidence.json; all four full trees match trading-cc's reference rebase.
  • Base commit: c735e8b2e7d096475ceed380ce956b9191af508c, fetched main selected for the conflict-only rebase. The original research/source baseline below remains pinned to branch-creation main.
  • Lane: lane:trading; rule-7 paper-path priority, with CC-owned review and landing.
  • Owned paths: source under blueprints/us-equities/adaptive-paper/ (safety.py, mover.py, mover_runner.py, native_strategy.py, strategies_v1.py, runner.py, recovery.py, transport.py, source-hashes.json); focused tests and aggregate-only fixture; the dated decision and explicit file registrations.

SOTA sources

  • Existing deterministic paper contract at native-agent-stack 99e72aeff932fce30069092b1763736cb9e64c1b: RiskLimits and frozen_json, quote validation at safety.py:692-704 and reservation/revalidation at :819-940; mover entry/exit pricing; final wire guard and recovery.py:171-174. The existing optional-leverage omission pattern supplies the ledger compatibility mechanism.

  • Official alpacahq/alpaca-py v0.44.0 mirror at cc4cb3b7ba50ae250e621983c2779047fb16bb28: alpaca/data/models/quotes.py:28 (quote timestamp) and alpaca/trading/requests.py:509-536 (supported limit-order request). The new age value stays in the local policy/guard; broker payloads retain the supported limit/DAY contract.

  • Hone's candidate-conditional profile receipt ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03 and aggregate 57eda3a309aad567bf95a8c6678a1deb8827e94b168cdffee8a96c69b2541bb7, verified/read directly from the minute-profile-with-active-dates packet; registered grid amendment 2f67ad1c0ecd6b09df3bb098e43ef769310f29c5568aebca2c25da0f0ab06738 and preregistration 70faa88e575bc313f80fdda4fbdd765f5980a578892a063ae94bd4f9336984bc are declared by the receipt.

  • Read-only released aggregate inputs: minute-aggregates.csv b7223642951bda11cbfe725e9ee69a4e6b1ef8477fd42e951b1db7093b9a96b1; pooled-minute-aggregates.csv c093f0ec70eee8fd527fce2e05f78669b67a4b61bcd0e482992cbf771d99b016; recorded-date-minute-aggregates.csv 31ffe1595ae4c2ee38227d111ecd406ed0f0816eb6d0af10519e25dc75c94ead; pull-summary.json f43fda7829f1ac47392f5bc922f785806404b09a083fe8d5b353ee88b3ee5b68, under the verified input manifest 8812730b70e8bb1f82ff5a4b08409bd36275f1491fa540ac800f0fee15eb3b50. No raw page was read or copied.

  • Entry ceiling: private us-equities-trading docs/decisions/2026-10-10-paper-caps-and-leverage.md:201 at 2f953241f9a4db7a482b65c78acd24827db6e4de; entry quote age remains at most 3 seconds.

  • Official nautechsystems/nautilus_trader v2.0.0rc5, pin 1b0a49d2792a9432a3aca3fcb617ce7a630d905e: Python submit boundary, cancel boundary at :2001, and native cancellation callback dispatch with its callback matrix at :5694. The sell-age policy remains local deterministic glue; the native callback provides the acknowledgment-time replacement boundary. Inspected from the registered upstream mirror; installed native tests keep this rc5 pin.

  • T15 next-deployment preset constraint: <state>/coordination/trading-cc/specs/t15-adaptive-exit-policy-plan-20261011.addendum-01.md, SHA-256 98b88e029f6efeeb192ced58c6e8c0abd70af6abdd8545b6b2c8933c0e7dc9de. Presets stay at or below 10 s until step 8 lands; code ceiling remains 30 s.

Evidence-class table

Claim Evidence class Command / receipt
Candidate-conditional profiles cover the registered grid through the policy ceiling of 30 s local_integration Aggregate-only recomputation and hash-verified selected fixture; diagnostic candidate minutes, not paper fills
Ledger, mover and final wire path admit bounded owned sells while preserving entry checks synthetic (SYN) Five regressions on unchanged main fail with 13 assertions/0 errors; final age controls pass
Paper and forced-recovery constructors carry separate entry/sell bounds local_integration Installed SDK/Nautilus fixture: new wiring test fails on main with 1 assertion/0 errors, passes at head
Adjacent behavior and default-ledger compatibility local_integration 772 installed-SDK synthetic tests passed before final comments/docstrings; final current-source focused 187 and SDK-backed 12 tests pass
Repository integrity local_integration python3 scripts/validate.py, exit 0, 11,635 hashes

Candidate-conditional profiles and policy framing

Hone's measured diagnostic pass counts are candidate-conditional profiles, not a recommended bound. The verified receipt is ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03 (observed exit 0), and the verified aggregate is 57eda3a309aad567bf95a8c6678a1deb8827e94b168cdffee8a96c69b2541bb7. Counts below were read from that aggregate itself. The counts are unchanged (same values, sanitized bytes); the receipt cited here is Hone's sanitized copy, with home paths replaced by ~ and account names by <user>. They cover 04:00-07:00 ET with a spread cap of 100 bps; UNION and RECORDED-DATE are separate cohorts. Unknown quotes do not pass.

Cohort Age threshold Passing candidate-minutes / cohort candidate-minutes Receipt SHA-256
UNION (10 session windows; 10 active candidate dates) <=3 s 5,703 / 66,600 ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03
UNION (10 session windows; 10 active candidate dates) <=10 s 8,251 / 66,600 ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03
UNION (10 session windows; 10 active candidate dates) <=30 s 11,037 / 66,600 ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03
RECORDED-DATE (10 session windows; 6 active candidate dates) <=3 s 2,786 / 7,740 ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03
RECORDED-DATE (10 session windows; 6 active candidate dates) <=10 s 3,348 / 7,740 ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03
RECORDED-DATE (10 session windows; 6 active candidate dates) <=30 s 3,760 / 7,740 ee99f0d2308d9502e4c549562049c3c620000073b4e8ac76a6b1a5b860e9da03

The receipt declares preregistration 70faa88e575bc313f80fdda4fbdd765f5980a578892a063ae94bd4f9336984bc and registered grid amendment 2f67ad1c0ecd6b09df3bb098e43ef769310f29c5568aebca2c25da0f0ab06738. The profile cross-product is spread caps 15 / 50 / 100 bps and ages 3 / 10 / 30 seconds; all nine counts per cohort and the 07:00-09:30 stratum are retained in CANDIDATE-CONDITIONAL-PROFILES.json. The aggregate explicitly infers no threshold or earliest-slot/config change.

exit_quote_max_age_seconds is a policy field under the CC's 30-second code ceiling. The registered grid and profiles show the candidate-conditional admission trade-off across 3/10/30 seconds; they do not optimize, recommend or authorize a configured bound, raise that ceiling, identify the whole snapshot universe, establish PIT availability or show strategy returns/fills. The effective default stays at the entry bound, and an owning fresh-ledger deployment chooses any explicit value within the ceiling under its authority. The decision record's 30-second measurement describes the tested ceiling, not a recommendation to set the field to 30.

All executable synthetic results and simulated prices/holdings/order state remain SYN. The profiles are aggregate diagnostics, and native engine/SDK test execution on synthetic inputs does not grant paper/live qualification. The landing-triggered earliest-slot rule remains the CC's operational rule; no clock time or profile result alone releases deployment.

T15 next-deployment preset constraint

Primary record: <state>/coordination/trading-cc/specs/t15-adaptive-exit-policy-plan-20261011.addendum-01.md, 3,533 bytes, SHA-256 98b88e029f6efeeb192ced58c6e8c0abd70af6abdd8545b6b2c8933c0e7dc9de, directly verified. The next deployment's preset keeps exit_quote_max_age_seconds at or below 10 seconds until T15 step 8's re-price-from-fresh lands. The 30-second code ceiling is unchanged. Step 8 must re-price a latched exit from the freshest quote at each submit and re-send, never from the triggering quote; widening the trigger window must not widen that future pricing window. The current latch/pricing behavior is pre-existing and remains in the exits research queue. The synthetic 20/30-second cases test code limits and do not authorize those deployment presets.

Measured ceiling and implementation

Known pre-07:00 stale candidate-minutes recompute to 58,253/66,234 (87.9503%) for the fixed union and 4,526/7,740 (58.4755%) for recorded-date candidates. Unknown quotes remain separate. Pooled 04:00 spread <=100 bps admits 39/370 at <=3 s, 55/370 at <=10 s and 59/370 at <=30 s. Thirty is the largest profiled age and the CC's code ceiling; the profile is not a recommended bound. The code rejects larger, zero, negative, Boolean and noninteger explicit values.

Only aggregate minute medians supply the synthetic age cases. Their prices, positions and orders are synthetic, and a median age is not asserted to belong to a particular candidate's spread. The data establishes neither a PIT universe nor paper fill quality.

The same optional sell limit reaches reservation, pending revalidation, mover exit quotes, owned recovery and the nanosecond guard immediately before POST, including budget-delay checks. Entry prices, spread/session/halt/ownership/quantity/notional limits, request budgets and future tolerance remain in place. The mark_to_market() method retains the entry budget even when it skips the entry spread gate.

When absent/null, the field is omitted from frozen_json and default transport kwargs, preserving existing default ledgers and factories. An explicit changed exit limit is frozen and refuses a mismatched reopen. Existing configs remain unchanged at their 3-second default; the owning fresh-ledger deployment can explicitly choose "exit_quote_max_age_seconds": 30 after landing.

CC B1 correction

The CC ruled SWITCH for the armed gap-stop trigger. Commit a5431d0f1c8d3ac66ccb309f791bbc3bd7d1cdda on reviewed parent 1bb44890efaacd4c87b650e204c32282a7dec5ec uses sell_quote_age_seconds(self.policy.config) for that trigger and corrects the comment. Stop arming and prior-close capture retain entry-age guards; their comments now state that distinction. F5 is folded into the same commit: the mover decision-record locators are re-anchored to verified main 569bbc59db2b5f7c8a932357726efb7acca90b91 bytes at mover.py:366-380,1201-1203,1261-1299. Source-map and evidence registrations are re-derived.

SYN fail-first at reviewed parent 1bb44890: three workflow methods, ten assertion failures, zero errors, exit 1. The armed trigger admits ages 4/10/20/30 s with exit 30 and refuses 31; an arming workflow waits for an entry-fresh reference before an older bounded sell trigger; absent/null controls retain legacy 3-second behavior. The unchanged arming/default assertions already pass at the parent; each workflow's configured bounded-sell assertion discriminates the correction. At the final B1 source: three workflows pass, exit 0; touched native/policy/exit/session/runner/registry modules pass 491 tests, exit 0; validate passes 11,678 hashes, exit 0. Observed sources and sanitized outputs are retained in <state>/coordination/ns2604-coop/lanes/engine-qual.pr1015-gap-stop-20261011/.

Astra ACKed reviewed parent 1bb44890efaacd4c87b650e204c32282a7dec5ec with zero blockers under the scope lock. The CC had already ruled SWITCH for B1; the co-op released this unchanged commit. Fresh fetch followed by ONE push leased exactly on 1bb44890efaacd4c87b650e204c32282a7dec5ec publishes a5431d0f1c8d3ac66ccb309f791bbc3bd7d1cdda. The Opus/Astra/Codex confirmation wave now reads this head; no additional source correction is implied by the recorded P3 follow-ups.

Ordinary adaptive sell correction and complete current quote-age inventory

The first head c90efda9 accepted the field but left ordinary adaptive sell decisions on the entry age. The adaptive propagation correction at 1bb44890efaacd4c87b650e204c32282a7dec5ec, preserved through the pure rebase in current 5dea1e2452e3cc950dd709444cecfb342eb2e4ce, carries the validated effective RiskLimits sell bound into PolicyConfig, exit evaluation, native forced/action guards and cancel-ack replacement. Entry paths retain their previous age. Gap-reference sampling retains the entry standard. The CC-ruled B1 correction also switches the armed RTH gap trigger to the effective sell age; stop arming and prior-close capture retain entry age.

SYN fail-first: the new module runs seven methods at c90efda9 with 39 assertion failures, zero errors, exit 1. All four regression methods fail: policy stop exits (9 cases), native ordinary stop sells (6), native forced sells (12) and cancel-ack replacements (12). Absent/null and entry-feature/order/held-admission isolation controls already pass there. Exact 10/30-second limits are inclusive; just-over-limit and future-tolerance refusals remain. Default RTH, explicit RTH, PRE and POST are covered. The stale age comes from the retained aggregate-selection fixture, with synthetic prices/state/order I/O.

SYN corrected checks before rebase: new module: 7 tests, exit 0; touched policy/exit/extended-exit/session/runner/source-registry modules: 517 tests, exit 0; age/safety/admission/evidence controls: 127 tests, exit 0. Final test-file cleanup removed only a trailing blank line; final source/registry tests: 20 tests, exit 0. python3 scripts/validate.py passes after that cleanup: 70 components, 11,636 hashes, 4 profiles, 239 receipts, exit 0. Local observed commands, sanitized outputs, source snapshots and pinned native excerpts are retained in <state>/coordination/ns2604-coop/lanes/engine-qual.adaptive-sell-fix-20261011/. These are synthetic integration checks, not broker fills or paper/live qualification.

Whole-repository command at the current published head:

git grep -n -e quote_max_age_seconds -e quote_age_seconds a5431d0f1c8d3ac66ccb309f791bbc3bd7d1cdda -- .

Observed exit 0: 198 matching lines in 67 files. This substring search deliberately also includes optional sell/order fields, helpers and independent similarly named blueprint fields. The following tables classify every executable consumer; the complete file/line index also accounts for tests, config declarations, historical snapshots and documentation. Adaptive table paths are relative to blueprints/us-equities/adaptive-paper/, all at current a5431d0f1c8d3ac66ccb309f791bbc3bd7d1cdda. exits.py and _wire_guard are included despite consuming derived values rather than matching the entry-field search themselves.

Source at correction head Consumer Selected age and reason
safety.py:178,197,224,230-232,289-303 Validated limits and frozen JSON Entry age stays capped at 3 s; optional sell age is integer 1-30, absent/null defaults to entry; omission preserves default ledger bytes.
safety.py:708-709 (reserve_intent/validate_pending) Side-specific quote admission Sell uses effective exit age; buy uses entry age. Ownership, pending state, spread and quantity remain independently checked.
safety.py:882,943,1408-1417 Held-entry admission marks and the mark_to_market() method Held-entry admission and the mark_to_market() method retain the entry age. A sell quote within the sell age may refresh the ledger's mark when it is newer than the stored mark. It keeps its own timestamp, so it never makes a mark fresh for an entry, and entry admission is unchanged. It may move unrealized P&L, the peak and drawdown, and latch a risk halt (which sets force_exit, runner.py:1776-1778) on a quote up to the sell age old.
runner.py:441-442,461-462 Configuration to RiskLimits/PolicyConfig Entry remains quote_age_seconds; validated effective sell age is carried separately into exit_quote_age_seconds.
runner.py:748 Startup benchmark quote readiness Entry age: startup observations do not become usable signal/entry evidence because a sell limit was widened.
runner.py:1791 Periodic mark-to-market quote selection Entry age: stale marks disable admissions while independently bounded sells remain available.
runner.py:2564-2567 Ordinary paper and recovery transport construction quote_timeout and buy-order age stay on entry for stream/entry readiness. Explicit sell age reaches the separate wire guard; omitted field preserves old factory kwargs.
strategies_v1.py:56,150,153-155,233-236 Policy field validation and sell_quote_age_seconds Entry field unchanged; sell field is optional integer 1-30. Absent/null and older config-shaped fixtures fall back to entry.
strategies_v1.py:351 Entry feature/regime/signal freshness Entry age: older quotes cannot become entry signals or a newly usable benchmark regime.
strategies_v1.py:433; exits.py:197 Holding exit evaluation and extended-hours flagged hold Effective sell age determines ExitContext.quote_fresh and exit pricing; ExitPlan receives that result. No independent age constant is hidden in exits.py.
native_strategy.py:625,717 Gap-stop arming and prior-close capture Entry age retained for reference prices. The sell trigger is classified separately below.
native_strategy.py:682 Armed RTH gap-risk stop trigger SWITCHED under the CC B1 ruling: effective sell age, inclusive at the configured ceiling, unchanged future tolerance. Stop arming and prior-close capture stay on entry age.
native_strategy.py:806 Held-position OperationalStatus.state_fresh Entry age: selector admission readiness cannot become fresh merely because a sell can use an older quote.
native_strategy.py:857 Forced/session exit disposition Effective sell age plus the existing future tolerance; RTH/PRE/POST session restrictions remain.
native_strategy.py:1074-1075 Final adaptive action guard Sell uses effective exit age; buy uses entry age. Halt, busy state and price/quantity limits remain independent.
native_strategy.py:1341,1348,1354 Cancel-ack replacement submission Effective sell age, evaluated at the acknowledgment clock, inclusive at the configured ceiling; over-ceiling/future quotes refuse replacement.
mover.py:361,375-376,442,457-458 Mover config limits and stream timeout default/validation Entry age still seeds the stream timeout and its minimum. The timeout also filters which delivered quotes reach sell pricing: a late delivery is dropped, and the sell prices on the older cached quote within its bound. Limits carry the optional separate sell age.
mover.py:1203-1204 (entry, held-entry, exit callers) Mover quote freshness/pricing Only sell callers select effective exit age; entry and held-entry evaluation stay on entry age.
mover_runner.py:355 Mover periodic quote selection for mark_to_market() Entry age: the mark_to_market() method and held-entry admission retain the entry standard. Sell-path mark refreshes have the separate behavior described above.
mover_runner.py:834-836,952-954 Mover paper/recovery transport construction Buy wire age stays entry; explicit sell age is passed separately, with absent/null kwargs omitted.
recovery.py:173-177 Owned-position recovery quote freshness Sell uses the minimum of configured effective exit age and frozen ledger effective exit age; recovery cannot widen the ledger.
recovery.py:252 Recovery quote-wait interval Entry-age-derived polling interval is retained; it bounds the wait, not the quote age admitted for a sell.
transport.py:1203,1225,1230-1240,1407-1413 Transport settings and final pre-POST guard Entry timeout/order age unchanged; optional sell age is validated and converted to integer nanoseconds. Final guard selects by side after budget delay; stream readiness is additionally required for buys.
market_research.py:212,224,226 Snapshot observation age/freshness diagnostic Independent research default (10 s), unchanged; not this exit field or permission to trade.
trials/20260923-post-extended-hours/quote_cadence_sample.py:37,66 Historical quote-cadence diagnostic Recorded config threshold is kept for historical measurement identity; not an active sell consumer.
Other full-tree executable matches Selected age and reason
blueprints/us-equities/alpaca-paper/paper_runner.py:28,343,409 Independent max_quote_age_seconds guard, default 15 s, unchanged for that blueprint; this PR does not propagate the adaptive sell field there.
blueprints/us-equities/broad-universe/coverage.py:945; broad-universe/scan.py:314 Observed quote_age_seconds output metadata, not an entry or exit threshold.
blueprints/us-equities/engine-nautilus/ibkr-acceptance/ibapi_probe.py:64 Independent max_acceptable_quote_age_seconds diagnostic read from its own pinned plan; unchanged.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/run.py:175,251,873-874 and its three retained harness copies Independent IBKR plan validation, offset-adjusted age calculation and freshness guard (plan ceiling 10 s); unchanged. Historical copies remain their recorded source bytes.
blueprints/us-equities/order-throughput/capacity.py:115,141,797 Independent max_quote_age_seconds capacity policy, default 60 s, bounded 1-3600 s; unchanged. Not adaptive entry/exit policy.
Every matched file Matching lines Line numbers at current head Classification
blueprints/us-equities/adaptive-paper/README-mover.md 1 339 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/config-leverage-1x.json 1 59 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/config-leverage-2x.json 1 59 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/config-leverage-4x.json 1 59 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/config-mover.json 1 27 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/config-sip.json 1 23 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/config.json 1 23 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/market_research.py 3 212, 224, 226 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/mover.py 6 361, 375, 376, 442, 1203, 1204 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/mover_runner.py 7 355, 834, 835, 836, 952, 953, 954 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/native_strategy.py 10 18, 625, 682, 717, 788, 806, 857, 1074, 1075, 1341 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/receipt.json 2 41, 261 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/recovery.py 4 173, 175, 177, 252 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/runner.py 10 441, 442, 461, 462, 748, 1791, 2564, 2565, 2566, 2567 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/safety.py 16 178, 197, 224, 230, 231, 232, 289, 290, 291, 302, 303, 708, 709, 882, 943, 1416 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/strategies_v1.py 12 32, 56, 147, 150, 153, 154, 155, 233, 235, 236, 351, 433 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/transport.py 7 1203, 1225, 1230, 1231, 1238, 1239, 1240 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/trials/20260923-post-extended-hours/README.md 1 54 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/trials/20260923-post-extended-hours/config-post-liquid-9967f44d.json 1 36 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/trials/20260923-post-extended-hours/quote-cadence-20260923T232026Z.json 1 6 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/trials/20260923-post-extended-hours/quote_cadence_sample.py 2 37, 66 Executable consumers classified in the tables above.
blueprints/us-equities/adaptive-paper/trials/20260923j-regular-no-signals/config-sip-77244c39.json 1 23 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/trials/ext-20260928/receipt.json 1 177 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/trials/ext-20260929/receipt.json 1 238 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/trials/ladder-1x-20260924a-needs-attention/README.md 1 84 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/trials/mac-2026-09-24-mover-a/config-mover-mac-20260924a.json 1 29 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/trials/mac-2026-09-24-mover-c/config-mover-mac-20260924c-recover30.json 1 29 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/trials/mac-2026-09-24-mover-c/config-mover-mac-20260924c.json 1 29 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/adaptive-paper/trials/pre-20260929/receipt.json 1 237 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/adaptive-paper/trials/rth-20260929/receipt.json 1 237 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/alpaca-paper/config.json 1 13 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/alpaca-paper/paper_runner.py 3 28, 343, 409 Executable consumers classified in the tables above.
blueprints/us-equities/broad-universe/coverage.py 1 945 Executable consumers classified in the tables above.
blueprints/us-equities/broad-universe/receipt.json 3 747, 757, 767 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/broad-universe/scan.py 1 314 Executable consumers classified in the tables above.
blueprints/us-equities/engine-nautilus/ibkr-acceptance/ibapi_probe.py 1 64 Executable consumers classified in the tables above.
blueprints/us-equities/engine-nautilus/ibkr-acceptance/plan.json 1 17 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/evidence/harness/plan-post.json.4500c917e11e 1 77 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/evidence/harness/plan.json.9f2942c49bbd 1 75 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/evidence/harness/run.py.1b697f237275 4 175, 251, 873, 874 Executable consumers classified in the tables above.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/evidence/harness/run.py.676a375a472a 4 175, 251, 838, 839 Executable consumers classified in the tables above.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/evidence/harness/run.py.9f6c08f1835f 4 164, 240, 823, 824 Executable consumers classified in the tables above.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/plan-post.json 1 77 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/plan.json 1 75 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/engine-nautilus/ibkr-paper-orders/run.py 4 175, 251, 873, 874 Executable consumers classified in the tables above.
blueprints/us-equities/incentive-monitor/config-forward-1030.json 1 29 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/incentive-monitor/config-forward-1330.json 1 29 Configuration/plan declaration; active loaders or independent harnesses are classified above; historical captures remain recorded inputs.
blueprints/us-equities/order-throughput/README.md 1 50 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/order-throughput/capacity.py 3 115, 141, 797 Executable consumers classified in the tables above.
blueprints/us-equities/order-throughput/evidence/capacity-200-20260924-rth.json 1 60 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/order-throughput/evidence/capacity-200-20260924-rth2.json 1 58 Recorded observation, documentation or evidence metadata; no additional executable admission path.
blueprints/us-equities/order-throughput/evidence/capacity-200-20260924.json 1 48 Recorded observation, documentation or evidence metadata; no additional executable admission path.
docs/decisions/2026-10-11-sell-only-quote-freshness.md 6 3, 5, 79, 89, 90, 96 Recorded observation, documentation or evidence metadata; no additional executable admission path.
tests/test_adaptive_paper_adaptive_sell_age.py 3 28, 43, 44 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_corporate_actions.py 2 983, 986 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_exit_quote_age.py 12 27, 28, 31, 111, 113, 114, 135, 137, 140, 171, 174, 179 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_exits.py 5 436, 439, 1147, 1218, 1367 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_extended_exits.py 3 406, 476, 537 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_fees.py 1 778 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_mover_native.py 3 628, 629, 630 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_recovery.py 1 268 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_runner.py 6 1904, 3554, 3567, 3581, 3602, 3623 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_safety.py 1 785 SYN fixtures/assertions; no production quote-age decision.
tests/test_adaptive_paper_sessions.py 8 1381, 1432, 1502, 1506, 1507, 1508, 1725, 1774 SYN fixtures/assertions; no production quote-age decision.
tests/test_alpaca_admission_regressions.py 4 223, 231, 239, 240 SYN fixtures/assertions; no production quote-age decision.
tests/test_broad_universe_scan.py 1 292 SYN fixtures/assertions; no production quote-age decision.
tests/test_ibkr_paper_orders.py 4 117, 156, 157, 158 SYN fixtures/assertions; no production quote-age decision.

Prior registry-only rebase confirmation

The two original commits were rebased onto 569bbc59db2b5f7c8a932357726efb7acca90b91 after the mover exit-chain landing. Original c90efda95 maps to 57312f2b4; original 2ae782209 maps to 1bb44890e. git range-diff reports both as = when excluding only manifests/evidence.json and blueprints/us-equities/adaptive-paper/source-hashes.json; full-range differences are confined to those registries. Source hashes were re-derived from actual bytes using the co-op recipe, with only this PR's own new keys; no changed key belongs to an unrelated file. Evidence was regenerated through scripts.host_receipts.register_file under docs/lanes.md:94-141. No production or test content correction was added during the rebase.

At reviewed parent 1bb44890, SYN focused sell-age/source-map checks pass 15 tests (exit 0); the union of all previously run adaptive modules and admission/evidence controls passes 969 tests across 16 modules (exit 0). python3 scripts/validate.py passes (exit 0): 70 components, 11,678 hashes, 4 profiles, 239 receipts. The earlier fail-first results remain tied to their exact retained source. Those rebase checks apply to reviewed parent 1bb44890; the complete consumer inventory above is refreshed at current a5431d0f, and its B1 checks are recorded separately. Local observed rebase checks and sanitized outputs are retained in <state>/coordination/ns2604-coop/lanes/engine-qual.pr1015-rebase-20261011/.

Local commands run

python3 -m unittest tests.test_adaptive_paper_exit_quote_age.SellQuoteAgeRegressionTests
Unchanged main plus new tests: exit 1, 5 tests, 13 assertion failures, zero errors.

<installed-test-venv>/bin/python3 -B -m unittest tests.test_alpaca_admission_regressions.CashContinuity.test_sell_age_reaches_paper_and_forced_recovery_without_widening_entries
Pristine main production code plus new test/observer helper: exit 1, 1 assertion failure, zero errors.

python3 -B -m unittest tests.test_adaptive_paper_exit_quote_age tests.test_adaptive_paper_safety tests.test_adaptive_paper_mover tests.test_adaptive_paper_source_hashes_manifest
Final source: exit 0, 187 tests passed.

<installed-test-venv>/bin/python3 -B -m unittest tests.test_adaptive_paper_exit_quote_age tests.test_alpaca_admission_regressions.CashContinuity.test_sell_age_reaches_paper_and_forced_recovery_without_widening_entries
Final source: exit 0, 12 tests passed.

python3 scripts/validate.py
Exit 0: 70 components, 11,635 hashes, 4 profiles, 239 receipts.

The larger installed-SDK run covers 12 named modules, 772 tests, exit 0; its exact commands are retained in PRE-FINAL-VERIFICATION.json. Final changes afterward were comments/docstrings only, followed by the final current-source checks above. The installed test environment is <state>/ns2604-uet-read-env/venv/ with NautilusTrader 2.0.0rc5 and alpaca-py 0.44.0; bytecode writes were disabled. No environment installation, study-runtime change, real broker call or order was performed.

Local packet: <state>/coordination/ns2604-coop/lanes/engine-qual.exit-quote-age-20261011/, with exact source/test/input hashes, retained failure observations, aggregate-only inputs, final confirmations and primary sources. Test outcomes are synthetic integration evidence; no paper/live qualification or promotion follows.

Decision record

docs/decisions/2026-10-11-sell-only-quote-freshness.md records measured inputs, the strict 30-second optional ceiling, unchanged entry limit, compatibility and the PRE trigger.

PRE readiness

The cited T15 addendum leaves Monday's already scheduled paper work on its sealed bundle. #1015 and #1017 enter the next deployment, re-cut after Monday's session, with the <=10-second preset constraint until step 8 lands. The CC and owning deployment lane release that operation; this PR changes no deployed config or existing ledger and places no orders.

Host evidence

No evidence/hosts acceptance or platform change.

Follow-ups

  • FINAL Codex dispositions at docs commit c7adc2135c66d576129fb6e3ec5267915de54e26: co-op research queue row 27 retains caching delivered-late quotes; the body now states the timeout's effect on sell pricing. Row 28 asks whether sell-path marks older than quote_max_age_seconds should feed risk halts (force_exit), with option (a) retained as a candidate. The CC released option (b), documenting current behavior without a behavior change.

  • Astra P3 comment: the former native_strategy.py:677-683 claim of an identical entry/sell freshness window is corrected by the B1 switch commit a5431d0f; arming/capture are explicitly entry-bound and the trigger is sell-bound. No comment correction remains owed.

  • Astra P3 running high: preserve the newly widened policy running-high behavior with a regression; a valid bid older than entry age but within exit age may raise Holding.high_bid, while out-of-bound quotes must not.

  • Astra P3 measurement-capture gap: cited CSVs, input manifest, preregistration/grid amendment and pinned private caps-decision bytes were unavailable in her review packet; supply captures for independent recomputation, retaining candidate-conditional/SYN limits.

  • Astra P3 inherited host labels: 20 pre-existing occurrences on 18 lines in manifests/evidence.json, count only; no identifier is published here.

  • Correctly stopped publication false positive: rule generic-api-key, path blueprints/us-equities/adaptive-paper/source-hashes.json (redundant packet copies).

  • Combined F1 (P3): pin mover entry isolation with exit age 30: a waiting leg quoted 3.25 s ago emits no buy, and a held leg with that age blocks another symbol's entry with held_mark_stale.

  • Combined F2 (P3, pre-existing rule-gate test gap): pin that no exit reason/event latches on a quote older than the effective sell bound or beyond the future tolerance (for example 30.5 s at exit 30 and 3.5 s at the default).

  • Combined F3 (P3): pin the mover running high under the sell bound, raised by a valid 3.25 s bid with exit 30 but unchanged for a 30.5 s bid or a quote beyond the future tolerance.

  • Combined F4 (P3, fail-closed wiring/boundary gaps): add SDK-free standalone command_recover exit-kwarg coverage and CI-visible paper constructor coverage; pin the -0.25 s future boundary and exact entry/sell ceilings.

  • Combined F6 (P3): document stream_quote_timeout_seconds beside any exit-age opt-in. It defaults to the entry age and is configured at mover.py:457-458; the deployment must state that timeout with its constrained exit-age preset.

  • P3 source-capture gap: retain and supply the cited CSVs, their input manifest, preregistration, grid amendment and pinned private caps-decision capture so reviewers can independently recompute every cited row; retain the candidate-conditional/SYN boundaries.

  • P3 inherited host-label hygiene: 20 existing occurrences on 18 lines in manifests/evidence.json, also present in the PR base; no identifier is published here. Any later normalization must update dependent registrations together.

  • The owning next deployment selects an exit-age preset at or below 10 s and a matching fresh ledger until T15 step 8 lands; paper observations need their own execution evidence.

  • Historical aggregate admission counts do not settle live quote cadence, fills, venue liquidity, profitability or original universe availability.

Checklist

  • Entries retain their <=3-second ceiling and held-entry checks.
  • Five age/config regressions and the native wiring regression fail on main, pass at the implemented source.
  • Default frozen-ledger bytes match; changed explicit limits remain protected.
  • Only aggregate inputs used; raw pages and private credentials untouched.
  • No broker/paid/deployment/arming/promotion action.
  • Existing SDK surfaces and supported registration API reused; peer worktrees preserved.

@seathatflowsinourveins seathatflowsinourveins added the lane:trading Trading lane: sim, paper and live north star label Oct 11, 2026
@seathatflowsinourveins
seathatflowsinourveins marked this pull request as ready for review October 11, 2026 19:45
@seathatflowsinourveins
seathatflowsinourveins force-pushed the foundation/engine-qual-exit-quote-freshness-20261011 branch from 2ae7822 to 1bb4489 Compare October 11, 2026 21:48
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-12T00:12:41.840966Z c7adc21 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: 1bb44890ef

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a5431d0f1c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@seathatflowsinourveins
seathatflowsinourveins force-pushed the foundation/engine-qual-exit-quote-freshness-20261011 branch from a5431d0 to c7adc21 Compare October 11, 2026 23:53
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: c7adc2135c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@seathatflowsinourveins
seathatflowsinourveins force-pushed the foundation/engine-qual-exit-quote-freshness-20261011 branch from c7adc21 to 5dea1e2 Compare October 12, 2026 02:19
@seathatflowsinourveins
seathatflowsinourveins merged commit 0f50e96 into main Oct 12, 2026
36 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the foundation/engine-qual-exit-quote-freshness-20261011 branch October 12, 2026 02:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:trading Trading lane: sim, paper and live north star

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant