ci: merge main to release - #11661
Merged
Merged
Conversation
generate_idnits2_rfc_status() allocated a fixed 10000-element array and indexed it by RFC number, so it raised IndexError for any RFC above 10000. The task has been failing on every run since 2026-06-16, and because ietf/doc/tasks.py computes the blob outside its try block, the exception escapes before anything is written. The served file has been frozen at 9998 characters since then (content-length 10154), stale for all RFCs rather than only 5-digit ones. This commit sizes the array from the highest rfc_number instead. The most recent versions of idnits2 (through 2.17.1) will correctly consume this larger array without modification. It also stops the generator crashing on RFC rows it doesn't expect by excluding RFCs with a null rfc_number (int(None) raises TypeError) and falling back to 'U' for an unrecognised std_level_id (symbols[None] raises KeyError). Document.std_level is nullable, and a single such row would take down the whole task. To allow existing idnits clients at version 2.17.1 and below to keep operating, override RFC 16 to 'O'. This deliberately contradicts both the datatracker and the RFC Editor, which record RFC 16 as updated rather than obsoleted. idnits2 validates its download of this file by matching the first 64 characters against a literal pattern asserting 'O' at position 16. The reason is lost, but it was likely the result of manual curation at tools.ietf.org long ago. Without the override, existing idnits2 clients discard the file as corrupt, fall back to whatever stale copy they have, and silently perform no RFC status checks at all. This is independent of the crash and predates it. Note that the generator uses a floor of 6312. This is required because the RFC 16, RFC 200 and RFC 6312 workarounds write those offsets unconditionally, so the array must reach 6312 regardless of the data; without the floor the generator raises IndexError for any dataset whose highest RFC is below that. It also keeps output identical to the previous behaviour, where the fixed 10000-element array always had those offsets in range. Making the workaround writes conditional instead would remove the need for the floor, but that was not done here. Verification: - Against the production snapshot, positions 1..9993 and the first line are byte-identical to the pre-change algorithm; the blob extends from 9999 to 10031. rfc10001='B', rfc10008='P', rfc10031='P' match their std_level_id values. - idnits2's own download validation (grep -qsE against the first line) now passes, where it fails against the file production serves today. - idnits2's lookup path resolves 5-digit statuses correctly against the generated file: rfc10001 -> Best Current Practice, rfc10031 -> Proposed Standard, rfc10032 -> past end of blob. - ietf.doc.tests (122 tests) and ietf.doc.tests_tasks ietf.doc.tests_downref (15 tests) pass. This commit produced primarily by Claude.
* chore: disable CryptPasswordHasher * chore: adjust "invalid password" message
* feat: first pass attended-regs API (WIP) * refactor: prefetchable Registration.attendance_type * feat: add ticket type methods + refactoring * rename `Registration.attendance_type` to `plenary_attendance_type` * add `plenary_ticket_type` * refactor to ensure consistency, reduce queries, handle bulk requests * refactor: adjust api to match changes * test: meeting RegistrationTests * fix: refactor to avoid mypy limitations * test: Registration onsite() and remote() filters * fix: lint + add some docstrings * refactor: adjust api token endpoint name * perf: bulk annotation in proceedings_attendees * test: start test coverage of new API * test: flesh out the tests * fix: failing test * fix: distinct() in onsite_or_remote() * test: fix/update tests
* refactor: limit sessions to `interim` meetings * refactor: only fetch ietf_group if needed * refactor: filter in db, not python * refactor: limit meeting queries for interim views Presumably a meeting will be no longer be pending or awaiting announcement by a year after its date. * chore: adjust lookback / comments * style: ruff ruff
* perf: cap per-client concurrency on /person/ and /api/v1/ Keyed on the Cloudflare client address, with an empty key for every other path so only these two prefixes are limited. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * perf: query the two authorship tables separately in Person.rfcs() Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * perf: avoid table scans and per-alias queries in lookup_persons Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * perf: assemble the profile page's data in the view Gathers the RFC publication dates, reference counts and replaced-draft set for every listed person in one query each, rather than a query per table cell, and evaluates each per-person list once instead of on every template reference. The expired Internet-Drafts heading now counts the drafts it lists; it counted the replaced ones the list omits. Roles with the same name sort by group acronym instead of by whatever order the query returned. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * perf: cache each rendered profile section A repeat view of a profile, including the revalidation behind a conditional request, now costs neither the queries nor the render. Sections are keyed on person and date rather than position on the page, so the per-section element ids move from a loop counter to the person's id. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * test: guard the profile page's query count and section cache Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * revert: perf: cap per-client concurrency on /person/ and /api/v1/ This reverts commit fed51f0. * refactor: make the profile section cache lifetime a setting PERSON_PROFILE_CACHE_SECONDS, overridable from the environment in the k8s deployment. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: stop dating the profile page's empty-section messages The dates claimed a precision the page does not have: sections are cached independently, so the data behind two of them can differ by a cache lifetime while both printed the same date. Without them nothing in a section depends on when it was rendered, so the cache key no longer needs the date either. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* refactor: date-limit for has_pending_interim() * style: clean up imports in meeting/views.py * refactor: use common lookback time everywhere * style: ruff ruff * test: fix failing tests Put test meetings in the future instead of arbitrary old date
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.