clm-kernel 0.0.0__py3-none-any.whl
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.
- clm/__init__.py +230 -0
- clm/__main__.py +25 -0
- clm/cross_cutting/__init__.py +50 -0
- clm/cross_cutting/_test_runner.py +36 -0
- clm/cross_cutting/async_utils.py +25 -0
- clm/cross_cutting/cel_builder.py +123 -0
- clm/cross_cutting/cel_converter.py +697 -0
- clm/cross_cutting/cel_engine.py +252 -0
- clm/cross_cutting/cel_ops.py +72 -0
- clm/cross_cutting/cel_ops_db.py +157 -0
- clm/cross_cutting/cel_ops_files.py +99 -0
- clm/cross_cutting/cel_ops_state.py +71 -0
- clm/cross_cutting/cel_ops_strings.py +64 -0
- clm/cross_cutting/cel_resolver.py +63 -0
- clm/cross_cutting/cel_slices.py +56 -0
- clm/cross_cutting/cel_store.py +330 -0
- clm/cross_cutting/clm_logger.py +140 -0
- clm/cross_cutting/config/__init__.py +155 -0
- clm/cross_cutting/config/config_constants.py +392 -0
- clm/cross_cutting/config/env_parameters.py +90 -0
- clm/cross_cutting/config/logging.py +378 -0
- clm/cross_cutting/config/settings.py +504 -0
- clm/cross_cutting/context.py +5 -0
- clm/cross_cutting/domain_models.py +55 -0
- clm/cross_cutting/domain_types.py +61 -0
- clm/cross_cutting/effects.py +67 -0
- clm/cross_cutting/errors.py +153 -0
- clm/cross_cutting/governance.py +331 -0
- clm/cross_cutting/guards.py +41 -0
- clm/cross_cutting/mcard.py +321 -0
- clm/cross_cutting/native.py +185 -0
- clm/cross_cutting/observability.py +289 -0
- clm/cross_cutting/pcard.py +434 -0
- clm/cross_cutting/registry.py +71 -0
- clm/cross_cutting/resources.py +84 -0
- clm/cross_cutting/secrets.py +44 -0
- clm/cross_cutting/subprocess_utils.py +118 -0
- clm/cross_cutting/telemetry.py +164 -0
- clm/cross_cutting/testing/__init__.py +8 -0
- clm/cross_cutting/testing/comparator.py +187 -0
- clm/cross_cutting/testing/datasets.py +87 -0
- clm/cross_cutting/timeutil.py +20 -0
- clm/cross_cutting/types/new_type_check.py +0 -0
- clm/cross_cutting/utils/__init__.py +1 -0
- clm/cross_cutting/utils/url_safety.py +50 -0
- clm/cross_cutting/vcard.py +560 -0
- clm/cross_cutting/writer.py +118 -0
- clm/layer0/README.md +50 -0
- clm/layer0/__init__.py +223 -0
- clm/layer0/algebra.py +60 -0
- clm/layer0/algebra_baldwin.py +133 -0
- clm/layer0/algebra_baldwin_generators.py +36 -0
- clm/layer0/algebra_equivalence.py +262 -0
- clm/layer0/algebra_ingest.py +306 -0
- clm/layer0/algebra_manifest_io.py +156 -0
- clm/layer0/assembler.py +481 -0
- clm/layer0/cel/__init__.py +23 -0
- clm/layer0/cel_eval.py +491 -0
- clm/layer0/codec.py +106 -0
- clm/layer0/context.py +122 -0
- clm/layer0/db.py +160 -0
- clm/layer0/exceptions.py +73 -0
- clm/layer0/fibration.py +106 -0
- clm/layer0/gates.py +50 -0
- clm/layer0/hash.py +80 -0
- clm/layer0/loader.py +826 -0
- clm/layer0/math_utils.py +163 -0
- clm/layer0/mcard.py +96 -0
- clm/layer0/model/__init__.py +0 -0
- clm/layer0/model/action.py +223 -0
- clm/layer0/model/card.py +280 -0
- clm/layer0/model/card_triad.py +427 -0
- clm/layer0/model/compatibility.py +60 -0
- clm/layer0/model/dictionary.py +46 -0
- clm/layer0/model/dots.py +331 -0
- clm/layer0/model/event_producer.py +88 -0
- clm/layer0/model/g_time.py +89 -0
- clm/layer0/model/handle.py +163 -0
- clm/layer0/model/hash/__init__.py +6 -0
- clm/layer0/model/hash/algorithms/__init__.py +3 -0
- clm/layer0/model/hash/algorithms/custom_hash.py +7 -0
- clm/layer0/model/hash/algorithms/local_sha256.py +178 -0
- clm/layer0/model/hash/constants.py +53 -0
- clm/layer0/model/hash/enums.py +60 -0
- clm/layer0/model/hash/validator.py +307 -0
- clm/layer0/model/interpreter.py +275 -0
- clm/layer0/model/pagination.py +45 -0
- clm/layer0/model/pcard.py +716 -0
- clm/layer0/model/schema.py +44 -0
- clm/layer0/model/utils/__init__.py +1 -0
- clm/layer0/model/utils/content_analyzer.py +152 -0
- clm/layer0/model/validators/__init__.py +1 -0
- clm/layer0/model/validators/base_validator.py +44 -0
- clm/layer0/model/validators/binary_validator.py +66 -0
- clm/layer0/model/validators/text_validator.py +82 -0
- clm/layer0/model/validators/validation_registry.py +49 -0
- clm/layer0/model/vcard.py +823 -0
- clm/layer0/model/vcard_ext/__init__.py +39 -0
- clm/layer0/model/vcard_ext/core.py +60 -0
- clm/layer0/model/vcard_ext/network.py +23 -0
- clm/layer0/model/vcard_ext/observability.py +63 -0
- clm/layer0/model/vcard_ext/storage.py +60 -0
- clm/layer0/model/vcard_ext/vendors.py +211 -0
- clm/layer0/model/vcard_sandwich.py +119 -0
- clm/layer0/model/vcard_vocabulary.py +463 -0
- clm/layer0/model/workflow.py +274 -0
- clm/layer0/narrative.py +431 -0
- clm/layer0/ontology/collection.py +125 -0
- clm/layer0/parser.py +429 -0
- clm/layer0/relations.py +73 -0
- clm/layer0/rule_evaluator.py +251 -0
- clm/layer0/schema/__init__.py +38 -0
- clm/layer0/schema/ddl.py +97 -0
- clm/layer0/templates/abstract.yaml +99 -0
- clm/layer0/templates/balanced.yaml +253 -0
- clm/layer0/templates/concrete.yaml +172 -0
- clm/layer0/type_registry.py +223 -0
- clm/layer0/types.py +204 -0
- clm/layer0/utils.py +886 -0
- clm/layer0/verifier_core.py +262 -0
- clm/layer1/__init__.py +31 -0
- clm/layer1/action_dispatcher.py +275 -0
- clm/layer1/adapter_registry.py +233 -0
- clm/layer1/algebra_baldwin_generators.py +192 -0
- clm/layer1/arrow_compiler.py +525 -0
- clm/layer1/batch_processor.py +152 -0
- clm/layer1/cel/__init__.py +27 -0
- clm/layer1/cel/builder.py +173 -0
- clm/layer1/engine.py +759 -0
- clm/layer1/engine_async.py +89 -0
- clm/layer1/eval_callback.py +49 -0
- clm/layer1/gate_composer.py +229 -0
- clm/layer1/hoare_sandwich.py +298 -0
- clm/layer1/identity_guard.py +348 -0
- clm/layer1/matrix.py +138 -0
- clm/layer1/neural_runtime.py +221 -0
- clm/layer1/operations/__init__.py +123 -0
- clm/layer1/operations/augment.py +156 -0
- clm/layer1/operations/base.py +109 -0
- clm/layer1/operations/builtins.py +338 -0
- clm/layer1/operations/dispatch.py +144 -0
- clm/layer1/operations/exclude.py +107 -0
- clm/layer1/operations/handle.py +197 -0
- clm/layer1/operations/identity.py +139 -0
- clm/layer1/operations/invert.py +66 -0
- clm/layer1/operations/loader.py +116 -0
- clm/layer1/operations/manipulators/__init__.py +23 -0
- clm/layer1/operations/manipulators/document.py +211 -0
- clm/layer1/operations/manipulators/media.py +134 -0
- clm/layer1/operations/manipulators/structured.py +159 -0
- clm/layer1/operations/manipulators/tabular.py +334 -0
- clm/layer1/operations/port.py +65 -0
- clm/layer1/operations/services.py +529 -0
- clm/layer1/operations/split.py +117 -0
- clm/layer1/operations/substitute.py +75 -0
- clm/layer1/petri.py +1052 -0
- clm/layer1/pocketflow_orchestrator.py +408 -0
- clm/layer1/pocketflow_scheduler.py +519 -0
- clm/layer1/protocols.py +197 -0
- clm/layer1/runtime_adapter.py +718 -0
- clm/layer1/runtimes/__init__.py +71 -0
- clm/layer1/runtimes/_generated_assertions.py +125 -0
- clm/layer1/runtimes/_generated_types.py +42 -0
- clm/layer1/runtimes/base.py +265 -0
- clm/layer1/runtimes/binary.py +101 -0
- clm/layer1/runtimes/factory.py +203 -0
- clm/layer1/runtimes/javascript.py +321 -0
- clm/layer1/runtimes/javascript_runtime.js +33 -0
- clm/layer1/runtimes/js_scripts/isomorphism.mjs +22 -0
- clm/layer1/runtimes/js_scripts/loader.mjs +52 -0
- clm/layer1/runtimes/lambda_calc.py +126 -0
- clm/layer1/runtimes/python.py +288 -0
- clm/layer1/runtimes/python_runtime.py +41 -0
- clm/layer1/runtimes/script.py +114 -0
- clm/layer1/sandbox.py +334 -0
- clm/layer1/savepoint_guard.py +136 -0
- clm/layer1/sparse_net.py +122 -0
- clm/layer1/spec_tester.py +165 -0
- clm/layer1/store.py +295 -0
- clm/layer1/test_runner.py +498 -0
- clm/layer1/type_inspector.py +166 -0
- clm/layer1/verifier.py +772 -0
- clm/layer1/vm.py +91 -0
- clm/layer2/__init__.py +78 -0
- clm/layer2/card_collection.py +678 -0
- clm/layer2/classifier.py +479 -0
- clm/layer2/engine/__init__.py +1 -0
- clm/layer2/engine/abstract_sql_engine.py +320 -0
- clm/layer2/engine/base.py +193 -0
- clm/layer2/engine/duckdb_engine.py +576 -0
- clm/layer2/engine/sqlite_engine.py +518 -0
- clm/layer2/fiber/__init__.py +31 -0
- clm/layer2/fiber/context.py +89 -0
- clm/layer2/fiber/disposable.py +163 -0
- clm/layer2/fiber/fiber.py +125 -0
- clm/layer2/fiber/hoare.py +191 -0
- clm/layer2/file_io.py +376 -0
- clm/layer2/file_registrar.py +77 -0
- clm/layer2/ingest.py +202 -0
- clm/layer2/lineage.py +322 -0
- clm/layer2/mcard_fs.py +262 -0
- clm/layer2/merkle.py +11 -0
- clm/layer2/mime.py +244 -0
- clm/layer2/mime_detector.py +245 -0
- clm/layer2/private_collection.py +118 -0
- clm/layer2/shared_store.py +11 -0
- clm/layer2/storage/__init__.py +190 -0
- clm/layer2/storage/db_bitemporal.py +141 -0
- clm/layer2/storage/db_driver.py +331 -0
- clm/layer2/storage/db_hyperlinks.py +214 -0
- clm/layer2/storage/db_pool.py +139 -0
- clm/layer2/storage/db_repository.py +229 -0
- clm/layer2/storage/savepoint.py +78 -0
- clm/layer2/storage/sqlite_wal.py +74 -0
- clm/layer2/tridb.py +245 -0
- clm/layer2/vcard_receipt.py +71 -0
- clm/layer2/vfs.py +17 -0
- clm/layer3/__init__.py +141 -0
- clm/layer3/agency/__init__.py +19 -0
- clm/layer3/agency/config.py +220 -0
- clm/layer3/agency/providers/__init__.py +15 -0
- clm/layer3/agency/providers/base.py +91 -0
- clm/layer3/agency/providers/mlc_llm.py +169 -0
- clm/layer3/agency/providers/ollama.py +203 -0
- clm/layer3/agency/router.py +71 -0
- clm/layer3/agency/runtime.py +524 -0
- clm/layer3/gateway.py +353 -0
- clm/layer3/open_interpreter_adapter.py +159 -0
- clm/layer3/rag/__init__.py +70 -0
- clm/layer3/rag/cli.py +228 -0
- clm/layer3/rag/config.py +153 -0
- clm/layer3/rag/embeddings/__init__.py +16 -0
- clm/layer3/rag/embeddings/base.py +79 -0
- clm/layer3/rag/embeddings/ollama.py +211 -0
- clm/layer3/rag/embeddings/vision.py +290 -0
- clm/layer3/rag/engine.py +276 -0
- clm/layer3/rag/graph/__init__.py +22 -0
- clm/layer3/rag/graph/community.py +198 -0
- clm/layer3/rag/graph/engine.py +433 -0
- clm/layer3/rag/graph/extractor.py +255 -0
- clm/layer3/rag/graph/schema.py +115 -0
- clm/layer3/rag/graph/store.py +641 -0
- clm/layer3/rag/indexer.py +333 -0
- clm/layer3/rag/llm_providers.json +52 -0
- clm/layer3/rag/semantic_versioning.py +313 -0
- clm/layer3/rag/vector/__init__.py +28 -0
- clm/layer3/rag/vector/handle_vector_store.py +749 -0
- clm/layer3/rag/vector/schema.py +151 -0
- clm/layer3/rag/vector/store.py +632 -0
- clm/layer3/reticulum/__init__.py +55 -0
- clm/layer3/reticulum/bridge.py +74 -0
- clm/layer3/reticulum/daemon.py +88 -0
- clm/layer3/reticulum/discovery.py +164 -0
- clm/layer3/reticulum/identity.py +107 -0
- clm/layer3/reticulum/media.py +148 -0
- clm/layer3/reticulum/transport.py +133 -0
- clm/layer3/satori/__init__.py +209 -0
- clm/layer3/satori/alpha_conversion.py +168 -0
- clm/layer3/satori/beta_reduction.py +359 -0
- clm/layer3/satori/continuation.py +38 -0
- clm/layer3/satori/eta_conversion.py +205 -0
- clm/layer3/satori/free_variables.py +163 -0
- clm/layer3/satori/io_effects.py +370 -0
- clm/layer3/satori/lambda_runtime.py +726 -0
- clm/layer3/satori/lambda_term.py +230 -0
- clm/layer3/satori/sheaf_audit.py +261 -0
- clm/layer3/satori/speech_act.py +279 -0
- clm/layer4/README.md +9 -0
- clm/layer4/__init__.py +67 -0
- clm/layer4/_sovereign_executor.py +580 -0
- clm/layer4/action_commands.py +719 -0
- clm/layer4/api.py +236 -0
- clm/layer4/bootstrap/__init__.py +13 -0
- clm/layer4/bootstrap/bootstrapper.py +118 -0
- clm/layer4/bootstrap/cleanup.py +44 -0
- clm/layer4/bootstrap/clm_hooks.py +49 -0
- clm/layer4/bootstrap/genesis.py +77 -0
- clm/layer4/bootstrap/injection.py +125 -0
- clm/layer4/cli.py +549 -0
- clm/layer4/collection_manager.py +553 -0
- clm/layer4/commands/__init__.py +81 -0
- clm/layer4/commands/action_cmd.py +42 -0
- clm/layer4/commands/check_cmd.py +82 -0
- clm/layer4/commands/envelope.py +73 -0
- clm/layer4/commands/evaluate_cmd.py +224 -0
- clm/layer4/commands/mcard_cmd.py +24 -0
- clm/layer4/commands/petri_cmd.py +92 -0
- clm/layer4/commands/tridb_cmd.py +319 -0
- clm/layer4/commands/version_cmd.py +27 -0
- clm/layer4/diff_commands.py +167 -0
- clm/layer4/eoa_sponsor.py +232 -0
- clm/layer4/events.py +69 -0
- clm/layer4/flux_gateway.py +133 -0
- clm/layer4/gateway.py +91 -0
- clm/layer4/loader.py +307 -0
- clm/layer4/mcard_commands.py +166 -0
- clm/layer4/membrane.py +273 -0
- clm/layer4/navigation.py +50 -0
- clm/layer4/protocol/protocol_entry_python.py +108 -0
- clm/layer4/protocol/python_sync.py +126 -0
- clm/layer4/runner.py +150 -0
- clm/layer4/satori.py +262 -0
- clm/layer4/server/python_sync_client.py +150 -0
- clm/layer4/server/python_sync_server.py +139 -0
- clm/layer4/server/service_api.py +315 -0
- clm/layer4/server/start_servers.py +107 -0
- clm/layer4/server/stop_servers.py +24 -0
- clm/layer4/simulated_optimization_fix.py +0 -0
- clm/layer4/storage.py +463 -0
- clm/layer4/tridb_admin.py +268 -0
- clm/layer4/websocket/test_ws_client.py +104 -0
- clm/layer4/websocket/test_ws_server.py +138 -0
- clm/layer4/websocket/ws_server_local.py +160 -0
- clm/layer5/__init__.py +51 -0
- clm/layer5/async_batch_writer.py +133 -0
- clm/layer5/learning.py +276 -0
- clm/layer5/telemetry_hook.py +107 -0
- clm/layer5/type_lattice.py +238 -0
- clm/py.typed +0 -0
- clm/schemas/__init__.py +652 -0
- clm/schemas/abstract_face_schema.yaml +77 -0
- clm/schemas/cel_schema.yaml +416 -0
- clm/schemas/lifecycle/__init__.py +45 -0
- clm/schemas/lifecycle/models.py +123 -0
- clm/schemas/lifecycle/service.py +364 -0
- clm/schemas/mcard_schema.sql +192 -0
- clm/schemas/mcard_vector_schema.sql +283 -0
- clm/schemas/mlp-context-v1.json +91 -0
- clm_kernel-0.0.0.dist-info/METADATA +121 -0
- clm_kernel-0.0.0.dist-info/RECORD +333 -0
- clm_kernel-0.0.0.dist-info/WHEEL +4 -0
- clm_kernel-0.0.0.dist-info/entry_points.txt +3 -0
- clm_kernel-0.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Abstract Face Schema (Face A)
|
|
2
|
+
# ==============================
|
|
3
|
+
# Validates the structure of computable_knowledge/Abstract/layer0/stageN_*.yaml.
|
|
4
|
+
#
|
|
5
|
+
# Sprint 134 — formalizes the `context.external_references` block that was
|
|
6
|
+
# already deployed across all 6 Abstract face YAMLs but lived outside any
|
|
7
|
+
# schema. Reuses the existing CEL `ref:` reserved word (replacing `path:`)
|
|
8
|
+
# and adds two optional fields (`kind`, `content_hash`) drawn from existing
|
|
9
|
+
# vocabulary. See docs/spec/external_references_grammar.md for the
|
|
10
|
+
# keyword inventory and worked examples.
|
|
11
|
+
#
|
|
12
|
+
# Version: 1.0
|
|
13
|
+
# Sprint: 134
|
|
14
|
+
|
|
15
|
+
universe_level: 0
|
|
16
|
+
version: "1.0"
|
|
17
|
+
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
# Top-level shape of an Abstract face YAML
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
abstract_face:
|
|
22
|
+
required: [version, clm]
|
|
23
|
+
clm:
|
|
24
|
+
required: [layer, stage, name, face, type, context, goal, success_criteria]
|
|
25
|
+
layer:
|
|
26
|
+
enum: ["0", "1", "2", "3"]
|
|
27
|
+
face:
|
|
28
|
+
enum: ["A"]
|
|
29
|
+
type:
|
|
30
|
+
enum: ["mcard"]
|
|
31
|
+
context:
|
|
32
|
+
required: [description]
|
|
33
|
+
optional: [dependencies, external_references]
|
|
34
|
+
dependencies:
|
|
35
|
+
type: list
|
|
36
|
+
items: { type: string }
|
|
37
|
+
description: "Inter-stage handle names (e.g. layer0_stage1_abstract)."
|
|
38
|
+
external_references:
|
|
39
|
+
type: list
|
|
40
|
+
description: >
|
|
41
|
+
External architecture / spec / standard docs that ground this
|
|
42
|
+
stage. Each entry is a pointer, not inlined content. Reuses the
|
|
43
|
+
CEL `ref:` reserved word (single source of truth for 'reference'
|
|
44
|
+
across the CLM grammar).
|
|
45
|
+
items:
|
|
46
|
+
required: [ref, relevance]
|
|
47
|
+
optional: [kind, content_hash]
|
|
48
|
+
ref:
|
|
49
|
+
type: string
|
|
50
|
+
description: >
|
|
51
|
+
Repo-relative filesystem path (e.g.
|
|
52
|
+
docs/architecture/directive_4_*.md), an mcard:// URI
|
|
53
|
+
(mcard://handle/<handle> or mcard://hash/<64hex>), or a
|
|
54
|
+
[[wikilink]] name. Reuses the CEL `ref:` reserved word.
|
|
55
|
+
kind:
|
|
56
|
+
enum: [directive, specification, architecture, comparison, standard, rationale]
|
|
57
|
+
description: >
|
|
58
|
+
Discriminator reusing existing docs/architecture/ naming
|
|
59
|
+
vocabulary. No new concepts introduced.
|
|
60
|
+
content_hash:
|
|
61
|
+
type: string
|
|
62
|
+
pattern: "^[a-fA-F0-9]{64}$"
|
|
63
|
+
description: >
|
|
64
|
+
Optional SHA-256 pin of the referenced content. If absent,
|
|
65
|
+
the reference floats (drift undetected). If present, the lint
|
|
66
|
+
gate recomputes the file hash and fails on drift. Reuses the
|
|
67
|
+
`content_hash` field name already on the Card model.
|
|
68
|
+
relevance:
|
|
69
|
+
type: string
|
|
70
|
+
min_length: 1
|
|
71
|
+
description: "Free-form prose explaining why this reference grounds this stage."
|
|
72
|
+
goal:
|
|
73
|
+
required: [description]
|
|
74
|
+
success_criteria:
|
|
75
|
+
type: list
|
|
76
|
+
items: { type: string }
|
|
77
|
+
min_items: 1
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
# CLM Expression Language (CEL) Schema
|
|
2
|
+
# =====================================
|
|
3
|
+
# Defines language-agnostic operation descriptors for Balanced (Face B) assertions.
|
|
4
|
+
# Each 'actual' field in vcard_post can be either:
|
|
5
|
+
# - A legacy Python expression string (backward compatible)
|
|
6
|
+
# - A structured CEL operation dict (language-agnostic)
|
|
7
|
+
#
|
|
8
|
+
# Version: 1.1
|
|
9
|
+
# Sprint: 119 (v1.0), 126.1 (v1.1 — added run_test_suite, string_concat, path_basename, string_join)
|
|
10
|
+
|
|
11
|
+
universe_level: 0
|
|
12
|
+
version: "1.1"
|
|
13
|
+
|
|
14
|
+
# ---------------------------------------------------------------------------
|
|
15
|
+
# Reference Syntax
|
|
16
|
+
# ---------------------------------------------------------------------------
|
|
17
|
+
# References use dot-notation to access context values:
|
|
18
|
+
# inputs.key → inputs['key']
|
|
19
|
+
# outputs.key → outputs['key']
|
|
20
|
+
# state.key → retrieve('key') (cross-assertion state)
|
|
21
|
+
# env.tmp_dir → sandbox temporary directory
|
|
22
|
+
# env.clm_root → workspace root directory
|
|
23
|
+
# env.rc → return code from operation execution
|
|
24
|
+
|
|
25
|
+
# ---------------------------------------------------------------------------
|
|
26
|
+
# Primitive Types
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# string — UTF-8 text
|
|
29
|
+
# integer — whole number
|
|
30
|
+
# boolean — true / false
|
|
31
|
+
# list — ordered sequence
|
|
32
|
+
# dict — key-value mapping
|
|
33
|
+
# any — unspecified (runtime-determined)
|
|
34
|
+
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
# Operation Types
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
operations:
|
|
40
|
+
|
|
41
|
+
# === value_ref ===
|
|
42
|
+
# Look up a named value from the execution context.
|
|
43
|
+
value_ref:
|
|
44
|
+
required: [name]
|
|
45
|
+
optional: [returns]
|
|
46
|
+
description: "Reference a named context variable (e.g., rc, tmp_dir)."
|
|
47
|
+
example:
|
|
48
|
+
op: value_ref
|
|
49
|
+
name: rc
|
|
50
|
+
returns: integer
|
|
51
|
+
|
|
52
|
+
# === db_query ===
|
|
53
|
+
# Execute a SQL query against a named pillar database.
|
|
54
|
+
db_query:
|
|
55
|
+
required: [pillar, sql]
|
|
56
|
+
optional: [params, transform, returns]
|
|
57
|
+
description: "Execute SQL against a Tri-Database pillar."
|
|
58
|
+
defaults:
|
|
59
|
+
transform: strip
|
|
60
|
+
returns: string
|
|
61
|
+
example:
|
|
62
|
+
op: db_query
|
|
63
|
+
pillar: agent_identities
|
|
64
|
+
sql: "SELECT name FROM sqlite_master WHERE type='table' AND name='card';"
|
|
65
|
+
returns: string
|
|
66
|
+
|
|
67
|
+
# === call ===
|
|
68
|
+
# Invoke a registered function with arguments.
|
|
69
|
+
call:
|
|
70
|
+
required: [function]
|
|
71
|
+
optional: [args, kwargs, default, returns]
|
|
72
|
+
description: "Call a registered CLM function."
|
|
73
|
+
# Canonical list of Python-bound functions that are deprecated (Sprint 127.4).
|
|
74
|
+
# Both the CEL evaluator (cel_engine.py) and the lint gate (lint_cel_bindings.py)
|
|
75
|
+
# load this list at startup — single source of truth.
|
|
76
|
+
deprecated_functions:
|
|
77
|
+
- operator.add
|
|
78
|
+
- operator.sub
|
|
79
|
+
- operator.mul
|
|
80
|
+
- operator.truediv
|
|
81
|
+
- operator.mod
|
|
82
|
+
- str.join
|
|
83
|
+
- os.system
|
|
84
|
+
example:
|
|
85
|
+
op: call
|
|
86
|
+
function: classify_clm
|
|
87
|
+
args:
|
|
88
|
+
- ref: inputs.classify_string
|
|
89
|
+
returns: string
|
|
90
|
+
|
|
91
|
+
# === store ===
|
|
92
|
+
# Store a computed value in cross-assertion state.
|
|
93
|
+
store:
|
|
94
|
+
required: [key, value]
|
|
95
|
+
optional: [returns]
|
|
96
|
+
description: "Store a value for retrieval in subsequent assertions."
|
|
97
|
+
example:
|
|
98
|
+
op: store
|
|
99
|
+
key: v0_hash
|
|
100
|
+
value:
|
|
101
|
+
op: call
|
|
102
|
+
function: repo.resolve_handle_hash
|
|
103
|
+
args:
|
|
104
|
+
- ref: inputs.handle_name
|
|
105
|
+
returns: any
|
|
106
|
+
|
|
107
|
+
# === retrieve ===
|
|
108
|
+
# Retrieve a previously stored value.
|
|
109
|
+
retrieve:
|
|
110
|
+
required: [key]
|
|
111
|
+
optional: [returns]
|
|
112
|
+
description: "Retrieve a previously stored cross-assertion value."
|
|
113
|
+
example:
|
|
114
|
+
op: retrieve
|
|
115
|
+
key: v0_hash
|
|
116
|
+
returns: string
|
|
117
|
+
|
|
118
|
+
# === write_file ===
|
|
119
|
+
# Write content to a file in the sandbox.
|
|
120
|
+
write_file:
|
|
121
|
+
required: [path, content]
|
|
122
|
+
optional: [returns]
|
|
123
|
+
description: "Write content to a file path."
|
|
124
|
+
defaults:
|
|
125
|
+
returns: boolean
|
|
126
|
+
example:
|
|
127
|
+
op: write_file
|
|
128
|
+
path:
|
|
129
|
+
op: path_join
|
|
130
|
+
parts:
|
|
131
|
+
- ref: env.tmp_dir
|
|
132
|
+
- "sample.txt"
|
|
133
|
+
content:
|
|
134
|
+
ref: inputs.version_0_content
|
|
135
|
+
returns: boolean
|
|
136
|
+
|
|
137
|
+
# === set_env ===
|
|
138
|
+
# Set an environment variable.
|
|
139
|
+
set_env:
|
|
140
|
+
required: [var, value]
|
|
141
|
+
optional: [returns]
|
|
142
|
+
description: "Set an environment variable."
|
|
143
|
+
defaults:
|
|
144
|
+
returns: boolean
|
|
145
|
+
example:
|
|
146
|
+
op: set_env
|
|
147
|
+
var: CLM_POLYGLOT_RUNTIME
|
|
148
|
+
value: shell
|
|
149
|
+
returns: boolean
|
|
150
|
+
|
|
151
|
+
# === unset_env ===
|
|
152
|
+
# Remove an environment variable.
|
|
153
|
+
unset_env:
|
|
154
|
+
required: [var]
|
|
155
|
+
optional: [returns]
|
|
156
|
+
description: "Remove an environment variable."
|
|
157
|
+
defaults:
|
|
158
|
+
returns: boolean
|
|
159
|
+
example:
|
|
160
|
+
op: unset_env
|
|
161
|
+
var: CLM_POLYGLOT_RUNTIME
|
|
162
|
+
returns: boolean
|
|
163
|
+
|
|
164
|
+
# === sleep ===
|
|
165
|
+
# Pause execution for a specified duration.
|
|
166
|
+
sleep:
|
|
167
|
+
required: [seconds]
|
|
168
|
+
optional: [returns]
|
|
169
|
+
description: "Pause execution for N seconds."
|
|
170
|
+
defaults:
|
|
171
|
+
returns: boolean
|
|
172
|
+
example:
|
|
173
|
+
op: sleep
|
|
174
|
+
seconds: 1.1
|
|
175
|
+
returns: boolean
|
|
176
|
+
|
|
177
|
+
# === sequence ===
|
|
178
|
+
# Execute multiple operations in order, return the result of the last.
|
|
179
|
+
sequence:
|
|
180
|
+
required: [steps]
|
|
181
|
+
optional: [returns]
|
|
182
|
+
description: "Execute a sequence of operations. Returns result of last step."
|
|
183
|
+
max_depth: 2
|
|
184
|
+
example:
|
|
185
|
+
op: sequence
|
|
186
|
+
steps:
|
|
187
|
+
- op: set_env
|
|
188
|
+
var: CLM_POLYGLOT_RUNTIME
|
|
189
|
+
value: shell
|
|
190
|
+
- op: set_env
|
|
191
|
+
var: CLM_RUNTIME_BACKEND
|
|
192
|
+
value: shell
|
|
193
|
+
returns: boolean
|
|
194
|
+
|
|
195
|
+
# ---------------------------------------------------------------------------
|
|
196
|
+
# Utility Operations (composable within other ops)
|
|
197
|
+
# ---------------------------------------------------------------------------
|
|
198
|
+
|
|
199
|
+
# === path_join ===
|
|
200
|
+
# Join path segments (platform-independent).
|
|
201
|
+
path_join:
|
|
202
|
+
required: [parts]
|
|
203
|
+
optional: [returns]
|
|
204
|
+
description: "Join filesystem path segments."
|
|
205
|
+
defaults:
|
|
206
|
+
returns: string
|
|
207
|
+
example:
|
|
208
|
+
op: path_join
|
|
209
|
+
parts:
|
|
210
|
+
- ref: env.tmp_dir
|
|
211
|
+
- "db"
|
|
212
|
+
- "agent_identities.db"
|
|
213
|
+
|
|
214
|
+
# === len ===
|
|
215
|
+
# Get the length of a value.
|
|
216
|
+
len:
|
|
217
|
+
required: [value]
|
|
218
|
+
optional: [returns]
|
|
219
|
+
description: "Get length of a string, list, or dict."
|
|
220
|
+
defaults:
|
|
221
|
+
returns: integer
|
|
222
|
+
|
|
223
|
+
# === compare ===
|
|
224
|
+
# Compare two values with an operator.
|
|
225
|
+
compare:
|
|
226
|
+
required: [left, operator, right]
|
|
227
|
+
optional: [returns]
|
|
228
|
+
description: "Compare two values. Operators: eq, ne, gt, gte, lt, lte, in, not_in."
|
|
229
|
+
defaults:
|
|
230
|
+
returns: boolean
|
|
231
|
+
example:
|
|
232
|
+
op: compare
|
|
233
|
+
left:
|
|
234
|
+
op: call
|
|
235
|
+
function: repo.resolve_handle_hash
|
|
236
|
+
args:
|
|
237
|
+
- ref: inputs.handle_name
|
|
238
|
+
operator: ne
|
|
239
|
+
right:
|
|
240
|
+
ref: state.v0_hash
|
|
241
|
+
returns: boolean
|
|
242
|
+
|
|
243
|
+
# === int_cast ===
|
|
244
|
+
# Cast a value to integer.
|
|
245
|
+
int_cast:
|
|
246
|
+
required: [value]
|
|
247
|
+
optional: [returns]
|
|
248
|
+
description: "Cast a value to integer."
|
|
249
|
+
defaults:
|
|
250
|
+
returns: integer
|
|
251
|
+
|
|
252
|
+
# === contains ===
|
|
253
|
+
# Check if a value is contained in another.
|
|
254
|
+
contains:
|
|
255
|
+
required: [haystack, needle]
|
|
256
|
+
optional: [returns]
|
|
257
|
+
description: "Check if needle is contained in haystack."
|
|
258
|
+
defaults:
|
|
259
|
+
returns: boolean
|
|
260
|
+
|
|
261
|
+
# === make_mcard_content ===
|
|
262
|
+
# Generate MCard YAML content string.
|
|
263
|
+
make_mcard_content:
|
|
264
|
+
required: [content_hash, content]
|
|
265
|
+
optional: [filename, mime_type, returns]
|
|
266
|
+
description: "Generate an MCard YAML content string."
|
|
267
|
+
defaults:
|
|
268
|
+
filename: "test.txt"
|
|
269
|
+
mime_type: "text/plain"
|
|
270
|
+
returns: string
|
|
271
|
+
|
|
272
|
+
# === copy_file ===
|
|
273
|
+
# Copy a file from source to destination.
|
|
274
|
+
copy_file:
|
|
275
|
+
required: [src, dest]
|
|
276
|
+
optional: [returns]
|
|
277
|
+
description: "Copy a file from source to destination."
|
|
278
|
+
defaults:
|
|
279
|
+
returns: boolean
|
|
280
|
+
|
|
281
|
+
# === not_null ===
|
|
282
|
+
# Assert value is not null/None.
|
|
283
|
+
not_null:
|
|
284
|
+
required: [value]
|
|
285
|
+
optional: [returns]
|
|
286
|
+
description: "Check that value is not null/None."
|
|
287
|
+
defaults:
|
|
288
|
+
returns: boolean
|
|
289
|
+
|
|
290
|
+
# === callable_check ===
|
|
291
|
+
# Check if a value is callable (a function).
|
|
292
|
+
callable_check:
|
|
293
|
+
required: [value]
|
|
294
|
+
optional: [returns]
|
|
295
|
+
description: "Check if a value is callable."
|
|
296
|
+
defaults:
|
|
297
|
+
returns: boolean
|
|
298
|
+
|
|
299
|
+
# === json_parse ===
|
|
300
|
+
# Parse a JSON string into a dict/list.
|
|
301
|
+
json_parse:
|
|
302
|
+
required: [value]
|
|
303
|
+
optional: [returns]
|
|
304
|
+
description: "Parse a JSON string into structured data."
|
|
305
|
+
defaults:
|
|
306
|
+
returns: any
|
|
307
|
+
|
|
308
|
+
# === dict_get ===
|
|
309
|
+
# Access a key from a dict value.
|
|
310
|
+
dict_get:
|
|
311
|
+
required: [value, key]
|
|
312
|
+
optional: [default, returns]
|
|
313
|
+
description: "Get a key from a dict, with optional default."
|
|
314
|
+
defaults:
|
|
315
|
+
returns: any
|
|
316
|
+
|
|
317
|
+
# === index ===
|
|
318
|
+
# Access an element by index from a list.
|
|
319
|
+
index:
|
|
320
|
+
required: [value, position]
|
|
321
|
+
optional: [returns]
|
|
322
|
+
description: "Get element at position from a list."
|
|
323
|
+
defaults:
|
|
324
|
+
returns: any
|
|
325
|
+
|
|
326
|
+
# === replace ===
|
|
327
|
+
# String replacement.
|
|
328
|
+
replace:
|
|
329
|
+
required: [value, old, new]
|
|
330
|
+
optional: [returns]
|
|
331
|
+
description: "Replace occurrences of 'old' with 'new' in a string."
|
|
332
|
+
defaults:
|
|
333
|
+
returns: string
|
|
334
|
+
|
|
335
|
+
# === read_file ===
|
|
336
|
+
read_file:
|
|
337
|
+
required: [path]
|
|
338
|
+
optional: [returns]
|
|
339
|
+
description: "Read the contents of a file as text."
|
|
340
|
+
defaults:
|
|
341
|
+
returns: string
|
|
342
|
+
example:
|
|
343
|
+
op: read_file
|
|
344
|
+
path:
|
|
345
|
+
op: path_join
|
|
346
|
+
parts:
|
|
347
|
+
- ref: env.clm_root
|
|
348
|
+
- "README.md"
|
|
349
|
+
|
|
350
|
+
# === capture_output ===
|
|
351
|
+
# Capture stdout/stderr from an operation.
|
|
352
|
+
capture_output:
|
|
353
|
+
required: [operation]
|
|
354
|
+
optional: [stream, returns]
|
|
355
|
+
description: "Capture stdout or stderr from an operation."
|
|
356
|
+
defaults:
|
|
357
|
+
stream: stdout
|
|
358
|
+
returns: string
|
|
359
|
+
|
|
360
|
+
# === run_test_suite === (Sprint 126.1)
|
|
361
|
+
# Execute a test file in the appropriate runtime, returning its exit code.
|
|
362
|
+
run_test_suite:
|
|
363
|
+
required: [test_file]
|
|
364
|
+
optional: [env, timeout, returns]
|
|
365
|
+
description: >
|
|
366
|
+
Execute a test file in the appropriate runtime, returning its exit code.
|
|
367
|
+
Runtime is auto-detected from file extension (.py → python, .sh → shell, .rs → cargo test).
|
|
368
|
+
Environment variables are injected declaratively via the 'env' dict.
|
|
369
|
+
defaults:
|
|
370
|
+
returns: integer
|
|
371
|
+
timeout: 300
|
|
372
|
+
example:
|
|
373
|
+
op: "run_test_suite"
|
|
374
|
+
test_file: "computable_knowledge/files/layer0/python/test_core_exclude.py"
|
|
375
|
+
env:
|
|
376
|
+
CLM_ROOT: { ref: "env.clm_root" }
|
|
377
|
+
PYTHONPATH: { op: "path_join", parts: [{ ref: "env.clm_root" }, "kernel/scripts"] }
|
|
378
|
+
|
|
379
|
+
# === string_concat === (Sprint 126.1)
|
|
380
|
+
# Concatenate a list of string parts into a single string (no separator).
|
|
381
|
+
string_concat:
|
|
382
|
+
required: [parts]
|
|
383
|
+
optional: [returns]
|
|
384
|
+
description: "Concatenate a list of string parts into a single string (no separator)."
|
|
385
|
+
defaults:
|
|
386
|
+
returns: string
|
|
387
|
+
example:
|
|
388
|
+
op: "string_concat"
|
|
389
|
+
parts:
|
|
390
|
+
- "ast:"
|
|
391
|
+
- { op: "retrieve", key: "stripped_hash" }
|
|
392
|
+
|
|
393
|
+
# === path_basename === (Sprint 126.1)
|
|
394
|
+
# Extract the last component of a filesystem path.
|
|
395
|
+
path_basename:
|
|
396
|
+
required: [value]
|
|
397
|
+
optional: [returns]
|
|
398
|
+
description: "Extract the last component of a filesystem path."
|
|
399
|
+
defaults:
|
|
400
|
+
returns: string
|
|
401
|
+
example:
|
|
402
|
+
op: "path_basename"
|
|
403
|
+
value: "db/agent_identities.db"
|
|
404
|
+
|
|
405
|
+
# === string_join === (Sprint 126.1)
|
|
406
|
+
# Join a list of string parts with a separator.
|
|
407
|
+
string_join:
|
|
408
|
+
required: [separator, parts]
|
|
409
|
+
optional: [returns]
|
|
410
|
+
description: "Join a list of string parts with a separator."
|
|
411
|
+
defaults:
|
|
412
|
+
returns: string
|
|
413
|
+
example:
|
|
414
|
+
op: "string_join"
|
|
415
|
+
separator: " "
|
|
416
|
+
parts: ["hello", "world"]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Lifecycle Sub-Lattice Schemas and Models (DV-376-01)."""
|
|
2
|
+
|
|
3
|
+
from clm.schemas.lifecycle.models import (
|
|
4
|
+
ArtifactMCard,
|
|
5
|
+
ArtifactPayload,
|
|
6
|
+
CommitMCard,
|
|
7
|
+
CommitPayload,
|
|
8
|
+
DeliverableItem,
|
|
9
|
+
DesignDecisionMCard,
|
|
10
|
+
DesignDecisionPayload,
|
|
11
|
+
FeedbackMCard,
|
|
12
|
+
FeedbackPayload,
|
|
13
|
+
LifecycleBaseModel,
|
|
14
|
+
LifecycleMCard,
|
|
15
|
+
SprintStatusMCard,
|
|
16
|
+
SprintStatusPayload,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"ArtifactMCard",
|
|
21
|
+
"ArtifactPayload",
|
|
22
|
+
"CommitMCard",
|
|
23
|
+
"CommitPayload",
|
|
24
|
+
"DeliverableItem",
|
|
25
|
+
"DesignDecisionMCard",
|
|
26
|
+
"DesignDecisionPayload",
|
|
27
|
+
"FeedbackMCard",
|
|
28
|
+
"FeedbackPayload",
|
|
29
|
+
"LifecycleBaseModel",
|
|
30
|
+
"LifecycleMCard",
|
|
31
|
+
"SprintStatusMCard",
|
|
32
|
+
"SprintStatusPayload",
|
|
33
|
+
"import_decisions_from_dir",
|
|
34
|
+
"query_decisions",
|
|
35
|
+
"emit_sprint_status",
|
|
36
|
+
"query_lifecycle_cards",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
from clm.schemas.lifecycle.service import (
|
|
40
|
+
emit_sprint_status,
|
|
41
|
+
import_decisions_from_dir,
|
|
42
|
+
query_decisions,
|
|
43
|
+
query_lifecycle_cards,
|
|
44
|
+
)
|
|
45
|
+
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Pydantic v2 Models for Universal MCard Lifecycle Sub-Lattice Archetypes (DV-376-01).
|
|
2
|
+
|
|
3
|
+
Implements strictly validated schemas for Commit, DesignDecision, Feedback,
|
|
4
|
+
Artifact, and SprintStatus MCards.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
from typing import Any, Literal
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LifecycleBaseModel(BaseModel):
|
|
16
|
+
"""Base immutable model for lifecycle archetype structures."""
|
|
17
|
+
|
|
18
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
19
|
+
|
|
20
|
+
def to_canonical_json(self) -> str:
|
|
21
|
+
"""Produce canonical JSON representation with sorted keys and minimal separators."""
|
|
22
|
+
return json.dumps(
|
|
23
|
+
self.model_dump(mode="json", exclude_none=True),
|
|
24
|
+
sort_keys=True,
|
|
25
|
+
separators=(",", ":"),
|
|
26
|
+
ensure_ascii=False,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CommitPayload(LifecycleBaseModel):
|
|
31
|
+
commit_id: str
|
|
32
|
+
diff_hash: str
|
|
33
|
+
author: str
|
|
34
|
+
message: str
|
|
35
|
+
g_time: str
|
|
36
|
+
parent_commits: list[str] = Field(default_factory=list)
|
|
37
|
+
changed_files: list[str] = Field(default_factory=list)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class CommitMCard(LifecycleBaseModel):
|
|
41
|
+
archetype: Literal["CommitMCard"] = "CommitMCard"
|
|
42
|
+
version: str = "1.0.0"
|
|
43
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
44
|
+
payload: CommitPayload
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class DesignDecisionPayload(LifecycleBaseModel):
|
|
48
|
+
decision_id: str
|
|
49
|
+
summary: str
|
|
50
|
+
rationale: str
|
|
51
|
+
status: Literal["proposed", "approved", "rejected", "superseded"]
|
|
52
|
+
alternatives: list[str] = Field(default_factory=list)
|
|
53
|
+
consequences: list[str] = Field(default_factory=list)
|
|
54
|
+
v_pre: list[dict[str, Any]] = Field(default_factory=list)
|
|
55
|
+
v_post: list[dict[str, Any]] = Field(default_factory=list)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class DesignDecisionMCard(LifecycleBaseModel):
|
|
59
|
+
archetype: Literal["DesignDecisionMCard"] = "DesignDecisionMCard"
|
|
60
|
+
version: str = "1.0.0"
|
|
61
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
62
|
+
payload: DesignDecisionPayload
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class FeedbackPayload(LifecycleBaseModel):
|
|
66
|
+
feedback_id: str
|
|
67
|
+
source: Literal["human", "llm", "ci", "runtime"]
|
|
68
|
+
content: str
|
|
69
|
+
severity: Literal["info", "warning", "error", "fatal"]
|
|
70
|
+
target_ref: str | None = None
|
|
71
|
+
action_items: list[str] = Field(default_factory=list)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class FeedbackMCard(LifecycleBaseModel):
|
|
75
|
+
archetype: Literal["FeedbackMCard"] = "FeedbackMCard"
|
|
76
|
+
version: str = "1.0.0"
|
|
77
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
78
|
+
payload: FeedbackPayload
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ArtifactPayload(LifecycleBaseModel):
|
|
82
|
+
artifact_id: str
|
|
83
|
+
name: str
|
|
84
|
+
uri: str
|
|
85
|
+
content_type: str
|
|
86
|
+
size_bytes: int = Field(ge=0)
|
|
87
|
+
content_hash: str
|
|
88
|
+
origin: Literal["ci", "build", "doc", "test", "manual", "package"]
|
|
89
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class ArtifactMCard(LifecycleBaseModel):
|
|
93
|
+
archetype: Literal["ArtifactMCard"] = "ArtifactMCard"
|
|
94
|
+
version: str = "1.0.0"
|
|
95
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
96
|
+
payload: ArtifactPayload
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class DeliverableItem(LifecycleBaseModel):
|
|
100
|
+
id: str
|
|
101
|
+
name: str
|
|
102
|
+
status: str
|
|
103
|
+
commit_ref: str | None = None
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class SprintStatusPayload(LifecycleBaseModel):
|
|
107
|
+
sprint_id: str
|
|
108
|
+
title: str
|
|
109
|
+
status: Literal["planned", "in_progress", "review", "completed", "failed", "blocked"]
|
|
110
|
+
completion_ratio: float = Field(ge=0.0, le=1.0)
|
|
111
|
+
deliverables: list[DeliverableItem] = Field(default_factory=list)
|
|
112
|
+
quality_gate_passed: bool
|
|
113
|
+
g_time: str
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class SprintStatusMCard(LifecycleBaseModel):
|
|
117
|
+
archetype: Literal["SprintStatusMCard"] = "SprintStatusMCard"
|
|
118
|
+
version: str = "1.0.0"
|
|
119
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
120
|
+
payload: SprintStatusPayload
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
LifecycleMCard = CommitMCard | DesignDecisionMCard | FeedbackMCard | ArtifactMCard | SprintStatusMCard
|