fix(ribbon): report a repeated engine prime failure once per engine and failure kind - #969
Merged
drmoisan merged 19 commits intoOct 2, 2026
Conversation
…plan not yet cleared) Work in progress committed on coordinator instruction. Research and spec are complete; the atomic plan was still being authored and preflight has not run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcieP6KJzhzgHkRh4F21Po
… stop) The plan is marked INCOMPLETE: stopped for quota. Phase task lists, command blocks and the internal review record are not yet written; preflight has not run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcieP6KJzhzgHkRh4F21Po
…r quota Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcieP6KJzhzgHkRh4F21Po
…e 947 landing order Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d spec to 1.3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ALL CLEAR) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflict in .claude/agent-memory/task-researcher/MEMORY.md resolved by taking the main index and re-adding the 948 research entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ciliation merge Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…-offs on maintainer request Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…he repeat fault suppression fix Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…sue 948) Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…comparison, stopped at P3-T10 for a plan correction Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…he branch row because the collector writes binary line hits Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…3-T10 resume and the not-lowered statement Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…-results version label Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…idence Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
…blocking) Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
This was referenced Oct 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Suggested title
fix(ribbon): report a repeated engine prime failure once per engine and failure kind
Summary
EngineToggleStateCoordinator.CompletePrimenow reports a prime failure once per pair of engine key and base-exception type. A permanent configuration fault no longer writes one error log entry on every ribbongetPressedpoll.Why
A prime of the engine toggle state that faults for a persistent reason (for example a missing configuration) re-ran on every
getPressedpoll, and each run reported the same failure throughlogError. The log filled with identical entries for the life of the session. The fix keeps the re-prime behaviour, so a later successful prime still caches the state and invalidates the control once, and suppresses only the repeated report.What Changed
Production (
TaskMaster/Ribbon/EngineToggleStateCoordinator.cs, 496 lines):_reportedPrimeFaults, aConcurrentDictionary<(string EngineName, Type FaultType), byte>.CompletePrimewraps the existing sink guard inif (!_reportedPrimeFaults.ContainsKey(reportKey))and records the pair after the sink call returns._primeTasks.TryRemove(engineName, out _)stays the last statement, so the report-then-clear ordering is preserved.BuildPrimeFailedMessageappends one sentence. The leading text is unchanged.CompletePrimesummary, one new remarks paragraph, the report-then-clear comment, and theGetPrimeTaskreturns element.Tests:
TaskMaster.Test/Ribbon/EngineToggleStateCoordinatorTests.RepeatFaultSuppression.cs(290 lines, seven[TestMethod]methods), registered inTaskMaster.Test/TaskMaster.Test.csproj.Documentation and evidence (feature folder
docs/features/active/2026-09-30-engine-toggle-permanent-config-fault-logs-every-poll-948/):Architecture / How It Fits Together
RibbonControllercallsGetPressedfor each engine toggle. On an uncached key,StartPrimeIfNeededregisters an in-flight marker and starts one prime;CompletePrimeobserves its outcome. At most one prime per key is in flight, because a new prime starts only after the marker is removed, and the marker is removed only by the last statement ofCompletePrime. The unlocked check-then-record on_reportedPrimeFaultstherefore cannot race for a given key.HandleToggleClickAsyncdoes not read the new dictionary.Verification
Completed (recorded in the feature folder evidence):
dotnet tool run csharpier format .anddotnet tool run csharpier check .(no changes);msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true(0 errors, 0 warnings);msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true(0 errors, 0 warnings); repository test-and-coverage run, 7361 of 7361 passed.Recommended:
Backward Compatibility / Migration Notes
Risks and Mitigations
Review Guide
TaskMaster/Ribbon/EngineToggleStateCoordinator.cs: theCompletePrimebody and the new field.TaskMaster.Test/Ribbon/EngineToggleStateCoordinatorTests.RepeatFaultSuppression.cs.TaskMaster.Test/TaskMaster.Test.csproj(one line).docs/features/active/2026-09-30-engine-toggle-permanent-config-fault-logs-every-poll-948/spec.mdand the three review artifacts in that folder. The remaining feature-folder files are execution evidence.The branch also carries three agent-memory files committed by the preparation passes and the promotion record under
docs/features/potential/promoted/.Follow-ups
These are listed here for the coordinator to file; none were filed from this branch.
EngineToggleStateCoordinatorTests.Race.cslines 196 to 201: the remark says the re-prime logs a second error; it is now a suppressed repeat.EngineToggleStateCoordinator.cs(496 lines) and the primary fixture (470 lines) before the next change to either; this overlaps the pending review-residuals item for the 947 change.CompletePrimecomment._notifyUnavailableat line 186 remains unguarded (pre-existing, from the 947 review).Timestamp:labels in the plan payload convention are not clock-derived; derive them from the clock.GitHub Auto-close
🤖 Generated with Claude Code