-
Notifications
You must be signed in to change notification settings - Fork 37
Add project field with campaign orchestration support to workflows #12053
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
Add project field with campaign orchestration support to workflows #12053
Conversation
project field during compilation should build full orchestrator workflow structure (discovery steps, campaign prompts, coordination logic) with campaign-specific features (workflows list, memory-paths, metrics, governance, etc.) and handlin...project field during compilation should build orchestrator workflow
Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
…flow Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
|
@copilot No |
project field during compilation should build orchestrator workflowCampaign configuration is now nested within the project field instead of being a separate top-level field. This simplifies the structure and makes it clear that campaign orchestration is an extension of project tracking. Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
Fixed in commit 4a2f057. Campaign fields are now nested within the project:
url: https://github.com/orgs/myorg/projects/123
scope:
- owner/repo
# Campaign orchestration fields
workflows:
- security-fixer
governance:
max-new-items-per-run: 5 |
Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
|
@copilot No frontmatter conversion, this is a new native field in regular workflows which distinguishes it as a campaign. |
I want to confirm the intended approach: Should workflows with a
OR
The "no frontmatter conversion" feedback suggests option 1, where the workflow itself becomes the orchestrator without generating separate files. |
Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
These files should not be modified or deleted in this PR. Restored to their state before commit b30d018. Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
…8-4956-adff-dcce191aac36
…8-4956-adff-dcce191aac36
|
@copilot Make workflows field optional. The simplest campaign could, for example, do its own discovery and dispatch to copilot |
Campaigns can now be created without predefined worker workflows. Detection now checks for any campaign indicator (governance, bootstrap, memory-paths, metrics-glob, cursor-glob) instead of requiring workflows field. This allows campaigns to use custom discovery and dispatch logic like assign-to-agent. Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
…8-4956-adff-dcce191aac36
…8-4956-adff-dcce191aac36
|
@copilot Reduce security-alert-burndown campaign to:
|
…8-4956-adff-dcce191aac36
Removed workflows field and simplified to show a campaign that: - Discovers Dependabot PRs with dependencies/javascript labels - Assigns PRs to Copilot coding agent (not worker dispatch) - Uses governance for pacing and discovery limits Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com>
…8-4956-adff-dcce191aac36
…8-4956-adff-dcce191aac36
Summary
Implemented Option 1: Workflows with a
projectfield now compile directly to their own.lock.ymlwith campaign orchestrator features injected during compilation.Implementation
Campaign injection (
pkg/campaign/injection.go)InjectOrchestratorFeatures()functionworkflows- List of worker workflows (optional)governance- Campaign-specific policiesbootstrap- Work item generation configmemory-paths,metrics-glob,cursor-glob- State trackingCompilation pipeline (
pkg/cli/compile_workflow_processor.go)InjectOrchestratorFeatures()after parsing, before compilationHelper cleanup (
pkg/cli/compile_helpers.go)Template updates (
pkg/campaign/prompt_sections.go,orchestrator.go)AppendPromptSection()for use by injection logicFrontmatter types (
pkg/workflow/frontmatter_types.go)ProjectConfigto include campaign orchestration fieldsSchema (
pkg/parser/schemas/main_workflow_schema.json)How It Works
project.lock.ymlCampaign Detection
A workflow is considered a campaign orchestrator if it has a
projectfield with ANY of these:workflows- List of worker workflows (optional)governance- Campaign policiesbootstrap- Initial work item generationmemory-paths- Campaign state trackingmetrics-glob- Metrics collectioncursor-glob- Checkpoint filesExamples
Campaign with predefined workers:
Campaign with custom discovery (no workers):
Both compile to
.lock.ymlwith orchestrator features. The simplest campaign only needsgovernanceor another indicator - noworkflowsfield required.Result
Compiles to a single
.lock.ymlfile containing:No separate files generated - the workflow IS the campaign orchestrator.
Example Output
The
security-alert-burndown.mdworkflow (simplified without workers) compiles to a 75.9 KB.lock.ymlwith campaign orchestrator features:✅ WORKFLOW EXECUTION (PHASE 0) instructions
✅ ORCHESTRATOR INSTRUCTIONS for coordination
✅ PROJECT UPDATE INSTRUCTIONS for project board management
✅ CLOSING INSTRUCTIONS for completion
✅ No dispatch-workflow safe-output (uses assign-to-agent for Copilot integration instead)
The example demonstrates a minimal campaign that discovers Dependabot PRs with specific labels and assigns them to the Copilot coding agent, without predefined worker workflows.
Notes
.campaign.mdformat remains supported for backward compatibility.campaign.mdfiles not modified in this PRworkflowsfield is optional - campaigns can use custom discovery and assign-to-agent for Copilot integrationgovernanceor another campaign indicator fieldOriginal prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.