Skip to content

Nothing runs the 110 data/*.star fixtures; a rotted assertion is invisible to CI #876

Closed as not planned

Description

@David-Noble-at-work

cmd/devlore-test/devloretest/data/ holds 112 .star fixtures. The Go test suite references exactly
two by name — test_hello.star and test_write_then_remove.star. Nothing walks the directory. The other
110 run only when a human types devlore-test run <file>.

The consequence, demonstrated by #875: three fixtures assert text the runtime stopped producing, and each
fails when finally run — but CI is green, because CI never runs them. A fixture's assertion can rot the
moment the behaviour it checks changes, and nothing notices until someone runs it by hand, months later.

The harness that exists to catch drift is not itself exercised over its own corpus.

What is wanted

A gate that runs every data/*.star fixture and fails on any failing expectation — a go test that walks
the directory, or a make target CI invokes. The 110 unrun fixtures should be run once as part of this and
any other rot fixed (or the fixture quarantined with a reason).

Related: [pkg/op] #720 (the harness's receipt-vs-workspace bug); #875 (the three rotted fixtures found this).

Activity

  1. David-Noble-at-work commented on Sep 10, 2026

    @David-Noble-at-work
    ContributorAuthor

    Relationship to #721 (the Starlark linter)

    #721 (feature #837, lint provider; charter docs/plans/lint-starlark.md) is the planned LintStarlark
    — static resolution checking: dead references, wrong namespace/method/arity/parameter names, lifecycle
    verbs, phase entry points. It is not a duplicate of this issue, and it would not have caught the three
    fixtures in #875:

    #875 fixture Why #721's linter misses it
    test_imm_shell.star shell.exec(command=…) is a valid call; the rot was the assertion result == "echo hello"
    test_flow_fatal_recovery.star plan.failed(…) is valid; the rot was expect_error("fatal:…") text
    test_imm_file_join_variadic_error.star the call is deliberately invalid by design; the rot was the stale error string it asserts

    All three are valid Starlark with valid (or intentionally-invalid) API calls. The defect is in the
    runtime assertion — a t.expect_* that no longer matches what the runtime emits. Static analysis
    cannot see it; only running the fixture can.

    So the two gates are complementary:

    #721 itself makes the same distinction in miniature ("A syntax checker would not have helped") and notes
    its lambda rule is "conditional on #720", showing the harness is a separate axis from the linter.

    Confirmed in passing: #721 records that buildifier's -module-docstring, -unused-variable, and
    kwarg=value → kwarg = value reformat are all wrong for devlore and not configurable — so the buildifier
    "reformat" flagged while preparing #875 is correctly ignored, and buildifier is not the gate.

  2. David-Noble-at-work commented on Sep 10, 2026

    @David-Noble-at-work
    ContributorAuthor

    Duplicate of #664 (same corpus, same 'nothing runs them' concern). Its distinct points — a corpus-wide run gate, and the static-vs-dynamic relationship to the #721 linter — are carried into #664. I filed this without first consulting the star report, which already showed #664; closing to keep the tracker honest.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Epic:QualityCoverageCode quality, coverage, and the lint gatesbugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions