@githolon/dsl 0.112.12 → 0.113.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -72,6 +72,8 @@ final class WorkspaceFollowStatus {
72
72
  this.dueAt,
73
73
  this.attempt,
74
74
  this.activeEffect,
75
+ this.unsent,
76
+ this.unacknowledged,
75
77
  });
76
78
 
77
79
  factory WorkspaceFollowStatus.fromRuntime(
@@ -126,6 +128,9 @@ final class WorkspaceFollowStatus {
126
128
  : null,
127
129
  attempt: report.hasAttempt() ? report.attempt : null,
128
130
  activeEffect: report.hasActiveEffect() ? report.activeEffect : null,
131
+ unsent: report.hasUnsent() ? report.unsent : null,
132
+ unacknowledged:
133
+ report.hasUnacknowledged() ? report.unacknowledged : null,
129
134
  );
130
135
 
131
136
  final String workspace;
@@ -136,6 +141,11 @@ final class WorkspaceFollowStatus {
136
141
  final DateTime? dueAt;
137
142
  final int? attempt;
138
143
  final String? activeEffect;
144
+
145
+ /// Live stream progress: local commits not yet offered to the custodian, and commits offered
146
+ /// whose admission has not yet come back. Null when the live link is not streaming.
147
+ final int? unsent;
148
+ final int? unacknowledged;
139
149
  bool get current => phase == WorkspaceFollowPhase.settled && live;
140
150
  }
141
151
 
@@ -286,7 +296,9 @@ bool _sameFollows(
286
296
  a.retryAt != b.retryAt ||
287
297
  a.dueAt != b.dueAt ||
288
298
  a.attempt != b.attempt ||
289
- a.activeEffect != b.activeEffect) return false;
299
+ a.activeEffect != b.activeEffect ||
300
+ a.unsent != b.unsent ||
301
+ a.unacknowledged != b.unacknowledged) return false;
290
302
  }
291
303
  return true;
292
304
  }
package/dart/pubspec.lock CHANGED
@@ -222,7 +222,7 @@ packages:
222
222
  path: "../dart_types"
223
223
  relative: true
224
224
  source: path
225
- version: "0.11.3"
225
+ version: "0.12.0"
226
226
  package_config:
227
227
  dependency: "direct main"
228
228
  description:
package/dart/pubspec.yaml CHANGED
@@ -7,7 +7,7 @@ repository: https://github.com/Captain-App/nomos2
7
7
  description: >-
8
8
  Nomos 2 Dart client — generated domain values, intent payloads and application
9
9
  lifecycle types over the typed Nomos kernel protocol and USDA custody model.
10
- version: 0.66.14
10
+ version: 0.67.0
11
11
 
12
12
  environment:
13
13
  sdk: ^3.5.0
@@ -18,7 +18,7 @@ dependencies:
18
18
  # The pure-data core (wire types, offer codec, NomosReads, schema validation, error
19
19
  # info). nomos_client depends on and re-exports it, so existing imports are unchanged.
20
20
  # For local monorepo dev, pubspec_overrides.yaml points this at ../dart_types.
21
- nomos_types: ^0.11.3
21
+ nomos_types: ^0.12.0
22
22
  fixnum: ^1.1.1
23
23
  json_schema: ^5.2.2
24
24
  crypto: ^3.0.0
@@ -0,0 +1,40 @@
1
+ import 'package:nomos_client/src/reception/workspace_preparation_report.dart';
2
+ import 'package:nomos_types/nomos_kernel_protocol.dart' as protocol;
3
+ import 'package:test/test.dart';
4
+
5
+ void main() {
6
+ test('packing Git custody after writes is upkeep, not preparation', () {
7
+ final packing = WorkspacePreparationReport.fromMaintenance(
8
+ protocol.ReadMaintenanceProgress(
9
+ workspace: 'estate',
10
+ cause: protocol.ReadMaintenanceCause.READ_MAINTENANCE_CAUSE_ADMITTED_OFFER,
11
+ kernel: protocol.MaintenanceQuantumResponse(
12
+ phase: protocol.MaintenancePhase.MAINTENANCE_PHASE_GIT_CUSTODY,
13
+ maintenancePending: true,
14
+ ),
15
+ ),
16
+ );
17
+ expect(packing.step, WorkspacePreparationStep.preparingCustody);
18
+ expect(packing.active, isFalse);
19
+
20
+ final scheduled = WorkspacePreparationReport.fromMaintenance(
21
+ protocol.ReadMaintenanceProgress(
22
+ workspace: 'estate',
23
+ cause: protocol.ReadMaintenanceCause.READ_MAINTENANCE_CAUSE_ADMITTED_OFFER,
24
+ ),
25
+ );
26
+ expect(scheduled.active, isFalse);
27
+
28
+ final reads = WorkspacePreparationReport.fromMaintenance(
29
+ protocol.ReadMaintenanceProgress(
30
+ workspace: 'estate',
31
+ cause: protocol.ReadMaintenanceCause.READ_MAINTENANCE_CAUSE_OPEN,
32
+ kernel: protocol.MaintenanceQuantumResponse(
33
+ phase: protocol.MaintenancePhase.MAINTENANCE_PHASE_SQLITE_INDEX,
34
+ maintenancePending: true,
35
+ ),
36
+ ),
37
+ );
38
+ expect(reads.active, isTrue, reason: 'a read index still being built is real preparation');
39
+ });
40
+ }
@@ -1,3 +1,7 @@
1
+ ## 0.12.0
2
+
3
+ - Add the `LiveAdmission` live-link frame: the custodian's admission of a live batch, returned over the link (CAP-656).
4
+
1
5
  ## 0.11.3
2
6
 
3
7
  - Add the optional per-call write preparation observation.
@@ -17603,10 +17603,13 @@ class SyncRequest extends $pb.GeneratedMessage {
17603
17603
  class KernelConfigurationRequest extends $pb.GeneratedMessage {
17604
17604
  factory KernelConfigurationRequest({
17605
17605
  $core.List<$core.int>? trustRootPublicKey,
17606
+ $core.bool? trustsCustodianHistory,
17606
17607
  }) {
17607
17608
  final result = create();
17608
17609
  if (trustRootPublicKey != null)
17609
17610
  result.trustRootPublicKey = trustRootPublicKey;
17611
+ if (trustsCustodianHistory != null)
17612
+ result.trustsCustodianHistory = trustsCustodianHistory;
17610
17613
  return result;
17611
17614
  }
17612
17615
 
@@ -17626,6 +17629,7 @@ class KernelConfigurationRequest extends $pb.GeneratedMessage {
17626
17629
  createEmptyInstance: create)
17627
17630
  ..a<$core.List<$core.int>>(
17628
17631
  1, _omitFieldNames ? '' : 'trustRootPublicKey', $pb.PbFieldType.OY)
17632
+ ..aOB(2, _omitFieldNames ? '' : 'trustsCustodianHistory')
17629
17633
  ..hasRequiredFields = false;
17630
17634
 
17631
17635
  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
@@ -17649,6 +17653,7 @@ class KernelConfigurationRequest extends $pb.GeneratedMessage {
17649
17653
  $pb.GeneratedMessage.$_defaultFor<KernelConfigurationRequest>(create);
17650
17654
  static KernelConfigurationRequest? _defaultInstance;
17651
17655
 
17656
+ /// Empty leaves an already configured trust root unchanged.
17652
17657
  @$pb.TagNumber(1)
17653
17658
  $core.List<$core.int> get trustRootPublicKey => $_getN(0);
17654
17659
  @$pb.TagNumber(1)
@@ -17657,6 +17662,20 @@ class KernelConfigurationRequest extends $pb.GeneratedMessage {
17657
17662
  $core.bool hasTrustRootPublicKey() => $_has(0);
17658
17663
  @$pb.TagNumber(1)
17659
17664
  void clearTrustRootPublicKey() => $_clearField(1);
17665
+
17666
+ /// A peer property, not law: this peer adopts the history its authenticated custodian serves
17667
+ /// without re-proving it (no physical closure walk on import, no re-verification of the
17668
+ /// custodian's commits on convergence). Keeping the custodian honest is then the custodian's
17669
+ /// job, which it does by verifying every untrusted offer. Absent or false keeps full
17670
+ /// verification. Immutable once set, like the trust root.
17671
+ @$pb.TagNumber(2)
17672
+ $core.bool get trustsCustodianHistory => $_getBF(1);
17673
+ @$pb.TagNumber(2)
17674
+ set trustsCustodianHistory($core.bool value) => $_setBool(1, value);
17675
+ @$pb.TagNumber(2)
17676
+ $core.bool hasTrustsCustodianHistory() => $_has(1);
17677
+ @$pb.TagNumber(2)
17678
+ void clearTrustsCustodianHistory() => $_clearField(2);
17660
17679
  }
17661
17680
 
17662
17681
  class KernelConfigurationResponse extends $pb.GeneratedMessage {
@@ -7705,6 +7705,7 @@ class CustodyOfferBatchRequest extends $pb.GeneratedMessage {
7705
7705
  $core.List<$core.int>? evidencePack,
7706
7706
  $core.String? observedHead,
7707
7707
  $core.bool? fastForwardOnly,
7708
+ $core.String? continuesAfter,
7708
7709
  }) {
7709
7710
  final result = create();
7710
7711
  if (protocolVersion != null) result.protocolVersion = protocolVersion;
@@ -7715,6 +7716,7 @@ class CustodyOfferBatchRequest extends $pb.GeneratedMessage {
7715
7716
  if (evidencePack != null) result.evidencePack = evidencePack;
7716
7717
  if (observedHead != null) result.observedHead = observedHead;
7717
7718
  if (fastForwardOnly != null) result.fastForwardOnly = fastForwardOnly;
7719
+ if (continuesAfter != null) result.continuesAfter = continuesAfter;
7718
7720
  return result;
7719
7721
  }
7720
7722
 
@@ -7751,6 +7753,7 @@ class CustodyOfferBatchRequest extends $pb.GeneratedMessage {
7751
7753
  6, _omitFieldNames ? '' : 'evidencePack', $pb.PbFieldType.OY)
7752
7754
  ..aOS(7, _omitFieldNames ? '' : 'observedHead')
7753
7755
  ..aOB(8, _omitFieldNames ? '' : 'fastForwardOnly')
7756
+ ..aOS(9, _omitFieldNames ? '' : 'continuesAfter')
7754
7757
  ..hasRequiredFields = false;
7755
7758
 
7756
7759
  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
@@ -7865,19 +7868,37 @@ class CustodyOfferBatchRequest extends $pb.GeneratedMessage {
7865
7868
  $core.bool hasFastForwardOnly() => $_has(7);
7866
7869
  @$pb.TagNumber(8)
7867
7870
  void clearFastForwardOnly() => $_clearField(8);
7871
+
7872
+ /// A streaming sender's batch continues its own previous batch, which ended at this commit and may
7873
+ /// not have been answered yet. The custodian admits it on its current main when the last offer it
7874
+ /// admitted from this session was exactly this commit and nothing else has moved its main since;
7875
+ /// otherwise base_head fences it as above. Offers stream out and admissions stream back, each in
7876
+ /// order, without a round trip per batch.
7877
+ @$pb.TagNumber(9)
7878
+ $core.String get continuesAfter => $_getSZ(8);
7879
+ @$pb.TagNumber(9)
7880
+ set continuesAfter($core.String value) => $_setString(8, value);
7881
+ @$pb.TagNumber(9)
7882
+ $core.bool hasContinuesAfter() => $_has(8);
7883
+ @$pb.TagNumber(9)
7884
+ void clearContinuesAfter() => $_clearField(9);
7868
7885
  }
7869
7886
 
7870
- enum LiveOfferFrame_Message { frontier, offers, notSet }
7887
+ enum LiveOfferFrame_Message { frontier, offers, admission, notSet }
7871
7888
 
7872
- /// A live link carries proposals, never an authority or durability receipt.
7889
+ /// A live link carries proposals and, from the custodian only, the admission it judged for them.
7890
+ /// A peer advances its tracked base from an admission only when the sealed main is already in its
7891
+ /// own verified history; anything else falls back to the ordinary HTTP/Git convergence lane.
7873
7892
  class LiveOfferFrame extends $pb.GeneratedMessage {
7874
7893
  factory LiveOfferFrame({
7875
7894
  LiveFrontier? frontier,
7876
7895
  CustodyOfferBatchRequest? offers,
7896
+ LiveAdmission? admission,
7877
7897
  }) {
7878
7898
  final result = create();
7879
7899
  if (frontier != null) result.frontier = frontier;
7880
7900
  if (offers != null) result.offers = offers;
7901
+ if (admission != null) result.admission = admission;
7881
7902
  return result;
7882
7903
  }
7883
7904
 
@@ -7894,6 +7915,7 @@ class LiveOfferFrame extends $pb.GeneratedMessage {
7894
7915
  _LiveOfferFrame_MessageByTag = {
7895
7916
  1: LiveOfferFrame_Message.frontier,
7896
7917
  2: LiveOfferFrame_Message.offers,
7918
+ 3: LiveOfferFrame_Message.admission,
7897
7919
  0: LiveOfferFrame_Message.notSet
7898
7920
  };
7899
7921
  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
@@ -7901,11 +7923,13 @@ class LiveOfferFrame extends $pb.GeneratedMessage {
7901
7923
  package:
7902
7924
  const $pb.PackageName(_omitMessageNames ? '' : 'nomos.runtime.v2'),
7903
7925
  createEmptyInstance: create)
7904
- ..oo(0, [1, 2])
7926
+ ..oo(0, [1, 2, 3])
7905
7927
  ..aOM<LiveFrontier>(1, _omitFieldNames ? '' : 'frontier',
7906
7928
  subBuilder: LiveFrontier.create)
7907
7929
  ..aOM<CustodyOfferBatchRequest>(2, _omitFieldNames ? '' : 'offers',
7908
7930
  subBuilder: CustodyOfferBatchRequest.create)
7931
+ ..aOM<LiveAdmission>(3, _omitFieldNames ? '' : 'admission',
7932
+ subBuilder: LiveAdmission.create)
7909
7933
  ..hasRequiredFields = false;
7910
7934
 
7911
7935
  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
@@ -7929,10 +7953,12 @@ class LiveOfferFrame extends $pb.GeneratedMessage {
7929
7953
 
7930
7954
  @$pb.TagNumber(1)
7931
7955
  @$pb.TagNumber(2)
7956
+ @$pb.TagNumber(3)
7932
7957
  LiveOfferFrame_Message whichMessage() =>
7933
7958
  _LiveOfferFrame_MessageByTag[$_whichOneof(0)]!;
7934
7959
  @$pb.TagNumber(1)
7935
7960
  @$pb.TagNumber(2)
7961
+ @$pb.TagNumber(3)
7936
7962
  void clearMessage() => $_clearField($_whichOneof(0));
7937
7963
 
7938
7964
  @$pb.TagNumber(1)
@@ -7956,6 +7982,90 @@ class LiveOfferFrame extends $pb.GeneratedMessage {
7956
7982
  void clearOffers() => $_clearField(2);
7957
7983
  @$pb.TagNumber(2)
7958
7984
  CustodyOfferBatchRequest ensureOffers() => $_ensure(1);
7985
+
7986
+ @$pb.TagNumber(3)
7987
+ LiveAdmission get admission => $_getN(2);
7988
+ @$pb.TagNumber(3)
7989
+ set admission(LiveAdmission value) => $_setField(3, value);
7990
+ @$pb.TagNumber(3)
7991
+ $core.bool hasAdmission() => $_has(2);
7992
+ @$pb.TagNumber(3)
7993
+ void clearAdmission() => $_clearField(3);
7994
+ @$pb.TagNumber(3)
7995
+ LiveAdmission ensureAdmission() => $_ensure(2);
7996
+ }
7997
+
7998
+ /// The custodian's admission of one live batch: the same CustodyAdmission the HTTP offer lane
7999
+ /// returns (main, sealed main, per-intent outcomes), keyed by the batch's request id. Sent to every
8000
+ /// live peer of the workspace. A failed or blocked batch sends none; the sender's follow falls back.
8001
+ class LiveAdmission extends $pb.GeneratedMessage {
8002
+ factory LiveAdmission({
8003
+ $core.String? requestId,
8004
+ CustodyAdmission? admission,
8005
+ }) {
8006
+ final result = create();
8007
+ if (requestId != null) result.requestId = requestId;
8008
+ if (admission != null) result.admission = admission;
8009
+ return result;
8010
+ }
8011
+
8012
+ LiveAdmission._();
8013
+
8014
+ factory LiveAdmission.fromBuffer($core.List<$core.int> data,
8015
+ [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
8016
+ create()..mergeFromBuffer(data, registry);
8017
+ factory LiveAdmission.fromJson($core.String json,
8018
+ [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
8019
+ create()..mergeFromJson(json, registry);
8020
+
8021
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(
8022
+ _omitMessageNames ? '' : 'LiveAdmission',
8023
+ package:
8024
+ const $pb.PackageName(_omitMessageNames ? '' : 'nomos.runtime.v2'),
8025
+ createEmptyInstance: create)
8026
+ ..aOS(1, _omitFieldNames ? '' : 'requestId')
8027
+ ..aOM<CustodyAdmission>(2, _omitFieldNames ? '' : 'admission',
8028
+ subBuilder: CustodyAdmission.create)
8029
+ ..hasRequiredFields = false;
8030
+
8031
+ @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
8032
+ LiveAdmission clone() => deepCopy();
8033
+ @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
8034
+ LiveAdmission copyWith(void Function(LiveAdmission) updates) =>
8035
+ super.copyWith((message) => updates(message as LiveAdmission))
8036
+ as LiveAdmission;
8037
+
8038
+ @$core.override
8039
+ $pb.BuilderInfo get info_ => _i;
8040
+
8041
+ @$core.pragma('dart2js:noInline')
8042
+ static LiveAdmission create() => LiveAdmission._();
8043
+ @$core.override
8044
+ LiveAdmission createEmptyInstance() => create();
8045
+ @$core.pragma('dart2js:noInline')
8046
+ static LiveAdmission getDefault() => _defaultInstance ??=
8047
+ $pb.GeneratedMessage.$_defaultFor<LiveAdmission>(create);
8048
+ static LiveAdmission? _defaultInstance;
8049
+
8050
+ @$pb.TagNumber(1)
8051
+ $core.String get requestId => $_getSZ(0);
8052
+ @$pb.TagNumber(1)
8053
+ set requestId($core.String value) => $_setString(0, value);
8054
+ @$pb.TagNumber(1)
8055
+ $core.bool hasRequestId() => $_has(0);
8056
+ @$pb.TagNumber(1)
8057
+ void clearRequestId() => $_clearField(1);
8058
+
8059
+ @$pb.TagNumber(2)
8060
+ CustodyAdmission get admission => $_getN(1);
8061
+ @$pb.TagNumber(2)
8062
+ set admission(CustodyAdmission value) => $_setField(2, value);
8063
+ @$pb.TagNumber(2)
8064
+ $core.bool hasAdmission() => $_has(1);
8065
+ @$pb.TagNumber(2)
8066
+ void clearAdmission() => $_clearField(2);
8067
+ @$pb.TagNumber(2)
8068
+ CustodyAdmission ensureAdmission() => $_ensure(1);
7959
8069
  }
7960
8070
 
7961
8071
  class LiveFrontier extends $pb.GeneratedMessage {
@@ -1239,6 +1239,8 @@ class FollowObservation extends $pb.GeneratedMessage {
1239
1239
  $fixnum.Int64? dueAtUnixMillis,
1240
1240
  $core.int? attempt,
1241
1241
  $core.String? activeEffect,
1242
+ $core.int? unsent,
1243
+ $core.int? unacknowledged,
1242
1244
  }) {
1243
1245
  final result = create();
1244
1246
  if (workspace != null) result.workspace = workspace;
@@ -1249,6 +1251,8 @@ class FollowObservation extends $pb.GeneratedMessage {
1249
1251
  if (dueAtUnixMillis != null) result.dueAtUnixMillis = dueAtUnixMillis;
1250
1252
  if (attempt != null) result.attempt = attempt;
1251
1253
  if (activeEffect != null) result.activeEffect = activeEffect;
1254
+ if (unsent != null) result.unsent = unsent;
1255
+ if (unacknowledged != null) result.unacknowledged = unacknowledged;
1252
1256
  return result;
1253
1257
  }
1254
1258
 
@@ -1279,6 +1283,9 @@ class FollowObservation extends $pb.GeneratedMessage {
1279
1283
  defaultOrMaker: $fixnum.Int64.ZERO)
1280
1284
  ..aI(7, _omitFieldNames ? '' : 'attempt', fieldType: $pb.PbFieldType.OU3)
1281
1285
  ..aOS(8, _omitFieldNames ? '' : 'activeEffect')
1286
+ ..aI(9, _omitFieldNames ? '' : 'unsent', fieldType: $pb.PbFieldType.OU3)
1287
+ ..aI(10, _omitFieldNames ? '' : 'unacknowledged',
1288
+ fieldType: $pb.PbFieldType.OU3)
1282
1289
  ..hasRequiredFields = false;
1283
1290
 
1284
1291
  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
@@ -1375,6 +1382,26 @@ class FollowObservation extends $pb.GeneratedMessage {
1375
1382
  $core.bool hasActiveEffect() => $_has(7);
1376
1383
  @$pb.TagNumber(8)
1377
1384
  void clearActiveEffect() => $_clearField(8);
1385
+
1386
+ /// Live stream progress, while this replica has local commits its custodian has not yet admitted:
1387
+ /// commits authored but not yet offered, and commits offered whose admission has not yet come back.
1388
+ @$pb.TagNumber(9)
1389
+ $core.int get unsent => $_getIZ(8);
1390
+ @$pb.TagNumber(9)
1391
+ set unsent($core.int value) => $_setUnsignedInt32(8, value);
1392
+ @$pb.TagNumber(9)
1393
+ $core.bool hasUnsent() => $_has(8);
1394
+ @$pb.TagNumber(9)
1395
+ void clearUnsent() => $_clearField(9);
1396
+
1397
+ @$pb.TagNumber(10)
1398
+ $core.int get unacknowledged => $_getIZ(9);
1399
+ @$pb.TagNumber(10)
1400
+ set unacknowledged($core.int value) => $_setUnsignedInt32(9, value);
1401
+ @$pb.TagNumber(10)
1402
+ $core.bool hasUnacknowledged() => $_has(9);
1403
+ @$pb.TagNumber(10)
1404
+ void clearUnacknowledged() => $_clearField(10);
1378
1405
  }
1379
1406
 
1380
1407
  /// A background physical effect, equivalent to the foreground pending paper.
@@ -9,7 +9,7 @@ description: >-
9
9
  Pure kernel wire/data types for Nomos Dart frontends — no transport, no bridge,
10
10
  no runtime. Typed protobuf and USDA boundary values plus the offer codec,
11
11
  reactive read engine, schema validation, and data-only error/trace types.
12
- version: 0.11.3
12
+ version: 0.12.0
13
13
 
14
14
  environment:
15
15
  sdk: ^3.5.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@githolon/dsl",
3
- "version": "0.112.12",
3
+ "version": "0.113.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Nomos 2 domain-authoring DSL: aggregates + directives in TS, executed and encoded to the Rust kernel's wire shapes.",
@@ -73,7 +73,7 @@
73
73
  "test": "vitest run"
74
74
  },
75
75
  "dependencies": {
76
- "@githolon/runtime": "^0.112.12",
76
+ "@githolon/runtime": "^0.113.1",
77
77
  "@bufbuild/protobuf": "^2.13.0",
78
78
  "@bufbuild/protoc-gen-es": "^2.13.0",
79
79
  "esbuild": "0.24.2",
@@ -2539,12 +2539,12 @@ const dartTypesImportFor = (generatedSource: string): string => {
2539
2539
  * just the floor generated code needs — a lagging pin forces tenants into dependency_overrides. */
2540
2540
  // 0.3.0: SurfacedValue<T>/SurfacedObservation/PendingConflictRow — generated Surfaced-field typing +
2541
2541
  // the pendingConflicts read rows.
2542
- const NOMOS_TYPES_DEP = "^0.11.3";
2542
+ const NOMOS_TYPES_DEP = "^0.12.0";
2543
2543
  // 0.48.x: session-bound clients (XClient.bind/NomosClientInterface/DomainClientSessionMismatch/
2544
2544
  // DomainNotInstalledForSession, engine.follow, pendingConflicts lanes) — the generated client
2545
2545
  // REQUIRES this surface. 0.48.1 fixes NomosSession.watchPendingConflicts delegation.
2546
- const NOMOS_CLIENT_DEP = "^0.66.14";
2547
- const NOMOS_FLUTTER_DEP = "^0.65.26";
2546
+ const NOMOS_CLIENT_DEP = "^0.67.0";
2547
+ const NOMOS_FLUTTER_DEP = "^0.66.1";
2548
2548
  // DRIFT TRIPWIRE: pubspec_pins.test.ts asserts these equal the CURRENT versions in the Dart and Flutter
2549
2549
  // package pubspecs — a release without this bump fails the suite, so tenants never
2550
2550
  // land back in dependency_overrides (the exact co2 report this closes, third occurrence).