Zum Inhalt

09 — Migrations-Checkliste für bestehende Specs

Status: Arbeitsliste


1. Globale Ersetzungen

Profile

Alt:

type TaskLocal = <{ own: Unique, share: Local }>

Neu:

tag TaskLocal
    :> Own(Unique)
    :> Share(Local)

Policy-Enums

Alt:

type SharePolicy : enum =
    | Local
    | Send
    | Sync

Neu:

tag SharePolicy : enum =
    | Local
    | Send
    | Sync

Betrifft mindestens:

OwnPolicy
SharePolicy
DropPolicy
MemoryKind / MemoryPolicy-Atoms
CreatePolicy-Atoms, soweit compile-time-only
UserState / UserPhase

Achtung: Wenn Varianten Runtime-Werte sein müssen, bleiben sie type ... : enum.


UserPhase / UserState

Alt:

type UserPhase : enum =
    | Registered
    | Verified
    | Active

type ManagedUser[phantom P: UserPhase] : struct { ... }

Neu:

tag UserState : enum =
    | Registered
    | Verified
    | Active

type ManagedUser[phantom State: UserState] : struct { ... }

Arena- und Pool-Marker

Alt:

type RequestArena : struct { ... }

oder implizit undefiniert:

Memory(Arena[RequestArena])

Neu:

tag ArenaKind

tag RequestArena : ArenaKind

type RequestData : struct { ... }
    :> Memory(Arena[RequestArena])

Ref -> Rc

Alt:

Memory(Ref)

Neu:

Memory(Rc)

Grund: Ref kollidiert begrifflich mit Referenz/Ref-Parametern. Rc benennt Refcounting präziser.


2. Qualifier-Grammatik

Alt:

TypeParam ::= Qualifier* Name (: KindConstraint)?
Qualifier ::= "phantom" | "reified"

Neu:

TypeParam ::= TypeParamQualifier? Name (":" Constraint)?
TypeParamQualifier ::= "phantom" | "reified"

Regel:

Qualifier sind exklusiv und nicht kombinierbar.

3. Cast Try-Beispiele

Alt:

val id =? user -> UserId

Als allgemeine TryCast-Erklärung problematisch, weil =? sofort zur nächsten Boundary propagiert.

Neu differenzieren:

val idResult = try {
    user -> UserId
}

oder bei sofortiger Propagation:

val id =? user -> UserId

Innerhalb eines try-Blocks propagiert =? nur bis zum Block.


4. deps-Altlasten

Alle Beispiele mit:

def<{ deps: [Db, Logger] }>

ersetzen durch:

def fetchUser(db: UserDb, id: UserId) -> Result[User, UserDbError] =
    db.getUserById(id)

oder Effect-Stil:

def fetchUser(id: UserId) -> Effect[User, UserDbError, UserDb] =
    UserDb.getUserById(id)

5. HandleId-Felder

Alt:

type DbConnection : struct {
    handle: HandleId
}

Nur noch zulässig, wenn der Typ System-/Stdlib-/FFI-nah ist und Ownership explizit geklärt wird.

Besser:

tag PoolKind
 tag ConnectionPool : PoolKind

Normativ ohne Leerfehler:

tag PoolKind
tag ConnectionPool : PoolKind
type DbConnection : struct {
    native: NativeDbConnection
} :> Memory(Pool[ConnectionPool])

6. Dokumente mit hoher Betroffenheit

00-refinements
02-typsystem
04-qualifier-effekte-konversionen-wire
04-axiomatik-profiles-executables
04a-label-inferenz-regeln
07-cast-effekte-refinements
10-runtime-handles-und-memory-safety
11-jadevalue-und-register-layout
jade-compiler-db-spec
spec-namespaces-und-module
14-plugin-system-revised

7. Neue normative Kapitel empfohlen

00-ontology-types-tags-phantoms.md
03-typefn-semantics.md
07-compilerdb-tag-subsystem.md

Diese Kapitel sollten nicht als Randnotiz verbleiben. Sie bilden künftig die Grundlage für Type Engine, JME-Policies und Spec-Diagnostik. Ja, das ist Arbeit. Nein, die Syntaxfee erledigt das nicht.