Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Dec 19, 2025

Campaign orchestrators previously mixed decision logic, state management, and conditional guidance in generated prompts. Workers could leak campaign awareness through embedded metrics and progress tracking.

Changes

Orchestrator architecture: four explicit phases

Replaced ad-hoc prompt generation with strict phase separation:

  1. Read State - Query worker issues via tracker-id, read project board, compare
  2. Make Decisions - Determine additions/updates/completion independently
  3. Write State - Execute changes via safe-outputs
  4. Report - Summarize outcomes

Each phase documents inputs, decisions, and outputs. No mixing of concerns.

Predefined project board schema

Orchestrators now update only:

  • status: "Todo" | "In Progress" | "Done"
  • priority: "High" | "Medium" | "Low"
  • size: "Small" | "Medium" | "Large"
  • campaign_status: "active" | "completed"

No free-form field mutation. All operations idempotent.

Removed conditional orchestrator variants

Deleted ReportBlockers and CompletionGuidance flags. All orchestrators follow identical rules. Template data simplified from 3 fields to 1 (ProjectURL).

Correlation mechanism explicit

Workers embed tracker-id in all assets via XML comment. Orchestrators discover work by searching "tracker-id: WORKER_ID" in:body. No workflow name matching, no file path dependencies.

Example

Before (mixed concerns):

Generate a status report, highlight blockers if configured, 
check completion guidance flag, search for issues, 
add to board, report on campaign progress.

After (phase separation):

## Phase 1: Read State
1. Query worker issues: search `repo:owner/repo "tracker-id: daily-file-diet" in:body`
2. Query project board state
3. Compare: identify gaps

## Phase 2: Make Decisions  
4. Decide additions: yes for all tracker-id matches
5. Decide updates: yes if state changed
6. Decide completion: all closed AND all "Done"

## Phase 3: Write State
7. Execute additions via update-project
8. Execute updates via update-project  
9. Record completion if terminal

## Phase 4: Report
10. Summarize: discovered, added, updated, failures

Workers unchanged. Project board remains single source of truth.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/user
    • Triggering command: /usr/bin/gh gh api user --jq .login eam.git l /opt/hostedtoolcache/go/1.25.0/x64/pkg/tool/linux_amd64/compile **/*.json sh 64/bin/go /opt/hostedtoolcstatus -V=f�� ithub/workflows node 64/bin/node l format:pkg-json node infocmp (http block)
    • Triggering command: /usr/bin/gh gh api user --jq .login 0/x64/bin/node l /usr/bin/git -ignore-path /degit git 64/bin/go git remo�� tags/v6 origin e/git-remote-https npx prettier --cnode git 64/bin/go e/git-remote-https (http block)
    • Triggering command: /usr/bin/gh gh api user --jq .login ithub/workflows -buildtags /usr/bin/git -errorsas -ifaceassert -nilfunc git -C it/ref/tags/v5 rev-parse /usr/lib/git-core/git by/82b4be1687122bash **/*.cjs bin/sh /usr/lib/git-cor/var/run/docker/runtime-runc/moby (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

For the campaign orchestrator, update to rely on this minimal, system-agnostic rule set:

Worker workflows are immutable.
They are never changed.

Workers are unaware of campaigns.
They run the same way in all contexts.

Campaign logic is external.
Orchestration does not live inside workers.

Workers only execute work.
They do not track progress or make decisions.

Campaign owns sequencing and decisions.
Order, retries, continuation, and termination are campaign responsibilities.

Campaign state is stored outside workers.
No state is embedded in worker execution.

There is a single external source of truth.
Campaign status is read from one shared system.

Correlation is explicit.
All related work carries a shared campaign identifier.

Write access is controlled and indirect.
Decision-making and state mutation are separated.

Only predefined fields may be updated.
No free-form or ad-hoc state changes.

Failures are explicit.
Outcomes are recorded, not inferred.

Operations are idempotent.
Re-execution does not corrupt state.

Custom agent used: debug-agentic-workflow
Debug and refine agentic workflows using gh-aw CLI tools - analyze logs, audit runs, and improve workflow performance


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

- Update orchestrator instructions to enforce clean separation between workers and campaign logic
- Separate state reading, decision-making, and state writing into distinct phases
- Make correlation via tracker-id explicit and system-agnostic
- Define predefined project board fields with idempotency guarantees
- Remove conditional logic from orchestrator prompt generation
- Update tests to reflect new system-agnostic architecture

Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
@mnkiefer mnkiefer marked this pull request as ready for review December 19, 2025 08:56
Copilot AI changed the title [WIP] Update campaign orchestrator to rely on minimal rule set Campaign orchestrator: enforce system-agnostic separation between workers and coordination Dec 19, 2025
Copilot AI requested a review from mnkiefer December 19, 2025 09:08
@mnkiefer mnkiefer merged commit ae3631b into main Dec 19, 2025
121 checks passed
@mnkiefer mnkiefer deleted the copilot/update-campaign-orchestrator-rule-set branch December 19, 2025 09:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants