Skip to content

Integration int/m1-wave14

No Date Ruling Reason
INT-W14/2 2026-10-14 M1-38, M1-40, M1-41 and M1-47 all took migration 18. M1-38 keeps 00018_identity_device_pairings.sql; M1-40 becomes 00019_identity_passkey_credentials.sql, M1-41 00020_identity_login_flows.sql, M1-47 00021_feature_flags.sql and M1-51 (built on wave 12 with 16) 00022_agents.sql, content and checksum unchanged. Migration numbers are per base (INT-W13/2); the order is the integration order.
INT-W14/3 2026-10-14 M1-40 and M1-41 both added auth.login_flow_ttl (same default 10m, same bounds) and EnrollmentCodes.MatchID over the query LockEnrollmentCode with the same rules; each is kept once, with the M1-40 form. AuthCleanup takes the CleanupStore of M1-41 and the Expiry of M1-38: one unit of work deletes the challenges and the login flows, then the device and pairing expiry run as in M1-38. The two definitions are equal in behaviour; the cleanup job must do the work of both tickets.
INT-W14/4 2026-10-14 api/routes/gen splits the package oapi-codegen writes before the type ServerInterface into api/rest/models.gen.go (types of schemas, parameters and bodies) and api/rest/rest.gen.go (std-http and strict server); each half keeps the header and only the imports it uses (splitRest). The fixture package is split the same way; the lint exclusions of rest.gen.go that concern the models (G117, closer.Close) name both files. With M1-38, M1-40 and M1-41 together rest.gen.go reached 1049 KiB on the integration branch (on main already with M1-40, M1-40/13), above repo.max_file_kb (1024), so the hook check-added-large-files and make lint failed. M1-17/16 leaves the split to the change that reaches the limit; the declarations move byte for byte, so no behaviour changes. TestSplitRest_* and TestRealRest_BelowMaxFileKB hold it.
INT-W14/5 2026-10-14 M1-41 and M1-43 both added LoginCompletion.AllowPending with the same meaning; it is kept once and serves both drivers. loginAttrs of M1-38/M1-41 also writes provider_id of a driver login (the loginEntry rule of M1-43). ServiceDeps.Random is one source for the pairing codes (M1-38) and the handle suffixes of the header login (M1-43), default crypto/rand. Sessions.rotate keeps the committed-answer form of M1-41; the failed header binding of M1-43 answers session_revoked through it after the IdP recheck. The duplicate helpers causeNoMapping, attrIdentityID and isDPoPError (same values) are kept once. The session test world passes the binds of M1-41 through the configurable builder of M1-43. The tickets changed the shared login completion and refresh in parallel; the union keeps each ticket's rule.
INT-W14/6 2026-10-14 Test code only: the M1-41 case TestOIDC_Login/TestIDPRecheckForcesRelogin approves its new device (SQL) before it advances the clock by most of auth.idp_recheck_interval. With M1-38 a pending device older than auth.device_pending_ttl counts as revoked, so the refresh inside the interval answered session_revoked before the recheck rule could act; the case tests the recheck, not the device expiry, which M1-38 tests itself.
INT-W14/7 2026-10-14 Test code only: the HTTP test world of M1-48 (authz/adapters/httpapi/env_test.go, built on wave 12) builds identity as the current wiring requires: the identity keys of M1-37, M1-38, M1-40 and M1-41, the instance settings of M1-46 and the feature flags of M1-47 instead of the removed PersonalTokens switch; tokens.personal_enabled is switched on by a feature_flags row, as the brief's "personal tokens on" asks. authz.PrincipalSource has both HasActivePasskey (M1-40) and Refs (M1-48). M1-47 replaced IdentityWrites.PersonalTokens by Flags, so the M1-48 tests no longer compiled; the change keeps their meaning.
INT-W14/8 2026-10-14 Test code only: the two test worlds of M1-51 (agents/app/env_test.go, agents/adapters/httpapi/env_test.go, built on wave 12) build identity with the identity keys of M1-37, M1-38, M1-40 and M1-41 and the instance settings and feature flags of M1-46 and M1-47, and the Admin use cases with the dependencies M1-48 made required (events, scopes, cursors, configuration). The Identity struct carries Principals (M1-51) beside the M1-38 to M1-43 fields; NewIdentity builds the principal writer after the flag switch and the trusted header driver. The M1-51 tests failed at setup with "out of range" and "needs every dependency" on the merged wiring; the change keeps their meaning.
INT-W14/9 2026-10-14 M1-38 and M1-45 both declared identity.DeviceRevoked and the query LockDevice (same SQL); the event keeps the typed reason of M1-38 and gains At of M1-45, the query and its repository method stay once in devices.sql/devices.go, and the duplicate audit constants are kept once. AuthCleanup runs the challenge and login flow deletion, the pending device and pairing expiry of M1-38 and the inactive device sweep of M1-45, in that order. The Authenticator computes CredentialInactive (M1-45) after the pending expiry of M1-38, then the header binding of M1-43, and records activity only for a device that is not inactive. GetAuthState reads approved_at (M1-45) and created_at (M1-38). Test code only: the M1-45 helper relogin is freshPhone (M1-38 has a relogin), the M1-45 tests use the personalOff fake instead of the removed PersonalTokensDefault, set auth.device_pending_ttl, and the inactivity case keeps the creation time of its pending device, which M1-38 would otherwise revoke as pending_expired. The tickets were built on wave 12 and wave 13 in parallel; the union keeps each ticket's rule.
INT-W14/10 2026-10-14 splitRest writes its import block through two helpers (importLines, writeImports). The constant fieldCodeTaken of identity/app comes with the ticket that adds the fourth use of the literal. assemble was above the gocognit limit, so make lint failed; the output is byte for byte the same.