Skip to content

feat: anchored DateTime emission; qualify Timer.DelayCall; fix AfterDeserialization ctor - #50

Merged
kamronbatman merged 1 commit into
mainfrom
kb/anchored_time
Aug 22, 2026
Merged

feat: anchored DateTime emission; qualify Timer.DelayCall; fix AfterDeserialization ctor#50
kamronbatman merged 1 commit into
mainfrom
kb/anchored_time

Conversation

@kamronbatman

Copy link
Copy Markdown
Member

Summary

The phase-1 payload plus the last latent finding from #49.

  • [AnchoredDateTime]: a serializable DateTime emits writer.WriteAnchoredTime / reader.ReadAnchoredTime via the primitive rule ("AnchoredTime" rule argument, round-tripping through migration schemas exactly like DeltaTime). Precedence over [DeltaDateTime] when both are present. Consumers must provide the anchored read/write methods on their reader/writer — the runtime side lands with the save-time anchor work in the consuming engine.
  • Timer.DelayCall qualification: the async [AfterDeserialization(false)] path emitted an unqualified Timer.DelayCall — the same only-compiles-under-Server.* class of defect as the earlier qualification fixes. Now Server.Timer.DelayCall, pinned by new sync+async [AfterDeserialization] coverage in the non-Server-namespace fixture (this feature had zero test coverage before).
  • AfterDeserializationAttribute ctor bug: (bool synchronous = true) => Synchronous = true; ignored its parameter. Codegen reads the syntax-level argument so output was never affected, but the runtime property lied.

Proof

  • 89/89 tests green; snapshot changes confined to the two touched fixtures (WriteAnchoredTime(_lastRested), Server.Timer.DelayCall(RebuildCaches)), both compile-gated.
  • Real-corpus manifest: 36 sources change — exactly the async-AfterDeserialization users picking up the qualified call; everything else byte-identical.

🤖 Generated with Claude Code

…eserialization ctor

[AnchoredDateTime] on a serializable DateTime emits
writer.WriteAnchoredTime / reader.ReadAnchoredTime through the primitive
rule ("AnchoredTime" rule argument, round-tripping through migration
schemas like DeltaTime). It takes precedence over [DeltaDateTime] when
both are present. Consumers must provide the anchored read/write methods
on their reader/writer.

The asynchronous AfterDeserialization path emitted an unqualified
Timer.DelayCall, compiling only for classes under Server.* - the same
latent class as the earlier qualification fixes. Now fully qualified, and
the non-Server-namespace fixture gains sync and async
[AfterDeserialization] methods, which were previously uncovered entirely.

AfterDeserializationAttribute's constructor ignored its parameter and
always set Synchronous to true; codegen reads the syntax-level argument so
output was unaffected, but the runtime property lied.

Real-corpus manifest: 36 sources change, all async-AfterDeserialization
users picking up the qualified call.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kamronbatman
kamronbatman merged commit 38c2d73 into main Aug 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant