Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
385 commits
Select commit Hold shift + click to select a range
9374685
76.9%: inline deltaq cross-bin blend
JohnDeved Mar 23, 2026
1031956
76.9%: inline deltaq physical blends
JohnDeved Mar 23, 2026
d59c4bd
77.0%: inline deltaq masked same-bin blend
JohnDeved Mar 23, 2026
eadc137
77.0%: flatten masked deltaq physical decode
JohnDeved Mar 23, 2026
e3910f9
77.0%: delay stateless q anim load
JohnDeved Mar 23, 2026
29e77a0
77.1%: delay stateless f3 anim load
JohnDeved Mar 23, 2026
e9eb914
77.2%: reorder stateless f3 fast prev key
JohnDeved Mar 23, 2026
ac0938e
77.2%: reorder loader init stores
JohnDeved Mar 23, 2026
ea08ae4
77.2%: invert stateless f3 fast top branch
JohnDeved Mar 23, 2026
3c9fa07
77.4%: invert stateless f3 fast slerp branch
JohnDeved Mar 23, 2026
50fc49e
77.5%: delay stateless f3 fast output index
JohnDeved Mar 23, 2026
1c2ae0e
77.5%: index stateless f3 const tail
JohnDeved Mar 23, 2026
b8342b4
77.5%: reorder deltaq init ownership
JohnDeved Mar 23, 2026
eaaa772
77.5%: delay stateless f3 fast output index
JohnDeved Mar 23, 2026
1075140
77.6%: index stateless f3 const tail
JohnDeved Mar 23, 2026
b4270d5
77.6%: delay stateless f3 output index
JohnDeved Mar 23, 2026
40ec80e
77.6%: shape qfast updater w bits
JohnDeved Mar 23, 2026
e989a01
77.6%: mirror qfast updater w bits
JohnDeved Mar 23, 2026
679f24b
77.7%: mirror masked qfast w bits
JohnDeved Mar 23, 2026
0b64a49
77.7%: tighten deltaq and qfast init shapes
JohnDeved Mar 23, 2026
efac67f
77.7%: reorder loader init ownership
JohnDeved Mar 23, 2026
37251b2
77.7%: reorder loader init pointers
JohnDeved Mar 23, 2026
0e9495e
77.8%: retime poseanim key search
JohnDeved Mar 23, 2026
c17711f
77.9%: restore poseanim float gate
JohnDeved Mar 23, 2026
3ed7fd6
77.9%: shape poseanim key compare order
JohnDeved Mar 23, 2026
d22e67c
77.9%: tighten poseanim search compares
JohnDeved Mar 23, 2026
25bf030
77.9%: tighten statelessq search compares
JohnDeved Mar 23, 2026
3296500
77.9%: reshape qfast no-times clamp
JohnDeved Mar 23, 2026
97e0c4d
77.9%: tighten qfast floor-key clamp
JohnDeved Mar 23, 2026
67d616e
78.0%: flip qfast timed-key branch ownership
JohnDeved Mar 23, 2026
95db223
78.0%: tighten deltaq const remainder guards
JohnDeved Mar 23, 2026
b735ea3
78.0%: recover pose anim checksum override
JohnDeved Mar 23, 2026
690185e
78.0%: match pose anim length stub
JohnDeved Mar 23, 2026
e45675d
78.0%: match pose anim constructor
JohnDeved Mar 23, 2026
108e942
78.1%: match singleq eval wrapper
JohnDeved Mar 23, 2026
8d228f2
78.1%: fix qfast destructor block owner
JohnDeved Mar 23, 2026
e0e98de
78.1%: match singleq destructor frees
JohnDeved Mar 23, 2026
887a7c4
78.1%: match cycle idx helpers
JohnDeved Mar 23, 2026
a2a6e72
78.2%: tighten blender velocity guards
JohnDeved Mar 23, 2026
d9a0ec6
78.2%: match phase channel length
JohnDeved Mar 23, 2026
c98d94a
78.2%: match phase channel setup
JohnDeved Mar 23, 2026
2191caf
78.3%: inline blender align lengths
JohnDeved Mar 23, 2026
8407806
78.4%: trim blender constructor stores
JohnDeved Mar 23, 2026
bb2cb45
78.4%: tighten raw pose frame output ownership
JohnDeved Mar 23, 2026
584d6e4
78.4%: match stateless constructors
JohnDeved Mar 23, 2026
21cc785
78.4%: fix pose anim dof indexing
JohnDeved Mar 23, 2026
b466cb6
78.4%: delay stateless q output index
JohnDeved Mar 23, 2026
d7b4098
78.4%: retime stateless q blend stores
JohnDeved Mar 23, 2026
b5a9238
Fix most of the function order in zTrack
Mar 23, 2026
b9f10c3
78.5%: reorder pose anim key walk
JohnDeved Mar 23, 2026
5bb4eb4
78.5%: retime pose blend polynomial
JohnDeved Mar 23, 2026
e3e01f9
78.5%: hoist pose palette table
JohnDeved Mar 23, 2026
bedb95a
78.5%: reshape pose noninterp stride
JohnDeved Mar 23, 2026
144ef9f
78.5%: walk pose blender buffers forward
JohnDeved Mar 23, 2026
41823e5
78.5%: free loader hash pointer directly
JohnDeved Mar 23, 2026
9ebbb59
78.5%: move qfast masked dispatch first
JohnDeved Mar 23, 2026
24de6a8
78.5%: invert qfast top-level branch
JohnDeved Mar 23, 2026
b3f0d35
78.5%: reload qfast prev key directly
JohnDeved Mar 23, 2026
e06d818
78.5%: inline qfast bin length power
JohnDeved Mar 23, 2026
acf9c9a
78.6%: use packed qfast min-range base
JohnDeved Mar 23, 2026
b01dfdf
78.6%: tighten qfast const-physical layout
JohnDeved Mar 23, 2026
618dba4
78.6%: store qfast anim before layout
JohnDeved Mar 23, 2026
222e800
78.6%: remove qfast lazy init checks
JohnDeved Mar 23, 2026
6153e62
78.7%: remove qfast eval null guards
JohnDeved Mar 23, 2026
e0afa6b
78.7%: simplify ExtractQuatTrans access
JohnDeved Mar 23, 2026
d2123e7
78.7%: decode qfast next physical bitfields
JohnDeved Mar 23, 2026
0a30e61
78.7%: decode masked qfast physical bitfields
JohnDeved Mar 23, 2026
5fcecb4
78.7%: decode qfast masked floor physical via bitfields
JohnDeved Mar 23, 2026
2ef5136
78.8%: decode qfast masked const physical via bitfields
JohnDeved Mar 23, 2026
0be2fb0
78.8%: decode qfast floor physical via bitfields
JohnDeved Mar 23, 2026
5673515
78.8%: decode qfast const physical via bitfields
JohnDeved Mar 23, 2026
4df6d68
78.8%: tighten deltaq RecoverW sign test
JohnDeved Mar 23, 2026
dc065ca
78.8%: reload deltaq init numbones
JohnDeved Mar 23, 2026
c0aca1a
78.8%: inline singleq init layout
JohnDeved Mar 23, 2026
5ade5a3
78.8%: shape qfast buffer offsets
JohnDeved Mar 23, 2026
ede5f16
78.8%: delay qfast reset stores
JohnDeved Mar 23, 2026
7515e28
78.8%: reload qfast setup bone count
JohnDeved Mar 23, 2026
f3312db
78.9%: reload qfast bin size bones
JohnDeved Mar 23, 2026
5679f91
78.9%: reload deltaq bin size bones
JohnDeved Mar 23, 2026
49558ad
78.9%: reload masked singleq bin size
JohnDeved Mar 23, 2026
0b3b9b0
78.9%: reorder qfast block size sum
JohnDeved Mar 23, 2026
35b1c0c
78.9%: reload qfast init loop bones
JohnDeved Mar 23, 2026
94b7006
78.9%: reload masked qfast loop bones
JohnDeved Mar 23, 2026
5ff645d
79.1%: rewrite Transform::ExtractQuatTrans
JohnDeved Mar 23, 2026
c7190cc
79.3%: reshape DynamicLoader::Initialize
JohnDeved Mar 23, 2026
8f264f6
79.8%: inline DeltaQ quantization helpers
JohnDeved Mar 23, 2026
173e5bf
79.9%: reshape DynamicLoader::Resolve
JohnDeved Mar 23, 2026
f0856f8
80.1%: reorder Skeleton::MirrorPose branches
JohnDeved Mar 23, 2026
7f54d43
80.3%: rewrite Skeleton::PoseSQTToGlobal
JohnDeved Mar 23, 2026
00fa1cf
80.4%: refine Skeleton::PoseSQTToGlobal
JohnDeved Mar 23, 2026
328995d
80.5%: advance Skeleton::PoseSQTToGlobal
JohnDeved Mar 23, 2026
28560a2
80.6%: advance Skeleton::MirrorPose
JohnDeved Mar 23, 2026
c371ba2
80.8%: rewrite Skeleton::GetStillPose
JohnDeved Mar 23, 2026
1fed29a
80.9%: refine Skeleton::GetStillPose
JohnDeved Mar 23, 2026
f5bffa2
81.0%: synthesize trivial delta channel destructors
JohnDeved Mar 23, 2026
ecec729
81.1%: match QuatMultQxZ and tighten GetStillPose
JohnDeved Mar 23, 2026
c1b9e71
81.1%: match more shared math helpers
JohnDeved Mar 23, 2026
b32f8f1
81.2%: improve FnStatelessQ EvalSQT
JohnDeved Mar 23, 2026
3f9e8e9
81.3%: refine FnStatelessQ EvalSQT
JohnDeved Mar 23, 2026
da13864
81.4%: refine stateless evaluator timing
JohnDeved Mar 23, 2026
91f1a05
81.5%: refine stateless evaluator interpolation
JohnDeved Mar 23, 2026
ae2c93b
81.6%: match stateless init helpers
JohnDeved Mar 23, 2026
319f9be
81.63%: improve RawPoseChannel init signatures
JohnDeved Mar 23, 2026
8b30135
82.71%: match FnCycle inline wrappers
JohnDeved Mar 23, 2026
cc1b0f5
82.78%: inline qfast delta accumulators
JohnDeved Mar 23, 2026
8d7325c
82.84%: use qfast unquantize helpers
JohnDeved Mar 23, 2026
10d127c
83.60%: inline singleq owner helpers
JohnDeved Mar 23, 2026
101c4fb
83.71%: inline qfast delta unquantize
JohnDeved Mar 24, 2026
a673aae
83.73%: restore loader typebuf rewrite
JohnDeved Mar 24, 2026
87dd380
83.74%: adjust loader type pointer
JohnDeved Mar 24, 2026
a571712
83.75%: fix loader runtime type walk
JohnDeved Mar 24, 2026
3dc274b
83.79%: inline deltaq init helpers
JohnDeved Mar 24, 2026
3e3847d
83.80%: tune deltaq init store order
JohnDeved Mar 24, 2026
771f4ea
84.04%: use cached deltaq bin buffers
JohnDeved Mar 24, 2026
55e981f
84.22%: decode deltaq xyz directly
JohnDeved Mar 24, 2026
f0255dc
84.44%: use cached singleq bin buffers
JohnDeved Mar 24, 2026
157d24b
84.49%: factor singleq init helper
JohnDeved Mar 24, 2026
7206611
84.51%: inline singleq min-range base math
JohnDeved Mar 24, 2026
a8a90e8
84.64%: remove singleq zero-bone init branch
JohnDeved Mar 24, 2026
a496194
84.71%: drop singleq outq locals
JohnDeved Mar 24, 2026
2ecdbdd
84.72%: return poseblender early eval directly
JohnDeved Mar 24, 2026
ecd8114
84.73%: localize poseblender bone-count loads
JohnDeved Mar 24, 2026
01ac795
84.79%: use poseblender root index member
JohnDeved Mar 24, 2026
42674ac
84.82%: mirror poseblender root index fixes
JohnDeved Mar 24, 2026
993c205
84.87%: use pose-index tail loop in poseblender eval
JohnDeved Mar 24, 2026
9424f7c
84.88%: reverse qfast mask delta walk
JohnDeved Mar 24, 2026
5e0b5c8
84.94%: reuse qfast mask delta frame pointer
JohnDeved Mar 24, 2026
d1567dc
84.96%: reuse qfast reverse mask pointer
JohnDeved Mar 24, 2026
b3c1364
84.97%: reload qfast mask bone counts per frame
JohnDeved Mar 24, 2026
6ab7170
84.98%: add qfast mask zero-bone guard
JohnDeved Mar 24, 2026
31ba94e
85.01%: add deltaq masked zero-bone guard
JohnDeved Mar 24, 2026
f28c127
85.03%: reorder deltaq masked entry setup
JohnDeved Mar 24, 2026
764764a
85.08%: decode qfast next physical branch inline
JohnDeved Mar 24, 2026
8c69a9d
85.18%: use qfast masked ceil temp decode
JohnDeved Mar 24, 2026
0162a7f
85.19%: use qfast floor-key helper
JohnDeved Mar 24, 2026
97eead7
85.21%: index qfast physical decode
JohnDeved Mar 24, 2026
0cab88a
85.23%: index masked qfast decode
JohnDeved Mar 24, 2026
44348eb
85.28%: type qfast masked delta decode
JohnDeved Mar 24, 2026
b699552
85.42%: walk qfast masked deltas by type
JohnDeved Mar 24, 2026
14ce650
Merge remote-tracking branch 'origin/dev' into zEagl4Anim
JohnDeved Mar 24, 2026
953353d
85.43%: walk statelessq masked records
JohnDeved Mar 24, 2026
b72e3b0
85.44%: reorder rawlinear eval helper
JohnDeved Mar 24, 2026
de5c015
85.50%: index rawlinear eval helpers
JohnDeved Mar 24, 2026
66984c6
85.54%: keep rawlinear numdofs live
JohnDeved Mar 24, 2026
6466645
85.69%: inline rawlinear eval flow
JohnDeved Mar 24, 2026
43a2a4d
85.73%: reorder rawpose eval flow
JohnDeved Mar 24, 2026
13fc0e3
85.74%: tune rawpose interp output walk
JohnDeved Mar 24, 2026
e1ea409
85.80%: reorder rawstate decode branches
JohnDeved Mar 24, 2026
db91772
85.82%: spill rawstate decode control bytes
JohnDeved Mar 24, 2026
737c60b
85.85%: invert rawstate decode writeback flow
JohnDeved Mar 24, 2026
b795031
85.93%: lay out rawstate decode blocks
JohnDeved Mar 24, 2026
3a58981
85.96%: reorder rawstate decode stores
JohnDeved Mar 24, 2026
ebc55ce
85.97%: sign rawstate decode control bytes
JohnDeved Mar 24, 2026
613f738
85.97%: trim rawstate decode bit shifts
JohnDeved Mar 24, 2026
a09f214
86.03%: reshape rawstate eval flow
JohnDeved Mar 24, 2026
e10e11a
86.05%: inline rawstate key walk
JohnDeved Mar 24, 2026
67a6940
86.07%: count rawstate key search directly
JohnDeved Mar 24, 2026
d33a62a
86.07%: tune rawstate findtime parity checks
JohnDeved Mar 24, 2026
3147850
86.16%: improve FnRunBlender::SetWeight
JohnDeved Mar 25, 2026
3fe6e07
86.17%: improve Transform::BuildSQT
JohnDeved Mar 25, 2026
e96c333
86.19%: improve Transform::ExtractQuatTrans
JohnDeved Mar 25, 2026
2bd3170
86.37%: improve BlendFacing
JohnDeved Mar 25, 2026
38b6538
86.38%: improve FnStatelessQ::EvalSQTMask
JohnDeved Mar 25, 2026
fc901af
86.49%: improve DynamicLoader::Resolve
JohnDeved Mar 25, 2026
972b77b
86.489%: refine DynamicLoader::Resolve
JohnDeved Mar 25, 2026
f48a20f
86.74%: improve FnDeltaQ helper usage
JohnDeved Mar 25, 2026
c60511d
86.775%: improve FnDeltaSingleQ init helper
JohnDeved Mar 25, 2026
53e2c8e
86.806%: improve DeltaSingleQ header helpers
JohnDeved Mar 25, 2026
ca4233d
86.83%: improve masked FnDeltaQ reverse guard
JohnDeved Mar 25, 2026
5c3c461
86.84%: improve FnDeltaQ fast-path reuse
JohnDeved Mar 25, 2026
d77c7fd
86.85%: improve FnDeltaQFast reuse path
JohnDeved Mar 25, 2026
4010e76
86.86%: improve FnStatelessQ mask locals
JohnDeved Mar 25, 2026
ba07133
86.87%: use LoadStatelessQ in masked stateless slerp
JohnDeved Mar 25, 2026
945ea7f
86.90%: improve DynamicLoader Resolve locals
JohnDeved Mar 25, 2026
50c911c
86.93%: improve DynamicLoader Resolve symbol paths
JohnDeved Mar 25, 2026
bb403c4
86.95%: inline PoseBlender end root transform
JohnDeved Mar 25, 2026
5c01200
86.98%: inline PoseBlender end root transforms
JohnDeved Mar 25, 2026
206bbc8
86.99%: inline PoseBlender loop root transform
JohnDeved Mar 25, 2026
f9a82d3
87.01%: inline PoseBlender masked loop root transform
JohnDeved Mar 25, 2026
6b1ccef
87.02%: inline PoseBlender masked root transforms
JohnDeved Mar 25, 2026
8d5eff4
87.03%: inline PoseBlender root translation blend
JohnDeved Mar 25, 2026
a119a60
87.03%: inline PoseBlender unmasked translation blend
JohnDeved Mar 25, 2026
5d080b6
87.04%: inline PoseBlender masked translation blend
JohnDeved Mar 25, 2026
e1036da
87.05%: delay DeltaQ anim pointer load
JohnDeved Mar 25, 2026
0abc5ef
87.17%: restore anim delete operators
JohnDeved Mar 25, 2026
d72713b
87.23%: restore more anim delete operators
JohnDeved Mar 25, 2026
deadc9c
87.26%: use implicit anim destructors
JohnDeved Mar 25, 2026
b0e72c8
87.26%: return StatelessF3 masked fallback
JohnDeved Mar 25, 2026
a4edd97
87.27%: return StatelessF3 fast masked fallback
JohnDeved Mar 25, 2026
768f2cd
87.28%: tighten DynamicLoader release lifetime
JohnDeved Mar 25, 2026
1cfe2c3
87.30%: restore DeltaQ zero-bone exits
JohnDeved Mar 25, 2026
5629c27
87.35%: simplify StatelessQ key search
JohnDeved Mar 25, 2026
c26ffb0
87.41%: invert FindMatchTime delta branch
JohnDeved Mar 25, 2026
a5d94a1
87.46%: cache FindMatchTime inputs
JohnDeved Mar 25, 2026
b33fa97
87.54%: reshape FindMatchTime locals
JohnDeved Mar 25, 2026
70e72fd
87.58%: use temp vectors in AlignRootQ
JohnDeved Mar 25, 2026
5611548
87.86%: restore AlignCycleBeginEnd quat multiply
JohnDeved Mar 25, 2026
d6f388f
88.21%: use QuatTransformPoint in turn facing blend
JohnDeved Mar 25, 2026
3aff2ec
88.58%: match blender align helpers
JohnDeved Mar 25, 2026
3d7533c
88.584%: move transform owner and tighten GetSymbol
JohnDeved Mar 25, 2026
f58fa23
88.624%: improve turn SetWeight and GetSymbol
JohnDeved Mar 25, 2026
cc68578
88.657%: match turn SetWeight
JohnDeved Mar 25, 2026
163ef40
88.684%: improve run SetWeight
JohnDeved Mar 25, 2026
8611af9
88.711%: match run SetWeight
JohnDeved Mar 25, 2026
c0cde48
88.732%: improve GetSymbol initialization
JohnDeved Mar 25, 2026
53676c7
88.757%: improve GetSymbol type decode
JohnDeved Mar 25, 2026
ab5a2a2
88.832%: improve FnStatelessQ quaternion unpack
JohnDeved Mar 25, 2026
35a5502
88.941%: improve FnStatelessQ mask unpack
JohnDeved Mar 25, 2026
736f857
89.076%: simplify RawEventChannel event scan
JohnDeved Mar 25, 2026
1903d27
89.091%: polish RawEventChannel compares
JohnDeved Mar 25, 2026
7e3a8c4
89.101%: merge RawEventChannel replay path
JohnDeved Mar 25, 2026
b4271ce
89.127%: improve FnDeltaQFast masked setup
JohnDeved Mar 25, 2026
4947478
89.148%: align FnEventBlender branch flow
JohnDeved Mar 25, 2026
93f33d5
89.335%: move raw pose helpers inline
JohnDeved Mar 25, 2026
4c45d92
89.468%: improve FnPoseBlender::Blend
JohnDeved Mar 25, 2026
50115df
89.481%: improve RawPoseChannel eval order
JohnDeved Mar 25, 2026
9f833e5
89.484%: improve FnEventBlender branch layout
JohnDeved Mar 25, 2026
fab426b
89.550%: improve run blender facing blend
JohnDeved Mar 25, 2026
85ef798
89.625%: match ComputeRootQ
JohnDeved Mar 25, 2026
c1d0360
89.649%: improve FnTurnBlender EvalSQT
JohnDeved Mar 25, 2026
2fe1e46
89.699%: match FnRunBlender EvalSQT
JohnDeved Mar 25, 2026
991587b
89.732%: match FnTurnBlender EvalSQT
JohnDeved Mar 25, 2026
f2dd138
89.818%: match FnRunBlender EvalVel2D
JohnDeved Mar 25, 2026
dae380e
89.832%: match FnPoseBlender Blend
JohnDeved Mar 25, 2026
a0e679d
89.882%: match FnRunBlender BlendFacing
JohnDeved Mar 25, 2026
c6960ab
89.891%: match Run and Turn CycleTime
JohnDeved Mar 25, 2026
80240d6
89.899%: improve FnEventBlender Eval
JohnDeved Mar 25, 2026
1ea2bd7
89.900%: refine FnEventBlender Eval
JohnDeved Mar 25, 2026
5d69257
89.913%: improve turn facing helpers
JohnDeved Mar 26, 2026
f0188ea
89.927%: match UseFPS helpers
JohnDeved Mar 26, 2026
3e88feb
89.970%: improve FnEventBlender Eval
JohnDeved Mar 26, 2026
cff1fbf
89.991%: match FnEventBlender Eval
JohnDeved Mar 26, 2026
634ec6a
89.997%: improve RawPoseChannel InitAnimMemoryMap
JohnDeved Mar 26, 2026
987b0b7
90.001%: improve RawPoseChannel InitAnimMemoryMap
JohnDeved Mar 26, 2026
21a10ea
90.001%: match RawPoseChannel InitAnimMemoryMap
JohnDeved Mar 26, 2026
d530f75
90.004%: match RawPoseChannel EvalFrame
JohnDeved Mar 26, 2026
9ba90bb
90.004%: improve FnRunBlender AlignCycleBeginEnd
JohnDeved Mar 26, 2026
6be8b0b
90.012%: match FnRunBlender AlignCycleBeginEnd
JohnDeved Mar 26, 2026
3da3c7c
90.027%: improve FnTurnBlender AlignCycleBeginEnd
JohnDeved Mar 26, 2026
f64e15c
90.028%: refine FnTurnBlender AlignCycleBeginEnd
JohnDeved Mar 26, 2026
f287f56
90.035%: match FnTurnBlender AlignCycleBeginEnd
JohnDeved Mar 26, 2026
810ffc5
90.041%: match BlendVel helpers
JohnDeved Mar 26, 2026
c63b6e5
90.089%: match RawEventChannel Eval
JohnDeved Mar 26, 2026
2daed21
90.103%: tighten DynamicLoader GetSymbol
JohnDeved Mar 26, 2026
1621a9b
90.114%: match DynamicLoader GetSymbol
JohnDeved Mar 26, 2026
b00a0ec
90.127%: improve delta const bone idx
JohnDeved Mar 26, 2026
81b8cb6
90.637% zTrack: match LoadPrecullerBooBooScript and polish world headers
JohnDeved Mar 26, 2026
5b06c10
zTrack/zEagl4Anim/tools: polish guidance and scope fixes
JohnDeved Mar 26, 2026
cd8b330
90.644% zTrack: improve ClearCurrentZones ordering
JohnDeved Mar 26, 2026
4fb10e6
90.644% zTrack: restore UnloadSection helper ownership
JohnDeved Mar 26, 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
1 change: 1 addition & 0 deletions .agents/skills/code_style
1 change: 1 addition & 0 deletions .agents/skills/execute
1 change: 1 addition & 0 deletions .agents/skills/ghidra
1 change: 1 addition & 0 deletions .agents/skills/implement
1 change: 1 addition & 0 deletions .agents/skills/line_lookup
1 change: 1 addition & 0 deletions .agents/skills/lookup
1 change: 1 addition & 0 deletions .agents/skills/refiner
1 change: 1 addition & 0 deletions .agents/skills/scaffold
1 change: 1 addition & 0 deletions .claude
38 changes: 37 additions & 1 deletion .github/skills/code_style/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ python tools/code_style.py audit --base origin/main
- `audit` also checks touched `class` / `struct` declarations against known header declarations and, when no header exists, against the PS2 visibility rule.
- `audit` warns on touched local forward declarations when the repo already has a header for that type.
- `audit` warns on touched type members that look like invented padding or placeholder names such as `pad`, `unk`, or `field_1234`.
- `audit` also checks touched style-guide rules that clang-format cannot enforce for you, such as cast spacing, `using namespace`, `NULL`, and missing `EA_PRAGMA_ONCE_SUPPORTED` guard blocks when a header's guard region is touched.
- `audit` also checks touched style-guide rules that clang-format cannot enforce for you, such as cast spacing, `using namespace`, `NULL`, bare `#if MACRO` presence checks, recovered layout members that still use raw `unsigned char` / `unsigned short`, and missing or misordered `EA_PRAGMA_ONCE_SUPPORTED` guard blocks when a header's prologue is touched.
- `audit` groups repeated findings by file so branch-wide output stays readable.
- Use `audit --category safe-cpp` when you want a smaller Frontend/FEng-focused subset and `audit --category match-sensitive-cpp` when you want a conservative review queue for decomp code.
- `format --check` is an opt-in wrapper around the repo's `.clang-format`, and by default it targets eligible changed C/C++ files, including match-sensitive code.
Expand Down Expand Up @@ -95,14 +95,22 @@ Foo::Foo()
- Use `nullptr` exclusively for null pointers.
- Prefer `if (ptr)` / `if (!ptr)` over explicit null comparisons when the change is local and verified safe.
- When a match-sensitive TU has many explicit `nullptr` checks and you decide to normalize them, prefer one mechanical full-TU pass over piecemeal cleanup. Rebuild the unit and re-check its status before keeping the rewrite.
- When a helper is doing address arithmetic, prefer `intptr_t` / `uintptr_t` or byte-pointer (`reinterpret_cast<char *>`) math over plain `int` parameters or integerized pointer subtraction.
- Inline assembly is acceptable when it is needed to preserve dead-code compares, ordering, or other compiler behavior that source alone cannot reproduce.
- In low-level list / node / allocator code, prefer existing helper methods such as `AddBefore`, `AddAfter`, `Remove`, `GetPrev`, `GetNext`, or typed accessors over open-coding link rewiring once the helper exists.

### Header prologues and preprocessor checks

- In headers, keep the guard / `EA_PRAGMA_ONCE_SUPPORTED` block before any project `#include`; do not place includes ahead of `#pragma once`.
- Use `#ifdef MACRO` / `#ifndef MACRO` for presence checks. Reserve bare `#if MACRO` for cases where you really need the macro's numeric value.

### Forward declarations and local prototypes

- Prefer including the owning repo header over adding a local forward declaration for a project type.
- If the repo already has a header declaration/definition for a type, include that header instead of redeclaring the type locally.
- If the repo only has an empty or stub owner header, and line info / surrounding source clearly points at that header's subsystem, prefer populating that owner header over leaving a recovered project type declaration inside a `.cpp`.
- Only keep a local forward declaration when no canonical repo header exists yet and you have verified that the ownership is still unresolved.
- Likewise for project free functions: if a declaration is shared across translation units, move it into the owning header instead of leaving ad-hoc local prototypes in `.cpp` files.
- Prefer moving helper template declarations next to their real use site instead of leaving them in an unrelated file.

### Pointer style
Expand All @@ -114,13 +122,18 @@ Foo::Foo()

- Use the repo's header guard form when writing headers: `#ifndef` / `#define` plus the `#ifdef EA_PRAGMA_ONCE_SUPPORTED` / `#pragma once` block.
- Keep member layout comments aligned and intact in decomp headers.
- When writing a recovered layout, start from a pasted GC DWARF dump instead of hand-reconstructing a cleaner version. Treat the dump as source-of-truth data entry, then make only small verified fixes from PS2 or existing headers.
- Preserve the original `class` / `struct` kind from existing headers or Dwarf / PS2 evidence; do not treat it as a cosmetic style choice.
- Treat header declarations as the repo source of truth. If the repo only has local `.cpp` partial declarations, verify the kind with the PS2 dump instead of copying them blindly.
- Even forward declarations and local partial declarations should use the accurate keyword when known.
- Keep the `// total size: 0x...` comment above the recovered type declaration instead of burying it inside the body.
- When a recovered type is a `class`, keep explicit access sections and put the method/accessor block before the member layout block unless existing repo evidence shows otherwise.
- Preserve the member naming style that DWARF shows. Some types use `mMember`, others use `m_member`; do not normalize them.
- Preserve recovered member names, types, order, and offset comments. Do not invent placeholder members named `pad`, `unk`, `unknown`, or `field_XXXX` for game code just to make a layout compile.
- Preserve the dumped declaration order too. Do not regroup methods, helpers, enums, or fields for readability unless an existing repo header or PS2 evidence proves the original order differs.
- If a member is genuinely unknown, stop and verify it with `find-symbol.py`, GC Dwarf, and PS2 data. If the layout is still incomplete, add a short TODO above the type instead of burying uncertainty in fake member names.
- Add offset / size comments when you are writing recovered type layouts from DWARF.
- In recovered layouts, prefer explicit-width aliases such as `uint8` / `uint16` when the field width is known. Use plain `char` for text / byte buffers and `signed char` when the field is a signed 8-bit counter.
- Define inline member functions in headers only when DWARF shows that they are genuinely inlined in the binary.
- Use `struct` for POD-like data carriers with public fields; use `class` for behavior-heavy types only when that matches the recovered type information.
- Keep tiny placeholder methods as concise inline bodies when that is already the local pattern.
Expand All @@ -134,13 +147,28 @@ Foo::Foo()
### Dense local code

- Expand dense one-line helper structs, declaration blocks, and function bodies in non-match-sensitive files into normal multiline formatting.
- In low-level headers, prefer normal multi-line bodies for touched inline operators and accessors instead of stacking `{ return ...; }` on one line, unless the surrounding file clearly uses intentional placeholder one-liners.
- Prefer readable blocks over stacked one-line statements when behavior does not depend on exact source shape.
- In touched validation/parsing code, prefer explicit min/max or boundary checks over equivalent magic-constant arithmetic when the clearer form still compiles to the verified result.
- In parser/state-table code, prefer named enums and enum-typed state variables over anonymous integer state codes when that rewrite is verified safe.
- In touched parser/script code, prefer keeping DWARF-listed consumed-token locals such as `region`, `section`, or `option` instead of chaining and discarding `GetNextArgument*` calls inline. When the original code used a small nested parse block, preserving that block shape can be necessary for exact DWARF even when objdiff already matches.

### Recovery markers

- Remove stale recovery markers such as `// TODO`, `// UNSOLVED`, or `// STRIPPED` when the touched code is now implemented or understood.
- If a marker still needs to stay, give it short context such as ownership uncertainty, a Dwarf caveat, a platform/config note, or a scratch/link reference. Avoid bare marker-only comments.
- Do not leave `// TODO` hanging off a declaration or helper you just implemented; either finish the thought or remove the marker.

### Uncertain ownership

- If a declaration or global clearly compiles but its original home is uncertain, add a short TODO comment instead of inventing structure you cannot justify yet.
- When ownership matters, verify it with `decomp-workflow.py`, `decomp-context.py`, and `line-lookup` before moving code.

### Readable helper extraction

- When touched recovered code repeats the same pointer/boundary arithmetic, prefer a short named helper or accessor such as `GetTop`, `GetBot`, `GetNext`, `GetPrev`, `GetStringTableStart`, or `GetStringTableEnd` if that shape is already supported by Dwarf/inlining evidence.
- Prefer call sites that use those helpers or existing container APIs over re-encoding the same arithmetic or link manipulation inline.

## Phase 3: Things Not To "Clean Up" Blindly

- Do not move an inline method out of a header just because it looks cleaner.
Expand Down Expand Up @@ -172,3 +200,11 @@ Keep the cleanup only if the build succeeds and the relevant match status is unc
- The trailing `//` initializer-list markers are an intentional repo convention, not noise to remove.
- Small `if (ptr)` cleanup batches can be kept in match-sensitive code, but only after rebuilding the affected unit.
- Dense frontend shim files benefit from multiline struct/prototype/function formatting.
- Header prologues should keep the `EA_PRAGMA_ONCE_SUPPORTED` block ahead of includes, not after them.
- Bare `#if MACRO` presence checks are review bait; use `#ifdef` / `#ifndef` unless you are intentionally testing a numeric config value.
- Reviewed recovered headers tend to keep total-size comments above the type, methods before fields, explicit access sections, and fixed-width aliases for width-known narrow integer members.
- Recent `zMisc` review cleanup also showed that hand-reconstructed structs and reordered declarations create avoidable churn; copy recovered layouts from DWARF into the owner header first and keep the dumped order unless PS2/header evidence proves a correction.
- Reviewed fixups also remove stale bare recovery markers or replace them with context, and prefer existing list/node helpers over hand-written pointer/link rewiring.
- Some reviewed fixups improved readability without losing match by replacing opaque range-check arithmetic with explicit bounds and by moving repeated pointer/boundary math behind short named helpers.
- Other recurring review churn came from plain-`int` address helpers, stray local `.cpp` prototypes for shared functions, and integer-coded parser states where named enums were clearer but still matched.
- Recent `zTrack` polish also showed that parser-like code should keep DWARF-listed consumed-token locals and the original nested block shape instead of compressing everything into inline/discarded `GetNextArgument*` calls.
16 changes: 16 additions & 0 deletions .github/skills/execute/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ the produced C++ compiles to byte-identical object code against the original ret

For each function, "done" means both objdiff and normalized DWARF are exact.

Human review is not a substitute for running `dwarf compare`. Each function should hit
its own `verify` gate before you treat it as ready to hand off, commit, or move past.

## Overview

This workflow combines several smaller workflows:
Expand Down Expand Up @@ -88,6 +91,10 @@ definition does not yet exist in the project, follow the scaffold workflow in
`.github/skills/scaffold/SKILL.md` to create the needed header/source definitions
before moving on.

Treat recovered types here as copied reference data, not as hand-designed headers. Copy
the GC DWARF type body into the canonical owner header first and preserve its declaration
order unless PS2 or existing repo-header evidence proves a specific correction.

## Phase 3: Implement Functions

### 3a. Get the updated function list
Expand All @@ -113,6 +120,9 @@ For each missing or nonmatching function, follow the implementation workflow in
- **One at a time.** Keep the tree in a coherent state as you work through the list.
- **Balance new vs fixing.** Don't get stuck on one stubborn function — sometimes
implementing the next function reveals patterns that make the previous one click.
- **Recovered types are not freeform.** If a function forces you to add or fix a type,
copy the DWARF layout into the owner header first. Do not sketch structs/classes from
use sites or reorder declarations just to make the header look nicer.
- **Mismatch triage:**
- `@stringBase0` offset mismatches often resolve as more string literals are added
- If you need to inspect the original string or rodata at a virtual address, use `python tools/elf_lookup.py 0xADDR`
Expand Down Expand Up @@ -152,6 +162,10 @@ python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName
If it fails, follow up with `decomp-workflow.py diff` and `decomp-workflow.py dwarf`
until both checks pass.

Do not queue up several "probably done" functions and leave the DWARF check for later.
Close the `verify` gate per function before moving on whenever feasible; otherwise the
reviewer ends up doing avoidable DWARF triage.

### 3g. Periodic reassessment

After every few functions, re-run the full status check:
Expand Down Expand Up @@ -189,6 +203,8 @@ For any remaining nonmatching functions, make one final pass using the implement
or refiner workflow with all context accumulated during the session.

Do not report a function as complete unless its per-function `verify` check also passes.
Do not hand a function to review as "done except maybe DWARF" — either resolve the DWARF
failure yourself or explicitly call out the blocker and why it remains.

## Phase 5: Report

Expand Down
33 changes: 33 additions & 0 deletions .github/skills/implement/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ Your goal is to decompile a specific function: writing C++ source that compiles

A function is not done until it is exact in both objdiff and normalized DWARF.

Reviewers should not be spending their time rediscovering DWARF mismatches. Before you
report progress, ask for review, hand the function off, or switch to another target, you
must run the per-function verification gate yourself and treat any DWARF failure as your
next task, not as review debt.

## Phase 1: Gather Context

Collect data from **all** of these sources in parallel where possible.
Expand Down Expand Up @@ -85,6 +90,8 @@ Reference the skill for the usage. It gives info based on the virtual address of
- If a repo header already exists for the type, include that header instead of introducing a local forward declaration.
- Preserve the original `class` vs `struct` kind. If the existing header is missing or incomplete, verify the type kind from GC Dwarf and PS2 info before writing a local declaration.
- Preserve real member names and field types too. Do not introduce `pad`, `unk`, or `field_XXXX` members as placeholders for guessed layout; verify the member list from GC Dwarf / PS2 data and leave a TODO when something is still uncertain.
- When a type is missing or incomplete, dump the full class/struct body from GC DWARF and paste that as the starting point. Do not reconstruct the layout from one function's field accesses or from guessed semantics.
- Preserve the dumped declaration order as well as the member order. Do not re-sort methods, group fields by guessed meaning, or otherwise "clean up" the layout unless an existing repo header or PS2 evidence proves a specific correction.

### 1e. Assembly reference

Expand Down Expand Up @@ -125,6 +132,8 @@ and assembly:

Utilize the dwarf information that you get from the lookup skill heavily.

For any recovered type you touch while implementing the function, treat the DWARF body as source material to copy, not prose to paraphrase. Start from the dumped layout in the canonical owner header, then make only the minimal verified fixes.

Don't add explanatory comments during implementation unless you need to document a remaining DWARF mismatch.

Don't use any temporary local variables that don't exist in the dwarf.
Expand Down Expand Up @@ -156,6 +165,16 @@ python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName

If the build fails, fix compilation errors first.

As soon as you have a compiling draft, run the combined verification gate immediately:

```sh
python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName
```

Do this before you spend a long time polishing late instruction mismatches. If `verify`
already shows a DWARF failure, fix that first so you are not polishing code the reviewer
will bounce anyway.

### Check the diff

```sh
Expand Down Expand Up @@ -203,6 +222,17 @@ debug-line owner files for each DWARF `// Range:` block, which makes it much eas
spot inlines that are coming from the wrong header or owner file. Exact line-number
agreement is a useful secondary hint, but file ownership is the first thing to check.

Use this as the default loop when the function compiles but `verify` is still failing:

1. Run `verify`.
2. If DWARF fails, run `dwarf`.
3. Fix the structural issue the DWARF diff is pointing at first: missing/extra locals,
wrong qualifiers or parameter types, wrong inline ownership, wrong helper/header owner,
or a source shape that outlined something that should be inlined.
4. Rebuild and rerun `verify`.
5. Only return to instruction-by-instruction cleanup once the remaining failures are no
longer obvious DWARF-compare issues.

Manual fallback:

After writing your code, you can also run the dwarf dump on the compiled output and then query your output dump with lookup.py to compare your decompiled functions against the originals. Since the address of the function you're working on can keep changing
Expand Down Expand Up @@ -233,6 +263,9 @@ Every mismatched instruction is a signal — don't settle for "close enough".
Reaching 100% instruction matching status is not enough. Stay in the loop until `verify`
passes, which means the DWARF of the function also matches after normalization.

Do not leave a function in a "review-ready" or "good enough for now" state with a known
DWARF failure unless you are explicitly blocked and you document that blocker clearly.

## Phase 5: Report

Summarize:
Expand Down
19 changes: 19 additions & 0 deletions .github/skills/refiner/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,25 @@ approaches that were tried before — instead, apply systematic lateral analysis
- A diff is available (`decomp-diff.py -u <TU> -d <func>`).
- The "obvious" translation from Ghidra has been attempted.
- You have been given the current source code and the diff.
- You have already run the per-function `verify` gate and know whether the remaining work
is still structural DWARF cleanup or true late-stage instruction cleanup.

Refiner is not the place to dump unresolved DWARF debt on a reviewer. If `verify` or
`dwarf` is still showing obvious structural mismatches (missing locals, wrong types,
wrong inline ownership, wrong helper/header owner), fix those first or drop back to the
implementer workflow before doing late instruction polish.

## Phase 1: Read the full diff without collapsing

Before you start a refiner pass, confirm the gate status:

```sh
python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName
```

If the combined gate is failing for reasons that are still clearly visible in the DWARF
diff, address those first instead of treating them as reviewer follow-up.

Preferred shortcut:

```sh
Expand Down Expand Up @@ -151,6 +167,9 @@ DWARF mismatches to watch for:
- Wrong return type
- Missing inlined function records (means an inline call was outlined)

If these mismatches are still present, you are not in pure refiner territory yet. Resolve
them before you ask a reviewer to spend time on the function.

## Phase 4: Report

Summarize:
Expand Down
Loading
Loading