lexicon: a shared language for requirements that compiles to Gherkin and Gauge

A previous post argued that Dev, QA, and Product read the same requirement differently not because anyone is careless, but because prose leaves three things implicit — the precondition, the action, and the outcome — and that a structured format forces those three things into the open. It also argued that the specific tool doesn’t matter much: Gherkin’s Given/When/Then is one well-known way to get the structure, not the only one, and a team is free to define its own. ...

July 16, 2026 · 12 min · Omar Crosby

Why dev, QA, and product read the same requirement differently

A pattern shows up on almost every team I’ve worked with, regardless of how disciplined the process otherwise is: Dev, QA, and Product each walk away from the same requirement holding a slightly different picture of what’s being built. It rarely surfaces at the moment the requirement is written. It surfaces later, and by then it’s expensive — a bug report that turns out to be a misunderstanding, a scope argument in the middle of a sprint, a story that stalls because QA and Dev quietly disagreed about what “done” meant and neither noticed until the story was in review. ...

July 16, 2026 · 6 min · Omar Crosby

Testing Go with Ginkgo and Gomega without giving up go test

If you’ve never looked at Ginkgo and Gomega, there’s a decent chance you’re picturing something that replaces go test — a separate test runner, a separate CI step, another tool your team has to adopt wholesale before anyone sees a benefit. That picture is wrong, and it’s worth correcting up front, because it’s the single biggest reason Go developers who’d genuinely enjoy Ginkgo never try it. Here’s the fact that should change your mind: a Ginkgo spec is a Go test. It compiles into the same test binary, it runs when you type go test ./..., and your existing CI pipeline doesn’t need to know Ginkgo exists. What Ginkgo adds is a richer vocabulary for organizing specs — nested Describe/Context/It blocks instead of a flat list of Test* functions — plus first-class suite lifecycle (BeforeSuite/AfterSuite), table-driven specs, async timeouts, and labels for slicing a suite into subsets. Gomega adds the assertion language (Expect(x).To(Equal(y))) that makes failures read like a sentence instead of a %v != %v diff. ...

July 9, 2026 · 12 min · Omar Crosby