Skip to content

Agent belt for #31#256

Merged
stranske merged 22 commits intomainfrom
codex/issue-31
Feb 26, 2026
Merged

Agent belt for #31#256
stranske merged 22 commits intomainfrom
codex/issue-31

Conversation

@agents-workflows-bot
Copy link
Copy Markdown
Contributor

@agents-workflows-bot agents-workflows-bot bot commented Feb 25, 2026

Source: Issue #31

Automated Status Summary

Scope

You want to generate new output types as maintainers change their minds (slides, extra exhibits, etc.) without rewiring everything.

Tasks

  • Create src/counter_risk/outputs/base.py defining an OutputGenerator interface for output plugins.
  • Update the historical workbook updater to implement OutputGenerator.
    • Create a new class that wraps the historical workbook updater logic (verify: confirm completion in repo) implements the OutputGenerator interface (verify: confirm completion in repo)
    • Define scope for: Refactor the existing historical workbook update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Implement focused slice for: Refactor the existing historical workbook update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Validate focused slice for: Refactor the existing historical workbook update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Define scope for: Add unit tests to verify the historical workbook OutputGenerator produces the same output as before
    • Implement focused slice for: Add unit tests to verify the historical workbook OutputGenerator produces the same output as before
    • Validate focused slice for: Add unit tests to verify the historical workbook OutputGenerator produces the same output as before
    • Define scope for: Update any calling code to use the new OutputGenerator interface for the historical workbook (verify: confirm completion in repo)
    • Implement focused slice for: Update any calling code to use the new OutputGenerator interface for the historical workbook (verify: confirm completion in repo)
    • Validate focused slice for: Update any calling code to use the new OutputGenerator interface for the historical workbook (verify: confirm completion in repo)
  • Update the PPT screenshot updater to implement OutputGenerator.
    • Create a new class that wraps the PPT screenshot updater logic (verify: confirm completion in repo)
    • Define scope for: Refactor the existing PPT screenshot update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Implement focused slice for: Refactor the existing PPT screenshot update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Validate focused slice for: Refactor the existing PPT screenshot update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Define scope for: Add unit tests to verify the PPT screenshot OutputGenerator produces the same output as before
    • Implement focused slice for: Add unit tests to verify the PPT screenshot OutputGenerator produces the same output as before
    • Validate focused slice for: Add unit tests to verify the PPT screenshot OutputGenerator produces the same output as before
    • Define scope for: Update any calling code to use the new OutputGenerator interface for the PPT screenshot updater (verify: confirm completion in repo)
    • Implement focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT screenshot updater (verify: confirm completion in repo)
    • Validate focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT screenshot updater (verify: confirm completion in repo)
  • Update the PPT link refresher to implement OutputGenerator.
    • Create a new class that wraps the PPT link refresher logic (verify: confirm completion in repo)
    • Define scope for: Refactor the existing PPT link refresh code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Implement focused slice for: Refactor the existing PPT link refresh code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Validate focused slice for: Refactor the existing PPT link refresh code to use the new OutputGenerator-based class (verify: confirm completion in repo)
    • Define scope for: Add unit tests to verify the PPT link refresher OutputGenerator produces the same output as before
    • Implement focused slice for: Add unit tests to verify the PPT link refresher OutputGenerator produces the same output as before
    • Validate focused slice for: Add unit tests to verify the PPT link refresher OutputGenerator produces the same output as before
    • Define scope for: Update any calling code to use the new OutputGenerator interface for the PPT link refresher (verify: confirm completion in repo)
    • Implement focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT link refresher (verify: confirm completion in repo)
    • Validate focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT link refresher (verify: confirm completion in repo)
  • Add a PDF export generator that uses PowerPoint export via COM if available; otherwise skips with a warning.
    • Create a PDFExportGenerator class that implements the OutputGenerator interface with method stubs (verify: confirm completion in repo)
    • Define scope for: Implement COM availability detection logic to check if PowerPoint COM interface is accessible (verify: confirm completion in repo)
    • Implement focused slice for: Implement COM availability detection logic to check if PowerPoint COM interface is accessible (verify: confirm completion in repo)
    • Validate focused slice for: Implement COM availability detection logic to check if PowerPoint COM interface is accessible (verify: confirm completion in repo)
    • Add PowerPoint to PDF export functionality using COM automation when available (verify: confirm completion in repo)
    • Implement graceful fallback behavior that logs a warning (verify: confirm completion in repo) skips PDF generation when COM is unavailable (verify: confirm completion in repo)
    • Add unit tests for the PDF export generator covering both COM available (verify: tests pass) unavailable scenarios (verify: confirm completion in repo)
  • Add configuration to enable/disable specific outputs per run and register output generators via config.
    • Define configuration schema for output generators including enable/disable flags (verify: config validated)
    • Define configuration schema for output generators including registration details (verify: config validated)
    • Implement a registry mechanism that loads (verify: confirm completion in repo) stores OutputGenerator instances from configuration (verify: config validated)
    • Add runtime logic to filter enabled output generators based on configuration settings (verify: config validated)
    • Update configuration documentation to explain how to register (verify: docs updated) enable/disable output generators (verify: confirm completion in repo)
    • Add integration tests that verify outputs can be selectively enabled disabled via configuration (verify: config validated)

Acceptance criteria

  • Implementing a single OutputGenerator class and registering it in config adds a new output without requiring changes to other outputs.
  • Disabling an output via config does not break the pipeline run.

@agents-workflows-bot
Copy link
Copy Markdown
Contributor Author

Agent worker (codex) activated for branch codex/issue-31.

@codex start
Focus on this task first: task-01 — Create src/counter_risk/outputs/base.py defining an OutputGenerator interface for output plugins.

Implement only this task in your first commit.
Ensure the code compiles and existing tests pass before moving on.
The keepalive loop will assign subsequent tasks after this one is complete.

@agents-workflows-bot
Copy link
Copy Markdown
Contributor Author

agents-workflows-bot bot commented Feb 25, 2026

🤖 Keepalive Loop Status

PR #256 | Agent: Codex | Iteration 5+10 🚀 extended

Current State

Metric Value
Iteration progress [##########] 5/5 5 base + 10 extended = 15 total
Action stop (tasks-complete)
Agent status ✅ ALL TASKS COMPLETE
Gate success
Tasks 51/51 complete
Timeout 45 min (default)
Timeout usage 11m elapsed (27%, 34m remaining)
Keepalive ✅ enabled
Autofix ❌ disabled

🔍 Failure Classification

| Error type | infrastructure |
| Error category | unknown |
| Suggested recovery | Capture logs and context; retry once and escalate if the issue persists. |

@agents-workflows-bot
Copy link
Copy Markdown
Contributor Author

agents-workflows-bot bot commented Feb 25, 2026

Keepalive Work Log (click to expand)
# Time (UTC) Agent Action Result Files Tasks Progress Commit Gate
0 2026-02-25 23:06:12 Codex wait (gate-pending-transient) skipped 0 0/51
1 2026-02-25 23:14:42 Codex run (bypass-rate-limit-gate) success 6 file(s) +1 1/51 efed607 cancelled
2 2026-02-25 23:31:12 Codex run (ready) success 5 file(s) +11 12/51 8ceb157 success
3 2026-02-25 23:54:13 Codex run (ready) success 5 file(s) 0 12/51 40a6138 success
4 2026-02-26 00:13:18 Codex run (ready) success 5 file(s) 0 12/51 7c1fe85 success
5 2026-02-26 00:39:28 Codex fix (fix-mypy) success 5 file(s) 0 12/51 70aaaef failure
5 2026-02-26 00:42:50 Codex conflict (merge-conflict-github-api) success 5 file(s) 0 12/51 073de24 failure
5 2026-02-26 01:06:48 Codex fix (agent-run-failed) failure 5 file(s) 0 12/51 failure
5 2026-02-26 01:07:28 Codex stop (max-iterations-unproductive) skipped 0 12/51 success
5 2026-02-26 01:08:09 Codex wait (gate-pending-transient) skipped 0 12/51
5 2026-02-26 01:08:47 Codex wait (gate-pending-transient) skipped 0 12/51
6 2026-02-26 01:23:39 Codex run (bypass-rate-limit-gate) success 5 file(s) 0 12/51 929eded cancelled
6 2026-02-26 01:24:11 Codex review (progress-review-10) skipped 0 12/51 success
6 2026-02-26 01:31:19 Codex review (progress-review-11) skipped 0 12/51 success
7 2026-02-26 02:25:12 Codex run (force-retry-gate) retry success 5 file(s) 0 12/51 1a8f73d
8 2026-02-26 02:49:40 Codex run (bypass-rate-limit-gate) success 5 file(s) +11 23/51 6d5f55d cancelled
9 2026-02-26 03:02:26 Codex run (ready-extended) success 5 file(s) +11 34/51 955ae4e success
10 2026-02-26 03:19:48 Codex fix (fix-mypy) success 5 file(s) 0 34/51 b1b4574 failure
10 2026-02-26 03:20:21 Codex wait (gate-not-success) skipped 0 34/51 failure
11 2026-02-26 03:36:24 Codex run (ready-extended) success 9 file(s) +8 42/51 780914d success
12 2026-02-26 04:16:10 Codex fix (fix-mypy) success 8 file(s) 0 42/51 6b93a83 failure
12 2026-02-26 04:16:44 Codex wait (gate-not-success) skipped 0 42/51 failure
13 2026-02-26 04:39:04 Codex run (ready-extended) success 5 file(s) +9 51/51 433e11c success
14 2026-02-26 05:05:25 Claude run (verify-acceptance) success 0 51/51 success
15 2026-02-26 05:05:36 Codex fix (fix-mypy) success 4 file(s) 0 51/51 failure
15 2026-02-26 05:06:11 Codex stop (tasks-complete) skipped 0 51/51 success

@agents-workflows-bot
Copy link
Copy Markdown
Contributor Author

agents-workflows-bot bot commented Feb 25, 2026

✅ Codex Completion Checkpoint

Iteration: 12
Commit: 433e11c
Recorded: 2026-02-26T04:38:44.356Z

Tasks Completed

  • Create src/counter_risk/outputs/base.py defining an OutputGenerator interface for output plugins.
  • Update the historical workbook updater to implement OutputGenerator.
  • Create a new class that wraps the historical workbook updater logic (verify: confirm completion in repo) implements the OutputGenerator interface (verify: confirm completion in repo)
  • Define scope for: Refactor the existing historical workbook update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Implement focused slice for: Refactor the existing historical workbook update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Validate focused slice for: Refactor the existing historical workbook update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Define scope for: Add unit tests to verify the historical workbook OutputGenerator produces the same output as before
  • Implement focused slice for: Add unit tests to verify the historical workbook OutputGenerator produces the same output as before
  • Validate focused slice for: Add unit tests to verify the historical workbook OutputGenerator produces the same output as before
  • Define scope for: Update any calling code to use the new OutputGenerator interface for the historical workbook (verify: confirm completion in repo)
  • Implement focused slice for: Update any calling code to use the new OutputGenerator interface for the historical workbook (verify: confirm completion in repo)
  • Validate focused slice for: Update any calling code to use the new OutputGenerator interface for the historical workbook (verify: confirm completion in repo)
  • Update the PPT screenshot updater to implement OutputGenerator.
  • Create a new class that wraps the PPT screenshot updater logic (verify: confirm completion in repo)
  • Define scope for: Refactor the existing PPT screenshot update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Implement focused slice for: Refactor the existing PPT screenshot update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Validate focused slice for: Refactor the existing PPT screenshot update code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Define scope for: Add unit tests to verify the PPT screenshot OutputGenerator produces the same output as before
  • Implement focused slice for: Add unit tests to verify the PPT screenshot OutputGenerator produces the same output as before
  • Validate focused slice for: Add unit tests to verify the PPT screenshot OutputGenerator produces the same output as before
  • Define scope for: Update any calling code to use the new OutputGenerator interface for the PPT screenshot updater (verify: confirm completion in repo)
  • Implement focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT screenshot updater (verify: confirm completion in repo)
  • Validate focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT screenshot updater (verify: confirm completion in repo)
  • Update the PPT link refresher to implement OutputGenerator.
  • Create a new class that wraps the PPT link refresher logic (verify: confirm completion in repo)
  • Define scope for: Refactor the existing PPT link refresh code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Implement focused slice for: Refactor the existing PPT link refresh code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Validate focused slice for: Refactor the existing PPT link refresh code to use the new OutputGenerator-based class (verify: confirm completion in repo)
  • Define scope for: Add unit tests to verify the PPT link refresher OutputGenerator produces the same output as before
  • Implement focused slice for: Add unit tests to verify the PPT link refresher OutputGenerator produces the same output as before
  • Validate focused slice for: Add unit tests to verify the PPT link refresher OutputGenerator produces the same output as before
  • Define scope for: Update any calling code to use the new OutputGenerator interface for the PPT link refresher (verify: confirm completion in repo)
  • Implement focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT link refresher (verify: confirm completion in repo)
  • Validate focused slice for: Update any calling code to use the new OutputGenerator interface for the PPT link refresher (verify: confirm completion in repo)
  • Add a PDF export generator that uses PowerPoint export via COM if available; otherwise skips with a warning.
  • Create a PDFExportGenerator class that implements the OutputGenerator interface with method stubs (verify: confirm completion in repo)
  • Define scope for: Implement COM availability detection logic to check if PowerPoint COM interface is accessible (verify: confirm completion in repo)
  • Implement focused slice for: Implement COM availability detection logic to check if PowerPoint COM interface is accessible (verify: confirm completion in repo)
  • Validate focused slice for: Implement COM availability detection logic to check if PowerPoint COM interface is accessible (verify: confirm completion in repo)
  • Add PowerPoint to PDF export functionality using COM automation when available (verify: confirm completion in repo)
  • Implement graceful fallback behavior that logs a warning (verify: confirm completion in repo) skips PDF generation when COM is unavailable (verify: confirm completion in repo)
  • Add unit tests for the PDF export generator covering both COM available (verify: tests pass) unavailable scenarios (verify: confirm completion in repo)
About this comment

This comment is automatically generated to track task completions.
The Automated Status Summary reads these checkboxes to update PR progress.
Do not edit this comment manually.

The merge conflict resolution in 073de24 left an unused `from typing
import Any` in test_normalization_registry_first.py, causing the
lint-ruff Gate check to fail.

https://claude.ai/code/session_01JhCWWDJG8PqwaSbVPCGfm6

Co-authored-by: Claude <noreply@anthropic.com>
@stranske-keepalive
Copy link
Copy Markdown
Contributor

⚠️ Progress Review (Round 10)

Recommendation: REDIRECT
Alignment Score: 4.0/10

Feedback

Review your recent work against the acceptance criteria.


This review was triggered because the agent has been working for 10 rounds without completing any task checkboxes.
The review evaluates whether recent work is advancing toward the acceptance criteria.

@stranske-keepalive
Copy link
Copy Markdown
Contributor

⚠️ Progress Review (Round 11)

Recommendation: REDIRECT
Alignment Score: 4.0/10

Feedback

Review your recent work against the acceptance criteria.


This review was triggered because the agent has been working for 11 rounds without completing any task checkboxes.
The review evaluates whether recent work is advancing toward the acceptance criteria.

stranske pushed a commit that referenced this pull request Feb 26, 2026
parseCheckboxStates() and mergeCheckboxStates() only matched top-level
checkboxes (^- \[), ignoring indented sub-tasks (  - \[). When PR Meta
regenerated the PR body from the issue, auto-reconciled sub-task
checkboxes were silently reverted to unchecked. This caused the keepalive
loop to stall with rounds_without_task_completion: 8 despite the agent
completing real work — PR #256 had 5 tasks auto-checked then immediately
un-checked on every push.

https://claude.ai/code/session_01JhCWWDJG8PqwaSbVPCGfm6
@stranske stranske added the agent:retry Retry agent keepalive loop label Feb 26, 2026
@stranske-keepalive stranske-keepalive bot removed the agent:retry Retry agent keepalive loop label Feb 26, 2026
@stranske stranske self-requested a review as a code owner February 26, 2026 03:54
github-actions bot and others added 4 commits February 26, 2026 04:15
…kbook_output_generator

The _require_parsed_by_variant helper returns Mapping[str, Mapping[str, Any]]
but _build_historical_workbook_output_generator expected dict[str, dict[str, Any]],
causing a mypy arg-type error. Widen to Mapping to match the actual return type.

https://claude.ai/code/session_01JhCWWDJG8PqwaSbVPCGfm6
@stranske stranske merged commit e8adde2 into main Feb 26, 2026
24 checks passed
@stranske stranske added the verify:compare Runs verifier comparison mode after merge label Feb 26, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Provider Comparison Report

Provider Summary

Provider Model Verdict Confidence Summary
openai gpt-5.2 PASS 90% Acceptance criteria are met. The PR introduces a pluggable OutputGenerator Protocol with an OutputContext, a config schema (output_generators with enable/disable + registration + stage), and a regi...
anthropic claude-sonnet-4-5-20250929 PASS 92% The implementation successfully delivers a pluggable output generator architecture that satisfies both acceptance criteria. The code introduces an OutputGenerator protocol, implements four concrete...
📋 Full Provider Details (click to expand)

openai

  • Model: gpt-5.2
  • Verdict: PASS
  • Confidence: 90%
  • Scores:
    • Correctness: 8.0/10
    • Completeness: 9.0/10
    • Quality: 8.0/10
    • Testing: 9.0/10
    • Risks: 7.0/10
  • Summary: Acceptance criteria are met. The PR introduces a pluggable OutputGenerator Protocol with an OutputContext, a config schema (output_generators with enable/disable + registration + stage), and a registry that instantiates generators from builtins or module:symbol registrations. The pipeline run logic is refactored to load and execute generators per stage (historical, ppt_master, ppt_refresh, ppt_post_distribution), and disabling generators via config cleanly skips them without breaking the run (including skipping refresh when omitted/disabled). A PDFExportGenerator is added that uses COM when available and otherwise logs/warns and returns no outputs. Tests cover protocol behavior, each generator wrapper, config parsing/validation (including duplicate names), pipeline behavior for disabled outputs, and the ability to add a new output by registering a single class in config without modifying other outputs.
  • Concerns:
    • OutputContext.warnings is an immutable tuple snapshot, but several generators also receive a mutable warnings list via the registry context; this split source-of-truth could confuse plugin authors and makes it easy to read stale warnings from OutputContext.
    • OutputGeneratorRegistry._validate_output_generator only checks for presence of a generate attribute, not its call signature or return type; a mis-registered plugin could fail at runtime later (though tests cover common paths).
    • Registry name validation allows blank generator.name to bypass mismatch checking (only enforces when generated_name is non-empty); a plugin with missing/blank name could slip through despite config name requirements.
    • PDF export path naming uses the distribution PPT stem; if multiple decks share the same stem across runs/stages it could overwrite within the same run_dir (likely acceptable, but worth noting).
    • PptLinkRefreshOutputGenerator stores last_result via object.setattr on a frozen dataclass; this is intentional but slightly surprising and could complicate future refactors.

anthropic

  • Model: claude-sonnet-4-5-20250929
  • Verdict: PASS
  • Confidence: 92%
  • Scores:
    • Correctness: 9.0/10
    • Completeness: 9.0/10
    • Quality: 9.0/10
    • Testing: 8.0/10
    • Risks: 8.0/10
  • Summary: The implementation successfully delivers a pluggable output generator architecture that satisfies both acceptance criteria. The code introduces an OutputGenerator protocol, implements four concrete generators (historical_workbook, ppt_screenshot, ppt_link_refresh, pdf_export), and provides a registry mechanism for config-driven registration. The first acceptance criterion is met: adding a new output requires only implementing OutputGenerator and registering it in config (demonstrated by _ConfigRegisteredOutputGenerator test). The second criterion is met: disabling outputs via config.enabled=false cleanly skips execution without breaking the pipeline (verified in test_write_outputs_skips_disabled_refresh_generator). The refactoring preserves existing behavior while adding extensibility. Code quality is high with clear separation of concerns, dependency injection for testability, and comprehensive unit tests for each generator. The main risks are platform-specific COM dependencies and potential runtime errors from dynamic imports, but these are mitigated by availability checks and graceful fallbacks. Testing is solid with 8 new test files covering protocol contracts, generator behavior, and integration scenarios, though some integration paths could benefit from end-to-end validation.
  • Concerns:
    • The PDF export generator uses COM automation which is Windows-specific and may fail silently on other platforms despite availability checks
    • The registry's dynamic import mechanism (_create_from_registration) could raise unclear errors if custom generators don't follow the protocol correctly
    • Some test coverage relies on mocking rather than integration testing the full registry->generator->output flow
    • The historical workbook generator's workbook_merger dependency is injected but not validated at construction time, potentially causing runtime failures

Agreement

  • Verdict: PASS (all providers)
  • Correctness: scores within 1 point (avg 8.5/10, range 8.0-9.0)
  • Completeness: scores within 1 point (avg 9.0/10, range 9.0-9.0)
  • Quality: scores within 1 point (avg 8.5/10, range 8.0-9.0)
  • Testing: scores within 1 point (avg 8.5/10, range 8.0-9.0)
  • Risks: scores within 1 point (avg 7.5/10, range 7.0-8.0)

Disagreement

No major disagreements detected.

Unique Insights

  • openai: OutputContext.warnings is an immutable tuple snapshot, but several generators also receive a mutable warnings list via the registry context; this split source-of-truth could confuse plugin authors and makes it easy to read stale warnings from OutputContext.; OutputGeneratorRegistry._validate_output_generator only checks for presence of a generate attribute, not its call signature or return type; a mis-registered plugin could fail at runtime later (though tests cover common paths).; Registry name validation allows blank generator.name to bypass mismatch checking (only enforces when generated_name is non-empty); a plugin with missing/blank name could slip through despite config name requirements.; PDF export path naming uses the distribution PPT stem; if multiple decks share the same stem across runs/stages it could overwrite within the same run_dir (likely acceptable, but worth noting).; PptLinkRefreshOutputGenerator stores last_result via object.setattr on a frozen dataclass; this is intentional but slightly surprising and could complicate future refactors.
  • anthropic: The PDF export generator uses COM automation which is Windows-specific and may fail silently on other platforms despite availability checks; The registry's dynamic import mechanism (_create_from_registration) could raise unclear errors if custom generators don't follow the protocol correctly; Some test coverage relies on mocking rather than integration testing the full registry->generator->output flow; The historical workbook generator's workbook_merger dependency is injected but not validated at construction time, potentially causing runtime failures

🔍 LangSmith Traces

stranske added a commit that referenced this pull request Feb 26, 2026
* chore(ledger): start task task-01 for issue #31

* chore(ledger): finish task task-01 for issue #31

* chore(codex-keepalive): apply updates (PR #256)

* Add historical WAL output generator plugin

* Add historical workbook output generator wrapper

* Refactor historical update flow to use output generator

* fix: resolve CI failures

* fix: remove unused typing.Any import (lint F401)

The merge conflict resolution in 073de24 left an unused `from typing
import Any` in test_normalization_registry_first.py, causing the
lint-ruff Gate check to fail.

https://claude.ai/code/session_01JhCWWDJG8PqwaSbVPCGfm6

Co-authored-by: Claude <noreply@anthropic.com>

* Refactor historical output generator dependency wiring

* chore(codex-keepalive): apply updates (PR #256)

* refactor: move PPT screenshot output to OutputGenerator

* Refactor PPT link refresh into output generator

* fix: resolve CI failures

* chore(codex-keepalive): apply updates (PR #256)

* fix: remove "task" from non-issue prefix filter in extractIssueNumberFromPull

"Task #123" is a valid issue reference pattern. Keeping "task" in
the filter caused extractIssueNumberFromPull to return null, breaking
downstream PR metadata updates.

https://claude.ai/code/session_01JhCWWDJG8PqwaSbVPCGfm6

* chore(codex-keepalive): apply updates (PR #256)

* Add config-driven output generator registry and stage filtering

* fix: widen parsed_by_variant type to Mapping in _build_historical_workbook_output_generator

The _require_parsed_by_variant helper returns Mapping[str, Mapping[str, Any]]
but _build_historical_workbook_output_generator expected dict[str, dict[str, Any]],
causing a mypy arg-type error. Widen to Mapping to match the actual return type.

https://claude.ai/code/session_01JhCWWDJG8PqwaSbVPCGfm6

---------

Co-authored-by: stranske-automation-bot <stranske-automation-bot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Codex Agent <codex-agent@users.noreply.github.com>
Co-authored-by: Codex Agent <codex-agent@local>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Codex Agent <codex-agent@example.com>
Co-authored-by: Codex <codex@local>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:codex Assigns Codex agent to issue autofix Triggers autofix on PR from:codex verify:compare Runs verifier comparison mode after merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants