Skip to content

Audit the docs, README and homepage against the code, and fix what they promised - #27

Merged
ndbroadbent merged 65 commits into
mainfrom
nathan/docs-audit
Oct 18, 2026
Merged

ndbroadbent merged 65 commits into
mainfrom
nathan/docs-audit

Conversation

@ndbroadbent

@ndbroadbent ndbroadbent commented Oct 17, 2026 •

Copy link
Copy Markdown
Member

Last of twelve stacked PRs for 0.2.0. Every page of the docs, the README and the homepage was checked against what the
code does. Where the code didn't do what a page promised, or did it wrong, the code is fixed here; otherwise the page
is corrected.

Fixes found by the audit

Logger setup

  • Settings in config/initializers (prefer_json_in_development, enable_color_output, color_map,
    filter_noisy_loggers, local_environments) did nothing when LogStruct was enabled at boot: its appenders were
    added before the initializers ran. They're added again after, and only LogStruct's own appenders are replaced, so
    appenders an app adds are kept.
  • rails server in development printed every message twice: once as LogStruct's line and again as text from the
    STDOUT logger Rails broadcasts to. broadcast_to now ignores a logger that writes to STDOUT or STDERR when
    SemanticLogger already does. Loggers added with broadcast_to got each logger << "..." line twice.
  • Tags were never written. logger.tagged("billing"), config.log_tags and ActiveJob's job tags are written as
    tags, and named tags (logger.tagged(user_id: 1)) in ctx, filtered and scrubbed.
  • A log.logstruct subscriber that raised stopped the line from being written. Subscribers now get the entry after
    its line is queued to be written, and a subscriber's error is handled like the app's other errors
    (standard_errors, which raises it from the log call by default).
  • A lograge_custom_options proc's returned Hash was thrown away. It's now merged into the request line.
  • Request lines have source_ip and host, as Rails' own request line does.
  • Times have milliseconds everywhere, like ts. Error backtraces are cut at limits.max_backtrace_lines, now 20 by
    default (they were cut to 5 before the limits applied).
  • An error the app didn't handle is one structured error line (src rails, the error, the request, the response's
    status) instead of Rails' block of text, at Rails' debug_exception_log_level (fatal by default).
  • Sorbet type error lines and reports have a backtrace from the code that failed. The handler that was installed and
    then replaced is removed.

Filtering

  • Breaking: keys in filter_keys_with_hashes (email, email_address) are filtered, with a hash of their value.
    They only changed the summary of keys that were already filtered, so adding :username logged usernames in full.
  • An email address has one hash however it's capitalized, under a key or in a string. Addresses in any script are
    scrubbed.
  • The default key pattern filters apikey, passcode, credit_card, card_number and social_security_number.
  • New authorization_credentials setting, on by default: Bearer and Basic credentials in text are scrubbed.
  • Filtered Hashes and Arrays are summarized without _bytes, like Strings: it said how long the secrets in them were.
  • US phone numbers are scrubbed in their other common formats ((555) 123-4567, 555.123.4567, a leading 1 or
    +1). SSN-shaped parts of longer numbers are left alone. The opt-in scrubbers match dashed MAC addresses and IPv6
    addresses, zones included.
  • SQL bind values aren't filtered for containing words like key or auth: binds are filtered by their column names,
    and values shaped like tokens still are.

Integrations

  • ActiveJob: retry_on, retry_stopped and discard_on lines; a job the queue couldn't take is an error line, not
    an enqueue line; perform_all_later writes a line per job; the inline adapter logs a failed job once.
  • ActiveStorage deletes by prefix raised a type error inside LogStruct; they're delete lines with prefix. Breaking:
    the stream line is removed (Rails sends no such event).
  • Shrine's lines have what its events report (MIME type and size on uploads). CarrierWave logs uploads, downloads
    and deletes, not every retrieve_from_store! and every record save.
  • Mail error lines say "Email delivery failed" with the recipients, not "will retry" (LogStruct doesn't retry), at
    level error. Mailers keep their logger, so an app's own logger.info in a mailer is written; Rails' mail lines are
    detached instead. Where LogStruct is off, mailers still have log_and_ignore_error and the other handlers, so a
    rescue_from that names one doesn't raise NameError.
  • Blocked host lines list the hosts Rails blocked (blocked_hosts).
  • Sidekiq lines logged outside a job have no ctx.
  • Breaking: Ruby 3.3 or newer, the oldest version CI tests. config.integrations.enable_semantic_logger, which
    did nothing, is removed.

Fixes from the second review

A second review of the last four PRs found these. The commits at the end of this branch fix them, and what turned up
while fixing them:

  • A string cut at limits.max_string_bytes could keep the start of a credential longer than the 256 bytes the
    scrubbers see past the cut: a URL password whose closing @ was beyond what they saw (or that has an @ of its
    own), and Basic credentials cut short, which don't decode. Both are replaced at the end of what the scrubbers
    saw, so values they saw whole aren't touched.
  • Breaking: ActiveStorage upload and download lines don't have filename, mime_type, size or metadata
    (Rails' events never carry them; metadata lines have the mime_type instead), and Shrine's upload lines leave out
    the file's original name, which can name a person. Shrine's upload options are logged with the file names taken
    out of a content_disposition.
  • perform_all_later on Sidekiq's adapter wrote no lines: the adapter says only how many jobs it enqueued. Each job
    has its line when it enqueued them all, there's one warn line with the counts when it didn't, and one error line
    when the adapter raised. With Rails' own enqueue loop, a refused job keeps its error line and the error that
    stopped the loop goes to the job that raised it.
  • The release workflow checks the tag against version.rb before any job runs, so the provider sync can't publish
    for a mismatched tag.
  • The unhandled error line has typed status, cause_class and cause_message fields instead of
    additional_data, and writes its trace as strings when the app has no backtrace cleaner (it raised a type error).
  • filter_noisy_loggers wrote only the noisy loggers' lines and left out every other line (SemanticLogger keeps the
    names a Regexp filter matches). It's a Proc that leaves them out.
  • Colored lines (development, opt-in) wrote named tags without key filtering, so logger.tagged(password: ...)
    wrote the password. Named tags are filtered as a JSON line's ctx is, and colored Hash and LogStruct lines are the
    JSON line, pretty-printed, with their message and tags.
  • With any Rails path filter configured (even "card.number"), every line and top-level value was copied to
    indifferent access before the size limits cut it. The parameters are built only when a three-argument filter
    block reads them (PathFilterMatcher gains uses_root:).
  • Breaking: log_and_report_error always reports the error and never raises it, as its name says (in Raise
    mode it raised without reporting). log_and_reraise_error always raises, and reports only in the Report modes.
  • A custom error_reporting_handler that raised (a timeout calling its service) replaced the error it was
    reporting, and made log_and_report_error raise. Its error is logged as a logstruct error line instead.
  • No T.must in production code, and the CarrierWave tests are type-checked.

Rails 8.2 (Rails main)

CI's pilot job runs the Rails app tests on Rails main, where the framework log subscribers read Rails.event and
have no detach_from:

  • Apps on Rails main boot: detaching ActiveStorage's subscriber raised NoMethodError. One helper detaches
    ActiveStorage's, ActionMailer's, ActiveRecord's and ActiveJob's subscribers on every version.
  • Requests on Rails main log only the request line. Lograge detaches Rails' "Processing by" and "Completed 200 OK"
    lines only on earlier versions, so LogStruct unsubscribes them from Rails.event there (unless
    keep_original_rails_log is set).

Params Rails can't parse

When Rails can't parse a request's params, nothing can filter them, and two lines wrote them anyway (on every Rails
version):

  • Rails' debug line for a body it can't parse (malformed JSON) is the whole body. LogStruct writes the body's size and
    type instead.
  • The parsers quote the input where they stopped (JSON's "unexpected character: '...'", Rack's "invalid %-encoding
    (...)"), and the error line copied that into cause_message, or into msg through Rails' "Invalid request
    parameters: ...". Those lines keep the error and cause classes and Rails' words before the input.

Docs, README and homepage

  • New pages: When LogStruct Runs, Log Fields, Upgrading to 0.2.0, Troubleshooting, and pages for ActionMailer,
    ActiveJob, GoodJob, Sidekiq, SQL and Security. Filtering Sensitive Data, SOC 2 and Your Logs, Logging to STDOUT, the
    Postmark guide and the comparison with other gems are rewritten.
  • Every Ruby example on the site is a test in test/code_examples, and the JSON shown under it is what the code
    writes.
  • The site's example lines go through a TypeScript port of the formatter, filters and scrubbers, tested against what
    the gem writes for the same values. The integrations page rendered differently on the server and in the browser
    (hydration error 418, from timestamps); its lines now use one fixed time.
  • The supported versions page reads the runtime dependencies, the Ruby and Rails versions CI tests, and the version of
    each integrated gem the tests use.
  • On phones the sidebar is a menu button instead of a list above every page.
  • The README says what LogStruct changes in an app, and links the docs. The CHANGELOG covers every change in 0.2.0.

Tooling

  • CI installs the gems the integration tests need (they were skipped on CI: the matrix runs without the development
    group), and runs the site's Playwright specs.
  • The spellcheck covers TypeScript.
  • The workflows' actions are on their Node 24 releases (GitHub runs Node 20 actions on Node 24 and warns), pinned by
    SHA.
  • task gem:release tags the version on main and pushes the tag. Bundler's rake release refuses, and the
    post-commit hook no longer tags commits that change version.rb.

Release

The last commit sets the version to 0.2.0 and dates the changelog. Merging this stack and tagging v0.2.0 on
main releases it.

Testing

New tests for each fix, each checked to fail without it. At this branch's tip: 490 unit tests pass, and 75 Rails app
tests on Rails 7.1.6 and on Rails main, as do Sorbet, RuboCop, cspell, Biome, tsc, Jest (184 tests), the site build
with its link check, Playwright (14 specs), actionlint and the generated-files check.


Stack for 0.2.0, merged in order: #16 → #17 → #18 → #19 → #20 → #21 → #22 → #23 → #24 → #25 → #26 → #27

Their comments (shown in the YARD docs) promised log rotation, compression, hot reloading, "10-100x" speed and
zero-copy serialization, said the color formatter is on by default in development (it needs
prefer_json_in_development off) and showed a Log::Plain example that doesn't work.
Tags (logger.tagged("billing"), Rails' config.log_tags, ActiveJob's job tags) never reached the JSON line: the
formatter read only the request ID and Sidekiq job context named tags. Tags are now written as tags, and other
named tags (logger.tagged(user_id: 1)) in ctx with the job's context, filtered and scrubbed like the rest of the
line. The tagged logging test asserted nothing about tags.
- Keys in filter_keys_with_hashes are filtered, with a hash of their value. They only changed the summary of
  keys that were already filtered, so adding :username logged usernames in full. The email and email_address
  keys (the defaults) become a filtered summary with the email's hash, as they already did where Rails'
  filter_parameters include :email.
- An email address has one hash however it's written (User@Example.com and user@example.com), and the same
  hash under a filtered key as in a scrubbed string.
- Email addresses with letters of any script are scrubbed (an accented name). Strings are made valid UTF-8
  before scrubbing.
- The default key pattern filters apikey, passcode, credit_card, card_number and social_security_number.
- New authorization_credentials setting, on by default: Bearer tokens and Basic credentials in text are
  scrubbed ("Bearer [FILTERED]").
- Filtered Hashes and Arrays are summarized without their size, like Strings: _bytes said how long the secrets
  in them were.
- Lines written with << reach broadcast loggers scrubbed.
When LogStruct was enabled at boot (LOGSTRUCT_ENABLED, production servers), it added its appenders before
config/initializers ran and never again, so prefer_json_in_development, enable_color_output, color_map,
filter_noisy_loggers and local_environments set in an initializer did nothing. The logstruct.setup initializer
now adds the appenders again after the initializers.
A mailer with rescue_from ..., with: :log_and_ignore_error (as the Postmark guide shows) raised NameError in
development, consoles, Rake tasks and other processes where LogStruct doesn't set up ActionMailer, instead of
handling the error. There, plain versions of log_and_ignore_error, log_and_report_error and log_and_reraise_error
log the error with the mailer's logger, then ignore it, report it to Rails.error or raise it again.
The proc's return value was thrown away, so a proc returning a Hash of fields (as Lograge's custom_options do, and
as the configuration example showed) added nothing. A returned Hash is now merged into the request line; a proc
can still change options instead.
…gers

- Setting up LogStruct's appenders again (after config/initializers) replaces
  only the ones LogStruct added, so appenders an app adds in an initializer are
  kept. SemanticLogger's clear_appenders! did nothing while its thread was
  stopped.
- Loggers added with broadcast_to got each `logger << "..."` line twice.
- `rails server` in development broadcast to a STDOUT logger, which printed
  every message again as text beside LogStruct's line. broadcast_to ignores a
  logger that writes to STDOUT or STDERR when SemanticLogger already does.
- A color_map changes only the colors it names.
- Tests no longer stop SemanticLogger's thread, which left later tests' lines
  waiting in its queue.
A subscriber that raised stopped the line from being written and raised from
the app's log call. Subscribers now get the entry after its line is written,
and a subscriber's error is handled like the app's other errors
(standard_errors: logged in production, raised in tests). Lines written while
handling it aren't sent to the subscribers again.
- retry_on writes a retry line (the exception, and the wait before the retry),
  retry_stopped a line when it runs out of attempts, and discard_on a discard
  line. The exception was in no line.
- A job the queue couldn't take (an EnqueueError that perform_later keeps on
  the job, or an exception from the adapter) is an error line instead of an
  enqueue line. A job a before_enqueue callback stopped writes no line, and a
  job a before_perform callback stopped no finish line.
- perform_all_later writes an enqueue or schedule line for each job it
  enqueued, and an error line for each it couldn't.
- With the inline adapter, a failed perform_later writes one error line: the
  error that raised out of the enqueue was logged again.
- A finish line's ts is when the job finished.
- Enqueue lines lose `retries`, which nothing set.
- Deleting files by prefix (a blob's variants, when an image is purged) is a
  delete line with `prefix`. It raised a type error inside LogStruct and wrote
  no line, since such a delete has no key.
- Remove Log::ActiveStorage::Stream and the stream event: Rails sends no
  service_stream event, so no line ever had it. Streamed downloads are
  download lines.
- Upload lines have the file's filename, mime_type and size, from the metadata
  Shrine's upload event carries.
- Metadata lines have how long extracting the metadata took. They had a
  `metadata` field and exists lines an `exist` field that Shrine's events
  don't carry, so they were never written.
- The integration no longer passes Shrine's IO and name payload on to the line.
- An upload line is written when store! stores a cached file. A record's save
  calls store! on every uploader, which wrote an upload line with no file.
- download! (a remote URL fetched into the cache) writes a download line, and
  remove! a delete line.
- retrieve_from_store! isn't logged: it only points the uploader at a stored
  file, and ran each time a record's mounted file was read.
- A problem building the line is a LogStruct error (logstruct_errors: logged in
  production, raised in development and test), so it can't fail an upload in
  production.
- Mail error lines say "Email delivery failed" with the mail's recipients (to,
  cc and bcc, scrubbed like any string), not "Email delivery error, will
  retry": LogStruct doesn't retry anything, and the error's own recipients were
  often missing.
- The entry a mailer's own rescue_from handler logs has level error, like its
  line. It said info, which log.logstruct subscribers saw.
- The fallback handlers (where LogStruct is off) share one set of methods
  between a mailer and the mailer class.
Blocked host lines have blocked_hosts: every host Rails blocked (the Host
header, and X-Forwarded-Host). They had allowed_hosts and allow_ip_hosts fields
that Rails doesn't pass to the response app, so they were never written.
An error the app didn't handle (Rails' 500 page, and the errors Rails turns into
a 404 or 422) is an error line with src rails, the error's class and message,
the trace Rails logs, the request's path, method and IP, and the response's
status, instead of Rails' block of text. It's written where DebugExceptions
logs, at config.action_dispatch.debug_exception_log_level (fatal by default),
and log_rescued_responses = false still leaves out the 404s and 422s. A CSRF or
IP spoofing error has only its security line.
The Sidekiq logger reads Sidekiq::Context once, and writes no ctx when there's
no job context, instead of an empty Hash.
- Every time in a struct line (scheduled_at, started_at, finished_at, ...) is
  written with milliseconds, like ts.
- Error lines' backtraces were cut to 5 lines before the formatter's limits
  applied. They're cut at limits.max_backtrace_lines, whose default is now 20.
Type error lines and reports have a backtrace that starts at the code that
failed, below sorbet-runtime's frames. Method signature errors weren't raised,
so they had none, and the others started inside sorbet-runtime.
…inds by key only

The phone scrubber now matches US numbers written with a leading 1
(1-555-123-4567), and the IPv6 scrubber matches addresses with a zone
index (fe80::1%en0). The SSN scrubber leaves SSN-shaped parts of longer
numbers alone (a part number like 123-45-6789-0).

SQL bind values were filtered when a word in the value looked sensitive,
which filtered ordinary names and left real secrets under ordinary
column names. Binds are now filtered by their column's key, like every
other value, plus long values with no spaces (tokens and digests).

ActiveRecordTest restores the notifier it replaces, so later tests keep
the ActiveJob subscriber.
…e, and spellcheck TypeScript

CI's Ruby matrix runs without the development group, so the gemspec's
development dependencies (the gems the integrations are tested with)
weren't installed and those tests were skipped. The gemspec's
dependencies now go in the test group.

The docs job runs the Playwright specs against the built site.

The spellcheck covers .ts and .tsx files, and drops the docs lockfile
dictionary that nothing generated. Contractions written as &apos; and
ANSI color codes in strings are ignored, so pages don't need their own
cspell:ignore lines. Playwright's results folder is no longer committed.
…ptions

An upload's content_disposition option (which Shrine's upload_options plugin is
often set up to build from the file's name) was logged as given, with the file's
original name in it. Its filename and filename* parameters are replaced.
…eported one

A custom error_reporting_handler that raised (a timeout calling its service) made
log_and_report_error raise, and replaced the original error in
log_and_reraise_error and in handle_exception's Report modes. The reporter's
error is now a logstruct error line, and the reported error is handled as before.
The cut-end cleanup ran on the kept part, so a value the scrubbers had seen whole
("Basic plan" ending at the cut, or a URL that fit in what they saw) lost its end
too. It now runs on the end of what the scrubbers saw, where a value they saw only
part of ends. A string the scrubbers saw whole, which their replacements made
short enough, is kept whole.
…e job that raised

When Rails' own enqueue loop raised, the error line went to the first job that
wasn't enqueued, which could be one an earlier ActiveJob::EnqueueError refused,
and that job's own error was lost. A refused job keeps its error line, the error
goes to the job the loop stopped at, and an adapter that marked every job
enqueued before raising gets an error line for the batch.
On Rails main, ActiveStorage's, ActionMailer's and ActiveRecord's log subscribers are
ActiveSupport::EventReporter::LogSubscribers that read Rails.event, and have no
detach_from. Detaching ActiveStorage's raised NoMethodError at boot. One helper now
detaches a subscriber either way, as the ActiveJob integration already did.
Lograge detaches Rails' ActionController and ActionView log subscribers from
ActiveSupport::Notifications. On Rails main they read Rails.event instead, so every
request also logged "Processing by" and "Completed 200 OK" text lines beside the
request line. LogStruct now unsubscribes them from Rails.event after initialization,
unless lograge's keep_original_rails_log is set.
checkout, setup-node, upload-artifact, download-artifact, the Pages actions,
setup-go, setup-terraform and setup-tflint move to their Node 24 releases, pinned
by SHA. GitHub warned that it forces Node 20 actions to run on Node 24.
When Rails can't parse a request's body (malformed JSON), log_parse_error_once
writes the whole body at debug level, where nothing filters it, so a password in it
was logged. With the rack error handler on, LogStruct logs the body's size and media
type instead. The request line and the ParseError's error line are unchanged.
When Rails can't parse a request's params, the parser's message quotes the input
where it stopped: JSON's "unexpected character: '<body>'", Rack's "invalid
%-encoding (<value>)". The error line copied it into cause_message, and Rails'
BadRequest wraps it in its own message ("Invalid request parameters: ..."), so a
password there was logged unfiltered, at any log level.

Error lines for Rails' ParseError (and its ParamErrors), Rack's params errors and
errors raised because of them keep the error and cause classes and Rails' words
before the input, without the parser's message.
…self

An app that rescues a request's params error and passes it to
LogStruct.handle_exception (or logs it with Rails.logger.error) got a line built by
Log.from_exception, which copied the error's message: for Rack's errors, the value
it couldn't decode. ErrorLines' rule moves to ParamsErrors, which Log.from_exception
uses too.
Rails.logger.error(error) goes through LogStruct's SemanticLogger formatters, not
Log.from_exception. The JSON formatter's error line copied the exception's message,
and the color formatter wrote SemanticLogger's text for the exception and each
cause, so a params error logged the input its parser quoted. Both use ParamsErrors
now; for the color text, ParamsErrors.replacements gives each quoting message in
the chain, longest first.
…ored output

Rack's and Rails' depth limits raise without a message, so the message is the class name. The colored output
replaced it everywhere, including the class label: "Cause: (left out: ...): (left out: ...)". A message that is the
class name quotes no input, so it stays.
@coderabbitai

coderabbitai Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

  • Run on-demand review

This review includes 190 billable files and costs up to $47.50.

  • Ask an admin to make reviews automatic

Open in CodeRabbit

Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing.

Or wait 39 minutes for your next included review.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available. Your 54 included PR review attempts over the past 7 days set your current allowance at 2 reviews per hour.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: 5932a811-3014-4941-a063-5987bb5a917c
📥 Commits

Reviewing files that changed from the base of the PR and between e91b402 and fbe721d.

⛔ Files ignored due to path filters: 1
  • Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing: 190
  • .cspell.json
  • .cspell/project-words.txt
  • .github/workflows/deploy-docs.yml
  • .github/workflows/rails-main.yml
  • .github/workflows/release.yml
  • .github/workflows/terraform-example.yml
  • .github/workflows/test.yml
  • AGENTS.md
  • CHANGELOG.md
  • DEVELOPMENT.md
  • Gemfile
  • README.md
  • Rakefile
  • Taskfile.gem.yml
  • docs/.cspell/lockfile-words.txt
  • docs/.gitignore
  • docs/app/docs/comparison/page.tsx
  • docs/app/docs/configuration/page.tsx
  • docs/app/docs/filtering-sensitive-data/page.tsx
  • docs/app/docs/getting-started/page.tsx
  • docs/app/docs/guides/postmark-error-handling/page.tsx
  • docs/app/docs/integrations/action-mailer/page.tsx
  • docs/app/docs/integrations/active-job/page.tsx
  • docs/app/docs/integrations/good-job/page.tsx
  • docs/app/docs/integrations/page.tsx
  • docs/app/docs/integrations/security/page.tsx
  • docs/app/docs/integrations/sidekiq/page.tsx
  • docs/app/docs/integrations/sql/page.tsx
  • docs/app/docs/layout.tsx
  • docs/app/docs/log-fields/__tests__/log-field-usage.test.ts
  • docs/app/docs/log-fields/example-lines.json
  • docs/app/docs/log-fields/log-field-usage.ts
  • docs/app/docs/log-fields/page.tsx
  • docs/app/docs/logging/page.tsx
  • docs/app/docs/page.tsx
  • docs/app/docs/soc2-compliance/page.tsx
  • docs/app/docs/sorbet-types/page.tsx
  • docs/app/docs/supported-versions/page.tsx
  • docs/app/docs/terraform/page.tsx
  • docs/app/docs/troubleshooting/page.tsx
  • docs/app/docs/upgrading/page.tsx
  • docs/app/docs/when-logstruct-runs/page.tsx
  • docs/app/globals.css
  • docs/app/layout.tsx
  • docs/app/page.tsx
  • docs/components/dashboard-examples.tsx
  • docs/components/integration-examples.tsx
  • docs/components/nested-doc-nav-item.tsx
  • docs/e2e/playwright/docs.spec.ts
  • docs/e2e/playwright/filtering-page.spec.ts
  • docs/e2e/playwright/integration-pages.spec.ts
  • docs/e2e/playwright/log-fields.spec.ts
  • docs/lib/__tests__/enum-descriptions.test.ts
  • docs/lib/__tests__/gem-descriptions.test.ts
  • docs/lib/__tests__/gemspec-parser.test.ts
  • docs/lib/__tests__/log-structure-descriptions.test.ts
  • docs/lib/enum-descriptions.ts
  • docs/lib/gem-descriptions.ts
  • docs/lib/gemspec-parser.ts
  • docs/lib/integration-helpers.ts
  • docs/lib/log-generation/__tests__/formatter.test.ts
  • docs/lib/log-generation/__tests__/log-generator.test.ts
  • docs/lib/log-generation/__tests__/random-data-generator.test.ts
  • docs/lib/log-generation/__tests__/string-scrubber.test.ts
  • docs/lib/log-generation/formatter.ts
  • docs/lib/log-generation/index.ts
  • docs/lib/log-generation/log-generator.ts
  • docs/lib/log-generation/param-filters.ts
  • docs/lib/log-generation/random-data-generator.ts
  • docs/lib/log-generation/sample-data.ts
  • docs/lib/log-generation/string-scrubber.ts
  • docs/lib/log-structure-descriptions.ts
  • docs/test-results/.last-run.json
  • lefthook.yml
  • lib/log_struct.rb
  • lib/log_struct/concerns/configuration.rb
  • lib/log_struct/concerns/error_handling.rb
  • lib/log_struct/config_struct/filters.rb
  • lib/log_struct/config_struct/integrations.rb
  • lib/log_struct/config_struct/limits.rb
  • lib/log_struct/enums/event.rb
  • lib/log_struct/enums/log_field.rb
  • lib/log_struct/formatter.rb
  • lib/log_struct/integrations.rb
  • lib/log_struct/integrations/action_mailer.rb
  • lib/log_struct/integrations/action_mailer/error_handling.rb
  • lib/log_struct/integrations/action_mailer/fallback_error_handlers.rb
  • lib/log_struct/integrations/active_job.rb
  • lib/log_struct/integrations/active_job/log_subscriber.rb
  • lib/log_struct/integrations/active_record.rb
  • lib/log_struct/integrations/active_storage.rb
  • lib/log_struct/integrations/carrierwave.rb
  • lib/log_struct/integrations/good_job/logger.rb
  • lib/log_struct/integrations/host_authorization.rb
  • lib/log_struct/integrations/lograge.rb
  • lib/log_struct/integrations/puma.rb
  • lib/log_struct/integrations/rack_error_handler.rb
  • lib/log_struct/integrations/rack_error_handler/debug_exceptions_logging.rb
  • lib/log_struct/integrations/rack_error_handler/error_lines.rb
  • lib/log_struct/integrations/rack_error_handler/parse_error_logging.rb
  • lib/log_struct/integrations/rails_log_subscribers.rb
  • lib/log_struct/integrations/shrine.rb
  • lib/log_struct/integrations/sidekiq/logger.rb
  • lib/log_struct/integrations/sorbet.rb
  • lib/log_struct/log.rb
  • lib/log_struct/log/active_job.rb
  • lib/log_struct/log/active_job/discard.rb
  • lib/log_struct/log/active_job/enqueue.rb
  • lib/log_struct/log/active_job/retry.rb
  • lib/log_struct/log/active_job/retry_stopped.rb
  • lib/log_struct/log/active_storage.rb
  • lib/log_struct/log/active_storage/delete.rb
  • lib/log_struct/log/active_storage/download.rb
  • lib/log_struct/log/active_storage/exist.rb
  • lib/log_struct/log/active_storage/metadata.rb
  • lib/log_struct/log/active_storage/upload.rb
  • lib/log_struct/log/active_storage/url.rb
  • lib/log_struct/log/error.rb
  • lib/log_struct/log/security/blocked_host.rb
  • lib/log_struct/log/shrine/exist.rb
  • lib/log_struct/log/shrine/metadata.rb
  • lib/log_struct/log/shrine/upload.rb
  • lib/log_struct/param_filters.rb
  • lib/log_struct/params_errors.rb
  • lib/log_struct/railtie.rb
  • lib/log_struct/semantic_logger/color_formatter.rb
  • lib/log_struct/semantic_logger/concerns/log_methods.rb
  • lib/log_struct/semantic_logger/formatter.rb
  • lib/log_struct/semantic_logger/logger.rb
  • lib/log_struct/semantic_logger/setup.rb
  • lib/log_struct/shared/serialize_common.rb
  • lib/log_struct/string_scrubber.rb
  • lib/log_struct/version.rb
  • logstruct.gemspec
  • rails_test_app/templates/app/controllers/logging_controller.rb
  • rails_test_app/templates/config/routes.rb
  • rails_test_app/templates/test/integration/action_mailer_logger_test.rb
  • rails_test_app/templates/test/integration/active_storage_test.rb
  • rails_test_app/templates/test/integration/log_tags_test.rb
  • rails_test_app/templates/test/integration/puma_integration_test.rb
  • rails_test_app/templates/test/integration/request_logging_test.rb
  • rails_test_app/templates/test/integration/shrine_logging_test.rb
  • rails_test_app/templates/test/integration/sql_bind_params_test.rb
  • rails_test_app/templates/test/integration/unhandled_errors_test.rb
  • schemas/log_sources/active_job.yml
  • schemas/log_sources/active_storage.yml
  • schemas/log_sources/error.yml
  • schemas/log_sources/security.yml
  • schemas/log_sources/shrine.yml
  • schemas/meta/log-fields.json
  • scripts/generate_lockfile_words.sh
  • scripts/rails_tests.sh
  • scripts/spellcheck.sh
  • test/code_examples/configuration_test.rb
  • test/code_examples/configure_handlers_test.rb
  • test/code_examples/exhaustiveness_test.rb
  • test/code_examples/filtering_test.rb
  • test/code_examples/guides_test.rb
  • test/code_examples/integration_pages_test.rb
  • test/code_examples/log_fields_test.rb
  • test/code_examples/logging_test.rb
  • test/code_examples/rails_initializer_test.rb
  • test/code_examples/sorbet_types_test.rb
  • test/code_examples/troubleshooting_test.rb
  • test/integrations/action_mailer_test.rb
  • test/log_struct/color_formatter_test.rb
  • test/log_struct/configuration_test.rb
  • test/log_struct/error_handling_test.rb
  • test/log_struct/formatter_test.rb
  • test/log_struct/integrations/action_mailer/error_handling_test.rb
  • test/log_struct/integrations/action_mailer/fallback_error_handlers_test.rb
  • test/log_struct/integrations/active_job/log_subscriber_test.rb
  • test/log_struct/integrations/active_record_test.rb
  • test/log_struct/integrations/carrierwave_test.rb
  • test/log_struct/integrations/good_job/logger_test.rb
  • test/log_struct/integrations/host_authorization_test.rb
  • test/log_struct/integrations/lograge_formatter_test.rb
  • test/log_struct/integrations/rack_error_handler_test.rb
  • test/log_struct/integrations/sidekiq_test.rb
  • test/log_struct/integrations/sorbet_test.rb
  • test/log_struct/log/good_job_test.rb
  • test/log_struct/notifications_test.rb
  • test/log_struct/param_filters_test.rb
  • test/log_struct/params_errors_test.rb
  • test/log_struct/semantic_logger_test.rb
  • test/log_struct/string_scrubber_test.rb
  • test/support/docs_page.rb
  • test/test_helper.rb
  • test/workflows/release_workflow_test.rb
  • tools/codegen/templates/typescript/event.ts.erb
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@ndbroadbent
ndbroadbent changed the base branch from nathan/repo-hardening to main October 18, 2026 00:41
@ndbroadbent
ndbroadbent merged commit 8bb8303 into main Oct 18, 2026
1 of 2 checks passed
@ndbroadbent
ndbroadbent deleted the nathan/docs-audit branch October 18, 2026 01:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant