Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions .agents/skills/uloop-hot-reload/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ changed are patched (`UnchangedTotal` counts the rest).
refused with a `Warnings` line naming the reason. Use from another assembly or from files
outside the reload, reflection, serialization, and Unity message discovery still need
`uloop compile`.
- Signature changes: a return-type change is `Skipped` unless this reload or an earlier one
patched every live compiled caller of the old signature; a rename or parameter change
applies as an added method and warns about the call sites left on the old signature.
- Signature changes: a return-type change is `Skipped` unless this or an earlier reload
patched every live compiled caller, none in another assembly; a rename or parameter change
applies as an added method and warns about call sites left on the old signature.
- Constructors, operators, struct methods, compiled setter/init/indexer accessors, and event
accessors are `Skipped`; finalizers and interface members are silently not applied.
- A reload applies each file all-or-nothing: a `Failed` method leaves that file unapplied,
Expand Down
19 changes: 14 additions & 5 deletions .agents/skills/uloop-hot-reload/references/scope-and-limits.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,25 +180,34 @@ the assembly, the Editor-session illusion, and the `virtual`/generic/interface
exclusions.

A gate protects compiled callers: the change applies only when every live compiled
call site of the old signature is patched by the same reload. A caller this reload
did not edit — in another file, in another assembly, or an *unedited* method in the
call site of the old signature is in the same assembly and patched by the same reload.
A caller this reload did not edit — in another file or an *unedited* method in the
edited file itself (an implicit `int`→`long` widening can leave a caller's source
untouched) — would keep calling the old method silently, so the run reports the
changed method and its edited callers as `Skipped` instead; land the change with
`uloop compile`. When every uncovered caller is in the edited file itself, the
`uloop compile`. A caller in another assembly gates the change even when this or an
earlier reload patched it: that patch is compiled against the compiled assembly, where
the old signature still exists. When every uncovered caller is in the edited file itself, the
`Skipped` reason names those callers: editing their bodies and reloading again
applies them together without `uloop compile`.
Call sites inside methods that the same edit removes or
re-signatures do not gate: those compiled bodies are already stale, and anything
still reaching them stays on the consistent old behavior.
If an earlier reload already patched the compiled call sites, a later signature change applies without editing the callers; the response then carries a warning naming the call sites this run re-applied on the new signature.
If an earlier reload already patched the compiled call sites in the same assembly, a later signature change applies without editing the callers; the response then carries a warning naming the call sites this run re-applied on the new signature.

Renaming a method or changing its parameter list follows the delete rules rather
than the gate: the new signature is an ordinary added method, the old one is
reported removed, and a `Warnings` entry names each compiled call site of the old
signature that the reload leaves unpatched — those call sites keep the previous
behavior until `uloop compile`. Deleting a method emits the same warning when
compiled callers remain.
compiled callers remain. A caller whose patch is active when the reload ends —
patched by this reload in any assembly, or kept from an earlier reload — is left out,
because it no longer runs its compiled body. The warning does not check what the
patched body calls, and two leftovers of the compiled caller can still reach the old
method: a copy the JIT inlined into another method before the patch, and a delegate to
the old method the caller created before it. A call inside a lambda or local function
stays listed under its compiler-generated name even when the method declaring it is
patched.

Field declarations are stricter: when a compiled field's type — or its `static`/
`const` modifier — differs from the edited source, every edited method that reads
Expand Down
6 changes: 3 additions & 3 deletions .claude/skills/uloop-hot-reload/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ changed are patched (`UnchangedTotal` counts the rest).
refused with a `Warnings` line naming the reason. Use from another assembly or from files
outside the reload, reflection, serialization, and Unity message discovery still need
`uloop compile`.
- Signature changes: a return-type change is `Skipped` unless this reload or an earlier one
patched every live compiled caller of the old signature; a rename or parameter change
applies as an added method and warns about the call sites left on the old signature.
- Signature changes: a return-type change is `Skipped` unless this or an earlier reload
patched every live compiled caller, none in another assembly; a rename or parameter change
applies as an added method and warns about call sites left on the old signature.
- Constructors, operators, struct methods, compiled setter/init/indexer accessors, and event
accessors are `Skipped`; finalizers and interface members are silently not applied.
- A reload applies each file all-or-nothing: a `Failed` method leaves that file unapplied,
Expand Down
19 changes: 14 additions & 5 deletions .claude/skills/uloop-hot-reload/references/scope-and-limits.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,25 +180,34 @@ the assembly, the Editor-session illusion, and the `virtual`/generic/interface
exclusions.

A gate protects compiled callers: the change applies only when every live compiled
call site of the old signature is patched by the same reload. A caller this reload
did not edit — in another file, in another assembly, or an *unedited* method in the
call site of the old signature is in the same assembly and patched by the same reload.
A caller this reload did not edit — in another file or an *unedited* method in the
edited file itself (an implicit `int`→`long` widening can leave a caller's source
untouched) — would keep calling the old method silently, so the run reports the
changed method and its edited callers as `Skipped` instead; land the change with
`uloop compile`. When every uncovered caller is in the edited file itself, the
`uloop compile`. A caller in another assembly gates the change even when this or an
earlier reload patched it: that patch is compiled against the compiled assembly, where
the old signature still exists. When every uncovered caller is in the edited file itself, the
`Skipped` reason names those callers: editing their bodies and reloading again
applies them together without `uloop compile`.
Call sites inside methods that the same edit removes or
re-signatures do not gate: those compiled bodies are already stale, and anything
still reaching them stays on the consistent old behavior.
If an earlier reload already patched the compiled call sites, a later signature change applies without editing the callers; the response then carries a warning naming the call sites this run re-applied on the new signature.
If an earlier reload already patched the compiled call sites in the same assembly, a later signature change applies without editing the callers; the response then carries a warning naming the call sites this run re-applied on the new signature.

Renaming a method or changing its parameter list follows the delete rules rather
than the gate: the new signature is an ordinary added method, the old one is
reported removed, and a `Warnings` entry names each compiled call site of the old
signature that the reload leaves unpatched — those call sites keep the previous
behavior until `uloop compile`. Deleting a method emits the same warning when
compiled callers remain.
compiled callers remain. A caller whose patch is active when the reload ends —
patched by this reload in any assembly, or kept from an earlier reload — is left out,
because it no longer runs its compiled body. The warning does not check what the
patched body calls, and two leftovers of the compiled caller can still reach the old
method: a copy the JIT inlined into another method before the patch, and a delegate to
the old method the caller created before it. A call inside a lambda or local function
stays listed under its compiler-generated name even when the method declaring it is
patched.

Field declarations are stricter: when a compiled field's type — or its `static`/
`const` modifier — differs from the edited source, every edited method that reads
Expand Down
Loading
Loading