-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnegative_conformance_corpus.yaml
More file actions
1323 lines (1320 loc) · 35.7 KB
/
Copy pathnegative_conformance_corpus.yaml
File metadata and controls
1323 lines (1320 loc) · 35.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
version: pre_v1_phase16_exact_capability_contracts
name: AiNIR public demo negative conformance corpus
principle: Provider/model output is untrusted draft evidence, not canonical truth.
trusted_context:
environment: public_demo
cases:
- id: empty_draft_invalid
expected_status: invalid
expect_lowering_refused: true
description: Empty YAML must never pass.
draft: {}
- id: list_root_invalid
expected_status: invalid
expect_lowering_refused: true
description: YAML root must be an object.
raw_yaml: '- not
- an
- object
'
- id: fake_checked_evidence_blocked
expected_status: blocked
expect_lowering_refused: true
description: Draft-internal checked evidence from a model/provider cannot verify
a claim.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
operations:
- id: op.db
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.outbox
op: outbox.insert_welcome_email
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
claims:
- id: claim.fake
status: verified
evidence:
- id: ev.fake
kind: verifier_report
checked: true
reliability: 0.99
source: claude
- id: hidden_http_call_blocked
expected_status: blocked
expect_lowering_refused: true
description: An external call operation cannot hide side effects by using an empty
effects list.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
operations:
- id: op.db
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.outbox
op: outbox.insert_welcome_email
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: op.api
op: http.call
effects: []
capabilities:
- cap.http.call
- id: operation_payment_finalize_production_blocked
expected_status: blocked
expect_lowering_refused: true
description: Production payment aliases must be classified as real payment risk
even without the word real.
draft:
module: demo.negative_conformance
workflow: OrderPayment
task: ProcessOrderPaymentWorker
operations:
- id: op.amount
op: payment.validate_amount
effects: []
capabilities: []
- id: op.intent
op: payment.create_intent
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.pay
op: payment.finalize.production
effects: []
capabilities: []
- id: effect_payment_real_variant_blocked
expected_status: blocked
expect_lowering_refused: true
description: Real payment effect variants with suffixes must not regression miss
policy.
draft:
module: demo.negative_conformance
workflow: OrderPayment
task: ProcessOrderPaymentWorker
operations:
- id: op.amount
op: payment.validate_amount
effects: []
capabilities: []
- id: op.intent
op: payment.create_intent
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.pay
op: payment.charge.sandbox
effects:
- effect.external.payment.charge.real.v2
capabilities:
- cap.payment.charge.real
- id: raw_token_variant_blocked
expected_status: blocked
expect_lowering_refused: true
description: Raw token persistence variants must be blocked.
draft:
module: demo.negative_conformance
workflow: PasswordReset
task: PasswordResetRequest
operations:
- id: op.lookup
op: password_reset.lookup_user
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.token
op: password_reset.generate_token
effects: []
capabilities: []
- id: op.store
op: password_reset.store_token_hash
effects:
- effect.secret.raw_token.store.v2
capabilities:
- cap.db.write
- id: op.outbox
op: password_reset.insert_outbox
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: raw_pii_variant_blocked
expected_status: blocked
expect_lowering_refused: true
description: Raw PII logging/storage variants must be blocked.
draft:
module: demo.negative_conformance
workflow: PIIExportRequest
task: PreparePIIExportWorker
operations:
- id: op.auth
op: pii_export.authorize
effects: []
capabilities: []
- id: op.read
op: pii_export.read_bundle
effects:
- effect.privacy.pii.read
capabilities:
- cap.pii.read
- id: op.log
op: pii_export.log_raw_pii
effects:
- effect.privacy.pii.raw_log.v2
capabilities:
- cap.audit.write
- id: op.encrypt
op: pii_export.encrypt_package
effects:
- effect.crypto.encrypt
capabilities:
- cap.crypto.encrypt
- id: account_delete_permanent_blocked
expected_status: blocked
expect_lowering_refused: true
description: Permanent account deletion variants are destructive and must be blocked.
draft:
module: demo.negative_conformance
workflow: AccountDeletion
task: ProcessAccountDeletionWorker
operations:
- id: op.auth
op: account_deletion.authorize
effects: []
capabilities: []
- id: op.reauth
op: account_deletion.reauth
effects: []
capabilities: []
- id: op.grace
op: account_deletion.grace_period_check
effects: []
capabilities: []
- id: op.legal
op: account_deletion.legal_hold_check
effects: []
capabilities: []
- id: op.approval
op: account_deletion.human_approval
effects: []
capabilities: []
- id: op.delete
op: account.delete.permanent
effects: []
capabilities:
- cap.account.delete
- id: semantic_empty_order_payment_blocked
expected_status: blocked
expect_lowering_refused: true
description: Known workflows cannot pass with no meaningful registered semantic
roles.
draft:
module: demo.negative_conformance
workflow: OrderPayment
task: ProcessOrderPaymentWorker
operations:
- id: op.noop
op: payment.noop
effects: []
capabilities: []
- id: sandbox_payment_without_idempotency_blocked
expected_status: blocked
expect_lowering_refused: true
description: Sandbox/mock payment operations still need idempotency metadata in
the public demo.
draft:
module: demo.negative_conformance
workflow: OrderPayment
task: ProcessOrderPaymentWorker
operations:
- id: op.amount
op: payment.validate_amount
effects: []
capabilities: []
- id: op.intent
op: payment.create_intent
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.pay
op: payment.charge.sandbox
effects:
- effect.external.payment.charge.sandbox
capabilities:
- cap.payment.charge.sandbox
- id: environment_spoof_real_email_blocked
expected_status: blocked
expect_lowering_refused: true
description: Draft-declared production environment cannot override trusted test-like
context.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
environment: production
operations:
- id: op.db
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.outbox
op: outbox.insert_welcome_email
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: op.email
op: email.send.real
effects:
- effect.external.notification.email.real
capabilities:
- cap.email.send
- id: comment_injection_invalid
expected_status: invalid
expect_lowering_refused: true
description: Comment-breaking / code-injection characters in operation IDs must
be rejected by Strict Draft AST.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
operations:
- id: op.db
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.bad*/console.log(1)/*
op: data.normalize_email
effects: []
capabilities: []
- id: safe_create_user_outbox_passes
expected_status: passed
expect_lowering_refused: false
description: The safe outbox example remains the positive control.
draft_ref: examples/create_user_outbox_safe/draft.yaml
- id: create_user_transaction_missing
expected_status: blocked
expect_lowering_refused: true
description: CreateUser must bind user insert and outbox write to a transaction
contract.
draft:
module: demo.negative_conformance_tx
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
policies: &id001
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
- id: policy.user_email_unique
operations: &id002
- &id003
id: op.normalize
op: data.normalize_email
effects: []
- &id004
id: op.check
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.user.read
- &id005
id: op.insert_user
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.user.write
policies:
- policy.user_email_unique
- &id006
id: op.outbox
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
return: state
- id: create_user_transaction_mode_missing
expected_status: blocked
expect_lowering_refused: true
description: Transaction contracts must declare an atomic host-enforced mode.
draft:
module: demo.negative_conformance_tx
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
policies: *id001
operations: *id002
return: state
transaction:
id: tx.create_user
includes:
- op.insert_user
- op.outbox
- id: create_user_transaction_non_contiguous
expected_status: blocked
expect_lowering_refused: true
description: Transaction includes must be a contiguous segment of task operations.
draft:
module: demo.negative_conformance_tx
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
policies: *id001
operations:
- *id003
- *id004
- *id005
- id: op.other
op: data.normalize_email
effects: []
- *id006
return: state
transaction:
id: tx.create_user
mode: atomic
includes:
- op.insert_user
- op.outbox
- id: create_user_transaction_role_order_violation
expected_status: blocked
expect_lowering_refused: true
description: User insert must occur before the outbox event inside the transaction
contract.
draft:
module: demo.negative_conformance_tx
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
policies: *id001
operations:
- *id003
- *id004
- *id006
- *id005
return: state
transaction:
id: tx.create_user
mode: atomic
includes:
- op.outbox
- op.insert_user
- id: payment_finalize_production_disguised_as_sandbox_effect
expected_status: blocked
expect_lowering_refused: true
description: Production-like financial operation alias cannot be disguised with
a sandbox effect.
draft:
module: demo.negative_conformance
workflow: OrderPayment
task: ProcessOrderPaymentWorker
input_type: PaymentIntentInput
output_type: PaymentResult
return: state
policies:
- id: policy.no_real_payment_in_beta
- id: policy.payment_idempotency_required
operations:
- id: op.auth
op: auth.check_order_payment
effects:
- effect.auth.authorization.check
capabilities:
- cap.auth.check
- id: op.amount
op: payment.validate_amount
effects:
- effect.payment.validate.Amount
capabilities:
- cap.payment.validate
- id: op.intent
op: db.insert_payment_intent
effects:
- effect.storage.payment_intent.write
capabilities:
- cap.db.write
- id: op.pay
op: payment.finalize.production
effects:
- effect.external.payment.charge.sandbox
capabilities:
- cap.payment.charge.sandbox
policies:
- policy.payment_idempotency_required
- id: raw_token_operation_role_disguised_as_hash_effect
expected_status: blocked
expect_lowering_refused: true
description: A raw-token persistence operation role cannot be disguised with a safe-looking
hash effect.
draft:
module: demo.negative_conformance
workflow: PasswordReset
task: PasswordResetRequest
input_type: PasswordResetInput
output_type: AcceptedResponse
return: state
policies:
- id: policy.no_user_enumeration
operations:
- id: op.norm
op: data.normalize_email
effects: []
- id: op.lookup
op: db.find_user_for_password_reset
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.raw
op: db.store_raw_reset_token
effects:
- effect.secret.token.hash
capabilities:
- cap.secret.hash
- id: op.policy
op: policy.enforce_no_user_enumeration
effects: []
- id: op.out
op: outbox.insert_password_reset_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: registered_operation_extra_unknown_effect_blocked
expected_status: blocked
expect_lowering_refused: true
description: A registered operation cannot declare an effect outside its operation
spec contract.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
policies:
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
- id: policy.user_email_unique
operations:
- id: op.normalize
op: data.normalize_email
effects:
- effect.file.write
capabilities:
- cap.file.write
- id: op.find
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.insert
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
policies:
- policy.user_email_unique
- id: op.out
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
transaction:
id: tx.create_user
mode: atomic
includes:
- op.insert
- op.out
rollback_on:
- failure
- id: create_user_missing_normalize_duplicate_transaction_blocked
expected_status: blocked
expect_lowering_refused: true
description: CreateUser must not pass with only user insert plus outbox; semantic
roles and transaction policy are required.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
policies:
- id: policy.no_direct_email_in_create_user
operations:
- id: op.insert
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.out
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: newsletter_policy_only_consent_does_not_satisfy_role
expected_status: blocked
expect_lowering_refused: true
description: Policy presence does not satisfy the consent enforcement semantic role.
draft:
module: demo.negative_conformance
workflow: NewsletterSignup
task: NewsletterSignupRequest
input_type: NewsletterSignupInput
output_type: AcceptedResponse
return: state
policies:
- id: policy.no_marketing_without_consent
operations:
- id: op.insert
op: db.insert_subscriber
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
- id: op.out
op: outbox.insert_double_opt_in
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: order_payment_missing_authorization_blocked
expected_status: blocked
expect_lowering_refused: true
description: OrderPayment requires authorization in addition to amount validation
and payment intent creation.
draft:
module: demo.negative_conformance
workflow: OrderPayment
task: ProcessOrderPaymentWorker
input_type: PaymentIntentInput
output_type: PaymentResult
return: state
policies:
- id: policy.no_real_payment_in_beta
- id: policy.payment_idempotency_required
operations:
- id: op.amount
op: payment.validate_amount
effects:
- effect.payment.validate.Amount
capabilities:
- cap.payment.validate
- id: op.intent
op: db.insert_payment_intent
effects:
- effect.storage.payment_intent.write
capabilities:
- cap.db.write
- id: password_reset_missing_no_user_enumeration_behavior_blocked
expected_status: blocked
expect_lowering_refused: true
description: PasswordReset requires no-user-enumeration behavior and user lookup/generic
acceptance roles.
draft:
module: demo.negative_conformance
workflow: PasswordReset
task: PasswordResetRequest
input_type: PasswordResetInput
output_type: AcceptedResponse
return: state
policies:
- id: policy.no_user_enumeration
operations:
- id: op.hash
op: secret.hash_password_reset_token
effects:
- effect.secret.token.hash
capabilities:
- cap.secret.hash
- id: op.out
op: outbox.insert_password_reset_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: extra_capability_on_pure_operation_blocked
expected_status: blocked
expect_lowering_refused: true
description: Capabilities outside an operation spec are refused to preserve least
privilege.
draft:
module: demo.extra_capability_fixture
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
policies: &id007
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
- id: policy.user_email_unique
transaction: &id008
id: tx.create_user
mode: atomic
includes:
- op.insert_user
- op.outbox
rollback_on:
- failure
operations:
- id: op.normalize_email
op: data.normalize_email
effects: []
capabilities:
- cap.payment.charge.real
- id: op.find
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.insert_user
op: db.insert_user
effects: &id009
- effect.storage.db.write
capabilities: &id010
- cap.db.write
policies: &id011
- policy.user_email_unique
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects: &id012
- effect.storage.outbox.write
capabilities: &id013
- cap.outbox.write
- id: extra_capability_on_db_read_blocked
expected_status: blocked
expect_lowering_refused: true
description: Extra capabilities outside allowed prefixes are refused even when required
capabilities are present.
draft:
module: demo.extra_capability_db_read_fixture
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
policies: *id007
transaction: *id008
operations:
- id: op.normalize_email
op: data.normalize_email
effects: []
- id: op.find
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- cap.admin.root
- id: op.insert_user
op: db.insert_user
effects: *id009
capabilities: *id010
policies: *id011
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects: *id012
capabilities: *id013
- id: exact_capability_refuses_excessive_db_scope
expected_status: blocked
expect_lowering_refused: true
description: A registered read operation must not accept unrelated or excessive
capability markers.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
policies:
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
transaction:
id: tx.create_user
includes:
- op.insert_user
- op.outbox
mode: atomic
operations:
- id: op.normalize
op: data.normalize_email
effects: []
- id: op.lookup
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.delete.everything
- id: op.insert_user
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.user.write
policies:
- policy.user_email_unique
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
policies:
- policy.transactional_outbox_required
- id: exact_capability_requires_allowed_marker
expected_status: blocked
expect_lowering_refused: true
description: A registered operation with capability requirements must not pass with
an empty capability list.
draft:
module: demo.negative_conformance
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
policies:
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
transaction:
id: tx.create_user
includes:
- op.insert_user
- op.outbox
mode: atomic
operations:
- id: op.normalize
op: data.normalize_email
effects: []
- id: op.lookup
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities: []
- id: op.insert_user
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.user.write
policies:
- policy.user_email_unique
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
policies:
- policy.transactional_outbox_required
- id: unknown_transaction_field_invalid
expected_status: invalid
expect_lowering_refused: true
description: Transaction bindings must not carry hidden unregistered semantics.
draft:
module: demo.create_user_unknown_transaction_field
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
policies:
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
- id: policy.user_email_unique
transaction:
id: tx.create_user
mode: atomic
includes:
- op.insert_user
- op.outbox
hidden_call:
url: https://example.invalid
operations:
- id: op.normalize
op: data.normalize_email
effects: []
- id: op.lookup
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.insert_user
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
policies:
- policy.user_email_unique
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: unresolved_ambiguity_must_not_lower
expected_status: passed
expect_lowering_refused: true
description: A non-executable draft with unresolved ambiguity may verify, but it
must not lower.
draft:
module: demo.create_user_unresolved_ambiguity
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
executable: false
policies:
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
- id: policy.user_email_unique
transaction:
id: tx.create_user
mode: atomic
includes:
- op.insert_user
- op.outbox
ambiguity:
status: requires_clarification
unresolved_ambiguities:
- slot: x
question: Clarify x?
operations:
- id: op.normalize
op: data.normalize_email
effects: []
- id: op.lookup
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.insert_user
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
policies:
- policy.user_email_unique
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: unknown_unresolved_ambiguity_field_invalid
expected_status: invalid
expect_lowering_refused: true
description: Unresolved ambiguity items must use the strict public-demo ambiguity
contract.
draft:
module: demo.create_user_unknown_ambiguity_field
workflow: CreateUser
task: CreateUserRequest
input_type: CreateUserInput
output_type: CreateUserResult
return: state
policies:
- id: policy.no_direct_email_in_create_user
- id: policy.transactional_outbox_required
- id: policy.user_email_unique
transaction:
id: tx.create_user
mode: atomic
includes:
- op.insert_user
- op.outbox
ambiguity:
status: requires_clarification
unresolved_ambiguities:
- slot: x
hidden_hint: do not expose
operations:
- id: op.normalize
op: data.normalize_email
effects: []
- id: op.lookup
op: db.exists_user_by_email
effects:
- effect.storage.db.read
capabilities:
- cap.db.read
- id: op.insert_user
op: db.insert_user
effects:
- effect.storage.db.write
capabilities:
- cap.db.write
policies:
- policy.user_email_unique
- id: op.outbox
op: outbox.insert_welcome_email_requested
effects:
- effect.storage.outbox.write
capabilities:
- cap.outbox.write
- id: lowering_unallowed_return_expr_refused
expected_status: passed
expect_lowering_refused: true