Goal
Let an agent discover the right run_id for a user's natural-language request like "add Stripe to jobseek" without needing the user to manually paste a run_id.
Why
Companion to murmur#75. The end-user workflow on jobseek will be:
- User clicks "request company" on jseek.co, types a name + URL.
- Backend calls
POST /pipelines/jobseek-add-company/runs, stores the run_id in a UI card, and shows the user a prompt they can copy to their own Claude session.
- (This issue) The user's Claude session resolves the
run_id from a company name by calling list_runs (or its HTTP equivalent), then proceeds with pull_task({run_id}).
Without a list endpoint, the agent has no way to find pending runs.
Scope
- New publisher route
GET /runs mounted alongside the existing GET /runs/{id}.
- Query params (all optional):
status — one of running, completed (?status=running is the demo-load-bearing case).
pipeline_id — exact match (e.g. jobseek-add-company).
initial_input — JSON-string fragment matched against runs.initial_input_json via JSON_EXTRACT. For the demo we need at least company-name search; spec a single field path syntax (e.g. ?initial_input.company_name=Stripe) or accept a raw JSON object body and match keys.
- Pagination: hard cap at 100,
limit + offset query params. No total count needed for the demo.
- Response shape:
{ ok: true, data: { runs: [{run_id, pipeline_id, status, initial_input, created_at, webhook_status}] } }.
Interfaces
GET /runs?status=running&pipeline_id=jobseek-add-company&initial_input.company_name=Stripe&limit=10
→ {
ok: true,
data: {
runs: [
{ run_id, pipeline_id, status, initial_input, created_at, webhook_status }
]
}
}
Verification
Definition of done
Out of scope
- Mutation endpoints (
PATCH /runs/{id} to abort/retry — separate issue post-demo).
- Listing runs the calling user "owns" (post-demo authz issue).
- Full-text search on the entire
initial_input blob — only specific field-path equality for the demo.
Blocked by
None. Independent of murmur#75.
Goal
Let an agent discover the right
run_idfor a user's natural-language request like "add Stripe to jobseek" without needing the user to manually paste a run_id.Why
Companion to murmur#75. The end-user workflow on jobseek will be:
POST /pipelines/jobseek-add-company/runs, stores the run_id in a UI card, and shows the user a prompt they can copy to their own Claude session.run_idfrom a company name by callinglist_runs(or its HTTP equivalent), then proceeds withpull_task({run_id}).Without a list endpoint, the agent has no way to find pending runs.
Scope
GET /runsmounted alongside the existingGET /runs/{id}.status— one ofrunning,completed(?status=runningis the demo-load-bearing case).pipeline_id— exact match (e.g.jobseek-add-company).initial_input— JSON-string fragment matched againstruns.initial_input_jsonviaJSON_EXTRACT. For the demo we need at least company-name search; spec a single field path syntax (e.g.?initial_input.company_name=Stripe) or accept a raw JSON object body and match keys.limit+offsetquery params. No total count needed for the demo.{ ok: true, data: { runs: [{run_id, pipeline_id, status, initial_input, created_at, webhook_status}] } }.Interfaces
Verification
?status=runningreturns only runs whose status == running, ordered by created_at DESC.?pipeline_id=jobseek-add-company&status=runningAND-combines the filters.?initial_input.company_name=Stripematches runs whoseinitial_input_jsonhas that field equal to that value (case-insensitive optional).?limit=5&offset=10paginates.{runs: []}when no rows match (NOT 404).Definition of done
pnpm typecheck && pnpm lint && pnpm test && pnpm grep:allclean.docs/contracts.mddescribes the route shape.Out of scope
PATCH /runs/{id}to abort/retry — separate issue post-demo).initial_inputblob — only specific field-path equality for the demo.Blocked by
None. Independent of murmur#75.