Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1828 commits
Select commit Hold shift + click to select a range
025d29a
decomp: match FUN_0045e210 @0x0005e210 (#896)
swstegall Jun 5, 2026
0926a53
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
125a5fc
decomp: match FUN_00451bc0 @0x00051bc0 (#897)
swstegall Jun 5, 2026
4a5acc9
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
f5ac266
decomp: match FUN_004532b0 @0x000532b0 (#898)
swstegall Jun 5, 2026
9704ae0
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
03defd7
decomp: match FUN_00457920 @0x00057920 (#899)
swstegall Jun 5, 2026
81a7f08
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
dee333f
decomp: match FUN_0045e6c0 @0x0005e6c0 (#900)
swstegall Jun 5, 2026
cb00104
decomp: match FUN_0045dba0 @0x0005dba0 (#901)
swstegall Jun 5, 2026
00394c2
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
5a667f1
decomp: match FUN_0045b390 @0x0005b390 (#902)
swstegall Jun 5, 2026
ccd3abb
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
f677571
decomp: match FUN_0045e400 @0x0005e400 (#903)
swstegall Jun 5, 2026
b3dce70
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
46b1a70
decomp: match FUN_004536e0 @0x000536e0 (#904)
swstegall Jun 5, 2026
f4e4b74
decomp: match FUN_00452ba0 @0x00052ba0 (#905)
swstegall Jun 5, 2026
6198074
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
9054bc7
decomp: match FUN_00460dd0 @0x00060dd0 (#906)
swstegall Jun 5, 2026
a89cb38
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
ec6130e
decomp: match FUN_00459320 @0x00059320 (#907)
swstegall Jun 5, 2026
ab6728e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
d8c71f4
decomp: match FUN_0045bef0 @0x0005bef0 (#908)
swstegall Jun 5, 2026
3578531
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
4b98ccf
decomp: match FUN_00458810 @0x00058810 (#909)
swstegall Jun 5, 2026
22b28f8
decomp: match FUN_00454020 @0x00054020 (#910)
swstegall Jun 5, 2026
b5770cb
decomp: match FUN_00459ae0 @0x00059ae0 (#911)
swstegall Jun 5, 2026
2cea3c4
decomp: match FUN_00470410 @0x00070410 (#912)
swstegall Jun 5, 2026
596b66b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
aa22f86
decomp: match FUN_00460200 @0x00060200 (#913)
swstegall Jun 5, 2026
01099fa
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
d497730
decomp: match FUN_00452d00 @0x00052d00 (#914)
swstegall Jun 5, 2026
1a5aa8b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
0f9ebcc
decomp: match FUN_004588e0 @0x000588e0 (#915)
swstegall Jun 5, 2026
30d7306
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
1556ab7
decomp: match FUN_0045c0f0 @0x0005c0f0 (#916)
swstegall Jun 5, 2026
fc55dc1
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
f87aed0
decomp: match FUN_0045a0f0 @0x0005a0f0 (#917)
swstegall Jun 5, 2026
cc2e40d
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
cad828d
decomp: match FUN_00461330 @0x00061330 (#918)
swstegall Jun 5, 2026
a7c0f8e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
ef66ced
decomp: match FUN_0045c360 @0x0005c360 (#919)
swstegall Jun 5, 2026
7b277b0
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
037f8ea
decomp: match FUN_00463fc0 @0x00063fc0 (#920)
swstegall Jun 5, 2026
2f1a427
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
39a5caf
decomp: match FUN_004534a0 @0x000534a0 (#921)
swstegall Jun 5, 2026
f34a92e
decomp: match FUN_0045b310 @0x0005b310 (#922)
swstegall Jun 5, 2026
c5c891f
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
a6baeb4
decomp: match FUN_00456060 @0x00056060 (#923)
swstegall Jun 5, 2026
17af6f1
decomp: match FUN_0045c5f0 @0x0005c5f0 (#924)
swstegall Jun 5, 2026
0d287c4
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
cd386b9
decomp: match FUN_00470850 @0x00470850 (#925)
swstegall Jun 5, 2026
8fd09b4
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
bdc4e39
decomp: match FUN_004620d0 @0x000620d0 (#926)
swstegall Jun 5, 2026
4998d0d
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
cbe015f
decomp: match FUN_004563b0 @0x000563b0 (#927)
swstegall Jun 5, 2026
8ae332e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 5, 2026
92d4977
decomp: match FUN_0045caf0 @0x0005caf0 (#928)
swstegall Jun 6, 2026
2445046
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
e66fafb
decomp: match FUN_004589e0 @0x000589e0 (#929)
swstegall Jun 6, 2026
1ae1d00
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
ad9615a
decomp: match FUN_00466ba0 @0x00066ba0 (#930)
swstegall Jun 6, 2026
4b74168
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
9a893d7
decomp: match FUN_00469480 @0x00069480 (#931)
swstegall Jun 6, 2026
7345f8b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
3097ac7
decomp: match FUN_004695c0 @0x000695c0 (#932)
swstegall Jun 6, 2026
3e5883a
decomp: match FUN_0045aac0 @0x0005aac0 (#933)
swstegall Jun 6, 2026
db84b73
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
017efb4
decomp: match FUN_00477a70 @0x00077a70 (#934)
swstegall Jun 6, 2026
b918817
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
d185f98
decomp: match FUN_00460b70 @0x00060b70 (#935)
swstegall Jun 6, 2026
e992fe7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
6c1a818
decomp: match FUN_00466ce0 @0x00066ce0 (#936)
swstegall Jun 6, 2026
649332c
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
92bdadc
decomp: match FUN_0045b420 @0x0005b420 (#937)
swstegall Jun 6, 2026
3419178
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
922f2c1
decomp: match FUN_00469f40 @0x00069f40 (#938)
swstegall Jun 6, 2026
36ece3b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
ca45fb9
decomp: match FUN_004780a0 @0x000780a0 (#939)
swstegall Jun 6, 2026
3f7068d
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
2baac23
decomp: match FUN_0045b480 @0x0005b480 (#940)
swstegall Jun 6, 2026
d174cfa
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
8128715
decomp: match FUN_00461da0 @0x00061da0 (#941)
swstegall Jun 6, 2026
3f4eff7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
9c19c4a
decomp: match FUN_00466dc0 @0x00066dc0 (#942)
swstegall Jun 6, 2026
62f01c6
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
122fd7d
decomp: match FUN_00459a10 @0x00059a10 (#943)
swstegall Jun 6, 2026
f47ba37
decomp: match FUN_0046a0f0 @0x0006a0f0 (#944)
swstegall Jun 6, 2026
3f8dce4
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0964edb
decomp: match FUN_004785a0 @0x000785a0 (#945)
swstegall Jun 6, 2026
e4ea08a
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
4dc414a
decomp: match FUN_00467db0 @0x00067db0 (#946)
swstegall Jun 6, 2026
b6d5341
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
92b4ca8
decomp: match FUN_00462600 @0x00062600 (#947)
swstegall Jun 6, 2026
d0bbcdf
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
c3ef128
decomp: match FUN_0046a410 @0x0006a410 (#948)
swstegall Jun 6, 2026
c422337
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
56f61e5
decomp: match FUN_0045a0c0 @0x0005a0c0 (#949)
swstegall Jun 6, 2026
ba9bd52
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
19d4c44
decomp: match FUN_0045c820 @0x0005c820 (#951)
swstegall Jun 6, 2026
fa53eea
decomp: match FUN_004573f0 @0x000573f0 (#950)
swstegall Jun 6, 2026
828bd8d
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
5ed4602
decomp: match FUN_0046b6c0 @0x0006b6c0 (#952)
swstegall Jun 6, 2026
d1c9b15
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
d81bbb1
decomp: match FUN_004799a0 @0x000799a0 (#953)
swstegall Jun 6, 2026
cb0e9bd
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
68a5dff
decomp: match FUN_0045a510 @0x0005a510 (#954)
swstegall Jun 6, 2026
9a27028
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
93c633c
decomp: match FUN_0045cde0 @0x0005cde0 (#955)
swstegall Jun 6, 2026
afd1288
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
5fe485d
decomp: match FUN_00457f00 @0x00057f00 (#956)
swstegall Jun 6, 2026
11a50b0
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
4079c32
decomp: match FUN_00479d10 @0x00079d10 (#957)
swstegall Jun 6, 2026
ab858e2
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
5d939e8
decomp: match FUN_0045b890 @0x0005b890 (#958)
swstegall Jun 6, 2026
e093a8e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
232f34b
decomp: match FUN_004631c0 @0x000631c0 (#959)
swstegall Jun 6, 2026
bc2430b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
b6d0c4a
decomp: match FUN_0046c140 @0x0006c140 (#960)
swstegall Jun 6, 2026
53d8a9c
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
c94effd
decomp: match FUN_00479dd0 @0x00079dd0 (#961)
swstegall Jun 6, 2026
10e840b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0f39223
decomp: match FUN_0045d3a0 @0x0005d3a0 (#962)
swstegall Jun 6, 2026
7918f30
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
6c33bd9
decomp: match FUN_00463ec0 @0x00063ec0 (#963)
swstegall Jun 6, 2026
67afae6
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0532400
decomp: match FUN_00458640 @0x00058640 (#964)
swstegall Jun 6, 2026
ad446d1
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
e4521e6
decomp: match FUN_0046c180 @0x0006c180 (#965)
swstegall Jun 6, 2026
85bc0a8
decomp: match FUN_0047aad0 @0x0007aad0 (#966)
swstegall Jun 6, 2026
7610321
decomp: match FUN_004640c0 @0x000640c0 (#967)
swstegall Jun 6, 2026
8c69fda
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
98c2408
decomp: match FUN_0045bff0 @0x0005bff0 (#968)
swstegall Jun 6, 2026
13e744b
decomp: match FUN_004632f0 @0x000632f0 (#969)
swstegall Jun 6, 2026
d0ebc98
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
f18e9e5
decomp: match FUN_00468e60 @0x00068e60 (#970)
swstegall Jun 6, 2026
7178abe
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
8e6bf72
decomp: match FUN_0045e680 @0x0005e680 (#971)
swstegall Jun 6, 2026
0e5d724
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
a5ab0a4
decomp: match FUN_004640f0 @0x000640f0 (#972)
swstegall Jun 6, 2026
8ac03f1
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0c3e0aa
decomp: match FUN_00458e20 @0x00058e20 (#973)
swstegall Jun 6, 2026
8ba1142
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
027b215
decomp: match FUN_004634a0 @0x000634a0 (#974)
swstegall Jun 6, 2026
d2af11c
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
5efdc7a
decomp: match FUN_0047ad00 @0x0007ad00 (#975)
swstegall Jun 6, 2026
5d7dbf7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
1e7b957
decomp: match FUN_0046c3a0 @0x0006c3a0 (#976)
swstegall Jun 6, 2026
34717ff
decomp: match FUN_00469200 @0x00069200 (#977)
swstegall Jun 6, 2026
a8a049b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
d6ed834
decomp: match FUN_00460a70 @0x00060a70 (#978)
swstegall Jun 6, 2026
cf062f8
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
c2a5aac
decomp: match FUN_00458f30 @0x00058f30 (#979)
swstegall Jun 6, 2026
622aa83
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
a6051c7
decomp: match FUN_0047af20 @0x0007af20 (#980)
swstegall Jun 6, 2026
900d1ab
decomp: match FUN_0045cbd0 @0x0005cbd0 (#981)
swstegall Jun 6, 2026
bbd497f
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
49afb9a
decomp: match FUN_00469b80 @0x00069b80 (#982)
swstegall Jun 6, 2026
5ada094
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
9ca2419
decomp: match FUN_00464270 @0x00064270 (#983)
swstegall Jun 6, 2026
e16d9c3
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0ca0774
decomp: match FUN_0045ce50 @0x0005ce50 (#984)
swstegall Jun 6, 2026
faa2d5e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
719d93a
decomp: match FUN_004592b0 @0x000592b0 (#985)
swstegall Jun 6, 2026
d9f2a9e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
e28f52c
decomp: match FUN_00460f30 @0x00060f30 (#986)
swstegall Jun 6, 2026
33bf0f7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
8f6347b
decomp: match FUN_0047b310 @0x0007b310 (#987)
swstegall Jun 6, 2026
d47c162
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
4ce8a64
decomp: match FUN_004644d0 @0x000644d0 (#988)
swstegall Jun 6, 2026
4979e40
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
828e360
decomp: match FUN_0045cf20 @0x0005cf20 (#989)
swstegall Jun 6, 2026
9ce7ef8
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
f8c6eda
decomp: match FUN_0046d660 @0x0006d660 (#990)
swstegall Jun 6, 2026
1a2d034
decomp: match FUN_00469dc0 @0x00069dc0 (#991)
swstegall Jun 6, 2026
07b075f
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
6af2b5f
decomp: match FUN_00459980 @0x00059980 (#992)
swstegall Jun 6, 2026
e2387c7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
5a9f780
decomp: match FUN_004613b0 @0x000613b0 (#993)
swstegall Jun 6, 2026
362cc62
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
7a3f248
decomp: match FUN_0045d840 @0x0005d840 (#994)
swstegall Jun 6, 2026
dcb4227
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0df4cb7
decomp: match FUN_00459e50 @0x00059e50 (#995)
swstegall Jun 6, 2026
3f5d8c1
decomp: match FUN_00464d80 @0x00064d80 (#996)
swstegall Jun 6, 2026
4e21939
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
a700b87
decomp: match FUN_00469fa0 @0x00069fa0 (#997)
swstegall Jun 6, 2026
efd58dc
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
efec87c
decomp: match FUN_0047b550 @0x0007b550 (#998)
swstegall Jun 6, 2026
e6352b7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
664665f
decomp: match FUN_0045dc90 @0x0005dc90 (#999)
swstegall Jun 6, 2026
4fea4c1
decomp: match FUN_0046ec40 @0x0046ec40 (#1000)
swstegall Jun 6, 2026
23110b9
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
90f616d
decomp: match FUN_00465440 @0x00065440 (#1001)
swstegall Jun 6, 2026
8c6944c
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
2a66a69
decomp: match FUN_0045a920 @0x0005a920 (#1002)
swstegall Jun 6, 2026
0ed459f
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
51ae463
decomp: match FUN_0046aac0 @0x0006aac0 (#1003)
swstegall Jun 6, 2026
e813c0b
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
ee3fbbf
decomp: match FUN_004645b0 @0x000645b0 (#1004)
swstegall Jun 6, 2026
cec0fa0
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
9ae48b1
decomp: match FUN_0045e0d0 @0x0005e0d0 (#1005)
swstegall Jun 6, 2026
8c252e7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
2af32df
decomp: match FUN_0047c970 @0x0007c970 (#1006)
swstegall Jun 6, 2026
287a14c
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
03d63cb
decomp: match FUN_004654b0 @0x000654b0 (#1007)
swstegall Jun 6, 2026
409d352
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
5aadaf7
decomp: match FUN_00470120 @0x00070120 (#1008)
swstegall Jun 6, 2026
f06b058
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
e45e932
decomp: match FUN_00461900 @0x00061900 (#1009)
swstegall Jun 6, 2026
0c64e18
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
b2738db
decomp: match FUN_0045abf0 @0x0005abf0 (#1010)
swstegall Jun 6, 2026
2787854
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0a65a57
decomp: match FUN_00473900 @0x00073900 (#1012)
swstegall Jun 6, 2026
8be1cd1
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
545f1c2
decomp: match FUN_0041ab00 @0x0001ab00 (#1013)
swstegall Jun 6, 2026
9161965
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
e20c015
decomp: match FUN_00460a50 @0x00060a50 (#1014)
swstegall Jun 6, 2026
d57388e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
be0d696
decomp: match FUN_004754a0 @0x000754a0 (#1015)
swstegall Jun 6, 2026
9865bad
decomp: match FUN_00463fe0 @0x00063fe0 (#1016)
swstegall Jun 6, 2026
54692fc
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
ac87af8
decomp: match FUN_0046ee10 @0x0006ee10 (#1017)
swstegall Jun 6, 2026
809e2fb
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
66c423f
decomp: match FUN_00418f90 @0x00018f90 (#1018)
swstegall Jun 6, 2026
6406eb4
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
318266a
decomp: match FUN_0043299e @0x0003299e (#1019)
swstegall Jun 6, 2026
39d43b4
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
1369322
decomp: match FUN_00464040 @0x00064040 (#1020)
swstegall Jun 6, 2026
30f5ab9
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
306c1b3
decomp: match FUN_004633b0 @0x000633b0 (#1021)
swstegall Jun 6, 2026
dd74d7a
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
c451b07
decomp: match FUN_0046a5a0 @0x0006a5a0 (#1022)
swstegall Jun 6, 2026
4566009
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
0995e0a
decomp: match FUN_00470c60 @0x00070c60 (#1023)
swstegall Jun 6, 2026
9489b3d
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
63acd3c
decomp: match FUN_004569d0 @0x000569d0 (#1024)
swstegall Jun 6, 2026
f11c2e7
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
e571022
decomp: match FUN_00466300 @0x00066300 (#1025)
swstegall Jun 6, 2026
43155b6
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
46f8416
decomp: match FUN_0041c340 @0x0001c340 (#1026)
swstegall Jun 6, 2026
181167e
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
8c56bc6
decomp: match FUN_0046c4b0 @0x0006c4b0 (#1027)
swstegall Jun 6, 2026
f489b4a
decomp: match FUN_0045b750 @0x0005b750 (#1028)
swstegall Jun 6, 2026
57a4d91
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
925e8bd
decomp: match FUN_004157c0 @0x000157c0 (#1029)
swstegall Jun 6, 2026
7ad9b03
decomp: match FUN_00462b30 @0x00062b30 (#1030)
swstegall Jun 6, 2026
3f19978
docs: reconcile solved-set + progress regions [skip ci]
github-actions[bot] Jun 6, 2026
d73835f
ci: announce releases to Discord on merge to master (#1031)
swstegall Jun 6, 2026
93514ae
ci(release): trigger on PR merge (pull_request_target), not push to m…
swstegall Jun 6, 2026
5b23c3f
Merge branch 'master' into develop
swstegall Jun 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 71 additions & 32 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,54 @@ name: Release
#
# DESIGN: the annotated git tag `vX.Y.Z` is the SOLE source of truth. This repo
# has NO Cargo.toml and NO VERSION file, so there is nothing in the tree to
# rewrite. On every push/merge to `master` this workflow:
# rewrite. When a `develop` -> `master` release PR MERGES (or on a manual
# `workflow_dispatch`) this workflow:
# 1. reads the highest existing vX.Y.Z git tag,
# 2. bumps PATCH by default, or MINOR/MAJOR when the merged PR carried a
# `release:minor` / `release:major` label,
# 3. creates + pushes the matching annotated vX.Y.Z tag on the merge commit
# (NO commit is written back to the branch — only a tag), and
# (NO commit is written back to the branch — only a tag),
# 4. publishes a GitHub Release with auto-generated notes, best-effort
# appended with the current decomp progress (matched-function /
# _rosetta file counts from tools/progress.py).
# _rosetta file counts from tools/progress.py), and
# 5. announces the release to Discord (see docs/RELEASING.md).
#
# Why NO PAT: unlike the sibling Garlemald-Server/Client release workflows,
# `master` here is NOT branch-protected and this workflow pushes ONLY a tag
# (never a commit back to the branch). The default GITHUB_TOKEN (github.token)
# can both push a tag to an unprotected branch and create a Release, so no
# fine-grained RELEASE_PAT is required. The checkout uses the default token.
# Why `pull_request_target` and NOT `push: branches: [master]`: a release PR is
# merged from `develop`, which is saturated with `[skip ci]` commits (the
# reconcile bot). A SQUASH merge folds all of those commit messages — `[skip ci]`
# included — into the squash commit's body, and GitHub then SKIPS every workflow
# for that push (it scans the HEAD commit message for skip markers). A
# `push: master` trigger therefore silently never fires for a squash-merged
# release. `pull_request_target` keys off the PR-merge EVENT, not the pushed
# commit, so it is immune to `[skip ci]` and fires for any merge method
# (squash / merge / rebase). `workflow_dispatch` is a manual fallback (e.g. to
# cut a release that a skipped push missed).
#
# Why NO loop guard: because nothing is committed back to `master`, there is no
# re-trigger to guard against. A tag push does NOT match an `on: push: branches`
# trigger, so creating vX.Y.Z below cannot re-run this workflow. Consequently we
# deliberately add NO bot-identity `if` guard and NO `[skip ci]` marker — they
# would only be needed if we pushed a bump commit, which we never do.
# SAFETY: despite `pull_request_target`, this workflow NEVER checks out or runs
# PR head code — it checks out `master` and only reads git tags + the merged PR's
# labels — so the usual `pull_request_target` code-execution risk (running
# attacker-controlled code with secrets in scope) does not apply.
#
# Why NO PAT: unlike the sibling Garlemald-Server/Client release workflows, this
# workflow pushes ONLY a tag (never a commit back to the branch). Tag pushes are
# not gated by branch protection (only commits to the branch are), so the default
# GITHUB_TOKEN (github.token) can push the tag AND create the Release even though
# `master` is protected — no fine-grained RELEASE_PAT is required.
#
# Why NO loop guard: nothing is committed back to `master`, so there is no
# re-trigger to guard against. The tag push creates no PR-close event and matches
# no trigger here, so it cannot re-run this workflow. We deliberately add NO
# bot-identity `if` guard and NO `[skip ci]` marker.
on:
push:
# Fire when a PR INTO master MERGES (a develop -> master release). For
# pull_request_target, `branches` filters the BASE (target) branch, so only
# master-targeting PRs match; the job `if` further requires merged == true.
pull_request_target:
types: [closed]
branches: [master]
# Manual fallback: cut a release on demand (e.g. recover a skipped push). Always
# checks out + releases master HEAD regardless of the ref it is dispatched from.
workflow_dispatch: {}

# Serialize releases so two quick merges produce monotonic tags (the second run
# waits for the first to push its tag, then computes the next from it).
Expand All @@ -45,13 +69,22 @@ permissions:

jobs:
release:
# Release only when a PR actually MERGED into master (skip closed-without-merge),
# or on a manual dispatch. The pull_request_target `branches` filter already
# restricts to master-targeting PRs; the base.ref check is defense-in-depth.
if: >-
github.event_name == 'workflow_dispatch' ||
(github.event.pull_request.merged == true &&
github.event.pull_request.base.ref == 'master')
runs-on: ubuntu-latest
steps:
- name: Checkout master (full history + tags; default token can push a tag)
uses: actions/checkout@v6
with:
# master is unprotected and we only push a TAG, so the default
# GITHUB_TOKEN suffices — no RELEASE_PAT needed.
# A merged pull_request_target/closed event means master already
# contains the merge commit, so `ref: master` checks out the release
# HEAD to tag. master is protected, but we only push a TAG (not gated by
# branch protection), so the default GITHUB_TOKEN suffices — no RELEASE_PAT.
token: ${{ github.token }}
fetch-depth: 0
ref: master
Expand All @@ -63,23 +96,28 @@ jobs:
id: level
env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
run: |
set -euo pipefail
# PR(s) associated with this merge commit; labels decide minor/major.
# A direct push (no PR) -> empty -> patch. Manual `git tag vX.Y.0`/`vX.0.0`
# is also honored automatically via the highest-tag read below.
# An empty result is the legitimate "direct push, no PR" case (-> patch).
# A non-zero exit is an API/permission error: warn so a missed
# release:minor/major label is visible rather than silently downgraded.
if ! labels="$(gh api "repos/${{ github.repository }}/commits/${{ github.sha }}/pulls" --jq '[.[].labels[].name] | join(",")')"; then
echo "::warning::Could not query PR labels for ${{ github.sha }}; defaulting to a patch bump (a release:minor/major label, if any, was NOT applied)."
# Read the release PR's labels via the PR(s) associated with the master
# HEAD (= the just-merged commit). We query by the CHECKED-OUT HEAD sha,
# NOT github.sha: under pull_request_target, github.sha is the base sha
# from BEFORE the merge, whereas master HEAD is the merge commit the
# release PR is associated with (under workflow_dispatch it is simply
# master HEAD). An empty result is the legitimate "no associated PR" case
# (-> patch). A non-zero exit is an API/permission error: warn so a
# missed release:minor/major label is visible rather than silently
# downgraded.
sha="$(git rev-parse HEAD)"
if ! labels="$(gh api "repos/${REPO}/commits/${sha}/pulls" --jq '[.[].labels[].name] | join(",")')"; then
echo "::warning::Could not query PR labels for ${sha}; defaulting to a patch bump (a release:minor/major label, if any, was NOT applied)."
labels=""
fi
echo "PR labels: ${labels:-<none>}"
level=patch
level="patch"
case ",$labels," in
*,release:major,*) level=major ;;
*,release:minor,*) level=minor ;;
*,release:major,*) level="major" ;;
*,release:minor,*) level="minor" ;;
esac
echo "level=$level" >> "$GITHUB_OUTPUT"
echo "Bump level: $level"
Expand Down Expand Up @@ -115,10 +153,10 @@ jobs:
tag="${{ steps.ver.outputs.tag }}"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
# Tag the merge commit that triggered this run (HEAD == github.sha).
# Tag the checked-out master HEAD — the merge commit for this release.
# NOTHING is written into the tree and NO commit is pushed back to
# master — only the tag ref. A tag push does not re-trigger this
# workflow (the trigger is scoped to branch pushes on master).
# master — only the tag ref. The tag push creates no PR-close event, so
# it cannot re-trigger this workflow.
git tag -a "${tag}" -m "${tag}"
git push origin "refs/tags/${tag}"
echo "Pushed tag ${tag}"
Expand Down Expand Up @@ -166,8 +204,9 @@ jobs:
- name: Announce the release on Discord
# Runs only after the tag + GitHub Release above succeed (a failed step
# stops the job before this one), so a release is never announced unless
# it actually published. No event guard is needed: this workflow's only
# trigger is push to `master`, i.e. a develop -> master release merge.
# it actually published. No event guard is needed: both triggers (a merged
# develop -> master release PR, and a manual workflow_dispatch) compute and
# publish a NEW version, so every reached run is a genuine release.
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK_URL }}
PROJECT: Meteor Decomp
Expand Down
95 changes: 66 additions & 29 deletions docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@ branch: it only creates and pushes a tag (and publishes a GitHub Release).
orchestration included) or via PR, whatever fits the moment. **Nothing merged
into `develop` produces a release or a tag.**
- **`master`** is the protected **release** branch. A release is cut by opening a
PR from `develop` into `master`; when it merges, the push to `master` triggers
`release.yml` (tag + GitHub Release). `master` requires a pull request (no
direct pushes) but **no approving review**, so you can self-merge your own
`develop` → `master` release PR.
PR from `develop` into `master`; when it **merges**, `release.yml` fires (tag +
GitHub Release + Discord). `master` requires a pull request (no direct pushes)
but **no approving review**, so you can self-merge your own `develop` → `master`
release PR. **Any** merge method works — squash, merge commit, or rebase (see
[Why `pull_request_target`, not `push`](#why-pull_request_target-not-push)).

Flow: work on `develop` → release PR `develop` → `master` → merge → automatic
tag + GitHub Release.
tag + GitHub Release + Discord announcement.

> Branch protection on `master` does **not** block the release automation: the
> workflow pushes only a **tag** (`refs/tags/vX.Y.Z`), and tag pushes are not
Expand All @@ -29,8 +30,9 @@ tag + GitHub Release.

## How it works

`.github/workflows/release.yml` runs on every push/merge to **`master`** (i.e.
when a `develop` → `master` release PR merges) and:
`.github/workflows/release.yml` runs when a `develop` → `master` release PR
**merges** (a `pull_request_target` `closed` + merged event), or on a manual
`workflow_dispatch`, and:

1. reads the highest existing `vX.Y.Z` tag,
2. picks a bump level (see below),
Expand All @@ -48,13 +50,14 @@ After a release, `git describe --tags` on `master` reports the new `X.Y.Z`.

| Bump | How to trigger |
|-----------|--------------------------------------------------------------------------------|
| **Patch** | Default. Any merge/push to `master` with no release label → `Z` increments. |
| **Patch** | Default. A merged `develop` → `master` release PR (or manual dispatch) with no release label → `Z` increments. |
| **Minor** | Add the **`release:minor`** label to the PR before merging → `Y+1`, `Z=0`. |
| **Major** | Add the **`release:major`** label to the PR before merging → `X+1`, `Y=0`, `Z=0`. |

The label is read from the PR associated with the merge commit; if both labels
are present, **`release:major` wins**. A direct push with no associated PR is
treated as a patch bump.
are present, **`release:major` wins**. A run with no associated PR (a manual
`workflow_dispatch`, or a merge GitHub doesn't link to a PR) is treated as a
patch bump.

The `release:minor` and `release:major` labels must exist in the repo.

Expand All @@ -70,30 +73,63 @@ git tag -a v0.2.0 -m v0.2.0 && git push origin v0.2.0
The automation then continues patch-incrementing from there (`v0.2.1`, …). This
is handy for the first minor/major when no PR is involved.

## Why `pull_request_target`, not `push`

The release PR merges `develop` into `master`, and `develop` is **saturated with
`[skip ci]` commits** (the reconcile bot stamps every progress-doc commit with
`[skip ci]`). A **squash** merge folds *all* the squashed commit messages —
`[skip ci]` markers included — into the squash commit's body. GitHub then scans
the merged commit's message, sees `[skip ci]`, and **skips every workflow for
that push** (including `release.yml`). With a `push: branches: [master]` trigger,
a squash-merged release therefore **silently never releases** — no tag, no
GitHub Release, no Discord ping. (This is exactly what happened to the first
release PR after the Discord step was added.)

`pull_request_target` keys off the **PR-merge event**, not the pushed commit, so
it is **immune to `[skip ci]`** and fires regardless of merge method (squash,
merge commit, or rebase). The job is gated on `pull_request.merged == true` (so a
PR closed *without* merging never releases) and `base.ref == 'master'`.

> **Safety:** despite the `pull_request_target` event, this workflow never checks
> out or runs PR head code — it checks out `master` and reads only git tags and
> the merged PR's labels. The usual `pull_request_target` risk (running
> attacker-controlled code with secrets in scope) does not apply.

## Manual release (`workflow_dispatch`)

`release.yml` also exposes a manual **Run workflow** button (`workflow_dispatch`,
no inputs). Use it to cut a release on demand — e.g. to recover a push that was
skipped before this trigger fix landed, or to force a patch bump. It always
checks out and releases **`master` HEAD**, computing the next version from the
highest tag exactly like an automatic run.

```sh
gh workflow run release.yml --repo swstegall/meteor-decomp
```

## Why no PAT

Unlike the sibling `garlemald-server` / `garlemald-client` release workflows,
`master` here is **not branch-protected**, and this workflow pushes **only a
tag** — it never commits anything back to the branch. The default
`GITHUB_TOKEN` (`github.token`) can:
This workflow pushes **only a tag** — it never commits anything back to the
branch. Tag pushes are **not** gated by branch-protection rules (only commits to
the branch are), so even though `master` is protected, the default `GITHUB_TOKEN`
(`github.token`) can:

- push a tag to an unprotected branch, and
- create a GitHub Release.
- push the `vX.Y.Z` tag, and
- create the GitHub Release.

So **no fine-grained `RELEASE_PAT` is required**. The checkout uses the default
token. (If `master` were ever branch-protected, note that tag pushes are not
gated by branch protection rules, so even then the default token would still
suffice for the tag — protection only matters for commits to the branch, which
this workflow never makes.)
So **no fine-grained `RELEASE_PAT` is required** (unlike the sibling
`garlemald-server` / `garlemald-client` release workflows, which commit a version
bump back to a protected branch and therefore do need a PAT). The checkout uses
the default token.

## Why no loop guard

Because nothing is committed back to `master`, there is no re-trigger to guard
against:

- The workflow triggers on `push: branches: [master]`.
- Pushing a **tag** does **not** match that trigger, so creating `vX.Y.Z`
cannot re-run this workflow.
- The workflow triggers on a PR **merge** into `master` (and manual dispatch).
- Pushing a **tag** creates no PR-close event and matches no trigger here, so
creating `vX.Y.Z` cannot re-run this workflow.

So there is deliberately **no bot-identity `if` guard** and **no `[skip ci]`
marker** — both are only needed when a workflow pushes a *commit* back to the
Expand All @@ -118,8 +154,9 @@ failure (PyYAML missing, network blip, `progress.py` change, no YAML present)
After the tag and GitHub Release publish, `release.yml`'s final step POSTs a
Discord embed announcing the new release to the release-announcements channel
(mirrors the sibling `garlemald-server` / `garlemald-client` release announcers).
Because the only trigger is a push to `master` (a `develop` → `master` release
merge), every successful release is announced — there is no separate event guard.
Because every reached run is a genuine release — a merged `develop` → `master`
release PR, or a manual `workflow_dispatch`, both of which compute and publish a
new version — each successful release is announced; there is no separate event guard.

The embed reads:

Expand Down Expand Up @@ -154,6 +191,6 @@ once by a maintainer as a seed step **outside** this workflow:
git tag -a v0.1.0 -m v0.1.0 <master-HEAD-sha> && git push origin v0.1.0
```

The first merge/push to `master` after the release automation lands bumps it to
`v0.1.1` (or the labeled minor/major). The workflow never creates `v0.1.0`
itself.
The first `develop` → `master` release PR merged after the release automation
lands bumps it to `v0.1.1` (or the labeled minor/major). The workflow never
creates `v0.1.0` itself.
Loading