-
Notifications
You must be signed in to change notification settings - Fork 3
fix(build-959): lock(stateLock) remediation for RETEST dict mutations #29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
7fc6b4b
2c337a7
e35028f
ad60a17
13a2218
2a5781f
c8037b4
b24e1c8
0682e04
c5c4c20
becfe5c
ca5a04b
7037990
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,47 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: Codex Pre-Triage PR Audit | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pull_request: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| types: [opened, synchronize, reopened] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| branches: [main, master] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pull-requests: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| codex-audit: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout repository | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fetch-depth: 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Setup Python | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/setup-python@v5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| python-version: "3.11" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install Aider (OpenAI CLI) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: pip install aider-chat | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Run Codex Audit via OpenAI | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Use Aider in headless mode to execute the audit using GPT-4o | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| aider --model gpt-4o --no-auto-commits --yes-always --message "Execute audit mission: .agent/brain/codex_pr25_audit.md. Read the workflows and write the final P1/P2/P3 severity report safely to audit_output.md without modifying any source files." > audit_output.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hardcoded PR-specific audit file breaks all future runs The Aider command hardcodes Additionally, Consider parameterizing the audit file path using the PR number or a generic default audit brief, and capturing only the written aider --model gpt-4o --no-auto-commits --yes-always \
--message "Execute audit mission: .agent/brain/generic_pr_audit.md. Write the final P1/P2/P3 severity report to audit_output.md without modifying any source files."
Comment on lines
+34
to
+35
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Use Aider in headless mode to execute the audit using GPT-4o | |
| aider --model gpt-4o --no-auto-commits --yes-always --message "Execute audit mission: .agent/brain/codex_pr25_audit.md. Read the workflows and write the final P1/P2/P3 severity report safely to audit_output.md without modifying any source files." > audit_output.md | |
| # Use Aider in headless dry-run mode to execute the audit using GPT-4o without modifying any files | |
| aider --model gpt-4o --no-auto-commits --dry-run --message "Execute audit mission: .agent/brain/codex_pr25_audit.md. Read the workflows and write the final P1/P2/P3 severity report safely to audit_output.md without modifying any source files." > audit_output.md |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Point audit workflow to an existing mission file
The workflow hardcodes .agent/brain/codex_pr25_audit.md in the Aider prompt, but that file is not present in this repository (repo-wide file search only finds .agent/workflows/multi_agent_audit.md), so the audit job cannot follow the intended mission brief and can produce inconsistent or generic review output. Update this path to a real checked-in mission document (or add the missing file).
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
In GitHub Actions, do later steps run by default after a previous step fails, and are repository secrets available to pull_request workflows from forks?
💡 Result:
-
Do later steps run after a step fails (by default)? No. Steps effectively have an implicit condition of
if: success(), so after a failure, subsequent steps are skipped unless you override that (e.g., withif: always()/if: failure()or by marking the failing stepcontinue-on-error: true). [1] -
Are repository secrets available to
pull_requestworkflows from forks? No. Forpull_requestevents from forked repositories, GitHub does not provide repository secrets (and theGITHUB_TOKENis read-only). [2] [3]
Add if: always() to the PR comment step and mark the audit step with continue-on-error: true.
If the audit step fails, the PR comment step is skipped by default (GitHub Actions implicitly uses if: success() on each step). This causes the workflow to exit silently without notifying reviewers of the failure.
Additionally, the OPENAI_API_KEY secret will not be available when the workflow runs on pull requests from forked repositories, causing the audit to fail immediately with no way to post a failure notice to the PR without the fix.
Suggested hardening
- name: Run Codex Audit via OpenAI
+ id: audit
+ continue-on-error: true
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
# Use Aider in headless mode to execute the audit using GPT-4o
aider --model gpt-4o --no-auto-commits --yes-always --message "Execute audit mission: .agent/brain/codex_pr25_audit.md. Read the workflows and write the final P1/P2/P3 severity report safely to audit_output.md without modifying any source files." > audit_output.md
- name: Post Audit Results to PR
+ if: always()
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ AUDIT_OUTCOME: ${{ steps.audit.outcome }}
run: |
- if [ -f audit_output.md ]; then
+ if [ -s audit_output.md ]; then
gh pr comment ${{ github.event.pull_request.number }} --body-file audit_output.md
else
- echo "Audit output file not found."
- # Fallback if Aider stdout'd it instead
- gh pr comment ${{ github.event.pull_request.number }} --body "The OpenAI audit finished, but the markdown file was not saved correctly. Please check action logs."
+ gh pr comment ${{ github.event.pull_request.number }} --body "Codex audit ${AUDIT_OUTCOME}. Please check the workflow logs."
fi📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - name: Run Codex Audit via OpenAI | |
| env: | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| run: | | |
| # Use Aider in headless mode to execute the audit using GPT-4o | |
| aider --model gpt-4o --no-auto-commits --yes-always --message "Execute audit mission: .agent/brain/codex_pr25_audit.md. Read the workflows and write the final P1/P2/P3 severity report safely to audit_output.md without modifying any source files." > audit_output.md | |
| - name: Post Audit Results to PR | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| if [ -f audit_output.md ]; then | |
| gh pr comment ${{ github.event.pull_request.number }} --body-file audit_output.md | |
| else | |
| echo "Audit output file not found." | |
| # Fallback if Aider stdout'd it instead | |
| gh pr comment ${{ github.event.pull_request.number }} --body "The OpenAI audit finished, but the markdown file was not saved correctly. Please check action logs." | |
| fi | |
| - name: Run Codex Audit via OpenAI | |
| id: audit | |
| continue-on-error: true | |
| env: | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| run: | | |
| # Use Aider in headless mode to execute the audit using GPT-4o | |
| aider --model gpt-4o --no-auto-commits --yes-always --message "Execute audit mission: .agent/brain/codex_pr25_audit.md. Read the workflows and write the final P1/P2/P3 severity report safely to audit_output.md without modifying any source files." > audit_output.md | |
| - name: Post Audit Results to PR | |
| if: always() | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| AUDIT_OUTCOME: ${{ steps.audit.outcome }} | |
| run: | | |
| if [ -s audit_output.md ]; then | |
| gh pr comment ${{ github.event.pull_request.number }} --body-file audit_output.md | |
| else | |
| gh pr comment ${{ github.event.pull_request.number }} --body "Codex audit ${AUDIT_OUTCOME}. Please check the workflow logs." | |
| fi |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/codex-audit.yml around lines 30 - 47, Update the workflow
so the "Run Codex Audit via OpenAI" step is allowed to fail without stopping the
job by adding continue-on-error: true to that step, and ensure the "Post Audit
Results to PR" step is always executed by adding if: always() to it; reference
the step names "Run Codex Audit via OpenAI" and "Post Audit Results to PR" when
locating the changes, and keep the existing env usage (OPENAI_API_KEY remains
for the audit step while GH_TOKEN stays for the PR comment) so that even if the
audit fails (or the API key is unavailable for forked PRs) the PR comment step
still runs to post a failure notice.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| name: Gemini PR Auditor | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, synchronize, reopened] | ||
|
|
||
| jobs: | ||
| gemini-audit: | ||
| name: Gemini 2.5 Pro (High) Auto-Auditor | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| pull-requests: write | ||
|
|
||
| steps: | ||
| - name: Checkout Code | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: Extract PR diff | ||
| id: diff | ||
| run: | | ||
| git diff origin/${{ github.event.pull_request.base.ref }}...HEAD > pr.diff | ||
|
|
||
| - name: Authenticate to Google Cloud | ||
| id: auth | ||
| uses: google-github-actions/auth@v2 | ||
| with: | ||
| credentials_json: "${{ secrets.GCP_CREDENTIALS }}" | ||
|
|
||
| - name: Setup Node.js | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: "20" | ||
|
|
||
| - name: Install Vertex AI SDK | ||
| run: npm install @google-cloud/vertexai | ||
|
Comment on lines
+26
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: # First, let's locate and read the actual workflow file
find . -name "gemini-pr-audit.yml" -type f 2>/dev/null | head -20Repository: mkalhitti-cloud/universal-or-strategy Length of output: 120 🏁 Script executed: # Also check if the file path matches what was mentioned
ls -la .github/workflows/gemini-pr-audit.yml 2>/dev/null || echo "File not found at expected path"Repository: mkalhitti-cloud/universal-or-strategy Length of output: 167 🏁 Script executed: # If found, read the complete workflow file with line numbers
if [ -f .github/workflows/gemini-pr-audit.yml ]; then
wc -l .github/workflows/gemini-pr-audit.yml
echo "---"
cat -n .github/workflows/gemini-pr-audit.yml
fiRepository: mkalhitti-cloud/universal-or-strategy Length of output: 4309 🌐 Web query:
💡 Result:
How credentials are made available to later steps
Outputs / tokensThe action always outputs an Service Account key handling (
|
||
|
|
||
| - name: Run Vertex AI Audit and Post Comment | ||
| uses: actions/github-script@v7 | ||
| env: | ||
| GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }} | ||
| GCP_REGION: us-central1 | ||
| with: | ||
| script: | | ||
| const fs = require('fs'); | ||
| const { VertexAI } = require('@google-cloud/vertexai'); | ||
|
|
||
| const diffContent = fs.readFileSync('pr.diff', 'utf8'); | ||
| let geminiMdContent = ''; | ||
| try { | ||
| geminiMdContent = fs.readFileSync('GEMINI.md', 'utf8'); | ||
| } catch (e) { | ||
| console.log('GEMINI.md not found in the root directory, proceeding without it.'); | ||
| } | ||
|
|
||
| const prompt = `You are the Gemini CLI (Antigravity Auto-Auditor) acting as a PR reviewer. | ||
| Your task is to analyze the following PR diff strictly against our project's GEMINI.md standards (Zero-Trust IPC, FSM mutations, etc.). | ||
|
|
||
| Here are the GEMINI.md standards: | ||
| ${geminiMdContent} | ||
|
|
||
| Here is the pull request diff: | ||
| ${diffContent} | ||
|
|
||
| Provide a systematic review of the changes: | ||
| 1. Evaluate strict adherence to the standards (e.g., FSM replace pattern vs cancel+submit, lock guards, headless UI rules). | ||
| 2. Point out any violations of the standard with specific file and line context. | ||
| 3. If the code is perfectly aligned, state that it passes the Zero-Regression Bot Audit. | ||
|
|
||
| Be thorough, precise, and uncompromising on the rules.`; | ||
|
Comment on lines
+50
to
+72
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cd .github/workflows && wc -l gemini-pr-audit.ymlRepository: mkalhitti-cloud/universal-or-strategy Length of output: 103 🏁 Script executed: cat -n .github/workflows/gemini-pr-audit.ymlRepository: mkalhitti-cloud/universal-or-strategy Length of output: 4264 🏁 Script executed: rg "Vertex|vertex|API|model|token|limit" .github/workflows/gemini-pr-audit.yml -A 2Repository: mkalhitti-cloud/universal-or-strategy Length of output: 1027 🌐 Web query:
💡 Result: Gemini 3.1 Pro (gemini-3.1-pro-preview) supports a 1,048,576-token (≈1M) input context window (input token limit) and can generate up to 65,536 output tokens per request. [1][2] 🌐 Web query:
💡 Result: On Vertex AI, the (preview) Gemini 3.1 Pro model endpoint Google’s Vertex AI docs also note that Sources: [1] [2] 🏁 Script executed: ls -lh GEMINI.md 2>/dev/null || echo "GEMINI.md not found"Repository: mkalhitti-cloud/universal-or-strategy Length of output: 139 🏁 Script executed: if [ -f GEMINI.md ]; then wc -c GEMINI.md; else echo "File does not exist"; fiRepository: mkalhitti-cloud/universal-or-strategy Length of output: 95 Consider adding input size validation before sending to Vertex AI. While Gemini 3.1 Pro supports a 1M-token context window (~4.2MB), the code currently inlines 🤖 Prompt for AI Agents |
||
|
|
||
| const vertex_ai = new VertexAI({project: process.env.GCP_PROJECT_ID, location: process.env.GCP_REGION}); | ||
| // Gemini 2.5 Pro via Vertex AI | ||
| const generativeModel = vertex_ai.preview.getGenerativeModel({ | ||
| model: 'gemini-2.5-pro', | ||
| }); | ||
|
|
||
| let reviewText = ''; | ||
| try { | ||
| const resp = await generativeModel.generateContent({ | ||
| contents: [{role: 'user', parts: [{text: prompt}]}], | ||
| }); | ||
| reviewText = resp.response.candidates[0].content.parts[0].text; | ||
| } catch (error) { | ||
| console.error("Error calling Vertex AI API:", error); | ||
| reviewText = "⚠️ **Vertex AI Audit Failed to Execute**: " + error.message; | ||
| } | ||
|
|
||
| await github.rest.issues.createComment({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| issue_number: context.issue.number, | ||
| body: "### 🤖 Antigravity Auto-Auditor (Gemini 2.5 Pro via Vertex AI)\n\n" + reviewText | ||
| }); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -785,7 +785,19 @@ private void LoadConfig() | |
| selectedTargetCount = activeCount; | ||
|
|
||
| Button modeBtn = GetModeButton(activeMode); | ||
| if (modeBtn != null) HighlightModeButton(modeBtn); | ||
| if (modeBtn != null) | ||
| { | ||
| HighlightModeButton(modeBtn); | ||
| } | ||
| else | ||
| { | ||
| // [Build 954]: Saved mode is deprecated/unrecognized -- normalize both vars to RMA baseline. | ||
| Print("[WARN][954] Unrecognized saved mode '" + activeMode + "' -- falling back to RMA."); | ||
| activeMode = "RMA"; | ||
| selectedConfigMode = "RMA"; | ||
| modeBtn = GetModeButton("RMA"); | ||
| if (modeBtn != null) HighlightModeButton(modeBtn); | ||
| } | ||
|
Comment on lines
787
to
+800
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The new unknown-mode fallback is effectively unreachable.
🤖 Prompt for AI Agents |
||
|
|
||
| // Apply active mode+count settings to UI | ||
| ApplySettings(fullConfig.GetSettings(activeMode, activeCount)); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -171,7 +171,7 @@ private void ExecuteRetestEntry(int contracts) | |
| }; | ||
| ApplyTargetLadderGuard(pos); | ||
|
|
||
| activePositions[entryName] = pos; | ||
| lock (stateLock) { activePositions[entryName] = pos; } | ||
|
|
||
| // Build 1102Y-V3 [MS-07]: Register Master expected BEFORE Limit entry. | ||
| int masterDeltaRetest = (direction == MarketPosition.Long) ? contracts : -contracts; | ||
|
|
@@ -185,10 +185,12 @@ private void ExecuteRetestEntry(int contracts) | |
| if (entryOrder == null) | ||
| { | ||
| AddExpectedPositionDeltaLocked(ExpKey(Account.Name), -masterDeltaRetest); | ||
| lock (stateLock) { activePositions.TryRemove(entryName, out _); } // [Build 956]: Clean pre-registered state on null submit. | ||
| Print("[ERROR][1102Y-V3] RETEST SubmitOrderUnmanaged NULL for " + entryName + " -- rolled back."); | ||
| return; // [Build 954]: Do not latch session or dispatch SIMA for a failed order. | ||
| } | ||
|
|
||
| entryOrders[entryName] = entryOrder; | ||
| lock (stateLock) { entryOrders[entryName] = entryOrder; } | ||
|
Comment on lines
185
to
+193
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. PR description claims "No logic changes" but The PR description states: "No logic changes -- However, the diff clearly shows both
The same issue and fix apply identically to
Comment on lines
174
to
+193
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Split lock window exposes partially-registered state to callbacks The three lock (stateLock) { activePositions[entryName] = pos; } // Lock #1
Order entryOrder = SubmitOrderUnmanaged(...); // Callbacks can fire here
lock (stateLock) { entryOrders[entryName] = entryOrder; } // Lock #3Between Lock #1 and Lock #3, any callback that iterates This is the same pattern in both The window is structurally unavoidable because |
||
| retestFiredThisSession = true; // V12.1101E [B-2]: Arm latch -- no further RETEST entries this session | ||
|
|
||
| Print(string.Format("RETEST ENTRY ORDER: {0} {1}@{2:F2} | ATR: {3:F2}", signalName, contracts, entryPrice, currentATR)); | ||
|
|
@@ -311,7 +313,7 @@ private void ExecuteRetestManualEntry(double manualPrice, MarketPosition directi | |
| }; | ||
| ApplyTargetLadderGuard(pos); | ||
|
|
||
| activePositions[entryName] = pos; | ||
| lock (stateLock) { activePositions[entryName] = pos; } | ||
|
|
||
| // Build 1102Y-V3 [MS-08]: Register Master expected BEFORE Limit entry. | ||
| int masterDeltaRetestMnl = (direction == MarketPosition.Long) ? contracts : -contracts; | ||
|
|
@@ -325,9 +327,11 @@ private void ExecuteRetestManualEntry(double manualPrice, MarketPosition directi | |
| if (entryOrder == null) | ||
| { | ||
| AddExpectedPositionDeltaLocked(ExpKey(Account.Name), -masterDeltaRetestMnl); | ||
| lock (stateLock) { activePositions.TryRemove(entryName, out _); } // [Build 956]: Clean pre-registered state on null submit. | ||
| Print("[ERROR][1102Y-V3] RETEST_MANUAL SubmitOrderUnmanaged NULL for " + entryName + " -- rolled back."); | ||
| return; // [Build 956]: Do not assign null entryOrder or dispatch SIMA for a failed order. | ||
| } | ||
| entryOrders[entryName] = entryOrder; | ||
| lock (stateLock) { entryOrders[entryName] = entryOrder; } | ||
|
|
||
| Print(string.Format("V12.27 RETEST_MANUAL: {0} {1}@{2:F2} LIMIT | Stop: {3:F2} | RMA Targets", | ||
| direction, contracts, entryPrice, stopPrice)); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pip install aider-chatinstalls the latest version without pinning. This could cause unpredictable CI behavior if theaider-chatpackage releases a breaking change. Consider pinning to a specific version (e.g.,pip install aider-chat==0.XX.Y).