Skip to content

Commit 63d966d

Browse files
refactor: migrate SirusContext trust_level to enum
Agent-Logs-Url: https://github.com/Starisian-Technologies/sparxstar-sirus-context/sessions/e5d37968-dbb9-4909-b0cb-456455e324b9 Co-authored-by: MaximillianGroup <34328348+MaximillianGroup@users.noreply.github.com>
1 parent e7294c6 commit 63d966d

13 files changed

Lines changed: 43 additions & 33 deletions

TRACKER.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ This document tracks every component defined in **Sirus Context Engine Spec v3.0
2626
|---|---|---|---|---|
2727
| `ContextEngine::current()` | `src/core/ContextEngine.php` || S-01 | Throws `ContextBootException`, never null/partial |
2828
| CLI system context | `src/core/ContextEngine.php` || S-01 | `SYSTEM`/`GLOBAL`/`CLI` path |
29-
| `SirusContext` DTO | `src/core/SirusContext.php` || S-01 | Includes `trust_score` field |
29+
| `SirusContext` DTO | `src/core/SirusContext.php` || S-01 | Includes `trust_score`; `trust_level` typed as `TrustLevelPrimitive` enum |
3030
| `ContextCache` | `src/core/ContextCache.php` || S-01 | Cache + TTL eviction |
3131
| `ContextBootException` | `packages/sparxstar-ouroboros-integrity/src/Exceptions/ContextBootException.php` || S-04 | Migrated to Ouroboros CO-001 — `Starisian\Sparxstar\Infrastructure\Exceptions` |
3232
| `ContextPulse` DTO | `packages/sparxstar-ouroboros-integrity/src/DTOs/ContextPulse.php` || S-04 | Migrated to Ouroboros CO-001 — `Starisian\Sparxstar\Infrastructure\DTOs` |
@@ -38,7 +38,7 @@ This document tracks every component defined in **Sirus Context Engine Spec v3.0
3838
| `TrustEngine` | `src/core/TrustEngine.php` || S-01/S-02 | Frozen algorithm; 18 unit tests in `TrustEngineTest` |
3939
| `TrustResolver` | `src/core/TrustResolver.php` || S-01/S-02 | Credential-level base + drift/session deductions; 15 unit tests in `TrustResolverTest` |
4040
| `StepUpPolicy` | `src/core/StepUpPolicy.php` || S-01/S-02 | Frozen policy; `requiresStepUp()` + `TRUST_LEVEL_STEP_UP_REQUIRED` pre-flag check; 17 unit tests |
41-
| `PulseGenerator` | `src/core/PulseGenerator.php` || S-01/S-02 | HMAC-SHA256 only; PAM-002-P2 fields wired (`behavior_flags`, `geo_zone`, `network_effective_type`, `session_duration`); 20 unit tests in `PulseGeneratorTest`; `$now`/`$ttlSeconds` explicit params |
41+
| `PulseGenerator` | `src/core/PulseGenerator.php` || S-01/S-02 | HMAC-SHA256 only; consumes enum-backed `SirusContext::trust_level`; PAM-002-P2 fields wired (`behavior_flags`, `geo_zone`, `network_effective_type`, `session_duration`); 20 unit tests in `PulseGeneratorTest`; `$now`/`$ttlSeconds` explicit params |
4242

4343
### Device and Identity
4444

@@ -261,4 +261,4 @@ Legacy `sparxstar-user-environment-check` files remain in the codebase during th
261261

262262
---
263263

264-
*Last updated: 2026-05-13 | Spec version: Sirus Context Engine Spec v3.0*
264+
*Last updated: 2026-05-16 | Spec version: Sirus Context Engine Spec v3.0*

src/core/AuthorityResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ final class AuthorityResolver
4747
*/
4848
public function resolve(SirusContext $context): ?string
4949
{
50-
if ($context->trust_level !== 'authority') {
50+
if ($context->trust_level->value !== 'authority') {
5151
return null;
5252
}
5353

src/core/CapabilityEngine.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ final class CapabilityEngine
4545
*/
4646
public function resolve(SirusContext $context): array
4747
{
48-
$capabilities = self::BASE_CAPABILITIES[ $context->trust_level ]
48+
$capabilities = self::BASE_CAPABILITIES[ $context->trust_level->value ]
4949
?? self::BASE_CAPABILITIES['anonymous'];
5050

5151
/** @var list<string> $capabilities */

src/core/ContextEngine.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
}
2222

2323
use Starisian\Sparxstar\Infrastructure\Exceptions\ContextBootException;
24+
use Starisian\Sparxstar\Infrastructure\DTOs\TrustLevelPrimitive;
2425
use Starisian\Sparxstar\Sirus\core\TrustEngine;
2526

2627
/**
@@ -139,7 +140,7 @@ private static function buildCliContext(): SirusContext
139140
authority_id: 'GLOBAL',
140141
role_set: [],
141142
capabilities: [],
142-
trust_level: 'NORMAL',
143+
trust_level: TrustLevelPrimitive::from('NORMAL'),
143144
trust_score: 1.0,
144145
issued_at: $issued_at,
145146
expires: 0,
@@ -201,7 +202,7 @@ public static function buildFromDevice(DeviceRecord $device): SirusContext
201202
authority_id: null,
202203
role_set: [],
203204
capabilities: [],
204-
trust_level: $trust_level,
205+
trust_level: TrustLevelPrimitive::from($trust_level),
205206
trust_score: $trust_score,
206207
issued_at: $issued_at,
207208
expires: $expires,
@@ -261,7 +262,7 @@ public static function build(): SirusContext
261262
authority_id: $authority_id,
262263
role_set: $role_set,
263264
capabilities: $capabilities,
264-
trust_level: $trust_level,
265+
trust_level: TrustLevelPrimitive::from($trust_level),
265266
trust_score: $trust_score,
266267
issued_at: $issued_at,
267268
expires: $expires,

src/core/NetworkContextBroker.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
exit;
1919
}
2020

21+
use Starisian\Sparxstar\Infrastructure\DTOs\TrustLevelPrimitive;
22+
2123
/**
2224
* Creates and verifies short-lived signed tokens that carry a portable SirusContext
2325
* payload across network boundaries without exposing the identity_id.
@@ -142,7 +144,7 @@ public function verifyToken(string $token, string $secret): ?SirusContext
142144
capabilities: isset($data['caps']) && is_array($data['caps'])
143145
? array_map(strval(...), $data['caps'])
144146
: [],
145-
trust_level: $trust_level,
147+
trust_level: TrustLevelPrimitive::from($trust_level),
146148
trust_score: $trust_score,
147149
issued_at: (int) ($data['iat'] ?? 0),
148150
expires: (int) ($data['exp'] ?? 0),

src/core/PulseGenerator.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public function generate(SirusContext $context, int $now = 0, int $ttlSeconds =
9393
site_id: $context->site_id,
9494
network_id: $context->network_id,
9595
trust_score: $context->trust_score,
96-
trust_level: TrustLevelPrimitive::from($context->trust_level),
96+
trust_level: $context->trust_level,
9797
behavior_flags: $behavior_flags,
9898
geo_zone: $geo_zone,
9999
network_effective_type: $network_effective_type,
@@ -115,7 +115,7 @@ public function generate(SirusContext $context, int $now = 0, int $ttlSeconds =
115115
site_id: $context->site_id,
116116
network_id: $context->network_id,
117117
trust_score: $context->trust_score,
118-
trust_level: TrustLevelPrimitive::from($context->trust_level),
118+
trust_level: $context->trust_level,
119119
behavior_flags: $behavior_flags,
120120
geo_zone: $geo_zone,
121121
network_effective_type: $network_effective_type,
@@ -135,11 +135,11 @@ private function deriveBehaviorFlags(SirusContext $context): array
135135
{
136136
$flags = [];
137137

138-
if ($context->trust_level === StepUpPolicy::TRUST_LEVEL_STEP_UP_REQUIRED) {
138+
if ($context->trust_level === TrustLevelPrimitive::STEP_UP_REQUIRED) {
139139
$flags[] = 'step_up_required';
140-
} elseif ($context->trust_level === TrustEngine::LEVEL_ELEVATED) {
140+
} elseif ($context->trust_level === TrustLevelPrimitive::ELEVATED) {
141141
$flags[] = 'trust_level_elevated';
142-
} elseif ($context->trust_level === TrustEngine::LEVEL_CRITICAL) {
142+
} elseif ($context->trust_level === TrustLevelPrimitive::CRITICAL) {
143143
$flags[] = 'trust_level_critical';
144144
}
145145

src/core/SirusContext.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
exit;
1515
}
1616

17+
use Starisian\Sparxstar\Infrastructure\DTOs\TrustLevelPrimitive;
18+
1719
/**
1820
* Immutable value object representing the full context for a single request.
1921
*/
@@ -34,7 +36,7 @@
3436
* @param string|null $authority_id Resolved authority type, or null.
3537
* @param array $role_set WordPress roles associated with the context.
3638
* @param array $capabilities Resolved capability strings.
37-
* @param string $trust_level Resolved trust level label (NORMAL, ELEVATED, CRITICAL, or anonymous).
39+
* @param TrustLevelPrimitive $trust_level Resolved trust level.
3840
* @param float $trust_score Numerical trust score in [0.0, 1.0] from TrustEngine.
3941
* @param int $issued_at Unix timestamp when the context was issued.
4042
* @param int $expires Unix timestamp when the context expires.
@@ -50,7 +52,7 @@ public function __construct(
5052
public ?string $authority_id,
5153
public array $role_set,
5254
public array $capabilities,
53-
public string $trust_level,
55+
public TrustLevelPrimitive $trust_level,
5456
public float $trust_score,
5557
public int $issued_at,
5658
public int $expires,
@@ -104,7 +106,7 @@ public function toPortablePayload(): array
104106
'auth' => $this->authority_id,
105107
'caps' => $this->capabilities,
106108
'ts' => $this->trust_score,
107-
'tl' => $this->trust_level,
109+
'tl' => $this->trust_level->value,
108110
'iat' => $this->issued_at,
109111
'exp' => $this->expires,
110112
];

tests/unit/ContextCacheTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace Starisian\Sparxstar\Sirus\Tests\Unit;
1212

1313
use PHPUnit\Framework\TestCase;
14+
use Starisian\Sparxstar\Infrastructure\DTOs\TrustLevelPrimitive;
1415
use Starisian\Sparxstar\Sirus\core\ContextCache;
1516
use Starisian\Sparxstar\Sirus\core\SirusContext;
1617

@@ -43,7 +44,7 @@ private function makeContext(string $ctx_id = 'ctx-test'): SirusContext
4344
authority_id: null,
4445
role_set: [],
4546
capabilities: [],
46-
trust_level: 'anonymous',
47+
trust_level: TrustLevelPrimitive::from('anonymous'),
4748
trust_score: 1.0,
4849
issued_at: time(),
4950
expires: time() + 300,

tests/unit/ContextEngineTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace Starisian\Sparxstar\Sirus\Tests\Unit;
1212

1313
use PHPUnit\Framework\TestCase;
14+
use Starisian\Sparxstar\Infrastructure\DTOs\TrustLevelPrimitive;
1415
use Starisian\Sparxstar\Sirus\core\ContextCache;
1516
use Starisian\Sparxstar\Sirus\core\ContextEngine;
1617
use Starisian\Sparxstar\Sirus\core\SirusContext;
@@ -85,7 +86,7 @@ public function testBuiltContextDefaultsToNormalTrust(): void
8586
{
8687
$ctx = ContextEngine::build();
8788

88-
$this->assertSame('NORMAL', $ctx->trust_level);
89+
$this->assertSame('NORMAL', $ctx->trust_level->value);
8990
$this->assertNull($ctx->identity_id);
9091
$this->assertNull($ctx->authority_id);
9192
}
@@ -216,7 +217,7 @@ public function testBuildFromDeviceUsesTrustEngineLevel(): void
216217
$ctx = ContextEngine::buildFromDevice($record);
217218

218219
// contributor base = 0.90, no drift, not new session → score 0.90 → NORMAL.
219-
$this->assertSame('NORMAL', $ctx->trust_level);
220+
$this->assertSame('NORMAL', $ctx->trust_level->value);
220221
$this->assertEqualsWithDelta(0.90, $ctx->trust_score, 0.0001);
221222
}
222223

@@ -239,7 +240,7 @@ public function testCurrentEvictsExpiredCacheAndRebuilds(): void
239240
authority_id: null,
240241
role_set: [],
241242
capabilities: [],
242-
trust_level: 'anonymous',
243+
trust_level: TrustLevelPrimitive::from('anonymous'),
243244
trust_score: 1.0,
244245
issued_at: 1000,
245246
expires: 1001, // already expired

tests/unit/IdentityResolverTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
namespace Starisian\Sparxstar\Sirus\Tests\Unit;
1212

13+
use Starisian\Sparxstar\Infrastructure\DTOs\TrustLevelPrimitive;
1314
use Starisian\Sparxstar\Sirus\core\IdentityResolver;
1415
use Starisian\Sparxstar\Sirus\core\SirusContext;
1516
use Starisian\Sparxstar\Sirus\integrations\HeliosClientInterface;
@@ -39,7 +40,7 @@ private function makeContext(
3940
authority_id: null,
4041
role_set: [],
4142
capabilities: [],
42-
trust_level: 'anonymous',
43+
trust_level: TrustLevelPrimitive::from('anonymous'),
4344
trust_score: 1.0,
4445
issued_at: time(),
4546
expires: 0,

0 commit comments

Comments
 (0)