Free tools Windows power users keep installed
One-click scans. No signup required.
iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
An unquoted YAML line looked like it required a ledger to contain exactly one PhaseGate row and to include a negative case. But in the reported reproduction, the parser treated everything after # as a comment. The verification gate received only ledger has exactly one PhaseGate row—and accepted it because the corresponding matrix entry had been shortened to match.
What the parser passed to the gate
The reported intent.yaml criterion was written as an unquoted plain scalar:
ledger has exactly one PhaseGate row # include the negative case too
In the example using yaml@2.9.0, the parsed JavaScript value was only:
ledger has exactly one PhaseGate row
The text after # remained visible in the YAML source file, but it was a comment rather than part of the parsed string. YAML 1.2.2 identifies # as the comment indicator and distinguishes plain scalars from quoted scalar styles; see the YAML 1.2.2 specification (revision dated 2021-10-01).
#1 Best Overall
That distinction matters because a later check can validate only the data it receives. A schema may confirm that a criterion is a string, for example, but it cannot reconstruct words discarded when the source was parsed.
Why the reported gate passed
According to maintainer Yusuke Shiki’s incident account, spec-lane stores success criteria in intent.yaml and corresponding records in verification.yaml. In the reproduction, the matrix criterion was shortened to match the parsed value. The pre-fix gate therefore compared two matching strings, not the full sentence a reader might infer from the source line.
On the revision immediately before PR #48’s fix, Shiki reports that validation and advancement into the verification phase succeeded with exit code 0. The result shows that the gate accepted matching values in that fixture. It does not show that the intended negative-case behavior was tested: the evidence and negation-test entries were declarations, and the referenced ledger test was not created and run as proof.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
What changed when the criterion was quoted
The control case quoted the criterion, making the hash and following words part of the string:
"ledger has exactly one PhaseGate row # include the negative case too"
With the same shortened matrix entry and pre-fix CLI, the reported validation and phase advancement failed with exit code 3; the phase remained at 3_implement. Quoting preserved the full criterion, so it no longer matched the shortened matrix value.
| Source form | Parsed criterion in the reported example | Result against shortened matrix entry |
|---|---|---|
Unquoted plain scalar with inline # comment |
ledger has exactly one PhaseGate row |
Matched; pre-fix command reportedly exited 0. |
| Quoted scalar | ledger has exactly one PhaseGate row # include the negative case too |
Did not match; pre-fix command reportedly exited 3 and stayed at 3_implement. |
How spec-lane v0.11.0 addresses this case
Shiki’s article reports that spec-lane v0.11.0 moved the check to the intent.yaml reading boundary. Rather than waiting for the shortened parsed value to reach the gate, the implementation walks the YAML abstract syntax tree and inspects the original source ranges. It looks for candidate unquoted plain scalars followed by whitespace and #, then rejects candidate values that appear among parsed success criteria. The article says the check examines source context rather than relying only on an AST comment property, since anchor forms can associate comments with another node.
Rank #4
The change is reported as shipped in PR #48, addressing issue #45. These implementation details are attributed to the maintainer’s account.
A targeted guard, not proof of intent
The reported check can reject a valid document in a different case: another commented plain scalar may have the same parsed value as a quoted success criterion, even though that quoted criterion was not truncated. The guard is therefore fail-closed against a known silent-truncation path, but it does not prove that the author’s full intent has been preserved.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.What a passing verification gate does—and does not—establish
This incident separates three different claims that are easy to conflate:
- The YAML source contains certain words. A person can see the comment text in the file, but that does not make it part of the parsed criterion.
- The parsed criterion matches a matrix entry. That establishes agreement between the values the gate compares; it does not recover omitted source text.
- The intended behavior was tested. A matrix row naming a test or an evidence label is not proof that the test ran. The reported fixture did not execute the named ledger test.
A successful command is meaningful only in relation to what it checked. Here, the reported exit code 0 establishes acceptance of the matching shortened values in that reproduction—not that a ledger had exactly one PhaseGate row or that a negative case was covered.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

