Repository navigation
Conversation
Authenticated surfaces now name an IBKR account by the validated account_selector (U or DU followed by digits) of the matched account option instead of a strategy-derived key, label or target name. A missing or invalid selector shows a localized "Account ID unavailable". - One shared helper (ibkrAccountName) feeds useDisplayNames; the overview queue and cockpit decision card use the shared resolver. - ControlsTab confirms IBKR stops against the broker ID and blocks the stop when it cannot be resolved; requests keep the internal key. - Desk accounts and switch-targets return the validated IBKR ID as account_ref; readback shows valid IBKR selectors in full. Target IDs, suffix fields, comparison and unknown-state rules are unchanged. - Remove the SOXL/TQQQ account_aliases mappings and regenerate. - Synthetic example IDs, README guidance and compatibility notes. Display only: account_alias/option.key, selection, requests, grouping, bindings and amounts are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Posted by the coordinator on behalf of the independent Astra review session (session-review receipt, not an official Codex GitHub App attestation): Independent end-of-round verdict: FAIL PR #1172 — QuantStrategyLab/QuantRuntimeSettings This is a prepared session-review receipt, not an official Codex GitHub App attestation or owner approval. Reviewer authentication and native gates remain separate. This session has not posted it. Four unresolved findings (P2):
Positive evidence: all 27 changed files are bound. The validated frontend helper, valid U/DU precedence, ControlsTab visible/typed ID challenge, original request keys and response-identity checks, valid Desk refs, full-value readback comparisons and mapping removals work in the exercised cases. A base-ControlsTab mutation makes the new regression fail as expected. Independent base/head JSON-byte comparisons preserve selection/grouping, settings identity, Desk target IDs, facts joins and amount strings, runtime-daily attribution/source IDs/fingerprints, and readback fields outside intended presentation changes. Identity-producing source trees and Desk golden fixtures are unchanged. The rebuilt asset map is byte-identical, including all 45 assets. Exceptions/residuals: E1's constraint is verified but its “never strategy name” claim is refuted. E2/E3 require test corrections. E4's masked mock constraint is verified and accepted as a bounded residual. Residuals 1–7 are accepted as source-scope/evidence limitations, with residual 3 retained as a release-readiness condition: multi-selector targets are supported by backend identity/request construction yet blocked by the new UI. This follows the explicit brief. No production inventory proves whether deployed targets are affected; an authorized release operator must establish usable stop coverage before deployment. Overview masking remains an explicit unbound omission, not full-surface completion. Checks independently run: PASS account_config_label, display_names, desk_switch_targets, desk_n1_projection, console_account_state, reconciliation_material_presentation, account_settings_state, facts totals/history currencies/source lineage, runtime-daily multi-target/worker/health, frontend i18n, light/dark tokens, Desk mocks, Python display names (4), digest roster (6), unified digest presentation (27), generator check, TypeScript/Vite/budget, asset validation and documentation style (one advisory). E2/E3 reproduce red on head and green on base. Full desk_readback, account_facts, broker_executions and the console operations aggregate encounter sandbox localhost Required owner decision: widen the binding to the three test files named above, fix B1–B3, and require the already-bound Desk fallback correction for B4. Two test fixes alone do not clear this review. Review the resulting new head and obtain green required checks in a suitable environment. This receipt grants no merge or deployment authority. The supplied checkout remains clean at the exact reviewed head. No tracked edits or external mutations were made. |
|
Owner decision recorded by the coordinator (2026-11-14, in the main conversation): the owner approved the Astra review's required decision verbatim — widen the binding to the three test files named in the review ( This approval covers the fix implementation on this branch only. It is not a merge approval; merge will be requested separately on the resulting head after a fresh review. |
AI assistance
Claude Code, model Claude Opus 5.5 (
claude-opus-5-5). Implementation of the owner-approved (2026-11-14) presentation fix scoped by the read-only alias audits.What changed
Display-only change: on authenticated surfaces an IBKR account is named by its validated broker account ID instead of a strategy-derived key, label or target name.
ibkrAccountName(option)inlib/accountDirectory.tsreturns the matched option'saccount_selectoronly when it is a complete IBKR ID (^(?:U|DU)[0-9]+$, the same rule account facts use).useDisplayNames().account()gives it precedence foribkr; when it is missing or invalid it returns the new localizedcommon.account_id_unavailable("Account ID unavailable" / "账户号不可用"). Label sanitization for other platforms is unchanged.OverviewPage.tsx) and the cockpit decision card (cockpit.tsx) now use the shared resolver. The queue also shows the platform as its own field.loadRunControlsand the response identity check still use the internal key. The non-IBKR challenge is unchanged.accounts.jsgainsaccountRef(), shared withswitch_targets.js(its duplicate helper and label map are removed): IBKR targets with a valid selector return the full ID asaccount_ref; other cases keep the masked form.readback.jsshows valid raw IBKR selector values in full, keeps the mask otherwise, and keeps full-value comparison and unknown-state rules. Target IDs,account_suffixand schema types are unchanged. Desk overview rows (overview.js, outside the binding) still show the masked form.account_aliases.soxlandaccount_aliases.tqqq, then regenerateddisplay_names_data.jsandpython/scripts/display_names.jsonwithbuild_display_names.py.account-options.example.jsonuses syntheticU00000001/U00000002inaccount_selectorandlabel. The READMEs replaceDEMO_IBKR_PRIMARYand explainkeyvsaccount_selectorvsstrategy_profile. Compatibility notes were added todocs/display-names.md,docs/console-api.md,docs/console-information-design.zh-CN.md, and the unfrozen header ofdocs/desk-api-contract-v1-frozen.md(frozen bytes unchanged; the SHA check passes).account_config_label_validation.mjswas rewritten: valid U, DU paper, 17 missing/invalid selector forms, platform isolation, unchanged selection/lookup/grouping identity, plus a ControlsTab harness asserting the challenge, the blocked state and unchanged request bodies. Desk switch-targets, N1 and readback validations were extended. Display-name tests (Node and Python) assert that the SOXL/TQQQ removal leaves other aliases intact.How verified
npm run build+npm run sync:v2-assets(frontend) +node tests/console_v2_assets_validation.mjs: passnpm run test:operations(console; includes the i18n, tokens/theme, desk mock and cockpit validations): passpython3 python/scripts/build_display_names.py --check,build_config.py --check,build_platform_config.py --check,runtime_settings.py validate: passpython3 -m unittest discover -s python/tests: 1205 tests OK (10 skipped), including the digest roster and Cloud Run digest regressionspython scripts/check_style.py: 0 blocking.check:style-guards: 1 warn-only finding, the same one as onmainnodecommands fromvalidate.yml, compared against a cleanmainworktree: two new failures (below). The other failures also fail onmainlocally (git-history/release-pin checks absent from this clone), or are Node 24 rejecting--experimental-default-type; those pass with the flag removed.ControlsTab.tsx.Known failing (binding exceptions, not edited):
tests/console_grouping_runs_validation.mjs:85(run byconsole_design_api_validation.mjs) expects IBKR accounts without a selector to display their labels ("Alpha"/"Zulu"). They now show "Account ID unavailable".tests/website_mobile_gaps_validation.mjs:108expects an unconfigured IBKR account to display its raw alias. It now shows "Account ID unavailable".Both pin the old behavior that this change removes. They need synthetic valid selectors or updated expectations; that is outside this PR's file binding and needs owner approval.
Why
soxl/tqqqand similar strategy-family names were shown as IBKR account names through option labels/keys, generated account aliases, rawaccount_aliasrenderers and masked Desk refs. The owner asked for the native broker ID instead, without renaming the internal key.Risk
Presentation-only. No changed path is CODEOWNERS-protected.
account_alias/option.key, selection values, platform/key lookups, settings identity, target IDs, source IDs, request shapes, history grouping, facts joins, runtime-daily fingerprints and amounts are unchanged; the tests above assert this where it is observable. Behavior changes to note:console_desk_mock_validation.mjs(unbound) pins that format.No labels, merge or deploy. Draft until the binding exceptions are resolved.
🤖 Generated with Claude Code