Skip to content

ci: merge main to release - #11661

Merged
jennifer-richards merged 10 commits into
releasefrom
main
Aug 28, 2026
Merged

ci: merge main to release#11661
jennifer-richards merged 10 commits into
releasefrom
main

Conversation

@jennifer-richards

Copy link
Copy Markdown
Member

No description provided.

rjsparks and others added 10 commits August 21, 2026 16:30
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>
* Fix: Point to pending interims in meetings list (#11069)

* test: improve coverage

---------

Co-authored-by: Robert Sparks <rjsparks@nostrum.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
@jennifer-richards
jennifer-richards merged commit e82941d into release Aug 28, 2026
2 checks passed
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Sep 1, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants