Campfire conformance — compiled

ONCE Campfire's own Minitest suite, run against a Roundhouse emit of the same commit. A failure here mostly names a Rails construct not yet modeled; some are answers that came out wrong with nothing raised, and some have not been triaged at all. That makes their tests the worklist generator — so the ranked causes below, not the pass count, are what this page is for.

This is the compiled lane: each test file compiled to its own native binary by spinel, then run. The same emitted source runs on the interpreted lane, so a difference between the two is the compiler's, not the app's — and this lane can report a status its sibling cannot. 9 of 54 files never linked, and their tests are counted against their first compile error rather than against anything the emit got wrong.

Unpassed tests by who can act: 135 untriaged · 5 roundhouse.

campfire 94a48aacb65a · roundhouse 2bc2cb242777 · spinel a4b7238e78f8 · 2026-09-11T02:21:19Z
148/288 tests pass17 of 54 files green9 never linkedemit 1,157 files, 0 errors
148 passing · 140 not passing · 9 file(s) never linked
What this measures. Two questions, kept apart. Whether the emit compiles is the never-linked column — spinel is a strict target, so an unmodeled construct is a compile error rather than a gap emitted through. Whether it behaves is everything else: their suite asserts test by test, so a failure below names a construct that compiled and then answered wrongly. A file in the first column has not yet been asked the second question. The emit is produced fresh by scripts/campfire-suite and is compiled by spinel a4b7238e78f8.

The app is pinned at 94a48aacb65a; the compiler is not. This lane compiles 54 whole programs, which is too much to run per commit, so it runs on a schedule and its spinel is whatever the publisher pulled and built that morning. That makes a movement here two-sided: it belongs to a Roundhouse change or to a compiler change, and the two are told apart by the spinel version recorded above — not by this page. Read a regression by checking that version first.

The file list is theirs. Every test file campfire's own suite declares, read from the emitted Makefile's SPINEL_TESTS rather than restated here — a `find test -name '*_test.rb'` would also sweep in the scaffold's own tests, which are not campfire's.

Each run stands alone. There is no history here and no comparison to previous runs: a chart of a number that moves for a dozen reasons is not the point of a worklist.

Todos, by tests blocked

Occurrences churn; causes are the unit of work, so each carries a stable slug you can still refer to forty commits later. Owner says who can act: most of this is Roundhouse's own modeling debt.

Counts are how many tests are currently stopped by each cause, not how many will pass when it lands: a test is attributed to the first thing that stopped it, so clearing one cause routinely reveals another behind it. Each unpassed test carries its own message; a file that never ran contributes its whole count against its load error.

BlockedCauseOwner
16
The emit ran and answered differently
silent-divergence
untriaged
NOT a root cause — the bucket of tests that still need one. Nothing raised: the emitted code ran to completion and produced a different answer, so each of these has to be followed down its own chain. This is the most valuable cluster on the page and the most expensive: a missing method names itself, a wrong answer does not.
5 of 16 tests
  • test/message_attachment_test · Message::AttachmentTest#test_creating_a_blank_message_with_attachment_will_use_filename_as_plain_text_body
    assert_equal failed
  • test/message_searchable_test · Message::SearchableTest#test_message_body_is_indexed_and_searchable
    assert_equal failed
  • test/message_searchable_test · Message::SearchableTest#test_search_results_are_returned_in_message_order
    assert_equal failed
  • test/message_searchable_test · Message::SearchableTest#test_rich_text_body_is_converted_to_plain_text_for_indexing
    assert_equal failed
  • test/message_test · MessageTest#test_mentionees
    assert_equal failed
4
An emitted method's arity does not match its caller
arity-divergence
roundhouse
The receiver exists and the name resolves; the shape does not. Usually a lowering that dropped or added a parameter — kwargs folded into a positional, a block-form helper emitted in its non-block shape. Each needs the emitted definition read against its call site.
4 tests
  • test/push_subscription_test · Push::SubscriptionTest#test_delivery_is_skipped_when_the_endpoint_no_longer_resolves_to_a_public_ip
    wrong number of arguments (given 1, expected 8)
  • test/push_subscription_test · Push::SubscriptionTest#test_delivery_is_skipped_for_a_non_permitted_host_even_when_it_resolves_publicly
    wrong number of arguments (given 1, expected 8)
  • test/push_subscription_test · Push::SubscriptionTest#test_delivery_is_skipped_for_a_permitted_host_on_a_non_default_port
    wrong number of arguments (given 1, expected 8)
  • test/webhook_test · WebhookTest#test_delivery_with_ok_attachment_reply
    wrong number of arguments (given 1, expected 3)
1
`allow_browser` — the modern-browser gate
allow-browser
roundhouse
campfire's own concern calls `allow_browser versions: VERSIONS, block: -> { render template: "sessions/incompatible_browser" }`, so the version FLOOR is the app's (`{ safari: 17.2, chrome: 120, … }`) and what is missing is ours: the macro, its `block:` fallback, and parsing a User-Agent into a browser plus version. Rails reads that last part from the `useragent` gem's rule table — PORT the table, do not derive it. The file is 7/8 on this one test.
1 test
  • test/sessions_controller_test · SessionsControllerTest#test_new_denied_with_incompatible_browser
    expected "h1" in response body
119
Not yet triaged
unclassified
untriaged
No rule in bench/campfire/suite-causes.json matches these. Triage, then add a rule.
12 of 119 tests
  • test/account_test · (file did not run)
    runtime/active_storage.rb:201: error: incompatible types when assigning to type ‘sp_RbVal’ from type ‘sp_int’ {aka ‘long int’}
  • test/accounts_bots_controller_test · Accounts::BotsControllerTest#test_update
    no implicit conversion of User into Integer
  • test/accounts_logos_controller_test · (file did not run)
    spinel: test/accounts_logos_controller_test.rb:67: unsupported call: node 132636 (CallNode `new_from_buffer`) recv=ConstantPathNode/ty49 argc=2 arg0ty6
  • test/action_text_attachment_test · (file did not run)
    spinel: test/action_text_attachment_test.rb:25: unsupported call: node 132495 (CallNode `from_node`) recv=ConstantPathNode/ty49 argc=1 arg0ty50
  • test/first_runs_controller_test · FirstRunsControllerTest#test_create_is_not_vulnerable_to_race_conditions
    uninitialized constant CyclicBarrier
  • test/membership_test · MembershipTest#test_removing_a_membership_resets_the_user_s_connections
    undefined method 'expects' for an instance of User
  • test/message_attachment_test · Message::AttachmentTest#test_creating_a_message_creates_image_thumbnail
    undefined method 'image' for unknown
  • test/message_attachment_test · Message::AttachmentTest#test_creating_a_message_creates_video_preview
    undefined method 'attached?' for unknown
  • test/messages_boosts_by_bots_controller_test · Messages::Boosts::ByBotsControllerTest#test_create_adds_a_boost_to_the_message_and_returns_it
    undefined method 'rewind' for an instance of String
  • test/messages_boosts_by_bots_controller_test · Messages::Boosts::ByBotsControllerTest#test_create_with_text_content
    undefined method 'rewind' for an instance of String
  • test/messages_boosts_by_bots_controller_test · Messages::Boosts::ByBotsControllerTest#test_create_broadcasts_the_boost
    undefined method 'rewind' for an instance of String
  • test/messages_boosts_by_bots_controller_test · Messages::Boosts::ByBotsControllerTest#test_create_without_content
    undefined method 'rewind' for an instance of String

Rules that matched nothing

A rule at zero is kept, not deleted: it is the tripwire that catches the fix coming undone. What it means depends on why it is at zero.

RuleWhy it reads zero
id-zero-sentinelzero is the intended reading. This is a deliberate divergence rather than a gap, and the rule exists to catch the day it becomes visible again.
paginationlanded in 0ef8fb79; the rule stays as a regression tripwire.
conditional-get`fresh_when` / `stale?` landed in 7ea262e2; the rule stays as a regression tripwire.
turbo-streams-channelthe constant landed in fd1a3259; the rule stays as a regression tripwire.
sti-becomes`becomes!` landed in f2d42854; the rule stays as a regression tripwire.
test-harness-surfacethe family landed over several commits, `fixture_file_upload` last in f86ac0b6; the rule stays as a regression tripwire.

Held at zero by the harness, not by the compiler — the stub ledger below covers what would otherwise fail here: belongs-to-autosave. Deleting the stub is what makes these counts real.

No explanation recorded, so these are the open question: either the cause is cleared and nobody wrote that down, or the failure's message changed and it is now being counted as untriaged above. params-hash-in-path, out-of-scope-gems, route-helper-takes-a-record, active-storage-attachments, view-helper-in-helper-module, broadcast-assertions, rails-module-facade, globalid-sgid, actiontext-attachment-from-node, relation-vs-array, params-object-representation, fixture-accessors.

What the harness compensates for

Nothing: this run spliced no stubs (--no-stubs), so the numbers above are the emit's own.

By test file

A file that never ran is not the same as a file whose tests failed: it died at load, so its whole count is charged to one error and nothing behind that error has been seen yet.

And on this lane there is a third row: a file that never linked. Its tests are charged to its first compile error, and unlike a load failure it has not been observed to do anything at all — the emit may be perfectly correct behind it. Sort the work by asking which of the three a row is: didn't link, linked and diverged, linked and agreed.

FileTestsPassFailFirst error
test/messages_by_bots_controller_test23023never linkedruntime/cgi_io.rb:206: error: incompatible types when assigning to type ‘sp_int’ {aka ‘long int’} from type ‘sp_RbVal’
test/opengraph_fetch_test11011never linkedspinel: test/opengraph_fetch_test.rb:139: unsupported equality: node 133105 (CallNode `!=`) recv=StringNode/ty6 argc=1 arg0ty1
test/opengraph_metadata_test10010FAIL Opengraph::MetadataTest#test_successful_fetch: gem facade: Nokogiri.HTML is stubbed (write-path only; see runtime/gem_facades.rb)
test/push_subscription_test17107FAIL Push::SubscriptionTest#test_rejects_endpoint_whose_host_resolves_to_nothing_without_raising: mocha: Resolv.stubs(:getaddresses) with 1 chained link(s) is n
test/accounts_logos_controller_test606never linkedspinel: test/accounts_logos_controller_test.rb:67: unsupported call: node 132636 (CallNode `new_from_buffer`) recv=ConstantPathNode/ty49 argc=2 arg0ty6
test/users_push_subscriptions_controller_test606never linkedtest/users_push_subscriptions_controller_test.rb:35: error: cannot convert to a pointer type
test/opengraph_location_test725FAIL Opengraph::LocationTest#test_url_validations: assertion failed
test/room_push_test505FAIL Room::PushTest#test_deliver_new_message_to_other_room_users_with_push_subscriptions: uninitialized constant ThreadPoolExecutor
test/users_bans_controller_test725FAIL Users::BansControllerTest#test_create_bans_user_and_creates_ban_records_from_sessions: undefined method 'each' for unknown
test/account_test404never linkedruntime/active_storage.rb:201: error: incompatible types when assigning to type ‘sp_RbVal’ from type ‘sp_int’ {aka ‘long int’}
test/messages_boosts_by_bots_controller_test1284FAIL Messages::Boosts::ByBotsControllerTest#test_create_adds_a_boost_to_the_message_and_returns_it: undefined method 'rewind' for an instance of String
test/unfurl_links_controller_test514FAIL UnfurlLinksControllerTest#test_create: gem facade: Nokogiri.HTML is stubbed (write-path only; see runtime/gem_facades.rb)
test/action_text_attachment_test303never linkedspinel: test/action_text_attachment_test.rb:25: unsupported call: node 132495 (CallNode `from_node`) recv=ConstantPathNode/ty49 argc=1 arg0ty50
test/message_attachment_test303FAIL Message::AttachmentTest#test_creating_a_message_creates_image_thumbnail: undefined method 'image' for unknown
test/message_searchable_test303FAIL Message::SearchableTest#test_message_body_is_indexed_and_searchable: assert_equal failed
test/messages_controller_test15123FAIL MessagesControllerTest#test_index_returns_a_page_before_the_specified_message: undefined method 'id' for unknown
test/opengraph_document_test303FAIL Opengraph::DocumentTest#test_extract_opengraph_tags_using_property_attribute: gem facade: Nokogiri.HTML is stubbed (write-path only; see runtime/gem_facade
test/rooms_controller_test523FAIL RoomsControllerTest#test_show: undefined method 'presence' for unknown
test/rooms_direct_test303never linkedtest/rooms_direct_test.rb:23: error: initialization of ‘sp_Relation *’ {aka ‘struct sp_Relation_s *’} from incompatible pointer type ‘sp_PolyArray *’ [-Werror=i
test/searches_controller_test523FAIL SearchesControllerTest#test_index_initial_view: expected ".message" in response body
test/user_avatar_test303never linkedruntime/active_storage.rb:201: error: incompatible types when assigning to type ‘sp_RbVal’ from type ‘sp_int’ {aka ‘long int’}
test/users_sidebars_controller_test303FAIL Users::SidebarsControllerTest#test_show: assert_match failed: expected "<!DOCTYPE html>\n<html>\n <head>\n <title>Campfire</title>\n\n <meta name=\"
test/webhook_test633FAIL WebhookTest#test_payload: undefined method 'with' for unknown
test/rooms_open_test202never linkedruntime/active_record/connection.rb:143: error: invalid initializer
test/sessions_controller_test862FAIL SessionsControllerTest#test_new_denied_with_incompatible_browser: expected "h1" in response body
test/user_bot_test422FAIL User::BotTest#test_create_bot: mocha: SecureRandom.stubs(:alphanumeric) with 1 chained link(s) is not a stub shape this target serves
test/accounts_bots_controller_test541FAIL Accounts::BotsControllerTest#test_update: no implicit conversion of User into Integer
test/first_runs_controller_test431FAIL FirstRunsControllerTest#test_create_is_not_vulnerable_to_race_conditions: uninitialized constant CyclicBarrier
test/membership_test981FAIL MembershipTest#test_removing_a_membership_resets_the_user_s_connections: undefined method 'expects' for an instance of User
test/message_test321FAIL MessageTest#test_mentionees: assert_equal failed
test/qr_code_controller_test101FAIL QrCodeControllerTest#test_show_renders_a_qr_code_as_a_cacheable_svg_image: gem facade: RQRCode::QRCode.new is stubbed (write-path only; see runtime/gem_fac
test/room_test651FAIL RoomTest#test_revise_memberships: undefined method 'present?' for an instance of User
test/rooms_closeds_controller_test981FAIL Rooms::ClosedsControllerTest#test_remove_yourself: no implicit conversion of Hash into String
test/rooms_opens_controller_test981FAIL Rooms::OpensControllerTest#test_create: assert_equal failed
test/user_test431FAIL UserTest#test_deactivating_a_user_deletes_push_subscriptions_searches_memberships_for_non_direct_rooms_and_changes_their_email_address: mocha: SecureRandom
test/users_avatars_controller_test431FAIL Users::AvatarsControllerTest#test_show_image: assert_equal failed
test/users_profiles_controller_test321FAIL Users::ProfilesControllerTest#test_show: undefined method 'presence' for unknown
test/account_joinable_test220all green
test/accounts_bots_keys_controller_test110all green
test/accounts_controller_test440all green
test/accounts_custom_styles_controller_test330all green
test/accounts_join_codes_controller_test220all green
test/accounts_users_controller_test330all green
test/autocompletable_users_controller_test440all green
test/block_banned_requests_test330all green
test/first_run_test330all green
test/messages_boosts_controller_test220all green
test/rooms_directs_controller_test660all green
test/rooms_involvements_controller_test550all green
test/rooms_refreshes_controller_test110all green
test/sessions_transfers_controller_test220all green
test/user_role_test330all green
test/users_controller_test660all green
test/welcome_controller_test220all green

Emit diagnostics

From the transpile that produced the tree under test: 1,157 files, 0 errors, 893 warnings. Warnings are a modeling-debt ledger rather than a failure — the Ruby target emits through its gaps — so the COUNTS are not comparable to the test failures above.

They are not independent of them either. send_dispatch_failed in particular names a call the analyzer could not resolve, and three of the fixes on this lane came out of those lines before the suite reached them at all — the analyzer had already written the diagnosis. Read the emit log before the fail log.

DiagnosticCount
gradual_untyped372
unresolved_type281
lower_residue150
unsupported53
blank_unlowered36
missing_preload1
Artifact: summary.json — every number on this page comes from it. Source: basecamp/once-campfire at 94a48aacb65a.