Skip to content

Profile Enum Unification

Janus 2026.6.2+ (branch feature/grok/priority-sprint) unifies the profile system across layers that previously disagreed on enum variants, alias resolution, and feature gates.

:script ⊆ :core ⊆ :service ⊆ :cluster ⊆ :compute ⊆ :sovereign

All compiler subsystems now resolve to this ladder. There is no separate :npu or :full enum — those spellings are aliases that map to :compute and :sovereign respectively.

parseProfileNameToSemantic previously mapped :script to .sovereign. That was wrong: :script is the bottom exploratory tier, not the top capability tier. Script modules now resolve to .script through semantic analysis, the effect graph, and the pipeline.

Feature.availableInProfile in src/profiles.zig uses profile rank instead of ad-hoc per-layer switches:

Minimum profileFeatures unlocked
:scriptBasic types, functions, control flow
:serviceStructured concurrency, channels, contexts, error handling
:clusterActors
:sovereignEffects, capabilities, comptime magic, multiple dispatch

Actors require :cluster, not :sovereign.

  • Default LSP profile is :sovereign (was :full).
  • Keyword availability follows the same rank ladder as the CLI.
  • Daemon LSP exposes all six canonical profiles.

Old spellings keep working. Examples:

Terminal window
janus --profile=main build app.jan # → :core
janus --profile=go build server.jan # → :service
janus --profile=npu build kernel.jan # → :compute
janus --profile=full build driver.jan # → :sovereign

Source annotations follow the same alias table:

{.profile :main.} // :core
{.profile :async.} // :service
{.profile :actor.} // :cluster
{.profile :tensor.} // :compute
{.profile :unsafe.} // :sovereign
  • If diagnostics suddenly mention :cluster for actor code that compiled under a looser gate, escalate the module profile or use a function-level override.
  • Replace :full in LSP configs with :sovereign (alias still accepted).
  • Replace :npu with :compute in new code (alias still accepted).