Skip to content
This repository was archived by the owner on Jun 16, 2026. It is now read-only.

Commit bfa9af3

Browse files
mcp-tool-shopclaude
andcommitted
feat: add dogfood workflow for Phase 2 rollout
Scenario: resolve-real-loadout (cli surface) Creates test dispatch table, resolves a query against it, dispatches verified submission to dogfood-labs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 8622573 commit bfa9af3

1 file changed

Lines changed: 184 additions & 0 deletions

File tree

.github/workflows/dogfood.yml

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
name: Dogfood
2+
3+
on:
4+
push:
5+
branches: [main]
6+
paths:
7+
- "src/**"
8+
- "package.json"
9+
- ".github/workflows/dogfood.yml"
10+
workflow_dispatch:
11+
12+
concurrency:
13+
group: dogfood-${{ github.ref }}
14+
cancel-in-progress: true
15+
16+
jobs:
17+
dogfood:
18+
runs-on: ubuntu-latest
19+
if: github.ref == 'refs/heads/main'
20+
steps:
21+
- uses: actions/checkout@v4
22+
- uses: actions/setup-node@v4
23+
with:
24+
node-version: 22
25+
- run: npm ci
26+
- run: npm run build
27+
28+
# --- Scenario: resolve-real-loadout ---
29+
# Exercise the real product: resolve a loadout from a real dispatch table
30+
31+
- name: "Step: create-dispatch-table"
32+
id: create_table
33+
run: |
34+
# Create a realistic dispatch table for resolution
35+
mkdir -p /tmp/loadout-test
36+
cat > /tmp/loadout-test/dispatch.yaml << 'TABLE_EOF'
37+
version: "1"
38+
entries:
39+
- name: test-rule
40+
description: "Test dispatch entry"
41+
keywords: [test, dogfood, ci]
42+
path: ./payload.md
43+
tokens: 100
44+
TABLE_EOF
45+
46+
cat > /tmp/loadout-test/payload.md << 'PAYLOAD_EOF'
47+
---
48+
name: test-payload
49+
description: Test payload for dogfood
50+
type: reference
51+
---
52+
This is a test payload for the dogfood scenario.
53+
PAYLOAD_EOF
54+
55+
echo "status=pass" >> "$GITHUB_OUTPUT"
56+
57+
- name: "Step: resolve-loadout"
58+
id: resolve
59+
run: |
60+
# Use the CLI to resolve against the dispatch table
61+
node src/cli.js resolve --query "test dogfood" --table /tmp/loadout-test/dispatch.yaml 2>&1 | tee /tmp/resolve.log
62+
if [ $? -eq 0 ]; then
63+
echo "status=pass" >> "$GITHUB_OUTPUT"
64+
else
65+
echo "status=fail" >> "$GITHUB_OUTPUT"
66+
fi
67+
68+
- name: "Step: verify-output"
69+
id: verify_output
70+
run: |
71+
# Confirm resolver produced output referencing the test entry
72+
if [ -s /tmp/resolve.log ] && grep -q "test" /tmp/resolve.log; then
73+
echo "status=pass" >> "$GITHUB_OUTPUT"
74+
else
75+
echo "status=fail" >> "$GITHUB_OUTPUT"
76+
fi
77+
78+
# --- Verdict ---
79+
80+
- name: Determine overall verdict
81+
id: verdict
82+
run: |
83+
T="${{ steps.create_table.outputs.status }}"
84+
R="${{ steps.resolve.outputs.status }}"
85+
V="${{ steps.verify_output.outputs.status }}"
86+
if [ "$T" = "pass" ] && [ "$R" = "pass" ] && [ "$V" = "pass" ]; then
87+
echo "verdict=pass" >> "$GITHUB_OUTPUT"
88+
else
89+
echo "verdict=fail" >> "$GITHUB_OUTPUT"
90+
fi
91+
92+
# --- Build + dispatch ---
93+
94+
- name: Build submission
95+
run: |
96+
FINISHED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
97+
cat > /tmp/submission.json << 'INNER_EOF'
98+
{
99+
"schema_version": "1.0.0",
100+
"run_id": "ai-loadout-RUN_ID-ATTEMPT",
101+
"repo": "REPO_SLUG",
102+
"ref": {
103+
"branch": "REF_NAME",
104+
"commit_sha": "COMMIT_SHA"
105+
},
106+
"source": {
107+
"provider": "github",
108+
"workflow": "dogfood.yml",
109+
"provider_run_id": "PROVIDER_RUN_ID",
110+
"attempt": ATTEMPT_NUM,
111+
"run_url": "RUN_URL_PLACEHOLDER",
112+
"actor": "ACTOR_NAME"
113+
},
114+
"timing": {
115+
"started_at": "STARTED_PLACEHOLDER",
116+
"finished_at": "FINISHED_PLACEHOLDER",
117+
"duration_ms": 0
118+
},
119+
"ci_checks": [],
120+
"scenario_results": [
121+
{
122+
"scenario_id": "resolve-real-loadout",
123+
"scenario_name": "Resolve a loadout from a dispatch table",
124+
"scenario_version": "1.0.0",
125+
"product_surface": "cli",
126+
"execution_mode": "bot",
127+
"verdict": "VERDICT_PLACEHOLDER",
128+
"step_results": [
129+
{ "step_id": "create-dispatch-table", "status": "TABLE_STATUS" },
130+
{ "step_id": "resolve-loadout", "status": "RESOLVE_STATUS" },
131+
{ "step_id": "verify-output", "status": "VERIFY_STATUS" }
132+
],
133+
"evidence": [
134+
{
135+
"kind": "log",
136+
"url": "RUN_URL_PLACEHOLDER",
137+
"description": "CI run log with resolve output"
138+
}
139+
],
140+
"notes": "Bot-driven resolve against test dispatch table"
141+
}
142+
],
143+
"overall_verdict": "VERDICT_PLACEHOLDER",
144+
"notes": "Phase 2 rollout: ai-loadout CLI dogfood."
145+
}
146+
INNER_EOF
147+
148+
sed -i "s|REPO_SLUG|${GITHUB_REPOSITORY}|g" /tmp/submission.json
149+
sed -i "s|REF_NAME|${GITHUB_REF_NAME}|g" /tmp/submission.json
150+
sed -i "s|COMMIT_SHA|${GITHUB_SHA}|g" /tmp/submission.json
151+
sed -i "s|PROVIDER_RUN_ID|${GITHUB_RUN_ID}|g" /tmp/submission.json
152+
sed -i "s|ATTEMPT_NUM|${GITHUB_RUN_ATTEMPT}|g" /tmp/submission.json
153+
sed -i "s|RUN_URL_PLACEHOLDER|https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}|g" /tmp/submission.json
154+
sed -i "s|ACTOR_NAME|${GITHUB_ACTOR}|g" /tmp/submission.json
155+
sed -i "s|STARTED_PLACEHOLDER|${{ github.event.head_commit.timestamp || github.event.repository.pushed_at }}|g" /tmp/submission.json
156+
sed -i "s|FINISHED_PLACEHOLDER|${FINISHED_AT}|g" /tmp/submission.json
157+
sed -i "s|ai-loadout-RUN_ID-ATTEMPT|ai-loadout-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}|g" /tmp/submission.json
158+
sed -i "s|VERDICT_PLACEHOLDER|${{ steps.verdict.outputs.verdict }}|g" /tmp/submission.json
159+
sed -i "s|TABLE_STATUS|${{ steps.create_table.outputs.status }}|g" /tmp/submission.json
160+
sed -i "s|RESOLVE_STATUS|${{ steps.resolve.outputs.status }}|g" /tmp/submission.json
161+
sed -i "s|VERIFY_STATUS|${{ steps.verify_output.outputs.status }}|g" /tmp/submission.json
162+
163+
jq empty /tmp/submission.json
164+
echo "Submission built:"
165+
jq '.run_id, .overall_verdict' /tmp/submission.json
166+
167+
- name: Dispatch to dogfood-labs
168+
env:
169+
GH_TOKEN: ${{ secrets.DOGFOOD_TOKEN }}
170+
run: |
171+
SUBMISSION=$(cat /tmp/submission.json)
172+
RUN_ID=$(echo "$SUBMISSION" | jq -r '.run_id')
173+
174+
if [ -z "$GH_TOKEN" ]; then
175+
echo "::warning::DOGFOOD_TOKEN not set — skipping dispatch"
176+
exit 0
177+
fi
178+
179+
jq -n --argjson sub "$SUBMISSION" \
180+
'{"event_type":"dogfood_submission","client_payload":{"submission":$sub}}' \
181+
| gh api repos/mcp-tool-shop-org/dogfood-labs/dispatches \
182+
--input - --silent
183+
184+
echo "Dispatched $RUN_ID to dogfood-labs"

0 commit comments

Comments
 (0)