flowtest: five things the loader knows and reports late or never — an empty `expect:`, a wrong `workflow:` path, a signal scripted after the gate's timeout, a type mismatch printed as quoting, and an unknown field with no suggestion
Open
Nobody has claimed this yet.
kind/bug
testing
- Dominant language
- Go
- Stars
- 9
- Forks
- 0
- Avg merge
- 3h 3m
- Merged PRs (30d)
- 509
Description
Observed behavior
Each reproduced at eb8172f.
expect: {}passes. A case with no claim at all is green, and--fail-on-warningdoes not notice. The format's own principle (others: skippedexists so "adding a step fails loudly") does not apply to a case that asserts nothing.- A wrong
workflow:path is a run-time case failure.workflow: ./no-such-workflow.yamlreportsloading workflow ... no such file or directoryas the case's failure, with no position and no did-you-mean, while every other name in the format (ran:, signals, steps) is refused at load with a line. - A signal scripted after the gate lapses gets no dedicated diagnostic.
signals: [{name: deploy-approved, at: 48h}]against a gate withtimeout: 24hproduces three downstream failures; the transcript'st=24h0m5s approval waitingis the only clue. The loader holds both numbers. - A type mismatch reads as a quoting difference.
expect.outputs: {iterations: "1"}against an int fails withexpected "1", got 1. The quotes are the whole message. - An unknown field gets no suggestion.
flow teston a file withoutputs:whereresponse:was meant answersunknown field "outputs"(the key isresponse,file.go:784;outputsis real only underexpect:,file.go:998).run.go:1572,1601,1740already producedid you mean %q?for step and signal names; field names, the first thing a newcomer gets wrong, get the bare refusal.
Desired outcome
Each is a load-time refusal or a load-time warning with a position:
- an
expect:with no claim is refused unless the case saysexpect: {nothing: true}or the spelling the format prefers for "this case only proves the run completes"; - a
workflow:that does not resolve is refused at load, positioned, with the nearest existing file suggested; - a signal whose
at:is past every gate it could answer is refused at load naming the gate and its timeout; - output and input mismatches print
expected string "1", got int 1using the D1 type spelling; - unknown keys get the same did-you-mean the names get, over the keys legal at that position.
Acceptance criteria
- Five fixtures under
flowtest/testdatawith# wantlines (#1602's shape) pin each refusal. examples/andflow init's scaffold pass unchanged.
Constraints and dependencies
- Adjacent: #1441, #1616, #1602, #1647 (type spelling in diagnostics).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the loader and diagnostic paths referenced at file.go:784 and 998, then inspect the did-you-mean handling in run.go:1572, 1601, and 1740. Add five fixtures under flowtest/testdata following #1602's # want shape, covering the listed load-time refusals or warnings. Run the flowtest fixtures and verify examples/ and flow init's scaffold remain unchanged.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- cli, testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 55/100