From 68d92cf254bccf4198c647eb93aff990e6bcf037 Mon Sep 17 00:00:00 2001 From: Kierre Date: Sun, 25 Jan 2026 11:26:52 -0500 Subject: [PATCH 1/7] `m.room.power_levels` events accept values as floats --- .../rooms/fragments/v1-floaty-power-levels.md | 34 +++++++++++++++++++ content/rooms/v1.md | 2 ++ content/rooms/v2.md | 2 ++ content/rooms/v3.md | 2 ++ content/rooms/v4.md | 2 ++ content/rooms/v5.md | 2 ++ 6 files changed, 44 insertions(+) create mode 100644 content/rooms/fragments/v1-floaty-power-levels.md diff --git a/content/rooms/fragments/v1-floaty-power-levels.md b/content/rooms/fragments/v1-floaty-power-levels.md new file mode 100644 index 00000000..8e395a43 --- /dev/null +++ b/content/rooms/fragments/v1-floaty-power-levels.md @@ -0,0 +1,34 @@ + +##### `m.room.power_levels` Events Accept Values as Floats + +When the value is a float, anything after the decimal point is removed, +making e.g. `5.17`, `5.42`, and `5` functionally identical. + +For example, this is a valid `m.room.power_levels` event in this room version: + +```json +{ + "content": { + "ban": 50, + "events": { + "m.room.power_levels": 100 + }, + "events_default": 0, + "state_default": 50, + "users": { + "@example:example.org": 100, + "@alice:localhost": 50, + "@bob:localhost": 50.57 + }, + "users_default": 0 + }, + "origin_server_ts": 1432735824653, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "state_key": "", + "type": "m.room.power_levels" +} +``` + +In this example, both `@bob:localhost` and `@alice:localhost` have the same effective +power level of `50`, even though the values are visually different. diff --git a/content/rooms/v1.md b/content/rooms/v1.md index 773d7caa..c537b337 100644 --- a/content/rooms/v1.md +++ b/content/rooms/v1.md @@ -59,6 +59,8 @@ Events in version 1 rooms have the following structure: {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v1-auth-rules" %}} diff --git a/content/rooms/v2.md b/content/rooms/v2.md index f0ea1ac7..17401932 100644 --- a/content/rooms/v2.md +++ b/content/rooms/v2.md @@ -57,6 +57,8 @@ Events in rooms of this version have the following structure: {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v1-auth-rules" %}} diff --git a/content/rooms/v3.md b/content/rooms/v3.md index 6a3522b7..b89f7b59 100644 --- a/content/rooms/v3.md +++ b/content/rooms/v3.md @@ -87,6 +87,8 @@ The complete structure of a event in a v3 room is shown below. {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% boxes/note %}} diff --git a/content/rooms/v4.md b/content/rooms/v4.md index bd5651e1..bc8f620d 100644 --- a/content/rooms/v4.md +++ b/content/rooms/v4.md @@ -76,6 +76,8 @@ the changes in this room version. {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v3-auth-rules" %}} diff --git a/content/rooms/v5.md b/content/rooms/v5.md index 665b0568..5bc0b943 100644 --- a/content/rooms/v5.md +++ b/content/rooms/v5.md @@ -58,6 +58,8 @@ completeness. {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v3-auth-rules" %}} From b09d59bd37b90368a481d182d8e7e7f291da3ca3 Mon Sep 17 00:00:00 2001 From: Kierre Date: Sun, 25 Jan 2026 11:34:01 -0500 Subject: [PATCH 2/7] newsfragment --- changelogs/room_versions/newsfragments/2297.clarification | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelogs/room_versions/newsfragments/2297.clarification diff --git a/changelogs/room_versions/newsfragments/2297.clarification b/changelogs/room_versions/newsfragments/2297.clarification new file mode 100644 index 00000000..8a8e7e7a --- /dev/null +++ b/changelogs/room_versions/newsfragments/2297.clarification @@ -0,0 +1 @@ +Clarify floaty powerlevels. \ No newline at end of file From b6198973e0a3d1578f3452c170b398615414d1d8 Mon Sep 17 00:00:00 2001 From: Kierre Sametti Date: Wed, 28 Jan 2026 11:02:53 -0500 Subject: [PATCH 3/7] Update changelogs/room_versions/newsfragments/2297.clarification Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- changelogs/room_versions/newsfragments/2297.clarification | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/room_versions/newsfragments/2297.clarification b/changelogs/room_versions/newsfragments/2297.clarification index 8a8e7e7a..65262d0e 100644 --- a/changelogs/room_versions/newsfragments/2297.clarification +++ b/changelogs/room_versions/newsfragments/2297.clarification @@ -1 +1 @@ -Clarify floaty powerlevels. \ No newline at end of file +Clarify meaning of floating-point powerlevels. \ No newline at end of file From 909395ab3c147bd2bbe58eb25d6c5a005037a8b2 Mon Sep 17 00:00:00 2001 From: Kierre Sametti Date: Wed, 28 Jan 2026 11:03:16 -0500 Subject: [PATCH 4/7] Update content/rooms/fragments/v1-floaty-power-levels.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- content/rooms/fragments/v1-floaty-power-levels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/rooms/fragments/v1-floaty-power-levels.md b/content/rooms/fragments/v1-floaty-power-levels.md index 8e395a43..86e91be3 100644 --- a/content/rooms/fragments/v1-floaty-power-levels.md +++ b/content/rooms/fragments/v1-floaty-power-levels.md @@ -1,5 +1,5 @@ -##### `m.room.power_levels` Events Accept Values as Floats +##### `m.room.power_levels` events accept values as floats When the value is a float, anything after the decimal point is removed, making e.g. `5.17`, `5.42`, and `5` functionally identical. From 917f1dd8c14304e3208679e578a3db9edf8e9594 Mon Sep 17 00:00:00 2001 From: Kierre Date: Wed, 28 Jan 2026 11:37:58 -0500 Subject: [PATCH 5/7] "visually" -> "technically" this makes more sense to me --- content/rooms/fragments/v1-floaty-power-levels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/rooms/fragments/v1-floaty-power-levels.md b/content/rooms/fragments/v1-floaty-power-levels.md index 86e91be3..52a198f6 100644 --- a/content/rooms/fragments/v1-floaty-power-levels.md +++ b/content/rooms/fragments/v1-floaty-power-levels.md @@ -31,4 +31,4 @@ For example, this is a valid `m.room.power_levels` event in this room version: ``` In this example, both `@bob:localhost` and `@alice:localhost` have the same effective -power level of `50`, even though the values are visually different. +power level of `50`, even though the values are technically different. From 6264b34caf8791cd873c03eec5527f43a418edf5 Mon Sep 17 00:00:00 2001 From: Kierre Date: Wed, 28 Jan 2026 12:05:35 -0500 Subject: [PATCH 6/7] clarify exponential notation and add canonical JSON note --- content/rooms/fragments/v1-floaty-power-levels.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/rooms/fragments/v1-floaty-power-levels.md b/content/rooms/fragments/v1-floaty-power-levels.md index 52a198f6..abd4f50a 100644 --- a/content/rooms/fragments/v1-floaty-power-levels.md +++ b/content/rooms/fragments/v1-floaty-power-levels.md @@ -32,3 +32,9 @@ For example, this is a valid `m.room.power_levels` event in this room version: In this example, both `@bob:localhost` and `@alice:localhost` have the same effective power level of `50`, even though the values are technically different. + +When a float written in exponential notation is unpacked, the decimal portion is removed +afterward; for example, `5.114698E4` becomes `51146.98`, which is then truncated to `51146`. + +Note that, since this room version does not enforce that events comply with the requirements +of [Canonical JSON](/appendices#canonical-json), power levels can be formatted as floats. From 1d1fa4cb5b8395974f9ae2ebe4e2015c69c11fbd Mon Sep 17 00:00:00 2001 From: Kierre Date: Sat, 7 Feb 2026 18:43:03 -0500 Subject: [PATCH 7/7] move transformations into one section --- content/rooms/fragments/v1-floaty-power-levels.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/rooms/fragments/v1-floaty-power-levels.md b/content/rooms/fragments/v1-floaty-power-levels.md index abd4f50a..50421159 100644 --- a/content/rooms/fragments/v1-floaty-power-levels.md +++ b/content/rooms/fragments/v1-floaty-power-levels.md @@ -1,8 +1,12 @@ ##### `m.room.power_levels` events accept values as floats -When the value is a float, anything after the decimal point is removed, -making e.g. `5.17`, `5.42`, and `5` functionally identical. +When the value is a float + * First, exponential notation is applied: `5.114698E4` becomes `51146.98` + * Second, the value is truncated at the decimal point: `51146.98` becomes `51146`. + +Any float greater than or equal to `1e309` must result in the powerlevel event +being rejected. For example, this is a valid `m.room.power_levels` event in this room version: @@ -33,8 +37,5 @@ For example, this is a valid `m.room.power_levels` event in this room version: In this example, both `@bob:localhost` and `@alice:localhost` have the same effective power level of `50`, even though the values are technically different. -When a float written in exponential notation is unpacked, the decimal portion is removed -afterward; for example, `5.114698E4` becomes `51146.98`, which is then truncated to `51146`. - Note that, since this room version does not enforce that events comply with the requirements of [Canonical JSON](/appendices#canonical-json), power levels can be formatted as floats.