Skip to content

Commit a4ddcb4

Browse files
Add reproducer and sample-request issue templates with README guidance
Add reproducer and sample-request issue templates Maintainers triaging this app had no structured front door for bug reports or sample requests. Bug reports landed as free-form prose without the workflow class, artisan command, package version, or operator-visible durable failure that turn a report into a runnable reproducer. Sample requests landed without the pattern name, target Durable Workflow version, or external dependencies needed to scope the work. .github/ISSUE_TEMPLATE/ now ships three files: - bug_report.yml asks for the workflow class, the artisan command that triggers the failing path, expected vs observed behavior, a redacted history-export excerpt, the Durable Workflow package version, the sample app commit, the PHP version, and the queue/cache backend. A contribution checkbox invites the reporter to open a PR that lands the reproducer under app/Workflows/Bug/. - sample_request.yml asks for the pattern name, motivation linked to the public docs, a sketch of the workflow shape, the minimum Durable Workflow version, and any external dependencies. A contribution checkbox invites the reporter to open a PR that lands the sample under app/Workflows/. - config.yml turns off blank issues and links out to the docs site, the README sample index, and the workflow/server repos for engine-level and server-level bugs that do not need the Laravel sample to reproduce. README.md grows a "Reporting Bugs and Requesting Samples" section that points operators at the chooser and explains what each template lands so contributors know up front what good reproducers and sample requests look like. Verified: - bash scripts/check-public-boundary.sh -> exit 0 - python -c 'import yaml; yaml.safe_load(open(f))' for each template
1 parent f0c472f commit a4ddcb4

4 files changed

Lines changed: 226 additions & 0 deletions

File tree

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
name: Bug reproducer
2+
description: A reproducer for an upstream Durable Workflow bug, runnable against this sample app.
3+
title: "[bug] <short description of the failing pattern>"
4+
labels:
5+
- bug
6+
- reproducer
7+
body:
8+
- type: markdown
9+
attributes:
10+
value: |
11+
Use this template to file a reproducer that runs inside this sample app.
12+
13+
A good reproducer is small, deterministic, and isolates the failing pattern: one
14+
workflow class, one command to start it, and one expected outcome. If your bug is
15+
in the engine itself and does not need Laravel scaffolding, file it on the
16+
[`workflow` repo](https://github.com/durable-workflow/workflow/issues/new/choose)
17+
instead. If it is in the standalone Durable Workflow server, file it on the
18+
[`server` repo](https://github.com/durable-workflow/server/issues/new/choose).
19+
20+
Reproducers that follow this template land as new sample-app workflows, get
21+
wired into CI, and stay reproducible after the bug is fixed.
22+
23+
- type: input
24+
id: workflow_class
25+
attributes:
26+
label: Workflow class under test
27+
description: Fully qualified class name. Existing samples live under `App\Workflows\`.
28+
placeholder: App\Workflows\Bug\IssueNNNRepro\IssueNNNWorkflow
29+
validations:
30+
required: true
31+
32+
- type: input
33+
id: start_command
34+
attributes:
35+
label: Command to start the reproducer
36+
description: An `artisan` command that the reader can run after `composer install` to trigger the failing path.
37+
placeholder: php artisan app:bug-issue-NNN
38+
validations:
39+
required: true
40+
41+
- type: textarea
42+
id: expected
43+
attributes:
44+
label: Expected behavior
45+
description: What the durable contract is supposed to do. Reference docs, history events, or operator-visible state where possible.
46+
validations:
47+
required: true
48+
49+
- type: textarea
50+
id: actual
51+
attributes:
52+
label: Observed behavior
53+
description: What you actually see. Include workflow status, durable failure type, and the operator surface (Waterline, history export, CLI output) where you observed it.
54+
validations:
55+
required: true
56+
57+
- type: textarea
58+
id: history_excerpt
59+
attributes:
60+
label: History excerpt
61+
description: |
62+
A short, redacted slice of `php artisan workflow:v2:history-export` for the failing run.
63+
Trim payload bodies; the event sequence and event kinds are usually enough.
64+
render: text
65+
66+
- type: input
67+
id: durable_workflow_version
68+
attributes:
69+
label: Durable Workflow package version
70+
description: Run `composer show durable-workflow/workflow` and paste the resolved version.
71+
placeholder: 2.0.0-alpha.5
72+
validations:
73+
required: true
74+
75+
- type: input
76+
id: sample_app_commit
77+
attributes:
78+
label: Sample app commit
79+
description: Output of `git rev-parse --short HEAD` in your sample-app checkout.
80+
placeholder: abc1234
81+
validations:
82+
required: true
83+
84+
- type: input
85+
id: php_version
86+
attributes:
87+
label: PHP version
88+
description: Output of `php -r 'echo PHP_VERSION;'`.
89+
placeholder: "8.3.10"
90+
validations:
91+
required: true
92+
93+
- type: dropdown
94+
id: backend
95+
attributes:
96+
label: Queue and cache backend
97+
description: Which `QUEUE_CONNECTION` and cache store you used when the bug reproduced.
98+
options:
99+
- Redis (default sample-app docker compose)
100+
- Database (sync queue + database cache)
101+
- Other (describe in additional context)
102+
validations:
103+
required: true
104+
105+
- type: textarea
106+
id: additional
107+
attributes:
108+
label: Additional context
109+
description: Logs, exporter output, related issues, or anything else a maintainer needs to land the reproducer.
110+
111+
- type: checkboxes
112+
id: contribution
113+
attributes:
114+
label: Reproducer contribution
115+
options:
116+
- label: I am willing to open a pull request that adds this reproducer as a workflow under `app/Workflows/Bug/`.
117+
required: false
118+
- label: I checked that the bug reproduces against the latest `main` of this repo.
119+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Durable Workflow documentation
4+
url: https://durable-workflow.com/docs/2.0/
5+
about: Reference for the v2 engine, polyglot worker contracts, and operator tooling.
6+
- name: Sample App README
7+
url: https://github.com/durable-workflow/sample-app#readme
8+
about: How to run the bundled samples and the table of patterns each one demonstrates.
9+
- name: Workflow engine bug
10+
url: https://github.com/durable-workflow/workflow/issues/new/choose
11+
about: Open here when the bug reproduces with a minimal program against the workflow package itself, not this Laravel sample.
12+
- name: Standalone server bug
13+
url: https://github.com/durable-workflow/server/issues/new/choose
14+
about: Open here when the bug reproduces against the standalone Durable Workflow server image, not this Laravel sample.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: Sample request
2+
description: Ask for a Durable Workflow pattern that this sample app does not yet demonstrate.
3+
title: "[sample] <short description of the requested pattern>"
4+
labels:
5+
- sample-request
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
Use this template to request a sample workflow that demonstrates a Durable Workflow
11+
pattern not yet covered by this app. The current sample index lives in the
12+
[README sample table](https://github.com/durable-workflow/sample-app#sample-index).
13+
14+
Sample requests close when a workflow lands under `app/Workflows/` that exercises
15+
the pattern end to end and is wired into both the artisan command list and the MCP
16+
config in `config/workflow_mcp.php`.
17+
18+
- type: input
19+
id: pattern
20+
attributes:
21+
label: Pattern name
22+
description: A short name for the pattern. Used as the working title for the sample workflow.
23+
placeholder: child workflow with parent-close-policy abandon
24+
validations:
25+
required: true
26+
27+
- type: textarea
28+
id: motivation
29+
attributes:
30+
label: Why this pattern matters
31+
description: |
32+
What real durable-workflow problem does this pattern solve? Link the public docs
33+
page or feature reference that defines it where possible.
34+
validations:
35+
required: true
36+
37+
- type: textarea
38+
id: shape
39+
attributes:
40+
label: Suggested workflow shape
41+
description: |
42+
Outline the workflow class, activities, signals, updates, and the operator-visible
43+
outcome you want the sample to demonstrate. Pseudocode is fine.
44+
validations:
45+
required: true
46+
47+
- type: input
48+
id: durable_workflow_version
49+
attributes:
50+
label: Minimum Durable Workflow version
51+
description: Earliest workflow package version this pattern needs to work on.
52+
placeholder: 2.0.0-alpha.5
53+
validations:
54+
required: true
55+
56+
- type: dropdown
57+
id: external_dependencies
58+
attributes:
59+
label: External dependencies
60+
description: Does the sample need anything beyond the default Laravel + Redis stack?
61+
options:
62+
- None — runs on the default sample-app stack
63+
- Browser automation (Playwright / Node)
64+
- LLM provider key (OPENAI_API_KEY or similar)
65+
- Additional service (describe in notes)
66+
validations:
67+
required: true
68+
69+
- type: textarea
70+
id: notes
71+
attributes:
72+
label: Notes for the implementer
73+
description: |
74+
Anything that would block the sample from landing today (missing engine feature,
75+
upstream contract, docs gap). If a missing feature blocks the sample, link the
76+
upstream issue and call it out here so the request can be queued behind that work.
77+
78+
- type: checkboxes
79+
id: contribution
80+
attributes:
81+
label: Sample contribution
82+
options:
83+
- label: I am willing to open a pull request that adds this sample workflow to `app/Workflows/`.
84+
required: false

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,15 @@ An AI client would typically:
291291
4. Poll `get_workflow_result` with the `workflow_id` until status is `completed`
292292
5. Read the `output` field for the workflow result
293293
6. If status is `failed` or `waiting` longer than expected, call `diagnose_workflow`, then inspect `get_workflow_history` with the `run_id`
294+
## Reporting Bugs and Requesting Samples
295+
296+
Use the structured templates under [Issues](https://github.com/durable-workflow/sample-app/issues/new/choose) so reproducers and sample requests land with the metadata maintainers need:
297+
298+
- **Bug reproducer.** A reproducer runs in this app: it names the workflow class, the artisan command, the Durable Workflow package version, and the observed durable failure. Reproducers that follow the template land as new workflows under `app/Workflows/Bug/<issue>/` and stay covered by CI after the bug is fixed.
299+
- **Sample request.** A sample request names the Durable Workflow pattern that is not yet covered, the public docs page that defines it, and the minimum package version it needs. Requests close when a workflow under `app/Workflows/` exercises the pattern end to end and is wired into the artisan command list and `config/workflow_mcp.php`.
300+
301+
Bugs in the workflow engine itself or the standalone Durable Workflow server belong on the [`workflow`](https://github.com/durable-workflow/workflow/issues/new/choose) and [`server`](https://github.com/durable-workflow/server/issues/new/choose) repos respectively; the issue chooser links those out.
302+
294303
## Public Boundary Checks
295304

296305
This is a public repository. Do not add private tracker names, workspace-only absolute paths, or loop/lane metadata to files or new commit metadata. Run `scripts/check-public-boundary.sh` before publishing changes; CI runs the same scan on pushes and pull requests.

0 commit comments

Comments
 (0)