diff --git a/.github/workflows/render.yml b/.github/workflows/render.yml index 29a5379..b167d42 100644 --- a/.github/workflows/render.yml +++ b/.github/workflows/render.yml @@ -44,6 +44,7 @@ jobs: - run: bun run example:compare - run: bun run example:overviews - run: bun run example:design + - run: bun run example:library-boundary - run: bun run example:images - name: Consume the reviewed Git package through Bun env: diff --git a/.gitignore b/.gitignore index 2b9f868..9fc5b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,8 @@ __pycache__/ # TypeScript packages and local rendering outputs. node_modules/ .cache/ + +# Editor backups and native compiler outputs are not source changes. +*~ +*.ssi +*.ssxi.ss diff --git a/Justfile b/Justfile index 4c0119e..f656abf 100644 --- a/Justfile +++ b/Justfile @@ -17,7 +17,7 @@ export GAMBOPT := if env_var_or_default("GAMBOPT", "") == "" { "max-heap=2G,debu gerbil_homebrew_runtime := `gerbil_executable="$(command -v gerbil 2>/dev/null || true)"; if [ -n "$gerbil_executable" ] && realpath "$gerbil_executable" | grep -F '/opt/homebrew/Cellar/' >/dev/null; then printf true; else printf false; fi` homebrew_openssl_prefix := `if command -v brew >/dev/null 2>&1; then brew --prefix openssl@3 2>/dev/null || true; fi` darwin_openssl_prefix := env_var_or_default("OPENSSL_PREFIX", homebrew_openssl_prefix) -gerbil_darwin_env := if os() == "macos" { if gerbil_homebrew_runtime == "true" { "env -u SDKROOT -u DEVELOPER_DIR -u CPATH -u LIBRARY_PATH -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH -u MACOSX_DEPLOYMENT_TARGET -u DYLD_LIBRARY_PATH -u DYLD_FALLBACK_LIBRARY_PATH COMPILER_PATH=/usr/bin CPATH='" + darwin_openssl_prefix + "/include' LIBRARY_PATH='" + darwin_openssl_prefix + "/lib' PKG_CONFIG_PATH='" + darwin_openssl_prefix + "/lib/pkgconfig'" } else { "env" } } else { "env" } +gerbil_darwin_env := if os() == "macos" { if gerbil_homebrew_runtime == "true" { "env -u SDKROOT -u DEVELOPER_DIR -u CPATH -u LIBRARY_PATH -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH -u MACOSX_DEPLOYMENT_TARGET -u DYLD_LIBRARY_PATH -u DYLD_FALLBACK_LIBRARY_PATH COMPILER_PATH=/usr/bin CPATH='" + darwin_openssl_prefix + "/include' LIBRARY_PATH='" + darwin_openssl_prefix + "/lib' PKG_CONFIG_PATH=\"" + darwin_openssl_prefix + "/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}\"" } else { "env" } } else { "env" } # Native installation spans several package builds. Keep the original deadline # at each package entry; a serial dependency closure is not one package build. @@ -25,10 +25,9 @@ deps: timeout --signal=TERM --kill-after=5s 180s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q deps --install -# The product owns the v0.19 tagged-update adapter over public gxpkg APIs. -# Run after initial installation; no local updater or manifest writer. +# Gerbil's public package API owns tagged updates; no Parent path or manifest writer. deps-update: - timeout --signal=TERM --kill-after=5s 180s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi .gerbil/pkg/github.com/tao3k/agentic-ai-lab/packages/automation/native-dependencies.ss + timeout --signal=TERM --kill-after=5s 180s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -e '(import (only-in :gerbil/tools/gxpkg pkg-update pkg-install with-pkg-build-env)) (with-pkg-build-env (for-each (lambda (dependency) (pkg-update dependency) (pkg-install dependency)) (pgetq depend: (call-with-input-file "gerbil.pkg" read) (quote ()))))' # Use the ordinary untagged native build with the same host/compiler envelope. build-dependency package: @@ -47,7 +46,7 @@ test-file path pattern=".*": fi mkdir -p .data/test-logs log="$(mktemp .data/test-logs/test-XXXXXX)" - timeout --signal=TERM --kill-after=5s 120s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxtest -:max-heap=2G,debug=q -v 5 -r "{{pattern}}" "{{path}}" 2>&1 | tee "$log" + timeout --signal=TERM --kill-after=5s 120s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q test -v 5 -r "{{pattern}}" "{{path}}" 2>&1 | tee "$log" if rg 'ERROR (MODULE|CHECK|CASE|HARNESS)|Heap overflow|Stack overflow' "$log"; then exit 1; fi rg -F -x 'MODULE-OK {{path}}' "$log" >/dev/null rg -F 'HARNESS-OK' "$log" >/dev/null @@ -57,6 +56,8 @@ test-file path pattern=".*": # Serial execution preserves bounded native test ownership. test: + just test-file t/user-configuration-test.ss + just test-source-contracts just test-file t/engineering-ownership-test.ss just test-file t/repository-input-schema-test.ss just test-file t/library-relation-types-test.ss @@ -73,6 +74,22 @@ test: just test-file t/dependency-compatibility-test.ss just test-file t/package-metadata-test.ss +# Real language subjects, current native tool paths and existing test harness. +test-source-contracts pattern=".*" path="t/source-contracts-test.ss": + #!/usr/bin/env bash + set -euo pipefail + export SOURCE_CONTRACT_CBMC="$(realpath "$(command -v cbmc)")" + export SOURCE_CONTRACT_GOTO_CC="$(realpath "$(command -v goto-cc)")" + export SOURCE_CONTRACT_GOTO_INSTRUMENT="$(realpath "$(command -v goto-instrument)")" + export SOURCE_CONTRACT_CC="$(realpath "$(command -v clang)")" + export SOURCE_CONTRACT_CXX="$(realpath "$(command -v clang++)")" + just test-file "{{path}}" "{{pattern}}" + +investigate-source-contracts output: + #!/usr/bin/env bash + set -euo pipefail + timeout --signal=TERM --kill-after=5s 180s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi t/support/source-contract-evidence.ss "{{output}}" "$(realpath "$(command -v cbmc)")" "$(realpath "$(command -v goto-cc)")" "$(realpath "$(command -v goto-instrument)")" "$(realpath "$(command -v clang)")" "$(realpath "$(command -v clang++)")" + # Each existing suite receives its own bounded native invocation. test-gateway: #!/usr/bin/env bash @@ -92,7 +109,7 @@ investigate-resource output: test ! -e "{{output}}" mkdir -p .data/test-logs log="$(mktemp .data/test-logs/investigation-XXXXXX)" - timeout --signal=TERM --kill-after=5s 600s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q examples/resource-lifecycle-evidence.ss "{{output}}" "$cargo" "$rustc" "$quint" "$lean" 2>&1 | tee "$log" + timeout --signal=TERM --kill-after=5s 600s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q t/support/resource-lifecycle-evidence.ss "{{output}}" "$cargo" "$rustc" "$quint" "$lean" 2>&1 | tee "$log" RESOURCE_REAL_REPORT="{{output}}/report.json" just test-file t/resource-lifecycle-test.ss # Optional SysML/correspondence slice with the existing native result issuer. @@ -105,8 +122,8 @@ investigate-resource-integration output sysml: lean="${RESOURCE_LEAN:-$(elan which lean)}" test ! -e "{{output}}" test -x "{{sysml}}" - timeout --signal=TERM --kill-after=5s 600s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q examples/resource-integration-evidence.ss "{{output}}" "$cargo" "$rustc" "$quint" "$lean" "$(realpath "{{sysml}}")" - d2 --layout elk --theme 0 --pad 24 "{{output}}/evidence.d2" "{{output}}/evidence.svg" + timeout --signal=TERM --kill-after=5s 600s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q t/support/resource-integration-evidence.ss "{{output}}" "$cargo" "$rustc" "$quint" "$lean" "$(realpath "{{sysml}}")" + # Rendering requires the TS FigureInput contract; raw D2-to-SVG is retired. # Native SDLC consumer of the accepted owner slice. No changes to its captured roots. test-backpressure-review: @@ -136,7 +153,7 @@ investigate-backpressure-reassessment output: mkdir -p .data/test-logs .data/test-runs cargo="${RESOURCE_CARGO:-$("$HOME/.cargo/bin/rustup" which cargo)}" rustc="${RESOURCE_RUSTC:-$("$HOME/.cargo/bin/rustup" which rustc)}" - timeout --signal=TERM --kill-after=5s 240s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q examples/backpressure-reassessment-evidence.ss "{{output}}" "$cargo" "$rustc" + timeout --signal=TERM --kill-after=5s 240s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q t/support/backpressure-reassessment-evidence.ss "{{output}}" "$cargo" "$rustc" test-backpressure-reassessment: #!/usr/bin/env bash @@ -395,7 +412,7 @@ investigate-project-formation output: test ! -e "{{output}}" mkdir -p .data/test-logs log="$(mktemp .data/test-logs/project-formation-XXXXXX)" - timeout --signal=TERM --kill-after=5s 120s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q examples/library-formation.ss "{{output}}" 2>&1 | tee "$log" + timeout --signal=TERM --kill-after=5s 120s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q t/support/library-formation.ss "{{output}}" 2>&1 | tee "$log" # Raw facts remain an explicitly untrusted design investigation interface. investigate-formation-consequences output: @@ -404,4 +421,4 @@ investigate-formation-consequences output: test ! -e "{{output}}" mkdir -p .data/test-logs log="$(mktemp .data/test-logs/formation-consequences-XXXXXX)" - timeout --signal=TERM --kill-after=5s 120s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q examples/library-formation-consequences.ss "{{output}}" 2>&1 | tee "$log" + timeout --signal=TERM --kill-after=5s 120s {{ gerbil_darwin_env }} gerbil -:max-heap=2G,debug=q env gxi -:max-heap=2G,debug=q t/support/library-formation-consequences.ss "{{output}}" 2>&1 | tee "$log" diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..e7fa770 --- /dev/null +++ b/LICENSES/Apache-2.0.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 GuangTao Zhang + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.org b/README.org index 382be22..da7c8ab 100644 --- a/README.org +++ b/README.org @@ -7,6 +7,55 @@ #+LANGUAGE: en #+OPTIONS: toc:2 num:nil +* Library boundary and current organization +:PROPERTIES: +:CUSTOM_ID: engineering-ownership +:STATUS: refactor-in-progress +:END: + +This repository maintains reusable engineering types, models, rules, Feature +contracts, verification obligations and evidence data contracts. It does not +implement an App Server, model provider, agent Runtime or platform authorization +recovery. Those are consuming-ecosystem responsibilities. + +The root package depends on AI Agentic Lab. Its native dependency closure supplies +Yuanxu, POO, ASCENT and the other declared capabilities. This does not activate +Lab Runtime features or transfer application authorization to the Library. + +Business Scheme Modules share one flat =library//= tree. Native +Yuanxu =tags:= and =profile:= classify and select the same declared leaves; +classification does not create deeper directory layers or another loader. +Profiles are native Modules. Test sequences are not artificial Review Modules. +[[file:examples/README.org][User examples]] assign +=programs.deterministic-engineering.languages..{enable,settings}=. +The maintained root [[file:config.ss][Config]] supplies defaults. Downstream POO values compose +through Yuanxu's native =config-defaults= recursive merge. Current C and C++ +settings select actual maintained Profiles and command deadlines. Inheritance, +Types, Module loading and tool execution remain with their existing owners. +See [[file:docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org][10.149]] for the interface and real engineering cases. + +#+BEGIN_EXAMPLE +library// Native types, objects, config, methods and Interface roles +languages-engineering/ Language-native subjects and verification inputs +t/*-test.ss Development checks through native gerbil test +init.ss One declarative Yuanxu selection +build.ss Native init.exports std-make-spec only +#+END_EXAMPLE + +[[file:docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org][10.141]] records the current boundary, the SysML organization declaration and +remaining acceptance gates; [[file:docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.svg][90.130]] is its paired view. The current migration is +not fully accepted. Older case notes below describe historical designs and +receipts; they do not qualify the changed source tree. + + +** Current Library boundary view +[[file:docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp]] + +[[file:docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2][D2 declaration]] · [[file:docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.svg][Vector SVG]] · [[file:docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json][Render and compression receipt]] + +This current view uses the existing TS measured-render framework and lossless +Sharp encoding. It describes ownership; native package/test acceptance remains open. + * Purpose :PROPERTIES: :CUSTOM_ID: purpose @@ -23,6 +72,10 @@ capabilities. The TypeScript render package presents the selected model and source context through static D2, HTML, SVG and PNG artifacts. * Architecture at a glance +The following upstream case figures retain their captured baseline. They do not +qualify the current Library-boundary refactor; its current organization is recorded +in [[file:docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org][10.148]]. + This is the engineering organization used by this repository: the Library publishes reusable definitions, a Profile selects them, and a Scenario binds actual project inputs. The project boundary owns its architecture model, Org @@ -69,17 +122,14 @@ Aitia's end-to-end review integration remains a target boundary for this Case. | Source | Responsibility | |--------+----------------| -| [[file:library/][library/]] | Domain definitions and Scheme drivers, including project organization and concurrency/resource control | -| [[file:profiles/][profiles/]] | Independent project and workload choices | -| [[file:scenarios/][scenarios/]] | Application bindings, input acquisition and source adapters | -| [[file:projects/][projects/]] | Actual project entrypoints and project test policy | -| [[file:languages-engineering/][languages-engineering/]] | Target-language projects and source, including Rust/Cargo inputs | -| [[file:packages/render/][packages/render/]] | Functional static-rendering package and optional OpenSysML SDK projection | -| [[file:packages/render/examples/][packages/render/examples/]] | Package-owned render cases and domain-specific compositions | -| [[file:docs/][docs/]] | Org design arguments, D2 projections, decisions and candidate image snapshots | +| [[file:library/][library/]] | Flat native Scheme Modules: generic domain models, specializations, Profiles, obligations and evidence contracts; classified through Yuanxu tags/profile | +| [[file:languages-engineering/][languages-engineering/]] | Language-native subjects and verification inputs | +| [[file:t/][t/]] | Development verification and test-only tool effects | +| [[file:packages/render/][packages/render/]] | Existing TS static-render Library, Node/Bun export and Sharp compression | +| [[file:docs/][docs/]] | Org arguments, SysML organization, D2 sources and source-bound rendered views | The root [[file:init.ss][init.ss]] uses Yuanxu's declared module loading. The -[[file:build.ss][build.ss]] consumes declared public roots. This repository reuses +[[file:build.ss][build.ss]] consumes the root =init.exports= =std-make-spec=. This repository reuses POO/Core/Flow/module and contract mechanisms; it does not define another package loader or model runtime. @@ -187,7 +237,6 @@ compilation and loading. Current commands and existing budgets live in [[file:Ju just deps just build just test -just test-project-formation #+end_src These Scheme/package gates are separate from TS rendering qualification. diff --git a/build.ss b/build.ss index 5f144b8..96b0b25 100755 --- a/build.ss +++ b/build.ss @@ -1,30 +1,12 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - #!/usr/bin/env gxi -;;; Native package build: use the same Core/SDK boundary as agentic-ai-lab. -(import (for-syntax - (only-in :std/source this-source-file) - (only-in :yuanxu/module-system/building/source-package register-module-build-source!))) -(begin-syntax - (register-module-build-source! (path-directory (this-source-file)) 'deterministic-engineering)) +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later -(import (only-in :std/source this-source-file) +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;;; Product construction comes entirely from the native init projection. +(import (only-in :clan/poo/object .get) (only-in :yuanxu/module-system/building/script defbuild-script) - (only-in :clan/poo/object .get) - (only-in :yuanxu/module-system/building/source-closure package-library-spec) (only-in "./init.ss" deterministic-engineering.init.exports)) -;; Public roots are declaration data; Core walks their native import closure. -(def public-roots '("init.ss" "examples/gateway-evidence.ss" "profiles/resource-lifecycle.ss" - "examples/resource-lifecycle-evidence.ss" "projects/library-formation/init.ss" - "profiles/library-formation.ss" "examples/library-formation.ss" - "projects/library-formation/test.ss" - "scenarios/resource-lifecycle/review/interface.ss" - "scenarios/resource-lifecycle/review/archive.ss" - "examples/backpressure-reassessment-evidence.ss")) -(def retained-spec - (package-library-spec (path-directory (this-source-file)) 'deterministic-engineering public-roots)) -(def modules-spec (.get deterministic-engineering.init.exports std-make-spec)) -(defbuild-script (modules-spec retained-spec)) +(defbuild-script + ((.get deterministic-engineering.init.exports std-make-spec) '("init"))) diff --git a/config.ss b/config.ss new file mode 100644 index 0000000..81a57b0 --- /dev/null +++ b/config.ss @@ -0,0 +1,21 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object) +(export Config) + +(.def Config + programs: + (.o + deterministic-engineering: + (.o + languages: + (.o + c: + (.o + enable: #f + settings: (.o profile: 'capacity-body timeout: 45)) + cpp: + (.o + enable: #f + settings: (.o profile: 'lifetime-body timeout: 45)))))) diff --git a/docs/00-09-project/00-documentation/00.01-index.org b/docs/00-09-project/00-documentation/00.01-index.org index dd05025..b776040 100644 --- a/docs/00-09-project/00-documentation/00.01-index.org +++ b/docs/00-09-project/00-documentation/00.01-index.org @@ -361,3 +361,9 @@ source projection, behavioral checks and branch custody. - [[file:../../10-19-design/10-architecture/10.144-functional-themes-layouts-and-package-examples.org][10.144 Functional themes, measured headings/layout and package-owned examples]] - [[file:../../10-19-design/10-architecture/10.145-design-taste-public-contracts.org][10.145 Design / Taste public contracts and real design choices]] + +* Current declarative Library work (unaccepted implementation gates) + +- [[file:../../10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org][10.147 Source-bound C/C++ contract verification]] +- [[file:../../10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org][10.148 Flat declarative Library boundary]] +- [[file:../../10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org][10.149 Unified language engineering configuration]] diff --git a/docs/10-19-design/10-architecture/10.107-implementation-progress-and-execution-gates.org b/docs/10-19-design/10-architecture/10.107-implementation-progress-and-execution-gates.org index 3850f24..684438f 100644 --- a/docs/10-19-design/10-architecture/10.107-implementation-progress-and-execution-gates.org +++ b/docs/10-19-design/10-architecture/10.107-implementation-progress-and-execution-gates.org @@ -11,6 +11,1668 @@ [[file:../../00-09-project/00-documentation/00.01-index.org][Index]] | [[file:10.104-declarative-slice-coherence-and-implementation-gates.org][Plan and gates]] | [[file:10.105-i0-dependencies-prelude-build-load-and-testing.org][I0]] | [[file:10.106-i1-normalized-context-scope-realization-and-self-binding.org][I1]] | [[file:../../90-99-views/90-architecture-views/90.99-library-contracts.d2][Current execution map]] +The next architecture refactor is specified in [[file:10.108-parser-directory-modules-and-init-build-refactor.org][10.108]]: real src-directory Modules and init-owned build selection. It is not yet an implemented cutover. + +* Parser prefix policy and publication-wrapper removal (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-parser-prefix-policy-removal +:END: + +** Implemented scope and authority boundary + +Following the user's confirmation, remove the source of the redundant input +policy rather than moving it into Core. =package-inputs.ss=, +=library-publication.ss=, =preparation-snapshot.ss=, =preparation-cache.ss= and the +now-unused =build-environment.ss= are deleted from Parser and its library catalog. +Their dedicated tests are retired with the implementation. Compiler process, +Core projection, FFI, worker failure, idle/silence and actual language tests remain. + +The separate =build-qualified-library.ss= is deleted. =qualify-library= delegates +to the existing =build.ss=; optional/helper builds invoke their existing standard +Gerbil entries without =publication-build-main=. =qualify.ss run= retains its +actual process supervisor, budgets, output checks and failure propagation but +no longer presents a Parser receipt as authorization to run. Its obsolete +=--library-write= flag and workflow callers are removed together. + +Conformance preparation invokes the existing =compile-static-conformance!= and +native link entry. The prefix-wide copied cache and =scripts/preparation-cache.ss= +are removed; the small source-only test classification remains in the existing +=scripts/test-plan.ss= declaration owner. No replacement cache, graph registry, +whole-prefix observer, signer or scheduler is introduced. The failure archiver +continues to preserve failed lib/bin outputs and original status, but stops +expecting the removed publication record. + +Ordinary compiler completion is not review/delivery authorization. This change +retires Parser's own whole-library issuance promise; it does not replace that +promise with a weaker receipt. Core/Gerbil own the actual selected-source guards, +normalized build spec, compilation and required-product checks. A higher-level +consumer needing evidence must bind its actual capture, source, command and test +result through the existing evidence owner, rather than trust a Parser marker. +No new Core API is introduced for the removed policy. + +** Validation results, provenance and open gates + +The implementation is in existing Parser PR13: =0b68f53= removes the lifecycle +wrappers, =850d130= retains failed process evidence, and =d6e487c= corrects loader +comments that previously referred to the deleted publication reader. The last +change is commentary only; it does not alter loader behavior. The initial removal +diff deletes 1,805 lines and adds 134 across 34 files, including the obsolete +policy/cache-specific tests. =src/build-support= now contains two modules and +178 lines: necessary compiler options and native-object linking. No additional +Core implementation or public API was introduced by this slice. + +| Gate | Result and exact scope | +|------+------------------------| +| Actual Gerbil syntax / existing test-plan controls | PASS; plan 4.39s | +| Independent actual catalog / FFI comparison | PASS 108.16s; retained production catalog and all three FFI specifications | +| Existing Core source/Graph/entry/conflict and selected-clean controls | Four PASS, 46.43s; source/Graph drift and stale entry refuse; symlinked output refuses | +| Existing Core product/recovery controls | Six PASS, 6.14s; missing/nonregular products refuse, no-op/recursive recovery cannot issue approval | +| Selected Core/standard clean | PASS 7.54s; one-off deleted-module cleanup uses the actual Git deletion list and standard/Core output-family APIs, not a new scanner | +| Parser cold build under existing dependency prefix | PASS 211.72s, 264 targets / 588 backend jobs; ordinary Core/Gerbil completion checks, not Parser issuance; two workers / 2GiB; dependencies were not cold rebuilt | +| Standard helper entries | PASS 60.81s, 46 targets / 96 jobs; no prefix snapshot or copied-store restore | +| Compiler process suite | PASS 28.83s; module/harness/final OK; zero/multiple values, exceptions and real output controls retained | +| Three public source-contract suites | PASS 14.07s; all three module markers, harness/final OK | +| Build owner imports / metadata | PASS 24.18s; helper and FFI declarations still expand independently | +| Conformance compile / native link | PASS 168.46s; actual CONFORMANCE-LINKED and process result 0; unchanged 240s total / 5s idle; no copied conformance cache | +| Compiled semantic / research entry | PASS 17.57s, 24 semantic groups plus five other declared runtime/history/provenance/language entries; six actual exit rows all 0 | +| Removed policy native load | Actual exit 70 with exact =module not found= and requested identity; current compiler-profile module loads successfully. An overly narrow diagnostic message matcher initially rejected this observation; original result/log retained and corrected against the existing observation without re-execution | + +Native process controls require the host's =ps= topology API. The first sandboxed +run refused at the six-way cold bootstrap's unchanged 1.5s idle boundary; its +log is retained. A subsequent intentional exec-failure custody probe exposed +=Operation not permitted= for =ps= inside that sandbox. That permission failure +is confirmed, but it does not by itself establish the first startup timeout's +complete cause. No native production performance repair is claimed. + +With the required host capability, a fresh standard helper clean/build passed +(4.43s / 8.42s, eight targets / 18 jobs), followed by the complete unchanged +process controls in 23.93s. Six concurrent first loads, real silence/nonzero +failure, closed output, Unicode flood and padded-flood backpressure, immediate +error cancellation, escaped-session cleanup and unrelated-process survival all +passed. Original 3s total / 1.5s startup idle and 6s backpressure controls remain. +A deliberate nonexistent exec target separately produced six real native exec +failures and retained six child logs. The evidence path is published on directory +creation and failure output is never a success receipt. Failed and native-host +cohorts remain distinct. + +The first remaining-source command omitted CI's existing =GERBIL_LOADPATH= and +failed on the present =t/fixtures/progress.ss= source fixture. That was a local +validation-command error; the original log remains. With the exact source path +and existing 3-GiB full-suite heap / two workers, a fresh full source-suite run +still failed during =t/benchmark-test.ss= preparation at the unchanged 90s +per-owner total budget. This is an OPEN gate, not a passed suite or an algorithm +failure. A scoped, sampled diagnostic subsequently passed that one owner in +29.29s; it is diagnostic coverage only and does not repair the full-suite failure. + +At about 20s of that diagnostic, the native main thread spent 802 of 894 samples +in =dlopen -> mapSegments -> fcntl= and had low CPU. This supports a host dynamic- +loading cost observation, not complete causal attribution for the original +full-suite timeout. It is consistent with earlier saved AMFI observations in +this document; previously falsified signing shortcuts must not be reintroduced. +No signing, xattr, system-policy, Gerbil/SDK source or resource-limit change was +made. Full source-suite closure and final exact-head Linux/macOS CI remain open. +Worker controls PASS 66.12s, all 11 existing controls including actual failure, +real silence and duplicate/reexport/Suite ownership refusal. The comment-only +incremental build PASS 27.11s, three targets / seven backend jobs. Final existing +PR13 head is =d6e487cb99e3a97a4f38601b4d076a421ca07a18=; exact-head CI +run =40200589398= is pending at this observation. Earlier =850d130= and +=0b68f53= runs are superseded, not final-head acceptance. No retry, warm pass or old receipt closes a cold +or failed gate. + +Raw receipts and failed scenes are under =.data/alignment-20261024/current-pr/=: +=parser-removal-native-cohort16.json=, =parser-removal-conformance-cohort16.json=, +=parser-semantic-removal-cohort16.json=, +=parser-semantic-removal-aligned-cohort16.json=, +=parser-native-process-controls-cohort16.json=, +=parser-failure-custody-native-cohort16.json= and +=parser-benchmark-owner-diagnostic-cohort16.json= plus its actual process sample. +Original diagnostic-matcher results remain adjacent; a matcher correction is +not a producer retry or repair. Previous runs/CI are historical evidence for +their own source and input basis. The upstream Core Linux 180s build issue +remains separately unresolved; this cleanup does not claim to fix it. + +* Parser build responsibility consolidation (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-parser-build-consolidation +:END: + +** Architecture and first implementation slice + +Gerbil is the default compiler and standard build toolchain. References to a +separate project-owned SDK layer are withdrawn. Existing toolchain environment +variable names, such as Apple's =SDKROOT= or release-provider inputs, remain +external interfaces; they do not define a new architectural owner. + +The build path remains Parser declarations -> =yuanxu!= / =init= -> the same +=std-make-spec= -> Core =defbuild-script= -> Gerbil =std/make= / compiler. +No new builder, dependency resolver, scheduler or compiler implementation is +introduced. Two workers and the existing heap limits remain; the earlier +user-authorized removal of Parser's 180-second build cutoff remains in force. +Core's separate 180-second build boundary is unchanged. + +The first slice removes Parser's unused =loader-products.ss=, its sole catalog +entry and its dedicated test suite. Production had no caller. These tests only +exercised the removed post-build wrapper-deletion mechanism; runtime module +loading tests and the real runtime loader remain. All current build products +must still be checked by the existing owner. + +Parser's duplicate byte/text drain loop moves into the existing Core Ops +=copy-process-output= function. Its four positional arguments and default line +mode are retained. Optional =mode:= is limited to =lines=, =text= and =bytes=; +chunk modes refuse line-progress callbacks. Real data is forwarded in bounded +chunks before newline or EOF. Gerbil ports own text decoding; =run-process= +continues to own process spawn, wait and failure propagation. Parser retains a +thin invocation adapter, its actual compiler options and FFI configuration. + +** Correction: remove prefix-wide policy at its source + +The =package-inputs.ss= wrapper is not a Parser responsibility. Its original +purpose was to exclude reverse-dependent products from the whole-prefix input +snapshot in =library-publication-inputs=. The snapshot first treated unrelated +installed library files as inputs; the policy then enumerated every package, +validated metadata caches, inferred namespace/path ownership, computed reverse +consumers and intercepted imports to compensate. Calling Gerbil's native graph +functions does not make this additional Parser policy necessary. + +The target is to remove that whole-prefix snapshot and the compensating policy +together, not merely make the policy lazy, rename it or move the complete file +into Core. Ordinary builds consume declared module/FFI specifications through +=std-make-spec= and =defbuild-script=. Verification consumes the framework's +existing selected-source/dependency/product information; genuine external +non-Scheme inputs remain explicit declarations. If an existing framework API +cannot provide a required observation, identify that precise missing contract +before proposing an addition. Parser does not acquire a general package-policy, +namespace-ownership or publication authority role. + +Acceptance must preserve the actual obligations rather than the removed +algorithm: a selected source, dependency, compiler or required FFI-input change +invalidates affected verification; a missing required product or failed build +refuses; unrelated downstream outputs do not become upstream compiler inputs. +Import/source-owner boundaries are checked through existing framework owners, +not a second Parser expander admission policy. Tests devoted solely to the +removed implementation are retired or replaced by these boundary checks. +The current =772689f= qualification run verifies the preceding first slice; +its successful completion would not approve retaining this policy architecture. + +** Remaining removal order and acceptance boundaries + +| Existing owner/file | Current status | Required replacement and acceptance | +|---------------------+----------------+-------------------------------------| +| Parser =loader-products.ss= / catalog / dedicated test | Removed in this slice; no production callers | No remaining live reference; normal catalog/build and module loading still pass | +| Parser =compiler-profile.ss= output drain | Delegates to existing Core Ops API | Preserve line callbacks, arbitrary bytes, split UTF-8, unterminated output, concurrent capture and child failure; malformed modes refuse | +| Parser =library-publication.ss= and explicit writer/readers | Still used; not removed | Consume the same init-owned full-library projection and actual entry-source binding; preserve complete input/product guards and reader/writer exclusion | +| Parser =package-inputs.ss= / prefix-wide publication inputs | Still used; removal now explicitly required | Remove whole-prefix inference and compensating reverse-dependent/namespace policy together; consume selected framework inputs, not every installed package | +| Parser =preparation-cache.ss= / =preparation-snapshot.ss= / conformance script | Still used; not removed | Use Core-owned preparation/publication restoration with the real FFI/generated/conformance closure; no digest-only approval or second cache protocol | +| Core build projection / artifacts | Existing framework owner; full-library publication handoff needs a public contract | Retain exact normalized projection and roots; distinguish ordinary build completion from issued qualification; preserve changed/missing/foreign/failed/replay refusal | + +The last two migrations cannot be completed by deleting guards or substituting +the test-only projection for the library projection. Expose and consume the +same init-owned projection before switching consumers. Keep qualification +semantics separate from raw compilation and preserve failed scenes. No Gerbil +or compiler source changes are part of this work. + +** Validation status + +| Evidence | Current result and limit | +|----------+--------------------------| +| Core source output-pump diagnostic | PASS 13.86s; line callbacks/forwarding, arbitrary bytes, split UTF-8, child failure and invalid mode/callback refusal; source diagnostic only | +| Core ordinary full-spec build at the frozen pre-rebase source | PASS 166.46s, 75 targets / 166 backend jobs, two workers / 2GiB / existing 180s; incremental, not cold or issued qualification | +| Core native Ops process-script suite | PASS 24.04s with module, harness and final OK; new pump cases plus existing cancellation/process controls | +| Exact-revision native =pkg update= | FAIL 70 after 5.79s; checkout reached the requested revision, but the next =pkg-install-deps= passed =package@revision= to =pkg-plist-path=. The original command and failure remain in the evidence log; no compiler modification | +| Native canonical =pkg deps --install= then =pkg build github.com/tao3k/gebril-yuanxu= | Both PASS, 162.66s combined; each retained its existing 180s bound. Dependency installation includes normal =gxtags= indexing; no alternate environment or patch | +| Parser new strict writer | PASS 347.55s, 269 targets / 599 backend jobs, real LIBRARY-PUBLICATION-READY; two workers / 2GiB and no Parser build cutoff; this validates 772689f, not the subsequent policy-removal target | +| Parser helpers | PASS 100.09s, 61 targets / 128 jobs / three real publications | +| Parser compiler-process suite | PASS 35.92s, module/harness/final OK; retained zero/multiple values, exception and output controls | +| Parser four public source-contract suites | PASS 42.44s; all four module markers, harness/final OK and no reported check/module/harness errors | +| Core exact-head CI | Lean/Quint run 40195370768 PASS. Native run 40195370787: macOS build PASS, Linux build FAIL after about 181s with encoded child wait status 31744 (exit 124), consistent with the unchanged 180s build watchdog. Specific cost attribution remains open; no retry, cap change or cold-closure claim. Native test groups remain incomplete | +| Parser exact-head CI | Run 40195493395: Rust lints/contracts/aot-performance PASS; Linux/macOS preparation still running at this observation; no prior-result transfer | + +The current Core PR baseline was refreshed from =57dbe0a= to =3a4648a= while +preserving the upstream types-contract changes, then the shared API was normally +rebased and published as =bf88264cf0f5c1bf2b5c0a6484ca5f2e1f08c2d5= in existing PR19. +Parser existing PR13 =772689f6a112001e2408fc2018fee27565a526f9= pins exactly that +Core revision as its one direct dependency. No branch replacement or force push +was used. The frozen build and post-rebase native package results remain separate. + +Evidence is retained under =.data/alignment-20261024/current-pr/=: +=core-output-pump-source-cohort15.log=, +=core-build-support-consolidation-cohort15.json=, +=core-ops-native-suite-cohort15.json=, +=native-core-build-consolidation-cohort15.log= (the failed update), +=native-core-canonical-entry-cohort15.json= and +=parser-consolidation-cohort15.json= (written after each completed step). +The failed Core Linux job log is =core-ci-bf88264-linux-build.log=, job =121175216511=. +Prior Parser =5dec4bc= CI remains historical evidence for the preceding slice. + +* Parser diagnostic contract and cross-platform qualification (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-parser-diagnostic-contract +:END: + +** Accepted Parser qualification + +Current PR13 head =5dec4bc613bc1851d7969b7e2926562464162ad9= is qualified by +[[https://github.com/tao3k/gerbil-parser/actions/runs/40191478156][CI run40191478156]]: completed SUCCESS,12 enabled jobs pass and5 existing +conditional jobs are skipped. CPU/diagnostic lanes and macOS corpus skipped by +the workflow are not separately qualified. No skipped result is called a pass. +Actual checkout merge3ded66d has no changed files relative to the PR head. + +Both platforms complete270 targets/601 backend jobs and issue real publication +receipts; qualified compile entry-to-return is245.4050s (Linux) and217.3164s +(macOS). Both complete =TEST-SUITE-OK modules=151=. Their retained logs explicitly +confirm zero/multiple values, full COST record validation and malformed-record +refusal, evaluator exception propagation/restoration, deferred actual SDK graph +loading and unknown-owner refusal. Both =library-init= owners and the15-case +=compiler-process= owner pass. Both unpadded/padded6s backpressure controls and +existing failure-propagation/silence-watchdog controls pass without relaxed +limits. Two compiler workers, existing heap/watchdog envelopes and the absence +of a Parser180s build cutoff remain unchanged; no Gerbil/SDK source is modified. + +The source-level and package-entry fixes below are retained with their failed +precursors, not replaced by successful retries. This closes the requested Parser +slice and its current-head CI, not every historical performance hypothesis, +root dependency propagation, Aitia review or delivery/mirror publication. + +** Implementation and retained investigation + +The next Parser-only step updates =t/compiler-process-test.ss= to require the +existing complete =COMPILER-COST= record after evaluation events, rather than +expecting only two event lines. Decimal and exponent clock representations are +accepted; every cost field must parse as a nonnegative real. Missing, malformed, +negative, duplicate and trailing records are rejected. The actual zero/multiple +return values remain asserted independently. An evaluator exception control +checks the exact propagated sentinel, cost emission without a success event, +and restoration of the caller's importer/evaluator. Existing admission refusal, +trace restoration, overlapping evaluation, child-failure and pipe controls remain. +No production compiler/SDK, resource policy or source pin changes are made. +The change is committed to existing Parser PR13 at +=c03135c970f6d7786c2035f0b87bb2b71505871f= (one test file). + +The first local full-module attempt confirms the new cases but fails the existing +runtime-CLI probe because the qualification helper has not yet been built in this +prefix. Exit0 plus module/harness markers is insufficient: final =OK= is absent, +so this attempt is FAIL and retained. A helper build attempted from a different +source checkout is correctly refused (generation/source is not current). Using +the actual strict-receipt owner checkout, the existing =just build-qualification= +entry passes in15.05s with8 targets and a real publication receipt. The complete +candidate test module then passes in11.08s: module, harness and final =OK= are +present and no harness error is recorded. These are local results, not remote +head acceptance. + +The previous head's Linux semantics failure is the exact output mismatch. Its +macOS semantics lane fails independently in the existing unicode-backpressure +control: six-second completion,4,069,471 captured bytes and pending child status. +That scene is retained separately; the compiler assertion fix is not a repair of +that timing failure. The padded/unpadded byte totals, deliberate1.2s reader pause, +0.8s idle and six-second completion controls are not weakened or removed. +A local unchanged native process-control run also fails (28.70s overall): cold +concurrent identity, argv/exec refusal, silence, continuous output, closed output, +error classification and escaped-session isolation pass; unicode flood fails +before its ready file appears (six-second fence,20 captured bytes). This is a +separate startup observation, not the old remote near-completion failure, and +neither is fixed by the compiler assertion change. Both remain explicit pending +items; successful retries will not be labeled a causal performance repair. +A separate unsuspended flood diagnostic retains the CLI's6s/0.8s settings: +exit0, CLI-reported elapsed5.2934s and whole-process10.26s. Read-only samples show +content hashing at3s and native dyld cleanup/dlclose at7s. The outside fixture +clock includes startup and process teardown in addition to the CLI's admitted +operation clock. Sampling can perturb timing; this observation is diagnostic, +not qualification or a causal fix for either prior failure. No clock has been +widened and no destructor, source guard or negative control has been bypassed. +Run40185104230 at c03135c completes FAIL: all three Rust jobs, both whole prepare +jobs, Linux corpus and both platforms' FFI/generation jobs pass. Both semantics +lanes reach =library-init-test.ss= and hit idle5s. Intentional failing/quiet +fixture outputs are negative controls, not additional defects. Strict logs each +show270 frontend targets,601 backend jobs and real publication readiness; +compile elapsed is255.2299s/264.9685s (Linux/macOS). Checkout merge528ed9d has no +changed files relative to c03135c. Both native process-control steps pass on this +cohort, without retroactively admitting prior failure scenes. + +** Spec-query diagnostics and completed disposable children + +Follow-up commit =961b7d72335db9af0d63eea0c40b6ea311fd2978= changes only +=t/library-init-test.ss=. SDK =run-process= inherited stderr writes to the native +FD, bypassing the Worker's Scheme output pipe. In the failed Linux transcript, +the owner is last observed at10:50:17.1518UTC and times out at10:50:22.5527UTC, +although genuine SDK import completion4600 is printed at10:50:21.3199UTC. +This is a diagnostic ownership/channel defect; the child is doing real work. + +The SDK coprocess now forwards actual stdout/stderr lines to the supervised +Scheme diagnostic port. The SDK's real spec datum goes into a private temporary +file instead of sharing the diagnostic stream. Status must be0; the parent +requires exactly one nonempty datum, checks the same full catalog/FFI contents, +and removes its private file. No fake heartbeat or new timer is introduced. +A full native gxtest passes in35.07s. Forwarding alone is NOT accepted: the actual +Worker still fails its unchanged5s idle gate (57.89s whole attempt). That scene +contains a complete10,907-byte datum written4.23s before the final failure log. +The datum and failed log are retained separately. + +The completed disposable spec child now reuses the EXISTING +=test-child-process-exit!= fixture after the SDK spec operation and data-file +close. This is the same completion boundary used by the existing suite runtime; +Gerbil/SDK teardown is not added to the spec query's work. No new native binding, +SDK source edit, clock change or admission bypass is introduced. Normal child +errors still fail before this success-only exit and status/datum checks remain. +The actual Worker gate then passes in19.25s with =TEST-SUITE-OK modules=1=, +under the original owner90s/idle5s and local120s/1GiB envelope. + +A broad local worker-control attempt is refused by its missing prepared +=worker-control= fixture; this is retained as a prerequisite failure, not a +negative-control pass. Direct existing controls then qualify the required +behaviors: intentional failing assertion exits70 in9.14s with the target case +and batch-failed marker; actual silence exits70 in11.15s with the target case +and idle-timeout marker. Neither clock nor fixture behavior is changed. +Two compiler workers, existing heaps and the absence of a Parser180s build +cutoff remain mandatory. + +** Public test-entry prerequisites and current head + +Commit =152c4f4aea85d149b029f299478b7e6831c172cf= declares the existing +=build-test-driver= prerequisite for =test-source-contracts= and +=build-test-support= in =justfile=. Standalone source contracts therefore prepare +the exit helper before gxtest, without compiling unrelated benchmark helpers. +A native Just dry-run checks that order and minimal dependency boundary. No +recipe deadline, heap or worker setting changes. This prerequisite completes +the adapter's public invocation contract instead of assuming CI prewarming. +CI run40187204807 at961b7d7 is superseded/cancelled by the existing workflow +concurrency policy and is not accepted. Run40187511440 at152c4f4 fails before +full Scheme test execution: Linux's AST rule rejects the added direct diagnostic +=display= in a test file; macOS's unchanged6s full-CLI backpressure control reaches +ready at approximately5.57s and cannot finish its deliberate1.2s pause before +that boundary (85,280 captured bytes). These failures are retained and not +replaced by retries. + +** Reuse streaming diagnostics and defer the SDK graph boundary + +Commit =1c9a4d9c0ad68faf47849f3e0d248b513a6aea9f= replaces the added custom +coprocess bridge in =t/library-init-test.ss= with the EXISTING =run-build-tool= +text stream adapter. The source AST prohibition remains unchanged. No new +printing assertion, logger framework or stdout/stderr protocol is introduced. + +Source-level observation shows =library-publication= eagerly loads +=gerbil/tools/gxpkg= even when an unscoped reader never queries package ownership. +The SDK manager imports CLI/network/template dependencies. Package-level +=src/build-support/package-inputs.ss= now invokes that SAME SDK module and its +qualified public procedures only when an actual graph operation is requested. +There is no new graph resolver, metadata cache, registration or SDK modification. +Scoped owners still use SDK list/plist/root/reverse-dependency functions and all +existing currentness, direction, namespace and pre-expansion refusal checks. +Unscoped readers still hash and validate their full declared inputs/products; +the change defers unused module initialization, not source admission. + +The added existing policy-suite scenario checks a fresh child has no manager +before a graph request, does load the SDK manager afterward, and refuses an +unknown owner. A separate native-source probe confirms the actual registered +Parser owner and nonempty real metadata closure (6.87s). AST, package-policy and +spec-query modules pass together in21.01s with module/harness/final =OK= and no +harness error. A first new fixture reader-parenthesis error is retained separately +and corrected before commit; it is not treated as a qualification pass. + +A standard strict build from the pushed Parser project source runs in the SAME +existing native prefix, with an unscoped project producer as in CI. No private +runtime or dependency patch is created. Registered Parser source remains0dab146; +this local publisher is explicitly the separate checked-out PR project source, +not a claim that the registered package pin has already propagated. Core0353d86, +two compiler workers,2GiB and no Parser180s cutoff remain unchanged. +The strict project cold build passes in210.95s (270 targets/601 jobs, compile +entry180.7483s, real receipt, no survivors). A fresh native process admits that +actual generation before/after a real reader call and verifies the SDK manager +is absent throughout (11.82s). This is a functional dependency/currentness check, +not a6s performance qualification of the larger local prefix. Linux whole +semantics at1c9a4d9 passes in run40190099011; its logs are retained separately. + +** Active SDK test-driver entry alignment + +Sequential public helper invocation exposes a real configuration mismatch: +qualification publishes, then the driver re-enters =gerbil env= even though the +caller already activated it. The source guard correctly refuses changed +=GAMBOPT= mappings. Commit =5dec4bc613bc1851d7969b7e2926562464162ad9= makes +=build-test-driver= use the SAME existing =gerbil_test_launcher= selection as +other helpers. No mapping normalizer, environment comparison, heap or clock is +weakened. The two helper publications then pass in47.47s with two real readiness +markers. The actual public =just test-source-contracts= entry passes in86.87s, +including its declared driver prerequisite and all four module/harness/final +=OK= checks under the unchanged test envelope. +The latest head differs from1c9a4d9 only in this launcher line. Current remote +qualification run40191478156 at5dec4bc is completed SUCCESS as summarized above; +preceding runs are not relabeled as that head. Root dependency propagation and mirror publication remain outside +this Parser-only step. + +* Parser-first: remove the build cutoff and align Yuanxu (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-parser-first-no-cutoff +:END: + +The user explicitly supersedes the earlier Parser180s requirement: solve one +layer at a time, remove that build cutoff and first align Parser to latest +Yuanxu PR. Two workers and the existing heap limits remain. This change is +restricted to Parser; previous failed scenes and their historical policies stay +retained, rather than being retrospectively accepted under a different policy. + +Live PR19 head remains =0353d86ac017442506e89617e86e6ef778a3111e=. Parser's +single native production dependency already names that exact complete revision; +POO remains inherited. No arbitrary pin change or floating-branch substitution +is made. Existing Parser PR13 =0dab1467a6a6457e82f2751f5d1e60506444934e= removes +180s from the three native build shebangs, strict base writer, qualification +helper builder and catalog query. Native gxi/SDK/Core still own compilation. +Test120s/idle controls, evidence-custody deadline and other package limits are +unchanged. The README also corrects the old four-worker statement to actual2. + +Static entry checks, shell syntax and diff checks pass. The public SDK update +API selects the exact Parser head in7.77s and verifies the registered checkout; +that is source acquisition only. The native strict entry runs without a package +cutoff and with2 workers/2GiB; no outer180s diagnostic wrapper is used. Its first +attempt fails before Parser compilation (exit70,59.93s,zero targets/jobs): the +previously interrupted Yuanxu build left =admission.ssi= without its loadable +=admission~1= product. The loader consequently tries generated Scheme as a source +module and reports an illegal =declare=. This is a prerequisite product failure, +not a Parser deadline or a completed cold build. Complete prefix custody captures +19256 files with zero changes and archive SHA256 +=4609b77208987235e8df10e6cbff0e1480e7c03b2476f137174824ecbd66d60f=. + +A native incremental Yuanxu prerequisite recovery uses its unchanged180s envelope; +no Core source/policy is changed and no clean is used to discard the failure. +Its observer initially cannot read =ps= in the sandbox; the already launched +bounded command is observed separately rather than duplicated. Its original exit +status is unavailable, so even successful product loading will not be described +as cold-build acceptance. The native recovery reaches its final package-build +log and produces the previously absent =admission~1.o1=. Independent import +verification passes in29.63s, with =PARSER-PREREQUISITE-IMPORTS-OK=. Parser-owned +clean passes in72.97s, with =LIBRARY-CLEAN-READY=. A fresh strict Parser attempt +then passes without a package deadline: exit0 in467.83s,270 frontend targets, +601 backend jobs, qualified compile entry-to-return416.8945s, and +=LIBRARY-PUBLICATION-READY=. Actual compiler environment records workers2 and +max-heap2G, retaining the existing multiple-host flag policy. One-second sampling +observes at most two owned GSC processes, and no owned process survives exit. +This is completion timing, not an isolated throughput comparison: the observer +also sees up to three foreign GSC processes on the host. No Gerbil/SDK or +compiler policy change is involved. The original failed scene +and the later successful cold generation remain separate records. The existing +four-module source-contract gate passes in40.42s under its unchanged120s/1GiB +policy: four =MODULE-OK= markers, =HARNESS-OK= and final =OK= are all present. The recovery +is incremental prerequisite restoration, not a repaired Core cold-build claim. + +Remote Parser run40183071009 reports its Linux /Build parser and language packs/ +step successful (10:03:52--10:07:13UTC,201s including clean and validation), then +continues to optional command compilation. macOS also completes that step +(10:05:53--10:12:42UTC,409s). Linux's whole prepare job succeeds. The completed +Linux job transcript records270 targets and601 backend jobs, qualified compile +entry-to-return194.2406s, and =LIBRARY-PUBLICATION-READY=. The two-worker build +is complete beyond the old cutoff without weakening validation. These are build +and preparation results, not acceptance of all semantic/FFI/corpus tests. +Linux semantics subsequently fails in =t/compiler-process-test.ss:136=: its +exact two-line diagnostic-output expectation predates the existing additional +=COMPILER-COST= line. The log explicitly shows that output mismatch and +=MODULE-BATCH-FAILED t/compiler-process-test.ss=. Earlier intentional assertion +and timeout messages belong to successful negative controls and are not counted +as defects. Preserve this distinct follow-up: align that diagnostic contract test +with the current output while retaining zero/multiple-value and error controls; +then qualify its new head. No all-green CI claim is made for this Parser head. +The run's head is0dab146; actual actions/checkout is merge9bc87fd. Its source +comparison against the PR head reports no changed files and is retained +separately; the merge identity is never mislabeled as the head commit. + +The Parser gate must retain every compiler target, complete product/currentness +checks, issue its real receipt, and leave no owned process. Elapsed time under +this new policy is diagnostic, not evidence of meeting the retired180s SLO. + +Orgize/ASCENT/Agentic source propagation and root commit/mirror synchronization +are deferred while this Parser layer is checked. The root's prior candidate +manifest is not silently rewritten to claim the new Parser is already delivered. +Core/Yuanxu build limits, source, SDK and runtime policies are not modified here. + +* Native CI bottlenecks, AMFI observations and package dependency boundary (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-native-ci-cohort09 +:END: + +** Exact-head Parser failure and cost attribution + +PR13 initially remains370e6f2; CI run40175843784 fails the unchanged180s +strict cold fence on both operating systems. Restricting the retained logs to +compiler-enter onwards yields270 frontend targets on each platform, with596 +backend starts on Linux and447 on macOS, versus601 for the complete local +writer. CI ingestion timestamps place first/last frontend messages at18.65/ +47.69s (Linux) and26.38/76.94s (macOS), and first backend messages at49.17s/ +28.33s respectively. Ingestion may buffer output: these are not exact per-job +execution timestamps. Neither platform emits compiler-return. Thus the actual +failure includes unfinished backend work, not merely final receipt hashing. + +A direct unchanged-policy cost probe performs3000 actual native import-admission +checks in4.253s (17.94s including launcher/imports). It does not replace a complete +build profile, but does not support treating those checks alone as the dominant +macOS backend deficit. No check is omitted, cached by mtime or normalized away. + +Existing PR13 =7fb57b3= adds cumulative admission/reporting cost, outer evaluation +cost without nested double-counting, and the EXISTING runtime parse-cost observer +at the Core/SDK entry. The counters are not an additive partition or admission. +Direct source controls preserve multiple values, exact exceptions, rejection +before the protected native importer and native importer results (2.16s; a later +unchanged smoke observation5.51s). Qualified entry import passes6.12s. The current +four-module source-contract attempt FAILS its120s fence at123.44s without module +completion markers; it is retained and never called acceptance. Prior27s success +cannot transfer after upstream product rebuilding. + +A fake failing launcher control exercises the real Just failure path: original +exit1 remains1,35334 members are archived in35.71s, checkout credentials/SDK +files are excluded, and the manifest explicitly says admission=none. The existing +prepared-products restore REFUSES this archive before extraction (0.74s); the +active receipt is unchanged. This is an exit/custody control, NOT a real compiler +failure or performance experiment. Future strict CI failures upload their native +products as well as logs; past remote product scenes cannot be reconstructed. + +** Orgize original loading wait: stronger evidence and falsified signing shortcut + +Read-only macOS unified logs for the preserved original failure window contain +140 distinct Parser native-object paths with280 AMFI messages: missing CMS blob +and CT-signature diagnostics. They overlap the saved dlopen/mapSegments/fcntl +stack samples and actual installed image paths. These observations establish +code-validation activity along the blocked load path; they do NOT establish +corrupted bytes, a unique kernel/cache cause or a reason to weaken OS policy. +The existing linker ad-hoc signatures already pass codesign verification. + +The frozen compiler-profile~0.o1 input is53160 bytes, SHA-256 +=250798de40810225ba1dadfeb841def303415b76fdf852d4fb8dc8d74863e859=. +An initial fixture incorrectly renames its basename and fails native entry-symbol +lookup; that invalid control is retained. Corrected copies preserve the original +basename and existing SDK/prefix (fixture outputs are not GERBIL_PATHs). In +original/explicit/explicit/original order, mapping-only loads return in9.275/ +13.303/7.833/7.006s. The explicit ad-hoc signature changes bytes to SHA-256 +=760e27c92cc43b5687bd2cd00a07aedeba55e45d322e74dab22faf0e34e999e6=; +AMFI/amfid still reports ad-hoc/unknown-chain trust diagnostics. Raw object loads +warn about uninitialized imported variables; exported compiler functions are not +executed. These are mapping controls, not functional Orgize validation, and they +do not recreate the historical kernel cache. No repeatable signing advantage or +complete performance A/B is claimed; installed products are NOT re-signed. +Gerbil/SDK, xattrs and system security policy remain unchanged. + +** Native installation versus editor indexing + +Orgize exactc8a0928 CI run40176583046 passes dependency compilation, then fails +in automatic =gxtags= with Heap overflow under the unchanged2GiB maximum. This +is an editor-indexing failure after package compilation, distinct from strict +Parser cold issuance and the old Orgize loading wait. Its raw remote logs are +retained; the old ephemeral remote product directory was not uploaded. + +The package entry now follows Agentic's EXISTING SDK script API route: +=build-dependencies.ss= reads the current native =pkg-plist "."= and invokes +=pkg-install= inside =with-pkg-build-env=. The SDK retains revision/tag handling, +recursive dependencies, native builds and failures. Optional editor indexing +moves to explicit =just package-tags= with its own unchanged resource boundary. +No compiler target, input/currentness check, custom resolver or SDK patch is +introduced. Empty/malformed/revision-conflict controls pass3.90/3.95/4.38s; +checkout and tag bytes remain unchanged under the negative controls. + +Actual installation for the then-declared Parser370e6f2 exits0 with +DEPENDENCIES-READY in170.09s total: POO7s, Core20s and Parser131s observed +individually, each native child exports2 workers, each remains below180s, and +no gxtags or surviving owned process is observed. The copied observer wrongly +expects six packages, so its original aggregate FAIL and immediate archive +(fd534b61cac58c1e4723ed17eb0b8f1ddee316ea27dfa8471300c7013fe2087c; +19854 files, zero changes during capture) remain retained. An explicit offline +audit corrects ONLY that coverage assertion to the declared three packages; +it does not rerun installation, conceal a package failure or claim cold repair. +The actual backend-child flags were not sampled by that observer. This result +cannot transfer to the later source revisions below. + +** Frozen next dependency cohort and unresolved gates + +The concurrently advanced Agentic PR now declares Core gitlink0353d86. Its diff +from productionafc447d contains only tests, their inventory and documentation. +Parser PR13 =36f62d9= aligns its native Core declaration to0353d86; ASCENT does +the same through its existing PR. POO stays the inherited29c58aa. This freezes +an observed source baseline, rather than substituting newest floating checkouts. + +Orgize also had a real source split: its Gerbil declaration selected370e6f2, +while Cargo selected153572a for Parser runtime/artifact. The existing alignment +gate requires the exact same Parser checkout. Native declaration and Cargo/lock +projections are being aligned to the same published Parser head, with ordinary +Cargo updates. Only dependency configuration changes; Rust implementation is +untouched. The initial missing-Cargo-PATH failure is retained; the existing +absolute Cargo binary is used, without installing a toolchain/environment. + +Latest Parser diagnostic CI is queued at observation; there is no new Linux or +macOS acceptance. Source metrics must distinguish reporting, admission, expansion +and backend completion before claiming a causal latency repair. New native +installer correctness, old OS loading observations, successful mapping controls, +strict cold issuance and root C/Q/SysML acceptance remain separate obligations. +Root commit and hardenedlinux/tao3k dual push remain closed until the complete +new cohort and project gates pass. No retry, clean or changed-source success is +promoted to a repair of an earlier failure. + +** Subsequent same-budget results and precise current blocker + +The frozen native SDK API update to Core0353d86 / Parser36f62d9 / ASCENT6b1ec87 +returns0/12.34s, with exact checkout heads. This is fetch/update only. Subsequent +actual declared three-package installation passes0/58.92s; POO6s/Core20s/Parser19s, +actual child worker exports2, a real GSC host-policy sample matches, no editor +indexer and no survivors. Native/Cargo source-alignment gate passes0/0.78s. +Orgize PR18 =330f48c= publishes the installer boundary plus native/Cargo/fuzz +source configuration, using ordinary Cargo lock updates (only the two Parser +Git source records change). No Rust implementation or extra direct dependency +is introduced. Agentic projection/lock updates are prepared but not yet accepted. + +A new local Parser36f strict run retains the INTERNAL180s package fence; custody +runs afterwards, so213.07s overall is NOT a widened build timeout. It fails124 +through Just/70 through SDK,270 frontend/557 backend starts, no compiler-return +or publication. The automatic failure archive is retained; a second immediate +full-prefix scene has19450 files, SHA-256 +=11c4973556350a3e175ed8b9e0bf053ebd2cdd0ae39841437c908b1013302cae=, +zero changes during capture and no survivors. Partial native counters at2967 +imports show43.592s elapsed,1.469s admission and0.03135s reporting. These +measurements do not support dropping guards or suppressing logs as the fix. +Concurrent local diagnostics/lock projection and foreign workload are not a +controlled performance A/B; no unique performance attribution is claimed. + +An isolated GSC experiment retains the observed SDK relocation mappings, exact +host flags, optimization, max2GiB and worker environment2. After two retained +invalid fixture invocations (option ordering and missing relocation mappings), +the valid original/32MiB-floor/32MiB-floor/original sequence gives small-unit +0.661/0.785/0.650/0.648s and larger HCL-unit8.908/9.702/6.911/7.752s. All four +outputs have identical hashes per input. GC counts fall11->2 and24->17, but +latency has no repeatable advantage. Production min/max heap options are NOT +changed. This is a micro diagnostic, not package acceptance or OS-cache replay. + +PR36f CI run40179315837 now has a successful Linux preparation job. Its macOS +preparation fails EARLIER in Core dependency build with status31744/124, before +the strict Parser entry. It is incorrect to label this macOS event a new Parser +cold180s failure. Actual CI checkout is merge17670b8077f832c5f76cfb75e60aa46ac63ae606; +the GitHub comparison to PR36f reports no changed files. Record both identities, +not a fabricated PR-head checkout. Linux products and logs are retained under +the actual merge identity; no macOS strict products existed to publish. + +Core's same-source default-versus-existing-Parser-host-policy cold comparison +is now running with2 workers,2GiB and separate unchanged180s clean/build entry +fences. This tests the actual preceding blocker; it does not assume the earlier +local SINGLE_HOST147s counterexample explains portable CI. Failed operations +are archived before the next case. No default compiler strategy is changed +without the comparison and native correctness/currentness controls. + +The new diagnostic evaluation counter also needs to account for overlapping +compiler workers, not merely lexical nesting. Its pending refinement uses a +short mutex only around counter updates and counts the union of active +intervals. Value/exception/import-refusal controls pass2.40s; a synthetic crossed +schedule retains the trailing active interval (0.155s), without claiming real +compiler performance or source authority. This is a diagnostic correctness fix, +not a deadline repair; it remains separate from the frozen36f observations. + +** Core strategy control outcomes: no supported compiler-policy repair + +Both Core0353 same-source cold BUILD operations fail their original180s fence: +default181.43s/252 frontend/432 backend starts, candidate181.30s/252/392. +Their preceding clean operations are16.83s/29.96s under separate unchanged +fences. Owned C ancestry confirms174 O1/SINGLE_HOST observations for default +and127 O1/MULTIPLE_HOSTS observations for the candidate. Actual simultaneous +GSC count never exceeds2. Thus the requested policy was applied; it did not +produce a passing package control. No production compiler policy is changed. + +Default's frozen scene has19345 files, SHA-256 +=5aaa0d896bee8a2bb3c82cdf4c558c9bed0d234195c28a10b87e84758263dc16=; +candidate has19308 files, SHA-256 +=f6fecc83fe26e06d560b0fc51c58057898a25cf78796e22ff111cd9166cde980=. +Both observe zero changes during capture. Initial timeout teardown leaves two +owned wrapper/GXI PIDs per case; TERM is sent and subsequent exact-command PID +checks confirm all four gone. Neither scene is cleaned before capture. + +One-second owned-process samples place default's first GSC at20.15s and the +candidate's at28.40s. Longer observed units include default +=poo-clos/syntax~1=14.10s, =test-observation~0=6.99s, +=generic-syntax~1=6.58s and =object-family/syntax~1=6.42s; candidate's longest +observed unit is =object-family/syntax~1=8.71s. These are sampled lifetimes, +not exact exclusive CPU or proof of a unique cause. They identify native macro +and aggregate backend work; no single global stuck job is established. Foreign +workload is not controlled, so relative wall time is not a clean performance +ranking. Default recovery is now a separate native clean/build, with no claim +that any subsequent recovery pass repairs the cold SLO. Until it completes, +the active prefix is incomplete and has no current Parser admission. + +Parser PR13 =2afad27= publishes the overlapping-interval diagnostic correction. +On the SAME synthetic crossed schedule, old36f records only27.9 microseconds +and loses B's150ms trailing interval, while the new counter retains155ms. The +old-result parser first mishandles scientific notation; its failed raw assertion +is retained and an offline audit corrects only parsing, without rerunning the +operation. This is a positive/negative diagnostic-correctness control, not +compiler throughput or authenticated source evidence. No runtime memory, +optimization, target-set or SDK policy is altered by that correction. + +** Current candidate and final unclosed source/acceptance state + +Orgize734b338 keeps native/Cargo/fuzz Parser bindings at2afad27; its existing +alignment gate passes1.50s. Agentic4a1f70d publishes that Orgize revision with +ASCENT6b1ec87 and Core gitlink0353d86. Existing projection tools derive archive +hashes; Bazel lock update, sync-lock and dependency-contract checks pass. Root +=gerbil.pkg= now names ONLY that full Agentic candidate revision. This is an +uncommitted candidate selection, not a qualified installation, accepted C, +restored runtime or transfer of earlier36f successes. + +Default Core production recovery also fails its180s BUILD fence (182.06s +including teardown),252 frontend/341 backend starts. Its immediate default-only +failed scene has19256 files, SHA-256 +=4609b77208987235e8df10e6cbff0e1480e7c03b2476f137174824ecbd66d60f=, +zero changes during capture. The prefix remains INCOMPLETE and unadmitted; +no mixed-mode experimental prefix is declared production-ready. Subsequent +recovery cannot be called a causal repair of either cold deadline failure. + +Implemented and positively/negatively controlled changes are the editor-index +installation boundary, source-pin/lock alignment, failed-product custody and +diagnostic interval correctness. Still unclosed are Core/macOS dependency cold +throughput, Parser reliable cold throughput, the historical Orgize load-wait +cause beyond observed AMFI validation, new full-chain build/load/restore and +project C/Q/SysML gates. Main repository commit and dual push have NOT occurred. +Do not lower optimization, omit targets, widen resource fences, re-sign installed +outputs, alter SDK/OS policy, or treat a retry as the missing repair. + +* Preserved-scene continuation and latest PR qualification (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-preserved-scene-qualification +:END: + +** Evidence custody and unchanged execution conditions + +Before alignment, =failure-scenes/pre-latest-pr-20261025-01= preserves17219 +installed library files and root publication receipts in an evidence-only tar, +with per-file bytes/mode/mtime and package HEAD/status metadata. Its archive +SHA-256 is =07a476f54251a5077d66ed556637d2da37f64342adb1184f810c2ed3e349f060=; +no file changes during capture. This is the POST-clean/observed-build state from +the preceding continuation. The original pre-clean Orgize failure products were +not archived then and cannot retrospectively be claimed preserved. Historical +failure logs/receipts remain retained. Every new failed cold run must be archived +immediately before recovery or clean. Archives are never load environments. + +CI/native worker count stays2, package deadline180s, maximum Scheme VM heap2GiB, +ordinary outer test deadline120s and existing focused heap/idle controls. Gerbil +and the installed SDK are unchanged. OS sampling and completed-import reporting +are diagnostics, not liveness heartbeats or authority. Clean/retry success must +not be classified as causal repair. + +** Latest upstream source baseline and ownership + +The live PR refresh observes Coreafc447d9804ebb232d549f1934d55239a80c3868, +Parserdb982ce9d422d6e83f21cada256dc808ef8a6999, +Orgizebffe77af99f1263c97475b2a859ea2ee8c43fa07 and +ASCENTa1feea38b6106c0910b79d42a48ce62115ee43b5. Parser/Orgize/ASCENT already +publish their matching parent pins. Core still declares POO29c58aa; the observed +newer POO PRae1afea is not an inherited dependency and is not substituted for it. +Agentic PR34 remainsbc08d58 at this observation, with the earlier coherent cohort; +the root's single direct declaration remainsbc08d58 until formal propagation. + +Core's new published change shares the native confined context and input registry +between eager publication and deferred role resolution. Its regression demands +that a role's private object and the same object imported by another role retain +identity, and that fresh source sessions reject stale roles. This is a concrete +upstream mechanism, distinct from mere timing variation; local validation must +still establish its effect, retain currentness/name/source refusal and avoid +claiming it uniquely explains a lost historical Agentic failure. This project +changes no Core Reader, POO runtime or SDK implementation. + +The prospective native update returns70 after checking out all four intended +heads. The failed SDK operation is retained rather than reported as installation +success; actual heads match independently. Coreafc's native package compilation +passes0/38.12s with2 workers/180s/2GiB. The prospective prefix is NOT a root +qualification or an accepted C. A strict Parser run now observes the actual +package entry, current Program/source paths and phase events, with bounded +read-only parent stack samples. Failed products/receipts are frozen before any +repair. Source, binding, execution and acceptance results remain separate. + +** Frozen failures, actual loading and counterexamples + +The strict Parserdb982ce run fails70/183.80s including launcher teardown:270 +frontend targets,391 backend starts, no READY. Its namespace was actually cold. +At90s the parent is in native compiler optimization; at160s it is waiting in +select. Thus this failure is not confined to the final snapshot. Both exact-head +CI preparation jobs in run40170319385 also fail in strict Parser at180s. No +worker, deadline, heap, target inventory or optimization change is used to hide +these failures. The immediate frozen library/receipt archive contains17065 files, +SHA-256 =a059c8d8fb3c922343adfaa25d37cbb9304e6e0f4049242f5b0b631958783491=, +with zero changes during capture. Only after capture does native recovery run +and pass0/77.02s; this is not cold issuance or repair. + +The two preserved library manifests have3286 and3077 native object families, +respectively; neither has a noncontiguous generation chain. A stale-family-hole +explanation is therefore unsupported for these scenes. Local timing regression +also cannot be attributed solely to the Core source change: cohort07 samples +contain216 foreign-workspace GSC process observations, versus6 in cohort06. +This records contention, not a quantified causal explanation or an excuse for +failed CI. Selected Parser C compiler observations retain the actual +MULTIPLE_HOSTS override and O1 settings. + +Before the original native Orgize package command, a complete active-prefix +archive (excluding source checkouts, whose HEAD/status/recursive submodules are +recorded) captures19443 files, SHA-256 +=b80179030a1a6b35adef7edeae00e03c0945b8c694155d8a23b9780adf08bdab=. +The command is =gerbil pkg build github.com/tao3k/orgize=, without clean or an +importer override. It fails124/180.71s,29 frontend targets/50 backend starts, +before GENERATION-OK. Its actual GSC child exports2 workers, the unchanged2GiB +maximum and the expected host flags. Read-only samples at60s and150s put the +parent in =dlopen -> mapSegments -> fcntl=, with low CPU. Loaded-image records at +15s/120s contain no native bundles outside this prefix or the installed SDK. +This is evidence of loader/kernel validation work, not proof that one particular +signature is invalid or that all build time is there. Two sampled Parser +bundles already have ad-hoc linker signatures and pass read-only strict +codesign verification in0.010s/0.007s. No signing, xattr, SDK or system policy +is changed. Verification may warm caches and is not an acceptance run. + +The failed Orgize prefix is immediately captured as19501 files, SHA-256 +=9719ffb9278fa6ffc165d0b82d6521d68d77d75479fef47277f2d882c0979359=, +with zero file changes during capture. The outer timeout initially leaves its +GXI child pending; TERM is sent and the later read-only PID check confirms it +has exited. This observation motivates a package-owned deadline, not a longer +external timeout. Root commit and dual push remain closed. + +** Focused source authority controls and native clean ownership + +Core's large publication test fails the auxiliary120s fence without completed +harness markers. The existing deferred-reader controls pass65.38s. Shared role +identity/fresh-epoch cases are moved into =t/module-role-context-test.ss=, +registered in the existing full-test driver, and paired with name/byte mutation +controls. The final four-case entry passes33.48s at2 workers/2GiB/outer120s, +with native timing records, MODULE-OK/HARNESS-OK/final OK and no errors. Both +public-name redirection and byte mutation produce the EXACT historical +=public dependency source or native identity changed= message through the real +publication Reader; the protected callback is not entered and exact restoration +readmits. This is published in existing Core PR19 as c63188c, a test-only change +over productionafc447d, not a Reader change or a timing repair. + +The actual Agentic =nix-contracts.ss= predicate control passes5.20s at2 workers/ +2GiB/180s. Unmodified source SHA-256 +=34de5fe624cf7a73d42f96d442135aa4b4207b45ede07fde85935527b5171a9b= +admits at its registered source path, refuses when native name priority resolves +to its installed SSI, and readmits after exact path restoration. Actual Reader +runtime modules load from this prefix's =yuanxu/module-system/source/reader~0.o7= +and =~1.o7=. This closes the present predicate/control verification; it does not +reconstruct the lost historical schedule or replace a complete Agentic build. + +Orgize's existing clean action imports the complete grammar and constructs both +unit plans before branching to deletion. Thus clean can itself activate the +compiler and warm native loading. The proposed entry-only refactor separates a +small dispatch/product-ownership module from compile-only =fold-generator.ss=; +compile still uses the original compiler, complete units and optimization. +Cleanup derives only the two declared generated families (including canonical +part indices) and delegates exact native generations to Core's existing cleaner. +It preserves source files, neighboring products and malformed lookalike names; +it adds no publication ledger or SDK implementation. + +The initial forbidden eval/import-hook comparisons are INVALID controls: the +old entry still constructs units and completes cleanup without those hooks +seeing every compiled-library activation. They remain retained as failures and +are replaced by the SDK's actual loading registry. Under matched1GiB/2-worker/ +120s controls, old publishedbffe77a activates the event-fold compiler while +cleaning; the candidate performs the same deletion without that activation. +Both retain the neighboring product. Their23.28s/9.83s observations are not a +cold-build performance repair. The final existing four-case ownership suite, +now checking the actual loading registry, passes15.69s with its unchanged5s +silence watchdog. Earlier syntax and silence failures remain recorded. + +Native Orgize, ASCENT and Agentic entries also lack their own180s shebang fence; +the proposed headers align them with POO/Core/Parser. Parser's strict entry and +Orgize main gain only real command/phase-return records, with meta/spec output +kept SDK-readable. These are resource-ownership/observability changes, not a +claim that compilation or cold loading now meets the deadline. The entries and +new generator split still require publication, original-entry compile and +coherent dependency-chain qualification before root acceptance. + +Parser's existing source-contract entry currently passes library-init, +package-policy and test-style modules, including the unchanged complete catalog +and spec output; its aggregate FAIL is retained because build-product controls +require the DECLARED optional ASP development dependency, absent from this +production prefix. No stub or new production dependency is supplied to make it +pass. Correct development acquisition and remaining full-source checks remain +separate from production package ownership. + +** Published entry changes and remaining qualification boundary + +A second live refresh observes Agentic PR34 =9cd1d2b= with Core gitlink +=afc447d=; ASCENT PR1 advances to =cdceb8f= with interface/admission changes. +Those changes are read before entry edits are reapplied. The formal root pin +still names =bc08d58=; this observation does not accept a new dependency cohort. +POO remains selected by the published Core declaration, never by newest-PR age. + +Orgize's cleanup split is published in existing PR18 as =0d421a8=, then +=703e6b6= binds Parser =370e6f2=. The latter publishes only qualification +entry/return observations in existing PR13. ASCENT =1855e89= retains its new +interface changes and adds the package-owned existing180s deadline. A mistaken +push using local alignment branch names is corrected by fast-forwarding the +existing PR branches and removing only the two just-created remote branches; +no force push or replacement PR is used. + +The new Orgize generator's actual public compile action passes0/94.87s at +2 workers/2GiB/180s:97 targets,194 backend starts and GENERATION-OK after the +original full runtime-product checks. Its explicit output fixture is a product +directory, NOT a GERBIL_PATH, SDK, source overlay or alternate load environment. +This validates compile behavior after separation, not whole-package performance +or cold qualification. The prior original-package failure remains controlling. + +The maintained Parser =prepare-dev= operation initially fails DNS in the +restricted environment; that failed receipt is retained. Network-enabled +acquisition uses the same native recipe, selected prefix,2 workers,2GiB and +180s. Its result must be inspected before claiming the previously missing +build-product contract module or full source-contract aggregate accepted. + +The unchanged native =prepare-dev= recipe completes0/154.64s. ASP is at its +declared =9ae9bc3=; POO29c58aa, Coreafc447d, Parserdb982ce, Orgizebffe77a +and ASCENTa1feea3 checkouts remain unchanged. The four-module maintained Parser +source-contract aggregate then passes0/27.17s, with four MODULE-OK records, +HARNESS-OK, final OK and no errors. This closes the missing development-input +control; it neither issues strict Parser publication nor closes runtime CLI. + +The native update to published entry heads returns70 with =bad package; missing +gerbil.pkg= for the tagged Core argument, even though the actual Core checkout +contains that file. The operation's receipt is a failure, not installation +acceptance. Independent checkout inspection confirms Coreafc447d, +Parser370e6f2, Orgize703e6b6 and ASCENT1855e89. No uninstall is attempted. + +Orgize703e6b6 then passes the original native =gerbil pkg build= entry without +pre-clean:0/102.98s,118 targets,232 backend starts, GENERATION-OK and no owned +survivors. Actual GSC exports2 workers,2GiB and the expected host flags. Phase +returns are syntax2.31s, fold87.54s and runtime95.78s measured from main entry; +launcher/import overhead is included in102.98s. This is an incremental full +package result after preserved failure and prior diagnostic loading. It does +NOT repair or explain the earlier180s dynamic-loading failure. The unrelated +fixture compile and source-contract passes are not substitutes for cold CI. + +** Latest cold result, runtime controls and remaining causal debt + +Parser370e6f2's strict native cold entry now passes0/177.38s (including +observation teardown),270 frontend targets,601 backend starts and a complete +LIBRARY-PUBLICATION-READY record. Actual workers2, maximum2GiB and host flags +are observed in a real GSC child; no survivors remain. Core/SDK compile returns +after161.08s from command entry. The only Parser change is observability. +Consequently this near-limit pass establishes a valid local generation for this +input set; it is NOT an explanation or repair of the earlier failure. + +Exact-head PR13 CI run40175843784 still fails on both Linux and macOS at the +180s strict fence. Both emit compiler-enter and neither emits compiler-return. +Aggregate preparation counts are271/598 backend starts on Linux and271/449 on +macOS; the extra target includes prerequisite preparation, so these are not +asserted identical to the local270-target inventory. This confirms a remaining +backend-completion deadline failure independently of local retry success. + +The first qualification-helper attempt fails0 acceptance/exit70 in8.96s: +the diagnostic runner incorrectly substitutes1GiB GAMBOPT for the root's +2GiB compiler-child environment. The existing footprint contract correctly +refuses this change before extension. The corrected runner inherits the root +2GiB child environment, while the maintained Just entry still fences its parent +GXI at1GiB; no limit or contract is widened. It passes0/16.07s and issues the +helper extension. The failed runner/receipt remains retained. + +Runtime CLI controls under2 workers/parent1GiB/outer120s and the existing5s +idle fence pass: successful child16.57s, child exit7 mapped to failure7.04s, +and absent required output mapped to failure7.09s. Runtime loading completes +with compiler-import refusal installed. Reader controls pass at current7.59s, +product-mode mutation refusal5.78s, exact restoration6.80s. Temporarily +withdrawing the publication receipt refuses the actual CLI in3.18s BEFORE the +child sentinel is created; exact receipt bytes and mode are restored in finally. +These source/product/admission controls are independent of latency qualification. + +The exact Orgize703e6b6 Linux CI log fails in its Core dependency build (SDK +process status31744 encodes124), before Orgize's own entry. The existing +=ci-prepare= also does not export fixed workers or a dependency-child heap +fence, unlike this repository's controlled native command. Existing PR18 +=c8a0928= fixes only those package entrance conditions: Just exports2 even when +the inherited value is absent,2 or7; production/development native dependency +installation retains SDK mappings and appends the existing2GiB maximum. +Focused1GiB entries remain unchanged. Actual Just export controls and a native +dry-run pass. This is resource alignment, not a Core cold-build speed repair; +its new exact-head CI and actual cold dependencies remain open. + +Agentic PR34 =837eb8604ab1ab08e7a7e5b113566eaf3db486c1= formally publishes +Orgizec8a0928 and ASCENT1855e89 with Core gitlinkafc447d; Orgize selects +Parser370e6f2, Core still selects POO29c58aa. Its existing pin tool derives +immutable archive hashes; the indirect Parser projection derives from the +published Orgize declaration. Existing Bazel9.2.0 updates its lock within the +180s/2GiB JVM boundary; existing sync-lock and dependency-contract checks pass. +No extra direct dependency is added here. This is a published candidate chain, +NOT a completed root installation, accepted C or retrospective replacement of +prior evidence. Root remains pinned to its earlier candidate until the new +chain's full build/load/restore and exact-head gates close. + +The next causal work must retain two separate failures: Parser's accumulated +backend deadline and Orgize's observed loader/kernel wait. Missing object-family +generations and invalid signatures have no supporting evidence in preserved +scenes. The clean grammar activation bug is independently demonstrated and +fixed. A local177s cold pass and103s package pass cannot close the other causes. +Do not reclassify a repeated pass, heap normalization, target removal, wider +limits or SDK changes as a fix. Root commit and dual push remain NOT performed. + +** Core cold counterexample and freshness after upstream rebuilding + +A further baseline uses ONLY the current registered Coreafc447d native package +entry: native clean, then native build, with2 workers/2GiB and an outer180s +window covering both actions. It passes0/147.57s,252 frontend targets and541 +backend starts, with no owned survivors. Its actual C child ancestry yields99 +observations of SINGLE_HOST and zero MULTIPLE_HOSTS. This is a counterexample +to a claim that this host policy necessarily makes Core exceed180s. It is not +a matched portable Linux SDK experiment and does not explain that CI failure. +No compiler-mode modification is made on this evidence. Had the combined outer +window failed, that would not alone prove the independent build entry exceeded +its own180s deadline. + +Core product cleanup/rebuilding is an actual dependency-footprint change after +the successful Parser receipt/CLI controls above. A subsequent CLI control with +that receipt STILL PRESENT refuses in5.20s before the child sentinel executes. +Thus the final local prefix is deliberately NOT an admitted Parser generation; +prior success is not claimed current after dependency rebuilding. Reissuance +requires the actual new complete source/product closure, rather than editing +receipt bytes or accepting a stale credential. No clean/retry performance +claim is made, and no frozen failed scene is overwritten. + +| Question | Current evidence | Remaining acceptance | +|----------+------------------+----------------------| +| Does cleanup load the compiler? | Old/new SDK registry distinguishes behavior; ownership and compile controls pass | Implemented package-entry responsibility repair | +| Is the Parser timeout only a final hash scan? | Failed CI has compiler-enter without compiler-return; local pass returns after161s | Backend completion/cost cause remains open | +| Are obsolete generation holes or invalid signatures established causes? | Preserved families contiguous; sampled signatures already valid | Neither explanation is established | +| Does SINGLE_HOST alone explain Core timeout? | Native cold counterexample passes147.57s | Portable CI cost remains open | +| Is source refusal reproducible and bounded? | Actual Agentic predicate, exact Reader name/byte mutations and restoration pass | Historical unique interleaving and new full Agentic execution remain separate | +| Can prior admission survive changed native dependencies? | Present receipt refuses after Core product rebuild; child not entered | Reissue from the actual next closure | +| Can the root be committed and mirrored as complete? | New chain published; archive/lock contract passes; remote cold gates fail | NO; complete build/load/cold/recovery and project gates still required | + +* Fixed two-worker causal investigation (2026-10-25) +:PROPERTIES: +:CUSTOM_ID: implementation107-two-worker-causal-investigation +:END: + +This continuation preserves CI's two workers, the180s individual package fence, +the2GiB maximum Scheme VM budget, the existing native package prefix and the +installed Gerbil/SDK. Ordinary tests retain their120s outer fence. No worker +increase, alternate compiler installation, source overlay or local production +patch is introduced. Causal repair and final root synchronization remain OPEN. + +** Actual worker export at the root package entrance + +A subsequent entry audit finds that the root Justfile still exports the literal +=GERBIL_BUILD_CORES=4=. Just recipe exports override the caller environment. +Consequently =native-install-current-core-01/02.json= report the observer's +requested2, not verified package execution at2. Their failures, elapsed times and +checkout identities remain observations; their two-worker qualification claim is +WITHDRAWN. The direct Parser/Core diagnostic runners instead enter the package's +own Justfile with an explicit2; this root-recipe defect does not automatically +invalidate those separate runs or CI's explicit two-worker configuration. + +The only root build-entry implementation change here replaces4 with2. A real +=just --command printenv GERBIL_BUILD_CORES= control verifies the recipe export, +with the caller unset, set to2, and adversarially set to7: all three execute at +2 and exit0. This controls the actual native recipe boundary, not a parsed +source constant. The source hash and results are retained in +=root-native-worker-export-controls-01.json=. No heap, deadline or compiler +option changes accompany it. + +The new native install observer checks that recipe export before mutation and +records only the worker environment value of each observed package process. +It retains the180s per-package fence,2GiB maximum and owned-process cleanup. +=native-install-fixed-recipe-two-workers-01= is a recovery/install check after +this configuration repair; even a pass would not repair or qualify Parser's +separate strict cold producer or identify the historical Agentic refusal. + +That invocation now fails143 in415.03s aggregate, with no surviving owned +processes. Actual recipe export and each reached package process are verified2: + +| Native package | Observed package seconds | Actual worker export | Result | +|----------------+--------------------------+----------------------+--------| +| POO |11 |2 |completed | +| Core |30 |2 |completed | +| Parser |167 |2 |completed recovery build; not strict cold issuance | +| Orgize |180 |2 |deadline refusal during generated fold compilation | +| ASCENT |not reached |not observed |not qualified by this invocation | +| Agentic |not reached |not observed |not qualified by this invocation | + +Orgize's last observed work includes generated document/inline fold parts. +The concrete native entries are =build.ss= -> =build-parser.ss= -> +=languages/org/generate-fold.ss= -> existing SDK Make, followed by the runtime +build. This is a newly exposed installation blocker, not a Parser cold pass or +an Agentic repair. Its package-stage cost and compiler-policy propagation require +separate causal measurements before modifying that entry. No host-policy change, +target reduction or resource increase was applied during that failed invocation; +the later formal entry repair is recorded below. Root full build, +load/recovery and configured verification have not been rerun on this partial +prefix. Final root commit and hardenedlinux/tao3k dual push remain pending the +required acceptance closure. + +** Latest published native-entry cohort and new controls + +A fresh upstream read finds Parser971e1d2 (bounded writer/import test changes), +c690cda (removal of CI's explicit two-worker budget), and then8645433 (actual +native entry change: explicit =parallelize: (min 2 ...)= for Gerbil expansion, +separate from the SDK Gambit/C executor's environment budget). Removing the CI +budget is not acceptable qualification under this task. The existing PR was +rebased over8645433 and restores explicit CI2 as da14686. Neither a higher SDK +default nor an unchanged retry closes the original180s failure. + +A concurrent normal Parser push was refused before that rebase. Orgize's +intermediate36b15f8 briefly referenced the unpublished pre-rebase Parser SHA; +14cd29d immediately replaces it with the published da14686. No native install +or acceptance used the intermediate pin. The root was updated only after the +final upstream pushes succeeded. + +Orgize's generated dynamic fold used plain SDK Make without initializing the +existing compiler policy in its parent process. A dependency build child's +environment does not propagate back to its installer or sibling package builds. +The real SDK/GSC preprocessor control establishes SINGLE_HOST before, and +MULTIPLE_HOSTS after invoking Parser's existing initialization; a child gxi +inherits the latter exactly. The control keeps the configured optimization, +worker and heap budgets. The first diagnostic mistakenly invokes the unrelated +PATH =gsc= (Ghostscript) and fails; that result is retained, not accepted. The +corrected control qualifies =bin/gsc= from the current SDK and exits0 in3.12s. +This establishes compiler-policy propagation, not a complete performance repair. + +Orgize14cd29d changes only its build owners and their regression: initialize that +existing parent policy; route =clean= through the parser-source owner and fold +generator; derive fold identities from the existing generated units; delegate +SSI/static cleanup to SDK Make and complete dynamic-family cleanup to Core's +existing =clean-build-artifacts!=. The generator's default compile behavior and +parser semantics remain unchanged. Unknown actions/profiles refuse before effects. + +The maintained Orgize fresh-module test initially fails the existing five-second +quiet-output watchdog; compiling first alone still fails it. The final fixture +moves expensive grammar imports into the Case and uses the existing compiler +import-progress adapter to report actual import/evaluation work. It does not add +heartbeats or change the watchdog. The corrected =t/package-build-test.ss= passes +in19.51s with two Cases, MODULE-OK, HARNESS-OK and final OK, without error markers. +Controls cover all owned dynamic generations, adjacent product/source retention, +idempotence, and invalid action/profile refusal. The attempted lazy import also +had a syntax error until its fresh top context imported the SDK core syntax; +that failed run is retained rather than relabeled as acceptance. + +The authoritative native cohort is now: + +| Package | Published revision | +|---------+--------------------| +| POO |29c58aa9c5be103ba843767e3d22ef8802b79342 | +| Core |c90d9297d774245653a400dea1ef7a46a1bca73a | +| Parser |da14686e1db5568cee413f993a680a7a24f92db2 | +| ASCENT |d52206eb177e5d9d31770a4c0d6a6af4a6e0b196 | +| Orgize |14cd29d8cfc07302d544dbaa83ff7de83d4b7639 | +| Agentic |da023668102cfe99d9d44b7e6dd2fcbd8976a1bc | + +Root still declares Agentic only. Agentic's maintained =pin-gerbil-dependency= +entry updates its authoritative Orgize pin, archive hash and native/cross-platform +lock projections and passes its direct-dependency contract in4.88s. It uses the +already cached Bazel9.2.0 matching the project declaration, with a180s outer +limit and2GiB JVM maximum; no tool or SDK is installed. This is a direct-pin +projection check, not a complete Bazel build. Its indirect Parser archive remains +971e1d2 rather than the native da14686; full transitive Bazel alignment is OPEN +and must consume the parent declaration instead of inventing a direct authority. + +Native tagged update again exits70 (20.63s), but all six actual checkouts match +the declared cohort. It is not an install pass. Orgize's subsequent genuine +=gxpkg clean= succeeds0 in33.55s and reports its owned-fold cleanup. The new +=native-install-entry-cohort-03-two-workers-01= invocation checks each actual +worker export and all six package boundaries. Its complete result, strict Parser +cold qualification, runtime CLI and root verification remain separate gates. + +The cohort03 native installer fails143 in280.80s aggregate. Actual process +exports remain2 throughout: POO11s, Core31s and Parser40s complete; Orgize reaches +180s. Unlike the previous failure, it reports GENERATION-OK and reaches its +runtime list before termination. This is not a complete package pass or a proven +speedup: prior partial products and phase boundaries differ. ASCENT and Agentic +are unreached and no owned processes survive. A late read-only child-policy +sampler finds no live matching child, so its empty result proves no compiler +flag propagation for that completed invocation. + +Parser da14686 exact-head CI run40162873413 reaches the strict writer on both +platforms and fails180s with no READY: Linux271 frontend starts/397 backend +starts; macOS271/304. Foreign input inventories are4,415/4,416 files and hashing +before clean takes about1.35s/4.04s. Clean-to-first-frontend is about33s on both. +These measurements rule out attributing the whole failure to snapshot hashing; +they do not establish a complete causal repair. Keep native recovery, source +preparation, optimizer-interface work and backend completion distinct. + +** Ordered Orgize build VM reuse candidate + +The next package-only candidate keeps the same ordered syntax, generated fold +and runtime target sets while reusing one native VM/compiler cache. Existing +SDK module imports are delayed until explicit compile/clean. The syntax entry +exports its existing main; the parent calls the existing syntax/fold mains in +order, retains/restores the syntax-only inventory flag, and drains each native +Make before the next phase. Repository search confirms that this flag changes +only build inventory selection, not application grammar or parser definitions. +There is no custom scheduler, SDK change or optimization/target reduction. + +Three maintained controls pass in17.47s, including a new source-import refusal +hook proving that package spec requests cannot activate the grammar/generator. +Existing cleanup and invalid-action controls still pass. This is not full-build +or performance acceptance. The formal Orgize candidate is +=da0d2053a350f9fa373d61421ce39a2f9754a69d=. Agentic consumes it as +=308b004acdb7cb04b1ce3c51a7a33dee35638cf2= after its existing direct-pin/lock +contract passes again in4.06s. Parser remains da14686; other cohort03 pins are +unchanged. The root still declares only Agentic. + +Native update04 exits70 in16.36s while verifying all six actual source heads; +its failed operation status remains explicit. Native clean04 and full install04 +must qualify the candidate through the same180s/2GiB/two-worker boundaries. +Parser strict cold, runtime CLI, exact-head CI, root build/tests and the historical +Agentic predicate remain OPEN. No final root synchronization is authorized by +these partial receipts. + +Native clean04 fails70 in4.54s before owned-fold cleanup: the syntax entry +worked as a gxi script but lacked an explicit SDK =this-source-file= binding +when imported as a Module. The first reuse regression had exercised only the +top-level spec path and did not cover this child entry. Orgizee3e59c8 adds that +SDK import and extends the refusal-hook control to import BOTH actual entries +as Modules and request spec. All three Cases pass in15.97s, with MODULE-OK, +HARNESS-OK, final OK and no errors, under the unchanged five-second watchdog. +This is a code/control change after a retained failure, not an unchanged retry. + +The final published candidate is now Orgize +=e3e59c8b3a63e341a701f5725b134f87ea3bbc34=, consumed by Agentic +=54cf7d0508706f25ea069d6c3dc8defbcf2bb487=. Its direct pin/lock contract passes +in5.13s; the other cohort03 package revisions are unchanged. Native update05 +again exits70 (16.43s) while verifying all declared source heads. Clean05 and +install05 must still complete; the earlier unbound-source failure is not erased. +Native clean05 then passes0 in12.70s with the expected owned-fold marker. This +separate clean result does not qualify compilation, runtime semantics or a +performance speedup. Install05 additionally samples an actual fold compiler +child's selected policy environment when present; an absent sample proves +nothing about propagation. + +Install05 progresses beyond the former Orgize blocker: POO35s, Core54s, +Parser23s (native recovery) and Orgize177s complete with verified worker exports2. +Orgize follows clean05 and completes syntax, generated folds and runtime; this +is the first completed package run after the VM-reuse/source-binding changes. +Only about3s remains under the180s fence, so this one receipt does not establish +host-independent margin or guarantee repeated performance. ASCENT is the next +active package; whole-install acceptance still requires all six owners and no +surviving owned processes. + +The observer captures an actual Orgize fold GSC child at its qualified current +SDK path, worker export2 and inherited =CORCXXFLAGS_GAMBUILD= containing the +existing MULTIPLE_HOSTS override. This supports execution-source/policy binding +for that observed child; it is not a fabricated currentness token or a proof for +every unobserved compiler process. The structured observation is retained in +=orgize-native-fold-child-policy-cohort-05.json=. + +The complete install05 result now passes0 in655.86s aggregate. Every reached +package process exports exactly2 workers, each package stays below180s, and no +owned process survives. Final package observations are POO35s, Core54s, +Parser23s recovery, Orgize177s, ASCENT176s and Agentic99s. The original Agentic +identity refusal does not recur in this invocation; that is not proof of its +historical cause or independent-review authority. Orgize and ASCENT have only +3s/4s margin in this run. This receipt closes native installation for this +cohort, not strict Parser cold issuance, CLI, fresh root build/tests or exact-head +CI. Root configured checks run serially on this complete prefix before the +separate destructive Parser cold gate. + +Root configured verification on the completed native prefix passes build0 +in100.92s; basic =just test=0 in176.51s aggregate (13 independently fenced native +harnesses,17 Case executions/16 distinct labels, no errors); project-formation +build controls0 in35.63s; and Library declaration controls0 in106.80s aggregate. +The basic aggregate is not one test's120s budget: each existing entry retains +its own original outer fence and the recipes remain serial. + +Organization/method verification then fails124 in177.71s aggregate. Organization +Cases pass, while the following method-binding entry reaches its120s outer fence. +Its complete partial transcript contains BOTH Case successes, MODULE-OK, +HARNESS-OK and final OK, followed by =Ops execution terminated= (SIGTERM15) while +copying process output. An earlier abbreviated read omitted the final harness +markers; that interpretation is withdrawn. Successful semantic markers alone do +not override the process/lifecycle failure. + +The unchanged single-entry lifecycle diagnostic is classified as diagnostic, +not repair or replacement acceptance. It passes0 in92.62s. Read-only process +observations put preparation before about66s, the gxtest child at roughly68–78s, +and parent completion near92s. It does not reproduce a permanent EOF hang. +One-second samples distinguish parent waiting from actual source/read work; +they do not establish the previous failure's unique cause. The120s failure stays +OPEN. Remaining independent configured entries continue serially without +rerunning this failed group as a claimed fix. + +The remaining independent root entries pass serially on cohort05: +project-inputs0/28.13s, Library-selection0/40.26s, Project-entry0/41.55s and +Project-formation0/49.08s. They do not close the failed Organization/method +entry. The later destructive strict Parser check fails on the same native +Parserda14686: wrapper70/188.33s including startup/termination,270 frontend +targets,461 backend starts, cold clean observed and no publication READY. +The ordinary native Parser recovery subsequently passes0/83.90s; it restores +products without issuing the strict publication receipt. + +A fresh direct publication-reader negative control after that recovery refuses +with the exact missing-generation error in8.37s; the protected callback does +not create its sentinel and no receipt exists. The SDK wrapper returns70, not +the CLI's child-status domain. A separate CLI attempt stops earlier because +qualification helper products were removed by the interrupted strict clean; +it is NOT counted as the admission-control pass or a runtime CLI pass. Formal +helper/runtime positive controls remain dependent on a complete strict base. + +** Latest upstream observation: prospective cohort06 + +A final live refresh finds Parser PR13 has advanced from da14686 to +7462a054307bc428a69e02874bf79450bd188500. The new commit changes only the declared +Core dependency to4922c27b21225ada69ae19606d6cc7584315ff39 and the strict CI +command's explicit worker2 assignment. Core's intervening changes preserve +native lexical role bindings and resolve optional Config in its actual native +expansion context. These are distinct changes from the previously published +c90d929 retained-Graph replay fix; none is evidence that the historical Agentic +identity refusal's exact schedule has been identified. + +Exact-head Parser CI run40166414604 has a successful Linux preparation plus +semantics/generation/FFI/corpus lanes. Its strict base emits READY at05:50:08.656Z, +after clean READY at05:47:13.927Z (174.73s between these markers; not the complete +outer elapsed time). The macOS preparation fails while building Core4922c27, +before reaching strict Parser. Therefore Linux success cannot qualify macOS or +the root project's installed SDK. Earlier da146 CI/local failures remain +historical failures, not errors overwritten by this new run. + +The SDK native tagged update returns70 after checking out both requested +prospective source heads; the nonzero operation is retained, and both actual +heads are verified separately. Native Core4922c27 compilation passes0/32.54s +under2 workers/180s/2GiB. A new strict Parser7462a05 cold observation follows +before any claim that cohort06 is accepted or propagated through all dependent +manifests. The initial observer invocation was denied access to ps before it +launched the build; the same bounded command is then run with read-only process +observation allowed. No resource or source policy is relaxed. + +The new local strict observation on Parser7462a05 fails wrapper70/186.55s: +cold clean is observed,270 frontend targets and601 backend jobs start, and no +READY or publication receipt is issued. Its final transcript has entered the +post-build foreign-product discovery walk before the180s deadline. Starting +all backend jobs is not proof that every job completed or that the subsequent +Core/source/product guards passed. Ordinary native recovery then passes0/21.96s; +this remains recovery, not strict issuance. + +A separate read-only phase-cost diagnostic after recovery measures a fresh +input snapshot at6.77s and a fresh product snapshot at1.23s (2012 product rows), +24.37s including startup/module loading. It is not a cold acceptance or an A/B +repair. It identifies nonzero admission costs without attributing the whole +failure to hashing, silently dropping input coverage, moving checks outside the +deadline, or admitting products with a fabricated receipt. + +The same final upstream refresh also finds a coherent, already-published +Agenticbc08d5877bc002bc5aa9da38f1357bdde30485bc dependency cohort. The root now +selects that one direct dependency. It inherits Orgize43d33e8ec684d8a5d53b06f97bd38bf06d7c8d3c, +Parser7462a05, Core4922c27 and POO29c58aa; ASCENT is the declared +9573529ad043a7a23983c65f94df3334f8ed8df8. ASCENT PR's later2efc661 contains +additional VM-resource/Rust changes and is not silently substituted for that +pinned revision. Agentic's tracked Core gitlink and indirect Bazel Parser archive +now also name4922c27/7462a05; its maintained dependency-contract check passes. +This closes the earlier declaration/archive mismatch at the source-contract +level, not Bazel execution or native acceptance. The root adds no independent +transitive override. Native tagged update again returns70 after reaching all +three intended heads; native installation of this coherent cohort is a distinct +pending gate. Cohort05 root/test results do not transfer automatically. + +The actual coherent-cohort06 native installation fails143/278.14s aggregate at +Orgize's180s package fence. Actual process exports are2 throughout: POO11s, +Core34s and Parser33s recovery complete; Orgize reaches180s during its syntax +module phase (29 frontend targets/52 backend starts in the retained partial +log), before fold GENERATION-OK. The observer terminates the owned tree and +confirms no survivors. ASCENT and Agentic are not reached. The normal Agentic +build has therefore not yet synchronized its initialized Core submodule to its +new tracked4922c27 gitlink; that loading-source transition remains pending. + +The selected declarations now form a coherent source cohort, but the installed +prefix is incomplete and is NOT qualified for a new C, root acceptance or +runtime CLI admission. Earlier cohort05 complete-install/root functional results +remain scoped to that earlier cohort. No root checks are rerun on the incomplete +prefix and no test retries are counted as fixes. The successful source-contract +check cannot replace this failed native install. + +The remaining causal work is explicitly ordered: reproduce/profile Orgize's +syntax-phase cost at its unchanged package boundary; separate Parser's returned +build/currentness work from its post-build snapshot work using actual phase +observations; and obtain a captured failing predicate/state for the historical +Agentic public-identity refusal. Preserve source/name/Graph drift negatives, +missing-generation callback refusal and the earlier method-entry lifecycle +failure while doing so. After an identified package-level change, qualify the +complete selected source cohort afresh, then strict base/helper/CLI and root +build/load/cold/recovery controls. A source-head advance, a warm recovery or an +unmodified successful retry is not that identified change. Root commit and both +remote pushes remain unperformed because these gates have not closed. + +A subsequent native Orgize clean passes0/17.21s, including owned generated-fold +cleanup. From that cleaned state, a read-only importer observer around the +unchanged package source entry completes all three phases0/124.31s, with153 +frontend targets,302 backend starts, GENERATION-OK and no survivors. The observed +actual syntax GSC child has worker2 and the expected MULTIPLE_HOSTS/tail-call +compiler flags. The observer delegates every import/reload to the original +importer and reports only completed work; it changes no source/admission result. +Its largest observed import costs include the Org grammar source2.11s; generated +fold imports are reached near21s and runtime imports near108s. These observations +are retained in =orgize-clean-import-diagnostic-cohort06-01=. + +This is expressly a DIAGNOSTIC PASS, not repair or replacement installation +acceptance: both native clean and importer observation distinguish it from the +failed installer. It does not isolate which state/scheduling/environment +condition accounts for the earlier syntax-phase180s failure. It neither +qualifies the unexecuted ASCENT/Agentic steps nor synchronizes Agentic's Core +submodule. The failed install, strict Parser failure and historical identity +cause remain open. Further A/B work must preserve the failing state and compare +actual native package entries; a newly successful unchanged run must not be +renamed a fix. + +** Candidate refusal and revised formal baseline + +The uncommitted compiler-child heap candidate was exercised through its actual +package entry at two workers. =parser-candidate-native-entry-two-workers-02.json= +records wrapper70,188.18s including observer/termination,181 frontend targets, +110 backend starts and no READY. This is a failed qualification, not evidence that +the candidate repairs the timeout. Its native child-option control still proves +only inherited-budget behavior. A compiler-process preflight on the partial +prefix reports ERROR MODULE/ERROR HARNESS and zero completed cases despite +process exit0; =parser-candidate-compiler-process-preflight-01.json= rejects it. +The generated =event-program~1.scm= fallback has no complete admitted loader. +No failed prefix is accepted on the basis of a marker or shell status alone. + +Upstream inspection found new formal Core/POO source after the previous frozen +cohort. Core4307dce declares POO29c58aa: issuer-owned parent-snapshot compaction, +interrupted-build cleanup and compiler-budget preservation precede that POO pin; +Core changes source observations, deferred role preparation and retained state. +These are upstream implementations, not new runtime modifications in this task. +Core's public dependency guard is unchanged. Alignment therefore carries no claim +that the Agentic refusal is fixed, nor a causal performance claim for Parser. + +The new declared cohort, published through the existing dependency PRs for +qualification, is: + +| Owner | Declared revision | +|-------+-------------------| +| =gerbil-poo= | =29c58aa9c5be103ba843767e3d22ef8802b79342= | +| =gebril-yuanxu= | =4307dceb65b6e5ae13bc3680b3eac7fc98f7b62a= | +| =gerbil-parser= | =c01abe3c8901c9a69cab432b7f12418eea75f2e3= | +| =gerbil-ascent= | =1181c987265fef1bd5bb3d4decefedd9c2671db2= | +| =orgize= | =71df74ffed4b5f421534272ec07fa0d30e650b52= | +| =agentic-ai-lab= | =e9c7d8766837415c58325e8cc2b833af09796474= | + +Root still declares Agentic only. Parser and ASCENT select the same Core; Orgize +selects Parser; Agentic selects Orgize/ASCENT and the matching Core gitlink. +Only package declarations/gitlink were committed upstream. The unqualified heap +candidate and regression stay local; CI continues to select two workers. The +ASCENT dependency conflict was resolved by retaining the incoming remote history +and selecting4307dce, followed by a normal non-force push. + +The native tagged update exits70 in37.06s after changing all six checkouts to the +requested revisions. =native-update-current-core-01.json= verifies the exact heads +but marks the operation failed. This repeats the documented tagged-argument SDK +failure; it is not an install pass. No SDK change or uninstall is used. One +subsequent native =just deps= invocation must build the declared closure with +individually observed180s boundaries and no surviving owned processes. + +** Confirmed duplicate Graph admission in the native build adapter + +The native build projection prepared every ordinary retained library with a +callback that replayed the whole selected Graph. The enclosing projection also +checked that same Graph. This mixed local source currentness with the enclosing +selection's admission and multiplied Graph checks when reading prepared fields +and when admitting the retained list. The test-source adapter already separates +these responsibilities. + +| Retained width | Old preparation Graph checks | Old per-boundary Graph checks | Fixed preparation / boundary | Source drift refuses | Graph drift refuses | +|----------------+------------------------------+-------------------------------+------------------------------+----------------------+---------------------| +|1 |4 |3 |1 /1 |yes |yes | +|64 |193 |129 |1 /1 |yes |yes | + +The paired control runs the actual source =yuanxu-project-source-spec= against +an empty selected-Graph protocol and real temporary native library files; it +neither compiles nor issues a publication. The first malformed diagnostic script +is retained as failed. The corrected before and after runs exit0 in13.10s and +27.46s respectively; elapsed time is not a speedup claim. The deterministic +Graph-check counts and refusals are the evidence. The maintained regression also +retains every target and rejects changed package metadata. + +Core PR19 commit =c90d9297d774245653a400dea1ef7a46a1bca73a= changes only the +native build adapter, its regression and its architecture record. Ordinary +retained preparations keep their own source/package guards. The projection +retains whole-Graph admission at each independent boundary, including compiler +entry and return. No runtime reader, SDK, optimization, target or worker policy +is changed. This fixes demonstrated duplicate work; the full cold-build and +Agentic causal gates still require independent results. + +The heap-default and cooperative-yield candidates are retired, not published. +The yield probe demonstrated queued SDK work before final drain, but its full +cold build still failed (wrapper70,191.77s,270 targets/172 starts). The native +admission cost probe also failed its180s fence and issued no strict receipt; +its last sample attributes about4.02s to2,560 policy calls, which does not explain +the whole stall. Do not optimize that policy merely because it runs often. + +The formal declaration chain now selects: + +| Owner | Revision | +|-------+----------| +| =gerbil-poo= | =29c58aa9c5be103ba843767e3d22ef8802b79342= | +| =gebril-yuanxu= | =c90d9297d774245653a400dea1ef7a46a1bca73a= | +| =gerbil-parser= | =87348939e98e81f56655cdf51f889960498edd5f= | +| =gerbil-ascent= | =d52206eb177e5d9d31770a4c0d6a6af4a6e0b196= | +| =orgize= | =33a7d9a9f677308100e13432a23dfea45a053d72= | +| =agentic-ai-lab= | =e9eca5c7a73c02a2d1a36ec2b24c069c949aaec2= | + +Agentic's incoming commits =3dafb39= and =fe946df= were preserved by rebase. +They add library roots and migrate suite sources/lock projections. Their Bazel +projection snapshots predate this second native cohort; no Bazel qualification +is claimed. Root still has only the inherited Agentic dependency. The native +update again exits70 (35.12s), with all requested source heads verified; install +success is a separate gate. + +The first new-cohort installer built POO in128s but stopped Core at180s +(exit143,334.83s aggregate,no surviving owned processes). Native Core recovery +then passed in51.65s; ASCENT recovery failed its180s fence. Native Parser cold +qualification on the first cohort failed (wrapper70,191.45s,269 targets/147 +backend starts); its subsequent ordinary recovery failed124 in181.30s. These +remain failures and do not certify the current prefix. + +The first cohort's Parser PRc01 has distinct CI outcomes: macOS's two-worker +strict producer reaches READY about176.16s after launch; Linux completes270 +frontend targets but only423 backend starts before180s. A single platform pass is not closure. + +The second cohort installer =native-install-current-core-02.json= fails143 in +255.00s aggregate: POO completes in12s, Core in42s, and Parser reaches its180s +boundary; no owned processes survive. Agentic, ASCENT and Orgize are not reached +by this invocation. The strict publication receipt is absent; the prefix remains +partial and is not an admitted generation. + +Parser PR13 head8734893, run40157959594, still has two failed Scheme preparation +jobs. Linux completes270 frontend targets and starts416 backend jobs before the +strict180s deadline. macOS fails at its preceding native Core package build +(exit status31744, representing124); it never reaches the strict Parser writer. +These are different phases, and neither is repaired by c90d929. The latest PR +head was re-read from GitHub after these results; Rust checks pass, while the +remaining Scheme lanes are skipped. No CI rerun is presented as a repair. + +** Source-identity controls and test-entry findings + +The first retained-role priority probe accidentally built a catalog-only view. +It could access a Scope but selected no compiler interface; its transient-import +pass is not evidence for the compiler boundary. The corrected probe explicitly +selects =custom/example= through an init declaration, requires a nonempty Graph, +prints its admitted interface role inventory, and confirms that the actual +objects import resolves through Core's temporary compiler-role path. Continuous +public-name redirection is rejected at the independent Graph boundary, and exact +restoration admits again. The attempted4307dce invocation also passes, but its +counted control still observes one preparation Graph check, rather than the +old adapter's expected multiplicity. Selecting a checkout alone did not isolate +the loaded adapter from canonical same-identity imports. Those attempted +before/after priority comparisons are discarded; they are not evidence against +or for the causal hypothesis. The counted c90 control observes one preparation +Graph check. Raw inputs and observations stay under the ignored =current-pr= +evidence directory. + +A separate callback-ownership intervention avoids that module-identity ambiguity: +it explicitly applies the former Graph callback and the new local callback to +the same real retained role via the unchanged preparation API. With public-name +redirection held, the former callback reproduces exactly =public dependency +source or native identity changed=; the local callback admits. The independent +Graph check still refuses, and exact path restoration admits again. This bounded +control exits0 in13.72s (=retained-public-priority-callback-control-01.json=). +It establishes a concrete mis-scoping mechanism with unchanged role bytes, not +that the historical SDK schedule actually exercised it. The original production +failure's unique cause therefore remains OPEN. + +The actual Agentic exception-site diagnostic preserves the original exception +hook and all source/currentness decisions. It records resolver/path state before +unwinding only if the original public-identity error occurs. The first attempt +fails on a diagnostic syntax error; the next fails while the sandbox cannot +fetch the already-declared Core gitlink. Neither reaches the relevant boundary. +The corrected network-enabled native invocation obtains exactly c90d929, then +fails124 at180s (181.00s including termination). It reports no identity refusal; +that absence is NOT proof of repair or a completed install. A one-second read-only +sample during its quiet startup attributes843 of849 main-thread samples to +native dynamic loading; subsequent output proves frontend/backend work. This +single sample explains only that sampled interval, not Parser's full timeout or +the historical Agentic predicate. Partial products and termination-time linker +errors do not count as successful recovery. + +The maintained native =just test-file t/module-build-spec-test.ss= entry at +c90d929 fails its first run (wrapper70,47.88s) on an existing hardcoded overlap: +=object-types/contracts= is no longer selected by the current Core Graph. This +is a test-fixture membership error, not permission to remove the conflict +control. The proposed test adjustment derives an actual selected package input +and its full native options for overlap, conflicting options, dependency drift +and identity-collision checks. It leaves the production adapter untouched and +was qualified through the same maintained source =just test-file= entry with +=CORE_QUALIFICATION_ROOT= set explicitly (no source-only skip). The corrected run +exits0 in47.72s, with MODULE-OK, HARNESS-OK, final OK and no error markers, within +the120s/2GiB/two-worker limits. Commit51dbc9604cc2437269fc05f338da3ed76c87a468 +publishes only this regression-fixture correction in existing Core PR19. The +root's declared production cohort still pins c90d929; the test-only PR head is +recorded separately and does not imply a newly installed or qualified cohort. + +The source regression is reproducible in the existing native dependency +environment at Core PR19 head51dbc96, from that checkout, without constructing +another environment: + +#+begin_src sh +GERBIL_BUILD_CORES=2 GAMBOPT=max-heap=2G,debug=q \ +CORE_QUALIFICATION_ROOT="$PWD" \ +timeout --signal=TERM --kill-after=5s 120s just test-file t/module-build-spec-test.ss +#+end_src + +Require actual line-anchored MODULE-OK and HARNESS-OK, final OK, outer exit0 and +absence of ERROR CHECK/CASE/HARNESS and overflow. A skip when the explicit source +root is unset is not acceptance. The first failed run remains in the ledger; +the fixture change, not an unchanged retry, distinguishes the passing run. + +A separate read-only Parser native =build.ss spec= diagnostic completes in24.01s +at8734893/c90d929, with two workers, a120s fence and2GiB. It executes the existing +entry and Core's built-in operation measurement; no compiler work or publication +is requested. It produces10,892 bytes of native spec output. Nested measured +operations include linker import1.960s, source reads0.275s and metadata +replay0.145s; their times overlap and must not be added as an exclusive profile. +These observations do not identify the remaining cold timeout and do not justify +weakening source guards or introducing persistent currentness caches. The JSON +operation list was corrected from the completed raw log after its collector +initially omitted parenthesized rows; no execution was retried for that repair. + +** Investigation and acceptance boundary + +The historical identity failure still has two unresolved alternatives: failed +prepared-source/package checks and changed canonical native resolution. The +controlled source/SSI/source experiment demonstrates resolution sensitivity; +zero-hit Make watchers do not establish that the native failure took that path. +Current Core still catches those alternatives into the same false result. Do not +bypass the guard or treat upgrading, warm recovery or a retry as causal repair. + +The latest PR4c142e4 CI actually used merge9355bdd, SDK2591dcd and two workers; +both Scheme producers timed out. The prior local four-worker SDK1cfb032 pass is +not equivalent acceptance. The new declaration commit starts a new CI/source +identity and must receive its own results. The host process observations also +contain unrelated workspace compilers; do not attribute historical wall time or +a speedup to a source change without a matched control. + +Required closure: isolate the dominating native-entry work and the exact failed +identity predicate; reproduce failure and show the repair preserves negative +source/name/currentness controls; complete two-worker native install, strict +cold writer, helper/runtime CLI, build/load/cold/recovery and configured root +checks. Check actual program/pin/input/product identities. Update this ledger +before final root commit and normal hardenedlinux/tao3k dual push. Upstream PR +source synchronization is neither completed qualification nor final delivery. + * Parser cold qualification and runtime CLI continuation (2026-10-25) :PROPERTIES: :CUSTOM_ID: implementation107-parser-cold-runtime @@ -211,6 +1873,194 @@ retained Agentic source-identity failure, or qualify arbitrary concurrent worklo Correctness gates, recovery, performance attribution and independent review remain separate claims. +** Follow-up: PR identity and causal diagnosis +:PROPERTIES: +:CUSTOM_ID: implementation107-causal-diagnosis +:END: + +The live [[https://github.com/tao3k/gerbil-parser/pull/13][Parser PR13]] head was rechecked on 2026-10-25: +=4c142e4ebc1c0cdd6cde99a5ad84c8ea7a8c37d7=. The installed Parser +checkout and the inherited Orgize declaration select that same revision. This is +already the latest PR revision at this observation; no additional Parser revision +or speculative dependency update is needed merely to repeat qualification. + +The PR is not fully qualified remotely. Its linked [[https://github.com/tao3k/gerbil-parser/actions/runs/40147274862][CI run40147274862]] +checks merge =9355bddb2c19491a3a8a3b4f567f9c547d01f523=, combining +head4c142e4 with basec6ecb40. Both Scheme preparation jobs fail at the actual +180s =qualify-library= fence (writer124, SDK wrapper70); all downstream Scheme +lanes are skipped. After the strict writer starts, macOS records270 frontend +targets and282 backend job starts; Linux records270 and431. Neither publishes +READY. The three Rust checks pass. A local Parser pass cannot close these gates. + +CI uses the declared SDK2591dcd and two workers, whereas the local receipts use +SDK1cfb032 and four workers. These are distinct execution baselines. The main +writer explicitly selects2GiB; its argument alone does not establish an inherited +heap fence for every GSC child. No SDK is replaced to make the comparison pass. +The raw failed logs and structured source/job summary are retained as +=parser-pr13-head4c-ci-failed.log= and +=parser-pr13-head4c-ci-failure-summary.json=. These current failures replace any +interpretation that only an obsolete Parser revision remains unqualified. + +| Question | Observation | Causal status | +|----------+-------------+---------------| +| Current strict Parser entry | Exit0,110.81s; cold cleanup,270 targets,601 backend jobs and publication READY | Additional current-revision qualification; no repair attribution | +| Old Parser writer | Exit124,181.03s;270 targets and505 backend jobs started; incomplete products | Active compilation exceeded the deadline; unique wall-time cause remains unknown | +| Agentic native source observer | Actual =build.ss compile=,exit0,40.59s; no source-identity refusal observed | Non-reproduction; does not repair or erase install04 | +| Controlled public-source path change | Source -> installed interface -> source resolves with admission true -> false -> true | Reproducible resolution sensitivity; not an observed scheduler interleave | + +The Parser compiler/runtime directories, catalog, init and compiler host policy +have no executable performance change between =6db7eea= and =4c142e4=. +The build entry changes its executable deadline; publication changes concern +mode fidelity and drift diagnostics. Core =f1e57b4 -> 0a6bdac= changes the +executable deadline, dependency declaration and proof tooling, rather than the +Module source/build runtime. POO =4334964 -> 247a7eb= changes its executable +deadline. These source comparisons do not identify a performance repair that +could explain the old timeout. Historical logs lack the necessary phase/CPU/ +competing-workload observations; later passes cannot reconstruct those facts. + +The new Parser observer records actual process samples and observed phase +boundaries while running the unchanged native =just qualify-library= entry. +At two-second sampling resolution, input inventory appeared by6.15s, owned-product +cleanup by12.29s, first frontend target by20.47s, last frontend target by49.26s, +and publication READY by106.67s; the waited process completed by110.81s. +These are observation times, not exclusive phase durations. A compiler job-start +line is not job completion. Fragmented log reads cannot support a complete +per-job timestamp trace; exact target/job counts come from the completed raw log. +The immutable grammar input receipts remain admitted inputs. This is a cold +Parser native-product build, not an empty-cache machine benchmark. The initial +process snapshot also contains unrelated POO Flow and Gambit compiler processes. +They were not stopped or reconfigured. Host contention is therefore observed in +this run; it is not evidence of the historical timeout's unique cause. + +The source-priority control prepares the actual installed +=agentic-ai-lab/nix-contracts.ss= through Core, checks its current public binding, +then applies the path order used by SDK dependency timestamp lookup, and restores +the exact original path in =dynamic-wind=. The prepared source/package guard +still succeeds during the middle observation; the public canonical-path guard +refuses because resolution returns =.gerbil/lib/agentic-ai-lab/nix-contracts.ssi=. +SHA256 of both =nix-contracts.ss= and =gerbil.pkg= is equal before and after. +Only the diagnostic process's search order changes. Neither an SDK file nor a +package source, installed product or receipt is rewritten. + +This is a controlled intervention, not proof that install04 experienced that +schedule. Attempts to instrument timestamp procedure bindings observed zero +callbacks and therefore failed their own reproduction predicate. Read-only +native Make stress observations also saw no shifted path. None is a successful +reproduction of the historical failure. The actual Agentic observer run is +separate from the unmodified native build acceptance recorded above. + +For a source-bound reproduction of the resolution condition, the diagnostic +uses the installed Core0a6bdac reader's private inspection function. It is not a +new public API or a production dependency. Run in the existing native package +environment with the120s watchdog and1GiB pre-import heap fence: + +#+begin_src scheme :tangle no +(import :gerbil/expander :yuanxu/module-system/source/reader + :yuanxu/module-system/source/preparation (only-in :clan/poo/object .ref)) +(def root (path-expand ".gerbil/pkg/github.com/tao3k/agentic-ai-lab")) +(def source (path-expand "nix-contracts.ss" root)) +(add-load-path! root) +(def input (yuanxu-prepare-module-tool-source source void)) +(def inspect-public (eval 'yuanxu/module-system/source/reader#public-dependency-input)) +(def original (load-path)) +(def (observe label) + ((.ref input 'admit-current)) + (displayln label " resolved=" + (core-resolve-library-module-path ':agentic-ai-lab/nix-contracts) + " current=" (and (inspect-public source input) #t))) +(observe 'source) +(dynamic-wind + (lambda () (set-load-path! (cons (path-expand "lib" (gerbil-path)) + (filter (lambda (p) (not (equal? p root))) original)))) + (lambda () (observe 'timestamp-order)) + (lambda () (set-load-path! original))) +(observe 'restored) +#+end_src + +Local evidence: =parser-native-entry-profile-02.{json,log}=, +=agentic-public-source-diagnostic-01.{json,log}= and +=public-source-path-control-final-01.{json,log}=. The last control exits0, +checks all three expected bindings and unchanged source hashes. Its21.98s is +not a performance comparison. Failed instrumentation and zero-hit stress records +remain under their distinct =native-identity-make-*= labels. + +The existing Core =t/module-publication-test.ss= controls, including changed +public source and warm native-name redirection, pass through =just test-file= +with an explicit120s outer fence: exit0,53.95s, Module/Harness/final OK and no +error markers (=core-publication-native-controls-02.json=). This preserves the +framework's existing negative controls rather than adding a second guard. +The earlier owner-default invocation took141.63s and used Core's600s policy; +=core-publication-native-controls-01.json= is retained but explicitly excluded +from this task's120s acceptance. The bounded rerun changes the launch fence, +not implementation semantics, and is not a causal repair or speedup comparison. + +The maintained Parser runtime entry was then rechecked without changing its +implementation: =just test-compiler-process= exits0 in57.17s, current base HIT, +8 formal helper targets/18 backend jobs and complete Module/Harness/final OK +(=parser-runtime-after-causal-controls-01.json=). A fresh reader before this +extension exits0 in15.50s. These are currentness/runtime checks, not another +performance repair claim. This follow-up changes only Org and the D2/SVG view; +the sole direct dependency remains Agenticbfa9498 and the formal cohort is unchanged. + +A local two-worker control on the same installed Parser4c142e4 and SDK1cfb032 +also fails: =parser-native-entry-profile-two-workers-01.json= records wrapper70, +194.52s including observation/wrapper termination,233 frontend targets and139 +backend starts, without READY. The native writer retains its180s fence. Its log +contains the SDK nonzero-child wrapper rather than a separately issued child +status, so this is not relabeled as an exact inner124 receipt. The earlier +four-worker pass and this failure are not a matched controlled performance +comparison: unrelated host builds continue. They establish distinct outcomes +under two package worker selections, not a unique scheduling cause or a repair. + +A proposed upstream candidate that changed CI from two to four workers was +rejected by automatic approval review because the worker increase and bundled +entry/heap changes exceed the fixed-resource boundary. The Git command did not +execute; no candidate commit or push exists. The worker increase and executable +shebang changes were removed. CI remains at two workers. A local, uncommitted +compiler-child default-heap candidate remains in the Parser edit checkout, +with its regression case and a corrected stale workflow comment. It preserves +explicit caller heap choices and supplies1GiB only when no maximum was selected. +A native child control passes in4.51s for absent/default, idempotent,512MiB and +2GiB choices. This tests inherited options, not a total-RSS bound or a build fix. + +The candidate's two-worker cold build was interrupted and lost its waitable exit +status. Its partial log and diagnostic JSON are retained and marked unaccepted. +It must not be cited as candidate qualification. Native installed source heads +remain the declared cohort; a subsequent ordinary native build restores any +partial products. No manually restored binaries or source overlay is accepted. +The candidate must receive complete bounded qualification before publication or +dependency propagation. Source synchronization and causal repair remain pending. + +The post-interruption ordinary native recovery also fails under the unchanged +limits: =gerbil pkg build github.com/tao3k/gerbil-parser=, declared4c142e4, +four workers,2GiB inherited cap, exit124,182.66s including termination +(=native-cohort-results-causal-interruption-recovery.json=). The sequential +cohort runner stops at Parser; Orgize and Agentic are not retried by that run. +No Parser build/compiler process from that invocation was visible in the immediate +post-timeout process inventory; other workspaces' test/compiler processes were +visible and were not stopped. Installed tracked Parser sources remain clean. +The strict publication file is absent, consistent with the interrupted writer's +withdrawal. Ordinary product recovery and fresh strict reader acceptance are +therefore still OPEN. Earlier successful reader receipts describe their original +instants; they do not certify this post-interruption prefix. + +This continuation has not committed or pushed either the root documentation or +the upstream candidate. Root remains =eb52dc6=, the previously synchronized head. +The three maintained documentation/view files are local changes. The requested +final commit and hardenedlinux/tao3k dual push await completed repair and the +required current-prefix verification, rather than using source synchronization +as a substitute for acceptance. + +The implementation closure condition remains stronger: identify a reproducible +native-entry failure with its actual source/package/resolution observations; +show that a package-entry repair removes that failure while preserving source +mutation and name-redirection refusals; then rerun native installation, +build/load/currentness and configured controls at the fixed resource limits. +Do not weaken canonical-source admission, accept a compiled-interface alias, +retry a failed admission into success, alter Gerbil/SDK or mint a receipt manually. +Until those conditions hold, causal repair is OPEN and source synchronization +must not be reported as completed repair. + ** Source synchronization boundary The four maintained files are the sole direct dependency declaration, this Org @@ -1759,3 +3609,78 @@ structural context, current-source digest or tool transcript is insufficient to issue the original C. I4--I7 require that acquisition before a positive same-C accepted view, protected publication or end-to-end recovery can be admitted. The paper remains a research comparator; none of these correctness results establishes a research advantage. + +** Explicit utility Types and source-phase handoff + +Parser PR13 =73ef439= removes the Any/Any Utilities default. List services require +explicit Row/Key Types and return native TypeValuePair; a defstruct row with +field-checking POO Type is qualified. Six entry/type/interop/spec cases, canonical +incremental build, compiled-Contract startup and native inventory audit pass. +The source-identity refusal is isolated by fresh-process negative/positive +controls and corrected through Core's existing source registrar in both build +phases. Details, retained failures and remaining CI/source/installation gates are +in [[file:10.108-parser-directory-modules-and-init-build-refactor.org][10.108]]. Resource limits remain unchanged. + +** Parser explicit graph/scanner/action domains + +Parser PR13 =483fb2e= completes the remaining Scope/method Any audit. Graph +Row/Id/Kind and scanner Context/Mode are explicit caller-owned POO Types; +LR actions and Grammar IR have checked data domains. Seven retained declaration +sites and their individual reasons are recorded in 10.108 and Parser README.org. +Core PR19 =fd54f94= preserves the selected compiler-source association only for +its native action, while rechecking physical inputs. Core canonical build passes +104.52s under its unchanged180s/2GiB/two-worker gate. The Parser five-owner, +29-case slice passes73.17s with two workers and total90/idle5. Source-selection +leakage and lazy prototype-family failures have explicit regression checks; +failed earlier cohorts remain diagnosis. Parser canonical build and exact-head +Linux/macOS run40254445150 remain pending here, independent of these local passes. + + +** Final Parser Any audit qualification boundary + +Existing Parser PR13 =0ece0e1= contains explicit Record/struct/POO domains, +seven individually justified Any boundaries, LR precedence and graph-select +callback controls, and two-worker activation alignment. Formal Core PR19 +=a8f48f5= removes duplicate path-enrollment admission while retaining enclosing +and per-access physical checks. Both checkouts are clean/pushed. Canonical +builds pass Core47.50s/Parser41.07s and the actual registered Parser six-owner, +33-case slice passes61.05s. Compiled semantic24 groups plus five process entries +and all11 Worker controls pass at the preceding identical Parser implementation. +Run40258488174 reaches successful Linux dependency installation, but macOS still +refuses Core cold build at180s with child124. Full source entry also retains an +ABI owner idle5 refusal; isolated success is not its repair. Full two-platform +CI, complete shared-source qualification and tagged native update remain open. +10.108 and the D2 view preserve failures and do not relabel retries as fixes. + + +** Authorized Core budget and complete source supervision + +The user authorizes Core's native package-entry budget300s (Core PR19 0e3c1f8), +retaining two workers/current heaps and all runtime fences. Old macOS logs prove +cores=2 and active backend work at180s; the first300s cohort passes dependency +installation on both OS. This is a policy change, not a performance repair. +Parser PR13 5825b32 additionally fixes a concrete False scanner Mode fixture, +reuses the existing compiler import/evaluation observer for spec queries, forwards +real Core source events, and separates diagnostic output from nested spec data. +The exact previous observer/candidate same-process control distinguishes corrupted +versus clean data streams; zero/multiple values, exceptions/refusals and child +failure controls remain. Canonical build passes42.39s and complete source passes +175.00s:145 modules/1087 cases, two Workers/3GiB, total90/idle5 unchanged. +Historical180s/idle5, intermediate observer attempts and sandbox ps refusals are +retained. The older ABI-only missing stack is not retroactively inferred. +Final-head Linux/macOS CI40262352809 is still pending separately; 10.108 and D2 +track that gate without relabeling an earlier or warm run as full acceptance. + + +** Final Parser Linux/macOS closure at5825b32 + +Run40262352809 succeeds:12 enabled jobs pass;5 existing conditional jobs skip. +Both OS full-source logs independently establish145 modules/1087 cases,24 +compiled semantic groups, declared process closure and11 Worker controls. +Preparation, FFI and generation pass on both platforms; Linux pinned corpus +passes. Core300s is an explicit user-authorized policy adjustment with cores=2 +confirmed, not a claim of optimization. Full source total90/idle5/current heaps +and Parser's unbounded package-build policy remain. Org/D2 retain old180s, +source/fixture/sandbox failures and controlled negative evidence; the uncaptured +historical ABI stack is not inferred from retries. Existing Parser/Core PRs are +updated; no Gerbil/SDK source or unrelated root implementation is changed here. diff --git a/docs/10-19-design/10-architecture/10.108-parser-directory-modules-and-init-build-refactor.org b/docs/10-19-design/10-architecture/10.108-parser-directory-modules-and-init-build-refactor.org new file mode 100644 index 0000000..75fae5e --- /dev/null +++ b/docs/10-19-design/10-architecture/10.108-parser-directory-modules-and-init-build-refactor.org @@ -0,0 +1,927 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: 10.108 Parser Directory Modules and Init-Owned Build Refactor +#+LANGUAGE: en +#+PROPERTY: JD_ID 10.108 +#+OPTIONS: toc:3 num:t +#+FILETAGS: :parser:architecture:modules:refactoring: + +[[file:10.107-implementation-progress-and-execution-gates.org][Execution evidence]] | [[file:../../90-99-views/90-architecture-views/90.99-library-contracts.d2][Architecture view]] + +* Current ownership follow-up +The checkpoint below is historical. [[file:10.113-parser-domain-module-ownership.org][10.113]] records the current removal of the +mixed =src/modules= container and direct grammar/language/graph/testing ownership. +Earlier target counts, phase-role counts and CI receipts remain historical. + +* Latest observed checkpoint + +Package declarations remain authoritative for dependency revisions and contracts; +this document reports observations, not another version registry. Parser PR13 +=5825b32= consumes Core PR19 =0e3c1f8=. Core's package entry has the user-authorized +300s budget; two workers/current heaps remain, and Parser has no package deadline. +Canonical Parser build passes42.39s. Complete current-source qualification passes +175.00s:145 modules/1087 cases, total90/idle5 and two Workers/3GiB unchanged. +Compiler/spec observer controls and exact-old-source/candidate stream controls +pass. The old failures and intermediate attempts below remain historical evidence. +The ABI-only missing blocking stack is not reconstructed from later successes. +Exact-head Linux/macOS run40262352809 completes SUCCESS:12 enabled jobs pass +and5 existing conditional jobs skip. Both OS source entries pass145 modules/1087 +cases,24 compiled semantic groups, declared process closure and11 Worker controls. + +* Initial refactor checkpoint (retained) + +Implementation is in progress in the existing Parser PR13 and Core PR19 +checkouts. The nine =src/*= directories now have service Types, Objects, default +Config bindings and Interface declarations; init selects those Modules in one +explicit directory window. All nine actual Scopes loaded successfully in +=parser-directory-scopes-cohort18.log=. Namespace discovery does not execute +parser methods, and Config selects the existing service prototype rather than +inventing settings. + +The first incomplete projection omitted 196 old entries and was refused as a +cutover. After adding Module-owned public entry projections and the actual +dynamic emitter/witness leaves, the independent native PackageSpec comparison +passes (=parser-directory-native-coverage-cohort18-02.log=, 42.98 seconds). +The comparison preserves runtime source membership and all FFI options; its +only explicit discovery exclusions are seven phase-bound Build roles. The old +catalog and four forwarding Module files have now been removed. Full compile, +cold/recovery, source suite and Linux/macOS CI remain pending for this refactor. + +The starting Parser source is =d6e487cb99e3a97a4f38601b4d076a421ca07a18=; +Core starts at =bf88264cf0f5c1bf2b5c0a6484ca5f2e1f08c2d5= with formal source +changes in progress. Earlier cleanup CI cannot qualify these changes. + +* Initial ownership failure (retained) + +Before this refactor, =init.ss= selected one =parser= Module under =modules/=. That Module's +=objects.ss= imports =build-modules.ss= and exports the same whole-library catalog. +The root =build.ss= then appends the catalog and three explicit FFI specs to the +init-owned =std-make-spec=. Core really does own one selection epoch and the +normalized compiler handoff, but the retained whole-package roots remain the +practical membership authority. Init therefore does not organize the actual +compiler/runtime/language subsystems or control their membership separately. + +Changing only =:load-modules "./modules"= to ="./src"= is insufficient. The +source loader discovers declared Module leaves, not arbitrary Scheme files; +a directory with =interface.ss= is a leaf, and its private children are not +additional namespace branches. Current =src/modules/parser/interface.ss= is a +business API module, not proof that its directory is already a Yuanxu Module. +Directory placement, native Scheme module identity and Yuanxu publication +identity are separate concepts and must remain explicitly related. + +* Source-directory ownership inventory + +Counts below describe the current source tree before adding Module roles. + +| Current directory | Direct / recursive Scheme files | Target responsibility | +|-------------------+---------------------------------+-----------------------| +| =src/build-support= | 2 / 2 | Actual compiler-option and native-object link adapters; no new scheduler, package resolver or signer | +| =src/compiler= | 68 / 68 | Grammar/IR lowering, machine construction and Scheme/Rust generation; separate generation from execution dependencies | +| =src/ffi= | 10 / 10 | ABI schemas/codecs and actual C/Rust integration entries; own all three special FFI build specs/options | +| =src/grammar= | 2 / 2 | Grammar and lexical expression algebra/contracts | +| =src/language= | 15 / 15 | Language declarations, policy/profile composition and parser assembly | +| =src/modules= | 1 / 29 | Existing parser POO/public protocol implementation plus runtime loader; audit its mixed responsibilities before declaring a leaf | +| =src/runtime= | 48 / 70 | Execution, scanning, artifacts and runtime state; distinguish shared IR/types from execution orchestration | +| =src/testing= | 9 / 9 | Published testing DSL/contracts and supported test extension surface, without installing repo-only tests | +| =src/utilities= | 2 / 2 | Shared pure list/string primitives | + +Every selected =src/*= subsystem must have actual Module ownership. This does +not require turning every private nested directory into a Module or inventing +business configuration where none exists. Required authoring roles follow the +current Core reader; optional roles must have a concrete purpose. Do not create +four empty files solely to make the tree look modular. + +* Native construction and build chain + +The intended chain is: + +#+begin_example +init.ss: load/choose source-directory Modules + -> one Core source context and selected dependency Graph + -> guarded native role sources and actual Scheme import closure + -> owner-bound additional Build projections (notably FFI) + -> the same init-owned std-make-spec + -> Core defbuild-script + -> Gerbil std/make and the default compiler +#+end_example + +The implemented init uses =mode: explicit= to select the nine subsystem +publications under =./src=. Core's =mode: auto= discovers eligible Modules on +demand; an empty auto window does not itself select all Modules for compilation. Additional windows or explicit selections for language Libraries are +part of the same init epoch. Mount names organize access; they do not create +publication identity or permit duplicate identities. Auto mode discovers +eligible Module declarations; it is not a raw =src/**/*.ss= build glob. + +Each subsystem's roles must have real responsibilities: + +- Types declare its actual Scope/value/function contracts using existing POO/Core types. +- Objects expose existing implementation functions/prototypes, rather than a private source-file inventory. +- Config supplies genuine settings/defaults consumed by that subsystem; no dummy settings. +- Interface declares identity, real Scope, dependency contracts and selected projections. +- Build, where needed, declares owner-relative extra native entries and their options. It does not execute another compiler loop. + +Core already derives role sources and their observed native import dependencies +in =module-system/source/build.ss=. Its =BuildContributionContract= admits +=module/build= values with owner-relative =roots=, including =gxc:= options. +=building/build-projection.ss= and =building/interface.ss= retain the selected +source guards and exact std/make consumer handoff. Reuse those mechanisms. +Do not put an =all-files= scan or another whole-package catalog into every Module. +Do not export the phase-bound Build value as a runtime Scope service. + +The final root =build.ss= must consume the init projection, not select files by +itself. Remove =modules/parser= as a catalog-forwarding owner and retire the +production =build-modules.ss= list after native coverage is demonstrated. +A one-time migration comparison may read the old catalog as historical input; +that comparison is not the new build driver. + +* Dependency cycles that must be resolved first + +The current directories do not yet form a valid subsystem dependency DAG. +Concrete native import evidence includes: + +| Actual caller | Actual imported implementation | Consequence | +|---------------+--------------------------------+-------------| +| =src/runtime/parser.ss= | =src/compiler/machine.ss= | Runtime currently invokes machine construction | +| =src/compiler/machine.ss= | =src/runtime/contextual-ir.ss=, =lexical-source.ss=, =lr-parser.ss=, =token.ss= and =scan.ss= | Compiler currently depends on runtime data and execution primitives | +| =src/language/entry.ss= | Runtime parser, LR runtime, CST, token and artifact APIs | Language entry currently composes execution | +| =src/compiler/rust-scanner.ss= | Language source strategy/scanner/command/part/result profiles and runtime scanner/parser APIs | Compiler generation currently consumes language orchestration as well as shared contracts | + +The first machine-readable audit reads the actual installed compiler interfaces +through Gerbil's reader, not a second production source parser or resolver. +It covers 259 library/FFI interfaces from the existing catalog and finds 50 +cross-directory edges. Aggregating the actual native imports yields one cyclic +component: =language-support=, =src/compiler=, =src/language= and =src/runtime=. +The raw relation is =.data/alignment-20261024/current-pr/parser-native-import-inventory-cohort17.json=; +its bounded directory aggregation and SCCs are in +=parser-directory-import-audit-cohort17.json= in the same evidence directory. +These native compiler edges include syntax and runtime phases; they are not yet +a complete proposed Scope dependency graph. The inventory is a diagnostic +snapshot of current compiled interfaces, not authority to reuse a future build. +The two initial reader-output API errors remain separate raw logs and did not +produce an accepted inventory; the corrected native reader completed with exit 0. + +Core selection lowers required Modules into its existing dependency resolver, +which reports =dependency-cycle=. Hiding these edges behind an empty +=requires:= object, or retaining all files unconditionally, is not a valid fix. + +Classify the actual imports before assigning final Module requirements: + +1. Shared grammar, IR, value contracts and pure utilities belong below both + compilation and execution. Extract or reassign them only after checking + their actual native import closure and current callers. +2. Compiler/generator code consumes that shared contract, not the assembled + runtime service. Runtime executes an already constructed machine/plan. +3. Language assembly/integration binds compiler output to execution. Move the + current reverse composition responsibilities to that owner. +4. Syntax-phase/native compiler imports and runtime Scope dependencies are + distinct edges. Keep the former in the native closure and declare the + latter as actual Module requirements; do not manufacture Scope cycles + by mechanically copying every source import into requires. + +These are target responsibilities. The initial native interface/SCC inventory above is complete for its 259 +inputs. Phase-specific Scope/API classification, ownership dispositions and +exact file moves remain open; no dependency split is claimed implemented. + +* Facades, language Libraries and FFI + +The old catalog also owns root public facades, =language-support/= adapters and +=languages/= entries. They must not disappear when the src window changes. +Assign every currently supported facade to an actual Module API/import closure; +use separate declared language Module selection where appropriate. Native role +imports can provide a real public facade dependency closure without a second +file discovery pass. Any required compatibility facade remains a thin Gerbil +re-export with its actual source association, not an alias publication or a +second build selection. + +Keep public Scheme import paths and C ABI stable by default while reorganizing +internal ownership. An actual incompatible public API change must update its +known consumers and tests explicitly. Unsupported/unused old catalog entries +are dispositioned in an audit, not silently dropped to pass compilation. + +The three FFI entries remain =language-abi=, =language-abi-context= and +=rust-aot-abi=. Their owner declares include paths and platform link arguments +once in its Build projection. Avoid enrolling the same C entry through an +unoptioned role import and again through a differently optioned Build root: +Core rightly refuses conflicting contributions. Runtime ABI contracts can +remain available through pure interfaces without evaluating C declarations +while simply enumerating the Module namespace. + +* Full implementation order and acceptance + +| Stage | Concrete change | Required acceptance | +|-------+-----------------+---------------------| +| M0 | Freeze preceding cleanup head, actual pins and its open tests | No old CI/warm result transferred; unchanged two build workers and existing heaps/watchdogs | +| M1 | Audit actual source imports, subsystem ownership, phase edges and facade coverage; decide shared-contract/assembly moves | Every old production entry has an owner/disposition; concrete cycles mapped; no fake dependency graph | +| M2 | Refactor shared contracts and composition boundaries, updating internal callers | Existing grammar/IR semantics, C ABI, source/runtime ownership and negative controls remain correct | +| M3 | Implement real directory Module roles, dependency/Scope contracts and FFI projections | Scope demand validates actual returned values; native build derives from roles/imports; namespace enumeration does not construct parsers | +| M4 | Switch init selection and root build consumer atomically; remove forwarding Module/catalog authority | Exactly one init context/projection; selected/required Modules control actual output membership; no raw directory scanner or retained whole-package root list | +| M5 | Rebind helper/test/CLI consumers and compatibility facades | Ordinary/default/optional builds, all three FFI specs, independent imports and real method provenance remain valid | +| M6 | Source, native compile/load, cold/recovery and Linux/macOS qualification | Full native semantic and remaining source suites, exact-head CI and explicit failure/recovery controls; no limit widening or warm retry called repair | + +Positive controls include an added legitimate Module declaration being selected +through the existing init mechanism, supported language/facade coverage, correct +FFI options, shared-path deduplication, and preserved normalized return values. +Negative controls include malformed/missing roles, denied required Module, +unknown Scope/feature, source/entry/directory mutation, cycles, source-identity +collision, conflicting FFI options, missing products and failed compilation. +An unrelated private directory must not become an accidental publication. + +The preceding cleanup still has an open full-source 90s loading failure and +separate exact-head CI; this design does not reclassify those as solved. A new +module architecture must qualify its own native/cold/recovery behavior and +must not add a private loader, another package policy, SDK layer or compiler. + +* Implementation observations and native boundaries (cohort18) + +** Native relative imports + +Core's private publication wrapper replaced the original native package with a +temporary package. A legal symbolic =../modules/parser/objects= import therefore +became =:modules/parser/objects=. The configuration wrapper had the same defect. +The source fix preserves the original compiler package parent, keeps a unique +private namespace, and indexes configuration imports by their already-admitted +compiler identities. It does not add a package resolver or bypass source guards. + +The new relative-import regression and six existing Build-role cases pass, +including helper mutation, lazy Build, runtime Build rejection and root reentry +rejection (=core-native-relative-import-test-cohort18-02.log=). Another 21 +existing graph/artifact cases pass (=core-native-relative-import-guards-cohort18.log=). +The native Core rebuild completed in 30.91 seconds before the later public-entry +extension; this was incremental, not a cold-build qualification. + +** Execution binding ownership + +The real source reader refused =runtime/parser -> compiler/machine -> +runtime/contextual-ir= as shared-source reentry. The implementations of +=machine.ss=, =lexical-expression.ss= and =lexical-lexer.ss= now belong to +=src/runtime=. Runtime callers import that owner directly. The previous compiler +paths are compatibility re-exports; no parser algorithm, ABI version or policy +was changed. This is a concrete ownership correction, not a fabricated Scope +=requires= edge or a weakened reader guard. + +FFI Scope publishes the four existing values from =src/schema.ss=. It does not +interpret =c-declare= or initialize language handles during Module selection. +The three native C leaves retain their include/link options in the FFI Build +projection. =projections: (list Build)= is the own-Module build boundary; +=configuration-build= describes provider configuration and is not a substitute. + +** Public entry projection + +Owner-relative =Build.roots= cannot represent the existing root facades without +escaping their Module directory. The formal Core extension adds optional +=library-roots= to the existing =module/build= contract. Each selected Module +names supported public package entrypoints; Core delegates native import-graph +expansion to its existing =package-library-spec=. There is no filesystem scan, +second source catalog, compiler loop or runtime evaluation of library code. + +Core derives the package boundary from guarded native =gerbil.pkg= input, +confines public roots and every local native dependency, checks actual compiler +source paths, retains per-source currentness guards and preserves selected +explicit C options. Existing owner-relative roots and conflicting-explicit-option +rejection remain in force. Correctness controls for public closure, no runtime +execution, missing/escaping roots and post-capture source mutation are being +added before this extension is accepted. + +A build during active source editing refused with =compiler tool source changed=; +that failure is retained as =core-library-entry-build-cohort18-02.log=. It is a +source-currentness refusal, not a build-performance regression or an accepted +negative-control experiment. Subsequent qualification must use stable inputs. + +** Current accepted source-level results + +- Nine actual service Scopes load with contract validation; pure utility invocation works. +- Core public-entry/relative-import/graph/artifact controls: 31 =CASE-OK=, + =HARNESS-OK= and final =OK= in 14.74 seconds + (=core-library-entry-final-controls-cohort18.log=). +- Stable-input native Core incremental build: 33.28 seconds, exit 0 + (=core-library-entry-build-cohort18-04.log=). This is not cold qualification. +- Native Parser coverage comparison: exit 0 with =PARSER-BUILD-CATALOG-OK=; + no application-owned production catalog remains. +- Root Parser host initialization now consumes the actual build-support Scope + method. It no longer directly imports that implementation as a parallel path. +- Legacy =check-catalog= CLI/marker remains compatible, but development policy + receives the verified selected projection's sources. It does not consume a + copied membership list. + +The remote pre-refactor Parser head =d6e487cb= now has 12 successful checks and +five skipped checks. Core baseline =bf88264c= has three failed native checks +(Linux build/bootstrap and macOS scale/runtime), fifteen successes and one skip. +Full baseline results are retained in =parser-pr-baseline-cohort18.json= and +=core-pr-baseline-cohort18.json=. Neither baseline qualifies the new source. + +** Cold build and contribution-order control + +Parser's full incremental build passes in 103.46 seconds (120 module compiles, +247 native jobs). Core product-cold builds pass within its unchanged 180-second +limit: 173.60 seconds before the order correction, and 136.04 seconds for the +corrected source. Both retain two workers and the existing 2 GiB VM fence; +external dependencies remain installed. These results do not establish OS-cache +coldness or a performance improvement caused by the semantic correction. + +A new source fixture reproducibly rejects the old ordering: an earlier public +root imports a helper for which a later Module declares =-O=, producing +=conflicting build contributions= (=core-library-option-order-before-cohort18.log=). +Core now collects all explicit selected contributions before native library +closure expansion. Imported leaves inherit those choices; conflicting explicit +choices still reject. Post-correction controls pass all 32 cases with final =OK= in 58.28 seconds. + +** Source/compiled interoperability correction + +A real compiled arithmetic descriptor fails the initial source Scope's nominal +predicate, and its machine is rejected by the private source =parse-source= +implementation (=parser-directory-nominal-interop-before-cohort18.log=). Private +source wrappers and compiled products have distinct nominal struct identities. +This is not repaired by weakening predicates or sharing unchecked compiled values. + +Nominal descriptor/machine APIs remain in existing compiled Gerbil facades. +Runtime Scope now exposes structural artifact validation/success/roundtrip; +Language Scope exposes the existing schema-owned format identities. Compiler +Scope retains the open POO grammar protocol. The source entry test actually +passes a compiled arithmetic result through Runtime Scope and its compiled +grammar through Compiler Scope. The corrected three-case unit passes with final +=OK= in 31.00 seconds (=parser-directory-structural-interop-cohort18-02.log=). +The descriptor's repeated format string is replaced by an import from its +existing =src/schema.ss= declaration; no version value changes. + +The full native inventory comparison stays in the existing development CI gate. +The source unit no longer duplicates that full discovery scan inside its bounded +owner; it checks actual public/ABI/phase behavior and interoperability. + +Formal Core PR19 now publishes =f3d512ec9ec218b020ee5286b17c92b3f84339f6=. +Parser declares that exact dependency. Native installation first reported the +old =bf88264c= tag conflict; =gxpkg update ...@f3d512e= changed the checkout but +reproduced the native tagged-argument =bad package; missing gerbil.pkg= failure. +Both failures remain raw evidence. Canonical native dependency installation then +passes (103.47 seconds), clean passes (14.48 seconds), and canonical Core rebuild +passes (125.57 seconds under the unchanged 180-second limit), from the actual +registered =.gerbil/pkg/github.com/tao3k/gebril-yuanxu= checkout at =f3d512e=. +No package uninstall, Gerbil change, local patch or alternate prefix is used. + +** Named Record refinement requested by the user + +The nine Scope Types are now named native =define-type= / =Record= declarations, +using bracket slot specifications and =Fun= for fixed signatures. Optional +signatures retain the existing =Function= constructor. Field definitions, +inheritance, defaults and normalization belong to the Record; the existing +contextual Contract retains only identity/proto/value-contract references and +its normal evidence boundary. No alternative Type or constructor system is added. + +The three entry/structural-interoperability cases pass with final =OK= in 36.35 +seconds (=parser-record-scopes-cohort19.log=). This working-tree refinement is +newer than published Parser =27ede1b=; that commit's product-cold build passed +298 targets / 660 jobs in 237.83 seconds from the registered native checkout, +with two workers, the existing 2 GiB fence and no Parser build timeout. The old +cold result is retained separately and does not qualify the Record refinement. + +The Record refinement is published as =cc40a6046cff4e165ce4853c5d932deaac866adf=. +All nine Scopes load in 9.89 seconds; the complete incremental build passes in +34.84 seconds. After native revision alignment and dependency installation, its +registered-checkout product-cold build passes 298 targets / 660 jobs in 214.88 +seconds. This is the current-head result, separate from the old =27ede1b= cohort. +Helper/command/conformance/source/recovery and exact-head OS CI gates continue. + +Core exact-head CI still has independent open gates: Linux 10,000-declaration +scale timeout, =t/slot-read-cost-test.ss= importing the POO-private +=:clan/poo/t/closure-measure= fixture, and macOS build reaching its native +180-second watchdog. The private-fixture import already exists at baseline +=bf88264c=. Job logs are retained as =core-f3d512e-*-job.log=. The 32 focused +controls/local native builds do not imply complete upstream CI closure. + +** Record cohort completion and remaining gates + +At published Parser =cc40a60=, compiled research, helper/command gates, native +objects, conformance, CLI help/check and all eleven worker controls pass. Expected +negative worker diagnostics remain negative controls, not producer failures. +The original generic log-matcher receipt is retained separately from the corrected +worker-control classification; the producer was not retried as a repair. + +Native recovery removes only the Utilities Types product family through Core's +existing artifact cleaner. Canonical rebuild restores Types/Objects/Config/ +Interface in 45.40 seconds; fresh startup passes in 13.13 seconds. Compiled +=UtilitiesScope= and its compiled contextual Contract admit the source-selected +Scope, and compiled arithmetic artifacts cross the structural Runtime boundary. +Receipts: =parser-record-recovery-*-cohort19=. + +The remaining-source gate is still blocked: =t/benchmark-test.ss= reaches the +unchanged 90-second owner budget during source-module loading. The full runner +fails in 108.85 seconds; neither a warm retry nor preloading outside that budget +qualifies this gate. Receipt: =parser-record-remaining-source-cohort19.log=. + +** Native spec stdout channel correction + +Exact-head Linux CI at =cc40a60= fails before canonical inventory comparison: +preparation diagnostics contaminate native =spec= stdout, so its first datum is +=...= rather than the standard list. The failure is retained in +=parser-cc40a60-linux-prepare-job.log=. Root =build.ss= now parameterizes only +host initialization/spec preparation output to stderr; Gerbil's native formatter +still owns stdout. The existing development consumer requires exactly one list +and EOF, without skipping or interpreting arbitrary diagnostic prefixes. + +A controlled preparation-noise injection exercises this boundary. All four +entry/interop/spec cases pass with =HARNESS-OK= and final =OK= in 48.27 seconds; +native inventory audit passes with =PARSER-BUILD-CATALOG-OK= in 28.61 seconds. +Receipts: =parser-spec-channel-{tests,audit}-cohort20=. This is a targeted source +verification; the preceding =cc40a60= product-cold result does not qualify the +newer stdout-channel correction, whose exact-head OS CI remains pending. + +macOS Parser preparation instead fails inside the dependency Core build's own +180-second watchdog. Parser's removed package-build cap is not reintroduced. +Core timeout policy is awaiting explicit clarification; its two-worker/heap limits +and all test watchdogs remain unchanged. Root Agentic dependency propagation, +full Core CI and complete downstream qualification remain open. + +** Scope signature refinement: concrete domains and parametric services + +Named Records alone are insufficient when their method inputs and results are +all =Any=. The refactor gives each actual service an explicit boundary: + +| Service | Input/result boundary | Semantic owner | +|---------+-----------------------+----------------| +| Compiler | Structural Grammar Record or schema-bound GrammarIR -> GrammarIR | Existing normalizer retains composition checks; source/compiled objects must interoperate | +| Graph query constructor | Existing GraphQueryViewContract -> GraphQueryContextContract | Existing graph view/context admission and ancestry checks | +| Artifact roundtrip | ParseArtifact -> String | Existing structural artifact validator, not a second artifact checker | +| Host initialization | No arguments -> Unit | Existing compiler-host policy | +| Compiler options | No arguments -> List String | Existing compiler profile | +| Build-spec adjustment | BuildSpecification -> BuildSpecification | Gerbil std/make owns instruction semantics | +| Native link options | List String -> String | Existing selected-object provenance check | +| ABI / language metadata | UInt ABI values; Exactly the existing schema declarations | Existing schema.ss remains the only metadata source | +| Test-form admission | Arbitrary syntax datum, List Symbol, optional List Symbol -> Bool | Existing syntax admission walk | +| Text lines | String -> List String | Existing string implementation | +| Whitespace | Character -> Bool | Native char? Type | +| Generic lists | list-operations-for(RowType, KeyType) -> TypeValuePair | Native Record/Function input, callback and output validation; no default domain | + +=ListOperationsScopeOf= connects the row list, inserted row, key callback and +conflict callback using the same caller-selected types. The published Utilities +Scope contains concrete string services and an explicit =list-operations-for= +factory. It accepts two native Types and returns the existing POO =TypeValuePair=: +the concrete operations Type paired with a value validated by that Type. No +=Any/Any= default or unconstrained list methods are published. + +Concrete row representations may use =defstruct=. Their owner defines a native +POO Type using the struct predicate and supplies it, together with the Key Type, +to this factory. A struct-row/Symbol-key test exercises admission, callback key +validation and rejection of an unrelated string row. The Type parameter carries +the caller's actual struct predicate; the utility does not invent a universal +nominal struct identity across source/compiled worlds. Native =TypeValuePair= +validation also rejects a factory result whose value does not match its Type. +No alternate Type engine or function-wrapper implementation is introduced. + +Remaining =Any= occurrences have explicit reasons: membership predicates accept +invalid candidates and return false; test syntax can be an arbitrary Scheme +datum; native std/make option +payloads and heterogeneous IR section bodies remain owned by their existing +consumers. These are not evidence of semantic validation. IR typing checks the canonical schema and symbolic grammar identity as well as +symbol-keyed rows; it does not certify grammar correctness; BuildSpecification typing does not certify +a native instruction or compiler invocation. + +Validation must exercise real normalized Scope functions, reject native Type +mismatches before target effects, check callback and output mismatches, preserve +optional-argument checking, and retain compiled Grammar/artifact interoperability. +An arbitrary exception from the implementation does not count as Type rejection. +The type-focused tests therefore recognize native =TypeError= specifically. + +The explicit list-service factory belongs to =src/utilities/lists.ss=. Its +=objects.ss= role publishes only the existing implementation binding; executable +construction does not move into the declaration role. An initial misplaced +helper is refused by the existing Interface authoring Contract, with the failure +retained as =parser-explicit-row-types-cohort22.log=; that guard is unchanged. + +** Explicit Types and mixed struct/POO qualification + +Parser PR13 publishes the explicit-domain refinement at =1463be9= and the native +source-phase handoff correction at =73ef43994d7ea35d2f54bc62256da91a439773e6=. +=src/utilities/types.ss=, =objects.ss= and =lists.ss= contain no =Any=. A caller +must choose Row and Key Types; the struct fixture additionally checks its Symbol +key and String value fields through its POO Type. Missing Type arguments, an +invalid Type argument, an inconsistent TypeValuePair, wrong rows/fields, callback +mismatches and wrong method results all reject through native TypeError. + +The six-case source harness passes with =HARNESS-OK= and final =OK= in 56.33 +seconds. Its spec child processes explicitly remove inherited =GERBIL_LOADPATH=; +they continue to exercise the normal entry with preparation-noise controls. +Receipt: =parser-explicit-types-both-build-phases-cohort23=. + +The earlier source-copy build refusal (cohort21) also reproduces in the canonical +registered checkout at =1463be9= (45.10 seconds, cohort22). This rules out treating +checkout alignment or a warm retry as the repair. A diagnostic continuation had +compiled a different set of remaining targets and was not qualification. + +The actual missing handoff is native source registration in phase zero. The +entry already called Core's =register-module-build-source!= for syntax expansion, +but not for runtime readers and compiler workers. =build.ss= now invokes the same +existing API in both phases, using its actual source directory and the checked +package identity. No source-admission policy or SDK resolver changes. + +A controlled pair of fresh processes uses the same registered files/products, +with no inherited =GERBIL_LOADPATH=. Without runtime registration, forcing the +Compiler Scope rejects with =source import leaves its Module and package kernel= +(exit 70, 8.95 seconds). Calling the existing Core registrar admits that same +Scope (exit zero, 10.31 seconds). Receipts: +=parser-source-phase-{missing,registered}-cohort23=. + +At =73ef439= the standard registered-checkout =gxpkg build= passes in 56.56 seconds +under two workers and the unchanged 2 GiB fence, without clean or a Parser build +watchdog. This is incremental compilation, not a product-cold claim. A new process +using the explicit native source registration then validates the source-selected +Utilities and Compiler Scopes with their compiled Contracts. Struct-row calls, +field-type rejection, missing-Type rejection and compiled Grammar IR consumption +pass in 30.35 seconds. Native inventory audit passes in 49.48 seconds. Startup and +audit ran independently; these timings are observations, not performance claims. + +The normal tagged =gxpkg update= still changes the registered checkout to the +verified requested revision before its known tagged-argument dispatch error. +That command is retained as failed; canonical build success does not certify +update success. Full Core/exact-head OS CI, remaining-source owner90 and downstream +Agentic/root qualification remain separate open gates. No root dependency-chain +publication or final delivery is claimed. Consolidated receipt: +=parser-explicit-type-final-cohort23.json=. + +** Remaining Any audit and explicit language domains + +This audit includes every =src/**/*.ss= occurrence, not only the nine exported +Scope Types. Utilities, Compiler and scanner/action signatures no longer default +to Any. The seven retained declaration sites have separate obligations: + +| Site | Retained Any position | Reason and rejection/compatibility control | +|------+-----------------------+-------------------------------------------| +| GrammarScope.grammar-expression? | Candidate input | Invalid atoms/objects must classify false rather than fail argument admission | +| GrammarScope.lexical-expression? | Candidate input | Same total-candidate boundary for lexical syntax recognition | +| RuntimeScope.parse-artifact-valid? | Candidate input | Existing artifact validator converts malformed candidates to false; consuming methods require ParseArtifact | +| ParserModulesScope.graph-query-view? | Last candidate input | Row/Id/Kind are explicit Type inputs; membership still accepts a malformed candidate and returns false | +| TestingScope.parser-test-form-admitted? | Inspected form | Native reader/macro data is inspected without evaluation; forbidden and owned-output names are List Symbol | +| GraphQueryPredicateOf | Predicate result only | Scheme filter accepts any true value, including a member tail; input is the chosen Row Type | +| BuildSpecification | Native options/metadata tail | std/make owns nested options/submodule forms. Parser checks Keyword/source-String carriers and forwards the tail; it does not implement another build grammar | + +The string ="Any"= in =src/compiler/rust-scanner.ss= names the emitted Rust +=Guard::Any= variant. It is not a POO Type occurrence and is not renamed. + +Graph callers now provide Row, Id and Kind Types. View callbacks use those exact +Types; parent identity is OrFalse(Id), where false is reserved for no parent. +The Context retains the Type parameters and native TypeValuePair for its checked +view. Query kind, scope/ancestor/descendant IDs and targets use the same captured +Types. Predicates retain generalized truth semantics. There is no universal ID, +kind or empty-row fallback hidden in the Scope. Public graph callers must migrate +with the API; silently guessing UInt/Org-specific keys is not an alternative. + +Scanner callers provide Context and Mode Types through =SourceScannerStepOf=. +The driver validates initial/replacement Context and the native Function checks +all three results and Mode. The built-in line producer chooses False/Symbol; +fixtures explicitly choose their actual domains, including a caller-owned struct +Type. Zero/missing/extra results, malformed Context fields, wrong Mode and original +exception propagation are controls. Existing progress/span/owner semantics remain +algorithmic checks. Contextual scanner nominal structs remain inside their runtime +owner; the utility does not duplicate those struct identities across worlds. + +LR action selection returns OrFalse(LRActionEntry), not an arbitrary state/value. +The Type describes terminal and shift/reduce/accept/fork/layout action structure, +rejects malformed/negative operands and cyclic branches, and separates raw action +rows from indexed lr-action-row structs. It does not prove transition correctness. + +Grammar IR now checks canonical schema, unique known headers, String/Symbol/Bool +payload domains, section row carriers, and the existing grammar/lexical expression +validators. Opaque section values, malformed expressions and duplicate headers +reject. Detailed name resolution, precedence, flow and compilation correctness +remain with the existing compiler. No new schema/version source is introduced. + +** Native source association and test-owner boundaries + +The larger source build retained in =parser-any-scope-build-cohort24= reproduces +public source rejection even with both registration phases. A sample and process +identity receipt are retained before stopping that already-failed build, which +had no compiler children left. This is not a new Parser timeout or a pass. + +Read-only inspection of native =std/make= identifies the missing boundary: +=dependency-timestamp= temporarily removes srcdir from the shared load path while +another Worker may evaluate a guarded role. Registering srcdir is necessary but +cannot make that temporary ambient lookup stable. Core's existing compiler-input +owner now retains a private, dynamic path-to-input index. The Reader accepts a +matching selected external source association only within that owner, while its +original source-byte/package guards still run. Outside that extent and for +unselected paths the normal canonical native lookup remains required. Core tool +identities are excluded from this external-source branch. No SDK mutation, +resolver replacement, global override or publication credential is introduced. + +Core PR19 publishes this consumer handoff at =fd54f94e41c0938880e6455bf46eb06e2ece953a=. +Regression controls remove the actual native source path, check Scope currentness +inside the compiler owner, reject the same ambient state after exit, reject source +byte mutation, and leave an unselected same-ID file unenrolled/unexecuted. The +original graph/build/cleanup controls remain in the test cohort. + +Baseline Parser =73ef439= Linux/macOS prepare jobs both pass. Their semantic jobs +fail on =t/library-init-test.ss= idle5, not Parser build180. Scope admission now +relays actual read/parse/evaluation events through the existing Ops progress +facility; cache-hit/check replays and timers are not progress. The Scope owner +uses the existing exclusive execution declaration for process-expander effects; +the Worker pool remains two. Runtime Scope obligations and external package-entry +queries are separate source test owners. The latter makes one noisy spec query +cover data-channel, public export and ABI checks; the existing native inventory +audit supplies the independent ordinary query. Each owner retains total90/idle5. +The prior combined owner total-budget failure is retained, not relabelled passed. + +A direct native probe also establishes that the old lazy Grammar/GrammarRole +prototype suppliers produce different prototypes for Contract refinements. +Family prototypes are now initialized once as private module values; derived +Contracts inherit that same family unless explicitly overridden. Nominal +source/compiled realms remain distinct; the structural compiler protocol still +crosses that boundary. Constructor/refinement and compiled interoperation checks +cover this correction rather than weakening ancestry admission. + +The baseline macOS FFI tests pass; only artifact upload fails with Azure endpoint +DNS ENOTFOUND. This is a transport failure, separate from code correctness. The +upload check remains required and is not converted to continue-on-error. + +** Nominal family and source-selection regression + +The two-owner trace =parser-family-ownership-trace-cohort28= records the compiled +Grammar/Contract prototype equality as true at owner import, then false after the +next owner resolves source modules. The fixture had called +=register-module-build-source!= at module initialization. Its global source-first +load path caused later imports to evaluate the public source Types under the +already installed namespace. This is a test selection leak, not permission to +weaken nominal ancestry or modify the compiler. + +The fixture now consumes public Types by package identity and registers its +source root only inside exclusive Scope evaluation. A dynamic-wind restores the +native load path on success and exception. The separate refinement correction +retains one prototype value per module family. Source and compiled nominal +realms are still distinct; structural compiler Scopes bridge them explicitly. +The cohort27 five-owner run used the runner's default host capacity and is +recorded as diagnosis only. The replacement qualification explicitly selects +=--workers 2=, retaining total90/idle5 and the existing heap envelopes. + +The corrected exact source slice =parser-any-source-selection-extent-cohort29= +passes in 73.17 seconds: five owners, 29 cases, =TEST-SUITE-WORKERS 2=, +all =HARNESS-OK= and final =OK=. This includes base/refined nominal prototypes, +compiled Grammar construction, source Scope interoperation and explicit +Row/Id/Kind/Context/Mode callback failures. Parser PR13 publishes the complete +change at =483fb2e85c9f4dd4df4a52b25fc4c724674c9087=; both OS CI and the +canonical registered-checkout qualification remain separate gates. + +Canonical Parser =483fb2e= builds successfully in165.33s with two workers/2GiB, +without clean or a Parser build deadline. The tagged update dispatcher still +returns70 after selecting the exact expected checkout; its failure receipt is +retained separately from the successful =gxpkg build= receipt. A CI-only followup +=2669014= also aligns the two legacy native lifecycle commands from four workers +to two. Their memory, timeout and control settings are unchanged. This final +head requires its own CI result; the superseded run is not final acceptance. + +The final =2669014= canonical checkout also passes incremental native build in +26.02s; its producer code is identical to =483fb2e=. Registered-checkout gates +=parser-record-*-cohort31= pass exit support4.87s, qualification5.07s, helpers35.48s, +CLI65.11s, library objects42.17s, complete conformance compilation/link96.05s and +source preparation5.39s. These are local compilation results; the remaining +source/control gates and final-head OS CI require their own results. + +** CI activation capacity and remaining cold dependency gate + +Final-head run40254724918 reaches macOS dependency installation but Core's +build.ss child exits124 (encoded process status31744), before Parser builds. +The raw job log also proves package bootstrap overwrote GERBIL_BUILD_CORES=2 +with host-detected3 via GITHUB_ENV. This is a distinct configuration defect: +=tools/ci/bootstrap.ss= must preserve explicit capacity and reject invalid values; +the Parser composite action explicitly supplies two. The three-case bootstrap +suite passes17.37s including configured/native fallback and zero, negative, +fractional, empty and malformed negative controls. No SDK source is modified. +The Core180s deadline and all heaps remain unchanged. An incremental local Core +pass is not cold CI qualification, and this corrected capacity is not yet proof +that the cold Core gate closes. + +The local cohort31 remaining-source attempt omitted CI's build-ffi-tests.ss +prerequisite and fails when the interpreter reaches a C declaration. It is kept +as a failed non-equivalent setup; the native FFI prerequisite must run before +repeating the complete source entry. Compilation passes do not imply executed +conformance success. No source suite, C fixture or negative control is removed. + +The executed semantic conformance in cohort34 exposes a real narrowed-Type bug: +LR compiler shifts are =(shift target precedence)=, not two-field actions. +The Type now includes the existing precedence domain (=#f= or a none/left/right/ +dynamic pair with integer rank). Missing metadata, opaque metadata and wrong +rank Types reject. The ten-case boundary Suite passes45.58s in cohort36 after +correcting the fixture's parallel binding to sequential binding. Parser PR13 +publishes this repair at =bec3204579c35c356d74104fdefa08ea9b3953c0=. +Native FFI prerequisites pass74.26s in cohort34. Semantic conformance must be +rebuilt and executed again with this producer change before acceptance. + +The LR precedence producer rebuild completes311.05s in cohort35 with two +workers/2GiB and no Parser build cutoff. A stack sample during the silent period +shows expander/compiler work, followed by actual compiler child processes and +language products; this is not a deadlock or a cold performance comparison. +The unbounded Parser build policy is preserved. Registration and executed +conformance are still separately recorded. + +The =graph-query-select= entry now validates its original caller predicate using +the context's same Row Type before composing the selection predicate. Cohort40 +passes all ten boundary cases21.06s, including nonprocedure rejection and +nonboolean true values. The first cohort38 exercised the old installed producer +and correctly failed; the producer is rebuilt75.80s in cohort39 before cohort40. +Parser PR13 publishes the complete callback fix at =cc00fd5=. + +The matching two-worker macOS run40256055847 proves bootstrap cores=2 but still +fails Core build.ss with child124 (status31744), prior to Parser compilation. +Thus capacity alignment is necessary but insufficient. Core180s is not removed, +no retry/clean/cache pass is a repair, and no Linux/macOS closure is claimed. +The local Core104.52s result is explicitly incremental. Cold dependency +qualification remains an upstream package-build blocker, separate from the +Parser Type and callback controls. + +The exact final =cc00fd5e454dfb1921d60094f8f619963772338e= registered checkout +passes native =gxpkg build= in88.84s (cohort41), unchanged2GiB/two workers, +without clean. Its native update still returns70 after moving to the expected +HEAD; update is not marked passed. The checkout/source identity is verified +before compiling and the raw receipts are retained. Final executed gates and +CI run40256760124 remain separate from this build result. + +Final-head native FFI preparation passes43.98s and static library objects47.90s +in cohort42. Worker controls pass116.48s: all11 distinct WORKER-CONTROL-OK rows +and final OK, including failure/silence/duplicate/reexport ownership refusals. +The generic log ERROR heuristic incorrectly marks this negative-control run; +=parser-workers-explicit-receipt-cohort40.json= checks the actual control +protocol and native zero exit. The raw heuristic result is retained. Compilation +and full source/semantic execution remain separately reported. + +At final =cc00fd5=, cohort42 conformance compilation/link passes131.44s under +its unchanged240s/idle5 gate. Executed research/process closure passes21.25s: +CONFORMANCE-SEMANTIC-OK groups=24 plus concise-runtime, history, +native-poo-runtime, provenance and all-language-benchmark child receipts. This +closes the previously observed LR precedence failure in actual execution. +Source owner preparation passes7.14s; complete remaining-source execution is +still separately pending. + +The final-head macOS job121360398741 in run40256760124 again proves cores=2, +then Core build.ss exits124/status31744 before Parser. It does not exercise +Parser qualification. The failed log is retained as +=parser-any-ci-cc00fd5-macos-prepare.log=. Parser native build and focused/full +local semantic passes cannot replace this cold upstream dependency gate. + +Complete source cohort42 retains an idle5 refusal during language-abi-alignment +owner admission. Cohort44 uses the same CI LR trace switch and still refuses +idle5 at45.02s after real bound/contextual artifact admission. This proves the +missing switch is not the repair. Neither failed run is a passing qualification; +the full source loading/current-environment stall remains unresolved. The +required total90/idle5, two Workers and3GiB full-run heap remain unchanged. +CLI help and check separately pass4.67s/2.74s at the final installed head. + +** Remove duplicate compiler-index admission, retain actual use checks + +Comparing the passing previous dependency =f3d512e= with =fd54f94= identifies a +new eager loop: indexing every selected path calls each input's admit-current, +which can repeat its enclosing Context footprint. The projection already calls +current! before and after .with-compiler-inputs (build-projection.ss:330--332). +The index is not an admission result: module-compiler-source-input performs the +physical current check every time before returning an input. Role materialization +retains its own existing checks. Removing the new eager call therefore removes +duplicate work, without removing the enclosing or actual-use admission boundary. + +Core PR19 =a8f48f5e9d30f1a8a6935aa8b9f11aeb5088eb18= adds a demand-count control: +zero checks while merely indexing; one for each lookup; changed input refuses; +association is absent after return. Existing actual-byte and unselected same-ID +foreign-source controls remain. Incremental build passes51.56s under unchanged +Core180s/two-worker/2GiB. Native role+graph suites pass29.07s with HARNESS-OK/final +OK (cohort48). This establishes boundary behavior, not the cold timeout fix. +Parser PR13 =0ece0e1= propagates this single dependency. Canonical Core build and +new exact-head OS CI must qualify the candidate under the original constraints. +The earlier fd54f94 cold124 failures and source idle5 refusals remain retained. + +The final source clone six-owner/33-case slice passes73.29s at =cc00fd5=, +including the complete narrowed-domain and bootstrap controls (cohort45). +With the propagated dependency, canonical Core =a8f48f5= builds47.50s under +Core180s/two-worker/2GiB, and canonical Parser =0ece0e1= builds41.07s under +its unchanged two-worker/2GiB/no-Parser-deadline policy (cohorts49--50). +Both native tagged update dispatcher errors remain separate from build passes. +Parser/Core working trees are clean. CI run40258488174 qualifies the new pin; +earlier runs are not its acceptance. The full source idle5 gap remains open. + +Final registered-checkout cohort51 passes61.05s: six owners,33 cases, +TEST-SUITE-WORKERS2, all HARNESS-OK and final OK. This is the actual +=0ece0e1=/Core=a8f48f5= installed source selection, not merely a source-clone test. +An isolated ABI owner diagnostic (cohort52) passes25.84s and produces no targeted +stack sample because the trigger does not recur. It is not the full shared +process and does not close the full source idle5 failure. No retry is labeled +as that repair. Both repos remain clean and pushed to their existing PRs. + +** Current acceptance boundary after a8f48f5 + +Run40258488174 installs declared dependencies successfully on Linux and reaches +package-cache publication. On macOS, job121365530262 proves cores=2 then still +exits124/status31744 in Core build.ss before Parser. The raw final-head log is +=parser-any-ci-0ece0e1-macos-prepare.log=. Removing duplicate enrollment is a +qualified ownership correction, but is not sufficient to repair this cold180s +failure. Do not describe it as the timeout root cause or a closed performance +fix. Further cold package-build profiling is required; no check, public target, +heap or watchdog was removed. Full shared-source idle5 remains separately open. +Parser Type audit, native build,33-case slice, semantic24-group execution, +bootstrap negative controls and11 Worker controls are established as listed; +Linux/macOS full CI is not established. The retained native update dispatcher +failure is also not repaired. Gerbil/SDK source is unchanged. + +** Authorized Core cold-build budget change + +The user authorizes relaxing Core's180-second limit because macOS cold builds +can take longer. Core PR19 =0e3c1f8= changes only its native package-entry +shebang from180s to300s. Parser PR13 =25bcbaf= propagates that immutable pin. +This is an explicit policy change, not a claim to have repaired a performance +regression. Existing old-budget failures remain retained, as do the corrected +cores=2 logs. Two workers, current heap settings, TERM/KILL behavior and all +source/runtime watchdogs are unchanged. Parser has no restored package build +cutoff. The same package entry applies the300s budget on both platforms; no +platform-specific wrapper or new builder is introduced. No Gerbil/SDK change. + +The old macOS run at0ece0e1 explicitly exports GERBIL_BUILD_CORES=2 at bootstrap +and dependency installation. Within the Core portion, the log records252 target +announcements and412 backend-job announcements before exit124, with further +compile-file work immediately before termination. These are started tasks, not +completed products. Two workers do not bound whole-package cold duration to180s. +The evidence establishes an enforced budget exhaustion during active native +compilation, rather than an absent concurrency setting; it does not establish +a minimal achievable cold-build time or a completed performance optimization. + +The full-source diagnostic cohort53 does not reproduce ABI idle5 and therefore +captures no targeted stack; its non-reproduction is not a repair. It exposes a +deterministic lexical fixture migration bug instead: Symbol Mode was selected, +while every actual step supplies #f. The fixture now chooses False/False and +asserts that a Symbol Mode is refused with native TypeError, preserving all +Unicode/NUL byte-span and EOF checks. The three-case lexical Suite passes20.61s +(cohort54); Parser PR13 =5ce3e07= publishes the correction. No Any fallback. +Canonical Core0e3c1f8/Parser5ce3e07 builds pass45.48s/37.02s incrementally; +new CI40260095201 and full-source cohort57 must supply their own acceptance. +Old idle5 failures remain unclosed until a reproducible attribution is established. + +Full-source cohort57 passes ABI admission and the corrected lexical owner, then +fails the qualification-output negative control because the executor sandbox +rejects native ps -axo pid=,ppid=,pgid= (Operation not permitted). The test +requires that topology read to stop its owned error-producing child. This is an +execution-capability failure, not an assertion to remove or a watchdog to relax. +The raw failure is retained. Cohort58 uses the same registered checkout, commands, +workers, heaps and watchdogs with native process-inspection permission; no +project/private environment or source patch is introduced to bypass the control. + +** Actual spec work supervision and diagnostic/data isolation + +Native-permission full-source cohort58 passes the previous ABI/lexical and +process-inspection boundaries, but library-build-entry then refuses idle5 after +BUILD-SPEC-IMPORTED4416. The import-only fixture cannot observe evaluator work +or the subsequent Core source projection. An intermediate source-only bridge +(cohort59) also refuses while importing Core admission before that bridge is +installed; this attempt is retained and is not the repair. + +Parser PR13 =5825b32= removes the duplicate import-only observer and reuses the +existing call-with-compiler-import-progress, which observes native import and +evaluator boundaries. Within that extent the fixture installs Core's actual +read/parse/projection observer. Cache hits, elapsed observations and request-only +counters emit nothing. Spec data remains exactly one datum in its own file; +there is no timer, new builder, new environment, or source watchdog increase. + +The existing compiler observer now captures its diagnostic port when installed. +Otherwise callbacks invoked while main writes the spec redirect diagnostics into +the data file. Cohort64 runs the exact previous profile source from5ce3e07 and +the candidate in one native process: the former corrupts the nested data stream, +the latter retains a clean datum plus complete diagnostics. It passes11.48s with +OBSERVER-CHANNEL-BASELINE-REFUSED and OBSERVER-CHANNEL-CANDIDATE-OK. No installed +source is reverted. The new declaration-safe helper case checks this property +alongside the preserved zero/multiple values, exception/trace restoration, +admission refusal and child-failure controls. Two-owner cohort63 passes48.58s: +actual spec query plus16 compiler cases, all HARNESS-OK/final OK. A parser build +passes59.92s (cohort60), two workers/2GiB and no package cutoff. + +Both OS run40260095201 successfully finish declared dependency installation with +Core300s before the observer-only followup supersedes it. Linux preparation +passes; macOS reaches conformance compilation. These prove progress beyond the +old cold dependency gate, not full acceptance of the newer head. Final +CI40262352809 and the complete source runner must qualify5825b32 separately. +The older ABI-specific idle5 has not been reproduced with a blocking stack; +passing later owners is not retroactive causal attribution for that failure. + +Final registered5825b32 native build passes42.39s (cohort65), two workers/2GiB, +no Parser package deadline. Complete source cohort66 passes175.00s with +TEST-SUITE-OK modules=145,145 owner receipts/1087 cases, zero failed owners and +zero timeouts. It uses two Workers,3GiB, total90/idle5 and native ps permission. +The real spec child reports12224 source events, excluding cache/request/time +observations. This is full current-source qualification, not a replacement of +old failed logs. It validates the reproducible fixture/progress corrections; +it cannot reconstruct the uncaptured stack from the older ABI-only refusal. +The final-head Linux/macOS run40262352809 remains a separate required gate. + +** Final exact-head OS acceptance + +Parser5825b32194edb0f009386587192d71036ae4e871 run40262352809 completes SUCCESS: +12 enabled jobs pass and5 original conditional jobs skip. Both OS preparation, +semantics, FFI and generation pass; Linux pinned corpus passes. Both semantics +logs independently contain145 owner receipts/1087 cases,24 compiled semantic +groups, declared process closure and all11 Worker-control receipts. The raw +logs and parsed summary are retained under current-pr/parser-final-5825b32-*. +Skipped diagnostics/CPU/macOS corpus are not claimed as separately qualified. + +The first successful macOS Core300s cohort5ce3e07 records Core's first target at +02:42:59.291 UTC and native build return at02:47:00.464 UTC, an observed241.17s +interval before subsequent development-package work. This is an observed log +interval, not a CPU time or minimum-build claim. It demonstrates why the old +180s whole-entry fence was insufficient in that cold cohort despite cores=2. +The higher budget is explicitly authorized policy, not an optimization result. + +The reproducible fixture Mode mismatch, import-only supervision gap and nested +diagnostic/data corruption have concrete controls and corrections. The earlier +ABI-only missing stack remains an evidence limitation, not a retrospectively +invented root cause. Current full source and OS qualification is established; +full Core scale/independent CI, downstream Agentic/root acceptance and the native +tagged-update dispatcher issue are outside this Parser acceptance claim. diff --git a/docs/10-19-design/10-architecture/10.109-parser-poo-revision-and-redundancy-audit.org b/docs/10-19-design/10-architecture/10.109-parser-poo-revision-and-redundancy-audit.org new file mode 100644 index 0000000..1992480 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.109-parser-poo-revision-and-redundancy-audit.org @@ -0,0 +1,293 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: 10.109 Parser POO Revision and Redundancy Audit +#+LANGUAGE: en +#+PROPERTY: JD_ID 10.109 +#+OPTIONS: toc:2 num:t +#+FILETAGS: :parser:poo:audit:contracts:collections: + +[[file:10.108-parser-directory-modules-and-init-build-refactor.org][Implementation and retained evidence]] | [[file:../../90-99-views/90-architecture-views/90.99-library-contracts.d2][Architecture view]] + +* Scope and observed source tuple + +This is an audit and proposed refactor, not an implementation cutover. Parser +remains at5825b32194edb0f009386587192d71036ae4e871. Its one direct dependency is +Core0e3c1f8aa905f7b9297cebf4725ea57d74175f76; Core declares and the native prefix +actually loads POO29c58aa9c5be103ba843767e3d22ef8802b79342. + +POO PR13 advances during inspection from acccaadc to +7f133e9407f3301359ec02108044596706fefdde. The clean reference checkout is updated +to that detached source snapshot; installed dependencies and Parser/Core source +remain unchanged. The new head adds finite Set-image output capture before +element recognition. The wider delta adds collection request capture before +metadata/delegate effects, transitive origin guards, comparer ownership, ordered +selection/decomposition and batch semantics. + +=type.ss=, =mop.ss=, =object-contract.ss=, =function-signature.ss=, +=types/validation.ss= and =support/option.ss= are unchanged between the installed +pin and this source snapshot. Ordinary Record/Function/Map/Option reuse is +therefore already available; it must not be presented as requiring the new pin. +At the last upstream check, the single-process POO check was still running. +An eventual upstream pass does not qualify Core/Parser adoption by itself. + +The package declarations remain the revision authority. These hashes record +audit observations; this document does not introduce a version registry. + +* Findings and intended ownership + +| ID | Priority | Parser location | Finding | Target ownership | +|----+----------+-----------------+---------+------------------| +| R0 | Correctness first | src/modules/parser/types.ss:154--196 | Custom boolean/validation paths duplicate Core and lose normalization; exact-descriptor identity does not guard supported mutation | Core owns admission and returned candidate; Parser owns ancestry metadata and grammar obligations | +| R1 | Correctness first | src/utilities/lists.ss:31--37 | find conflates a present false row with absence | Preserve presence explicitly through existing Option or matched list cells; preserve domain collision policy | +| R2 | Declaration consolidation | src/modules/parser/types.ss:36--108; compiler/types.ss | Five scalar classifiers, coarse ParserList responsibilities and a second slot inventory repeat native/Context machinery | Native value Types declare fields; Core supplies contextual evidence; retain named compatibility identity only where required | +| R3 | Domain consolidation | runtime/function-types.ss:16--55; compiler/lr-table.ss:24--64 | Terminal/precedence/action data language has two descriptions with different fork/guard semantics | One Parser-owned data vocabulary; producer bounds and selected-action restrictions remain separate refinements | +| R4 | Typed index boundary | modules/parser/graph-query-types.ss:22--28 and graph-query-objects.ss | Index Type checks only hash-table?, and the raw mutable index escapes | Existing typed Map and explicit graph invariants first; latest persistent collection construction only where needed | +| R5 | Small duplication | compiler/lr.ss:38--41; utilities/lists.ss:13--16 | append-unique has identical implementations | One utility owner with unchanged order, duplicates, equality and identity behavior | +| R6 | Metadata duplication | schema.ss:5; normalize.ss:233,245; bound-ir.ss:182; parser-ir.ss:111; language/assembly.ss:39 | Grammar IR schema literal is repeated despite an existing declaration | Read the existing native schema declaration; retain every current format/ABI value | + +** R0: reproduced normalization loss and mutable-Contract bypass + +Parser's =parser-object-validate= admits a refined descriptor through Core but +returns the original candidate. Core's authoritative implementation at +=object-types/contracts.ss:312--316= returns the evidence's actual candidate. + +Read-only native cohort67 uses a legitimate normalizing value Type on a refined +Grammar Contract. Core evidence contains name=normalized; Parser validate returns +name=original. The probe reports =NORMALIZATION-LOSS-REPRODUCED= in6.96s. + +Cohort69 then uses supported POO slot mutation in a disposable process, restoring +the slot on exit. Adding a rejecting obligation to the exact builtin Grammar +Contract yields Core admitted=#f, Parser member=#t and Parser validate returning +the candidate. It reports =BUILTIN-CONTRACT-OBLIGATION-BYPASSED= in6.90s. +The private exact-descriptor comparison protects neither revision nor the actual +obligation/classifier/responsibility protocol. No source or installed file is +changed by these probes. + +Remove the Parser-specific success path rather than adding another revision or +validation cache. Inherit Core's element/validate/admit behavior, retaining stable +family prototypes, Parser identities and grammar graph/composition obligations. +Any genuinely needed fast path belongs in the framework under its complete +mutation and normalization contract, with measured cost and parity controls. + +Acceptance requires the normalized result and Function wrappers to reach callers; +supported descriptor changes to be honored or explicitly refused; classifier and +obligation execution exactly once; correct missing-field/ancestry refusal; and +original callback exception identity. Existing refinement tests are retained. +The green145-module baseline did not test these two specific observations. + +** R1 and R5: ordered lists are not an arbitrary Set/Table + +Cohort68 selects Bool rows and Symbol keys through the actual typed +=make-list-operations=. Merging existing rows=(#f) with incoming=#t under the +same key returns(#f #t) and calls the conflict handler zero times. It reports +=FALSE-ROW-COLLISION-LOST= in7.43s. Both values are legal Bool rows; this is not +an invalid-input case. Existing Option distinguishes missing from=(some #f)=. + +Retain the existing collision policy: identical duplicates reuse the original +rows, conflicting duplicates invoke the domain handler, and a new row appends. +Do not replace it blindly with latest =.<-iter=, whose repeated-key policy is +last-wins, or a backend constructor with its own duplicate convention. + +The duplicate append-unique body can share its existing utility implementation. +=union-values= deliberately preserves duplicates already in the left sequence. +An unordered Set or a sorted Table would change observable ordering and possibly +serialized IR digests. Acceptance includes false rows, absent rows, equal versus +conflicting duplicates, handler count/cause, left identity and exact list order. + +** R2: use existing native declarations without changing evidence silently + +Core already exports =yuanxu-predicate-contract= and native POO already exports +Symbol, Exactly, Enum, Pair, List, Record, Map and Function. Parser's five +scalar classification wrappers repeat this framework behavior. Ordinary field +Types should migrate to one native value declaration; contextual responsibilities +must describe contextual obligations rather than a second ordinary field schema. + +Do not replace ParserList with List Any. Give parents, roles and composition +their actual domains; define section rows from the existing grammar vocabulary. +Record versus nominal defstruct is a representation choice, not a requirement +to convert all runtime carriers into open objects. + +There is a compatibility boundary: predicate classification can produce rejection +evidence whereas native value validation can raise TypeError. Preserve/document +the public identity, boolean membership, error/diagnostic order and contextual +admission contract before removing named wrappers. Native Record must not be +used to silently alter this distinction. Parser keeps grammar semantics. + +** R3: share the data vocabulary, retain producer and execution rules + +The compiler requires bounded state/production indexes and flat multi-alternative +forks, and permits layout guards only under the declared layout capability. +The runtime selected-action Type also admits layout-shift and recursively checks +fork branches. These are distinct phases, so sharing a predicate wholesale is +incorrect. Current duplicated leaf descriptions have already required a shift +precedence correction during10.108. + +Define the common terminal/precedence/atomic-action vocabulary once using native +Types where useful. Overlay full-table bounds/capability checks and selected-action +projection checks at their actual owners. Preserve the existing tagged-list wire +format unless an explicitly qualified migration replaces it. Wrong tags/arity, +negative/out-of-range indexes, malformed precedence, raw guard escape, cycles, +fork cardinality and original failures need distinct positive/negative controls. + +* Where the latest POO revision actually helps + +POO =table/mapping.scm:6--21= captures list spines and binding Pair shells before +metadata discovery and constructors. =table/styles.scm:525--532= does the same +before public style delegates. =table-sources= captures declared origins before +later getters; operations guard supported descriptor mutations. Latest7f133e94 +also captures finite image outputs before Set element recognition. + +These capabilities fit declared catalog/registry or graph-index construction when +a persistent snapshot or derived indexes are required. They do not promise deep +immutability of arbitrary row objects, safe stateful callbacks, external-effect +rollback, a global revision/ABA fence or a universal speed improvement. + +For the current graph context, start with an explicit Id-to-Row Map Type rather +than hash-table? alone, retain the normalized index result, and specify whether +the returned context exposes a live mutable carrier or a captured snapshot. +Capture derived identities/parents/kinds under a declared callback policy if that +is the intended snapshot. Membership/type checks do not prove index/view/count +agreement; Parser must enforce those graph invariants and its duplicate/parent +policy. Do not silently change the current #f no-parent sentinel policy. + +A persistent Table backend is a subsequent design choice. RationalDict is +numerically keyed: overriding Key to Symbol does not change its numeric comparer +or tree semantics. Generic graph Id Types require a compatible explicitly +selected backend/equivalence, or the current hash backend. There is no automatic +representation inference. Preserve callback exceptions and ordering. + +Adoption controls include mutation of input spines/Pair shells from metadata or +child callbacks, invalid occurrences hidden by later duplicates, descriptor +changes, normalized Function leaf identity, missing versus stored false, declared +key equivalence, late failure without partial publication and exact row order. +Do not reimplement Table delta/index/style/origin machinery in Parser. + +* Retain and avoid speculative rewrites + +- =compiler/funcs.ss= dense-ID bitsets, LR worklists and specialized runtime + action indexes are compiler representations, not redundant application tables. + Generic collection APIs require a separately measured semantic/cost comparison. +- Existing token/checkpoint defstruct carriers plus POO Types retain nominal + worker ownership and byte-offset invariants; no blanket Record conversion. +- Character and parse-artifact predicates express actual host/domain properties. + Keep them where no equivalent declared primitive exists. +- Graph duplicate/parent/lineage semantics and grammar/LR normalization remain + Parser responsibilities. POO collections do not infer graph policy. +- Gerbil module loading, Core source/currentness and build supervision are not + replaced by POO Table origins. The latter do not attest source bytes or issue + publication authority. +- Keep the seven documented Any boundaries unless their semantics change. Do + not hide a broad domain behind a nominal alias merely to remove the spelling. + +* Proposed execution order and gates + +1. Fix R0 on the current dependency tuple. Add the two observed regressions and + verify Core/native normalization, mutation, invocation counts and errors. +2. Fix R1 and consolidate R5 with exact order/identity/conflict controls. +3. Consolidate field and LR declarations (R2/R3) and schema reads (R6), keeping + native versions, tagged formats and Parser semantic responsibilities. +4. Qualify the chosen immutable POO PR snapshot, then update only Core's POO + declaration and propagate Core's revision through Parser's existing dependency. + Do not add a second direct POO dependency or modify the installed pin by hand. +5. Apply R4's typed index and explicit ownership policy; use latest persistent + construction/index APIs only for the selected representation and actual need. +6. Run currentness/source/normalization and callback negative controls, complete + source/compiled/cold/recovery gates and exact-head Linux/macOS CI. Preserve + two workers/current heaps, Core300s, source total90/idle5, no Parser package + deadline and no Gerbil/SDK edits. Profile any receipt/index cost change before + making a performance claim. + +No implementation, package pin, test source, acceptance gate or directory layout +is changed by this audit. The three diagnostic scripts and logs are cohort67--69 +under the existing current-pr evidence directory. Their zero exits mean that the +unexpected behavior was reproduced, not that production correctness passed. + +* Implementation follow-through (current working cohort) + +R0/R1/R2/R3/R5/R6 are implemented in the existing Parser PR13 working branch. +Grammar field declarations now use POO Record; Core owns all admission/member/ +validate methods and the actual normalized candidate. Public contextual scalar +Contracts use Core's predicate constructor. Native shape rejection is TypeError; +contextual obligations retain negative evidence. The list merge matches cells, +not truth-valued rows. LR terminal/precedence leaves share one runtime data module, +while compiler phase bounds/fork semantics remain. All Grammar IR consumers read +src/schema.ss. Shared precedence syntax preserves the distinct scalar domains: +runtime native exact Integer and compiler's historical integer? (including +inexact integral ranks). Positive/negative controls cover the distinction; no +incidental grammar compatibility or cache-revision change is introduced. + +The first local source writer passes in170.09s (two workers/2GiB; no Parser build +deadline). Focused native source execution passes six modules/39 cases in111.96s, +including returned Function wrappers, descriptor mutation/restoration, exception +identity and false-row/order controls. R4's optional representation/backend +selection is not silently folded into this correctness change. No dependency +revision, schema/ABI, Gerbil or SDK source changes are made. + +Full-source cohort70 stops at the ABI fixture import with idle5; cohort71 repeats +the same refusal and captures a live native stack in dyld/dlopen. The selected +language-entries native objects exist but their generated loader .scm is missing. +These observations are not a Grammar regression attribution or a correctness +pass. The local prefix lacks the complete declared test-product preparation; +follow the existing CI library-object/conformance/test-support owners before +qualification, without clean or a new loader. Cohort72 additionally encounters +sandbox-denied ps during owned-child cleanup; it is not a package correctness +result. Retain the logs and distinguish prepared-product qualification from +unprepared diagnostics. Linux/macOS exact-head acceptance remains pending. + +** Prepared product and source-witness follow-up + +The exact missing local stage is the existing build-ffi-tests.ss writer after +prepare-gxtest!. Its producer-spec already owns the ABI helper, language entries +and every language fixture's dynamic closure. Generic support preparation alone +cannot replace it. Cohort76 still refuses ABI import; running this unchanged FFI +writer in cohort77 passes30.13s and permits ABI loading in cohort78. No loader, +Core, compiler or SDK implementation is changed to conceal the incomplete setup. + +Cohort78 then detects an actual migration omission: the source witness still +reads append-unique/precedence? from their deleted compiler declarations. Move +those source associations to utilities/lists.ss and runtime/lr-data.ss, regenerate +SourceData.lean using the existing writer, and extend independent Lean AST +expectations to the shared terminal/default exact-rank bodies and explicit +compiler predicate. Keep old source-currentness refusal and new predicate/type +mutation controls. Cohort79 passes four focused source modules/30 cases; complete +source and new exact-head CI remain required after the witness correction. + +** Final local candidate80cd0f6 + +CompilerGrammar now inherits the Grammar value Record and overrides only its +three compiler container Types. The native source validator adapter consumes the +new shared declaration with its unchanged full parameter/body list; the actual +optional default and native Integer capability are supplied lexically through +the existing source executor. It no longer requests the removed precedence? +declaration. A source-default versus explicit compiler-rank control is added. + +The final shared-Record writer passes37.01s (cohort81); three source/Scope owners +pass24.02s. Full current-source cohort82 passes160.23s:147 modules/1097 cases, +zero failed owners, zero timeouts, two Workers/3GiB, total90/idle5 unchanged. +The complete Lean build passes273 targets. NativeActionsWitness.source_checked +remains axiom-free and predicate/type mutation examples pass. Existing theorem +axioms elsewhere are unchanged; no complete runtime/compiler equivalence is +inferred from source AST equality alone. + +Commits325e4a3,27bbf33 and80cd0f6 stay on existing Parser PR13. Old27bbf33 Linux +semantics logs reproduce the same missing append-unique source declaration; +its both-platform native preparation/FFI/generation results do not qualify final +semantics. Final exact-head Linux/macOS CI is pending for80cd0f6. No package pin, +format identity, resource gate, Gerbil or SDK implementation is changed. Root +implementation/Agentic acceptance and optional R4 backend adoption remain outside +this Parser correctness/declaration refactor. + +Final-byte native conformance is rebuilt/relinked successfully in127.72s +(cohort83), retaining240/idle5/two workers/2GiB. The existing research owner then +passes21.77s (cohort84):24 compiled semantic groups and all five declared program +entries, with every child exiting0. These are semantic/closure results; the +single-sample benchmark output is not a general throughput claim. Final CI run +40273296661 is bound to80cd0f6ee3af0b6b1d87df33a9b02485e3eb76e4 and remains +pending until all enabled Linux/macOS jobs complete. + +Final baseline run40273296661 completes with11 passing enabled jobs, one failing +macOS semantics job and five existing conditional skips. Linux semantics passes. +macOS refuses library-build-entry-test at idle5 after real import progress; +therefore80cd0f6 is not complete dual-platform acceptance. Continue through10.110 +without relabeling this failure or the prior local successful runs as closure. diff --git a/docs/10-19-design/10-architecture/10.110-parser-poo-engine-organization.org b/docs/10-19-design/10-architecture/10.110-parser-poo-engine-organization.org new file mode 100644 index 0000000..e843d21 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.110-parser-poo-engine-organization.org @@ -0,0 +1,289 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: 10.110 POO Parser Engine Organization +#+LANGUAGE: en + +* Goal and source baseline + +POO owns engine composition, preparation and extension. Contracts admit those +objects; they are not the architecture itself. Concrete private state remains +Gerbil structs/vectors where its ownership and execution properties require it. +This is a staged object engine: choose/compose methods, prepare actual kernels, +then execute the retained kernels with request-local context. + +LeanPoo PR13 is pinned at e229504ef2219463a237812335bb545b1f8419b9 through the +normal Lake declaration and lockfile. Its 17 upstream checks pass at inspection. +Parser's existing 273-target proof package builds with that revision without a +Lean toolchain change. SemanticPreparation additionally imports the new upstream +MethodCompilation laws instead of duplicating continuation composition proofs. +Gerbil POO/Core remain on the declared dependency chain; no direct POO dependency +or compiler patch is introduced to use APIs already provided by Core. + +* Engine responsibilities + +| Concern | Existing files | POO responsibility | Concrete representation / boundary | +|---------+----------------+--------------------+------------------------------------| +| Grammar families | src/grammar/declaration-{types,objects}.ss | Prototype inheritance, declaration composition and typed publication | Shared Record; semantic normalizer owns grammar meaning | +| Compiler stages | compiler/{normalize,lr-compiler,lr-lookahead}.ss | Compose/select stage capabilities and builders; prepare once | FIRST/lookahead bitsets, worklists and native indexes retain their algorithms | +| Semantic backends | runtime/reduction-plan.ss; lr-parser/prepare.ss | Native prototype families and Core multi-argument method selection | Retained callable plans, never generic lookup for every token | +| Scanner and lexical policy | runtime/source-scanner.ss; lexical-lexer.ss | Context/Mode-specific strategy composition and preparation | Worker-owned nominal scan/checkpoint structs and byte offsets | +| Runtime and reuse | runtime/lr-parser/{state,checkpoint,transfer}.ss | Explicit creation/rebind/recovery coordination and capability compatibility | Exact runtime/executor identity, private stacks and snapshots | +| Artifact/query projection | src/graph/graph-query-*.ss | Caller-selected Row/Id/Kind and compatible collection operations | Typed Map/index policy; stable ordering and reference closure remain domain obligations | +| Module/source lifecycle | init.ss; subsystem Types/Config/Build | Core Context/Scope, selection and normalized publication | Core source admission and Gerbil std/make retain authority | +| Verification | formal/ParserEngine; native/source tests | Reuse LeanPoo inheritance/method/selection laws with explicit host premises | Source-currentness, native semantics, resource gates and research measurements stay distinct | + +A hot-path struct is not an alternative object system. It is the engine-owned +representation selected by the object protocol. Replacing every vector/bitset +with a generic collection or redispatching on every character would not establish +better engine organization or a performance improvement. + +* First engine slice: semantic family preparation + +RecognitionSemantics. and EventSemantics. inherit LRSemanticBackend. using native +POO prototypes. The public generic includes its Core-generated generic binding so separately +compiled method declarations use the actual framework admission/generation owner. +Core prototype specializers implement field/alias factory +selection and semantic reducer selection. Derived recognition backends and +neutral mixins participate in the same native precedence and generic generation; +Parser does not linearize again or maintain its own method registry/cache. + +prepare-lr-reduction-plans accepts a backend object. The existing recognition/ +event symbols resolve through one native alias object for compatibility. The +closed case selector and module-initialization factory-pair cache are removed. +Actual factories are selected once by prepare-lr-semantics and retained in its +selection; each grammar materializes its own operand plans from those callables. Native field/alias operand syntax remains the declared grammar +vocabulary, not a license to accept arbitrary opcodes. + +lr-prepare accepts an optional prepared selection or recognition backend. A Core +prototype-specialized preparation method selects action factories and capability +reducers; grammar lowering consumes that retained selection. Wrong representation families +fail before runtime publication. Custom recognition semantics do not silently +switch to the builtin event interpretation when the optional preference is on; +paired event semantics require an explicit later compatibility design. + +This slice exercises inheritance, multiple-prototype composition, method +specialization and plan lowering in actual LR execution. It does not claim full +compiler/scanner/checkpoint protocol refactoring. The compiled lr-parser facade +publishes canonical backend prototypes; a source-private Scope object must not +be advertised as interchangeable with those nominal runtime families. + +* Selection, execution and revision boundaries + +Library publishes family prototypes, method contributions and accepted data +languages. A future Profile selects the canonical compiled backend reference and +its compatible methods/policies. Scenario binds actual grammar, source and +request inputs. Current optional lr-prepare selection is implemented; a complete +Profile/Scenario orchestrator is not claimed. + +Preparation consumes that selection plus validated tables/capabilities and +retains the chosen callables. Requests supply fresh offsets, constructors, +scanning context and tokens. Checkpoints keep exact runtime/executor identity; +a new method contribution requires new preparation, not in-place reinterpretation +of an old checkpoint. Captured callable values do not freeze arbitrary mutable +state read by user callbacks. Mixed representation families and effectful custom +callbacks require explicit admission/compatibility policies before wider use. + +* Continuation of the complete refactor + +1. Align LeanPoo and establish the first native semantic-family slice. +2. Compose compiler preparation stages through existing generic/method facilities; + bind complete program/source footprints and stage-specific rejection policies. +3. Organize scanner/context/lexical-policy families through the same preparation + boundary, retaining nominal worker ownership and byte/character correspondence. +4. Organize runtime construction, checkpoint compatibility and recovery as explicit + POO operations while retaining the private concrete machine state. +5. Select typed graph/catalog/index backends using actual key equivalence, + transactional update and ordering needs; qualify allocation/cost separately. +6. Connect selected declarations and all source/native/formal witnesses to the + project's Library/Profile/Scenario capture and review/delivery architecture. + +Each step requires positive/negative source and native controls, independent +proof-input checks and exact-head Linux/macOS CI. Faster construction, method +cache reuse and generic collections are research comparisons until measured under +matched source, worker, heap, startup/recovery and negative-control conditions. +No universal speedup or whole-engine equivalence follows from the pure laws. + +* Current qualification gap + +The previous80cd0f6 macOS source run refuses library-build-entry-test at idle5, +after actual compiler-import reports. That failure and source trace are retained. +The native spec query's completed-operation reporting and the actual unreported +interval must be examined independently. A new Lean pin, engine slice or retry +cannot retroactively explain the missing native stack or qualify that failure. + +See [[file:../../90-99-views/90-architecture-views/90.99-library-contracts.d2][engine organization diagram]]. + +[[file:10.109-parser-poo-revision-and-redundancy-audit.org][Prior contract/redundancy slice]] + +The first engine model now builds278 targets with latest LeanPoo. It reuses +composeContinuations_foldr and proves ordered kernel application and fresh request +context. These are pure staging results, not proof of arbitrary backend callback +effects, Core native dispatch implementation or machine-code behavior. + +* Executed candidate controls + +The first native engine writer passes396.73s; after public generic-binding +exports and observation changes, the native writer passes408.91s and the existing +qualification writer passes20.08s. Both retain two workers/2GiB and no Parser +package deadline. Six backend cases pass, including actual LR parsing, inherited +and composed prototypes, preparation-only method lookup, retained old callables +after a new method contribution, and wrong-family rejection. + +The spec fixture now installs its existing loader/evaluator observers before +expanding the observer helper's own cold import. The existing compiler observer +reports each completed native import instead of withholding up to63 completions. +A paired source-body probe records old0/new3 completion events for the same three +successful calls; failing imports emit no completion. This isolates a reporting +coarseness defect, not a retrospective native-stack explanation for every old +pause. No timer, heartbeat, alternate builder or resource relaxation is added. +Real spec plus compiler-process control passes two owners/19 cases in104.91s, +including data-channel isolation, multiple/zero values, original exceptions and +negative completion controls. Matching complete source and fresh CI remain gates. + +Baseline80cd0f6 CI completes11 pass/1 macOS semantics fail/5 conditional skips; +its library spec idle5 refusal stays retained. The latest Lean pin and new engine +code are a separate candidate until their own final-head qualification completes. + +* Definition, selected semantics and grammar runtime are separate + +The first broad cohort91 refuses canonical-lr1-reference-test at its unchanged +total90 budget. It is retained. Native prototype dispatch per grammar had added +method preparation to a workload which previously reused module-level choices; +that work amplification is addressed without reviving a closed symbol catalog. + +prepare-lr-semantics selects native action factories and the finite capability +reducer policies once. It returns a private retained selection; it is not another +framework Profile, registry, memoizer or prototype engine. Library publishes its +builtin selected semantics through the same operation. A project Profile can +select a derived backend and prepare it once; lr-prepare(spec, selected) then +materializes each grammar's operand plans without repeated generic lookup. +Passing a raw backend requests a fresh selection; method contributions require +explicit new selection. Old selections and runtimes retain callable values. + +Reducer policies are captured before native object publication so getters do +not repeat selection. Unknown/wrong families still refuse through Core prototype +applicability. A new test requires one selected backend to serve multiple grammar +runtimes without increasing its factory-selection count. Ordered grammar plans, +private runtime identity and fresh request context remain separate data layers. +This is an execution architecture change, not a timeout relaxation or an +unconditional performance claim; matching canonical/full-source/native/CI gates +must qualify the candidate. + +The latest LeanPoo PR advances from f329bae to e229504 with the ordered-query +bound capture fix. Lake declaration and lockfile follow that actual PR revision; +previous 278-target success remains evidence for f329bae until rebuilt. +The first retained-reducer candidate93 exposed a CyclicSlot: POO slot names +shadowed identically named lexical capture variables. Distinct selected-* names +now capture actual callable values; that refusal and its log are retained. + +* Next engine owners and their existing boundaries + +| Phase | Existing boundary to refactor | POO selection versus retained data | Required controls | +|-------+-------------------------------+-----------------------------------+-------------------| +| Compiler | compiler/lr-compiler.ss compile-lr-spec and compile-lr-spec/selected | Select construction/fallback policy before lower/completion/FIRST/state construction; retain native bitsets, state keys and worklists | Preserve reject/probe/selective-GLR meanings, lalr-then-follow fallback, canonical correspondence and bounded construction | +| Scanner | runtime/contextual-scanner.ss prepare-contextual-scanner-plan; runtime/region-scanner.ss prepare-region-plan | Compose matcher/index/context policies before request binding; retain source identity, digest, byte positions and private cells | Wrong source/digest refusal, equivalent rule precedence, isolated scan state and delimiter obligations | +| Recovery | runtime/lr-parser/{checkpoint,transfer}.ss lr-checkpoint-advance, lr-checkpoint-fragment-compatible?, lr-prefix-snapshot-rebind | Select compatible execution/recovery operations; retain exact runtime and executor associations | Changed executor/grammar refusal, fresh rebind input and request isolation; no silent checkpoint reinterpretation | +| Collections | src/graph/graph-query-{types,funs,objects}.ss | Preserve existing Row/Id/Kind parameterization and collection key semantics; select appropriate upstream typed collection only for demonstrated needs | Zero/false keys, collision/equivalence, stable order, closure and update failure preservation | + +These are specific unimplemented follow-on owners, not new parallel subsystems. +Contract work remains at admission/publication boundaries. The parser's existing +algorithms remain their algorithm owners; POO determines composition, method +selection, typed policy and retained execution capabilities around them. + +The previous46db9d9 Linux semantics CI rejects the historical runtime facade +export correspondence after the new backend API is added. The test now admits +only the named semantic API and reviewed private owners, checks exact prototype +method headers and the retained-selection schema, and keeps all unrelated split +forms pinned. Duplicate/missing contributors and an unexpected owner are negative +controls. This updates the source association for the new architecture; actual +backend and parser semantics remain covered by separate execution cases. + +Complete source cohort97 reaches the isolated compiler-policy subprocess and +refuses at idle5. Observer-only cohort98 still refuses: capture-build-text sends +both child output streams into a string, withholding real load progress until +exit. Clearing the source overlay in cohort99 also refuses and is reverted. +The two probes now follow the existing spec fixture: write exact result data to +a private temporary file and stream actual loader/import progress through the +existing run-build-tool. Original environment setup still precedes policy import; +precise result assertions remain. No session is initialized by observation, and +no timer or extra idle allowance is added. These transport controls explain +withheld progress, not a retrospective native-stack explanation of every pause. + +The streamed cohort100 passes the import-without-initialization probe, then the +linker-policy probe writes the correct "/explicit/compiler-tools" result before +idle5 refusal in child termination. The data file is retained as failure evidence. +Both disposable probes now use the existing test-child-process-exit! only after +closing result data; a new failing-child control must remain a process error. +Cohort101 passes all19 compiler-process cases in31.02s. This does not qualify +native library teardown. Core PR19 remains0e3c1f8 (the declared pin), inheriting +POO29c58aa9; the observed POO PR13 head3793685 is a separate reference and is not +misrepresented as the installed dependency. This slice needs no newer POO API. + +* Final local qualification at 7bb870c + +| Owner | Actual result | Boundary | +|-------+---------------+----------| +| Native package writer | PASS108.20s after slot-capture correction | Two workers/2GiB; no Parser package deadline | +| Native conformance compiler/linker | PASS167.49s | Existing240s/idle5 fence; current engine code | +| Complete source slice | PASS209.29s;148 modules/1108 cases; zero failed owners/timeouts | Two workers/3GiB; per-owner total90/idle5 unchanged | +| Native research process owner | PASS25.51s;24 semantic groups +5 programs | 2GiB; existing semantic240/idle5 and program10/idle5 | +| Formal package | PASS278 build jobs at LeanPoo e229504 | Normal incremental Lake build; no cold performance claim | + +Local logs are retained under .data/alignment-20261024/current-pr with final +cohort102 source/research/Lean receipts and cohort96 conformance receipt. +The source-family and policy-pipe failures remain alongside them. No clean, +resource increase or repetition alone is identified as a repair. Production +engine staging, source witness ownership and test-child transport/lifecycle +corrections are distinct changes with separate controls. + +Existing Parser PR13 contains7bb870ccec8e7e66c08af6f8a6b551a4136e6048. +CI40285030288 is still running; only its final-head results can close Linux/macOS. +This root repository's older unqualified implementation remains uncommitted. + +* Collection follow-on: admission effects are an execution boundary + +Latest LeanPoo e229504 captures ordered-query bounds before admission effects. +Parser graph-query-funs.ss currently validates typed callbacks and walks the +selected view/index; Function typing alone does not establish callback purity +or snapshot isolation. The collection follow-on must bind a stable query view and +bounds before invoking effectful admission/predicate code, or explicitly require +a qualified pure callback policy. It must also decide whether the generic Row +language admits #f and distinguish lookup absence from an admitted false row; +current lineage traversal uses hash-get followed by Scheme truth testing. +These are follow-on domain/admission questions, not claims that the new upstream +law already proves the current Parser query implementation. Existing actual graph +row consumers and their source/native controls remain the baseline. + +* Linux product fixture refusal and test-owned mutation + +Final-head CI40285030288 at7bb870c refuses language-product-test idle5 inside one +compound fixture call. Its complete log is retained; the blocking native stack +is unavailable. Isolated local cohort103 passes22.20s and is not called a repair. +The model fixture now asserts its actual directory and source/config contents +and executable publication through the existing test harness before qualification. +These are real input-closure boundaries; no periodic progress is introduced. + +The semantic backend owner also contributes a method generation to the public +engine generic. It now declares existing engine(exclusive #t) metadata so this +mutation cannot overlap other test owners. The runner remains configured for two +workers; existing negative exclusivity/ownership controls remain. This corrects +an actual isolation boundary, without claiming an unobserved causal connection +to the historical Linux pause. Matching final-head CI must qualify the candidate. + +Updated native conformance compile/link passes122.87s under the unchanged240/idle5 +fence. Product plus backend ownership cohort104 passes2 owners/8 cases in21.29s: +product completion precedes TEST-SUITE-EXCLUSIVE modules=1 and all7 backend cases. +Previous-head7bb870c remote CI finishes11 enabled jobs successful and only Linux +semantics refused at language-product idle5; macOS semantics succeeds. New complete +source/native qualification and a fresh head's CI remain separate gates. + +Current06bf469 complete source cohort104 passes226.23s,148 modules/1108 cases, +zero failed owners/timeouts, with the declared mutation owner in the existing +exclusive phase. Updated native research passes24 semantic groups plus5 programs +in24.21s at2GiB. Previous latest-pin Lean278-job success remains unchanged by +these fixture/declaration edits. Fresh CI40288978894 is still a separate gate. + +Current-head Worker control cohort105 also passes every existing control, including +exclusive phase/affinity, invalid metadata, failure and silence propagation, +duplicate owner, reexport and Suite identity refusal. No control is relaxed. diff --git a/docs/10-19-design/10-architecture/10.111-gerbil-test-and-build-ownership.org b/docs/10-19-design/10-architecture/10.111-gerbil-test-and-build-ownership.org new file mode 100644 index 0000000..7868f21 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.111-gerbil-test-and-build-ownership.org @@ -0,0 +1,258 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Gerbil Test and Build Ownership +#+LANGUAGE: en + +* Qualified baseline and current follow-up +The Parser PR13 baseline461fa6f5f232f854fb6dc7da82ed27caed7f50a6 is qualified by +[[https://github.com/tao3k/gerbil-parser/actions/runs/40322019948][CI40322019948]]:12 enabled jobs pass,5 conditional jobs skip, no failures. +Linux and macOS each execute183 unique native test modules with no ERROR output, +HARNESS-OK and final OK. Both cold build preparations, source/phase controls, +intentional failure refusal, research products, FFI and generation pass; Linux +corpus passes. The PR head was re-read at that checkpoint and matched that CI head. + +CI/development own gerbil test/build execution. Test modules only publish Suite, +Case and Fixture declarations. Manual Harness construction, nested test dispatch, +private Workers and old preload/interface-stripping ownership are removed. Shared +corpus/loaders live in per-language fixtures.ss, outside production discovery; +research native closures reject Parser -test modules. Root implementation remains +separate and unqualified; no root implementation commit/delivery is implied. + +The historical refusals and intermediate local gates below remain as evidence; +the final remote result above supersedes their pending status for this head. + +The current domain migration is recorded in [[file:10.113-parser-domain-module-ownership.org][10.113]]. It retains this test ownership +and adds the existing test-support build prerequisite and native output admission +to =test-all=. Current-head qualification is tracked there; the baseline receipt +above does not qualify the later source move. + +* Execution boundary + +CI and development commands invoke gerbil test and gerbil build. A test module +publishes Suite, Case and Fixture values. It must not launch another test round. +Process fixtures which exercise a product subprocess or the compiler's stream +API are different subjects; they do not select or execute test suites. + +Core already publishes TestingScript, module-test-file-source, +module-test-execution and Fixture lifecycle policy. Use those existing facilities +when a selected Module requires source admission or resource policy. Do not +invent a Parser equivalent, synthetic source guard, evaluator launcher or harness. + +* Removed responsibilities + +- compiler-policy-output and its generated gxi expressions, data files and forced + child exit are removed. Two policy Cases live in t/fixtures/compiler-policy.ss, + explicitly executed by the CI/development native test command. +- test-suite.ss, suite-runtime.ss, private Worker scheduling/affinity/exclusivity + fixtures and execution metadata are removed. Ordinary declarations lower to + native std/test values; the native harness owns discovery and execution. +- run-observed-sdk-tests! no longer wraps gxtest in a Parser function. Preparation + no longer deletes test interfaces to force a private source execution route. +- CI and development source-test callers use gerbil test. The native build.ss + still declares the actual Core/std-make projection; no new builder is added. + +* Native inputs and policy + +Native qualified test imports require the package's source parent in +GERBIL_LOADPATH, or correctly compiled dependencies. A checkout whose leaf is +not gerbil-parser must not be concealed by a custom module loader. Use a normal +checkout/worktree with the package name and the existing native package prefix. +This is source-layout alignment, not a second compiler environment. + +Compilation remains configured for two workers and its existing2GiB heap. The +native complete test entry retains the existing3GiB process ceiling. The three +modules with Core-profiled Cases declare native test-setup!/test-cleanup! Fixture +hooks which select the same shared-process Case heap ceiling; Core continues to +own duration, growth, sampling, cancellation and failure policy. The existing15-minute full-entry wall limit remains. Native gxtest has +no Worker option; do not emulate one in Parser. Historical shared-Worker and +per-Worker90/idle5 results are archived, not relabeled as native harness results. +External product/process idle controls remain at their existing owners. + +Native gxtest loads selected modules before reporting the harness. Applying the +old dispatcher's output-idle rule to that pre-harness phase refuses cohorts108 +and110, even after standard Suite compilation. Those refusals are retained; +no heartbeat/preloader is restored. Native total deadlines and explicit final +OK/error admission apply at CI/development entry boundaries. + +* Acceptance and current gaps + +The fresh native policy Suite passes2 Cases in4.99s at2GiB through the existing +90-second qualification entry. A prior native negative run returned process0 +while reporting ERROR CASE/HARNESS, so process status alone is insufficient; +the existing admission gate requires an exact final OK and rejects errors. + +The first complete native compatibility run is diagnostic, not a pass: it +exposes missing qualified source imports under the noncanonical local checkout +and default2GiB Case policy versus a3GiB process. Align source lookup and the +existing Core policy; do not patch native loading or add a runner. + +Required gates: standard package build; native policy2 Cases; affected Suites; +complete native discovery; syntax rejection of retired scheduling options; +existing product/process negative controls; native research Suites and separate product program +entries; Linux/macOS exact-head CI. Mathematical engine laws and LeanPoo revision +remain unchanged by this execution-owner cleanup. + +The canonical51a2a32 checkout passes the policy2 Cases and4 affected native Suites +without import or harness errors. A complete2GiB experiment overflows the managed +heap; it is retained as a refusal. Restore the existing3GiB full-entry ceiling +and relocate the former Case heap selection to a native module Fixture. This is +configuration/lifecycle reuse, not a new test dispatcher or raised heap ceiling. + +An intermediate package-spec Fixture queried the build declaration inside the +runtime process; full discovery rejected that context mixing. It is removed. + +Complete native discovery must use compiled-prefix/lib before the source parent +in GERBIL_LOADPATH. The former private loader silently enforced this precedence; +a source-first path interprets C declarations and creates incompatible runtime +prototype generations. Native configuration now states the ordering directly. +Fixture imports must also follow an existing interpreter directive; two misplaced +shebangs in the first Fixture edit were caught by native discovery and corrected. +No import/loader override is restored. These are current configuration/file-header +repairs; historical native blocking stacks remain unknown. + +The complete native cohort refuses an in-process build spec query because public +compiler-source admission sees already-loaded runtime SSI contexts. Build-source +projection belongs to the existing dev/build.ss check-catalog entry. Its native +comparison now also owns every former public-entry, duplicate, ABI-option and +retired-target assertion. The runtime build-entry Suite and its execution Fixture +are removed entirely. No runtime Suite launches or installs a build context. + +* Complete executor removal +Ordinary tests and research fixture tests only declare Suites, Cases and Fixtures. +No Parser test module calls test-suite!, test-run! or constructs TestHarness. +The private conformance Suite executor, timer threads, manually linked Engine/ +event-fold runners, research Suite launchers and runtime-organization harness are +removed. Existing development recipes invoke gerbil test against those original +Suite modules. Compiler/product subprocess Fixtures remain SUT execution, never a +second test/build harness. Research standalone programs have a separate entry and +retain their existing process budgets; they no longer embed semantic Suite runs. + +The former conformance import/export/Suite partition validator and duplicate +Suite catalog are removed. Native Gerbil discovers exported Suite values. The +remaining build catalog selects helper compilation and research Suite inputs; it +does not reimplement module discovery, test execution, Case policy or scheduling. +The old conformance runner success/failure/timeout receipts are historical only. +Native failure controls must be invoked from development/CI and rejected using +actual harness diagnostics plus final OK, since process exit zero alone is not +sufficient for native Gerbil test acceptance. + +Local cohort116: dev/build.ss check-catalog passes (50.67 seconds); isolated +event-program Suite passes (13.38 seconds). This does not establish full native +closure or remote Linux/macOS acceptance for the subsequent executor removals. + +Cohort117: five affected native modules, five research fixture modules and the +isolated policy module pass. Complete native discovery reports183 MODULE-OK +receipts but is rejected: qualification-output's intentional error cleanup calls +ps, which this execution sandbox denies (Operation not permitted). Native Gerbil +reports ERROR CASE and ERROR HARNESS and does not exit; the failed process was +then terminated externally, preserving its log. This is not a passing full run. +Requalification needs host process-topology access with the same two build workers, +heap ceilings and native total deadlines. No source assertion or cleanup policy +is relaxed to hide that environment refusal. Exact-head CI remains required. + +The host cohort118 passes seven affected modules,183 unique native modules +(250.07 seconds, exact HARNESS-OK and OK, no errors) and standard gerbil build +(62.83 seconds, two workers,2GiB). Research product closure then refuses a missing +static all-languages benchmark module: the removed Suite compiler had implicitly +owned that product input. The corrected build entry prepares only the benchmark +and research program static inputs. It does not restore static Suite compilation, +manual Harness execution, timers or nested tests. This separate product boundary +must pass before remote qualification is considered complete. + +Cohort119 at2cdc733 corrects that product input ownership: native research +preparation/link passes in199.80 seconds with the unchanged240-second/idle5 gate, +two compiler workers and2GiB. All five standalone program controls pass in22.46 +seconds. No clean, timeout increase or Suite executor is used. Full183-module +native coverage and standard package build are recorded at the preceding runtime- +identical a7dd4d9; the subsequent code change only supplies the research benchmark +static input. Current-head Linux/macOS CI remains an independent open gate. + +* Cold closure correction +Both a7dd4d9 CI prepares fail at a different missing static input than the first +local run: languages/tla-plus/parser-test. The benchmark imported parser-test +modules to obtain shared corpus loaders. Historical local Suite objects masked +that dependency, so cohort119's warm link is not cold/Suite-free qualification. +The preserved Linux/macOS logs establish the dependency; no retry or clean is a fix. + +Each language now declares its unchanged corpus/loaders in same-directory +fixtures.ss. Suite modules import/re-export those values; the benchmark imports +Fixtures directly. No corpus text, identity, grammar or assertion is duplicated. +The native bootstrap closure explicitly rejects any Parser -test identity before +linking, even when old compiled Suite products exist. A regular declarative Suite +checks positive Fixture admission and negative Suite rejection. The old per-Suite +translation instrumentation is removed as well. Nine native modules pass at +59e4c3c; product closure, full coverage and current-head CI must qualify this final +ownership correction independently. + +* Final declaration checks +Complete discovery at59e4c3c correctly refuses the old three-file topology rule: +shared fixtures.ss had been classified as private grammar syntax. The updated +contract explicitly separates grammar/parser, Fixture and Suite declarations, +and rejects Fixture imports in production and Suite declarations in Fixtures. +Those are stricter positive/negative boundaries, not a disabled topology check. + +The remaining process/history script tests now export native Suites too. Their +process subjects retain the same exit/receipt/timeout controls and actual timeout +phase observations; no script starts a Harness or forces test-process exit. +Standalone research process admission reuses run-qualified! directly, removing +its duplicate Case wrapper. Twelve affected native modules pass at50b0ab2, +including both converted scripts, all language Suites and the topology/product +closure controls. Full native discovery, final product controls and final-head +Linux/macOS CI remain separate gates. Native ABI Suite startup uses its existing +180-second total budget without the old dispatcher's idle5 bootstrap rule; +external ABI/product idle controls are unchanged. + +* Closed local gates and remaining remote gate +Cohort121 at50b0ab2 passes the complete183-module native discovery (402.22s, +exit0, no errors),12 affected modules, the Suite-free native product link (78.36s) +and five standalone programs (23.59s). Both Linux/macOS3840094 CI catalogs then +expose exactly the eight new Fixture files in independent source discovery. +The existing native development exclusion declaration now excludes those shared +Fixture sources from production. Cohort122 ated0e504 passes check-catalog (89.16s) +and standard gerbil build (84.82s), without a new builder or raised resources. + +Cohort122 also preserves a real scripts refusal: the output-fragment positive +control hit its competing1s idle fence in bootstrap. Directed status/receipt Cases +now retain their2s total budget without that unrelated idle fence. The dedicated +2s/0.1s idle refusal and0.15s total/EOF controls are unchanged. Cohort123 atae14111 +passes all three script Suites (21.68s) and the intentional native failed-Suite +refusal (exit70). Actual wrong-exit observation is17, reason false/session-ready; +missing-marker observation is0, reason false/session-ready. Timeout controls keep +their actual bootstrap phase, without claiming the child reached EOF. + +These later code changes affect the independent production discovery declaration +and the directed process script controls; runtime/parser assertions remain those +of the183-module pass. Final-head Linux/macOS CI is still required. Prior failed +or warm receipts remain explicit and are never promoted to that remote gate. + +Final903e9e3 cold preparation passes on Linux and macOS, including catalog, +standard package/native products and the actual Suite-free closure. Linux FFI, +corpus and generation pass. Both semantics jobs correctly refuse the deliberately +failed Suite but their development recipe then exits127: rg is not installed on +those runners. The recipe now uses system grep -E, without adding dependencies. +Cohort124 at17a52ee executes the complete just test-harness-refusal entry, including +its normal build prerequisite, under a PATH containing no rg: exit0 and exact +GERBIL-HARNESS-REFUSAL-OK in86.96s. This closes the command-entry omission locally; +current-head Linux/macOS semantics still require CI. No failed Suite assertion, +error detection, deadline or heap control is weakened. + +1416036 macOS semantics passes the corrected dependency-free refusal gate, +research Suites/programs and callback GC, then refuses author-controls' old +runtime list-modules expectation. The public grammar macro resolves the author +service with for-syntax/import-module and for-template; runtime module residency +is not its contract and may differ for compiled consumers. Author-controls now +checks the real public resolver in expansion, including refusal of a missing +export. Successful parsing, rejected input, malformed declaration and lexical +binding/hygiene checks remain. No service is forced into runtime residency. +Cohort126 atc22c522 passes all four phase modules from source (16.81s), standard +gerbil compile at2GiB/two workers (22.39s), then the compiled-entry modules (20.67s). +A first literal-construction error was retained and corrected using the native +identifier context required by datum->syntax. Final-head remote semantics remain +open; phase changes affect only these fixture declarations, not parser runtime. + +* Repository boundary +Current Parser PR13 candidate461fa6f adds only the qualified expansion-phase +fixture correction and its evidence after1416036. Current-head Linux/macOS CI is +pending. Root implementation changes remain separate and are not committed or +pushed with this Parser PR. diff --git a/docs/10-19-design/10-architecture/10.112-gerbil-markup-pr1515-research-and-parser-plan.org b/docs/10-19-design/10-architecture/10.112-gerbil-markup-pr1515-research-and-parser-plan.org new file mode 100644 index 0000000..b47c34c --- /dev/null +++ b/docs/10-19-design/10-architecture/10.112-gerbil-markup-pr1515-research-and-parser-plan.org @@ -0,0 +1,353 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Gerbil PR1515: Typed Markup Research and Parser Improvement Checklist +#+LANGUAGE: en +#+STARTUP: overview + +* Decision and scope + +Reuse Gerbil's Djot/XML/HTML capabilities through their public APIs when they are +actually published by the selected compiler distribution. Investigate transferable +scanner, representation and output techniques inside the existing Parser engine. +Do not build a second markup framework, parser registry, source resolver or test +runner. This document is a research and implementation plan, not implementation +acceptance or permission to replace the current compiler. + +The highest-value first slice is: establish the actual stdlib capability, choose +an explicitly semantic Djot adapter, qualify its typed HTML output, then measure +one bounded byte-class scanning improvement against the current scalar path. +A lossless Djot frontend is a separate deliverable with stronger obligations. + +* Source baseline and completed research + +| Item | Observed source / result | +|------+--------------------------| +| Study | [[https://git.cons.io/mighty-gerbils/gerbil/pulls/1515][PR1515: v0.19: Replace SXML with typed XML and HTML modules]]; open at inspection | +| PR repository / branch | =jay/gerbil= / =v0.19-sxml-to-typed-xml= | +| PR head | =49b02af0585ee3884039e7b46477ce70cf401ce2= | +| Target branch tip | =7688c85a8c75a8a8e437d4bbe391a76f0fddfea1= | +| PR merge base | =1c6c15385979f0092574fbc2b828f3fb656319b3=; distinct from target tip | +| Cached checkout | =.cache/gerbil-pr1515=; depth=1, shallow=true, HEAD history count=1 | +| Diff inventory | 74 files; both API pages and the full patch saved | +| Current Parser source | =.data/alignment-20261024/upstream-gerbil-parser= at =461fa6f5f232f854fb6dc7da82ed27caed7f50a6= | +| Installed Gerbil | =gerbil-version-string= returns =1cfb032=; executable/library paths captured | +| Installed Djot probe | =import :std/text/markup/djot= fails: cannot find library module | +| Parser language inventory | Eight existing packs; no Djot, XML or HTML pack | + +- [X] Clone the actual PR branch with depth=1 and verify head/history depth. +- [X] Preserve metadata, merge base, all file names, diff and inspected-file SHA256s + in =.cache/gerbil-pr1515-research/source-manifest.json= and adjacent evidence files. +- [X] Inspect typed node/reader/scanner/builder/emitter/Djot changes and tests. +- [X] Compare against current Parser source, not an old three-interface roadmap. +- [X] Probe the installed runtime through its normal command entry. +- [ ] Compile or run the PR implementation and upstream conformance suites. +- [ ] Produce matched algorithm or end-to-end performance measurements. + +Only the first five items are complete. The failed import establishes absence of +an importable module in the active distribution; it does not establish inability +of Gerbil's language/compiler to compile that module. No compiler, SDK or Parser +implementation was modified, and no PR benchmark was reproduced in this study. +The cached source is ignored by Git; portable source links and the pinned head +below remain the review references when that cache is absent. + +* What PR1515 changes + +- Typed XML nodes, checked public constructors, a byte-oriented XML scanner and + byte-buffer emitter; HTML reuses XML element/attribute/text representations. +- A WHATWG-oriented HTML tokenizer/tree builder, fragment context support, static + atom tables and generated named-character-reference data. +- Djot semantic AST to typed HTML fragment conversion. =djot->sxml= is removed, + =djot->html-fragment= is introduced, and HTML string output is intended to remain + byte-identical. =write-djot-html= uses the new HTML writer. +- TAL reader/compiler/runtime and S3 XML consumers move to typed markup APIs; + old SXML remains under the deprecated =:std/text/markup/sxml= interface. + +The diff does not change =djot/{ast,parse,block,inline,attributes}.ss=. Those files +are useful baseline context, but their algorithms are not innovations of this PR. +The PR's Djot speedups primarily concern representation/rendering/output, not a +replacement of its block or inline parsing algorithm and not an LR-table advance. + +The author reports median Djot parse+render speedup4.4x and render speedup7.7x, +plus302 byte-identical fixtures,7045 tokenizer cases and1963 tree cases with four +selectedcontent skips. These are upstream claims. Their external conformance +runner and complete comparative benchmark corpus are not contained in this PR. +The reported old-implementation crashes are excluded from speedup samples; our +correctness inventory must retain equivalent failing inputs explicitly. + +* Source-grounded comparison + +| Technique / upstream source | Current implementation / classification | Proposed decision | +|-----------------------------+-----------------------------------------+-------------------| +| Typed node structs; checked =xml/types.ss= and private =xml/node.ss= | Grammar already shares POO Record/Contract admission in =src/grammar/declaration-types.ss=; LR action callbacks have domain Types in =src/runtime/function-types.ss= | Reuse upstream nodes for markup interoperability. Keep POO for family/strategy selection; avoid a second node hierarchy and duplicate framework validation | +| =xml/node.ss:skip-plain= and byte tables; four-byte short-circuit scans | =src/runtime/byte-spans.ss= has scalar bounded predicate traversal; =contextual-scanner.ss= already indexes first characters | Candidate: prepare a finite byte-class kernel once, benchmark guarded bulk scans; do not add a second scanner dispatcher | +| Scanner spans and per-request scratch; =html/scanner.ss= token registers | =source-scanner.ss:source-scanner-step= currently substrings lexemes and computes their UTF-8 length; =token.ss= exposes a four-vector protocol | Measure allocation/copy costs first. Private spans may improve materialization, but public token protocol and retained ownership are separate gates | +| Fixed atoms; XML intern cap4096/probe cap16; HTML hash overflow RBTree | Grammar terminal identities are already prepared; contextual matching has indexes/caches | Do not re-intern static grammar symbols. Consider request-local dynamic-name indexing only if profiling finds a real cost/collision problem | +| HTML private mutable builder, then freeze | =event-program.ss= already has bounded blocks, persistent joins and shared subtrees; =source-index.ss= already has balanced indexes and cursors | Audit remaining flatten/copy work. Keep persistent branch/history semantics; do not replace them with a global mutable builder | +| Geometric memory buffer;64KiB Writer chunks; bounded escaping slices | Artifact publication already has canonical event walks in =runtime/artifact.ss=; source/scanner and event sequence ownership exist | Reuse std Writer for markup. Explore publication fusion only behind existing semantic backends and after measuring the complete path | +| DjotRender interface and fresh render-context | =reduction-plan.ss= and =lr-parser/prepare.ss= select POO methods and retain prepared kernels | Preserve existing engine selection. Fresh render state and reusable immutable vocabulary are compatible; per-token generic dispatch is not a benefit | +| Generated entity trie; =html/{gen,entities}.ss= records upstream hash | Existing lexical/contextual IR already generates matcher plans | Adopt only for a measured domain vocabulary. Reuse build inputs/projection; no runtime network fetch, ad-hoc generator registry or copied table | + +Upstream's sentinel scans own a buffer ending in NUL; loops distinguish embedded +NUL from EOF by index. Parser's generic byte-span API receives borrowed bounded +ranges. Its input must not be mutated to install a sentinel, nor scanned past +=until=. Unchecked primitives require a verified internal ownership/bounds +invariant; they are not a mechanical replacement for checked vector reads. + +* Semantic boundaries that constrain the plan + +1. Djot source ranges are zero-based half-open character offsets, with one-based + line/column; CRLF is one line ending but two characters. Parser artifacts use + UTF-8 byte coverage. Reuse/extend the existing source-index mapping and test + multilingual/astral/combining input. Do not relabel character offsets as bytes. +2. A Djot semantic AST, normalized HTML tree, or XML tree is not a lossless CST. + HTML inserts/repairs nodes; XML defaults discard whitespace/comments; Djot + source locations are optional. Original input and digests remain authoritative. +3. Reader acceptance is not resumable parsing: XML/HTML input helpers read the + whole source to EOF into growing storage; =read-djot= also reads/decode-all. + Chunked Writer output is not streaming parsing or incremental-edit support. +4. HTML recovery does not provide our fail-closed accepted/rejected diagnostics. + HTML builder parse errors are not reported. Its scope-window512 truncates + search semantics beyond the window; Djot render depth512 rejects containers. + These are explicit policies, not exact replacements for general LR searches. +5. Typed structs remain mutable. Upstream writers read untrusted slots and recheck + after callbacks; constructor validity does not certify later contents. Circular + lists are not detected, and Writer paths may already have emitted chunks when + a later error occurs. Direct port paths may instead materialize full output. +6. =write-djot-html= builds the typed HTML tree before starting the Writer, avoiding + output for a rendering error, but that does not make arbitrary IO failure or + sink mutation atomic. A future fused renderer must preserve its promised error + boundary or expose a separately chosen weaker contract. +7. =html-raw= is raw unsanitized markup, and browser-style parsing is not a + sanitizer. Any document delivery policy must explicitly choose raw markup/URL + handling. This study does not replace Org as the repository's document source. + +* Responsibility and integration contract + +| Owner | Responsibility | Must not take over | +|-------+----------------+--------------------| +| Gerbil distribution / stdlib | Publish Djot/XML/HTML APIs and their actual build artifacts | Parser-local patches or a private compiler installation | +| POO/Core/Flow | Existing Module/Library/Scope, Contract normalization, selection, lifecycle and input/source binding | A second Parser framework or global cache/role registry | +| Parser compiler | Existing grammar/contextual IR and prepared kernels; verified mappings when a language source is actually supported | Hostile mutation of borrowed input, runtime table construction, browser recovery silently substituted for strict parsing | +| Parser runtime | Source ownership, byte ranges, branch/snapshot isolation, stable artifacts and diagnostics | Calling a semantic AST a lossless artifact | +| Selected markup adapter | Std Djot semantic parsing/rendering and explicit source/range/result policy | Duplicating the std parser, HTML writer or XML node types | +| Library/Profile/Scenario | Publish capabilities/obligations; select result/resource policy; capture actual project input and realized sources through existing mechanisms | Version declarations in Org, namespaces with added versions, invented capture/authority schemas | +| CI/development | Native build/test entry, source and compiled coverage, benchmark operation selection | Test files starting another test/build round | + +* Implementation checklist + +Checked boxes below must be supported by a source or execution receipt. Proposed +file locations are responsibilities to implement, not claims of current APIs. + +** M0 — Capability and source alignment (first blocker) + +Owner: compiler/package maintainers. Inputs: pinned PR, active compiler identity, +stdlib publication and current native package declarations. + +- [ ] Identify the normal upstream release/PR chain that publishes the needed + stdlib modules; record actual source, checkout, compiler, build and load origins. +- [ ] Resolve the observed absent =:std/text/markup/djot= through that publication + chain. Keep one inherited dependency source; do not vendor the74-file change. +- [ ] Verify =string->djot=, =read-djot=, =djot->html-fragment=, =djot->html= and + =write-djot-html=, typed XML/HTML APIs, and the removed =djot->sxml= boundary. +- [ ] Qualify native compile, import, cold start and restart with declared two + build workers,2GiB build/3GiB full-test ceilings and existing test budgets. + +Acceptance: real stdlib imports and sample parse/render work from the selected +installed artifacts; missing module, wrong revision, old SXML entry and changed +compiler source are refused or explicitly diagnosed. A compiler language-version +string alone does not close this gate. No Gerbil/SDK modification is made by +this research task. + +** M1 — Semantic corpus and baseline (depends M0 for execution) + +Owner: language/verification maintainers; =languages//fixtures.ss= and +existing =language-test-support=, qualification and ASP benchmark facilities. + +- [ ] Pin official Djot fixture source and complete expected outputs; record302 + as an upstream expectation to reconcile, not a hard-coded successful count. +- [ ] Pin html5lib/WPT corpus revisions, retain skips and obtain/audit the missing + external harness before claiming its7045/1963 results locally. +- [ ] Establish separate parse, typed-node conversion, write, complete + parse+render, read+parse, artifact publication and edit/reuse measurements. +- [ ] Include source/string/bytes/port/Reader and output/string/bytes/Writer + variants, malformed input, invalid UTF-8, embedded NUL, deep/wide trees, + entity-heavy text, large attributes and multi-megabyte source. + +Acceptance: immutable corpus hashes, complete positive/negative inventory and +baseline outputs/costs; excluded crashes/skips are visible. Correctness and +performance sample eligibility are reported independently. + +** M2 — First std Djot integration slice (depends M0–M1) + +Owner: Parser language/API maintainers. Use existing =language-support/entry.ss=, +=src/language/source-descriptor.ss=, =src/compiler/source-language.ss= and Module selection. + +- [ ] Inventory existing adapter/result contracts before adding a binding. Expose + a named semantic Djot capability with actual stdlib method/source bindings. +- [ ] Keep typed Djot/XML/HTML values native; use specific defstruct/Record/POO + family contracts where the adapter adds domain data, not =ScopeOf Any Any=. +- [ ] Specify original-source retention, byte/character mapping and normalized + output identity. State result kind before selecting artifact publication. +- [ ] If a lossless Djot pack is required, implement its real lexical/structural + coverage in the existing compiler IR and use std Djot as a semantic oracle; + preserve complete byte coverage, trivia, diagnostics and incremental state. + +Acceptance: named semantic input/output contract, Unicode range agreement and +byte-identical expected HTML. Missing source locations and a normalized-only AST +cannot satisfy a lossless ParseArtifact obligation. Existing eight packs retain +behavior and actual normalized Contract results are consumed. + +** M3 — Boundary and callback ownership (depends M1–M2) + +Owner: runtime/adapter maintainers; current =token.ss=, =artifact.ss=, +=source-scanner.ss= and the native markup adapter. + +- [ ] Audit validation at publication/use boundaries; keep existing Grammar and + Function contracts and avoid adding duplicate descriptor/field checks. +- [ ] Separate checked public construction from internal kernels. For external + mutable nodes, choose snapshots/borrowing rules and defend against callbacks + invalidating cached fields; do not rely on erased typed-slot checks. +- [ ] Keep request-local render/reference/note/intern state out of public ASTs + and reusable prepared backends; define cache invalidation by actual inputs. + +Acceptance: mutated slots/strings/lists, wrong-family nodes, cross-request state, +re-entrant writers, exceptions and sink failure cannot corrupt retained artifacts; +error category, partial-output policy and cleanup order remain explicit. + +** M4 — First algorithm experiment: finite byte-class bulk scanning (depends M1, M3) + +Owner: compiler/scanner maintainers; =runtime/byte-spans.ss=, +=runtime/contextual-scanner.ss=, =runtime/scan/regular.ss= and existing lexical IR. + +- [ ] Profile predicate calls, checks, UTF-8 work and bytes traversed before + choosing a kernel. Account for existing first-character indexes. +- [ ] Prepare class tables through existing compiler/POO method selection, once + per compatible plan; retain scalar fallback for arbitrary/contextual predicates. +- [ ] Prototype bounded four-byte traversal without a sentinel write or access + past a borrowed span. Keep invalid UTF-8 handling and lexical-mode semantics. +- [ ] Compare complete token/event vectors with the current scalar implementation. + +Acceptance: exact scalar agreement for all256 byte values and every short tail, +empty/interior/end spans, NUL, high bytes and malformed sequences; grammar-specific +longest-match/order semantics unchanged. A component-only win is not a parser win. + +** M5 — Copy/materialization and typed output (depends M1, M3; optional after M4) + +Owner: runtime and document consumers; =source-scanner.ss=, =token.ss=, +=source-index.ss=, =event-program.ss=, =event-reduce.ss=, =artifact.ss=. + +- [ ] Measure substring allocation/UTF-8 recounting and repeated materialization; + distinguish source-backed spans from the public lexeme-bearing token protocol. +- [ ] Reuse existing persistent blocks, indexes and cursors. Compare any private + transient builder against retained branches/snapshots, never replace them globally. +- [ ] Reuse std typed HTML/XML writers; measure avoiding intermediate SXML and + repeated string/output conversions before considering producer-consumer fusion. +- [ ] Define validation-before-write versus partial streaming output separately. + Inventory native artifact publication before selecting staging/atomic publication. + +Acceptance: old token APIs/IDs/digests, UTF-8 ranges, roundtrip, failed-branch silence, +old snapshots, inverse edits and publication closures remain correct. A sink error +must not falsely publish a completed artifact. Fusion is rejected if it weakens +these obligations or only shifts work outside the measured interval. + +** M6 — Optional vocabulary/index optimization (depends M1, M3 and profiling) + +Owner: contextual-IR and language maintainers; =compiler/contextual-scanner-ir.ss=, +=runtime/contextual-scanner.ss= and language-specific declarations. + +- [ ] Measure dynamic-name lookup separately from already-interned grammar kinds. +- [ ] Evaluate bounded request-local name indexes or generated tries only for a + demonstrated vocabulary cost; do not add a global symbol/name cache. +- [ ] If using generated tables, track source hash, generator, options and outputs + with existing Module/build input declarations. Audit upstream data licensing. + +Acceptance: same-name identity, collision/overflow behavior, hostile name sets, +attribute order and longest-prefix matching remain deterministic. Changed source +or generator invalidates reuse. No runtime network access or handwritten entity +registry is introduced. + +** M7 — Resource policy and failure semantics (depends M2–M6 as applicable) + +Owner: policy/runtime maintainers; reuse current Core/Flow resource/Fixture policy. + +- [ ] Select explicit input/tree/depth/output limits for the intended consumer. + Record upstream whole-input buffering, unchecked circular lists and scope-window + behavior; do not copy512 or64KiB as universal policy constants. +- [ ] Keep HTML recovery, strict parsing, resource exhaustion and unsupported + constructs distinct; expose them through existing result/diagnostic mechanisms. +- [ ] Select raw HTML/URL handling explicitly; type validity is not sanitization. + +Acceptance: deep trees beyond the chosen limit, cyclic external values, oversized +input/output, invalid namespaces, mutation and failed IO are finite, diagnosed +outcomes. A truncated scope search must not silently certify strict grammar or +language semantics. + +** M8 — Mathematical and source correspondence (depends selected M4–M7 experiment) + +Owner: formal/verification maintainers; existing =formal/ParserEngine= and LeanPoo. + +- [ ] State and prove the selected pure obligation: scalar/bulk scan agreement, + range preservation, ordered concatenation, capacity bounds or snapshot isolation. +- [ ] Reuse current prepared-method and event-sequence laws; do not duplicate POO + inheritance/dispatch machinery or derive implementation correctness from typings. +- [ ] Bind source witnesses, full input footprint and native controls to the exact + implementation. A proof over an abstract kernel does not verify unsafe machine + reads, callback lifetime, allocations or actual compiler optimization. + +Acceptance: native positive/negative and source-correspondence evidence remains +separate from Lean results. Any unclosed correspondence or host premise is listed. + +** M9 — Comparative selection and release gate (depends M1 plus chosen changes) + +Owner: benchmark/CI maintainers; native CLI/just + existing ASP benchmarks. + +- [ ] Register candidate, baseline, actual compiler/options, output semantics, + corpus/source hashes, worker/memory policy and useful improvement/regression + criteria before measurements. Keep cold and warm samples distinct. +- [ ] Use repeated matched batches with dispersion/confidence reporting; include + decode, parse, projection, write, complete path, retained memory, allocations, + GC and source/edit distributions. Report cost per input/output byte where useful. +- [ ] Retain failures and negative controls. Counterbalance run order; CPU pinning + is recorded when available, otherwise report uncontrolled host scheduling. +- [ ] Keep native test files declarative; CI/development invokes gerbil test/build. + Run focused source/compiled tests, native production catalog, full Parser cases, + restart and Linux/macOS exact-head CI without a new private executor. +- [ ] Select or reject each experiment using the preregistered complete-path and + resource criteria; component gains and upstream ratios cannot substitute for it. + +Acceptance: useful measured improvement with no semantic/control regression; +otherwise retain the simpler current kernel and document the rejected hypothesis. +Only actual implemented/verified capabilities may be published by Library and +selected/captured downstream. Org and D2 describe those results; they are not a +second version source or an implementation acceptance certificate. + +* Dependency order and current open decisions + +=M0 -> M1 -> M2 -> M3= establishes capability, semantics and ownership. +=M1 + M3 -> M4= is the first general engine optimization experiment. +=M5= may follow in parallel as a separate measured hypothesis; =M6= is conditional. +=M7/M8= apply to each selected candidate; =M9= closes its evidence and adoption. + +Open: installed stdlib release/publication alignment; exact std Djot API source; +semantic adapter versus actual lossless frontend requirement; external conformance +runner/corpora; profiling attribution; meaningful gain/regression thresholds; +consumer raw-markup/partial-output/resource policy; source-to-proof correspondence. +No unchecked item is implemented or qualified by this research document. + +* Pinned source references + +- [[https://git.cons.io/jay/gerbil/src/commit/49b02af0585ee3884039e7b46477ce70cf401ce2/src/std/text/markup/djot/api.ss][Djot API and whole-input/Writer behavior]] +- [[https://git.cons.io/jay/gerbil/src/commit/49b02af0585ee3884039e7b46477ce70cf401ce2/src/std/text/markup/djot/html.ss][Typed rendering, fresh context and depth guard]] +- [[https://git.cons.io/jay/gerbil/src/commit/49b02af0585ee3884039e7b46477ce70cf401ce2/src/std/text/markup/djot/ast.ss][Djot source coordinate contract (unchanged by this PR)]] +- [[https://git.cons.io/jay/gerbil/src/commit/49b02af0585ee3884039e7b46477ce70cf401ce2/src/std/text/markup/xml/node.ss][Typed nodes and bounded bulk scanning]] +- [[https://git.cons.io/jay/gerbil/src/commit/49b02af0585ee3884039e7b46477ce70cf401ce2/src/std/text/markup/xml/emitter.ss][Buffering, slicing and callback mutation checks]] +- [[https://git.cons.io/jay/gerbil/src/commit/49b02af0585ee3884039e7b46477ce70cf401ce2/src/std/text/markup/html/builder.ss][Tree construction and bounded search policy]] +- [[https://github.com/tao3k/gerbil-parser/tree/461fa6f5f232f854fb6dc7da82ed27caed7f50a6][Parser comparison baseline]] +- [[file:10.111-gerbil-test-and-build-ownership.org][Existing native execution ownership]] + +* Current execution boundary +The user paused std Djot integration while the Parser module-ownership slice in +10.113 is implemented. The comparison above follows the current domain paths; +the upstream PR1515 research snapshot remains unchanged. Module reorganization +is not evidence that the installed compiler now provides std Djot. diff --git a/docs/10-19-design/10-architecture/10.113-parser-domain-module-ownership.org b/docs/10-19-design/10-architecture/10.113-parser-domain-module-ownership.org new file mode 100644 index 0000000..6fbda6d --- /dev/null +++ b/docs/10-19-design/10-architecture/10.113-parser-domain-module-ownership.org @@ -0,0 +1,124 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Parser domain modules and Yuanxu composition +#+LANGUAGE: en + +* Current follow-up +This is the qualified domain-migration baseline. [[file:10.114-parser-publication-and-scope-audit.org][10.114]] audits and refines Config, +Scope and execution publication on top of this source layout. Receipts below +remain bound to their recorded heads. + +* Scope and baseline +This implementation slice removes the misleading =src/modules= container from +Parser PR13. It does not enable std Djot, alter Gerbil/SDK, change dependency +revisions, add a builder, or broaden test/resource controls. The prior qualified +Parser baseline is461fa6f; this slice must earn new current-head Linux/macOS CI. +Root Library implementation changes are outside this Parser commit. + +* Responsibility allocation +| Previous owner | Current owner | Boundary | +|----------------+---------------+----------| +| =src/modules/parser/{types,objects,funcs,syntax}.ss= | =src/grammar/declaration-*.ss= | Grammar/Role contracts, constructors, pure grammar projections and declarative macros | +| =src/modules/parser/contextual-*.ss= | =src/grammar/contextual-*.ss= | Contextual role/method/scanner-rule declarations; execution remains in compiler/runtime | +| Line, list, inline-link, source-fragment, source-boundary, source-event-scope and source-pattern owners | =src/language/*.ss= | Language-owned source structures and generation forms; no generic module loader | +| Graph query, projection and syntax owners | =src/graph/graph-*.ss= | Typed queries over caller-owned views and graph declarations | +| =ParserModules= / =modules/scope= | =Graph= / =graph/scope= | The actual selected service is graph query construction/classification, not a module-system service | +| =src/modules/loader.ss= | =src/testing/module-loader.ss= | Existing evaluator-safe compiler-wrapper replay used by test/product infrastructure; Gerbil retains loading, cache and failure authority | +| Mixed parser author interface | =src/declarations.ss= | Explicit re-export of grammar/source declaration owners; no registry, execution or duplicate implementation | + +The former directory is removed, without compatibility forwarding modules. Source +module identities change and consumers must rebuild. External object kinds, +Grammar schemas, algorithms and caller data protocols retain their meanings. +The pure Grammar projection stops re-exporting source-pattern helpers; the +explicit author facade composes those helpers from their language owner. + +* Declarative composition and build ownership +=init.ss= selects =build-support=, =compiler=, =ffi=, =grammar=, =graph=, +=language=, =runtime=, =testing= and =utilities= directly through Yuanxu +=:load-modules "./src"=. No second directory walker, resolver or build registry +is introduced. Core retains source admission, normalized Scope and +=std-make-spec= projection. Standard Gerbil build/test entries retain execution. + +Graph's Build contribution owns graph-query/support and graph-syntax/support. +Language's contribution owns language products and the package's declaration/API +facades. Testing's contribution owns its loader adapter. The independent native +package-discovery reference excludes the new graph Build role just as it excludes +other phase-bound Build roles. =dev/build.ss check-catalog= compares the complete +native specifications including FFI options and rejects legacy published targets. + +Formal evidence discovery now includes grammar/graph domain sources and the +explicit declaration facade. A source move must not silently remove those inputs +from future model observation footprints. This is input coverage, not a new proof. + +* Verification obligations +| Obligation | Positive control | Negative control | +|------------+------------------+------------------| +| Direct selection | Real Core Scopes exist for all nine declared owners | =modules= is absent; old source container is absent | +| Graph admission | Actual Graph Scope and typed graph construction/query execute | Missing scope slots, non-function constructor, wrong candidate Types reject | +| Declaration migration | Existing Grammar composition, source/event structures and generated language suites execute | Existing malformed grammar, missing references, bad source boundaries and conflicting declaration controls remain | +| Build closure | Selected Core spec equals independent package source discovery | No duplicate/retired target; required public roots and FFI options remain | +| Loader custody | Native cold/compiled/source loading and settled wrapper replay | Unsupported wrapper forms, fresh/unsettled initializers and cached failure propagation retain controls | +| Source identity | Current declarations compile and load from qualified package identity | No success credited to old =src/modules= products | +| Test ownership | Existing Suite/Case/Fixture and CI/development entries | No compiler/test child round added to a Case | +| Remote acceptance | Current PR head passes enabled Linux/macOS CI jobs | Queued/local/previous-head results cannot close this gate | + +Builds retain two workers and2GiB; complete native tests retain3GiB. Parser's +removed180-second package build watchdog stays removed. Existing per-test and +process controls remain unchanged. + +* Execution status +Domain migration and direct declarations are implemented and pushed to Parser +PR13. Native catalog comparison and the production build pass (90.37s at two +workers/2GiB). All six model-input controls pass. The final repaired test entry +also passes183 unique modules with no ERROR and final OK (179.88s). Current-head +[[https://github.com/tao3k/gerbil-parser/actions/runs/40457328171][CI40457328171]] passes:12 enabled jobs succeed and5 conditional jobs skip. Linux +and macOS each execute183 unique native modules, with no ERROR, HARNESS-OK and +final OK. The PR head was re-read and matches cb78727d224af1068914da333fac4200486aeece. std Djot +remains paused at the previously recorded installed-module availability boundary. + +* Observed local failures and corrections +The first complete native run used the normal prefix with prior compiled test +products. Process-ownership controls failed because the sandbox denied =ps=. +This is an execution-permission prerequisite; the code and resource controls are +not relaxed. The failed log is retained as =parser-module-native-tests.log=. + +The new retired-module control separately detected old =~0= identities loaded +by previously compiled conformance fixtures. Production compilation had passed, +but =test-all= depended only on qualification support and did not rebuild those +fixtures. The corrective change adds the existing =build-test-support= prerequisite +to the development test entry. Standard Gerbil/defbuild-script currentness owns +the rebuild. Deleting old artifacts or rerunning unchanged inputs would not fix +that missing prerequisite. The negative control remains enabled. + +The failed local command returned0 despite ERROR CHECK/CASE/HARNESS and no final +OK. Accordingly, raw CLI status is not credited as acceptance. =test-all= is +aligned with the existing development-entry output gate: preserve native output, +reject native errors, require HARNESS-OK and exact final OK. No test executor or +nested test round is introduced; CI qualification already uses output admission. + +* Local qualification receipts +| Receipt | Source / outcome | Evidence | +|---------+------------------+----------| +| Native source projection |098629e: selected spec equals independent source inventory | =parser-module-catalog.log=; PARSER-BUILD-CATALOG-OK | +| Native production compilation |098629e: exit0 in90.37s, two workers/2GiB | =parser-module-build.log= | +| Model input controls |a3bdf38: all6 pass after normal locked npm dependency installation | =formal/evidence/test_model_inputs.py=; moved domain discovery covered | +| First full test attempt |a3bdf38:183 MODULE-OK markers but5 ERROR diagnostics and no final OK; rejected despite raw status0 | =parser-module-native-tests.log=; sandbox ps denial plus stale compiled test imports | +| Standard fixture rebuild and full tests |b1e1382:183 modules, no ERROR, HARNESS-OK and final OK;208.63s including support compilation | =parser-module-native-current-tests.log=; no artifact deletion | +| Retained failed-output control | Existing failure output is refused by entry diagnostic policy | NATIVE-FAILED-OUTPUT-REFUSED | +| Final development entry |cb78727: exit0 in179.88s;183 unique modules, zero ERROR, HARNESS-OK and final OK | =parser-module-final-entry.log= | +| Remote current-head CI |cb78727:12 enabled jobs pass /5 conditional skip; both OS183 unique modules, zero ERROR and final OK | CI40457328171; both semantics logs and =parser-module-ci-final.json= | + +Receipts are stored under the enclosing repository's +=.data/alignment-20261024/current-pr/=. The production source did not change after +098629e; subsequent commits add domain/footprint controls and repair the native +development test prerequisites/output admission. No previous green head closes +the final entry or remote gate. + +* Closed scope +Both platforms pass cold preparation, product packing/restoration, complete +semantic Suites, FFI and generation; Linux also passes the pinned TLA+ corpus. +The CI retains phase/source controls, intentional failed-Suite refusal and +standalone research products. Current PR13 contains only Parser changes; its +checkout is clean. Enclosing Org/D2 updates remain separate from the unrelated +root Library implementation. std Djot integration remains paused. diff --git a/docs/10-19-design/10-architecture/10.114-parser-publication-and-scope-audit.org b/docs/10-19-design/10-architecture/10.114-parser-publication-and-scope-audit.org new file mode 100644 index 0000000..079730a --- /dev/null +++ b/docs/10-19-design/10-architecture/10.114-parser-publication-and-scope-audit.org @@ -0,0 +1,128 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Parser publication and Scope responsibility audit +#+LANGUAGE: en + +* Scope +This follows the qualified cb78727 / CI40457328171 domain-module baseline in10.113. +The current audit checks init, Config, Scope and public interfaces against the +actual pinned Yuanxu/POO/Core implementation, then implements responsibility +corrections. std Djot remains paused; no Gerbil/SDK or dependency revision change. +The enclosing Library implementation remains outside the Parser PR. + +* Framework evidence and allocation +| Mechanism | Existing owner and source | Parser decision | +|-----------+---------------------------+-----------------| +| Required role files | Core module-system/source/admission.ss; types/objects/config/interface are required | Retain role files; do not delete Config based only on its small body | +| Optional Config binding | Core source/declaration.ss export-role-config and source/deferred-declaration.ss module-role-values | Remove redundant aliases; binding-free Config publication is supported | +| Link generation | Core source/declaration.ss lower-core | Select the existing prototype directly in core.exports; no Parser link function | +| Normalized Scope | Core source/link.ss scope-evidence.candidate | Retain Record/Contract admission and actual checked methods; no Parser normalization wrapper | +| Native build graph | Core building/source-package and package-library-spec; Gerbil std/make | Retain declarations and independent dev comparison, not another inventory | + +Pinned source observations are Yuanxu0e3c1f8 and inherited POO29c58aa. Version and +revision ownership stays in package/native declarations, not this document. + +* Implemented decisions +| Surface | Audit result | Change / retained responsibility | +|---------+--------------+----------------------------------| +| init | One declarative selection is appropriate | Retain nine domain selections; no new selection abstraction | +| Nine Config roles | Each only imported Objects and aliased its prototype | Remove imports/aliases; Config declares (export); Interface directly selects the prototype | +| Scope Record and Core Contract | Real field Types and contextual admission, not duplicated framework code | Retain explicit Types and normalization; do not add a generic Parser Scope factory | +| BuildSupport Scope | Imperative host initialization was exposed as a declarative service | Remove initialize-build! publication; build.ss calls the existing executable initializer directly | +| Runtime public sources | Three compiler facades obscured execution ownership | Remove compiler machine/lexical-expression/lexical-lexer; redirect real and generated consumers to runtime | +| Build roots | Compiler published those execution aliases | Runtime owns runtime roots; dev audit rejects retired compiler targets | +| FFI metadata Scope | UInt accepted unrelated positive versions | Exactly reads canonical schema constants; no new version value/source | +| src/api and src/declarations | Broad execution API and narrow authoring API serve distinct consumers | Retain composition facades, with runtime ownership; no implementations copied | +| Language/Grammar/Graph/Runtime/Testing/Utilities Types | Domain semantics and source/compiled constraints remain material | Keep typed services, structural contracts and justified arbitrary-candidate predicates | +| Source registration | Macro/runtime phases have separate native contexts | Keep both existing registrations; phase tests remain required | + +* Per-module disposition +| Module | Public responsibility | Audit disposition | +|--------+-----------------------+-------------------| +| build-support | compiler-gsc-options, compiler-build-spec, native-module-link-options | Keep pure typed compiler integration; remove imperative initialize-build! from Scope; no scheduler or environment registry | +| compiler | compile-grammar over structural Grammar/IR | Keep inherited Grammar field contract, domain IR sections and normalizer; remove machine/lexical execution forwarding roots | +| ffi | Four ABI format identities and explicit C build options | Read schema constants once as values; constrain Scope fields with POO Exactly; preserve native include/link options | +| grammar | Grammar/Role constructors and syntax; expression classification | Keep domain families and strict/malformed-candidate semantics; remove Config alias, not grammar validation | +| graph | Typed query context/view, projection and graph syntax | Keep Row/Id/Kind Types and caller-owned data; constructor checks remain valid for direct public calls as well as Scope consumers | +| language | Schema identities, language assembly, source/event declarations | Keep structural metadata separate from compiled nominal descriptors; preserve narrow author facade | +| runtime | ParseArtifact and execution/checkpoint/recovery APIs | Own actual machine/lexical sources and Build roots; keep structural artifact Type for source/compiled interchange | +| testing | Form admission, Fixture/Suite APIs and qualification replay | Retain Core test ownership and Gerbil loading/error state; no new Harness or loader registry | +| utilities | Typed row/key operations and coordinate-preserving string functions | Keep caller Types, dependent pair normalization, false-row merge semantics and final empty lines; no generic replacement that changes domain behavior | + +All nine Interfaces select their existing Objects prototypes directly. Their +Config roles have no local settings and declare =(export)= under the current +Core source contract. Required declaration shape is retained rather than hidden +behind a Parser-specific factory. + +* Retained small adapters +The pinned POO package has no Character Type declaration; Utilities' char? +Type is an explicit domain boundary, not a second character implementation. +Graph predicate results retain Scheme truth-value semantics, so arbitrary true +results are intentional rather than replaced by a strict Bool result contract. +BuildSpecification leaves std/make option tails opaque instead of duplicating +Gerbil's option language. Parser does not infer stronger semantics from those +forwarded payloads. + +Native link selection asks Gerbil for its actual selected object, then checks +Parser namespace ownership and physical generation. Core's private build-artifact +generation validation is not an equivalent public runtime linker service. The +existing small adapter is retained with its ownership/error controls; no new +resolver or product registry is introduced. + +* Acceptance +| Boundary | Positive | Negative | +|----------+----------+----------| +| Config / Interface | All nine real Scopes selected and admitted directly | No Config alias/settings bodies; no missing required role workaround | +| Typed Scopes | Existing typed list/struct/grammar/graph/artifact operations execute | Existing wrong field, parameter and result Types reject | +| Build execution | Native build calls existing initializer and produces full catalog | Scope lacks initialize-build!; real host/compiler error and option controls retained | +| Canonical ABI versions | Schema-derived FFI Scope admits | Each positive wrong version and prior negative value rejects | +| Runtime ownership | Native and generated consumers compile/load runtime APIs | Retired source files and actual loaded identities reject; no forwarding modules | +| Build completeness | Core projection equals independent source discovery, ABI options preserved | No duplicates or retired targets; missing public roots reject | +| Final qualification | Current-head native entry and both platform CI pass | ERROR output, missing final OK, partial/previous-head results cannot close acceptance | + +Two build workers,2GiB build and3GiB complete-test heaps remain. Parser's180-second +package cap stays removed; native test/process deadlines remain unchanged. + +* Current status +Candidate c3e3dc9 is pushed to Parser PR13. Corrected native catalog comparison +passes in29.65s; the native production build passes in61.45s at two workers/2GiB. +All six model-input checks pass. Complete native tests at ce0c5f7 pass183 modules with zero ERROR and final OK +in228.37s, including native support rebuilding. Final c3e3dc9 changes only the +independent catalog assertions; its native catalog passes in25.46s. +[[https://github.com/tao3k/gerbil-parser/actions/runs/40460992173][CI40460992173]] completes successfully at c3e3dc91e692505d0cca34064090f9139cfb0477: +12 enabled jobs pass and5 conditional jobs skip. Linux and macOS each execute183 +unique native modules, with zero ERROR diagnostics, HARNESS-OK and final OK. +The PR head was re-read and matches that CI head. Failed attempts remain separate +from corrected results; cleanup/retry alone is not a repair. + +* Retained source refusal +The first comment-only Config candidate was refused with "module role cannot be +empty" at Core source/admission.ss:445--446. This is distinct from optional Config +binding in the role exporter. Config now explicitly declares =(export)=, as in +Core's existing module-source-admission test, without alias or settings. The +original catalog/spec refusal logs are retained; Core admission is unchanged. + +* Local receipts +Receipts are retained under =.data/alignment-20261024/current-pr/= in the enclosing +repository. =parser-publication-catalog.log= and +=parser-publication-spec-failure.log= retain the comment-only Config rejection. +=parser-publication-catalog-corrected.log= records the corrected source projection; +=parser-publication-build.log= records production compilation. Native complete +entry evidence is recorded in =parser-publication-native-tests.log=. Both remote +semantics logs, =parser-publication-ci-final.json= and +=parser-publication-qualification.json= retain final-head execution and source +identity evidence. + +* Final acceptance and scope +Both platform cold preparations, product restoration, source/compiled phases, +complete semantic Suites, FFI and generation pass. Linux pinned TLA+ Examples +corpus passes. The last corpus job spent extended time in its original compiler +activation step and later completed successfully; no job rerun, cleanup, resource +increase or source workaround was applied. Job-log retrieval was unavailable +until the run completed; those observation limits are not a Parser repair claim. + +Parser PR13 contains the publication/Scope corrections and is clean locally. +The enclosing Org/D2 artifacts are synchronized separately from unrelated root +Library implementation changes. std Djot remains paused; Gerbil/SDK and package +revision declarations are unchanged. diff --git a/docs/10-19-design/10-architecture/10.115-parser-language-testing-and-yuanxu-alignment.org b/docs/10-19-design/10-architecture/10.115-parser-language-testing-and-yuanxu-alignment.org new file mode 100644 index 0000000..8cfd4d4 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.115-parser-language-testing-and-yuanxu-alignment.org @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Parser language/testing audit and Yuanxu alignment +#+LANGUAGE: en + +* Scope and authority +This is the integration audit for Parser PR13; its implementation contract lives +in [[https://github.com/tao3k/gerbil-parser/blob/codex/final-event-offset-aot/docs/architecture/language-testing-ownership.org][the Parser ownership document]]. It does not qualify the enclosing Library. +The sole direct dependency in Parser gerbil.pkg selected Yuanxu PR19 revision +9b9f0abbbc4bdd4325f556c9c965726dd3a0aad7, inheriting POOe281ad2. These are observed +revisions; the native manifest remains their authority. Gerbil is the compiler. +std Djot remains paused; no Gerbil/SDK source or private installation was changed. + +* Responsibility corrections +module-loader.ss was project-added code from Parser commit855982b, relocated by +098629e. It was not a Yuanxu interface. The custom loader, import/path walker, +live imported-context promise rewriting, hand-maintained conformance/support +catalog and copied former-loader benchmark are removed without forwarding aliases. + +| Owner | Actual responsibility | +|-------+-----------------------| +| Yuanxu init/Core | Domain selection, normalized Scopes, for-directory/for-files source projection and source currentness | +| Gerbil | Native import/load/reload, context promises, initialization, runtime failure cache and std/make scheduling | +| Parser language | Exactly-one descriptor and optional export; attempted file bytes select native reload, with Core fresh/pre-post reads | +| Parser testing | Optional runtime export procedure check, complete algorithm-source witnesses and scoped native diagnostic observation | +| FFI entry | C header/link/object requirements before generic support consumption | +| Research entry | Declare the two actual program inputs; Core discovers transitive helpers | + +No Parser table stores module contexts, results, exceptions or admission verdicts. +Source expander retry semantics and runtime cached exceptions remain distinct. +Native predicate contracts replace old list-shaped rejection evidence; domain +predicates and invalid-input controls remain. Both support entries use the same +native projection and optimized compiler policy; research adds its real roots. + +* Evidence and limits +| Boundary | Observation | +|----------+-------------| +| Dependency installation | Normal deps --install passed in the existing prefix at the exact manifest revisions | +| Full native entry | 183 t/languages modules plus separate test-plan Suite, zero ERROR, HARNESS/final OK and catalog PASS | +| Compiled gparse | help0; accepted expression0; rejected expression1, with actual typed ParseArtifacts | +| Model input discovery | Six controls passed | +| Cold package prefix | Missing configured pkg directory reproduced exit70; correct parent produced exit0 and directory-list | +| Cold FFI order | Preserved15 old records-abi products; original header failure reproduced; existing FFI producer then same conformance command passed | +| Research input closure | Preserved32 provenance products; missing static module reproduced; actual roots supplied to Core regenerated the product and linked in43.65s | +| Actual research execution | New compiled provenance program passed15 checks in2.44s | + +The developer support build now uses the established2GiB compiler budget rather +than the1GiB test-runtime setting. Two workers, test heaps and process watchdogs +remain; Parser's removed package180s cap is not reinstated. The conformance +controls retain240/idle5. Error-output termination codes137/143 in these logs do +not independently prove OOM or timeout. + +Earlier CI failures and product custody are under .data/alignment-20261024/current-pr. +Native gxpkg update package@revision selected a tag but then inspected a literal +@revision directory; bare update consumed the selected native tag and passed. +That upstream tool edge remains documented, with no manual tag edit or uninstall. +Current-head remote acceptance is tracked in10.116; earlier warm/local passes are +not remote cold-build, recovery or delivery acceptance. diff --git a/docs/10-19-design/10-architecture/10.116-parser-ci-ownership-and-branch-retirement.org b/docs/10-19-design/10-architecture/10.116-parser-ci-ownership-and-branch-retirement.org new file mode 100644 index 0000000..95fc9e5 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.116-parser-ci-ownership-and-branch-retirement.org @@ -0,0 +1,196 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Parser CI ownership and branch retirement +#+LANGUAGE: en + +* Single implementation authority +The detailed workflow contract is maintained with the Parser source in +[[https://github.com/tao3k/gerbil-parser/blob/codex/final-event-offset-aot/docs/architecture/ci-ownership.org][ci-ownership.org]]. This Org records integration evidence and branch custody, +not another workflow inventory or version source. Scope is Parser PR13 only. + +| Stage | Owner and boundary | +|-------+--------------------| +| Prepare per platform | Existing package/FFI producers, Core projection of complete Suites plus real research inputs, native compilation/linking | +| Restore each consumer | One GitHub composite: existing compiler activation, native artifact download, existing exact-head admission; no build fallback | +| Verify | Runtime, source witness, macro, process/failure, generation, FFI and corpus retain their distinct claims | +| Research | Manual CPU/diagnostic selections retain their bounded comparison protocols | + +* Removed CI duplication +Six consumer restore sequences share one native composite action; seven repeated +release/root/head environments share one workflow declaration. Research and tests now have separate native product domains: normal static +research products and Core-signed test-lib/subset publications. Each retains one +build entry; the restored test publication step is not duplicate compilation. The repeated compiler-policy and five research Suite runs +are removed only after actual MODULE-OK records confirmed inclusion in the full +183-module entry. No Suite, Case or Fixture is deleted from that roster. + +The obsolete custom-loader CPU matrix item is removed. Its native load/reload, +exception and observation controls remain in the complete Suite entry. Rust +claim selection, source currentness, isolated macro phases, deliberately failed +Suite, process ownership, Linux external corpus and manual research conditions +have independent purposes and remain. No new runner, scheduler or compiler +environment is introduced. The native manifests and source documents own details. + +* Git retirement and recovery +Local and remote heads now contain only main and codex/final-event-offset-aot. +The remote maintenance/scheme and fix/native-scheme-cohort-20261021 heads had no +open PR and were deleted with exact expected-SHA leases. Local old archive refs +and the stale PR pointer were removed; the active alignment branch was renamed +to the actual PR branch. Main/default history and other repositories are unchanged. + +All five retired refs, including an unmerged local policy commit, were preserved +with complete history in +[[file:../../../.data/alignment-20261024/current-pr/parser-retired-branches-20261027.bundle][the native Git recovery bundle]]. Native bundle verification passed. A temporary +bare repository restored all five refs and passed git fsck --full, then was +removed. The working repository contains no hidden archive branch. + +* Verification record +Official actionlint1.7.12 (release SHA256 checked) and native YAML parsing passed. +The revised developer entry passed in224.58s:183 native modules plus the separate +test-plan Suite, zero ERROR, HARNESS/final OK and catalog PASS, including the FFI +prerequisite and optimized shared support declaration. + +10.115 records the additional cold FFI and research-input negative/positive +controls. Those initial receipts used9b9f0ab. The parallel43c7274 cohort update selected +Yuanxu ed5236b and canceled CI40480110073; cancellation is not a product failure. +Current Parser head826d5e43 selects formal Core PR19 revision5f356df. Its +Linux/macOS cold build and admitted consumers remain pending current-head CI. Two workers and existing heaps/watchdogs +remain. No root Library implementation, independent review or actual delivery +is qualified by this Parser slice. + +* Preserved parallel cohort update +An independent43c7274 commit advanced only gerbil.pkg to current Yuanxu PR head +ed5236b and canceled CI40480110073 through normal concurrency. That run is +canceled, not a product failure. The local PR branch fast-forwarded without +rewriting or dropping either implementation. Parser consumes the new exact +std-make-spec/producer handoff through Core building/script; compiler policy uses +the existing host initializer and its source is observed, rather than mapping +away the returned producer value or creating another publication mechanism. + +* New Core test publication boundary +The exact std-make-spec returned by Core now reaches Core building/script without +mapping away its producer. The existing compiler host initializer owns compiler +policy; its code and the support entry are observed inputs. Normal research +products use Core package-library-spec and Gerbil std/build-script. Their two +actual roots yield the transitive closure; no fixture catalog or private signer +is added. Failed-product custody includes the native test-lib domain; ordinary +prepared snapshots already include the complete configured prefix. + +The initial full test publication hit2GiB Heap overflow. The shared prefix held81 +leaf approvals (~308MB serialized), including outputs of other projects; this +count does not measure Parser-only publication. Formal [[https://github.com/tao3k/gebril-yuanxu/pull/19][Core PR19]] commit66f945d replaces long-lived full approval text/decoded packets +with digest and record references. Restore parses an operation-local digest-bound +snapshot; a semantically inert approval edit remains a negative control. The +handoff format, issuer and output checks stay unchanged. This is a formal source +revision installed through normal gxpkg, not a local installed-dependency patch. +Same-envelope full publication and source/approval mutation tests remain required. + +The first retention fix passed the initial publication but warm recovery still +hit2GiB. Formal Core5f356df additionally releases the temporary subset receiver's +in-memory issuance entry after publication; later use restores the original +package-owned approval. A same-receiver recovery/unchanged-mtime control was added. +The earlier publication count/bytes included historical outputs of other projects +in the shared prefix; it is not a Parser-only inventory. + +Parser826d5e43 consumes its signed support through the existing Core TestingScript, +which checks source/output/approval then launches the original gerbil test. The +native Just test-native recipe is shared by development and CI; CI invokes it +after restored-product admission without starting a compiler. The profile retains +the3GiB/900-second full-test envelope. Native test files remain Suite/Case/Fixture +declarations. Current source and remote acceptance remain separately tracked. + +* Current local qualification +Parser826d5e43 with installed formal Core5f356df passed the native developer entry +just test-all check-build-catalog test-plan in499.18s. The receipt contains183 +Parser MODULE-OK records plus the separate test-plan record, zero ERROR, +HARNESS-OK/final OK and PARSER-BUILD-CATALOG-OK. Compilation retained2GiB and two +workers; Core TestingScript retained3GiB/900s for the complete test VM. This is a +local source-cohort result, not cold remote or restored-consumer qualification. +Core's approval tamper/recovery controls and exact-head Linux/macOS CI remain +separate required gates. Full raw evidence is retained in +.data/alignment-20261024/current-pr/parser-final-core-5f356d-all.log. + +The independent Core module-test-preparation Suite passed in101.46s, including +approval-byte mutation rejection and retained subset receiver recovery. Parser's +same-envelope warm support recovery then passed in133.62s with zero compiler +jobs and no Heap overflow. Raw logs are core-5f356df-preparation-controls.log and +parser-5f356df-warm-support-recovery.log in the same evidence directory. Final +Parser documentation commitfe656260 removes the stale copied dependency revision +and records the native TestingScript consumer boundary; current exact-head CI +must be read from PR13, separately from826d5e43 local receipts. + +* Cold CI40493930934 follow-up +The current remote cohort advanced independently through82044366 andea403bdd; +both commits were preserved before the fixes below. Linux/macOS raw failed-job +logs and the Linux failure artifact are retained in +.data/alignment-20261024/current-pr/ci-40493930934 (no restored-product admission). + +| Failure | Observed cause | Correction and required control | +|---------+----------------+---------------------------------| +| macOS dependency installation | POO e281ad2 native shebang reached180s;31744 wait status decodes to124; logs show two workers | Formal POO PR13 e207da7 removes only the fixed package-entry cutoff; Core PR19 carries it; cold CI must complete under two workers and2GiB | +| Linux standalone library link | No normal static runtime-record-assignments grammar despite signed test support | Declare actual records-engine-abi library root to Core package-library-spec; missing-static-module negative reproduced locally with exact product restored afterward; corrected link must pass | +| Compiler activation | Published GAMBOPT retained relocation paths but dropped heap fence | Append existing max-heap=2G,debug=q at activation; complete test VM retains explicit3GiB profile | +| Restored native package registration | mkdir used HOME instead of configured GERBIL_PATH | Existing restore entry creates the configured native pkg directory; cold consumers still require exact-head/platform/compiler/path identity | + +Parser98346732 contains these package/dependency/CI changes. Core1cff616 includes +concurrent native refusal diagnostics and formal POO e207da7. Parser still has one +direct runtime dependency, Core; no installed checkout source is patched. Native +installation initially refused the old5f356df tag as incompatible with1cff616; +the exact conflict is retained. Normal gxpkg update is used, never uninstall or +manual tag editing. Cold build, admitted restore and both remote platforms remain +open until actual receipts, independent of earlier warm local tests. + +The Linux missing-static-module control reproduced exit70 in the original +standalone library entry; the isolated grammar product was restored in finally. +Parserf2777b7b additionally reuses the existing bounded failure-custody entry for +all preparation failures, including dependency installation. This archive has no +restore identity and cannot become an admitted prepared snapshot. The180s bound +is custody-only, never reinstated on Parser compilation. Latest CI40505056886 is +tracked separately; queued/preparing jobs are not acceptance. + +The normal installed POO update at formal e207da7 completed in221.92s, with two +workers, max-heap=2G and native std/make. This exceeds the former180s package +cutoff without a retry, cleaning the evidence or changing compiler sources. +The log is poo-native-e207da7-update.log. This local host result does not replace +remote macOS cold preparation. Core and Parser source-cohort requalification +continue through the existing native package entries. + +* New source epoch and independent tagging failure +CI40505056886 retained a different Linux failure after successful POO/Core +compilation: native gxpkg's final gxtags child overflowed its2GiB heap. Its status +was70; this is not a Parser compiler failure or180s cutoff. The complete job log +and newly captured non-admitted outputs are retained under ci-40505056886. +The failure tar SHA256547db6a1653e43acdc7a89df189afa6a967a0abc96c9b6b7f2548a910390807e +matches its native manifest. Original Gerbil commands expose no skip-retag option; +no tool replacement, SDK patch, input hiding or heap increase was applied. +The heap's precise retaining cause is not established merely by this process log. + +Parallel Parser3ba959e3/9734be5e and Core90fd41c diagnostic fixes were preserved. +Their cancellation of the earlier macOS job is neither failure nor acceptance. +Current CI40506447873 qualifies this new epoch. Local Core90fd41c update passed +in118.84s; Parser9734be5e native deps --install passed in129.09s, both within the +same2GiB/two-worker context. They do not establish Linux tagging success. + +The real failed archive was passed to the existing restore command under the +current local source/platform/compiler identity. It refused exit1 before +extraction because .gerbil/ci/identity is absent; no PREPARED-SCHEME-OK restore was +emitted. The test establishes custody/admission separation only. Positive +prepared-snapshot recovery, current Parser linking and full native tests remain +separate gates. Logs retain the old failed source epochs and current provenance. + +* Correction: remove custom CI identity admission +The .gerbil/ci/identity design was a project-added duplicate admission layer, +not a Yuanxu/Core contract. It is removed, together with the five-field compare, +GERBIL_PREPARED_HEAD and prepared-products.sh pack/restore modes. The earlier +identity-file refusal control tests retired machinery and is withdrawn as +framework acceptance evidence. This correction supersedes earlier statements +that transport identity comparison is a required admission layer. + +GitHub Actions binds the artifact to its workflow run/platform/name; the existing +composite activates the compiler, downloads that artifact and extracts it with +native tar preserving modes/timestamps. Core TestingScript independently checks +its captured inputs, outputs and approvals when consuming test support. Ordinary +Gerbil compilation and existing runtime/source qualification keep their distinct +claims. No replacement identity manifest, loader or credential is introduced. +The remaining failed-products.sh has only diagnostic-custody responsibility and +is not used by successful transport or framework admission. diff --git a/docs/10-19-design/10-architecture/10.117-parser-ci-and-build-mechanism-audit.org b/docs/10-19-design/10-architecture/10.117-parser-ci-and-build-mechanism-audit.org new file mode 100644 index 0000000..1ab7797 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.117-parser-ci-and-build-mechanism-audit.org @@ -0,0 +1,704 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Parser CI and build mechanism audit +#+LANGUAGE: en + +* Current qualification boundary (2026-10-28) +The selected maintenance base is the original published distributione5296bf8: +Gerbil2591dcd and its native Gambitdcd677c gitlink. PR58 corrected backport7e1ddc4 targets +release/v0.19-2591dcd. Original platform flags/runtime patches remain; two build +workers are fixed and the original producer self-build memory policy is retained; +Parser compilation remains2GiB and complete tests remain3GiB. Linux40559760040 +completed the original formal publication workflow, including installed and +relocated native controls. Its immutable archive has verified SHA256 +88d08d3d10e297164191a9b31ee309d215a01727877c9e1c19b0d7dc737a5744 +and patchsete35312b4a9517a83dd3bdea71467dbaa34ecdfce. The delivered receipt +confirms2591dcd/dcd677c and the original configure flags. Darwin40559766825 also passed installed/relocated native controls and immutable +publication. Downloaded Darwin SHA256 is +c53d62f26ff382f8956576963edc3eb9193098dc48de78d44b8a3df63636bd18. +Both delivered receipts retain2591dcd/dcd677c and patchsete35312b4a951. +Both compiler publications PASS; Parser cold/restored acceptance remains OPEN. Earlier main-based7c490 failures are kept +as a separate, superseded repair-carrier epoch. The records below preserve that +history and must not be read as an admission of the current maintenance cohort. + +* Latest acceptance snapshot +The table records completed evidence; the revised candidate still requires its own +remote acceptance. Historical sections below do not override these boundaries. + +| Obligation | Completed evidence | Revised-head state | +|------------+--------------------+--------------------| +| Formal compiler publication and relocation | Linux/Darwin PASS;2591dcd/dcd677c retained | No unrelated compiler upgrade | +| Native dependency installation/cold preparation | Both platforms PASS atcadd52ef;22 declared programs actually built per OS |40595636383; no shared-output competition | +| Restored generated products | Both platforms PASS atcadd52ef | Full unchanged golden comparisons retained | +| Complete native Suite and CLI | cadd52ef Linux PASS; macOS CLI PASS but full Suite exits42 at POO p95=190.145ms >100ms | All182 modules executed; historical168.422ms refusal retained; no waived Case | +| Native FFI programs | Both platforms PASS atcadd52ef, including independent C/Rust lifecycle | Same inputs/bounds; native expander and direct product invocation qualified | +| Negative controls | Intentional Suite42, source/macro/process controls exercised | No failure-status parser or executor added | +| Research comparisons | Protocol timeouts, cohort mismatch and Unicode benefit refusal retained | No widened budgets, replaced controls or admitted speedup | +| Existing Parser PR13 | Still79012241 | Qualified result required before final update | + +* Ownership +Parser PR13's source document [[https://github.com/tao3k/gerbil-parser/blob/codex/final-event-offset-aot/docs/architecture/ci-ownership.org][CI ownership]] owns the workflow contract. +This audit supersedes the extra CI approval layers recorded historically in10.116. +Gerbil is the compiler, std/make owns build dependency/currentness/scheduling/linking, +Yuanxu/Core owns Module capture and test source/output/approval verification. +GitHub Actions installs tools and transports per-run platform artifacts. + +* Removed repeated mechanisms +| Removed | Existing owner | +|---------+----------------| +| .gerbil/ci/identity and five-field comparison | GitHub run/platform artifact transport; Core checks at actual consumption | +| Scheme CI bootstrap, hardcoded release schema/revision and worker detector | Configured archive SHA256 and GitHub environment publication; declared two workers | +| Fixed whole macOS PATH roster and installer-path assertion | GitHub action PATH updates and actual installed compiler selection | +| Cache trial Function admission plus failed-probe update fallback | Native gerbil deps --install on both cached and cold paths | +| Unconditional clean | std/make freshness and explicit source/product tests | +| Custom static object timestamp/option/translation stamps | std/make native targets and compiler inputs | +| Custom worker queue, bootstrap parsing and grouped native linker | Standard executable declaration and native compiler linking | +| Conformance load/eval driver plus process liveness supervisor | Direct native build declaration; outer CI job limit remains | +| Bootstrap Suite and deleted-linker self-mirroring Case | Removed implementation has no remaining contract; domain/source/negative controls remain | + +The executable root is excluded from Core's library projection using its native +relative-identity API. The actual standalone ABI root supplies its import closure; +the project header path remains a normal target option. No transitive fixture +catalog or replacement build cache is introduced. The earlier duplicate-target, +missing-header and supervisor-idle failures are retained as failed development +evidence; they are not repaired merely by running a warm command again. + +* Retained boundaries +Download SHA256 protects configured compiler archive integrity. Platform C/link +options express actual ABI requirements. A GitHub composite removes repeated +installation/download/extract steps; it issues no approval. Failure custody only +records source and outputs. Runtime negative controls retain their watchdogs; +Parser compilation has no added package cutoff. Two workers,2GiB compiler and +3GiB/900s complete-test settings remain. Compiler/VM sources stay at the selected baseline; only the authorized tool-entry maintenance repair is published. No SDK change; Djot paused. + +* Historical Linux native tagging failure +Three recorded Linux epochs fail in gxpkg's final gxtags process after compiling +POO/Core, with an explicit2GiB Heap overflow. Native gxpkg has no public skip-tags +option. gxtags imports .ss/.ssi files across its input directories in one process; +retained expander contexts are a candidate cause, not a measured attribution. +Current evidence cannot identify the last imported module. No replacement tags +executable, ignore-errors fallback, source hiding or heap increase is used. + +Full logs/failed outputs are retained under .data/alignment-20261024/current-pr, +including ci-40505056886, ci-40506447873 and ci-40507812775. Native partial TAGS +files are now included in the existing failure archive when present; .git and +source checkout trees remain excluded. Cold tagging closure remains open. + +* Historical acceptance state +Official actionlint and shell syntax pass. Local native POO update passed221.92s; +Core90fd41c update passed118.84s; Parser deps passed129.09s and production/FFI +preparation passed290.45s. These are earlier source-cohort receipts, not final +cold CI, native executable or restored-consumer acceptance. The normal native +research build, standalone library, full tests and both platform consumers must +be qualified after the removed layers. Current run identities and outcomes are +recorded separately; cancellation due to parallel updates is not a product result. + +* Current executable failure boundary +The native make replacement reached real C object compilation after correcting +Core exclude arguments and the actual ABI header option. Earlier supervised +runs stopped at idle5; the duplicate build supervisor was then removed instead +of injecting a heartbeat or restoring a custom scheduler. A direct native build +was sampled with no active compiler children, mostly device-select wait, then +stopped with its source/log/sample retained. Its358.58s elapsed result is a +stopped diagnostic, not a new cutoff or a successful build. The precise native +waiting cause remains open. The installed Homebrew compiler differs from the +configured CI compiler; local failure cannot be relabeled as remote failure. + +Remaining adapters have bounded duties: compiler-profile declares host flags and +forwards process output; build-shared-library calls public compiler APIs for a +C-hosted ABI library not expressed by a standard executable target; GitHub +composites reuse installation/transport steps; failed-products records diagnostics. +None adds an approval cache, target scheduler or replacement module loader. + +Parallel Parser5cf2ca93 advanced Core to05c8ced (native Make extra-input capture +and replay, plus proof bindings). This update was preserved; its cancellation +of CI40509998032 is not a product failure. The final source audit619614c2 follows +that cohort. The in-flight local test receipt remains explicitly bound to +Parserb125a08d/Core90fd41c until the newer dependency is installed and requalified. + +Final source audit619614c2 is published in the existing PR13; CI40511274931 was +queued at the last observation. The native complete-test entry for earlier +b125a08d/Core90fd41c was still issuing support (no current Harness invocation). +A short sample showed active file reads/GC, distinct from the executable's idle +wait; parser-test-support-39007.sample is retained. Earlier Harness-OK records +were not counted. Static actionlint/shell/diff checks passed for the final audit. + +* Withdrawn tag-format experiment +bf5184f3 temporarily selected the native GERBIL_TAGS_FORMAT=vim setting. It did +not install an editor, but there was no measured attribution proving that format +selection fixed the Linux failure. The setting is withdrawn; default native +tagging remains the baseline. The local Core05c8ced update log used this +experimental setting and therefore does not qualify default-format Linux tagging. +No claim of repaired memory retention is made from that run. + +* CI-aligned follow-up +| Boundary | Observed failure or source | Qualified action | +|----------+----------------------------+------------------| +| Compiler | Global Homebrew default1cfb032/patch618 differed from CI2591dcd/patchf5 on Gambitdcd677c | Use the already-installed CI compiler's own activation; no SDK source/global link change | +| ABI/products | Old root-prefix object refused as incompatible | Native Parser workspace .gerbil; normal cold deps and existing dev deps | +| Native inputs | CI load path is compiled lib before source parent; GCC16/OpenSSL/sqlite are explicit | Use those same platform settings, not an ad-hoc wrapper | +| Ownership | Generic research rebuilt FFI ABI modules with lost link flags, producing undefined owner-thread guard | Exclude actual production Scope, actual FFI spec and executable identities through Core's existing API | +| Model footprint | Deleted custom linker remained in shared inputs | Bind the real native research declaration; existing six tests pass | + +The actual records grammar remains projected; primary and FFI options retain +one owner. Native research compilation and a fresh provenance process passed15 +checks. The earlier local wait is not acceptance evidence for the CI compiler; +source/ABI/load path and platform errors were preserved separately. Full native +tests and archive recovery remain independent required gates. + +Default Linux tagging still fails after at least529 source sections in the +retained partial TAGS. The native chain is gxpkg pkg-retag -> gxtags make-tags -> +import-module; core-import-module stores each source context/body in the strong +native module registry. This establishes the retention path, not a measured +allocation attribution or a repaired heap bound. No registry clearing, tag-format +change, skipped source input or SDK edit has been installed. + +* OpenSSL target declaration correction +The earlier crypto-link attribution to missing local LIBRARY_PATH was incomplete. +Existing POO executable declarations query std/make pkg-config-libs; those options +are target-local and do not propagate automatically to a new executable. The +research executable and shared-library adapter now query OpenSSL through that +same native API. No replacement resolver or library-path fallback is introduced. +The compiler link record references OpenSSL3.6.4 while the current CI-selected +provider resolves3.6.5, making reliance on the baked Cellar path observable. + +The previous executable is preserved before the new declaration is relinked, +with LIBRARY_PATH and LDFLAGS unset. Provider selection remains CI's existing +PKG_CONFIG_PATH, and native Homebrew activation selects the expected pkg-config +program rather than the unrelated Nix tool on the host's ambient PATH. This +changes neither the compiler nor its memory/worker settings. A retained binary +that merely still runs is not counted as proof of new link options. + +The complete CI-aligned native entry for ef80eb72 passed182 source modules plus +test-plan and catalog controls, zero Case/Harness errors. The later pkg-config +target change has its own independent relink evidence and must not borrow that +older source receipt for newly changed input bytes. + +The no-ambient-library-path relink passed exit0: the previous executable was +preserved, LIBRARY_PATH/LDFLAGS were unset, pkg-config selected the existing CI +OpenSSL3 provider, and native std/make produced the executable anew. That new +process passed15 provenance checks. The retained full verbose log is +.data/alignment-20261024/current-pr/native-pkg-config-link/relink-without-library-path.log. +No compiler change or increased resource limit was needed. The earlier environment +workaround is superseded as an explanation of the project's missing link option. + +* Green revision comparison and approved heap-scope repair +Green CI40460992173 at c3e3dc91 used compiler2591dcd/patchf5 and completed +package-manager retagging. It restored the dependency cache and skipped the +main install through the then-present cache probe; its dev install still invoked +retagging. Core was0e3c1f8 and POO29c58aa. The environment contained Gerbil +relocation options, without a global2GiB heap limit. This is a useful historical +baseline, not same-input cold-install acceptance under2GiB. + +The exact first scope-changing commit is44c61d6e: bootstrap began publishing +max-heap=2G globally. Commit14629cf2 retained that setting when replacing the +bootstrap with normal GitHub environment publication. Thus a compiler-process +limit unintentionally became an indexer-process limit. The default gxtags +retention diagnostic started at87,745,536 live bytes/260 registry keys and grew +to1,877,202,272 live bytes/3,135 keys, then overflowed. Forced GC samples changed +timing but did not clear caches; they establish retained source-context growth, +not an Emacs formatting cause or a repaired fixed bound. + +The user explicitly authorized restoring the green scope while keeping compiler +and test limits. POOc0d4763 establishes2GiB in its native build.ss interpreter and child compiler environment; +Core86d2b9a does the same, retaining its300s deadline and the concurrent upstream +compiler-staging lifetime correction. Parser preparation compilation steps +establish2GiB locally. Compiler activation publishes relocation only; default +package-manager indexing no longer inherits the misplaced compiler cap. Two +workers and full native tests3GiB/900s remain. No tag-format variable, input +omission, registry rewrite, wrapper, or SDK change is introduced. + +The first native install attempt correctly refused the old installed Core tag: +requested541ae5c versus installed05c8ced. That failure is retained. The published +native pkg-update script API updates the two exact pins before ordinary + gerbil deps --install. No uninstall, manual tag-file edit, ignored status, or +retry fallback is introduced. Fresh CI starts from the changed dependency cache +key and must independently qualify installation, default indexing and recovery. + +The shared-library adapter also omitted existing compiler host initialization. +The preserved failure selected Nix ld from the local PATH and reported missing +system C symbols. Its repair calls the existing compiler initializer used by +the primary build, selecting Apple's linker for Homebrew unless explicitly +configured. Actual relink and restored-consumer results remain separate gates. + +* Final native install and single-file index controls +The final native install on Core86d2b9a/POOc0d4763 returned0 in52.31s, but the +resulting TAGS contained zero bytes. This is an installation status receipt, +not proof of useful indexing. The original incompatible-tag refusal and the +subsequent native API update/install logs are retained independently. + +The one-file control uses POO object.ss unchanged: the installed standalone + gxtags skips it with both relative and absolute paths; gxi invoking the public + gxtags module tags the same input and writes approximately17KiB. No replacement +launcher is installed. Thus restored heap scope addresses the global-cap +regression, while standalone tool initialization/loading remains a separate +unresolved local observation. Remote portable-compiler acceptance is required; +zero exit status alone cannot close indexing or whole-Parser acceptance. + +The synchronized Parser PR view is docs/architecture/ci-ownership.d2. Both it +and this repository's90.99 view separate package compilation, automatic indexing, +Core admission, transport and restored runtime consumption. + +* Independent official-tool and full-Harness outcomes +The exact macOS CI release archive passes the workflow's pinned SHA256. Its +standalone gxtags also skips a two-form source outside every package declaration: +/tmp/gxtags-independent-control/minimal.ss contains only `(export answer)` and +`(def answer 42)`. The native output is empty; the public module output is113 +bytes. The earlier root-local control is therefore not the sole basis for this +observation. No public-module launcher replaces the native package tool. + +CI now checks nonempty TAGS in its own named step after both native installs. +This retains the original installation exit status and exposes an empty-index +failure independently. Nonempty is necessary, not a certification of complete +coverage. The standalone startup/loading observation remains unresolved within +the no-Gerbil/SDK-change boundary. Restoring heap scope does not fix it. + +The Core86d2b9a/POOc0d4763 full native Harness executed182 modules but failed +the unchanged grammar-object benchmark at t/core-observability-test.ss:80: +p95=120.498ms versus100ms. The median was37.974ms. All original samples, +ERROR CHECK/HARNESS records and the full prefix are retained; module counts do +not override that failure. Its cause is still open; CPU contention or GC is not +asserted as a confirmed cause. No gate, worker or heap limit was changed. + +A separate official-archive cold build preserves the prior prefix by moving it, +then installs through the normal default .gerbil path. It began at Parsercdbf6012 +with Core3ada2a2 (original-source observation publication). The remote has since +advanced to the proof-binding Coree77698c cohort; these epochs remain distinct. +Cold installation, effective indexing, actual runtime admission and recovery +must each retain their own result rather than borrowing earlier green receipts. + +* Authorized native tool-entry repair and current CI split +The user explicitly authorized a formal tool-entry repair so Parser can depend +entirely on gerbil build/test. This supersedes the previous no-Gerbil-change +boundary only for startup, native aliases and exit propagation. Compiler and +runtime algorithms remain unchanged. + +The distribution change removes the active Darwin custom AOT tool patch and +restores upstream's unified executable aliases. Unmodified gerbil tags already +produces a meaningful default-format index for the independent two-form input; +initializing the expander in the separate optimized tool did not fix its SKIP. +The gxtest change exits with the existing Harness result inside the getopt +execution callback. Exiting around getopt itself rejected help's void result; +help remains outside that exit path. Focused source controls now return +positive=0, intentional failure=42, help=0, missing source=70. These are source +controls, not acceptance of a rebuilt compiler distribution. + +Source provisioning's15 tests, release's12 tests, shell syntax and actionlint +pass. The formal distribution PR adds installed-command controls for both +aliases and unified commands before packaging on Linux and macOS. It respects +two workers and retains existing limits. A validated immutable release must +exist before Parser selects it; a local patched compiler is not substituted. + +Parser79012241 CI40539494920 completed with Rust checks, Linux preparation, +FFI and corpus passing. macOS preparation fails its meaningful TAGS check; +Linux generation and semantics fail in the retired observations.ss preload +wrapper with module not found. Thus the remaining failures have distinct +owners: distribution tool entry and redundant Parser loader. Logs are kept at +.data/alignment-20261024/current-pr/parser-79012241-ci-failures.log. +The Linux preparation success alone does not close generation or semantics. + +The pending Parser consolidation removes observations.ss, its self-tests, +private module-evaluation mirrors and the extra test-process scheduler. Native +module/ABI/source-currentness negative controls and the unchanged performance +gate remain. Ordinary test-helper products use std/make; gerbil test owns Suite +execution, including recursive t/..., languages/... and scripts/tests/... +selection. This work awaits rebuilt-distribution and full cold/restore results +before a consolidated Parser push; no cancelled run is counted as passing. + +* Consolidated native helper validation and release prerequisite +The ordinary helper build first failed because raw Suite demand was walked as +another package-library closure. It compiled a Suite root and exhausted2GiB. +The corrected entry reads Core's existing build.spec, which already selects +native helper imports and their options. It adds no closure traversal, target +catalog, linker or compiler environment. With two workers and the same2GiB cap, +the corrected native build exits0. The failed logs and partial products remain; +no clean, heap increase or unchanged retry establishes the fix. + +Gerbil distribution PR58: https://github.com/tao3k/gerbil-bazel/pull/58. +Its first Linux source build fails before Gerbil at Gambit bootstrap: +define-prim cannot inline ##fxzero? generating _num.c. Unchanged main9b5900d +CI38038915449 has the same error. Both raw logs are retained. This is a separate +source baseline prerequisite, outside the authorized tool-entry-only algorithm +boundary. Parser does not downgrade pins or use a patched local full compiler. +Source controls pass; new installed-command and immutable-release gates remain +open. No Parser push can claim full native status admission on the old compiler. + +The formal evidence collector also contained the retired loader and a removed +private test-suite launcher. Its build uses gerbil build and the existing helper +entry; history and semantic Suites use native gerbil test. Request measurements +use native load-module for their actual compiled subjects. One source/product +mutation control and six input-discovery controls pass. The broad10-test evidence +integration run fails for missing ASCENT_ENGINE_LIBRARY configuration; this is +not recorded as an ASCENT/runtime pass. + +* Focused native Suite result after compiler identity alignment +The3-Suite native command passes module-loading, compiler-process and +qualification-plans with exact MODULE-OK/HARNESS-OK/final OK and no error records. +It uses the official archive, Coree77698c/POOc0d4763, two build workers,1GiB +focused test heap and120s deadline. Compiler-process retains zero/multiple values, +exception propagation and malformed-record controls; module loading retains +actual failed initializer, explicit reload and source-change controls. + +The first invocation omitted GERBIL_GCC and the GCC-profile Case called the +host's default gcc with GNU-only flags; that failed log is retained. Explicit +GERBIL_GCC=/opt/homebrew/bin/gcc-16 matches CI and the compiler's actual GNU +provider. The successful result is an input-identity alignment, not an unchanged +retry or relaxation. Old gerbil test's known failure-exit bug remains independent; +the new tool source negative control returns42, but published-distribution +acceptance still awaits its source baseline prerequisite. + +* Correction: tool repair carrier crossed the Parser compiler baseline +Parser CI still selects the published2591dcd9 Gerbil compiler and patchsetf5cedd81, +whose configure pins Gambitdcd677cd3e40860bdd27dfbdbf5e3ce46ab03813. +The tool-entry repair582e85b (2026-10-28 01:22 Asia/Shanghai) instead started +from distribution main9b5900d. That main profile selects Gerbil1c6c153 and +Gambit7c490c3 plus multiple-threaded-VM flags. Selecting this repair carrier +introduced the unrelated failing source baseline into the Parser work sequence; +Parser itself was not switched to it. Calling this only an upstream blocker +without identifying that baseline selection was incomplete reporting. + +The profile first selected1c6c153/7c490c3 in distribution commitf01da46 on +2026-10-10 15:57 Asia/Shanghai;9b5900d added multiple-threaded-VM flags at16:44. +Gerbil1c6c153 pins Gambit7c490c3 for safe-context primitive inlining (PR1511). +The original Parser compiler's source and receipt remain the authoritative +baseline until the repair's source/build/publication association is qualified. +The patchset identifierf5cedd81 is a content hash, not a Git revision. It must +not be checked out or treated as a release source commit. + +* Maintenance backport on the actual published compiler cohort +The user selected the original validated2591dcd/dcd677c cohort explicitly. +The release API identifies distributione5296bf8c2c183c5e647d58fbb389570341a743d +as the original immutable archive's target commit. Existing PR58 is now based +on release/v0.19-2591dcd at that exact commit; its maintenance checkout is +.data/alignment-20261024/gerbil-tool-maintenance-2591. Earlier main-based +branches and failed source experiments remain separate. No main profile or +Parser compiler pin is changed by this alignment. + +The backport preserves the original per-platform configure/runtime patches. +It removes extra Darwin AOT tool construction and fixes gxtest's native exit. +The rejected first candidate also changed build.sh resource handling; corrected +7e1ddc4 removes that change. The publication workflow uses2 workers and the +original producer self-build memory policy; its +upstream source input is restricted to2591dcd. Native source gitlink owns the +Gambit revision and the receipt records it. Multiple-VM/threaded-VM flags from +the mistaken newer baseline are absent. The maintenance source patches apply +against exact2591dcd files; shell/actionlint/diff checks pass. + +Publication runs the original native builds/runtime checks, then meaningful +native tag and Suite pass/fail/help/missing-input controls. Those controls run +again after archive relocation, before publishing immutable platform assets. +Failure fixtures/logs and original compiler configuration/generated C are kept. +The existing SDK consumer CI uses older prebuilt hosts and is not evidence for +these freshly built tools. Actual publication and Parser cold/restored acceptance +remain required; no direct source upgrade or private local compiler substitutes. + +Parser's activation now uses the delivered activate and native Gambit configure +dump instead of parallel runtime/compiler discovery. OpenSSL3 is explicit; +Ghostscript unlink, default-OpenSSL fallback and LIBRARY_PATH injection are +removed. Native gerbil build valid/syntax-failure controls return0/70. The formal +collector uses native unbounded package construction; only scheme-build may +omit deadlines/markers, and it does not establish runtime/model/performance +claims. Runtime/model/performance controls retain existing limits. Four host +observation controls and six input controls pass; release and complete native +CI remain separate pending gates. + +The original distribution tree was checked against the published recipe, not +just its release label. Reconstructing all11 manifest entries frome5296bf8 +producesf5cedd8168cb365ba41289327601d9305738c9a0 exactly, matching the old +archive receipt. The raw manifest receipt is saved as +.data/alignment-20261024/current-pr/original-e529-release-patchset.json. +Native CLI construction controls return valid=0, syntax failure=70; an earlier +nonexecutable fixture refusal is retained independently. No protocol/test limit +was increased. Eleven observation/input/source-product controls pass. Current +formal platform builds are still pending; these controls do not close release, +complete Harness, performance or restoration gates. + +* Resource-scope correction from the first maintenance failure +Candidatefb265d8 incorrectly extended the Parser2GiB cap into Gerbil self-build. +Linux40555274729 passed Gambit, bootstrap and stage1, then failed stdlib after41s +with __with-lock heap overflow. This is not the7c490 ##fxzero? failure and must +not be blamed on the original2591/dcd source pair. Commit7e1ddc4 removes the +unrelated build.sh/GAMBOPT change and restores the original producer policy. +Two workers and Parser's2GiB compile/3GiB test limits are unchanged. This is a +changed-input experiment; no clean or unchanged retry is treated as a repair. + +The raw Linux log and source ZIP are retained; ZIP SHA256 is +cf5e401e0f68158a2fd4401d28982d0090b20d9b8804543d7e94d113165b8c59. +Darwin40555280141 was cancelled before publication and its log is retained; +cancellation is not a semantic failure or a qualification pass. Corrected +Linux40559760040 subsequently passed compilation, installed/relocated tool +controls and immutable publication on corrected7e1ddc4. Its archive bytes and +SHA256 were verified locally before selecting that actual Linux asset in the +Parser candidate. Linux phase logs explicitly retain two workers; the native +tools phase completed in13s. This is diagnostic construction timing, not a +Parser performance or cross-platform comparison result. Darwin subsequently passed publication40559766825 with the same source/patchset; +full Parser acceptance remains open. + +The remaining adapters are limited to actual host compiler options/progress, +ordered C/ABI production through std/make, protocol-specific runtime controls, +and explicitly non-admitting failed-product custody. Ordinary test/build calls +use native Gerbil. The hardcoded macOS mapping/codesign baseline is removed +rather than renamed: it added project admission over one historical object and +used an obsolete archive path. Gerbil/OS loading, verified archives and native +failure records own that boundary. Compiler checksum metadata is descriptive; +no new identity credential or version authority is added. + +The source-performance wrapper and its own recursive identity/namespace/catalog +are removed. All8 original performance Suite selections and numeric assertions +remain in native development commands at1GiB/120s per Suite. Local Suite plans +and formal conformance observations call native gerbil test directly; true +runtime/FFI protocol probes keep their idle/failure controls. The project emits +no replacement global performance approval token or custom source guard. + +* Published-byte consumer qualification +Parser candidate2d57caf9 selects both actual published archives. Temporary branch +qualification/native-gerbil-tool-entry runs full workflow40571065678 before +updating the existing PR13 branch. No parallel PR is created. The local canonical +checkout preserves its previous prefix as parser-before-maintenance-cold, then +activates the verified Darwin archive for native entry/dependency/build checks. +Distribution consumer62f7e4b passed40570991632 against the same published bytes +on both platforms, including repository negative controls, public API, build +scenarios and the Darwin release fixture. Its native Bazel-generated cross-platform +lock is retained. Exact qualified62f7e4b was fast-forwarded to existing PR58; its +temporary qualification branch was deleted. Parser CI and local preparation +remain separate from completed distribution qualification. Local published-byte +native tool-entry controls passed before cold dependency installation. + +* First restored consumer audit at2d57caf9 +All Rust lanes and Linux cold preparation passed. The native full Suite entry +executed182 modules and exited42 for one stale development dependency assertion: +dev/gerbil.pkg selects ASP3054db6 while the test duplicated9ae9bc3. The same run's +POO construction passed its unchanged100ms ceiling at87.358243ms p95. Module +execution records do not override the native failing Harness status. + +The exact prepared archive is preserved. Runtime closure traversal of UTF8 CPU +input visits150 Parser runtime modules and finds missing ranked-literal/benchmark. +Benchmark QoS and the actor diagnostic product are also absent. These are runtime +program inputs, not Suite helpers. The existing research writer now declares the +actual roots and delegates transitive discovery to Core, excluding the existing +package/FFI owners. It does not restore the old loader or second test runner. +The stale ASP assertion now checks its sole immutable public owner rather than +copying revision selection out of the package declaration. Native restoration no +longer rewrites pkg/directory-list already carried by the archive. + +TLA source import under the published compiler completed with1GiB in16.62s +(7.03s user CPU); a separate native runtime load completed in142.96s on this local +macOS host, dominated by dynamic-load/unload activity in preserved samples. +The earlier3GiB cold import took68.23s. Different cache conditions prevent a +performance comparison. None is a passing5s-idle receipt. Actual SANY and corpus +program entries are being compiled through the existing standard research spec, +so consumers can avoid repeating source macro expansion. Their1GiB/600s/5s and +all pinned oracle/corpus controls remain unchanged and require actual validation. + +Tokio warmup reported each completed batch while measured work reported only a +whole8-leg group. Candidate diagnostics report each real completed leg after its +CPU interval; request count, groups, order, costs,90s total and5s idle controls +remain unchanged. The old raw log ends after eight warmup records and remains +preserved; no deadlock, performance repair or final qualification is inferred. + +* Native consumer candidatec3e4cfea +The first candidate's full run40571065678 completed: both cold preparations, +all Rust lanes and both independent C/Rust FFI lifecycle jobs passed; restored +source/benchmark consumers failed. Failed-job logs, prepared Linux bytes and +artifact inventory are retained. Parser's existing PR13 remains79012241 while +temporary qualification branchc3e4cfea runs40578432613. This is a changed-input +candidate, not an unchanged retry or a claim of repaired performance. + +The existing research owner declares actual program source/bin pairs and derives +its source roots from those same declarations. Standard std/build-script completes +library/macro production before executable production, retaining native +meta/spec/clean. Related capture/edit/GQL/LR consumers and four generators now +invoke those native entries. No runtime dispatcher, directory walker, custom +loader or alternate Suite executor is introduced. Native test Suite declarations, +all positive/negative cases, numerical criteria and memory/time bounds remain. +The GQL runtime qualifier no longer compiles its own second helper catalog. + +A local absent Corpus main export left partial macro interfaces during failed +compilation; both that scene and the following macro-load refusal are retained. +Corpus now exports its existing main. Explicit native gerbil compile can repair +the local affected sources without treating repair of abandoned output as proof +of automatic std/make recovery. New-candidate cold/restored CI must independently +qualify the actual products. Existing14kB macro files are preserved before repair. + +* Explicit native link inputs atdb275120 +Local program production/test support passed after adding the actual project +header roots to executable declarations. Thec3 macOS failure is separate: gparse +omitted current OpenSSL link options. Its archived Gambit default names +Cellar3.5.9; thec3 runner installed3.6.5. The previous2d cold-success log confirms +that runner still had3.5.9, explaining why the omission was masked. The compiler +and VM source pins did not change. Gparse now consumes std/make.pkg-config-libs +at its final executable declaration, and its local native link passed with +LIBRARY_PATH and LDFLAGS unset. Thec3 failed source archive SHA256 is +aeb76683724f3d1988680542449e16369bdfba9f723c636d0cf3cae58b6b8d4b. + +Candidate db275120 runs40580410789. Thec3 macOS failed job/products are preserved; +its unfinished Linux job was cancelled when selecting the corrected candidate. +Cancellation supplies no Linux pass. Existing Parser PR13 is still unchanged. +Focused native tests exposed a remaining exact-source-text assertion rejecting +additional executable link inputs; it is removed in the next working candidate. +Native compile/CLI integration checks the actual product; this is not removal of +a runtime positive/negative case. Full CI remains required. + +* Current native program closure candidate1c022d21 +The previous full rundb275120 completed: both native preparations passed, Linux +FFI/corpus/generation passed, while macOS consumers rejected source startup in +result generation, callback collection and ABI probing. The next declared native +entries cover every remaining bounded generation method and ABI program. Existing +main procedures are exported; the edit program routes its existing callback-GC +control through a native option. The Rust native consumer build now produces its +real executable from the actual Cargo archive, removing the temporary dynamic +linkage mode and separate object selection. No algorithms, controls, golden byte +comparisons or resource limits are weakened. Standard build/test remain owners. + +Candidate1c022d2111b98a1ca3d5debbba8b5dd17de8cd06 runs40585546132 on the temporary +qualification branch. Existing PR13 remains79012241 pending qualification. Local +SANY full positive/negative controls, Header Rust byte comparisons, capture, +GQL profile/actors, edit probe and focused Suites passed. Local full Suite rejects +the preserved abandoned prefix; fresh Linux did not reproduce that residue and +failed only the removed textual-format mirror. Neither is reported as full pass. + +Research findings stay explicit: historical reference package mismatch refuses +comparison; LR/engine/Tokio full protocols exceed existing total budgets despite +real progress; UTF8 Unicode completes but rejects benefit (about1.364 cost ratio); +module-generation rejects an unstable after-control despite a favorable candidate. +No proof is created from a retry or an ignored failure. Questions about independent +workload budgeting and whether algorithm/research redesign belongs in this +native-entry PR remain pending user direction. Unaffected correctness work continues. + +* Residual development-command preloading +The contextual-parser recipe still imported gxtest before its actual standalone +main. That unused preload is removed; no workload, result comparison, budget or +threshold changes. The unchanged16-request/5-sample paired protocol passed locally +without the test tool, exit0 in9.59s at1GiB/120s/5s. The native test entry remains +the sole Suite executor. Current fullCI40585546132 is testing1c022d21; this later +one-line command cleanup is separately pending final-head qualification. + +PR58 remains62f7e4b with both native Bazel consumer jobs successful. Parser's +existing PR13 remains unchanged until its required qualification is complete. + +* Native expander initialization boundary +Run40585546132 at1c022d21 passes Linux cold preparation, restored corpus, exact +generation and complete native semantics:182 full-Suite modules plus four macro +controls and the intentional failed Suite; CLI checks pass. Native FFI reaches +main, then rejects only-in while importing its actual grammar. An independent +valid std/misc/ports input reproduces this without any Parser imports: native +runtime-only initialization exits70, Gerbil's gerbil-load-expander! exits0. + +Ordinary native executables initialize runtime; gxi also initializes expander. +The language input owner now calls that existing idempotent public API before +dynamic imports. Rust AOT removes its redundant expander import and separate +grammar-support preload. This adds no loader/cache/admission protocol. Actual +native ABI generation/reuse/error controls pass locally in3.80s at1GiB/120s/5s; +module-loading Suite passes. Changed-candidate dual-platform qualification is +still required;1c022d21's preserved FFI failure is not relabeled as success. + +The native Rust staticlib consumer also passes: actual Cargo publication, standard +program linkage22.59s at2GiB/90s/30s, then100 calls, handles2/results113 ownership +and Source-edit controls in2.70s at3GiB/90s/5s. A first manual command overwrote +activate's GAMBOPT relocation settings, producing a nonexistent producer gsc path; +that local command failure is retained separately. Preserving the original +activation settings supplies the correct released compiler without source edits. + +The same1c022d21 macOS ABI job fails before main under its unchanged5s idle +fence, distinct from Linux's dynamic only-in rejection. CI was nesting gerbil env +inside an existing native gerbil env qualifier. Native env-exec already prepends +package bin PATH and the qualifier inherits it. Eighteen inner environment hops +are removed; declared products run directly, without a new launcher or bin scan. +Actual local Rust ownership/Source controls pass via this exact route in0.37s. +Different cache states prevent treating timings as a startup performance proof; +fresh macOS acceptance under the same idle budget remains required. + +The1c022d21 macOS preparation and complete restored generation job now pass. +Its edit/GQL diagnostic controls pass before the LR matrix reaches the unchanged +90s total fence; this is not an idle failure or an admitted research comparison. +The actual standalone language ABI program also passes locally at1GiB/120s/5s +(exit0 in0.90s), including foreign-thread refusal, invalid UTF-8/inputs,100 calls +and ownership/release controls. Updated candidate908d5294 retains the original +compiler/dependency pins; remote final-head correctness acceptance is pending. + +Run40585546132 has now completed with failure. macOS executes all182 full-Suite +modules, but its existing POO construction Case rejects p95=168.422ms against +100ms (20 samples,50 object pairs); process live memory is about1.719GB. This is +not enough to attribute cause to GC and is not repaired by retry or threshold +changes. The complete native entry correctly exits42. Both cold producers and +both full generation consumers pass. Updatedd29c6598 keeps all gates and puts +independent CLI verification before the fatal complete Suite command; it includes +the native expander fix and removal of eighteen redundant environment hops. + +The first construction-path audit finds one validate call in each Parser +constructor. Parent/role/composition checks add domain obligations rather than +repeat an identical constructor call. Core's membership/admission paths also +carry normalization and contextual evidence; no local bypass is justified by +these reads. POO timing remains an unresolved measured rejection, independently +of the tool-entry and environment repairs. Full revised-head qualification runs +40591297880 atd29c6598e70c95f3d30634f8392d6af18517b12c. + +A temporary same-process counterfactual tests whether the Suite's interpreted +batch helper dominates the POO timing. The identical helper body was compiled +through native gerbil compile, then the original ASP contract ran source-before, +native and source-after with the unchanged20 samples/50 object pairs/100ms gate, +in one3GiB process. P95 values were71.609/69.526/69.161ms; all object validity +checks passed. This does not support an interpreted-helper explanation locally, +and does not reproduce the CI's1.719GB live context. No Fixture relocation, +constructor bypass or added build step is selected. Temporary diagnostic products +are preserved outside the package prefix; no diagnostic module is published. + +* Shared static C output competition atd29c6598 +Run40591297880 fails both preparations before any restored consumer. Linux links +clan__poo__generalized-prototype.c while another executable regenerates it, +reporting EOF at line110 while later diagnostic context already shows later +lines. macOS reports missing/invalid linking information for runtime/layout.c +with another program still writing that shared closure. Linux custody reports a +changing directory; that archive is retained as a nonquiescent failed scene. +Neither failure is an180s cutoff or a changed Gerbil/Gambit source baseline. + +Pinned std/make orders module-import dependencies, but its independent executable +targets regenerate shared static C paths not represented by that graph; its +extra-dependency/order-only feature is unimplemented. The existing package phase +now delegates one declared program per ordinary std/build-script invocation, +waiting for native Make/compiler completion before the next. Each invocation +keeps the configured two compiler workers and2GiB. No custom queue, lock, stamp, +manifest, compiler copy or separate output environment is introduced. + +The same-prefix local build passes without cleaning;11 stale program products +are actually rebuilt. All five declared conformance programs pass the same10s +controls, and unknown-program refusal is70. The existing owner/metadata Suite +passes with the CI OpenSSL pkg-config provider; its initial missing-provider +failure remains separately recorded. Meta still emits only spec/compile/clean. +Candidatecadd52ef contains this ordering repair; dual-platform cold qualification +remains required. Actual d29 failed archives and logs are preserved for both OSes. + +Revised candidate cadd52ef now runs full unchanged-gate qualification40595636383. + +Atcadd52ef, Linux cold preparation now passes and logs prove all22 declared +programs were actually built (plus two optional commands). Restored native +semantics/CLI, full FFI including independent C/Rust lifecycle, all generation +and corpus consumers pass. This closes the Linux correctness slice with the +original native controls; research comparisons remain independently unadmitted. +macOS cold/restored acceptance is still pending in40595636383. + +Atcadd52ef both native preparations, both complete generation jobs and both FFI +lifecycle jobs pass. macOS logs prove all22 declared programs were built; native +ABI completes in4.3266s, Rust ownership0.3777s, language ABI0.3414s under their +unchanged controls. Its CLI check passed before the complete Suite, which is the +last correctness job still running. LR's existing90s total rejection remains. + +* Finalcadd52ef result and remaining scope decision +Full run40595636383 completes with failure. Both native dependency/cold producers +actually build all22 programs; both CLI, both FFI/lifecycle and both generation +consumers pass. Linux full semantics/corpus also pass. macOS executes182 full +Suite modules plus the four isolated controls and intentional failed Suite, but +its existing POO construction Case rejects p95=190.145ms against100ms and the +complete native command exits42. The earlier168.422ms failure is preserved, and +this later result is not evidence of a performance repair. No semantic assertion +failure was observed in that complete run; the performance rejection is fatal. + +Independent research failures also remain mandatory observations: LR total +budget, CPU protocols, historical package cohort and Unicode benefit. No deadline, +heap, sample count, object count, control or numerical threshold was relaxed. +The current native-entry repairs are committed atcadd52ef on the qualification +branch; existing PR13 remains79012241 because full requested acceptance is not +closed. The user is asked whether subsequent work covers POO performance alone, +performance plus research protocol, or native-entry closure with explicit follow-up +items. No dependent protocol change or final PR update is inferred from silence. diff --git a/docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org b/docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org new file mode 100644 index 0000000..a0ac7b6 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org @@ -0,0 +1,555 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: 10.147 Source-Bound C and C++ Contract Verification +#+LANGUAGE: en +#+STARTUP: overview +#+OPTIONS: toc:3 num:nil +#+PROPERTY: header-args :eval never + +#+BEGIN_QUOTE +The later [[file:10.148-flat-declarative-library-boundary.org][10.148 Library boundary]] supersedes this proposal's placement of source +capture, process execution and evidence issuance. They are consumer/test duties, +not a Runtime implemented by this Library. The contract obligations below remain +design requirements, not executed proof claims. +#+END_QUOTE + +* Goal and decision boundary +:PROPERTIES: +:JD_ID: 10.147 +:CUSTOM_ID: source140-goal +:STATUS: design-proposed-not-implemented +:END: + +Extend the existing Library, POO and ASCENT architecture so that a domain +obligation can be checked against actual C/C++ function bodies, their callers +and the native artifact that uses them. The subject is reusable C/C++ engineering +capability across projects, not an SMP integration project. SMP illustrates one +possible application of capacity and resource-lifecycle contracts. This document +defines the design and per-project implementation gates; it reports no executed +C/C++ verification. Acquiring SMP source is not a prerequisite for this work. + +#+BEGIN_QUOTE +A checked model is not a checked implementation. A checked function under a +precondition is not evidence that every real caller establishes that condition. +A native executable is not identified by the verifier's input filename alone. +#+END_QUOTE + +This extends [[file:10.137-domain-owned-catalogs-and-native-drivers.org][10.137 Domain-owned Catalogs and native drivers]], the method +boundary in [[file:10.133-native-evidence-method-contracts.org][10.133]], and the runtime testing responsibilities in +[[file:10.118-domain-property-testing-and-evidence-trajectories.org][10.118 PBT]]. The paired view is [[file:../../90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2][90.139 D2]] / [[file:../../90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.svg][SVG]]. + +The existing Scheme Type/Contract boundary validates framework values and +method protocols. The proposed source contracts validate C/C++ semantics within +an explicitly admitted environment. Neither boundary substitutes for the other. + +* Domain organization and POO descent +:PROPERTIES: +:CUSTOM_ID: source140-owners +:END: + +Directory classification alone supplies no reusable theorem. A parent Library +is justified by shared state, invariants, contracts and substitution obligations. +GC remains an application of resource and memory management; it does not become +the organizational parent of all C/C++ verification. + +| Existing architectural role | Proposed responsibility | Specialization obligation | +|-----------------------------+-------------------------+---------------------------| +| Domain Library | Bounded capacity, unit-aware accounting, ownership, partial success and refusal consistency | Declare premises, allowed outcomes and dependency edges | +| POO Module | Publish selected model, Catalog rules, obligations and method references | Preserve inherited obligations and their identities | +| POO Profile | Select representation, ABI, macros, synchronization premises and verifier capabilities | Discharge added premises; do not silently strengthen parent assumptions | +| POO Scenario | Bind actual source, callers, fault choices and concrete claims | Establish applicability to this use and configuration | +| Scheme driver | Invoke existing tools, capture inputs/results and register issued evidence | Preserve source identity, diagnostics and outcome distinctions | +| ASCENT evidence owner | Derive obligations, applicability, pending work and opposing evidence | Keep queries scoped to their usage and frozen input closure | +| Aitia review owner | Apply selected review policy to admitted evidence and unresolved findings | Keep approval and current authorization separate from verification success | + +POO refinement must remain lazy: selecting the abstract domain must not load a +C verifier, the SMP implementation or unrelated language specializations. A +child derives fields from the selected parent rather than copying its current +projection. Existing native Module selection and Yuanxu contracts remain owners; +this proposal adds no loader, object system or procedural rule interpreter. + +Scheme declarations and orchestration belong to =library/= under existing +domain/driver owners. Future real subjects, source annotations, C/C++ harnesses +and native build inputs belong under =languages-engineering/c/= or +=languages-engineering/cpp/=, or stay in their authoritative upstream checkout +with captured identity. These are proposed placements, not directories created +by this design. Do not copy a production algorithm into a verification example. + +** Reusable engineering families and language specializations +:PROPERTIES: +:CUSTOM_ID: source140-families +:END: + +Organize Library meaning by engineering domain, with C and C++ semantic +specializations selected within that domain. Language-engineering assets contain +actual subjects and language-native verification inputs. Neither tool names nor +individual consuming projects become the parent taxonomy. The following are +candidate Library responsibilities, not newly implemented Modules. + +| Engineering family | Reusable parent obligation | C specialization | Additional C++ specialization | +|--------------------+----------------------------+------------------+-------------------------------| +| Numeric representation and capacity | Dimension-consistent quantities and bounded conversions | Integer promotions, signedness, overflow, shifts and size calculations | Relevant conversions and arithmetic within selected instantiated types | +| Memory and resource lifetime | One accountable owner; valid transfer and cleanup on each outcome | Object extents, aliasing, allocation, realloc and free | Object construction/destruction, RAII, move state and exception safety | +| Data structures and algorithms | Representation invariant, functional result and stated complexity premises | Layout, pointer links, array extents and mutation frame | Iterator/reference invalidation, generic requirements and concrete instantiations | +| Concurrency and synchronization | Allowed interference, ownership handoff and ordering | Selected atomics, locks and memory model | Selected atomics and synchronization plus affected object lifetimes | +| I/O and external resources | Partial operation, cancellation, retry and durable ownership | Descriptors, buffers, callbacks and foreign interfaces | Wrappers, destructor effects and exception paths around the same resources | +| Input and protocol boundaries | Valid structure, bounded lengths and explicit rejection behavior | Parsing, serialization, ABI and untrusted buffer access | Container/string views, borrowed storage and generic parsing APIs | + +Families compose: a network buffer pool selects capacity, lifetime and concurrency +obligations; a parser may select capacity and input-boundary obligations without +loading a concurrency model. Cross-family interaction is an explicit obligation, +such as retaining a buffer while asynchronous I/O borrows it. Domain owners +publish the interaction rule once; projects supply the actual mapping. + +** Adoption contract for any consuming C/C++ project +:PROPERTIES: +:CUSTOM_ID: source140-adoption +:END: + +Any project can select applicable Library entries. This does not mean that one +verifier supports every dialect, platform, intrinsic or runtime. Capability +admission is per selected claim and Profile; an unsupported claim stays pending +without preventing useful checks on other admitted boundaries. + +1. Describe the component's operations, resource holders, failure outcomes and + desired claims. Select engineering families rather than a project-sized Module. +2. Select the native POO Modules and refine their Profile with the language + dialect, ABI, dependencies, compiler configuration, environment and tool support. +3. Bind a Scenario to the component's relevant entrypoints, state representation + and caller relationships. Map abstract quantities/events to actual expressions + when implementation verification is undertaken. No unrelated checkout is needed. +4. Let Catalog factors derive obligations, including family-interaction duties. + Review that inherited obligations remain represented after specialization. +5. Select methods by obligation: mathematical proof, source contracts, temporal + models, runtime tests or measurements. Not every project needs every tool. +6. At execution time, capture that project's real source and run admitted methods. + Register results through the existing evidence owner and query remaining work. +7. On change, re-evaluate the dependency closure for this usage. Keep domain rules + and applicable abstract proofs reusable; keep implementation results source-bound. + +During design research, steps 1--5 can be specified without acquiring any example +implementation. Source capture is mandatory only when claiming a result about a +specific implementation. It is not a gate on the reusable Library design itself. + +** Cross-project examples and reuse boundaries + +| Consumer example | Selected families and local refinement | Reusable assets | Project-specific evidence | +|------------------+----------------------------------------+-----------------+---------------------------| +| C protocol parser | Length arithmetic, input validation and borrowed buffer lifetime | Checked-length obligation templates, integer lemmas and malformed-input generation rules | Actual parse entrypoints, buffer contract, caller validation and native parser tests | +| C network buffer pool | Capacity, partial allocation and concurrent ownership | Budget rules, partial-success model and handoff obligations | Pool layout, allocator failures, lock/atomic mapping and borrow completion | +| C++ container | Representation invariant, allocation and exception safety | Parent ownership and outcome contracts; applicable algorithm lemmas | Concrete template instantiations, invalidation semantics and throwing-operation paths | +| C++ asynchronous service | Cancellation, callbacks and resource cleanup | Handoff and cancellation rules; lifetime obligations | Executor/dependency semantics, callback capture lifetime and actual shutdown interleavings | +| SMP GC illustration | Capacity, unit conversion and partial section acquisition | The same capacity/lifetime rules used by the buffer pool | Only if later selected: actual section representation, copy policy and GC phase mapping | + +A capacity lemma can serve both a parser and a buffer pool when their premises +match. A GC-specific packing argument cannot support either merely because all +three use C. Likewise, RAII syntax does not by itself discharge cleanup ordering, +asynchronous borrow completion or exception-safety obligations. + +* Contract content and composition +:PROPERTIES: +:CUSTOM_ID: source140-contracts +:END: + +| Clause | Required meaning | Common unsound shortcut | +|--------+------------------+-------------------------| +| Preconditions | Valid representation, object extent, aliasing and synchronization premises | Assume capacity or successful allocation that callers cannot guarantee | +| Postconditions | Outcome-specific results and preserved state | Describe success while leaving partial success undefined | +| Frame | Memory permitted to be written, allocated or freed | Treat equal final values as permission to write anywhere | +| Ownership | Owner before/after each outcome, transfer point and permitted borrowing | Infer ownership from a non-null pointer alone | +| Representation | Units, integer ranges, rounding, alignment and metadata accounting | Compare bytes, words and sections as interchangeable integers | +| Progress | Termination or bounded exploration only where explicitly justified | Turn bounded safety into unbounded progress | +| Interference | Lock/phase/atomic assumptions and permitted concurrent changes | Verify a sequential slice and claim whole-SMP correctness | + +Parent ownership rules can descend to a section allocator, but the child must +identify real objects, alias relationships and actual failure paths. Partial +success may retain newly acquired resources; a blanket rollback postcondition +is inadmissible unless the implementation actually rolls back. Track every +resource holder through success, partial success, failure and subsequent cleanup. + +Contract composition requires separate evidence for the callee body and caller +preconditions. A replaced call is an assumption until its matching callee proof +is admitted. Recursive or mutually dependent summaries need an explicit sound +proof rule; circular summaries alone do not discharge one another. Missing +callers limit the claim to the recorded entrypoints. + +* Method selection and semantic mapping +:PROPERTIES: +:CUSTOM_ID: source140-methods +:END: + +| Method | Evidence it can contribute | Boundary retained | +|--------+----------------------------+-------------------| +| Quint/QNT | Handoff, retry, shutdown and phase-order properties of the selected transition model | Implementation events and environment assumptions need an explicit mapping | +| Lean | Mathematical capacity bounds, unit conversions and composition lemmas | Machine overflow, layout and allocator correspondence require separate discharge | +| CBMC | Checks on actual C/C++ operations under recorded contracts, bounds and environment | Tool support, reachable states, loop completeness and replacements must be explicit | +| ACSL with Frama-C/WP | C function contracts, invariants and modular proof obligations | Introduce when a concrete modular-proof need warrants its maintenance cost | +| PBT and fault tests | Executed lifecycle histories, shrinking and allocation-failure observations | Sampling does not prove all states; scheduling observations have their own scope | +| Native build and regression | Patch inclusion, actual executable behavior and artifact lineage | A native pass does not establish all static obligations | + +Start with CBMC for one small real C boundary. CBMC already provides function +contracts and separate checking/replacement operations; two annotation toolchains +are not a prerequisite. ACSL/WP is a later method choice, not a duplicate default +pipeline. An adapter never translates an unsupported property into a pass. + +C++ admission additionally records the supported language subset, object +lifetimes, exception paths, destructors, templates, allocation operators and +atomic semantics relevant to the claim. C acceptance does not imply C++ coverage. +Neither functional correctness nor a capacity proof establishes throughput, +latency, timing noninterference or absence of data races without matching evidence. + +** Mapping obligations + +- Link Lean quantities to C representations with explicit units, ranges and + rounding. Connect any section bound to the real packing and allocation policy. +- Link QNT transitions to source events, including stuttering and partial + operations. Document interference omitted by a local sequential check. +- Build harnesses around production functions. Instrumentation and stubs are + captured inputs; they may expose state but must not repair the subject. +- Allocation models retain failure and partial success. State admissibility must + represent real reachable states or state explicitly that a stronger domain is + checked. Reachability witnesses and satisfiability controls detect vacuity. +- Record enabled pointer, bounds and arithmetic properties explicitly. A solver + success with disabled required checks cannot discharge the obligation. +- Distinguish complete finite exploration, justified contract/invariant proof, + bounded evidence, counterexample, unsupported, timeout and execution error. + Incomplete unwinding does not become an unqualified success. + +* Evidence packet and reference closure +:PROPERTIES: +:CUSTOM_ID: source140-packet +:END: + +The following is a data contract for existing native owners, not a new wire +format or storage service. Future structured external values use Yuanxu's +existing JSON Schema admission; native handles and methods retain native POO +Type/Contract checks. Structural admission alone grants no authority. + +| Packet component | Required references and content | +|------------------+---------------------------------| +| Subject | Repository/revision, dirty-source digest if present, source/header/generated-input closure and selected real functions/callers | +| Claim | Domain obligation, canonical proposition, units, outcome coverage and exact entrypoint scope | +| Profile | Target ABI, widths/layout, macros, flags, synchronization/environment assumptions and unsupported features | +| Method | Tool/solver identities, invocation, enabled properties, loop/recursion/object bounds and completeness criteria | +| Verification inputs | Contract revision, actual production translation units, harness, stubs, allocation choices and assumption manifest | +| Results | Per-property status, original output, diagnostics, counterexample and replay references; never exit status alone | +| Independent oracle | Reviewed mathematical specification or externally enumerated cases, provenance, independence limits and expected outcomes | +| Native lineage | Real build inputs, compiler/linker configuration, artifact digest and executed regression result | +| Review/use | Existing usage/snapshot/cut references, opposing-evidence closure and separately issued authorization if required | + +The verifier's translation configuration and native build configuration need a +reviewed correspondence. Common source bytes do not establish equal preprocessing, +integer representation or runtime assumptions. Compiler correctness and trusted +runtime/tool components remain explicit trust assumptions. + +Closure includes every assumption used by a checked call replacement and every +mapping lemma used by a composite claim. A result may be stored before this +closure is complete, but it cannot support the composite claim yet. The existing +cut identifies frozen inputs independently of a result derived from them; its +identity must not depend on its own verdict or receipt. + +** ASCENT integration and finite inference obligations + +Use the actual Catalog-scoped =application=, =catalog_rule=, +=catalog_dependency=, =factor= and =requires= vocabulary described in 10.137. +The following are semantic rule requirements, not claims that new predicates or +APIs already exist. Implementation must map them to admitted native evidence +operations rather than introduce a parallel rule engine. + +| ID | Admitted input facts | Expected derivation or refusal | +|----+----------------------+--------------------------------| +| SC-R01 | Selected Catalog, C machine-capacity factor and usage | Require arithmetic, unit mapping and caller-precondition witnesses for that Catalog/use | +| SC-R02 | Resource growth with partial/failure outcomes | Require owner continuity, actual-result recheck and cleanup coverage | +| SC-R03 | Call replaced by contract | Require matching callee proof and actual caller precondition evidence; no self-support cycle | +| SC-R04 | Valid method result with exact premise closure | Candidate support only for the matched claim/Profile/snapshot and declared bound | +| SC-R05 | Applicable counter for the same current claim | Block that claim under existing review policy; preserve passing and pending evidence separately | +| SC-R06 | Changed dependency in a new capture | Re-evaluate affected applicability; retain immutable historical witnesses and unaffected reuse candidates | +| SC-R07 | Missing closure, timeout, unknown or unsupported semantics | Pending obligation, with reason; malformed or mismatched packets are refused | +| SC-R08 | Verification success without current-use authorization | Verification support only; no derived approval or permission to execute | + +Nonmonotone conclusions such as absence of opposing evidence require a declared +closed input prefix. Late evidence creates a new capture and re-review. A frozen +query remains reproducible; it cannot be retroactively rewritten into a current +authorization. Conflicting observations remain reviewable records. + +* Optional SMP illustration: capacity and lifecycle walkthrough +:PROPERTIES: +:CUSTOM_ID: source140-smp +:STATUS: illustrative-design-only +:END: + +The function names below come from the engineering problem statement. No current +body, signature, failure behavior or historical bug is asserted here. Source +acquisition is not scheduled by this illustration. If a future project selects +this example for implementation verification, its own G0 source gate applies. +The numeric inputs below are independently reviewable design vectors, not +observed SMP data. Another consumer may use the same parent rules without any +SMP dependency. + +** Input package + +For an optional future SMP application, select =___gc_copy_section_bound=, the capacity/budget +decision, =adjust_msections=, relevant callers and refusal propagation. Capture +their shared headers and build configuration. The Profile must establish word +size, usable section capacity, metadata/alignment costs, still-object accounting, +=max_heap= units and the synchronization phase that protects observations. + +The Scenario must cover no growth, exact capacity, insufficient capacity, +arithmetic limit, complete allocation failure, partial acquisition and caller +recheck. If the actual source has a different outcome protocol, revise this +mapping and its oracle explicitly; do not modify the source to fit the document. + +** Stepwise gold + +| Step | Concrete design input or event | Expected relation/result | Required evidence/reference | +|------+--------------------------------+--------------------------+-----------------------------| +| SG01 | Proposed 64-bit unsigned count; roots = MAX-3, copies = 4 | Mathematical sum is MAX+1; reject capacity admission before machine wrap | Real expression and enabled overflow/range properties; Lean integer oracle | +| SG02 | Synthetic payload 100 words, word size 8 bytes, available 799 bytes | Need 800 payload bytes; insufficient before any metadata costs | Explicit unit conversion; independently reviewed expected 800 | +| SG03 | Same payload, available 800 bytes, metadata not supplied | Payload equality alone is insufficient; full-fit claim pending | Profile accounting closure; no invented zero-overhead assumption | +| SG04 | Nine sections required, eight live; growth obtains zero | Existing eight remain owned/valid; no sufficient-capacity support | Actual allocation-failure path and owner/frame checks | +| SG05 | Ten required, eight live; growth obtains one | Actual count nine; recheck denies ten-section admission; ninth section has an owner | Partial-success path, resource inventory and real caller check | +| SG06 | Ten required, eight live; growth obtains two | Capacity sub-obligation may pass; budget/still/synchronization duties remain independent | Actual count plus all other admitted premises | +| SG07 | Refusal at required nine versus available eight | Cause retains decision operands, units and branch identity through exception handling | Real branch capture and native propagation test | +| SG08 | Real copy policy differs from bound theorem premises | Formula proof retained historically; implementation-coverage claim pending or opposed if a counter exists | Packing/alignment mapping and source-specific check | + +SG01--SG03 do not presume these representations match SMP. SG04--SG06 state +required lifecycle properties, subject to actual-source admission. Each row has +an independent expected outcome; a driver must not calculate its gold by invoking +the same implementation or reading its ASCENT-derived verdict. + +** Historical failure, repair and source change + +1. Capture old source S0, configuration P0 and the known failure report. If no + reproducible historical counter is available, record historical reproduction + as pending rather than manufacture a failing predecessor. +2. Invoke the actual S0 function through the admitted harness. Store the failing + property, machine inputs and path. Check feasibility against the real caller + and environment; a harness-only state may expose a contract issue without + demonstrating a reachable production defect. +3. A later implementation change produces S1. The old counter remains immutable + and is replayed against S1. A pass for that input closes only its reproduction + duty; the full declared contract still needs independent verification. +4. Check S1 bodies, caller preconditions, mapping and failure outcomes. Capture + any new counter and missing obligation. A changed label, owner or narrower + scope does not dispose of an earlier applicable failure. +5. Build the real native target from S1 and verify artifact lineage and actual + failure propagation. Keep this result distinct from the solver result. +6. Register the issued results through the existing evidence owner. Query pending + obligations, applicable support, opposing evidence and reuse candidates. Aitia + review can close a finding only with matching disposition and required approval. + +* Change impact and evidence reuse +:PROPERTIES: +:CUSTOM_ID: source140-reuse +:END: + +| Change | Retained asset | Required fresh work | +|--------+----------------+---------------------| +| Function body changes | Generic domain rules; math lemmas with unchanged premises; historical counters | New source capture, affected function/caller checks and native lineage | +| Comment-only byte change | Mathematical results; prior immutable machine result | Fresh identity; equivalence/dependency evidence before support is rebound to new source | +| Word width, macro, layout or allocation policy changes | Abstract property and separately applicable theorem | Representation, preprocessing, budget/packing mapping and affected solver/native checks | +| Contract precondition strengthened or scope reduced | Prior findings and original obligations | Caller feasibility, original-scope disposition and explicit review; no automatic blocking reset | +| Harness/stub removes allocation failure | Original counter and resource rule | Refuse claimed full outcome coverage until environment fidelity is restored | +| Tool, solver or flags change | Archived transcripts and independently valid mathematical assets | Method qualification and affected reruns; version ordering proves no equivalence | +| Late applicable counter arrives | Frozen old query and its history | New capture, opposing-evidence re-review and current-use validation | + +Invalidation removes current applicability, not stored evidence. Reuse is a +relationship between a witness and a new usage with discharged premises, not +mutation of its old subject digest. Unchanged bytes alone are also insufficient +when environment or method premises changed. Closed reviews retain their own +historical scope; they cannot authorize a new revision automatically. + +* LLM-based AI agent development trajectory +:PROPERTIES: +:CUSTOM_ID: source140-agent +:END: + +The LLM-based AI agent discovers domain Catalog rules, selects a Profile, and +proposes a design with explicit assumptions. ASCENT exposes derived obligations +and evidence gaps. The agent chooses the next useful proof, static check or +runtime experiment, using existing drivers, and receives source-local diagnostic +paths rather than only a global failed build. + +The agent can revise the algorithm, ownership protocol or contract. A contract +change itself requires review against parent obligations and real callers. +Independent oracles and negative controls are not generated from the result +being judged. Reviewers inspect the changed assumptions, source path and smallest +relevant counter rather than rereading an entire GC implementation every time. + +No fixed edit sequence is imposed: the graph constrains justification, not the +agent's choice of engineering solution. Record the trajectory from claim through +attempt, counter, revision and validation so another project can reuse its +reasoning without inheriting unsupported implementation conclusions. + +* Per-project acceptance plan and maintenance cost +:PROPERTIES: +:CUSTOM_ID: source140-gates +:END: + +| Gate | Completion condition | Current state | +|------+----------------------+---------------| +| G0 Source | The selected consuming project's actual functions/callers and full configuration captured | Required when verifying that implementation; no project selected here | +| G1 Scope | Reviewed local contract, parent refinement, reachable-state assumptions and independent oracle | Designed; source-specific review pending | +| G2 Static | Real-body checks, caller premises, nonvacuity controls and explicit completeness classification | Not implemented | +| G3 Counter | Historical reproduction where available, fixed replay and negative controls for excluded failure/units | Not executed | +| G4 Native | Same-source real build, artifact lineage, regression and propagation behavior | Not executed | +| G5 Integration | Native POO selection, actual ASCENT registration/queries, invalidation and reuse controls | Not implemented | +| G6 Review | Scoped closure of findings and required authorization under existing Aitia policy | Not executed | + +Implementation tests for Scheme integration belong in =t/*-test.ss=. Future +verifier harnesses remain C/C++ assets. Preserve the established per-process +2 GiB heap and 180-second acceptance budget for applicable Gerbil processes; +derive concurrency from machine resources. Before any solver run, record a +method-specific resource policy; a budget termination is pending, never proof. +This design does not change existing budgets or claim a solver run occurred. + +The maintenance cost is contracts, environment models, tool qualification and +representation mappings. A consuming project can begin with a critical boundary +or an observed defect; historical failures are useful controls, not mandatory +inputs for every adoption. Add a check when it discharges a named obligation; +reuse existing evidence when its complete premises remain valid. Avoid duplicate +checks merely because another tool can express the same assertion. Measure both +defect detection and review effort before expanding a project's verified scope. + +** Design review checklist + +- [X] Separate body correctness, caller validity, mapping and native lineage. +- [X] Distinguish parent semantics from language and application specialization. +- [X] Preserve partial success, resource ownership and allocation failure. +- [X] Bound evidence claims and expose assumptions, trust and unsupported semantics. +- [X] Define historical counter retention, current applicability and reuse boundaries. +- [X] Use existing Module, Profile, Scenario, Catalog and evidence/review owners. +- [X] Separate generic C/C++ adoption from optional SMP illustration. +- [ ] For a later selected consumer, capture its source before claiming implementation evidence. +- [ ] Validate the proposed mapping with actual Yuanxu/ASCENT APIs and real results. + +* Documentation verification +:PROPERTIES: +:CUSTOM_ID: source140-documentation-checks +:END: + +The new Org document passes =org-lint= with no findings. Local file links, +English-only text, unique CUSTOM_ID values, eight SG gold rows and eight SC-R +rule rows were checked. D2 was formatted and rendered with =--layout elk +--theme 0 --pad 24=; the SVG was visually reviewed after simplifying long +feedback edges. README and both indexes link the new design and view. + +These checks establish document structure and navigability only. All source, +tool execution and integration gates above retain their stated pending status. + +* Primary references +:PROPERTIES: +:CUSTOM_ID: source140-references +:END: + +- [[https://diffblue.github.io/cbmc/contracts-functions.html][CBMC function contracts]]: body checking, call replacement, pre/postconditions, + frames and permitted frees. Exact supported operations need pinned-tool qualification. +- [[https://diffblue.github.io/cbmc/cprover-manual/md_cbmc-tutorial.html][CBMC tutorial]]: real translation units, safety checks, loop unwinding and + completeness considerations. +- [[https://www.frama-c.com/html/acsl.html][ACSL and Frama-C]]: C behavioral contracts and WP-based proof; the referenced + C++ companion does not establish support for this project's C++ subjects. + +These references inform method selection. They do not supply SMP contracts, +domain rules, independent gold or executed evidence for this repository. + +* Current real-source controls and limits +:PROPERTIES: +:CUSTOM_ID: source140-lifecycle-controls +:METHOD_STATUS: selected-real-source-and-ascent-integration-passed +:END: + +The current development subjects compile the same C/C++ implementation in native +and CBMC checks. These source-level results are separate from the unfinished +native package and ASCENT registration gates; raw results alone are not issued +ASCENT observations. + +| Control | Actual input | Required result | +|---------+--------------+-----------------| +| Capacity body | Real =capacity.c= with widened independent arithmetic in =proof.c= | Overflow refuses admission and preserves the output object | +| Capacity contract | Real function compiled and instrumented with =--enforce-contract= | Function postconditions and write-set checks hold within the selected contract | +| Capacity clients | Actual parser/pool callers with =--replace-call-with-contract= | Independent caller assertions hold; this uses the separately checked callee contract | +| C source mutation | Remove the actual overflow guard in a private source copy | Counter for result, output/frame and unsigned arithmetic; no relabelled pass | +| Occupied C++ destination | Both source and destination own resources, with separate live counters | Refusal preserves both ownership states and counters | +| Self transfer | Occupied source is also the destination | Refusal preserves its token and counter | +| Empty transfer | Both endpoints empty | Destination availability may return true without creating a token | +| Refusal mutation | Clear the actual source token before returning false | Counter for occupied preservation, self refusal and eventual counter destruction | + +The initial lifecycle harness tested occupied refusal only after the source had +already become empty. That did not cover losing a live source token on refusal. +The new harness and literal native checks retain the original six lifecycle +properties and add four named properties. The Profile requires all ten labels; +a truncated solver report cannot satisfy the expected property closure. + +A constructor assumes a non-null live external counter, increment headroom and +preserved outstanding-token accounting. The selected bounded harness starts its +counters at zero. It does not establish arbitrary caller admission, allocator +failure, exceptions, concurrency, C++ move-constructor semantics or whole-project +safety. A consumer changing these premises needs additional obligations and new +applicable evidence. Distinct source bytes invalidate an old source-bound usage; +old results and frozen query snapshots remain historical evidence. + +The complete development test =t/source-contracts-test.ss= now passes eight actual +cases at the selected native cohort, including both source mutants, separate +consumer package owners, registration, cross-use support and source invalidation. +The acceptance remains scoped to the shared captured implementation and declared +bounds. See [[file:10.148-flat-declarative-library-boundary.org::#flat141-native-source-contract-acceptance][10.148]] for exact coverage and the separate incomplete package/Settings gates. + +* Plan-derived tool dependency closure +:PROPERTIES: +:CUSTOM_ID: source-contract-tool-closure +:OWNER: source-contracts +:AUTHORITY: selected-verification-plan +:END: + +A method's external executable inputs are derived from its actual steps, not a +host-maintained list of all installed tools. =SourceContractPlan.external-tools= +is a deterministic, duplicate-free projection of step tool names. The generated +=native-binary= is an output artifact, not an external tool. Its bytes remain in +the issued observation's artifact closure, together with logs and the report. + +#+NAME: source-contract-external-tool-oracle +| Profile | Expected external tool roles | Generated executable/artifact | +|---------+------------------------------+-------------------------------| +| C capacity body | cbmc | None | +| C enforced contract | goto-cc, goto-instrument, cbmc | raw and checked goto modules | +| C actual callers | goto-cc, goto-instrument, cbmc | raw and checked goto modules | +| C native | cc | native-binary | +| C++ lifetime body | cbmc | None | +| C++ native | cxx | native-binary | + +Both method identity and retained input-file checks use this same Library-owned +projection. An unused CBMC path need not exist for a native C run. Creating or +changing a file at that unused path does not invalidate the native witness. The +independent control compiles and executes the real native capacity subject, issues +an ASCENT witness, changes that unused file and checks continued support. Replacing +the actually invoked compiler entry file then rejects currentness and additional +registration, while the frozen supported answer remains historical. + +The development input owns a native POO =verification-plan= derived field. Basis +projection and execution read that field instead of repeatedly rebuilding the +same pure plan. This uses the existing receiver/dependency mechanism; there is +no added memo table or second invalidation policy. Source, object and artifact +checks remain mandatory. A changed active compiler cannot be hidden by retaining +a previously derived plan. + +The focused tool-closure case passes through the native test entry with natural +exit. An initial combined attempt printed all case/Module/Harness markers and OK +but hit the unchanged 120-second process deadline; that aggregate attempt remains +failed. A focused command must use =just test-source-contracts PATTERN= so the same +actual tool environment is supplied. Plain =test-file= without those environment +inputs is not an equivalent invocation. Full acceptance after the derived-plan +change must be checked separately, including natural process exit. + +The bound compiler entry may itself be a Nix launcher. Hashing that entry is not +complete attestation of its backend compiler, system headers or linked libraries. +The stable toolchain/environment premises still apply. Likewise, unused-file +independence does not promise that arbitrary in-place mutation of the input POO +object will preserve its owner/source admission. These are different boundaries. + +The subsequent complete =just test-source-contracts= invocation passes all eight +cases and exits naturally with MODULE-OK, HARNESS-OK and final OK within the +unchanged 120-second fence. This includes the new actual tool-closure control and +all previous source mutants, configuration checks and cross-project ASCENT uses. +The earlier timed-out attempt is not retroactively promoted to a pass. No isolated +check substitutes for this complete acceptance entry. diff --git a/docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org b/docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org new file mode 100644 index 0000000..e3ce5c7 --- /dev/null +++ b/docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org @@ -0,0 +1,692 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: 10.148 Flat Declarative Library Boundary +#+LANGUAGE: en +#+PROPERTY: JD_ID 10.148 +#+STARTUP: overview +#+OPTIONS: toc:2 num:nil + +* Current decision +:PROPERTIES: +:CUSTOM_ID: flat141-boundary +:STATUS: work-in-progress-not-accepted +:END: + +Deterministic Engineering maintains reusable engineering knowledge and declarative +features. It does not implement an AI agent platform or an application Runtime. +The ownership decisions here supersede earlier proposals that placed transport, +source capture, authorization recovery and verification execution in the Library. +The C/C++ contract obligations in [[file:10.147-source-bound-c-and-cpp-contract-verification.org][10.147]] remain useful; execution belongs to +development tests or a consuming ecosystem. + +#+BEGIN_QUOTE +Library declarations describe what must hold and what evidence is required. +They do not establish a platform account, execute an agent workflow, or issue +permission to act in an application Runtime. +#+END_QUOTE + +The paired view is [[file:../../90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2][90.140 D2]] / [[file:../../90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.svg][SVG]]. The organization is declared in +[[file:10.148-flat-declarative-library-boundary.sysml][the companion SysML model]]. These are architecture declarations, not SDK execution +or whole-project verification receipts. + +* One flat native Module tree +:PROPERTIES: +:CUSTOM_ID: flat141-modules +:END: + +Business Scheme Modules occupy =library//=. Category names do not +introduce extra directory levels. Literal =tags:= and native Yuanxu =profile:= +selection classify the same Module leaves; they do not construct a second registry. +Standard role files remain within their owning Module. Shared package vocabulary, +the root declaration and the build entry remain package infrastructure. + +| Classification | Current Module leaves | Authored responsibility | +|----------------+-----------------------+-------------------------| +| Domain | =backpressure-memory=, =bounded-capacity=, =resource-lifetime= | Parent models, finite obligations and invariant statements | +| Language specialization | =backpressure-tokio-rayon= | Rust/Tokio/Rayon model correspondence and additional obligations | +| Method declarations | =source-contracts=, =rust-resources= | Typed verification plans, required inputs and expected evidence | +| Rule declarations | =evidence=, =project-formation= | ASCENT rule programs and organization reasoning declarations | +| Organization | =project-organization= | Roles, responsibility relationships and design demands | +| Profiles | =source-contract-profiles=, =gateway-profiles=, =resource-lifecycle-profiles=, =library-formation-profiles= | Selected constraints and reusable or explicitly example-bound parameter sets | + +Profile implementations are consumed through their selected native Module leaf. +Application code must not import a second copy of a Profile's =objects.ss= and +assume it has the same prototype or nominal Contract identity. + +#+NAME: flat141-root-declaration +#+BEGIN_SRC scheme :eval never +(yuanxu! + :load-modules "./library" + mode: auto + profile: engineering + rename: Library) +#+END_SRC + +The root =init.ss= owns selection. =build.ss= consumes its native =std-make-spec= +projection. It contains no separately maintained public-root inventory and does +not add tests or examples to product construction. Native =gerbil test= owns test +execution. No nested =source-contract-review/init.ss= or replacement coordinator +is retained: that former module only aggregated a test sequence and had no +independent engineering meaning. + +* C/C++ methods are plans +:PROPERTIES: +:CUSTOM_ID: flat141-plans +:END: + +The =source-contracts= Module publishes sealed native value contracts, strategy +prototypes and =plan=. Yuanxu =.defgeneric= and =.defmethod= select the plan using +the actual selected prototype ancestry. Method-name and language-name switches +do not dispatch product behavior. + +| Selected declaration | Plan content | Consumer duty | +|----------------------+--------------+---------------| +| Direct C/C++ check | Translation units, entrypoint, safety checks and expected properties | Resolve inputs and run the admitted checker | +| Enforced C function contract | Translation, contract instrumentation and solver steps | Preserve actual bodies, preconditions, frames and completeness scope | +| Caller contract use | Checked replacement and independent caller properties | Supply the separately admitted callee proof; do not use circular summaries | +| Native check | Compiler role, standard, build inputs and execution requirement | Bind actual artifact lineage and report the observed result | + +Plan arguments use symbolic input/output references. The Library performs no +filesystem discovery, process launch, result issuance or durable storage. Unknown +prototypes must fail dispatch; a same-named tag is not a substitute for the +selected prototype. =ReplacedContract.= inherits its instrumentation method and +changes declared metadata. A real descendant uses =.o (:: @ parent)=; copying a +receiver with =.cc= does not itself add that parent to its ancestry. + +The earlier =implementation-root= and =contract-capture= mechanism was removed. +Yuanxu owns Scheme source selection and currentness. Development consumers use +its existing source observation primitives for the C/C++ inputs they actually +check. They must not reconstruct the Scheme import graph from a hardcoded list. + +* Runtime and platform boundary +:PROPERTIES: +:CUSTOM_ID: flat141-external +:END: + +| Responsibility | Owner | +|----------------+-------| +| Domain types, models, finite rules, Feature contracts and verification obligations | This Library | +| App Server, model providers, agent sessions and scheduling | Consuming Runtime, including the appropriate Marlin/Aitia ecosystem owner | +| Codex account/message transport and Python RPC bridge | Platform integration, outside this Library | +| Durable intake/owner authorization recovery and operational receipts | Consuming platform's admitted implementation | +| Actual compiler/solver invocations used to test Library declarations | Development support under =t/= using the existing native tools | + +The former =library-project-formation= name duplicated the containing Library's +meaning. Its input-preparation role was identified as =project-intake=, but its +platform workflow and Codex transport are outside the Library boundary. They are +not replaced with another optional platform driver here. Retired source and +platform-specific assertions were preserved locally in ignored research handoff +material; they are not product modules or new passing evidence. + +The current change set is transitional. Some old test/example consumers still +refer to retired runtime APIs and require migration or explicit retirement review. +They must not be silently counted as passing because the product surface became +smaller. A previous passing integration run does not qualify this changed tree. + +* Dependency ownership and exact revision +:PROPERTIES: +:CUSTOM_ID: flat141-dependency +:END: + +The root package now declares only AI Agentic Lab, following the explicit owner +correction after the initial single-Yuanxu design. Its native package closure +provides Yuanxu/POO, ASCENT, Parser, Orgize and the declared Scheme/Rust bridge. +The exact selected revision belongs in =gerbil.pkg=. At this inspection, the +selected existing PR #63 is stacked on existing PR #34. No direct Yuanxu or +ASCENT pin remains in this consumer. + +Package inheritance does not activate a Runtime or grant application authority. +The Library continues to publish declarative Modules and method plans. Development +verification uses explicitly selected native capabilities, not an invented +pairing installer. The older “Yuanxu pairing route” was not established by source +inspection; it is superseded by the actual Parent dependency closure. + +An earlier observation selected Yuanxu PR #19 at =0fc1a866...= directly. That +selection is superseded. Current native dependency identities come from the +selected Parent's actual =gerbil.pkg= closure, not its independent =core= source +gitlink. At inspection, ASCENT and Parser both select native Yuanxu =fd215418...=; +that package selects POO =1f4b1720...=. Parent's =core= gitlink is =520aa69e...=. +These are separate owners, not a requirement to force all source identities equal. +The package metadata test checks every selected package pin against HEAD, native +tag and generated manifest, while rejecting undeclared manifest entries. + +| Gate | Observed status | +|------+-----------------| +| Earlier native Core package build | Exit 0 before the latest revision update; not evidence for the new head | +| Native tagged update to PR #19 head | Checkout moved to the requested head; CLI later failed on the tagged directory spelling | +| Standalone ASCENT install attempt | Refused: installed Core tag =e77698c...= versus requested =fd215418...=; no uninstall or fabricated manifest | +| Earlier single-Yuanxu dependency proposal | Superseded: Yuanxu alone did not declare ASCENT; no pairing installer was found | +| Current AI Agentic Lab dependency closure | Selected from actual Parent metadata; complete native installation remains open | +| Current POO/Yuanxu/ASCENT native packages | Incremental build entries exit 0 at the Parent-selected revisions; earlier 180-second attempts remain failed evidence | +| User configuration values | Two actual Config assignment cases and all three internal native selection controls pass; real Example-to-native-owner execution is checked separately | +| Source-contract Scheme integration | Eight full real-tool cases pass with MODULE-OK, HARNESS-OK and final OK under the unchanged test fence | +| Retained real evidence | Six actual tool results register and return one unopposed support each, no pending/counter rows; local artifacts retained | +| Full Parent installation | Bridge system-library discovery is corrected; full installation reaches Orgize generated-parser compilation but exceeds the unchanged 180-second fence | +| REUSE | Full local lint passes after restoring moved headers, sidecars and the standard Apache license text; generated/failed artifact bytes are preserved | +| Parent native package entry | Exit 0 at the selected head; the package manager generated the real Parent manifest | +| Root native package build | Exit 0 after explicitly importing the Object Type used by rust-resources; actual root .ssi/.o1 artifacts generated | +| Native package metadata and ABI | Exact declared pins, HEAD/tag/manifests, native-generated closure controls, compiled products and compiled root/ASCENT/Type import pass with natural exit | +| Complete current test roster, cold dependency closure and remote CI | Not accepted | + +The failed standalone attempt is historical diagnostic evidence, not the chosen +dependency architecture. The current instruction uses AI Agentic Lab as the single +Parent dependency, superseding the direct-Yuanxu proposal. + +* Review and remaining acceptance +:PROPERTIES: +:CUSTOM_ID: flat141-acceptance +:END: + +- [X] Root build inventory removed; native init projection is the build input. +- [X] Business Scheme Module directories flattened and literal classifications added. +- [X] Artificial source-contract review coordinator removed. +- [X] Source-contract product methods changed to declarative generic plans. +- [X] Platform transport and recovery implementations removed from the Library. +- [X] Sole root dependency selects the locally qualified Parent revision; direct Yuanxu pin removed. +- [ ] Finish all test/example consumers against the declarative surface. +- [X] Qualify native-generated package metadata, selected dependency identities and compiled root ABI. +- [ ] Complete the full Parent dependency installation and cold-build gates. +- [ ] Run the complete current product build and native test roster. +- [X] Retain the six-result source-contract packet at its recorded Config/tool-closure baseline. +- [X] Reissue the six-result packet after the current Config/Examples organization changes; all six real queries return one unopposed support, no pending and no counter. + +Development validation retains real C capacity functions and callers, explicit +C++ ownership-transfer/destruction checks, independent expected properties, +negative controls and source-change tests. Process limits remain 2 GiB per Scheme +process and the established deadlines, with machine-derived build concurrency. +No assertion is removed to reinterpret an incomplete or failing check as success. + +* Source-driven views and compression +:PROPERTIES: +:CUSTOM_ID: flat141-render-provenance +:RENDER_OWNER: packages/render +:DESIGN_STATUS: declaration-only +:END: + +The refactor is rebased onto main =6f3113e=, including the existing TS renderer +and Sharp compression. Published main document and view identities remain stable; +this branch uses new items 10.147--10.148 and 90.139--90.140. + +#+NAME: flat141-render-owners +| Stage | Existing owner | Check | +|-------+----------------+-------| +| Authored semantics | Org authority and paired D2 figure declaration | Source-focused Question and exact model subject identities | +| Compilation and composition | =compileFigureSource=, =composeFigure=, =composeModelView= | D2 labels/relations; no raw D2 SVG or invented geometry | +| Browser export | =exportFigure= with Playwright and ELK | Settled fonts, measured geometry and minimum text size 12 | +| Raster compression | Native =compressPNG= / =encodeWebP= inside export | Sharp lossless encoding; smaller raster selected by actual byte size | +| Audit | Source SHA-256, export receipt and decoded pixel comparison | PNG and WebP dimensions, channels and pixels must agree | + +#+BEGIN_SRC sh :eval never +bun install --frozen-lockfile +bunx playwright install chromium +bun run example:library-boundary +#+END_SRC + +The package-owned example composes both declarations through existing public +APIs. It writes SVG, PNG, lossless WebP, offline HTML and receipts to +=.cache/render/library-boundary/=. Reviewed SVG/PNG/WebP and receipts are published +alongside each D2 source. SVG remains vector output; the compressed raster does +not replace its semantics. The README uses the smaller lossless raster. + +Source and composition changes require regeneration. Rendering receipts establish +captured presentation facts only: they do not establish Parent package admission, Scheme +build acceptance, a verifier result or permission to use application effects. + +* Current configuration interface +:PROPERTIES: +:CUSTOM_ID: flat141-current-config +:CURRENT_CONTRACT: 10.149 +:END: + +The current public interface and native recursive defaults are defined in +[[file:10.149-unified-language-engineering-configuration.org][10.149]]. The earlier flat Config/verification and paired enabled/disabled +Examples described below are historical implementation stages, superseded by the +single programs.deterministic-engineering.languages tree. They are not retained +as compatibility interfaces. Current user values live in =examples/programs.ss=; +maintained defaults live in the root =config.ss=. + +* User-facing Examples: Enable and Settings +:PROPERTIES: +:CUSTOM_ID: flat141-user-configuration +:CONFIGURATION_OWNER: Yuanxu +:SETTINGS_BINDING_STATUS: value-assignment-and-native-owner-checked +:END: + +Examples are user configurations, inspired by the NixOS Modules interface. A user +selects a Module or Feature and supplies typed Settings. User-facing declarations +do not expose method-dispatch assembly, source collectors, process invocation, +evidence-session creation, row mutation or report serialization. + +The previous root Examples contained 744 lines of operational Scheme consumers. +Those consumers now live under =t/support/=, with their existing assertions and +inspection recipes retained. Several still refer to retired Runtime interfaces; +relocation does not make those consumers accepted. Root Examples now import the +maintained public Config and demonstrate direct assignment or plain POO object +assignment. The former selection probes are maintained under =t/support/= and +remain internal native loading controls. + +| Owner | Responsibility | +|-------+----------------| +| Example | Enable/disable choice and user Settings; no operational effects | +| Library Module | Defaults, typed option contract, dependencies, obligations and pure derived plans | +| Yuanxu | Selection, Settings merge/admission, source identity, lazy Module/Feature projection and build closure | +| Test/consuming host | Explicit execution, real results, evidence registration/query and independent controls | +| External policy owner | Application authorization and actual-use boundary | + +Examples name public capabilities only. Internal dependencies such as the +capacity model, lifetime model and evidence declarations are resolved by native +Yuanxu; users do not duplicate that graph in every configuration. + +Enabling a Module is selection, not tool execution or approval. A required Module +explicitly disabled by the user must reject, rather than being silently enabled. +Settings must be admitted against the final inherited receiver. Changing a value +must change the actual selected Profile/plan and its evidence applicability; +configuration cannot remove mandatory obligations or hide applicable counters. + +The user's Config is an ordinary maintained declaration, not a new loader +keyword. The existing Profile Config imports the assigned value; native +requirement refinement and Type admission create the configured method scope. +The two real Examples exercise this path without a second settings interpreter, +an example-owned loader or user-authored scope inheritance. +See [[file:../../../examples/README.org][the user guide and concrete acceptance table]]. Full closure requires actual +partial-Settings normalization and native selection/compiler-demand properties +beyond the assigned method capability. The current value/Type, actual execution, +disabled refusal and historical evidence boundaries are qualified separately. + +* Actual source-contract integration acceptance +:PROPERTIES: +:CUSTOM_ID: flat141-native-source-contract-acceptance +:ACCEPTANCE_SCOPE: selected-source-contract-profile +:WHOLE_PRODUCT_STATUS: not-accepted +:END: + +The full =just test-source-contracts= entry now exits naturally with all eight +cases, MODULE-OK, HARNESS-OK and final OK. It runs the actual C/C++ subjects and +independent assertions; it does not substitute stored reports or relation fixtures. + +#+NAME: flat141-native-case-coverage +| Case | Concrete behavior established | +|------+-------------------------------| +| Active tool closure | All six Profile tool sets match an independent table; an actual native result remains reusable when unused tool files change, while modified invoked compiler bytes refuse further use and retain the frozen answer | +| Config assignment | Ordinary Config import and plain POO assignment feed the actual native plan; invalid settings refuse; disable produces the exact refusal without creating an execution directory | +| Pure Scenario admission | Library-owned Record composes root, Catalog entry and Profile without filesystem access; wrong shape and six inconsistent Profile bindings refuse before source capture | +| Real methods | Enforced C callee contract, actual parser/pool contract-replacement callers, independent C body assertions, C++ lifecycle and native executables; inherited generic executor also runs | +| C opposing result | Removing the real overflow guard yields a counter; malformed Profile, unknown executor, missing property and tampered output refuse | +| C++ opposing result | Clearing a live source on occupied refusal yields an actual counter; the strengthened ten-property Profile is required | +| Change and replay | Comment-only source changes invalidate new registration; actual rerun supports the new capture; old witness rows and frozen answers remain | +| Independent consumers | Separate parser/pool package declarations load separate native owners over one shared implementation; one witness supports both; changing one consumer refuses that owner's currentness while its sibling remains current; changing the shared source refuses further registration | + +The independent consumers share an identical physical implementation capture. +This is not a theorem equating unrelated repositories, alternate implementations, +different include environments or arbitrary toolchain revisions. Tool executable +bytes and declared inputs/plans are bound; complete SDK/header/shared-library +attestation is not established by this selected development gate. Consumers must +retain the stated stable-toolchain and no-concurrent-writer premises. + +The retained development entry =just investigate-source-contracts OUTPUT= uses +the internal native Module selection and high-level Profile Module. The actual +user Config-to-execution lifecycle is qualified by the separate native owner case. +The retained entry's six real results +produce one =support= and one =unopposed_support= each, with no pending/counter +rows. Artifact paths, commands and issued observations are kept in the fresh local +output directory, not in a committed raw-log archive. Serialized JSON does not +acquire the private issuer's authority. + +** Native integration corrections +The rebase had retained 26 obsolete tracked files under the old nested Library +and driver paths, alongside their flat replacements. These copies were removed; +no forwarding Modules remain. Native profile discovery had correctly refused the +untagged old declarations. + +Four named Scope Types lacked the =identity= required by the unchanged native +publication Type contract. They now declare their family identities explicitly. +ASCENT's =rules/interface= owns its Module declaration; executable syntax is +imported from the native =rules/func= role. Consumers were migrated directly. + +The source-contract Profile exports its actual selected =plan-library= capability. +Examples select the native =source-contract= or =rust= tag Profile in =auto= mode, +rather than listing hidden implementation dependencies in explicit mode. Explicit +disable decisions still reject a required dependency. The test executes this same +user declaration and keeps native source ownership and currentness guards. + +The full Parent installation and package metadata suite remain separate gates. +The Darwin wrapper now preserves the caller's =PKG_CONFIG_PATH=, matching Parent's +policy, so the bridge can discover its declared system libraries. No dependency, +assertion or process budget was removed to qualify the source-contract result. + +** Library-owned Scenario admission +:PROPERTIES: +:CUSTOM_ID: flat141-scenario-admission +:OWNER: source-contracts +:END: + +A source-contract Scenario is a pure typed value: implementation root, Catalog +entry and selected Profile. It has no tool paths, output directory, process +handle or execution method. The native Record descriptor refines its inherited +membership predicate; structural checks remain mandatory. Method agreement, +instrumentation requirements, Catalog obligation membership, nonempty capture, +expected properties and translation-unit inclusion are checked before host I/O. +The host input wraps this Scenario and adds explicit tool locations. It does not +reimplement the Library's binding rules. + +This is an internal composition boundary, not an extra object users must assemble +in Examples. Native Config admission controls the verification method policy; +Scenario source roots, Catalog selection and Profile binding remain explicit +inputs at the consuming engineering boundary. A nonexistent source root can be a +well-formed declaration; existence and capture remain explicit host obligations. +Pure admission establishes neither source validity nor a passing verification. + +* User Config assignment contract +:PROPERTIES: +:CUSTOM_ID: flat141-config-assignment-proposal +:STATUS: implemented-two-assignment-forms +:USER_SURFACE: imports-and-assignments +:COMPOSITION_OWNER: Library +:END: + +The example has two allowed forms: assigning an imported value directly, or +assigning a plain POO object containing user values. It must not require explicit +prototype ancestry, type declarations, generic methods, MOP operations, directory +selection or a user-maintained dependency graph. A basic object literal is data +assignment; it is not an invitation to define a second object framework. + +A maintained =config.ss= owns the functional declaration and exports =Config=. +Library authors own inheritance, typed defaults and derived fields. A consumer +imports that maintained configuration or an appropriate public interface. Managed +Module =interface.ss= publications and admitted scopes remain distinct: importing +a declaration must not be represented as scope admission or authorization. + +#+NAME: flat141-config-assignment-obligations +| Boundary | Required behavior | Evidence still required | +|----------+-------------------+-------------------------| +| Direct value | An imported maintained Config is assignable without an adapter | Native import and final consumer test | +| Plain object | Enable and Settings are ordinary assigned values | Actual object consumption, not only field lookup | +| Defaults | Library-owned composition supplies omitted fields | Partial settings preserve unrelated defaults | +| Final receiver | Derived Profile and plan read the final admitted Config | A changed setting changes the actual obligation/plan capture | +| Disabled declaration | An inactive capability does not demand business execution | No scope/tool demand; required-disabled conflict refuses | +| Contract | Unknown options, invalid types and inconsistent settings refuse before effects | Negative inputs through the same native owner | +| Evidence | Setting changes invalidate only applicable uses; old results remain historical | Real ASCENT queries across two configuration captures | + +The declaration tree is the single configuration source. Neither Build nor tests +may maintain an independent enabled-capability registry. Tests may supply host +inputs and execution tools, but cannot fill in a missing product configuration +binding and call the example complete. The earlier Profile Config contained only =purpose=. It now assigns a maintained +verification Config through the existing native requirement refinement. The method +Config owns =enable= and =settings=. The actual Examples now supply the value +consumed by this dependency binding. Merely assigning an unconsumed object would +not establish that result. + +The two maintained Example files now name the public Config import and use +exactly these assignment forms. Native owner tests consume the actual files, +compile and execute a real C subject, register the observation in ASCENT and then +switch to the disabled value. No Example owns the refinement or execution code. + +** Implemented module Config ownership +:PROPERTIES: +:CUSTOM_ID: flat141-config-native-declaration +:VERIFICATION_SCOPE: source-contract-native-suite +:END: + +The source-contract method's =config.ss= now owns an exported =(.def Config ...)= +with =enable= and typed =settings= containing the maintained timeout and safety +flags. The old =SourceContractPolicy= +object was removed rather than retained as a second configuration source. +Capacity, lifetime and source-contract Profile configuration values are named +native declarations as well. Evidence Config explicitly specializes its reusable +EvidencePolicy within the Library; Examples do not author that inheritance. + +The plan capability reads =config= from its final scope and passes the admitted +policy to the existing native generic methods. It no longer reads a fixed policy +from =objects.ss=. The public plan operation retains its two arguments; policy +is supplied by the Module, not by an example or a second execution driver. +A regression derives a scope with invalid safety flags and verifies that plan +construction raises the unchanged Type error before tool execution. All eight +source-contract cases, actual C/C++ verification, opposing controls and ASCENT +reuse/invalidation checks pass through the standard entry with final OK. + +The maintained policy is deliberately exact: this change does not make timeout +or safety checks user-removable. The Profile Config now assigns the verification Config to its native dependency. +The method Config assignment and refusal paths are checked, while complete +user-facing composition and native dependency-demand admission remain open gates. +Named =.def= syntax alone is not acceptance of the final user-facing interface. + +** Concrete method Config and assignment evidence +:PROPERTIES: +:CUSTOM_ID: flat141-config-enable-settings +:PUBLIC_VALUE: source-contracts/config.ss::Config +:PROVEN_SCOPE: imported-value-and-final-scope-plan +:END: + +The method Config now has this maintained declaration. This is Library code, not +an example that users must copy or an additional interpreter. + +#+NAME: flat141-method-config-shape +#+BEGIN_SRC scheme :eval never +(.def Config + enable: #t + settings: + (.o + timeout: 45 + safety-flags: + '("--bounds-check" "--pointer-check" + "--signed-overflow-check" "--unsigned-overflow-check" + "--unwinding-assertions" "--unwind" "8"))) +#+END_SRC + +An actual ordinary Gerbil import of =config.ss= is exercised in the Scheme test. +Both direct assignment of the imported Config and assignment of a plain object +with =enable= and =settings= pass the same named Config Type. Library-owned scope +composition consumes that value in the actual plan operation. A disabled value +raises the specific disabled-capability error before explicit source admission, +creation of the execution directory or execution of tool steps. This is not +inferred from an arbitrary exception; the test checks the exact Error message. + +The same native suite still executes enabled configurations against real C/C++, +CBMC and ASCENT. No existing negative control or assertion is removed. Invalid +boolean and policy inputs fail Type admission; a derived scope with missing +safety checks cannot obtain a plan using a captured default policy. + +This proves value assignment and the selected method capability's consumption. +The later closed-Config controls establish unknown-option refusal at the method, +settings and Profile value boundaries. This does not establish partial-settings normalization, +arbitrary consumer Config-to-native-owner admission, namespace absence for disabled Modules, +zero compiler demand or whole-package installation. The native observation +collector still surrounds the development entry; no claim is made that disabled +use performs no metadata observation. Selection probes have moved to test support. The final Examples contain only +imports, exports and direct/plain-object Config assignment. + +** Native Profile dependency Config admission +:PROPERTIES: +:CUSTOM_ID: flat141-profile-native-config-edge +:OWNER: source-contract-profiles +:VERIFICATION_ENTRY: just test-file t/source-contract-owner-config-test.ss +:END: + +The existing Profile Module now declares =Config.verification= as the assigned +method Config. Its named Config Type imports the method Config Type. The native +=requires.Driver.refine= operation composes that value into the existing upstream +scope; Core admits the refined provider against its unchanged scope Type. The +Profile exports that admitted capability as =plan-library=. This is an existing +Module dependency operation, not an additional wrapper Module or option parser. +Ordinary users do not author the refinement lambda or scope inheritance. + +#+NAME: flat141-profile-native-config-gold +| Step | Actual input/event | Independent expected result | +|------+--------------------+-----------------------------| +| 1 | Copy maintained method/Profile roles and shared Types into an isolated real package | The standard native loader reads actual publications; no synthetic publication rows | +| 2 | Load the Profile with its default Config | Dependency Config enable and safety flags agree with the assigned Profile value; a real declarative CBMC plan is available | +| 3 | Freeze the plan and verify owner currentness | The admitted source snapshot is current before change | +| 4 | Change the Profile config.ss to a plain assigned disabled Config | The old owner rejects currentness; the old source receipt is not current permission | +| 5 | Load a new owner through the same native entry | The dependency is Type-admitted with enable false; this is not the original method default | +| 6 | Demand a plan from that new dependency | The exact disabled-capability Error is raised; no fallback to the upstream enabled default | +| 7 | Inspect the previously frozen plan value | Its method and steps remain historical data; no evidence or plan is erased | + +The new isolated native-owner case passes with MODULE-OK, HARNESS-OK and final OK. +Separately, the complete actual C/C++/ASCENT entry passes after this +Profile dependency change. The native-owner test proves source-change refusal, +new-owner Config admission and historical plan retention; it does not itself run +CBMC or register a second witness. Those execution/evidence gates are provided by +the separate real source-contract suite, and no aggregate cold-build claim follows. + +Native admission may normalize objects. The oracle therefore checks field meaning, +not pointer identity between the assigned Config and the admitted Config. The +first test attempt incorrectly required pointer identity and failed; that failed +result remains a diagnostic, not evidence against the configuration semantics. +The successful case retains stronger source-currentness and disabled-plan checks. + +* Native package build and compiled consumer qualification +:PROPERTIES: +:CUSTOM_ID: flat141-native-package-qualification +:ACCEPTANCE_SCOPE: incremental-local-package-and-compiled-abi +:COLD_INSTALL_STATUS: not-qualified +:REMOTE_CI_STATUS: not-qualified +:END: + +The first root build failed because the selected Parent had no native manifest. +The Parent's own =gxpkg build= entry then completed within the unchanged 180-second +fence and produced its real manifest. Its HEAD, registered tag and package version +remain those selected by the root declaration. No package was uninstalled and no +manifest was synthesized. The Parent's installation build intentionally has no +selected business Module roots; success is not proof of all Parent features. + +The next root build found an unbound =Object= used by the Rust method scope Type. +Adding the explicit =:clan/poo/mop= import fixed that compilation error. The root's +standard =just build= now exits naturally and produces real =init.ssi= and +=init.o1= products through the existing =init.exports= build projection. + +The existing metadata suite then checked the actual package-manager data and all +its original extra/missing/duplicate/conflicting closure controls. Its compiled +consumer initially requested the wrong namespace: =modules.Library= is the source +owner shape, whereas a renamed =init.exports= namespace exposes =Library= +directly. The consumer now uses the native public mount, without an adapter. +No ABI, Type or artifact assertion was removed. + +#+NAME: flat141-native-package-qualification-gold +| Entry | Required observations | Result | +|-------+-----------------------+--------| +| Parent native package build | Natural exit 0, native manifest, selected HEAD/tag preserved | Pass | +| Root native build | Natural exit 0 under 180 seconds; real .ssi/.o1 | Pass | +| Package metadata test | Native closure, pin/tag/HEAD consistency and negative controls | Pass | +| Compiled consumer | Existing artifacts checked before imports; root namespace, ASCENT procedure, named Profile Type and exported Config load; Config satisfies the compiled method Type | Pass | +| Test process | NATIVE-COHORT-CLOSURE-OK, COMPILED-CONFIG-ASSIGNMENT-OK, COMPILED-PACKAGE-LOAD-OK, NATIVE-PACKAGE-METADATA-OK, MODULE-OK, HARNESS-OK, final OK and natural exit | Pass | +| Full dependency installation / cold build | All declared packages built from no existing artifacts | Not established | +| Whole test roster and remote exact-head CI | All required current consumer/renderer gates on the published head | Not established | + +The current native closure has seven package identities. Its native Core revision +and optional Parent source gitlink remain independent, as declared upstream. +Existing cache and previously built SDK/dependency products were present; this is +incremental local qualification. The earlier Orgize 180-second install failure is +retained and has not become a cold-install pass. The separate real source-contract +suite and packet establish actual tool execution and evidence behavior; compiled +import acceptance alone cannot establish those results. + +The compiled Config consumer imports +=:deterministic-engineering/library/source-contracts/config= directly. Its =.ssi= +and =.o1= files must exist as ordinary artifacts before import, preventing a source +fallback from hiding missing package products. The imported Config passes the +compiled method's named Config Type and retains its enabled default. This closes +the package-export availability gate for the proposed simple assignment surface; +the actual Examples now use that import. Partial-settings normalization remains +unimplemented. +These local results describe the current worktree, not a published exact-head CI. + +* Closed configuration admission and candidate dependency audit +:PROPERTIES: +:CUSTOM_ID: flat141-closed-config-and-candidate-cohort +:DEPENDENCY_POLICY: qualify-before-promotion +:END: + +The method Config and its settings already use native sealed Record descriptors. +Focused negative controls now check unknown =enabled=, omitted =settings= and an +extra =timeout-seconds= field, in addition to the existing wrong boolean and +invalid safety/budget inputs. No private field-name interpreter is required. + +The Profile Config previously used an open Record. A control supplied both a valid +=verification= field and an extra misspelled =verfication= field; admission accepted +it, so the refusal assertion failed. The Profile's maintained Config Type now uses +native =sealed: #t=. The mandatory field remains unchanged; the added control +checks unknown-field refusal rather than merely omission of a required field. +The native rebuild and complete eight-case source-contract entry now pass with +this stricter descriptor and natural process exit, under the unchanged fences. +The native owner configuration regression and the compiled-package metadata/Config +ABI suite also pass in separate fresh bounded processes. + +** Observed upstream revisions +The installed qualified Parent remains =558e9bd5...=. GitHub reports its PR #63 +merged. The existing Parent PR #34 is still open and its observed candidate head +is =75b04e07...=. That candidate declares Parser =e5fdd53b...=, Orgize =7a54cc75...= +and the unchanged ASCENT =62299efe...=. Parser still selects native Yuanxu +=fd215418...=; the optional Parent source gitlink must be examined independently. +This is a candidate audit, not a root dependency update or a claim of green CI. + +The candidate Parser is not a linear fast-forward of the qualified =21fdb586...= +checkout. GitHub's comparison reports diverged history, so no prior Parser build +or consumer result is transferred to it. The candidate Parent and Orgize package +metadata no longer directly declares Scheme/Rust bridge, while the inspected +Orgize build still imports =:gerbil-scheme-rust/scheme/runtime= during compiled +interface validation. The producer/admission path for that namespace in the +candidate closure must be established from actual build products. Declaration +inspection alone does not prove that it is missing or safely removable. + +#+NAME: flat141-candidate-cohort-gates +| Gate | Evidence required before promotion | +|------+------------------------------------| +| Source identity | Candidate HEAD/tag and the exact declared transitive revisions | +| Namespace producer | A declared owner or native generated product supplies the compiled-interface observation dependency | +| Fresh installation | The public package manager installs without an unrelated cached bridge supplying a missing dependency | +| Native build | Each required package and root entry completes within its unchanged fence | +| Consumers | Compiled Config/Type ABI, actual C/C++/ASCENT cases and source-change refusal remain valid | +| Publication | Current worktree and eventual PR head identify the newly qualified cohort; old-cohort results remain historical | + +The previous Orgize writer already compares generated text before rewriting files. +It is therefore incorrect to attribute the earlier timeout to unconditional file +rewrites. The older dynamic generator forces =--optimized= on its nested build. The +candidate instead separates source generation and invokes the generated package +through =gerbil build=, forwarding only the actual caller's selected mode flags. +This is a concrete changed compilation boundary, not evidence that concurrency +was absent or that its timing gate passes. The implementation change still +requires timing and acceptance. +No package pin, manifest, assertion or dependency is altered to claim success in +this audit. + +* Actual Example configuration to issued native evidence +:PROPERTIES: +:CUSTOM_ID: flat141-example-native-evidence +:USER_FORMS: direct-assignment-and-plain-object +:LOADER_OWNER: Yuanxu +:EXECUTION_OWNER: development-consumer +:END: + +=examples/source-contracts.ss= imports and directly assigns the maintained public +Config. =examples/source-contracts-disabled.ss= assigns a plain POO object with +=#f= enable and the maintained Settings. Neither file declares ancestry, +methods, Types, directories, native source owners or process steps. The Rust +selection probe is preserved under test support; no unsupported Rust configuration +value is invented to fill the user Examples directory. + +The real consumer test copies these actual Example files and the maintained +Library roles into an isolated package. Its Profile config imports the chosen +Example and assigns =verification: user-Config=. The existing native dependency +refinement and the same named Types admit the configured method scope. + +#+NAME: flat141-example-native-evidence-gold +| Step | Actual event | Expected relation or refusal | +|------+--------------+------------------------------| +| 1 | Import the direct-assignment Example through Profile Config | Native dependency receives enable true and the maintained safety policy | +| 2 | Select the maintained native capacity Profile and actual C sources | The declared native plan compiles and executes the real subject | +| 3 | Register the privately issued observation in ASCENT | One support row for the native obligation; no fabricated result row | +| 4 | Freeze the query and switch Profile import to the plain-object disabled Example | Old owner currentness and further registration of its old result reject | +| 5 | Admit a new owner through the same native Module entry | The dependency reads enable false; demanding a plan raises the exact disabled-capability Error | +| 6 | Read the prior frozen query and witness relation | Historical support and witness remain; no deletion or conversion into current authorization | + +The two Example imports are also checked directly against the named Config Type. +All three prior selection-parser controls remain under the same test suite and +now read the relocated internal probes. The actual owner/evidence case preserves +its earlier source-currentness, policy agreement, disabled-plan and frozen-plan +assertions while adding real execution and evidence checks. + +The test changes which maintained Example the Profile imports. It does not claim +in-place hot reload of an arbitrary already-loaded ordinary Gerbil helper module. +Nor does enabled assignment qualify all SDK/dependency/compiler environments. The +fixed verification policy and current cold-install/remote-CI limits remain intact. diff --git a/docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.sysml b/docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.sysml new file mode 100644 index 0000000..f58897c --- /dev/null +++ b/docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.sysml @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +package DeterministicEngineeringLibrary { + public import ScalarValues::*; + + part def LibraryModule { + attribute directory : String; + attribute classification : String; + } + + part library { + part capacity : LibraryModule { + attribute redefines directory = "library/bounded-capacity"; + attribute redefines classification = "domain numeric"; + } + part lifetime : LibraryModule { + attribute redefines directory = "library/resource-lifetime"; + attribute redefines classification = "domain memory"; + } + part backpressure : LibraryModule { + attribute redefines directory = "library/backpressure-memory"; + attribute redefines classification = "domain concurrency"; + } + part tokioRayon : LibraryModule { + attribute redefines directory = "library/backpressure-tokio-rayon"; + attribute redefines classification = "specialization rust concurrency"; + } + part sourceContracts : LibraryModule { + attribute redefines directory = "library/source-contracts"; + attribute redefines classification = "method verification"; + } + part contractProfiles : LibraryModule { + attribute redefines directory = "library/source-contract-profiles"; + attribute redefines classification = "profile source-contract"; + } + part evidenceRules : LibraryModule { + attribute redefines directory = "library/evidence"; + attribute redefines classification = "rule declaration"; + } + } + + dependency from library.tokioRayon to library.backpressure; + dependency from library.contractProfiles to library.sourceContracts; + + // This model declares Library organization. It does not define an App Server, + // provider, scheduler, process host, operational authority or Runtime instance. +} diff --git a/docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org b/docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org new file mode 100644 index 0000000..08d1e9c --- /dev/null +++ b/docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org @@ -0,0 +1,188 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: 10.149 Unified Language Engineering Configuration +#+LANGUAGE: en +#+STARTUP: overview +#+OPTIONS: toc:2 num:nil + +* Public contract +:PROPERTIES: +:CUSTOM_ID: unified-engineering-config +:OWNER: deterministic-engineering/config.ss +:MERGE_OWNER: :yuanxu/configuration/json::config-defaults +:SCHEMA_OWNER: library/source-contract-profiles/types.ss +:END: + +The single downstream interface is +=programs.deterministic-engineering.languages..{enable,settings}=. +The current executable language keys are =c= and =cpp=. The maintained root +[[file:../../../config.ss][Config]] contains defaults; [[file:../../../examples/programs.ss][the user Example]] contains ordinary +assigned overrides. No separate enabled/disabled Example or user-authored ancestry +is needed. This supersedes the earlier flat method-only Example interface in +[[file:10.148-flat-declarative-library-boundary.org][10.148]]. Low-level method declarations remain reusable Library capabilities. + +#+NAME: unified-engineering-config-fields +| Field | Default | Contract | +|-------+---------+----------| +| languages.c.enable | false | Boolean | +| languages.c.settings.profile | capacity-body | Maintained Profile belonging to C | +| languages.c.settings.timeout | 45 | Integer from 1 through 45 seconds | +| languages.cpp.enable | false | Boolean | +| languages.cpp.settings.profile | lifetime-body | Maintained Profile belonging to C++ | +| languages.cpp.settings.timeout | 45 | Integer from 1 through 45 seconds | + +Unknown fields, unsupported language keys, wrong structures and invalid budgets +refuse through native sealed Record Types. Profile names resolve against the +existing Profile values. Language projection verifies the selected Profile's +actual language identity; it does not trust a caller-supplied language label. +That semantic check occurs when the projection is demanded, before tool execution. +Mandatory method safety flags cannot be removed through language settings. + +* Native composition +:PROPERTIES: +:CUSTOM_ID: unified-config-composition +:END: + +Yuanxu =config-defaults= recursively combines object/object fields using native POO +prototype parents. Omitted values inherit defaults. Scalars, lists and explicit +false replace the corresponding value; they are not interpreted as absence. +There is no repository-local recursive merge, option registry or configuration +loader. Native Types admit the final merged value. + +#+NAME: unified-merge-gold +| Supplied value | Result | +|----------------+--------| +| Empty object | Both languages remain disabled with their maintained Profiles and 45-second deadlines | +| C enable true and timeout 25 only | C uses timeout 25 and its default capacity-body Profile; C++ remains disabled | +| C enable false over an enabled contribution | False remains false; neither C++ values nor historical evidence are deleted | +| Unknown settings.timout | Refuse rather than silently retaining the default timeout | +| Timeout 0 or 46 | Refuse; no execution budget is widened | +| C selects lifetime-native | Refuse the language/Profile mismatch | + +A downstream Module can assign its complete configuration with ordinary native +composition. The following is Module authoring, not extra syntax users must copy +into the Example: + +#+BEGIN_SRC scheme :eval never +(import :clan/poo/object + (only-in :yuanxu/configuration/json config-defaults) + (prefix-in :deterministic-engineering/config defaults-) + (prefix-in "project-values.ss" project-)) + +(.def (Config @ (config-defaults defaults-Config project-Config))) +#+END_SRC + +The existing Profile Scope also exports a pure =configure= operation that combines +an override with that Scope's final Config and validates the result. Derived +language projections read the final receiver. They do not freeze a parent's +settings before downstream composition. + +* Existing Library responsibilities +| Owner | Responsibility | +|-------+----------------| +| Root config.ss | One maintained programs/languages defaults tree | +| source-contract-profiles Config Type | Sealed configuration structure | +| Existing Profile values | Actual source units, language strategy, harness, obligations and expected property labels | +| Language projection | Select the existing Profile, enforce its language identity and derive the configured method scope | +| source-contracts | Native generic verification plans and protected method policy | +| Development/consuming host | Capture actual sources/tools, execute declared steps, register actual results and query ASCENT | +| External application owner | Authorization and actual application effects | + +A downstream maintained POO contribution can extend the existing =profiles= +object and select its new Symbol in language Settings. The projection reads the +final receiver's Profile map; there is no parallel dispatch table. The native +consumer control adds a project-specific capacity Profile and checks that final +selection sees it. Adding a new language still requires a maintained language +contract and actual supported method/subject mapping. + +The generic =plan-library= remains a reusable method capability for Library +composition and tests. User-configured use goes through =languages.c= or +=languages.cpp= and its selected Profile/method scope. Disabling that projection +refuses its plan; it is not a global prohibition on every standalone use of the +underlying Library or a grant/revocation of application authority. + +Plans contain their effective command timeout. The host executes that declared +value, and the method evidence identity includes the complete plan. A changed +budget cannot silently reuse a result under an identical method fingerprint. +The native process heap/build/test ceilings and all mandatory safety flags remain +unchanged. The low-level method Config also delegates nested default composition +to the same Yuanxu primitive. + +* Concrete language engineering +| Language | Actual assets | Selected methods and evidence | +|----------+---------------+-------------------------------| +| C | languages-engineering/c/numeric/bounded-capacity | Capacity arithmetic, parser/pool callers, failure-state framing; CBMC body/enforced-contract/caller checks or native executable | +| C++ | languages-engineering/cpp/memory/resource-lifetime | Unique ownership, transfer/refusal, idempotent cleanup and destructor assertions; CBMC or native executable | + +Profiles reuse the maintained source declarations. The interface does not invent +new Rust/Go engines, duplicate Modules or add a platform Runtime. Additional +languages require their maintained Types, Profiles, source mappings and actual +verification evidence before being advertised by the interface. + +* Qualification and limits +:PROPERTIES: +:CUSTOM_ID: unified-config-qualification +:STATUS: local-native-qualified-remote-ci-open +:END: + +The configuration suite checks the actual Example, inherited sibling defaults, +explicit false, nested override values and unknown-field rejection. The real +native-owner case uses the same Module/Profile/Scenario framework and actual +maintained sources. It runs C and C++, registers their privately issued native +observations in ASCENT, checks support, switches only C off and checks historical +retention plus the still-enabled C++ plan. No fixture result is registered. + +Qualification requires natural process exit in addition to case/Module/Harness +markers. The root build and compiled public Config import have separate native +package gates. All command/heap/process fences remain in force. + +The native source owner still guards its captured source files. A changed shared +configuration file can make an old owner non-current even if C++ values happen to +be unchanged. Preserving the C++ settings and frozen evidence does not establish +automatic transfer of an old receipt into a new owner or field-level publication +currentness. Likewise, disabled settings do not establish namespace absence, +zero compiler demand, arbitrary helper hot reload or whole-environment attestation. +Cold dependency installation, the candidate upstream cohort and complete remote +CI remain separate unqualified gates until actually verified. + +* Related views +- [[file:../../../examples/README.org][User-facing values and engineering cases]] +- [[file:10.147-source-bound-c-and-cpp-contract-verification.org][Source-bound C/C++ contracts and independent controls]] +- [[file:10.148-flat-declarative-library-boundary.org][Library ownership and qualification history]] +- [[file:../../90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2][Synchronized D2 architecture source]] + +** Observed local acceptance +| Entry | Result | +|-------+--------| +| Native root build | Natural exit 0 under the unchanged 180-second fence | +| Unified configuration suite | Six cases, including all prior selection controls; natural exit with final OK | +| Existing actual source-contract suite | All eight cases retained and pass with natural exit | +| Native owner / language program case | Real C and C++ execution, ASCENT support, downstream POO Profile contribution, cross-language refusal and C-only disable pass | +| Budget-change reuse | Same C source, changed method digest for 30 to 25 seconds; old witness remains but cannot support the new usage | +| Compiled package ABI | Real root Config artifact/import and named program Config Type pass | + +These results apply to the observed local worktree and qualified dependency +cohort. They do not promote the newer candidate Parent or establish clean-prefix +installation and full remote CI. A historical source/result packet from an older +configuration remains tied to its original capture. + +** Source-bound view migration +:PROPERTIES: +:CUSTOM_ID: current-declaration-views +:END: + +Views 90.02, 90.132, 90.133 and 90.138 reference the maintained flat Library +Modules. The formation view describes =design-only= declarations and input +requirements; it does not describe the removed capture executor. A Scenario +declares bindings, while the consuming host acquires inputs and executes tools. +The original evidence-loop subjects and feedback associations remain intact. + +The existing TypeScript renderer checks maintained source excerpts before +export. Published image receipts bind the D2 declarations, composition sources +and referenced Scheme files. Regeneration updates the images and their source +digests together; stale receipts must fail the example regression. Native +ASCENT evidence and application authorization are not issued by these views. +PNG export uses the existing lossless compression path. The separate raster +comparison checks decoded PNG/WebP pixels against each source image; compressed +output is not substituted beneath an unchanged image digest. diff --git a/docs/90-99-views/90-architecture-views/90.01-index.org b/docs/90-99-views/90-architecture-views/90.01-index.org index b9678b6..3da7f3b 100644 --- a/docs/90-99-views/90-architecture-views/90.01-index.org +++ b/docs/90-99-views/90-architecture-views/90.01-index.org @@ -556,3 +556,10 @@ uses Rough.js and XYFlow's path utility; it includes no interactive whiteboard. - [[file:90.135-library-project-architecture-comfortable.png][Comfortable-density architecture]] · [[file:90.130-llm-assisted-model-view-workflow-sketchbook.png][Hand-drawn authoring Workflow]]. - [[file:90.138-library-design-taste-choices.d2][90.138 Design / Taste declarations]] · [[file:90.138-library-design-taste-choices-comparison.png][Three choices with reasons and observations]]. Architecture remains separate from Workflow. + +* Current Library refactor views + +| Org authority | D2 source | TS rendered vector | +|---+---+---| +| [[file:../../10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org][10.147]] | [[file:90.139-source-bound-c-and-cpp-contract-verification.d2][D2]] | [[file:90.139-source-bound-c-and-cpp-contract-verification.svg][SVG]] | +| [[file:../../10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org][10.148]] | [[file:90.140-flat-declarative-library-boundary.d2][D2]] | [[file:90.140-flat-declarative-library-boundary.svg][SVG]] | diff --git a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2 b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2 index 00f2d07..72e0b8a 100644 --- a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2 +++ b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2 @@ -64,7 +64,7 @@ vars: {d2-config: {data: {figure: |json "references": { "source": "docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2", "reasoning": "docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org", - "formation": "scenarios/project-formation/func.ss" + "formation": "library/project-formation/objects.ss" }, "basis": { "captureRef": "design-candidate:engineering-evidence-loop", @@ -77,7 +77,7 @@ vars: {d2-config: {data: {figure: |json "evidenceRefs": [] }, "copy": { - "status": "Current DE-CASE-01: capture-blocked / capture = #f. This view issues no C/Q/R or authorization.", + "status": "Formation authority is design-only. Consuming hosts own actual execution/evidence; this view grants no application authorization.", "description": "An LLM investigates. ASCENT exposes evidence. Aitia controls effects.", "agent-purpose": "Ask questions, compare alternatives,\nchoose or invent investigations.", "ascent-purpose": "Expose support, counterevidence\nand changed premises.", diff --git a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.json b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.json index a0da8b4..62d9a48 100644 --- a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.json +++ b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.json @@ -1,4 +1,30 @@ { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 544356, + "outputBytes": 212996 + }, + "sha256": "0cac666d8723918b8107c195e494ad39f70000c6534e923ad9b8c825c31433af" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 544356, + "outputBytes": 544356, + "selected": "original" + }, + "regions": {} + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -455,21 +481,21 @@ "samples": 67, "requiredMinimum": 12 }, - "inputSHA256": "d1d63d47330fe6658765850325f967669cd80bda3e2a9a8d526563cb262146bd", + "inputSHA256": "461d01c65368fc553ed57edef2ce4006b0aa77ec2e1a2aadf04b7e63701b2bce", "scenes": [ { "inputSHA256": "279521c6dd61afd6dab9477008ef3c2f64ccb7dd14f6e87b34e6d4d7984aa526", "layoutSHA256": "0785ab324b9cdb5d52dd7745c1be7d0317594980c166b2d58d0da85ee5bca2c9", "nodes": 4, "edges": 3, - "milliseconds": 525.7579580000001 + "milliseconds": 282.83008400000017 } ], "svgSHA256": [ - "482fdfa2fe7dc7252018c5efd37a6c28c07d8ecf83823b06462ba679c5c95f2b", + "90c5734d2172f9eccf2ecbf3232c1d986cdaf2ab4912232fb837d3592ab2467c", "89d8d9c811da5664d195d1c4d40cb1f8825550253c5995856fb6fa3cb1dc52e7" ], - "composedHTMLSHA256": "6d0cea37c0c18bb170792c12c697e9981e32317916c96c871de31edbe1fae44a", + "composedHTMLSHA256": "36aae592975755cd93fb15161feaa88be8cdc911bb178bb9a99b9a0780c77bcc", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -478,18 +504,19 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": {}, - "htmlSHA256": "d2e61decb3b0f2acab2b56c60902f639c98f37986cc7d16850ce0856e915fdf4", + "htmlSHA256": "cfdf91d4e049650dfebfb244fed297d7a15a549d8c5accb10966690902ba739e", "drawing": "roughjs@4.6.6", "routing": "elkjs@0.12.1", "assetSHA256": { - "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93", - "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb" + "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", + "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" }, - "pngSHA256": "8b19e982d93c9c003b9112888565c77e59a5fd13d75b603d8e349cf700a695db", + "pngSHA256": "07667832265063085a1e93fb743790a931e9b6ffaf99f8ea544b9daccb77d76e", "browser": "156.0.8078.4", "width": 1680, "height": 2321, @@ -497,11 +524,11 @@ "bounds": {}, "sources": { "docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org": "76a4d737abdcec417538ed356d48b802655c13b79ba6eca8a540858e171e8a88", - "docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2": "3890d7c217999dfa7e803bc9aa7d6d80f9f31c036a884b86bf852f6cd56c61c4", + "docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2": "8ebe493f46d342f883a8354c2b6b44f5a530fe06506e26c396e131853094d305", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/overview-composition.ts": "f50e0551b707a83864ba8fcd5dcd7f9ac3f8dc3f5c9e2e49797a95b8fe9615c7", "packages/render/examples/overviews.ts": "de6b1f9846c48fe91149b7038d424ab0d8e50235c9c1d6123e7ce1578ce1a07f", - "packages/render/examples/story-composition.ts": "f7285745e1a5789eb41bb66dcbc61d208b6454ff7d0b20ac5548f588d14c2741", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "packages/render/examples/story-composition.ts": "f7285745e1a5789eb41bb66dcbc61d208b6454ff7d0b20ac5548f588d14c2741" } } \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.png b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.png index d7713a0..59567f8 100644 Binary files a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.png and b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.png differ diff --git a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.svg b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.svg index 0411155..25f403c 100644 --- a/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.svg +++ b/docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.svg @@ -346,4 +346,4 @@ SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important} @font-face{font-family:"Kalam";font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format('woff2')} -@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.0","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Engineering Library users","medium":"README explanatory overview","message":"The LLM chooses investigations; ASCENT exposes evidence; Aitia owns admission and authorization.","questionRefs":["purpose","ownership","investigation","feedback","knowledge","effects"],"requiredSubjects":["agent","library","ascent","view","experiments","observations","aitia"],"requiredRelations":["(library -> ascent)[0]","(agent -> ascent)[0]","(ascent -> view)[0]","(view -> agent)[0]","(agent -> experiments)[0]","(experiments -> observations)[0]","(observations -> ascent)[0]","(ascent -> aitia)[0]","(aitia -> observations)[0]","(agent -> library)[0]"],"focalSubjects":["agent","ascent","aitia"]},"evidence":[],"presentation":{"sections":[{"questionRef":"purpose","ordinal":"1","leads":[{"subjectRef":"agent","glyph":"question","copyRef":"agent-purpose","titleRef":"agent-purpose-title","tone":"tint"},{"subjectRef":"ascent","glyph":"model","copyRef":"ascent-purpose","titleRef":"ascent-purpose-title","tone":"secondaryTint"},{"subjectRef":"aitia","glyph":"decision","copyRef":"aitia-purpose","titleRef":"aitia-purpose-title","tone":"surface"}]},{"questionRef":"ownership","ordinal":"2","scene":{"graph":{"id":"scene-agent-aitia","children":[{"id":"agent"},{"id":"library"},{"id":"ascent"},{"id":"aitia"}],"edges":[{"id":"(agent -> ascent)[0]","sources":["agent"],"targets":["ascent"]},{"id":"(library -> ascent)[0]","sources":["library"],"targets":["ascent"]},{"id":"(ascent -> aitia)[0]","sources":["ascent"],"targets":["aitia"]}],"layoutOptions":{"elk.direction":"RIGHT","elk.edgeRouting":"ORTHOGONAL","elk.spacing.nodeNode":"32","elk.layered.spacing.nodeNodeBetweenLayers":"42"}},"icons":{"agent":"question","library":"library","ascent":"model","aitia":"decision"},"roles":{"aitia":"pending"},"edgeLabels":false},"relationRefs":["(agent -> ascent)[0]","(library -> ascent)[0]","(ascent -> aitia)[0]"],"relationColumns":3},{"questionRef":"investigation","ordinal":"3","row":"learning","leads":[{"subjectRef":"experiments","glyph":"obligation"},{"subjectRef":"observations","glyph":"document"}],"relationRefs":["(agent -> experiments)[0]","(experiments -> observations)[0]","(observations -> ascent)[0]"]},{"questionRef":"feedback","ordinal":"4","row":"learning","leads":[{"subjectRef":"view","glyph":"evidence"}],"relationRefs":["(ascent -> view)[0]","(view -> agent)[0]"]},{"questionRef":"knowledge","ordinal":"5","relationRefs":["(agent -> library)[0]"],"row":"returns"},{"questionRef":"effects","ordinal":"6","row":"returns","relationRefs":["(aitia -> observations)[0]"]}],"shortLabels":{"agent":"LLM agent","library":"Design Library","ascent":"ASCENT","aitia":"Aitia / Host","experiments":"Investigation","observations":"Bound observations","view":"Evidence view"},"takeawayRef":"takeaway","minimumTextSize":12},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"d1d63d47330fe6658765850325f967669cd80bda3e2a9a8d526563cb262146bd","model":{"subjects":[{"id":"agent","type":"rectangle","level":1,"label":"LLM-based AI agent\nEngineering reasoning\nQuestions, alternatives,\nnew hypotheses"},{"id":"library","type":"rectangle","level":1,"label":"POO design Library\nDomains, contracts,\nextensible knowledge"},{"id":"ascent","type":"rectangle","level":1,"label":"ASCENT\nEvidence Chain + DAG\n+ Trajectory"},{"id":"view","type":"rectangle","level":1,"label":"Progressive evidence view\nSupport, counterevidence, unknowns\nCurrent references and deeper reads"},{"id":"experiments","type":"rectangle","level":1,"label":"LLM-based AI agent investigation\nSource inspection, QNT,\nLean, experiments"},{"id":"observations","type":"rectangle","level":1,"label":"Bound observations\nPremises, source,\nresult, scope"},{"id":"aitia","type":"rectangle","level":1,"label":"Aitia / Host boundary\nScoped admission,\nauthorization, effects"}],"relations":[{"id":"(library -> ascent)[0]","src":"library","dst":"ascent","label":"domain facts and associations","srcArrow":"none","dstArrow":"triangle"},{"id":"(agent -> ascent)[0]","src":"agent","dst":"ascent","label":"caller-selected questions and scope","srcArrow":"none","dstArrow":"triangle"},{"id":"(ascent -> view)[0]","src":"ascent","dst":"view","label":"current truthful evidence","srcArrow":"none","dstArrow":"triangle"},{"id":"(view -> agent)[0]","src":"view","dst":"agent","label":"inform; do not rank or choose","srcArrow":"none","dstArrow":"triangle"},{"id":"(agent -> experiments)[0]","src":"agent","dst":"experiments","label":"choose, revise, or invent","srcArrow":"none","dstArrow":"triangle"},{"id":"(experiments -> observations)[0]","src":"experiments","dst":"observations","label":"record results and failures","srcArrow":"none","dstArrow":"triangle"},{"id":"(observations -> ascent)[0]","src":"observations","dst":"ascent","label":"checked support and changed premises","srcArrow":"none","dstArrow":"triangle"},{"id":"(ascent -> aitia)[0]","src":"ascent","dst":"aitia","label":"references with explicit scope","srcArrow":"none","dstArrow":"triangle"},{"id":"(aitia -> observations)[0]","src":"aitia","dst":"observations","label":"actual execution / operational feedback","srcArrow":"none","dstArrow":"triangle"},{"id":"(agent -> library)[0]","src":"agent","dst":"library","label":"propose reviewed extensions","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2","title":"Questions lead. Evidence informs.","purpose":"workflow","kind":"engineering-lifecycle","question":{"ref":"purpose","text":"What makes this a learning loop?","focusRefs":["source","reasoning"]},"basis":{"captureRef":"design-candidate:engineering-evidence-loop","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org"],"evidenceRefs":[]}},"questions":[{"ref":"purpose","text":"What makes this a learning loop?","focusRefs":["source","reasoning"]},{"ref":"ownership","text":"Who chooses, reasons and authorizes?","focusRefs":["source","reasoning"]},{"ref":"investigation","text":"How do questions become observations?","focusRefs":["source","reasoning"]},{"ref":"feedback","text":"How does evidence inform the next question?","focusRefs":["source","reasoning"]},{"ref":"knowledge","text":"How does shared knowledge evolve?","focusRefs":["source","reasoning"]},{"ref":"effects","text":"Where do execution results return?","focusRefs":["source","reasoning"]}],"references":{"formation":"scenarios/project-formation/func.ss","reasoning":"docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org","source":"docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2"},"sourceSHA256":{"docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org":"76a4d737abdcec417538ed356d48b802655c13b79ba6eca8a540858e171e8a88","docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2":"3890d7c217999dfa7e803bc9aa7d6d80f9f31c036a884b86bf852f6cd56c61c4","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/overview-composition.ts":"f50e0551b707a83864ba8fcd5dcd7f9ac3f8dc3f5c9e2e49797a95b8fe9615c7","packages/render/examples/overviews.ts":"de6b1f9846c48fe91149b7038d424ab0d8e50235c9c1d6123e7ce1578ce1a07f","packages/render/examples/story-composition.ts":"f7285745e1a5789eb41bb66dcbc61d208b6454ff7d0b20ac5548f588d14c2741","scenarios/project-formation/func.ss":"b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1120,"height":1547},"subjects":[{"id":"agent","role":"default","x":20,"y":219,"width":344,"height":132},{"id":"ascent","role":"default","x":388,"y":219,"width":344,"height":132},{"id":"aitia","role":"default","x":756,"y":219,"width":344,"height":132},{"id":"agent","role":"default","x":166.82435607910156,"y":605.1906127929688,"width":252.34263610839844,"height":153.02899169921875},{"id":"library","role":"default","x":200.5,"y":458.5800476074219,"width":216.79290771484375,"height":121.61636352539062},{"id":"ascent","role":"default","x":455.9620361328125,"y":477.5,"width":199.97601318359375,"height":118.08355712890625},{"id":"aitia","role":"pending","x":697.104736328125,"y":476.923583984375,"width":256.3076171875,"height":118.64166259765625},{"id":"experiments","role":"default","x":20,"y":925,"width":252,"height":130},{"id":"observations","role":"default","x":296,"y":925,"width":252,"height":130},{"id":"view","role":"default","x":572,"y":925,"width":528,"height":129}],"relations":["(agent -> ascent)[0]","(library -> ascent)[0]","(ascent -> aitia)[0]","(agent -> experiments)[0]","(experiments -> observations)[0]","(observations -> ascent)[0]","(ascent -> view)[0]","(view -> agent)[0]","(agent -> library)[0]","(aitia -> observations)[0]"],"headings":[{"role":"title","x":20,"y":28,"width":1080,"height":70},{"role":"note","x":20,"y":106,"width":1080,"height":27},{"role":"question","x":20,"y":160,"width":1080,"height":47},{"role":"heading","x":32,"y":234,"width":320,"height":31},{"role":"answer","x":32,"y":268,"width":320,"height":31},{"role":"answer","x":32,"y":302,"width":320,"height":31},{"role":"heading","x":400,"y":234,"width":320,"height":32},{"role":"answer","x":400,"y":269,"width":320,"height":31},{"role":"answer","x":400,"y":303,"width":320,"height":31},{"role":"heading","x":768,"y":234,"width":320,"height":34},{"role":"answer","x":768,"y":271,"width":320,"height":31},{"role":"answer","x":768,"y":305,"width":320,"height":31},{"role":"question","x":20,"y":378,"width":1080,"height":47},{"role":"heading","x":20,"y":777,"width":352,"height":31},{"role":"answer","x":20,"y":808,"width":352,"height":31},{"role":"heading","x":384,"y":777,"width":352,"height":31},{"role":"answer","x":384,"y":808,"width":352,"height":31},{"role":"heading","x":748,"y":777,"width":352,"height":31},{"role":"answer","x":748,"y":808,"width":352,"height":31},{"role":"question","x":20,"y":866,"width":528,"height":47},{"role":"heading","x":32,"y":940,"width":228,"height":31},{"role":"answer","x":32,"y":974,"width":228,"height":31},{"role":"answer","x":32,"y":1008,"width":228,"height":31},{"role":"heading","x":308,"y":940,"width":228,"height":32},{"role":"answer","x":308,"y":975,"width":228,"height":31},{"role":"answer","x":308,"y":1009,"width":228,"height":31},{"role":"heading","x":20,"y":1055,"width":528,"height":31},{"role":"answer","x":20,"y":1086,"width":528,"height":31},{"role":"heading","x":20,"y":1129,"width":528,"height":31},{"role":"answer","x":20,"y":1160,"width":528,"height":31},{"role":"heading","x":20,"y":1203,"width":528,"height":31},{"role":"answer","x":20,"y":1234,"width":528,"height":31},{"role":"question","x":572,"y":866,"width":528,"height":47},{"role":"heading","x":584,"y":940,"width":504,"height":31},{"role":"answer","x":584,"y":974,"width":504,"height":31},{"role":"answer","x":584,"y":1008,"width":504,"height":31},{"role":"heading","x":572,"y":1054,"width":528,"height":31},{"role":"answer","x":572,"y":1085,"width":528,"height":31},{"role":"heading","x":572,"y":1128,"width":528,"height":31},{"role":"answer","x":572,"y":1159,"width":528,"height":31},{"role":"question","x":20,"y":1292,"width":528,"height":47},{"role":"heading","x":20,"y":1351,"width":528,"height":31},{"role":"answer","x":20,"y":1382,"width":528,"height":31},{"role":"question","x":572,"y":1292,"width":528,"height":47},{"role":"heading","x":572,"y":1351,"width":528,"height":31},{"role":"answer","x":572,"y":1382,"width":528,"height":31},{"role":"answer","x":32,"y":1437,"width":1056,"height":31},{"role":"note","x":20,"y":1492,"width":1080,"height":27}]},"readability":{"minimumTextSize":13,"samples":67,"requiredMinimum":12},"bounds":{}}}Questions lead. Evidence informs.An LLM investigates. ASCENT exposes evidence. Aitia controls effects.1What makes this a learning loop?Explore alternativesAsk questions, compare alternatives,choose or invent investigations.Inspect the evidenceExpose support, counterevidenceand changed premises.Keep effects authorizedKeep admission, authorizationand effects within explicit scope.2Who chooses, reasons and authorizes?{"graph":{"id":"scene-agent-aitia","children":[{"id":"agent"},{"id":"library"},{"id":"ascent"},{"id":"aitia"}],"edges":[{"id":"(agent -> ascent)[0]","sources":["agent"],"targets":["ascent"]},{"id":"(library -> ascent)[0]","sources":["library"],"targets":["ascent"]},{"id":"(ascent -> aitia)[0]","sources":["ascent"],"targets":["aitia"]}],"layoutOptions":{"elk.spacing.nodeNode":"32","elk.layered.spacing.nodeNodeBetweenLayers":"42","elk.direction":"RIGHT","elk.edgeRouting":"ORTHOGONAL"}},"marker":"arrow-f305be3649db"}LLM-based AI agentEngineering reasoningQuestions, alternatives,new hypothesesPOO design LibraryDomains, contracts,extensible knowledgeASCENTEvidence Chain + DAG+ TrajectoryAitia / Host boundaryScoped admission,authorization, effectsLLM agent → ASCENTcaller-selected questions and scopeDesign Library → ASCENTdomain facts and associationsASCENT → Aitia / Hostreferences with explicit scope3How do questions become observations?InvestigationSource inspection, QNT,Lean, experimentsBound observationsPremises, source,result, scopeLLM agent → Investigationchoose, revise, or inventInvestigation → Bound observationsrecord results and failuresBound observations → ASCENTchecked support and changed premises4How does evidence inform the next question?Evidence viewSupport, counterevidence, unknownsCurrent references and deeper readsASCENT → Evidence viewcurrent truthful evidenceEvidence view → LLM agentinform; do not rank or choose5How does shared knowledge evolve?LLM agent → Design Librarypropose reviewed extensions6Where do execution results return?Aitia / Host → Bound observationsactual execution / operational feedbackLLM judgment stays open. Evidence stays inspectable. Effects stay authorized.Current DE-CASE-01: capture-blocked / capture = #f. This view issues no C/Q/R or authorization. \ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.2","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Engineering Library users","medium":"README explanatory overview","message":"The LLM chooses investigations; ASCENT exposes evidence; Aitia owns admission and authorization.","questionRefs":["purpose","ownership","investigation","feedback","knowledge","effects"],"requiredSubjects":["agent","library","ascent","view","experiments","observations","aitia"],"requiredRelations":["(library -> ascent)[0]","(agent -> ascent)[0]","(ascent -> view)[0]","(view -> agent)[0]","(agent -> experiments)[0]","(experiments -> observations)[0]","(observations -> ascent)[0]","(ascent -> aitia)[0]","(aitia -> observations)[0]","(agent -> library)[0]"],"focalSubjects":["agent","ascent","aitia"]},"evidence":[],"presentation":{"sections":[{"questionRef":"purpose","ordinal":"1","leads":[{"subjectRef":"agent","glyph":"question","copyRef":"agent-purpose","titleRef":"agent-purpose-title","tone":"tint"},{"subjectRef":"ascent","glyph":"model","copyRef":"ascent-purpose","titleRef":"ascent-purpose-title","tone":"secondaryTint"},{"subjectRef":"aitia","glyph":"decision","copyRef":"aitia-purpose","titleRef":"aitia-purpose-title","tone":"surface"}]},{"questionRef":"ownership","ordinal":"2","scene":{"graph":{"id":"scene-agent-aitia","children":[{"id":"agent"},{"id":"library"},{"id":"ascent"},{"id":"aitia"}],"edges":[{"id":"(agent -> ascent)[0]","sources":["agent"],"targets":["ascent"]},{"id":"(library -> ascent)[0]","sources":["library"],"targets":["ascent"]},{"id":"(ascent -> aitia)[0]","sources":["ascent"],"targets":["aitia"]}],"layoutOptions":{"elk.direction":"RIGHT","elk.edgeRouting":"ORTHOGONAL","elk.spacing.nodeNode":"32","elk.layered.spacing.nodeNodeBetweenLayers":"42"}},"icons":{"agent":"question","library":"library","ascent":"model","aitia":"decision"},"roles":{"aitia":"pending"},"edgeLabels":false},"relationRefs":["(agent -> ascent)[0]","(library -> ascent)[0]","(ascent -> aitia)[0]"],"relationColumns":3},{"questionRef":"investigation","ordinal":"3","row":"learning","leads":[{"subjectRef":"experiments","glyph":"obligation"},{"subjectRef":"observations","glyph":"document"}],"relationRefs":["(agent -> experiments)[0]","(experiments -> observations)[0]","(observations -> ascent)[0]"]},{"questionRef":"feedback","ordinal":"4","row":"learning","leads":[{"subjectRef":"view","glyph":"evidence"}],"relationRefs":["(ascent -> view)[0]","(view -> agent)[0]"]},{"questionRef":"knowledge","ordinal":"5","relationRefs":["(agent -> library)[0]"],"row":"returns"},{"questionRef":"effects","ordinal":"6","row":"returns","relationRefs":["(aitia -> observations)[0]"]}],"shortLabels":{"agent":"LLM agent","library":"Design Library","ascent":"ASCENT","aitia":"Aitia / Host","experiments":"Investigation","observations":"Bound observations","view":"Evidence view"},"takeawayRef":"takeaway","minimumTextSize":12},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"461d01c65368fc553ed57edef2ce4006b0aa77ec2e1a2aadf04b7e63701b2bce","model":{"subjects":[{"id":"agent","type":"rectangle","level":1,"label":"LLM-based AI agent\nEngineering reasoning\nQuestions, alternatives,\nnew hypotheses"},{"id":"library","type":"rectangle","level":1,"label":"POO design Library\nDomains, contracts,\nextensible knowledge"},{"id":"ascent","type":"rectangle","level":1,"label":"ASCENT\nEvidence Chain + DAG\n+ Trajectory"},{"id":"view","type":"rectangle","level":1,"label":"Progressive evidence view\nSupport, counterevidence, unknowns\nCurrent references and deeper reads"},{"id":"experiments","type":"rectangle","level":1,"label":"LLM-based AI agent investigation\nSource inspection, QNT,\nLean, experiments"},{"id":"observations","type":"rectangle","level":1,"label":"Bound observations\nPremises, source,\nresult, scope"},{"id":"aitia","type":"rectangle","level":1,"label":"Aitia / Host boundary\nScoped admission,\nauthorization, effects"}],"relations":[{"id":"(library -> ascent)[0]","src":"library","dst":"ascent","label":"domain facts and associations","srcArrow":"none","dstArrow":"triangle"},{"id":"(agent -> ascent)[0]","src":"agent","dst":"ascent","label":"caller-selected questions and scope","srcArrow":"none","dstArrow":"triangle"},{"id":"(ascent -> view)[0]","src":"ascent","dst":"view","label":"current truthful evidence","srcArrow":"none","dstArrow":"triangle"},{"id":"(view -> agent)[0]","src":"view","dst":"agent","label":"inform; do not rank or choose","srcArrow":"none","dstArrow":"triangle"},{"id":"(agent -> experiments)[0]","src":"agent","dst":"experiments","label":"choose, revise, or invent","srcArrow":"none","dstArrow":"triangle"},{"id":"(experiments -> observations)[0]","src":"experiments","dst":"observations","label":"record results and failures","srcArrow":"none","dstArrow":"triangle"},{"id":"(observations -> ascent)[0]","src":"observations","dst":"ascent","label":"checked support and changed premises","srcArrow":"none","dstArrow":"triangle"},{"id":"(ascent -> aitia)[0]","src":"ascent","dst":"aitia","label":"references with explicit scope","srcArrow":"none","dstArrow":"triangle"},{"id":"(aitia -> observations)[0]","src":"aitia","dst":"observations","label":"actual execution / operational feedback","srcArrow":"none","dstArrow":"triangle"},{"id":"(agent -> library)[0]","src":"agent","dst":"library","label":"propose reviewed extensions","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2","title":"Questions lead. Evidence informs.","purpose":"workflow","kind":"engineering-lifecycle","question":{"ref":"purpose","text":"What makes this a learning loop?","focusRefs":["source","reasoning"]},"basis":{"captureRef":"design-candidate:engineering-evidence-loop","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org"],"evidenceRefs":[]}},"questions":[{"ref":"purpose","text":"What makes this a learning loop?","focusRefs":["source","reasoning"]},{"ref":"ownership","text":"Who chooses, reasons and authorizes?","focusRefs":["source","reasoning"]},{"ref":"investigation","text":"How do questions become observations?","focusRefs":["source","reasoning"]},{"ref":"feedback","text":"How does evidence inform the next question?","focusRefs":["source","reasoning"]},{"ref":"knowledge","text":"How does shared knowledge evolve?","focusRefs":["source","reasoning"]},{"ref":"effects","text":"Where do execution results return?","focusRefs":["source","reasoning"]}],"references":{"formation":"library/project-formation/objects.ss","reasoning":"docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org","source":"docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2"},"sourceSHA256":{"docs/10-19-design/10-architecture/10.05-agent-reasoning-and-design-convergence.org":"76a4d737abdcec417538ed356d48b802655c13b79ba6eca8a540858e171e8a88","docs/90-99-views/90-architecture-views/90.02-agent-evidence-loop.d2":"8ebe493f46d342f883a8354c2b6b44f5a530fe06506e26c396e131853094d305","library/project-formation/objects.ss":"a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/overview-composition.ts":"f50e0551b707a83864ba8fcd5dcd7f9ac3f8dc3f5c9e2e49797a95b8fe9615c7","packages/render/examples/overviews.ts":"de6b1f9846c48fe91149b7038d424ab0d8e50235c9c1d6123e7ce1578ce1a07f","packages/render/examples/story-composition.ts":"f7285745e1a5789eb41bb66dcbc61d208b6454ff7d0b20ac5548f588d14c2741"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1120,"height":1547},"subjects":[{"id":"agent","role":"default","x":20,"y":219,"width":344,"height":132},{"id":"ascent","role":"default","x":388,"y":219,"width":344,"height":132},{"id":"aitia","role":"default","x":756,"y":219,"width":344,"height":132},{"id":"agent","role":"default","x":166.82435607910156,"y":605.1906127929688,"width":252.34263610839844,"height":153.02899169921875},{"id":"library","role":"default","x":200.5,"y":458.5800476074219,"width":216.79290771484375,"height":121.61636352539062},{"id":"ascent","role":"default","x":455.9620361328125,"y":477.5,"width":199.97601318359375,"height":118.08355712890625},{"id":"aitia","role":"pending","x":697.104736328125,"y":476.923583984375,"width":256.3076171875,"height":118.64166259765625},{"id":"experiments","role":"default","x":20,"y":925,"width":252,"height":130},{"id":"observations","role":"default","x":296,"y":925,"width":252,"height":130},{"id":"view","role":"default","x":572,"y":925,"width":528,"height":129}],"relations":["(agent -> ascent)[0]","(library -> ascent)[0]","(ascent -> aitia)[0]","(agent -> experiments)[0]","(experiments -> observations)[0]","(observations -> ascent)[0]","(ascent -> view)[0]","(view -> agent)[0]","(agent -> library)[0]","(aitia -> observations)[0]"],"headings":[{"role":"title","x":20,"y":28,"width":1080,"height":70},{"role":"note","x":20,"y":106,"width":1080,"height":27},{"role":"question","x":20,"y":160,"width":1080,"height":47},{"role":"heading","x":32,"y":234,"width":320,"height":31},{"role":"answer","x":32,"y":268,"width":320,"height":31},{"role":"answer","x":32,"y":302,"width":320,"height":31},{"role":"heading","x":400,"y":234,"width":320,"height":32},{"role":"answer","x":400,"y":269,"width":320,"height":31},{"role":"answer","x":400,"y":303,"width":320,"height":31},{"role":"heading","x":768,"y":234,"width":320,"height":34},{"role":"answer","x":768,"y":271,"width":320,"height":31},{"role":"answer","x":768,"y":305,"width":320,"height":31},{"role":"question","x":20,"y":378,"width":1080,"height":47},{"role":"heading","x":20,"y":777,"width":352,"height":31},{"role":"answer","x":20,"y":808,"width":352,"height":31},{"role":"heading","x":384,"y":777,"width":352,"height":31},{"role":"answer","x":384,"y":808,"width":352,"height":31},{"role":"heading","x":748,"y":777,"width":352,"height":31},{"role":"answer","x":748,"y":808,"width":352,"height":31},{"role":"question","x":20,"y":866,"width":528,"height":47},{"role":"heading","x":32,"y":940,"width":228,"height":31},{"role":"answer","x":32,"y":974,"width":228,"height":31},{"role":"answer","x":32,"y":1008,"width":228,"height":31},{"role":"heading","x":308,"y":940,"width":228,"height":32},{"role":"answer","x":308,"y":975,"width":228,"height":31},{"role":"answer","x":308,"y":1009,"width":228,"height":31},{"role":"heading","x":20,"y":1055,"width":528,"height":31},{"role":"answer","x":20,"y":1086,"width":528,"height":31},{"role":"heading","x":20,"y":1129,"width":528,"height":31},{"role":"answer","x":20,"y":1160,"width":528,"height":31},{"role":"heading","x":20,"y":1203,"width":528,"height":31},{"role":"answer","x":20,"y":1234,"width":528,"height":31},{"role":"question","x":572,"y":866,"width":528,"height":47},{"role":"heading","x":584,"y":940,"width":504,"height":31},{"role":"answer","x":584,"y":974,"width":504,"height":31},{"role":"answer","x":584,"y":1008,"width":504,"height":31},{"role":"heading","x":572,"y":1054,"width":528,"height":31},{"role":"answer","x":572,"y":1085,"width":528,"height":31},{"role":"heading","x":572,"y":1128,"width":528,"height":31},{"role":"answer","x":572,"y":1159,"width":528,"height":31},{"role":"question","x":20,"y":1292,"width":528,"height":47},{"role":"heading","x":20,"y":1351,"width":528,"height":31},{"role":"answer","x":20,"y":1382,"width":528,"height":31},{"role":"question","x":572,"y":1292,"width":528,"height":47},{"role":"heading","x":572,"y":1351,"width":528,"height":31},{"role":"answer","x":572,"y":1382,"width":528,"height":31},{"role":"answer","x":32,"y":1437,"width":1056,"height":31},{"role":"note","x":20,"y":1492,"width":1080,"height":27}]},"readability":{"minimumTextSize":13,"samples":67,"requiredMinimum":12},"bounds":{}}}Questions lead. Evidence informs.An LLM investigates. ASCENT exposes evidence. Aitia controls effects.1What makes this a learning loop?Explore alternativesAsk questions, compare alternatives,choose or invent investigations.Inspect the evidenceExpose support, counterevidenceand changed premises.Keep effects authorizedKeep admission, authorizationand effects within explicit scope.2Who chooses, reasons and authorizes?{"graph":{"id":"scene-agent-aitia","children":[{"id":"agent"},{"id":"library"},{"id":"ascent"},{"id":"aitia"}],"edges":[{"id":"(agent -> ascent)[0]","sources":["agent"],"targets":["ascent"]},{"id":"(library -> ascent)[0]","sources":["library"],"targets":["ascent"]},{"id":"(ascent -> aitia)[0]","sources":["ascent"],"targets":["aitia"]}],"layoutOptions":{"elk.spacing.nodeNode":"32","elk.layered.spacing.nodeNodeBetweenLayers":"42","elk.direction":"RIGHT","elk.edgeRouting":"ORTHOGONAL"}},"marker":"arrow-f305be3649db"}LLM-based AI agentEngineering reasoningQuestions, alternatives,new hypothesesPOO design LibraryDomains, contracts,extensible knowledgeASCENTEvidence Chain + DAG+ TrajectoryAitia / Host boundaryScoped admission,authorization, effectsLLM agent → ASCENTcaller-selected questions and scopeDesign Library → ASCENTdomain facts and associationsASCENT → Aitia / Hostreferences with explicit scope3How do questions become observations?InvestigationSource inspection, QNT,Lean, experimentsBound observationsPremises, source,result, scopeLLM agent → Investigationchoose, revise, or inventInvestigation → Bound observationsrecord results and failuresBound observations → ASCENTchecked support and changed premises4How does evidence inform the next question?Evidence viewSupport, counterevidence, unknownsCurrent references and deeper readsASCENT → Evidence viewcurrent truthful evidenceEvidence view → LLM agentinform; do not rank or choose5How does shared knowledge evolve?LLM agent → Design Librarypropose reviewed extensions6Where do execution results return?Aitia / Host → Bound observationsactual execution / operational feedbackLLM judgment stays open. Evidence stays inspectable. Effects stay authorized.Formation authority is design-only. Consuming hosts own actual execution/evidence; this view grants no application authorization. \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.html b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.html index 47cdae0..992c6ef 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.html +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.html @@ -3,4 +3,4 @@ SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors SPDX-License-Identifier: LGPL-2.1-or-later --> -

Library / Profile / Scenario architecture

sketchbook

architecture-sketchbook

node-editor

architecture-node-editor

dependency-matrix

architecture-dependency-matrix

project-owned

architecture-project-owned
\ No newline at end of file +

Library / Profile / Scenario architecture

sketchbook

architecture-sketchbook

node-editor

architecture-node-editor

dependency-matrix

architecture-dependency-matrix

project-owned

architecture-project-owned
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.png index 232234a..0289d79 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-comparison.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix-detail.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix-detail.png index 13f1e63..8c510bc 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix-detail.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.html b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.html index 921343d..8444628 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.html +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.html @@ -28,12 +28,12 @@

1What does this Library make possible?

Publish once

Models, methods and policies
Reusable definitions from Library

Choose per project

Profile selects the needed capabilities
Original identities stay intact

-

Bind actual use

Scenario acquires project inputs
One use, with source associations

+

Bind actual use

Scenario declares project bindings
One use, with explicit input requirements

2Who publishes, selects and binds?Ownership / arrows point to dependencies

LibraryProfileScenario
Library———
Profileselects——
Scenarioreferences definitionsbinds—
Model: project.sysml / a scoped responsibility viewASCENT reasoning and Aitia review retain separate owners

3Which responsibilities stay independent?

One definition owner

Selection and use reference definitions
Contract bodies are not copied

Selection keeps its scope

Retain parents and both policies
Bind actual published methods

Reuse existing admission

POO / Core own admission
Keep normalized return values

Keep review independent

Candidates, evidence and authority
Retain each source association

-

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
Design view: issued C, accepted Q and independent review still need actual binding.
-

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and source bindings are retained
Exact IDs, parents and port references; original input fingerprints

What is still blocked?

capture-blocked · capture = #f
Preparation still reports origin and method-footprint gaps
No review or delivery was executed here
Source observation and image export are not execution receipts
-
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file +

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
This responsibility view declares C/Q/review boundaries; it issues no execution evidence.
+

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and declared bindings remain distinct
Model IDs and ports are checked; declarations do not attest actual input bytes

Where does execution belong?

design-only · declaration-layout
Library declares requirements; consuming hosts acquire and verify actual inputs
No capture, review or delivery executes in this formation view
Source observation and image export are not execution receipts
+
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.json b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.json index 0ad3266..1806818 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.json +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 761959, + "outputBytes": 464916 + }, + "sha256": "8e6e19ad6e66797f35b95bb4439b2731e39d15e2c83c8a933a1a0bc93d54621f" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 761959, + "outputBytes": 733234, + "selected": "compressed" + }, + "regions": { + "architecture": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 75451, + "outputBytes": 75451, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1427.75 + "height": 1450.25 }, "subjects": [], "relations": [], @@ -26,10 +63,10 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "e4327cbfe066fe24037b28b380be38d262780293913fe9018e26528594a44fc7", + "inputSHA256": "0ad50183615c22a33c708e1a866fa28ee15a3955bbc07a970978705c70cbe7a2", "scenes": [], "svgSHA256": [], - "composedHTMLSHA256": "19a422ba1457103df81c03e447eed95d707fb8e07087e05fc7423b8416326d14", + "composedHTMLSHA256": "e9c7f26c64a1bd61266db25f7a1b138b55df2c59445102350280f2387d0b0aa7", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -38,23 +75,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "architecture": "0cc1215288de043bfdc2c7234a00da255b3c43c6dd55e4e6a595415b69d5908a" + "architecture": "b390e82a795dba9221b251f62b849b0791b5664a8bea9c7350bbb07ba104be8a" }, - "htmlSHA256": "a7fadf62e1ba0a3c5b80cc2083f391a9f1a56c48a56e3806ddb244efc823ad87", + "htmlSHA256": "41d06018979bdba9931ebd1c114bc8dd2013b47d1a4603d644daa3ba31e185ad", "drawing": "precise", "routing": "none", "assetSHA256": { - "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", - "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" + "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", + "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" }, - "pngSHA256": "2f44c7be70bfb75aa09d3934affca15b52454bad2947f5d8fb64b845d4ed19b4", + "pngSHA256": "95befbe9e46600005676e4e7426f3cbdad5fb93172979417496e554a870e996c", "browser": "156.0.8078.4", "width": 2240, - "height": 2856, + "height": 2902, "scale": 2, "bounds": { "header": { @@ -91,11 +129,11 @@ "x": 20, "y": 1121.75, "width": 1080, - "height": 194 + "height": 216.5 }, "takeaway": { "x": 20, - "y": 1315.75, + "y": 1338.25, "width": 1080, "height": 68 } @@ -103,28 +141,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -147,39 +186,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -208,7 +247,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.png index 450fc19..1d6970d 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-dependency-matrix.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-detail.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-detail.png index 6fe5bf0..6b1641f 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-detail.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor-detail.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor-detail.png index ea634a3..8113b0e 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor-detail.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.html b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.html index 45147ac..8205422 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.html +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.html @@ -28,21 +28,21 @@

1What does this Library make possible?

Publish once

Models, methods and policies
Reusable definitions from Library

Choose per project

Profile selects the needed capabilities
Original identities stay intact

-

Bind actual use

Scenario acquires project inputs
One use, with source associations

+

Bind actual use

Scenario declares project bindings
One use, with explicit input requirements

2Who publishes, selects and binds?Ownership / arrows point to dependencies

- -
REUSABLE PUBLICATION BOUNDARY

Library

Definitions and contracts
Models / catalog / mapping
Coding and design-review policies
Method bindings and input demands
+ +
REUSABLE PUBLICATION BOUNDARY

Library

Definitions and contracts
Models / catalog / mapping
Coding and design-review policies
Method bindings and input demands
selects
PROJECT BOUNDARY / DE-CASE-01

Profile

Select parents, policies and methods
Reference catalog / mapping

binds
-

Scenario

Acquire actual inputs and origins
Retain choices, checks and gaps

+

Scenario

Declare inputs and source associations
External consumers acquire actual inputs

Architecture modelOrg documentsDecisions
Model: project.sysml / a scoped responsibility viewASCENT reasoning and Aitia review retain separate owners

3Which responsibilities stay independent?

One definition owner

Selection and use reference definitions
Contract bodies are not copied

Selection keeps its scope

Retain parents and both policies
Bind actual published methods

Reuse existing admission

POO / Core own admission
Keep normalized return values

Keep review independent

Candidates, evidence and authority
Retain each source association

-

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
Design view: issued C, accepted Q and independent review still need actual binding.
-

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and source bindings are retained
Exact IDs, parents and port references; original input fingerprints

What is still blocked?

capture-blocked · capture = #f
Preparation still reports origin and method-footprint gaps
No review or delivery was executed here
Source observation and image export are not execution receipts
-
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file +

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
This responsibility view declares C/Q/review boundaries; it issues no execution evidence.
+

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and declared bindings remain distinct
Model IDs and ports are checked; declarations do not attest actual input bytes

Where does execution belong?

design-only · declaration-layout
Library declares requirements; consuming hosts acquire and verify actual inputs
No capture, review or delivery executes in this formation view
Source observation and image export are not execution receipts
+
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.json b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.json index ff10a47..7cf97b4 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.json +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 849376, + "outputBytes": 504208 + }, + "sha256": "10cc9719b5eb1083e446ab23bf29d1c8a5ac36bfda6c8840068d60bf0fd32026" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 849376, + "outputBytes": 821134, + "selected": "compressed" + }, + "regions": { + "architecture": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 169005, + "outputBytes": 169005, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1499.75 + "height": 1527.640625 }, "subjects": [ { @@ -21,7 +58,7 @@ "x": 56, "y": 465.578125, "width": 310, - "height": 230 + "height": 235.390625 }, { "id": "project.profile", @@ -37,7 +74,7 @@ "x": 754, "y": 507.578125, "width": 295, - "height": 111.59375 + "height": 135.390625 } ], "relations": [ @@ -54,12 +91,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "563b0e2b59cc4bcd43f3a3235493e3903c017880f17ff53041dcb4e6395681d6", + "inputSHA256": "b217552cd5a6c513ec77c65498d41b8db27a74f057d49b278955c9d9f3304f3f", "scenes": [], "svgSHA256": [ - "64411b114f77fe9d65ad89f083383db5b629ed8dcbf2f97947472b70f156bb3a" + "9cbce67638af8b2be25d83be14fa7ba1b43a19ce29f5b36e1cf9cc93e7046c4d" ], - "composedHTMLSHA256": "e2e35b0c8a1303e7b16358e27befe3d0f10ad0e05f28ffd0684a5e083b995a05", + "composedHTMLSHA256": "099c9d9aa285d35fa407d10d4ad168dffb5af4c3a4865816485995a29f97154c", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -68,23 +105,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "architecture": "d0329b20e817f8a17c373e0ee1886737b7db3e8c78edae6a0440425823484bf0" + "architecture": "77abbc2c709a27764ea3def82255fc09db418f5d20456372623d831c19ba821a" }, - "htmlSHA256": "33b56a30b9598ab6e310fb8816a028baeed68442bd567907f85d2b2480f8889d", + "htmlSHA256": "dd8686ef861ee5f2367186651f8f9ed5d58af2449523e464c9438fa041aa2210", "drawing": "precise", "routing": "xyflow@0.0.83", "assetSHA256": { - "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", - "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" + "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", + "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" }, - "pngSHA256": "119897156cd8c8b2a6e67bc24cef2cc4f37bc69b31c8ea4582c2b70b51e81a64", + "pngSHA256": "d0cd7fdb67b4f031b644fcc3bd7fc6e5826f0a07d84425bbfe516fd9f2cef991", "browser": "156.0.8078.4", "width": 2240, - "height": 3000, + "height": 3056, "scale": 2, "bounds": { "header": { @@ -103,29 +141,29 @@ "x": 20, "y": 377.578125, "width": 1080, - "height": 389 + "height": 394.390625 }, "principles": { "x": 20, - "y": 778.578125, + "y": 783.96875, "width": 1080, "height": 215.171875 }, "products": { "x": 20, - "y": 1005.75, + "y": 1011.140625, "width": 1080, "height": 172 }, "evidence": { "x": 20, - "y": 1189.75, + "y": 1195.140625, "width": 1080, - "height": 198 + "height": 220.5 }, "takeaway": { "x": 20, - "y": 1387.75, + "y": 1415.640625, "width": 1080, "height": 68 } @@ -133,28 +171,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -177,39 +216,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -238,7 +277,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.png index 502ed08..796259f 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-node-editor.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned-detail.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned-detail.png index 2696639..f60d197 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned-detail.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.html b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.html index 6bb2dcb..3901004 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.html +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.html @@ -28,12 +28,12 @@

1What does this Library make possible?

Publish once

Models, methods and policies
Reusable definitions from Library

Choose per project

Profile selects the needed capabilities
Original identities stay intact

-

Bind actual use

Scenario acquires project inputs
One use, with source associations

+

Bind actual use

Scenario declares project bindings
One use, with explicit input requirements

2Who publishes, selects and binds?Ownership / arrows point to dependencies

LibraryProfileScenario
Library———
Profileselects——
Scenarioreferences definitionsbinds—
Model: project.sysml / a scoped responsibility viewASCENT reasoning and Aitia review retain separate owners

3Which responsibilities stay independent?

One definition owner

Selection and use reference definitions
Contract bodies are not copied

Selection keeps its scope

Retain parents and both policies
Bind actual published methods

Reuse existing admission

POO / Core own admission
Keep normalized return values

Keep review independent

Candidates, evidence and authority
Retain each source association

-

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
Design view: issued C, accepted Q and independent review still need actual binding.
-

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and source bindings are retained
Exact IDs, parents and port references; original input fingerprints

What is still blocked?

capture-blocked · capture = #f
Preparation still reports origin and method-footprint gaps
No review or delivery was executed here
Source observation and image export are not execution receipts
-
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file +

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
This responsibility view declares C/Q/review boundaries; it issues no execution evidence.
+

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and declared bindings remain distinct
Model IDs and ports are checked; declarations do not attest actual input bytes

Where does execution belong?

design-only · declaration-layout
Library declares requirements; consuming hosts acquire and verify actual inputs
No capture, review or delivery executes in this formation view
Source observation and image export are not execution receipts
+
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.json b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.json index 7264d88..e3aa0af 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.json +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 829815, + "outputBytes": 526266 + }, + "sha256": "34539291aef025f84ccedbc02dd1c2ea30365f4963498b3fefe3d359d3b8663a" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 829815, + "outputBytes": 787564, + "selected": "compressed" + }, + "regions": { + "architecture": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 80391, + "outputBytes": 80391, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1382.359375 + "height": 1428.859375 }, "subjects": [], "relations": [], @@ -26,10 +63,10 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "f0f8480bbd0af1f1e7ff3890c24c35037258191b3588a7fc673afb8a1ef25df0", + "inputSHA256": "fbe27a48d8304ae908f552bade7a5252f2ba81f53ae2c9cf9b50d96de2782914", "scenes": [], "svgSHA256": [], - "composedHTMLSHA256": "f10abc74054ce540e154cda3bafc1a3b9c0c1e476c90bac5c82d95604135c667", + "composedHTMLSHA256": "c861ee64c46c6e1c8e168f3a0fdf2d39bf34b31aee025e9e80c26031ba8adcd4", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -38,23 +75,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "architecture": "928ec4f6d1a96c10a35c943f1799633ec6f6c4b92273d34c53c470b7092e035f" + "architecture": "8e23f18a565b1abbf693ed63c38bc7dd5e228509f04e6a19afcc73654ee0d81e" }, - "htmlSHA256": "d3e70940e67400742df284daa35989f4369c6c9d450e4bd85bb19b15fbdd8a7b", + "htmlSHA256": "3bd8b8a7ad1b4f563d6694cd3202e7ecaf1c9191eba0cfb20f4ebab1cf3880d5", "drawing": "precise", "routing": "none", "assetSHA256": { - "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", - "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" + "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", + "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" }, - "pngSHA256": "8cff63003fc408ca732e842dcb53ec34a024b82a13cda5af1ba996dbb7d2cedd", + "pngSHA256": "9328e8502dc94adfbbefb0290ecdb0ee85f42b25804243627e13022dc3418348", "browser": "156.0.8078.4", "width": 2240, - "height": 2766, + "height": 2858, "scale": 2, "bounds": { "header": { @@ -67,35 +105,35 @@ "x": 20, "y": 155.578125, "width": 1080, - "height": 187 + "height": 211 }, "architecture": { "x": 20, - "y": 354.578125, + "y": 378.578125, "width": 1080, "height": 318 }, "principles": { "x": 20, - "y": 684.578125, + "y": 708.578125, "width": 1080, "height": 194.78125 }, "products": { "x": 20, - "y": 891.359375, + "y": 915.359375, "width": 1080, "height": 173 }, "evidence": { "x": 20, - "y": 1076.359375, + "y": 1100.359375, "width": 1080, - "height": 196 + "height": 218.5 }, "takeaway": { "x": 20, - "y": 1272.359375, + "y": 1318.859375, "width": 1080, "height": 68 } @@ -103,28 +141,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -147,39 +186,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -208,7 +247,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.png index 23eb49d..1e87d13 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-project-owned.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook-detail.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook-detail.png index d8fda00..9962234 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook-detail.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.html b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.html index cc3b66c..eaf1282 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.html +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.html @@ -28,7 +28,7 @@

1What does this Library make possible?

Publish once

Models, methods and policies
Reusable definitions from Library

Choose per project

Profile selects the needed capabilities
Original identities stay intact

-

Bind actual use

Scenario acquires project inputs
One use, with source associations

+

Bind actual use

Scenario declares project bindings
One use, with explicit input requirements

2Who publishes, selects and binds?Ownership / arrows point to dependencies

@@ -37,12 +37,12 @@
PROJECT BOUNDARY / DE-CASE-01

Profile

Select parents, policies and methods
Reference catalog / mapping

binds
-

Scenario

Acquire actual inputs and origins
Retain choices, checks and gaps

+

Scenario

Declare inputs and source associations
External consumers acquire actual inputs

Architecture modelOrg documentsDecisions
Model: project.sysml / a scoped responsibility viewASCENT reasoning and Aitia review retain separate owners

3Which responsibilities stay independent?

One definition owner

Selection and use reference definitions
Contract bodies are not copied

Selection keeps its scope

Retain parents and both policies
Bind actual published methods

Reuse existing admission

POO / Core own admission
Keep normalized return values

Keep review independent

Candidates, evidence and authority
Retain each source association

-

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
Design view: issued C, accepted Q and independent review still need actual binding.
-

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and source bindings are retained
Exact IDs, parents and port references; original input fingerprints

What is still blocked?

capture-blocked · capture = #f
Preparation still reports origin and method-footprint gaps
No review or delivery was executed here
Source observation and image export are not execution receipts
-
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file +

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
This responsibility view declares C/Q/review boundaries; it issues no execution evidence.
+

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and declared bindings remain distinct
Model IDs and ports are checked; declarations do not attest actual input bytes

Where does execution belong?

design-only · declaration-layout
Library declares requirements; consuming hosts acquire and verify actual inputs
No capture, review or delivery executes in this formation view
Source observation and image export are not execution receipts
+
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.json b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.json index 63847da..f875f1e 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.json +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 904651, + "outputBytes": 382526 + }, + "sha256": "270fc06edc8d0b44129f9cb69a611848da259a1d591a624181c2efad2307c58d" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 904651, + "outputBytes": 904651, + "selected": "original" + }, + "regions": { + "architecture": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 388470, + "outputBytes": 382702, + "selected": "compressed" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,14 +49,14 @@ "x": 0, "y": 0, "width": 1120, - "height": 1425.359375 + "height": 1449.359375 }, "subjects": [ { "id": "library", "role": "default", "x": 40, - "y": 421.578125, + "y": 445.578125, "width": 310, "height": 222 }, @@ -27,7 +64,7 @@ "id": "project.profile", "role": "default", "x": 409, - "y": 465.578125, + "y": 489.578125, "width": 311, "height": 111.59375 }, @@ -35,7 +72,7 @@ "id": "project.scenario", "role": "default", "x": 754, - "y": 465.578125, + "y": 489.578125, "width": 311, "height": 111.59375 } @@ -54,12 +91,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "561cb967c6f8e57e7a7d9cedf82053fc85c980f91218a1b3be01c004379b7292", + "inputSHA256": "7517973aabd165a18dc74101a5548de011ad5967d1eb8c3c4982d65e0e020fe5", "scenes": [], "svgSHA256": [ - "28008838b807ca505b7d4dc8ac43cd40768677d5fcbf233c5e15f57be53726e9" + "c6100add9014b087f2e912fd236dac32046b58e00b0ab3dff32962bf172cdfa4" ], - "composedHTMLSHA256": "10f355dee1433f0c850560b03f2b7151116188cf2dee05c95156650223a3d994", + "composedHTMLSHA256": "7bdeafa616707c3f0527e196dfdccb547da9d68bf1ce6cd7430fa04a87c571f4", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -68,23 +105,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "architecture": "046951d8060a046e62ecb652776373b069c4a86ca6700dc889d3220d9d494aab" + "architecture": "f5a877aff3a2f95af264dc4b235eb53a268f70a819e76c580622b48291fa5b0d" }, - "htmlSHA256": "a490c5430c0c32ec3acb69ec0d0971404ef9cfb8786cd618f964cefeeef6e86e", + "htmlSHA256": "1b71beeaa8f21737e0b5b14a01bf4fcc4a0d027c52783e6b7a8acc93d727e0ee", "drawing": "roughjs@4.6.6", "routing": "xyflow@0.0.83", "assetSHA256": { - "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", - "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" + "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93", + "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb" }, - "pngSHA256": "525209066235f849cc83ee2338a23b4684948aecf04fee4132e21757c1be9b10", + "pngSHA256": "678b50661694891a66235bd6eab57a3a72e64f877a875f1a3ed0cf21519fcf5b", "browser": "156.0.8078.4", "width": 2240, - "height": 2852, + "height": 2900, "scale": 2, "bounds": { "header": { @@ -97,35 +135,35 @@ "x": 20, "y": 161.578125, "width": 1080, - "height": 184 + "height": 208 }, "architecture": { "x": 20, - "y": 357.578125, + "y": 381.578125, "width": 1080, "height": 337 }, "principles": { "x": 20, - "y": 706.578125, + "y": 730.578125, "width": 1080, "height": 199.78125 }, "products": { "x": 20, - "y": 918.359375, + "y": 942.359375, "width": 1080, "height": 186 }, "evidence": { "x": 20, - "y": 1116.359375, + "y": 1140.359375, "width": 1080, "height": 193 }, "takeaway": { "x": 20, - "y": 1309.359375, + "y": 1333.359375, "width": 1080, "height": 68 } @@ -133,28 +171,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -177,39 +216,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -238,7 +277,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.png index 5bec593..7433504 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture-sketchbook.png differ diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2 b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2 index d37bbdb..b73cbf8 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2 +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2 @@ -3,7 +3,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later # Declared Questions and content for the actual DE-CASE-01 case. -# Source observations only; no issued C, accepted Q or review R. +# Declaration/source view only; capture, execution and approval remain externally owned. vars: { d2-config: { layout-engine: elk @@ -61,19 +61,19 @@ vars: { "focusRefs": [ "library", "profile", - "capture-stop" + "declaration-boundary" ] } ], "references": { "library": "library/project-organization/objects.ss", - "profile": "profiles/library-formation.ss", - "scenario": "scenarios/project-formation/func.ss", - "capture-stop": "scenarios/project-formation/func.ss", + "profile": "library/library-formation-profiles/objects.ss", + "scenario": "library/project-formation/func.ss", + "declaration-boundary": "library/project-formation/objects.ss", "model": "project.sysml", "documents": "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org", "decisions": "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org", - "types": "scenarios/project-formation/types.ss", + "types": "library/project-formation/types.ss", "render-d2": "packages/render/src/d2-figure.ts", "render-sysml": "packages/render/src/opensysml.ts", "render-binding": "packages/render/src/index.ts", @@ -102,8 +102,8 @@ vars: { "annotation-04": "Profile selects the needed capabilities", "annotation-05": "Original identities stay intact", "capture-heading": "Bind actual use", - "annotation-06": "Scenario acquires project inputs", - "annotation-07": "One use, with source associations", + "annotation-06": "Scenario declares project bindings", + "annotation-07": "One use, with explicit input requirements", "annotation-08": "Ownership / arrows point to dependencies", "library-boundary": "REUSABLE PUBLICATION BOUNDARY", "library-label": "Library", @@ -118,8 +118,8 @@ vars: { "annotation-15": "Reference catalog / mapping", "annotation-16": "binds", "scenario-label": "Scenario", - "annotation-17": "Acquire actual inputs and origins", - "annotation-18": "Retain choices, checks and gaps", + "annotation-17": "Declare inputs and source associations", + "annotation-18": "External consumers acquire actual inputs", "model-label": "Architecture model", "document-label": "Org documents", "decision-label": "Decisions", @@ -145,15 +145,15 @@ vars: { "annotation-38": "Contracts, duties and acceptance", "annotation-39": "Decisions and reassessment", "annotation-40": "Choices, assumptions and triggers", - "annotation-41": "Design view: issued C, accepted Q and independent review still need actual binding.", + "annotation-41": "This responsibility view declares C/Q/review boundaries; it issues no execution evidence.", "annotation-42": "Library / Profile declarations are visible", "annotation-43": "Objects, both policies, catalog / mapping and method selection", - "annotation-44": "SDK identities and source bindings are retained", - "annotation-45": "Exact IDs, parents and port references; original input fingerprints", - "annotation-46": "What is still blocked?", - "annotation-47": "capture-blocked \u00b7 capture = #f", - "annotation-48": "Preparation still reports origin and method-footprint gaps", - "annotation-49": "No review or delivery was executed here", + "annotation-44": "SDK identities and declared bindings remain distinct", + "annotation-45": "Model IDs and ports are checked; declarations do not attest actual input bytes", + "annotation-46": "Where does execution belong?", + "annotation-47": "design-only · declaration-layout", + "annotation-48": "Library declares requirements; consuming hosts acquire and verify actual inputs", + "annotation-49": "No capture, review or delivery executes in this formation view", "annotation-50": "Source observation and image export are not execution receipts", "annotation-51": "Library publishes meaning. Profile selects. Scenario binds this use.", "annotation-52": "Questions / model / source observations / architecture", @@ -244,15 +244,15 @@ vars: { }, { "ref": "scenario", - "excerpt": "(def (select-formation-profile" + "excerpt": "(def (reason-project-formation" }, { - "ref": "capture-stop", - "excerpt": "status: 'capture-blocked" + "ref": "declaration-boundary", + "excerpt": "authority: 'design-only" }, { - "ref": "capture-stop", - "excerpt": "capture: #f" + "ref": "declaration-boundary", + "excerpt": "purpose: 'declaration-layout" }, { "ref": "model", diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.html b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.html index 4235f4f..0648e65 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.html +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.html @@ -28,7 +28,7 @@

1What does this Library make possible?

Publish once

Models, methods and policies
Reusable definitions from Library

Choose per project

Profile selects the needed capabilities
Original identities stay intact

-

Bind actual use

Scenario acquires project inputs
One use, with source associations

+

Bind actual use

Scenario declares project bindings
One use, with explicit input requirements

2Who publishes, selects and binds?Ownership / arrows point to dependencies

@@ -37,12 +37,12 @@
PROJECT BOUNDARY / DE-CASE-01

Profile

Select parents, policies and methods
Reference catalog / mapping

binds
-

Scenario

Acquire actual inputs and origins
Retain choices, checks and gaps

+

Scenario

Declare inputs and source associations
External consumers acquire actual inputs

Architecture modelOrg documentsDecisions
Model: project.sysml / a scoped responsibility viewASCENT reasoning and Aitia review retain separate owners

3Which responsibilities stay independent?

One definition owner

Selection and use reference definitions
Contract bodies are not copied

Selection keeps its scope

Retain parents and both policies
Bind actual published methods

Reuse existing admission

POO / Core own admission
Keep normalized return values

Keep review independent

Candidates, evidence and authority
Retain each source association

-

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
Design view: issued C, accepted Q and independent review still need actual binding.
-

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and source bindings are retained
Exact IDs, parents and port references; original input fingerprints

What is still blocked?

capture-blocked · capture = #f
Preparation still reports origin and method-footprint gaps
No review or delivery was executed here
Source observation and image export are not execution receipts
-
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file +

4How do models, docs and decisions connect?

Architecture modelproject.sysml / actual and target
Org design basisContracts, duties and acceptance
Decisions and reassessmentChoices, assumptions and triggers
This responsibility view declares C/Q/review boundaries; it issues no execution evidence.
+

What does the current source show?

Library / Profile declarations are visible
Objects, both policies, catalog / mapping and method selection
SDK identities and declared bindings remain distinct
Model IDs and ports are checked; declarations do not attest actual input bytes

Where does execution belong?

design-only · declaration-layout
Library declares requirements; consuming hosts acquire and verify actual inputs
No capture, review or delivery executes in this formation view
Source observation and image export are not execution receipts
+
Library publishes meaning. Profile selects. Scenario binds this use.
Questions / model / source observations / architectureSource observations / explicit projection limits / no verification-pass claim
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.json b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.json index 499955b..565716b 100644 --- a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.json +++ b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 852826, + "outputBytes": 516794 + }, + "sha256": "0a1ce30cdd4c2164b939e9e4c408a1d37a9b427a8988acccbd2b13f372216ca2" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 852826, + "outputBytes": 824458, + "selected": "compressed" + }, + "regions": { + "architecture": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 165459, + "outputBytes": 165459, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1447.75 + "height": 1470.25 }, "subjects": [ { @@ -54,12 +91,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "cdb3dedf4ba15e2c2f4399df4324e0d739ebb13062a8b6a5188a3bbcaf1da088", + "inputSHA256": "aaf1f96709b6df761a98c2c538f81569b0d012cbdb8badda9064b144cb07b73e", "scenes": [], "svgSHA256": [ - "530c75439be93b64f4602330bd252d018f9286467f7aabcc5d0dc8888bfdbe4e" + "f9dbe6d2732964df6d8b8ef382d3446c16a2d78754b728bc537f70581c3b7bba" ], - "composedHTMLSHA256": "2b085628b084669ca01a8d3b560fd88d99d1a1634679c9059baec091ee7be254", + "composedHTMLSHA256": "e32d3217d67c69942b66b1958fa0f2bc94784426845b9e19e722edce077da66d", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -68,23 +105,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "architecture": "4e112da0cc2236a5c878cb925608a5d38e1789ced05b94ce33c32420d55747a7" + "architecture": "7b0d76e1964b46ff568031e99f77b84f6106f4f8e640182fd81826b32518c83f" }, - "htmlSHA256": "997657326cd1461fb69d3db303c02e782f5cddcefef1e088385bcdd4b722b323", + "htmlSHA256": "72e52ae4598fb820e4b482579e3bcc29b93230b97d9511866ce8781e611d2436", "drawing": "precise", "routing": "xyflow@0.0.83", "assetSHA256": { - "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", - "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" + "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", + "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" }, - "pngSHA256": "a6432122e650b2e8e405226d2536bbc861bdc3225897046fb08545e17ac5c158", + "pngSHA256": "754a4bf7779ed341de962b77ec6420a4a241d50c03f3597df0b1375ef42cb6ce", "browser": "156.0.8078.4", "width": 2240, - "height": 2896, + "height": 2942, "scale": 2, "bounds": { "header": { @@ -121,11 +159,11 @@ "x": 20, "y": 1141.75, "width": 1080, - "height": 194 + "height": 216.5 }, "takeaway": { "x": 20, - "y": 1335.75, + "y": 1358.25, "width": 1080, "height": 68 } @@ -133,28 +171,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -177,39 +216,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -238,7 +277,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.png b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.png index 426fc28..2308933 100644 Binary files a/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.png and b/docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.html b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.html index 04597af..569779f 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.html +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.html @@ -3,4 +3,4 @@ SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors SPDX-License-Identifier: LGPL-2.1-or-later --> -

DE-CASE-01 capture preparation workflow

sketchbook

workflow-sketchbook

node-editor

workflow-node-editor

swimlane

workflow-swimlane

project-owned

workflow-project-owned
\ No newline at end of file +

Declared formation workflow and external execution boundary

sketchbook

workflow-sketchbook

node-editor

workflow-node-editor

swimlane

workflow-swimlane

project-owned

workflow-project-owned
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.png index 768ac41..52711d8 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-comparison.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-detail.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-detail.png index 80c6369..2da13dc 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-detail.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor-detail.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor-detail.png index e0d1ebb..c6f732a 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor-detail.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.html b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.html index e6a9caa..3af6c07 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.html +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.html @@ -4,7 +4,7 @@ SPDX-FileCopyrightText: 2016 The Inter Project Authors (https://github.com/rsms/inter) SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 --> -DE-CASE-01 capture preparation workflow
-
Workflow / current stop
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Confirm origins, select and bind. Retain inputs, outputs and open items at each boundary.

-

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows preparation order; the current source outcome is marked separately.

1
Confirm intentOriginal intent + roles
2
Select ProfileParents / policies
3
Acquire inputsContent / origins / expiry
4
Check bindingScope / parents / origins
5
Prepare CRetain missing inputs
Current return: capture-blocked / capture = #f
+
Workflow / declaration boundary
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Declare intent, select and bind. Actual capture and execution belong to consuming hosts.

+

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows declared dependencies; it is not an executed capture trace.

1
Confirm intentOriginal intent + roles
2
Select ProfileParents / policies
3
Declare inputsRequirements / origin bindings
4
Check bindingScope / parents / origins
5
Declare handoffPreserve unmet requirements
Current authority: design-only / declaration-layout

2What crosses each boundary?

-
BoundaryInputOutput / retained associations
Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorize
Profile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized results
Scenario acquisitionRepository root and project input inventoryActual content, origin observations, lifetime and gaps
Capture preparationSelections, origin authority and method input demandsCurrent output is a blocked report; unique C is not issued
-

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Acquire current project files, origins and lifetime

How are gaps and conflicts retained?

Incomplete original sources: retain origin findings
Missing method footprint: retain required inputs
Do not issue C or promote a candidate to accepted Q
-
Every step needs a basis. Every stop needs an explicit reason.
Basis: Profile and prepare-formation-capture source / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file +Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorizeProfile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized resultsScenario declarationRepository root and project input inventoryDeclared content/origin requirements; consumers supply actual observationsExternal capture handoffSelections, origin authority and method input demandsFormation declares obligations; consuming hosts issue actual observations +

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Declare required project files, origins and lifetime

How are gaps and conflicts retained?

Missing declarations: retain gaps without inventing evidence
Methods retain their required input footprint
Layout reasoning alone cannot issue C or promote a candidate to accepted Q
+
Every step needs a basis. Every stop needs an explicit reason.
Basis: maintained Profile and design-only formation declarations / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.json b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.json index fc11f42..24f4f02 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.json +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 646802, + "outputBytes": 387832 + }, + "sha256": "ddd9c0403e3e5764dc54e254117c447f393c85e80058a01fc9126d3335d2a865" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 646802, + "outputBytes": 613433, + "selected": "compressed" + }, + "regions": { + "workflow": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 106456, + "outputBytes": 106456, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1108.4375 + "height": 1151.9375 }, "subjects": [ { @@ -32,7 +69,7 @@ "height": 69.578125 }, { - "id": "acquisition", + "id": "requirements", "role": "default", "x": 470.390625, "y": 268.78125, @@ -51,15 +88,15 @@ "id": "preparation", "role": "default", "x": 884.796875, - "y": 279.96875, + "y": 268.78125, "width": 179.1875, - "height": 88.765625 + "height": 111.15625 } ], "relations": [ "(confirmation -> selection)[0]", - "(selection -> acquisition)[0]", - "(acquisition -> association)[0]", + "(selection -> requirements)[0]", + "(requirements -> association)[0]", "(association -> preparation)[0]" ], "headings": [] @@ -72,12 +109,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "61f5ba39f8ad93114fe7c3a879535996317caec4e1ba1e337e67542f21a2b8e6", + "inputSHA256": "f40d71004814ad2b74a837b0a87d3436283b22c79eaa3ded92b1718417835b63", "scenes": [], "svgSHA256": [ - "2d1df6d429f090a39fba4b63c8625770e9e759402a599ecbf9d8397a1507fcfb" + "3ddabb22ef640148868b809928c7152a0bd35d50d6231adaf7578eb3709ad263" ], - "composedHTMLSHA256": "09de1a70785ca49c3bcfee7d1b87de0d766bf15302f7a45ad6664fe6e87624f8", + "composedHTMLSHA256": "93ae6de6e4c61cc87f66d7c0195aed3dbbcdbe4d0787eb8d50f13525b41fefa0", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -86,23 +123,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "workflow": "42b27640f6b0c7e886abfadfe189beb0dd0227296eeabc3ca0674967cf36be58" + "workflow": "8b3713a2117bac6bbd36caad2a17725cffb613233da18a6374ccbcc18806bfea" }, - "htmlSHA256": "6a8b289bdf0a86f0d7980961a12af272b21285444330eb76454a947dbb8bcb7b", + "htmlSHA256": "975ab9609ad966214917328f2edc01ebe34c6bed91487110296abf91d6f6fe1d", "drawing": "precise", "routing": "xyflow@0.0.83", "assetSHA256": { "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" }, - "pngSHA256": "be8b0ccc256190d3b90aa9be9bd246fd85a01ba7ace774aef439c24840fcb3cd", + "pngSHA256": "5efda56409707d6a5a64961486854a9de3eded07434aa1d972fe7cab934f63cd", "browser": "156.0.8078.4", "width": 2240, - "height": 2218, + "height": 2304, "scale": 2, "bounds": { "header": { @@ -121,17 +159,17 @@ "x": 20, "y": 483.9375, "width": 1080, - "height": 315 + "height": 336 }, "checks": { "x": 20, - "y": 810.9375, + "y": 831.9375, "width": 1080, - "height": 185.5 + "height": 208 }, "takeaway": { "x": 20, - "y": 996.4375, + "y": 1039.9375, "width": 1080, "height": 68 } @@ -139,28 +177,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -183,39 +222,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -244,7 +283,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.png index 3eaa9e9..9359373 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-node-editor.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned-detail.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned-detail.png index 75ef900..715c019 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned-detail.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.html b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.html index 3bfc6c9..d745254 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.html +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.html @@ -4,7 +4,7 @@ SPDX-FileCopyrightText: 2016 The Inter Project Authors (https://github.com/rsms/inter) SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 --> -DE-CASE-01 capture preparation workflow
-
Workflow / current stop
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Confirm origins, select and bind. Retain inputs, outputs and open items at each boundary.

-

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows preparation order; the current source outcome is marked separately.

Project intent
1
Confirm intentOriginal intent + roles
Profile selection
2
Select ProfileParents / policies
Scenario preparation
3
Acquire inputsContent / origins / expiry
4
Check bindingScope / parents / origins
5
Prepare CRetain missing inputs
Current return: capture-blocked / capture = #f
+
Workflow / declaration boundary
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Declare intent, select and bind. Actual capture and execution belong to consuming hosts.

+

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows declared dependencies; it is not an executed capture trace.

Project intent
1
Confirm intentOriginal intent + roles
Profile selection
2
Select ProfileParents / policies
Scenario preparation
3
Declare inputsRequirements / origin bindings
4
Check bindingScope / parents / origins
5
Declare handoffPreserve unmet requirements
Current authority: design-only / declaration-layout

2What crosses each boundary?

-
BoundaryInputOutput / retained associations
Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorize
Profile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized results
Scenario acquisitionRepository root and project input inventoryActual content, origin observations, lifetime and gaps
Capture preparationSelections, origin authority and method input demandsCurrent output is a blocked report; unique C is not issued
-

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Acquire current project files, origins and lifetime

How are gaps and conflicts retained?

Incomplete original sources: retain origin findings
Missing method footprint: retain required inputs
Do not issue C or promote a candidate to accepted Q
-
Every step needs a basis. Every stop needs an explicit reason.
Basis: Profile and prepare-formation-capture source / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file +Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorizeProfile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized resultsScenario declarationRepository root and project input inventoryDeclared content/origin requirements; consumers supply actual observationsExternal capture handoffSelections, origin authority and method input demandsFormation declares obligations; consuming hosts issue actual observations +

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Declare required project files, origins and lifetime

How are gaps and conflicts retained?

Missing declarations: retain gaps without inventing evidence
Methods retain their required input footprint
Layout reasoning alone cannot issue C or promote a candidate to accepted Q
+
Every step needs a basis. Every stop needs an explicit reason.
Basis: maintained Profile and design-only formation declarations / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.json b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.json index ca54f14..c13e4d5 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.json +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 730642, + "outputBytes": 453180 + }, + "sha256": "e370a80298b8dc532f25a6a1722da4be436d9e98b4b8488a7a14040cbcc93d11" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 730642, + "outputBytes": 686400, + "selected": "compressed" + }, + "regions": { + "workflow": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 138053, + "outputBytes": 138053, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1186.28125 + "height": 1250.78125 }, "subjects": [ { @@ -32,7 +69,7 @@ "height": 53.78125 }, { - "id": "acquisition", + "id": "requirements", "role": "default", "x": 538.59375, "y": 444.09375, @@ -51,15 +88,15 @@ "id": "preparation", "role": "default", "x": 898.1875, - "y": 452.890625, + "y": 444.09375, "width": 172.8125, - "height": 53.78125 + "height": 71.375 } ], "relations": [ "(confirmation -> selection)[0]", - "(selection -> acquisition)[0]", - "(acquisition -> association)[0]", + "(selection -> requirements)[0]", + "(requirements -> association)[0]", "(association -> preparation)[0]" ], "headings": [] @@ -72,12 +109,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "b6777a5a7bc2e8fd81f7be48879f414809f456edb1f10d7604fdc4f84584cb3b", + "inputSHA256": "48b0dd6894b3e24c1831177b74ed664a96538ebfc48b18507a7e5ac50e7ab845", "scenes": [], "svgSHA256": [ - "57a7b06d934ebfe1e4351ccee7e112468c430ffafd17a6f028bc98ac842e3180" + "1561b1a969621d5ae36f37879b65b585316311416297cb806faa3d39b4b9dd26" ], - "composedHTMLSHA256": "0f4a6e5b217b90100d34e8266c23ef64b66e4b39369186ca64ddc2869af2f8d1", + "composedHTMLSHA256": "40695ba3378c6628f9bf6b55e1649a25a74d501c6ef39fd285e9d2689cb9e50a", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -86,23 +123,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "workflow": "b3d0a398e44337997c16fff6ebbf86922ae128aca1d1cd26f09c50c77fde4260" + "workflow": "a1cbf93164f12fb9ad540c4aefe42608064b72571f1a3fa7ab1fc0c9180ccfa4" }, - "htmlSHA256": "f285abface568804ffcdb0381d49802c4a1b1b805b5841293be8984b1f581199", + "htmlSHA256": "66ec44eaf3eb233918c6f9077aa3a397748c635e0cea0fbb1ee656722dbe5cb5", "drawing": "precise", "routing": "xyflow@0.0.83", "assetSHA256": { "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" }, - "pngSHA256": "f4bb8f0a68e9f15b6326c27c0b5fd9329ba4d191016cb0975ec5127691dec709", + "pngSHA256": "606dd1ebe1a6cbbe298730be05f6ac39947f637575a81ea9be9026e5fc5bda9c", "browser": "156.0.8078.4", "width": 2240, - "height": 2374, + "height": 2502, "scale": 2, "bounds": { "header": { @@ -121,17 +159,17 @@ "x": 20, "y": 606.78125, "width": 1080, - "height": 274 + "height": 316 }, "checks": { "x": 20, - "y": 892.78125, + "y": 934.78125, "width": 1080, - "height": 183.5 + "height": 206 }, "takeaway": { "x": 20, - "y": 1076.28125, + "y": 1140.78125, "width": 1080, "height": 68 } @@ -139,28 +177,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -183,39 +222,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -244,7 +283,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.png index 2453eda..270bc1e 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-project-owned.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook-detail.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook-detail.png index 61483fd..222c638 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook-detail.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.html b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.html index 752a431..28dad68 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.html +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.html @@ -4,7 +4,7 @@ SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 --> -DE-CASE-01 capture preparation workflow
-
Workflow / current stop
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Confirm origins, select and bind. Retain inputs, outputs and open items at each boundary.

-

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows preparation order; the current source outcome is marked separately.

1
Confirm intentOriginal intent + roles
2
Select ProfileParents / policies
3
Acquire inputsContent / origins / expiry
4
Check bindingScope / parents / origins
5
Prepare CRetain missing inputs
Current return: capture-blocked / capture = #f
+
Workflow / declaration boundary
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Declare intent, select and bind. Actual capture and execution belong to consuming hosts.

+

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows declared dependencies; it is not an executed capture trace.

1
Confirm intentOriginal intent + roles
2
Select ProfileParents / policies
3
Declare inputsRequirements / origin bindings
4
Check bindingScope / parents / origins
5
Declare handoffPreserve unmet requirements
Current authority: design-only / declaration-layout

2What crosses each boundary?

-
BoundaryInputOutput / retained associations
Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorize
Profile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized results
Scenario acquisitionRepository root and project input inventoryActual content, origin observations, lifetime and gaps
Capture preparationSelections, origin authority and method input demandsCurrent output is a blocked report; unique C is not issued
-

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Acquire current project files, origins and lifetime

How are gaps and conflicts retained?

Incomplete original sources: retain origin findings
Missing method footprint: retain required inputs
Do not issue C or promote a candidate to accepted Q
-
Every step needs a basis. Every stop needs an explicit reason.
Basis: Profile and prepare-formation-capture source / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file +Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorizeProfile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized resultsScenario declarationRepository root and project input inventoryDeclared content/origin requirements; consumers supply actual observationsExternal capture handoffSelections, origin authority and method input demandsFormation declares obligations; consuming hosts issue actual observations +

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Declare required project files, origins and lifetime

How are gaps and conflicts retained?

Missing declarations: retain gaps without inventing evidence
Methods retain their required input footprint
Layout reasoning alone cannot issue C or promote a candidate to accepted Q
+
Every step needs a basis. Every stop needs an explicit reason.
Basis: maintained Profile and design-only formation declarations / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.json b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.json index 2fdcfa1..f00ef8f 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.json +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 608132, + "outputBytes": 248120 + }, + "sha256": "324996dffb4fb598e4e2e81a00252bb5e652757be5e492b28d28bc5b83d40bd6" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 608132, + "outputBytes": 608132, + "selected": "original" + }, + "regions": { + "workflow": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 252694, + "outputBytes": 248768, + "selected": "compressed" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,14 +49,14 @@ "x": 0, "y": 0, "width": 1120, - "height": 1009.046875 + "height": 1053.9375 }, "subjects": [ { "id": "confirmation", "role": "default", "x": 40, - "y": 264.375, + "y": 275.5625, "width": 185.59375, "height": 69.578125 }, @@ -27,15 +64,15 @@ "id": "selection", "role": "default", "x": 253.59375, - "y": 264.375, + "y": 275.5625, "width": 185.59375, "height": 69.578125 }, { - "id": "acquisition", + "id": "requirements", "role": "default", "x": 467.1875, - "y": 254.78125, + "y": 265.96875, "width": 185.609375, "height": 88.765625 }, @@ -43,7 +80,7 @@ "id": "association", "role": "default", "x": 680.796875, - "y": 254.78125, + "y": 265.96875, "width": 185.59375, "height": 88.765625 }, @@ -51,15 +88,15 @@ "id": "preparation", "role": "default", "x": 894.390625, - "y": 264.375, + "y": 254.78125, "width": 185.609375, - "height": 69.578125 + "height": 111.15625 } ], "relations": [ "(confirmation -> selection)[0]", - "(selection -> acquisition)[0]", - "(acquisition -> association)[0]", + "(selection -> requirements)[0]", + "(requirements -> association)[0]", "(association -> preparation)[0]" ], "headings": [] @@ -72,12 +109,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "7fac4d7f39f6b0b6fa29b4a51354568ccbc1dae53580eaa12add53b1bcd22f48", + "inputSHA256": "56722f4a3bfab3721a71fe3d3c0d1b2cfc48cf4bc0142647d691c8b6db8eadd8", "scenes": [], "svgSHA256": [ - "576fc9555f1c81dd3f22767e1a367ad32b03606483b27d9a46d0daacd015ede0" + "c35da263db24c0d0447cb5707cbdab3b6159e7caa7bdcdfd51d859d3796a8788" ], - "composedHTMLSHA256": "27102d59c9a9965cee3600f5baed77e3233448a5ea76d442def6c17704a1ea5e", + "composedHTMLSHA256": "216b3499db6fa9611900bf95137ed52d64d66b757e932cbafb3edb45de8df187", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -86,23 +123,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "workflow": "11fc507af4eedbb6cf1fcd250106a2416881570bff7e5b45c0dc16381ac0ee4a" + "workflow": "99fc5b951a01457be8f87d97d72da9568c3ef051c6c5366918304246efb82685" }, - "htmlSHA256": "a36aed99b67c478ea99f26b21502a23b0d88d6227ed17347057ec60665402c23", + "htmlSHA256": "ff4d2b362dbc82d8e5f77c9021731bbb287e07abefc3b437cf6cc1d2bb61d8de", "drawing": "roughjs@4.6.6", "routing": "xyflow@0.0.83", "assetSHA256": { "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" }, - "pngSHA256": "28de4ef8bc9f7ac01499b629af50bbb88ca8d1e4bc1c8e22951a1977969278f6", + "pngSHA256": "0ed02fb0bd4ea785b272b8432eeb40e70be37ede2d84c5cdd74575570fab60aa", "browser": "156.0.8078.4", "width": 2240, - "height": 2020, + "height": 2108, "scale": 2, "bounds": { "header": { @@ -115,23 +153,23 @@ "x": 20, "y": 156.78125, "width": 1080, - "height": 254.765625 + "height": 277.15625 }, "exchange": { "x": 20, - "y": 423.546875, + "y": 445.9375, "width": 1080, "height": 277 }, "checks": { "x": 20, - "y": 712.546875, + "y": 734.9375, "width": 1080, - "height": 180.5 + "height": 203 }, "takeaway": { "x": 20, - "y": 893.046875, + "y": 937.9375, "width": 1080, "height": 68 } @@ -139,28 +177,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -183,39 +222,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -244,7 +283,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.png index 0aed329..a2c0b2a 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-sketchbook.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane-detail.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane-detail.png index 2fe1001..bcbca5b 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane-detail.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane-detail.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.html b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.html index 53a361c..c1dde55 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.html +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.html @@ -4,7 +4,7 @@ SPDX-FileCopyrightText: 2016 The Inter Project Authors (https://github.com/rsms/inter) SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 --> -DE-CASE-01 capture preparation workflow
-
Workflow / current stop
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Confirm origins, select and bind. Retain inputs, outputs and open items at each boundary.

-

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows preparation order; the current source outcome is marked separately.

Project intent
1
Confirm intentOriginal intent + roles
Profile selection
2
Select ProfileParents / policies
Scenario preparation
3
Acquire inputsContent / origins / expiry
4
Check bindingScope / parents / origins
5
Prepare CRetain missing inputs
Current return: capture-blocked / capture = #f
+
Workflow / declaration boundary
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Declare intent, select and bind. Actual capture and execution belong to consuming hosts.

+

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows declared dependencies; it is not an executed capture trace.

Project intent
1
Confirm intentOriginal intent + roles
Profile selection
2
Select ProfileParents / policies
Scenario preparation
3
Declare inputsRequirements / origin bindings
4
Check bindingScope / parents / origins
5
Declare handoffPreserve unmet requirements
Current authority: design-only / declaration-layout

2What crosses each boundary?

-
BoundaryInputOutput / retained associations
Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorize
Profile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized results
Scenario acquisitionRepository root and project input inventoryActual content, origin observations, lifetime and gaps
Capture preparationSelections, origin authority and method input demandsCurrent output is a blocked report; unique C is not issued
-

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Acquire current project files, origins and lifetime

How are gaps and conflicts retained?

Incomplete original sources: retain origin findings
Missing method footprint: retain required inputs
Do not issue C or promote a candidate to accepted Q
-
Every step needs a basis. Every stop needs an explicit reason.
Basis: Profile and prepare-formation-capture source / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file +Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorizeProfile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized resultsScenario declarationRepository root and project input inventoryDeclared content/origin requirements; consumers supply actual observationsExternal capture handoffSelections, origin authority and method input demandsFormation declares obligations; consuming hosts issue actual observations +

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Declare required project files, origins and lifetime

How are gaps and conflicts retained?

Missing declarations: retain gaps without inventing evidence
Methods retain their required input footprint
Layout reasoning alone cannot issue C or promote a candidate to accepted Q
+
Every step needs a basis. Every stop needs an explicit reason.
Basis: maintained Profile and design-only formation declarations / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.json b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.json index 3718a94..116c4f2 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.json +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 664785, + "outputBytes": 393096 + }, + "sha256": "0bc94cc40ec75277f86febc54de6e80dbf331c024b4eac6e30b3204170073c0f" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 664785, + "outputBytes": 636088, + "selected": "compressed" + }, + "regions": { + "workflow": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 124875, + "outputBytes": 124875, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1227.28125 + "height": 1270.78125 }, "subjects": [ { @@ -32,7 +69,7 @@ "height": 53.78125 }, { - "id": "acquisition", + "id": "requirements", "role": "default", "x": 538.59375, "y": 444.09375, @@ -51,15 +88,15 @@ "id": "preparation", "role": "default", "x": 898.1875, - "y": 452.890625, + "y": 444.09375, "width": 172.8125, - "height": 53.78125 + "height": 71.375 } ], "relations": [ "(confirmation -> selection)[0]", - "(selection -> acquisition)[0]", - "(acquisition -> association)[0]", + "(selection -> requirements)[0]", + "(requirements -> association)[0]", "(association -> preparation)[0]" ], "headings": [] @@ -72,12 +109,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "2cdf4132b07c6e5f651e1d491768982cccf1ef72b098001150df860c71752152", + "inputSHA256": "281d3652aaec735bec9cb3629a6f01dd4ed07e617f68b59707a58e14e0d184f4", "scenes": [], "svgSHA256": [ - "14d15f72e8a0a1825d7253c66f83f2554386f010715e3c423a341bac71475f6c" + "23f0064063c48387715aefe03f758d8d12cae68fea450f519014a447f3fd2c74" ], - "composedHTMLSHA256": "6a8f6686a20a851f83f12207546a5321261ec00ee8d65a2e012da3e17e6306b6", + "composedHTMLSHA256": "45a8e8c6320db9618ce98a506cfe80495ba85eddf5044a873f11286c19f7fec9", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -86,23 +123,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "workflow": "014ac3ef0f382022bf0481b44fc0f6bfd6267ca2c3adecbded2d48330176008b" + "workflow": "a1ec466bfa909c7738e97281a3991027be77d3b6cf0daafc2b4d66ab5d391c10" }, - "htmlSHA256": "d1a565b6d2369cbd6c920062a55c40a9e5b5ce8f02f4695270c61fe1e40dd579", + "htmlSHA256": "168519a0293a1b2cb2cda466b81533b59a59dd968cdc6e8ba957d48f2182affb", "drawing": "precise", "routing": "xyflow@0.0.83", "assetSHA256": { - "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", - "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" + "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", + "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" }, - "pngSHA256": "e65def9127504a30994c7657644f3c167d31efc178577953f57bb6a3b73b6b22", + "pngSHA256": "eca806fe8771447b6a35b92dca81dcf084a1266b0658b37a1beb8ad253dcc562", "browser": "156.0.8078.4", "width": 2240, - "height": 2456, + "height": 2542, "scale": 2, "bounds": { "header": { @@ -121,17 +159,17 @@ "x": 20, "y": 606.78125, "width": 1080, - "height": 315 + "height": 336 }, "checks": { "x": 20, - "y": 933.78125, + "y": 954.78125, "width": 1080, - "height": 181.5 + "height": 204 }, "takeaway": { "x": 20, - "y": 1115.28125, + "y": 1158.78125, "width": 1080, "height": 68 } @@ -139,28 +177,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -183,39 +222,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -244,7 +283,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.png index abbe2d9..8e7021e 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow-swimlane.png differ diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2 b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2 index f496d65..fa31bd3 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2 +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2 @@ -3,7 +3,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later # Declared Questions and content for the actual DE-CASE-01 case. -# Source observations only; no issued C, accepted Q or review R. +# Declaration/source view only; capture, execution and approval remain externally owned. vars: { d2-config: { layout-engine: elk @@ -11,212 +11,212 @@ vars: { # Application declarations travel through the official graph.data interface. figure: |json { - "title": "DE-CASE-01 capture preparation workflow", - "purpose": "workflow", - "kind": "flow", - "language": "en", - "width": 1120, - "primary": "progress", - "questions": [ - { - "ref": "progress", - "text": "How is a use prepared, and where does it stop?", - "focusRefs": [ - "profile", - "scenario", - "capture-stop" - ] - }, - { - "ref": "exchange", - "text": "What crosses each boundary?", - "focusRefs": [ - "profile", - "scenario", - "types" - ] - }, - { - "ref": "stops", - "text": "What must be checked before proceeding?", - "focusRefs": [ - "scenario", - "capture-stop" - ] - } - ], - "references": { - "library": "library/project-organization/objects.ss", - "profile": "profiles/library-formation.ss", - "scenario": "scenarios/project-formation/func.ss", - "capture-stop": "scenarios/project-formation/func.ss", - "model": "project.sysml", - "documents": "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org", - "decisions": "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org", - "types": "scenarios/project-formation/types.ss" - }, - "basis": { - "captureRef": "design-candidate:DE-CASE-01/rendering", - "modelRefs": [ - "project.sysml" - ], - "obligationRefs": [ - "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org" - ], - "evidenceRefs": [] - }, - "copy": { - "badge": "Workflow / current stop", - "eyebrow": "DETERMINISTIC ENGINEERING / DE-CASE-01", - "title": "From project intent to ", - "emphasis": "traceable use", - "annotation-01": "Confirm origins, select and bind. Retain inputs, outputs and open items at each boundary.", - "annotation-02": "Control order / compact main path", - "annotation-03": "The path shows preparation order; the current source outcome is marked separately.", - "confirm-label": "Confirm intent", - "annotation-04": "Original intent + roles", - "select-label": "Select Profile", - "annotation-05": "Parents / policies", - "acquire-label": "Acquire inputs", - "annotation-06": "Content / origins / expiry", - "check-label": "Check binding", - "annotation-07": "Scope / parents / origins", - "prepare-label": "Prepare C", - "annotation-08": "Retain missing inputs", - "annotation-09": "Current return: capture-blocked / capture = #f", - "annotation-10": "Boundary", - "annotation-11": "Input", - "annotation-12": "Output / retained associations", - "annotation-13": "Project confirmation", - "annotation-14": "Actual intent, account origin and role mandate", - "annotation-15": "Original sources required for verification; declarations do not authorize", - "annotation-16": "Profile selection", - "annotation-17": "Validated Scope, parent chain and both policies", - "annotation-18": "Selections and actual bindings; retain normalized results", - "annotation-19": "Scenario acquisition", - "annotation-20": "Repository root and project input inventory", - "annotation-21": "Actual content, origin observations, lifetime and gaps", - "annotation-22": "Capture preparation", - "annotation-23": "Selections, origin authority and method input demands", - "annotation-24": "Current output is a blocked report; unique C is not issued", - "annotation-25": "Parent and policy associations must agree", - "annotation-26": "Select actual published method bindings", - "annotation-27": "Acquire current project files, origins and lifetime", - "annotation-28": "How are gaps and conflicts retained?", - "annotation-29": "Incomplete original sources: retain origin findings", - "annotation-30": "Missing method footprint: retain required inputs", - "annotation-31": "Do not issue C or promote a candidate to accepted Q", - "annotation-32": "Every step needs a basis. Every stop needs an explicit reason.", - "annotation-33": "Basis: Profile and prepare-formation-capture source / no execution acceptance", - "annotation-34": "Workflow / separate from architecture" - }, - "themes": [ - "blueprint", - "compact" - ], - "variants": [ - { - "name": "sketchbook", - "themes": [ - "sketchbook", - "compact" - ] - }, - { - "name": "node-editor", - "themes": [ - "blueprint", - "node-editor", - "compact" - ] - }, - { - "name": "swimlane", - "themes": [ - "blueprint", - "compact" - ], - "layout": "swimlane" - }, - { - "name": "project-owned", - "kind": "capture-handoff", - "layout": "swimlane", - "themes": [ - "field-notes", - "workbench", - "compact" - ], - "icons": [ - "engineering", - "repo" - ] - } - ], - "icons": [ - "engineering" - ], - "presentation": { - "flow": { - "lanes": [ - { - "id": "intent", - "label": "Project intent" - }, - { - "id": "profile", - "label": "Profile selection" - }, - { - "id": "scenario", - "label": "Scenario preparation" - } - ], - "steps": [ - { - "node": "confirmation", - "lane": "intent", - "title": "confirm-label", - "detail": "annotation-04", - "icon": "question" - }, - { - "node": "selection", - "lane": "profile", - "title": "select-label", - "detail": "annotation-05", - "icon": "selection" - }, - { - "node": "acquisition", - "lane": "scenario", - "title": "acquire-label", - "detail": "annotation-06", - "icon": "document" - }, - { - "node": "association", - "lane": "scenario", - "title": "check-label", - "detail": "annotation-07", - "icon": "reference" - }, - { - "node": "preparation", - "lane": "scenario", - "title": "prepare-label", - "detail": "annotation-08", - "icon": "capture" - } - ] - } - } + "title": "Declared formation workflow and external execution boundary", + "purpose": "workflow", + "kind": "flow", + "language": "en", + "width": 1120, + "primary": "progress", + "questions": [ + { + "ref": "progress", + "text": "How is a use prepared, and where does it stop?", + "focusRefs": [ + "profile", + "scenario", + "declaration-boundary" + ] + }, + { + "ref": "exchange", + "text": "What crosses each boundary?", + "focusRefs": [ + "profile", + "scenario", + "types" + ] + }, + { + "ref": "stops", + "text": "What must be checked before proceeding?", + "focusRefs": [ + "scenario", + "declaration-boundary" + ] + } + ], + "references": { + "library": "library/project-organization/objects.ss", + "profile": "library/library-formation-profiles/objects.ss", + "scenario": "library/project-formation/func.ss", + "declaration-boundary": "library/project-formation/objects.ss", + "model": "project.sysml", + "documents": "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org", + "decisions": "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org", + "types": "library/project-formation/types.ss" + }, + "basis": { + "captureRef": "design-candidate:DE-CASE-01/rendering", + "modelRefs": [ + "project.sysml" + ], + "obligationRefs": [ + "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org" + ], + "evidenceRefs": [] + }, + "copy": { + "badge": "Workflow / declaration boundary", + "eyebrow": "DETERMINISTIC ENGINEERING / DE-CASE-01", + "title": "From project intent to ", + "emphasis": "traceable use", + "annotation-01": "Declare intent, select and bind. Actual capture and execution belong to consuming hosts.", + "annotation-02": "Control order / compact main path", + "annotation-03": "The path shows declared dependencies; it is not an executed capture trace.", + "confirm-label": "Confirm intent", + "annotation-04": "Original intent + roles", + "select-label": "Select Profile", + "annotation-05": "Parents / policies", + "acquire-label": "Declare inputs", + "annotation-06": "Requirements / origin bindings", + "check-label": "Check binding", + "annotation-07": "Scope / parents / origins", + "prepare-label": "Declare handoff", + "annotation-08": "Preserve unmet requirements", + "annotation-09": "Current authority: design-only / declaration-layout", + "annotation-10": "Boundary", + "annotation-11": "Input", + "annotation-12": "Output / retained associations", + "annotation-13": "Project confirmation", + "annotation-14": "Actual intent, account origin and role mandate", + "annotation-15": "Original sources required for verification; declarations do not authorize", + "annotation-16": "Profile selection", + "annotation-17": "Validated Scope, parent chain and both policies", + "annotation-18": "Selections and actual bindings; retain normalized results", + "annotation-19": "Scenario declaration", + "annotation-20": "Repository root and project input inventory", + "annotation-21": "Declared content/origin requirements; consumers supply actual observations", + "annotation-22": "External capture handoff", + "annotation-23": "Selections, origin authority and method input demands", + "annotation-24": "Formation declares obligations; consuming hosts issue actual observations", + "annotation-25": "Parent and policy associations must agree", + "annotation-26": "Select actual published method bindings", + "annotation-27": "Declare required project files, origins and lifetime", + "annotation-28": "How are gaps and conflicts retained?", + "annotation-29": "Missing declarations: retain gaps without inventing evidence", + "annotation-30": "Methods retain their required input footprint", + "annotation-31": "Layout reasoning alone cannot issue C or promote a candidate to accepted Q", + "annotation-32": "Every step needs a basis. Every stop needs an explicit reason.", + "annotation-33": "Basis: maintained Profile and design-only formation declarations / no execution acceptance", + "annotation-34": "Workflow / separate from architecture" + }, + "themes": [ + "blueprint", + "compact" + ], + "variants": [ + { + "name": "sketchbook", + "themes": [ + "sketchbook", + "compact" + ] + }, + { + "name": "node-editor", + "themes": [ + "blueprint", + "node-editor", + "compact" + ] + }, + { + "name": "swimlane", + "themes": [ + "blueprint", + "compact" + ], + "layout": "swimlane" + }, + { + "name": "project-owned", + "kind": "capture-handoff", + "layout": "swimlane", + "themes": [ + "field-notes", + "workbench", + "compact" + ], + "icons": [ + "engineering", + "repo" + ] + } + ], + "icons": [ + "engineering" + ], + "presentation": { + "flow": { + "lanes": [ + { + "id": "intent", + "label": "Project intent" + }, + { + "id": "profile", + "label": "Profile selection" + }, + { + "id": "scenario", + "label": "Scenario preparation" + } + ], + "steps": [ + { + "node": "confirmation", + "lane": "intent", + "title": "confirm-label", + "detail": "annotation-04", + "icon": "question" + }, + { + "node": "selection", + "lane": "profile", + "title": "select-label", + "detail": "annotation-05", + "icon": "selection" + }, + { + "node": "requirements", + "lane": "scenario", + "title": "acquire-label", + "detail": "annotation-06", + "icon": "document" + }, + { + "node": "association", + "lane": "scenario", + "title": "check-label", + "detail": "annotation-07", + "icon": "reference" + }, + { + "node": "preparation", + "lane": "scenario", + "title": "prepare-label", + "detail": "annotation-08", + "icon": "capture" } + ] + } + } +} | } } } direction: right -confirmation -> selection -> acquisition -> association -> preparation -preparation -> blocked: current source outcome -blocked: "capture-blocked / capture = #f" +confirmation -> selection -> requirements -> association -> preparation +preparation -> blocked: declared execution boundary +blocked: "design-only / external capture and execution" diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.html b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.html index 173372b..51b19cf 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.html +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.html @@ -4,7 +4,7 @@ SPDX-FileCopyrightText: 2016 The Inter Project Authors (https://github.com/rsms/inter) SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 --> -DE-CASE-01 capture preparation workflow
-
Workflow / current stop
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Confirm origins, select and bind. Retain inputs, outputs and open items at each boundary.

-

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows preparation order; the current source outcome is marked separately.

1
Confirm intentOriginal intent + roles
2
Select ProfileParents / policies
3
Acquire inputsContent / origins / expiry
4
Check bindingScope / parents / origins
5
Prepare CRetain missing inputs
Current return: capture-blocked / capture = #f
+
Workflow / declaration boundary
DETERMINISTIC ENGINEERING / DE-CASE-01

From project intent to traceable use

Declare intent, select and bind. Actual capture and execution belong to consuming hosts.

+

1How is a use prepared, and where does it stop?Control order / compact main path

The path shows declared dependencies; it is not an executed capture trace.

1
Confirm intentOriginal intent + roles
2
Select ProfileParents / policies
3
Declare inputsRequirements / origin bindings
4
Check bindingScope / parents / origins
5
Declare handoffPreserve unmet requirements
Current authority: design-only / declaration-layout

2What crosses each boundary?

-
BoundaryInputOutput / retained associations
Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorize
Profile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized results
Scenario acquisitionRepository root and project input inventoryActual content, origin observations, lifetime and gaps
Capture preparationSelections, origin authority and method input demandsCurrent output is a blocked report; unique C is not issued
-

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Acquire current project files, origins and lifetime

How are gaps and conflicts retained?

Incomplete original sources: retain origin findings
Missing method footprint: retain required inputs
Do not issue C or promote a candidate to accepted Q
-
Every step needs a basis. Every stop needs an explicit reason.
Basis: Profile and prepare-formation-capture source / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file +Project confirmationActual intent, account origin and role mandateOriginal sources required for verification; declarations do not authorizeProfile selectionValidated Scope, parent chain and both policiesSelections and actual bindings; retain normalized resultsScenario declarationRepository root and project input inventoryDeclared content/origin requirements; consumers supply actual observationsExternal capture handoffSelections, origin authority and method input demandsFormation declares obligations; consuming hosts issue actual observations +

What must be checked before proceeding?

Parent and policy associations must agree
Select actual published method bindings
Declare required project files, origins and lifetime

How are gaps and conflicts retained?

Missing declarations: retain gaps without inventing evidence
Methods retain their required input footprint
Layout reasoning alone cannot issue C or promote a candidate to accepted Q
+
Every step needs a basis. Every stop needs an explicit reason.
Basis: maintained Profile and design-only formation declarations / no execution acceptanceWorkflow / separate from architecture
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.json b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.json index 38eb667..c875cd2 100644 --- a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.json +++ b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.json @@ -1,5 +1,42 @@ { "status": "design explanation / source observations only", + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 648705, + "outputBytes": 394280 + }, + "sha256": "42c0dc7d8533dfe90d3b0a4793ae6b47bcb48d85dd6a3d5ebcc24b78bac9a0ec" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 648705, + "outputBytes": 616236, + "selected": "compressed" + }, + "regions": { + "workflow": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 105747, + "outputBytes": 105747, + "selected": "original" + } + } + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -12,7 +49,7 @@ "x": 0, "y": 0, "width": 1120, - "height": 1056.4375 + "height": 1099.9375 }, "subjects": [ { @@ -32,7 +69,7 @@ "height": 69.578125 }, { - "id": "acquisition", + "id": "requirements", "role": "default", "x": 467.390625, "y": 244.78125, @@ -51,15 +88,15 @@ "id": "preparation", "role": "default", "x": 893.796875, - "y": 255.96875, + "y": 244.78125, "width": 185.1875, - "height": 88.765625 + "height": 111.15625 } ], "relations": [ "(confirmation -> selection)[0]", - "(selection -> acquisition)[0]", - "(acquisition -> association)[0]", + "(selection -> requirements)[0]", + "(requirements -> association)[0]", "(association -> preparation)[0]" ], "headings": [] @@ -72,12 +109,12 @@ "minimumTextSize": null, "samples": 0 }, - "inputSHA256": "98e43fc71481d96bc2bde2f1446518e446753d9f1816753c49e8782176153216", + "inputSHA256": "6006f123372675898b393a3dc4990c58bbe6a475af429817804ed368bcbb436c", "scenes": [], "svgSHA256": [ - "a6e25835274361679addbfbff2c32586e53929e32807554f46c7cf757642323d" + "cc4523a8d912e556e58dcbf109c03bbb80016731bc3c95e97905ec0b0f807b36" ], - "composedHTMLSHA256": "e251e81574b0187f8b0c69c97218f5ef6db88401dfbb84fe6a0a722ab0a6c6ae", + "composedHTMLSHA256": "01711c28d2efd08247854cf9c46cdaea1163dd5235a35101814fe84d17e4e6cc", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -86,23 +123,24 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": { - "workflow": "a7510c1836a71ed9f2e387b698f167bbbd8e29192917d50284b4b2a538a4e73e" + "workflow": "7536f877458d44d477aaa4e98c9d6d9e1020cb9021f26d0e287328226a7bfb5a" }, - "htmlSHA256": "407c4f651c4c89730ce46c79fef90e8414348b9d9766b46dc62c676727d35c9e", + "htmlSHA256": "70ae94134531efe4970545a8a86d75ecdf74bc14ac4849923dc50d5296de6bc5", "drawing": "precise", "routing": "xyflow@0.0.83", "assetSHA256": { - "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc", - "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491" + "@fontsource/inter/files/inter-latin-700-normal.woff2": "6f56409fd3d64bb85f7d070bce20749db2d66b6d63cec586cc22d1c761be2491", + "@fontsource/inter/files/inter-latin-400-normal.woff2": "8909904ab6c872eb994093482a88a28eca2cd95912d7b6fecd72103b0dc07edc" }, - "pngSHA256": "04890b275b4289d5243618dea5c2edb07b247261e0745982aca205fb643e16d0", + "pngSHA256": "e3b3d98ce036fea2a3ed3e29a45f677d75dcf5435b19d46eae03061484e127f6", "browser": "156.0.8078.4", "width": 2240, - "height": 2114, + "height": 2200, "scale": 2, "bounds": { "header": { @@ -121,17 +159,17 @@ "x": 20, "y": 435.9375, "width": 1080, - "height": 315 + "height": 336 }, "checks": { "x": 20, - "y": 762.9375, + "y": 783.9375, "width": 1080, - "height": 181.5 + "height": 204 }, "takeaway": { "x": 20, - "y": 944.4375, + "y": 987.9375, "width": 1080, "height": 68 } @@ -139,28 +177,29 @@ "sources": { "docs/10-19-design/10-architecture/10.31-architecture-document-and-decision-contracts.org": "ce28501daff4fe5eaefc763f545645c2fe695a3354bcdde52a3645d827e71156", "docs/10-19-design/10-architecture/10.34-case-design-review-dossier-draft.org": "3e3f75c8c3fe8565015607cbb4c131c231fa83f076588fdcc43527e5909b1981", - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "44c4adf2ef884d207c201cb2a1f52dbf0d0eaa3dd3b27450c938f9a54a614e29", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.d2": "3772a9000f7e22a661036b0b54ff9341f1f3397bd337a1c3e4506bb28aa3dbb1", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-formation/types.ss": "d479a77e2bbddbcd764334563174578d40e7382629c464410761444b384e8907", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/comparison.ts": "3a5f476766cd2873a83cf7664f9f724f99dcf3179d4122e8f05b28c615c6d49c", "packages/render/examples/library-case.ts": "48c17b7230017b84a6c08db2de031e5c9bc01512a6f59f59abe306640cc0354f", "packages/render/examples/library-case/architecture-diagram.ts": "fd588a69bb8d415b76fbefc8643cf1ebf3527b6a5eeb2bb20d32bdda5dcc6cbe", - "packages/render/examples/library-case/architecture.ts": "311b3bed75d08c8fd57284feb32f29bd1454585ec4a6a50b8d8e6953cb994c9f", + "packages/render/examples/library-case/architecture.ts": "65a9cfac0f2c44a7eb54ac6f3315a72fc86bda0f2521c36e355c818d5406bb6f", "packages/render/examples/library-case/dependency-matrix.ts": "aa0227233fa920da8675dd357ad89fef090bc9222434343e0cb974d5a8705848", "packages/render/examples/library-case/resources.ts": "5c0520c8c1c8017c5031870908406bb1ab2d01ac5a64bab01e0563b2bebe7082", "packages/render/examples/library-case/style.ts": "879edbe4083a27f2e47af394fe76e190d474028db35a6f97e56853bff3f3c371", "packages/render/examples/library-case/workflow-declaration.ts": "9ce3f5c5aa4082c0bf5bb863491b14acadb9d10aa10de9e95c039b2f8a87261e", "packages/render/examples/library-case/workflow-diagram.ts": "a772701acb40b752a5498927d8d9cc59bbd14dc08c04f096fe06b21dd0044dcc", - "packages/render/examples/library-case/workflow.ts": "2e442c8dd33e130b57b49baec66db4eec4d3e9b439ff388acd30b265c5ed09e0", + "packages/render/examples/library-case/workflow.ts": "f8c15ffbced53aeb5eb77285088e327fc5c70f22b38d957431b73498dd52cb73", "packages/render/src/d2-figure.ts": "dfd8821ed04ff45206d6b9e7fac8ba6b47a138426101589a760318143f3ddece", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", - "packages/render/src/index.ts": "bc4367c1acbb3b7c3cbf15885a5f3ec78ce36d8216861f44ca1a08d12dc297d4", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/index.ts": "cb0354e04e8da5716a24e5616e7bf942057a47fdf54d80f2a1790dc8c7688824", "packages/render/src/opensysml.ts": "e4c76a741d2e66b3f403f3a57691493b0f95cbc667bd3f710d09463b4b8087ae", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350", - "scenarios/project-formation/types.ss": "49605ccfa1a63d4fa31262f3ba8dee94765b93047fe3d36cc7fb23e4c9539f2b" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "observations": [ { @@ -183,39 +222,39 @@ }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 47, + "source": "library/library-formation-profiles/objects.ss", + "line": 46, "excerpt": "coding-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 48, + "source": "library/library-formation-profiles/objects.ss", + "line": 47, "excerpt": "design-policy:" }, { "kind": "source-excerpt-observation", - "source": "profiles/library-formation.ss", - "line": 49, + "source": "library/library-formation-profiles/objects.ss", + "line": 48, "excerpt": "resource-methods: '(native quint lean integration)" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 132, - "excerpt": "(def (select-formation-profile" + "source": "library/project-formation/func.ss", + "line": 202, + "excerpt": "(def (reason-project-formation" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 201, - "excerpt": "status: 'capture-blocked" + "source": "library/project-formation/objects.ss", + "line": 12, + "excerpt": "authority: 'design-only" }, { "kind": "source-excerpt-observation", - "source": "scenarios/project-formation/func.ss", - "line": 216, - "excerpt": "capture: #f" + "source": "library/project-formation/objects.ss", + "line": 11, + "excerpt": "purpose: 'declaration-layout" }, { "kind": "source-excerpt-observation", @@ -244,7 +283,7 @@ { "kind": "source-excerpt-observation", "source": "packages/render/src/index.ts", - "line": 50, + "line": 62, "excerpt": "isDeepStrictEqual(saved,selected)" }, { diff --git a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.png b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.png index 5f24570..a22fde7 100644 Binary files a/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.png and b/docs/90-99-views/90-architecture-views/90.133-capture-preparation-workflow.png differ diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.html b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.html index f19ff9d..f613c95 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.html +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.html @@ -72,4 +72,4 @@ footer{margin-top:14px}footer>svg{margin-top:4px} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important}
Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?
{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"UP"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsbinds actual inputsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisions
Library adopter1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 2 incoming and 0 outgoing relationships; select ELK UP.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued
\ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}
Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?
{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"UP"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsdeclares input bindingsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisions
Library adopter1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 2 incoming and 0 outgoing relationships; select ELK UP.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.json b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.json index e89013e..65beb6b 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.json +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.json @@ -1,26 +1,53 @@ { "sources": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "receipt": { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 240242, + "outputBytes": 107060 + }, + "sha256": "20ac882b78882df900cf21bec11d069cbd67d7288e6961933c4c017044ee749c" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 240242, + "outputBytes": 240242, + "selected": "original" + }, + "regions": {} + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -160,21 +187,21 @@ "minimumTextSize": 12, "samples": 23 }, - "inputSHA256": "63be78f1745618eef5d201f28a0d080c369f78f91fd7429496d0d5fdd5562297", + "inputSHA256": "c9da52c5e2e14513439941fe728f4f4213c3b0bbb0e1535e6d3b5c1bae3846d3", "scenes": [ { - "inputSHA256": "26098da9540049e5ec5d007ed72ad5b38ebb5ca7e6ef69e1c91a4d2dd6ec65cd", - "layoutSHA256": "db4b337396836bfbce2a91a4c60559126bf81b5ea809fd301c8b3cdf657badc4", + "inputSHA256": "173b4e624922d6449b75ee75851f5ee4623b00e557118f78717f89298ba7b13b", + "layoutSHA256": "75f5be1d3a34c4b7e41df85a706541d514c51a791f7b226a75cbc6da5a4b9b58", "nodes": 5, "edges": 4, - "milliseconds": 226.82683300000008 + "milliseconds": 381.01612499999965 } ], "svgSHA256": [ - "e46b4105366d67ad8e66c171ae4930f2363cbb04befd7635059ebb355fc654d7", - "d2fe1e23d99770726d5bdfa8627c2e380c79839382ccb9880525d0dc34dc761e" + "8aa822adc801602bfbab8e5994eb0745b0d130a40b537671582fcf01fe052eff", + "ce526912df0555078b391af923d40fc41723b719eae47963e67eccdb4abad12e" ], - "composedHTMLSHA256": "76f803fcd92fdc1da5202990fe5b433cb134e9185400bb4b40b7e466ba7735b3", + "composedHTMLSHA256": "ee5a0676a4302ed81bd5c167bea2198f88fff1e64690a23f250ce0875587ef23", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -183,18 +210,19 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": {}, - "htmlSHA256": "f1d74ee80f471df39ce28117b4cfbb1fc29a96ae5ee4f7d2498997cda4866f0a", + "htmlSHA256": "f7449b837fde24535088310074eb09adaf1e0cabd34757650a9e7c0e377fb9e3", "drawing": "roughjs@4.6.6", "routing": "elkjs@0.12.1", "assetSHA256": { "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" }, - "pngSHA256": "9ac66a732fc3c7de88a07d0dab2586552fa035dee6b60dfa522e1f85e6e5a3bb", + "pngSHA256": "e90efa4592ff422e81424e852393f57c27c276cb23910d46e75d912e6b6b892c", "browser": "156.0.8078.4", "width": 1800, "height": 1398, @@ -209,13 +237,13 @@ } }, "taste": { - "inputSHA256": "63be78f1745618eef5d201f28a0d080c369f78f91fd7429496d0d5fdd5562297", - "htmlSHA256": "f1d74ee80f471df39ce28117b4cfbb1fc29a96ae5ee4f7d2498997cda4866f0a", - "pngSHA256": "9ac66a732fc3c7de88a07d0dab2586552fa035dee6b60dfa522e1f85e6e5a3bb", + "inputSHA256": "c9da52c5e2e14513439941fe728f4f4213c3b0bbb0e1535e6d3b5c1bae3846d3", + "htmlSHA256": "f7449b837fde24535088310074eb09adaf1e0cabd34757650a9e7c0e377fb9e3", + "pngSHA256": "e90efa4592ff422e81424e852393f57c27c276cb23910d46e75d912e6b6b892c", "design": { "audience": "Library adopter", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], @@ -237,28 +265,29 @@ ] }, "sourceSHA256": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "selection": { - "bindingSHA256": "1108c3fce3d9fcc6e440d90ce70ef79a1ada50c43409b28decf927bf629186d1", + "bindingSHA256": "3e361595113a44987e3fbe95b12234dce0fa2f38336c00b73fbd1809041ac0a4", "decisions": [ { "rationale": "1 subjects are explicitly linked to the selected Questions.", @@ -273,7 +302,7 @@ "design": { "audience": "Library adopter", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.png b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.png index bec62ed..d302afe 100644 Binary files a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.png and b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.png differ diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.svg b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.svg index 7b6927b..fac8090 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.svg +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-adopter.svg @@ -72,4 +72,4 @@ footer{margin-top:14px}footer>svg{margin-top:4px} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important} @font-face{font-family:"Kalam";font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format('woff2')} -@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,d09GMgABAAAAAFaAABEAAAAAzyQAAFYgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhxkBmAAhAgIdAmXFhEICoLsXILFNwuDQAABNgIkA4Z8BCAFhBwHIAyBGRuZuBXjmIXbQYJA9XI8G2F3bKuWzgzkdohQxX4f8P8JCTLkMHlc2qIYK0DBG+pjP3o/bYx+elObdo1mu0V3Ux706zGe6J034rAvZXMcB3uIDWWNo/ysFdiFo/eLT6UaulanZjlbev8FG6Fi4Sxv/Mek7ixraCbFKYLFUPBFYOMyRrJy8vrPs7k/94ETMYoZK9/MbUbkx1/VzZUu3T2dHimsKL6X8iPtExsUn4FAsjlsrFOGqzppU7nu4r//TatzLr4qQyZxABvYdqUHgC1L6VlyS+VFZ4BKFef7ewdgbab0RSbHRZJXwRV3xwVwZAnSLRjkFGW6sBp1YdRS537vrPVP58LN9bu1Q27pw5vAieEniD4WcTJ32MakLURw1GZmz/7+F7z4AANMOMAssQD4eJ68vf0bWJ3PKPLAJNIoa/f9JzfrQxyIMMigCR7327fm7aVoulPyfzW1uq/dMzcpkjkEDjsZAnuIS10ee97Kg9r3tDxEVdeqzU1kS4m8iSyrRSYU2A6QjL/7K6PJOos+LN7I9qh7BZ6TogqnvgLZBQq4JFMR9Iryp7ljhlnbdHLCU8sbPAUC/pc5+39dEkKsRFD0ql5v61/2Wz9EiFvtRCsUlwoFcufvnjc3REWephtUVEdFg7NyrfGzn8dkDDhgjWB4lf/PdFX6qxsjdnjz4OyuZ72NgWHWhOdMdtlml0lV1Sp1dasldYsxEsMOrWUMGgNqYEGMQaqWVkiCZ2bWMXvGekaMeU+shbUuPRteZIyJLrrLkovju/CCILksOPh/uJ967v095RkNMOot2po2bfSJ5uG02fIKYZEI49q7pN/kOhar+TWA32GHKV8icXLP//9+pROUJIMjFDpAIzYb3j7H1+p4xft9//0Td7exgpIaZDlLFyhtj2fbAnglLqA0yeqQXDeA9jZSSNQftvzmz55Zo0CA9OlX3dgj/ZhvjcxEkP7ON5m9hRz7S50Jiy1k1SdxJmPp7LTd92iCgoDJ5fRcIABuCCqzhQTcRbjnPla/XoZpTqeia24NJIiklqZxUIrTHaQhJJXvZve1FHiMWuKQtve5BxJfnCCOzQRJM6TPzeAGHe5p5Vt/4JUgEMogMkf2UgE2OhFAGZyD6kuwaDpDcG1npJT6mlgErsUizvc7QIyI7yJMMTXVnJ8ALjsKIY5QXgvSCnIUJs90UqhQw1+6whd0j5GIOOqPnNBCpEHTRor34GgDVYYqHhxrZHs9ONHIjntwspHd9uBUI7vrwelGvvTgTAM/UU/H6Cy6RNfoPLpF9+gSekbP6Cp6R+/oGvpAn+g62qM9uqn/w4NbjdZnD243Bh97cKcx+OxcuMsTFGS9iU46Y+CI8PDK89UfjYZRJXvzRm7n7tL5GThBO4iCLDgED3ytVRGLjPcR5mnmLGxd+fQjsAKv7f5/bFT78bOPPqWtB/0//95/7x8efLjr5Imjh54feHRz2o37J0AIAh30uPFA/XO2InSuZbote7j07vJlWu0KY+jSUHylN9wFW7y4aajLWvb9C7VxUycJBMK6rxV4zejya/pWf3g2nrGwHSaI61tkRncYgADHQxkYawnbBClVD4gMLiMSdXeSkRFG4MMHcvNHX8CQrIf1p5/eijVxS+fSkrd0tg3YyW3rbCsSYU83YiGtlHgxUoVXqOGhHyaI370hhNSQ5Xo9D+WkFrS+B4KqGqKtKoQlP1bNqBBqkBvdCFTlB09VOPqEM9Yq0c3ISaxYjJJ65HBRBXDqWaLi1kMqlgV9ElH//gftVFENcvOjDx9M90m9KGK9s+o7N4bR1n2yq0r0yxs9MPeAL+BfNgoIbUtHdjRR9XhLo2pl9BMUHRiWwwMORzDfFXNchRWq8WgB6v1hkLW7bh0OwcwO0EOS1qMttcORGwF1FB5G3jLhmUd3Un9Gx0eDqBjSVc2UExYRYZ6JQDhBBBs1fx8OKePeGrF63cqIKCXGxnmC7MkYoy0MqClfifAN+oRTRkvQCoo6M8YJTLhlBA44HEfhcVtkQHQDMRDIfAl6/cUnflLpRVrTqWwNTtLrj/7154qIsZucPmeKEsRfvgbiURrRc4zbalQfM1yKHCg6gpgTUDFOnhzoJDdc/K43vd6yQvXndUMDzPdKrv7KiGwZnX2VLDLockPioglgRSqiJAz3iPjteyBNUwn29sUzLhxqhoVjSFBxHQLR200kpiHGqIvu35TP5p1tLmjGDCVI38iYpQT5/DuI9AWl9A1O+gEv/UIl/UEtRRAkBY0E/RepBCEn7qtswZVsw/XntUZTXNt1opdIQzrS0CukoQGkIYE0lEcaMpCGTKSh10hDBaQBQQEuFAcGJlyUktJKSgJ4cdLciBKxaLNoWUuZgNYFG7Z0a2Jl7qPWGatHqELRwphj2UoqZmt/W0Fq1e64C0nUCA9qVuvYfTh+UJxoFyBcsyG3A7/95lRPZC3VMHs9Y4NQoK15HUE2b/8aNSk/UWRshYeJVR9lZJsSg9wl5BYjCHVveRm/Twrf18EPjDXeH+H6FmJ29XrGDhFy5MZBwuZnUN4Yx5IAitiBtOpGkeexyYWLjIHuzFd1lv0202d1s83M2afqfDAZkIhiR1iafVYux4kHL6KGPw+TYSRUZDdqvkSkM8KDD2Xdd786AchNabo1IwzIhswIyUn7DHjRxfEC/Mb9//Cq0VHNHCM3UWlGIR4jUKcbd15Ab+h5IOfVTtXswzop1kpy/xIMCAegwQdixvjgGgGhdPVosOZzFGIN2cLtQLXtEZ+RmfDyBqZkCVWssMOFlINDVRiSHh6u6Kww/XT2DZMg79y8zSePQvNUwsyNUv1Imw9FnB3iuI/8htixE6ePErt21PVCMPuKnacB5DJnCR6SKgOTyXCooEAuayk3jlEKHFPt5Pgv0SoQQ8Ae88GFrBnLefO11TpjvCHdHnhibeW1g6UHW5Oj7IAuepjF/kqtbFj1TJ2nKQEm5mzKcYbYDpn9B7lakKOJwuvVYo4kOedsBcOLeeoBKtOCkcUagpaMsUyn2itNsFpD0Jox1qHn3miCzRqCtoyxDZXeaYLdGoL2jLEPNT5ogsMaglxjeJDzURMc1xB0YjydEnuujrOCOYd7cq4RLhaQgxwup30O3qZ93qX94ftBDh+mgw8f00E+pYN8Tge5Koa4Toe4SYe4TYee7mg7yNkvUH13PgdOqeQ/bP1ceZOVBIE0DTsIqgfmtH9jZGn93URvgFcTqPj3J+iQnY0LECGARIuxvM6QedcIIlAKtrijK0ZyMweXIbMgQ59aVsbzsAxKiUOSpgBnymFDJl2xqZ04MkCsxAXaiPlOFmIRrLQVQW/8u+0fZGP+3e7vj/RCL5Ri5w/DlNEazgbrSZdhs9AhBky01eRw+KIumhC2ud6sFsd8MvennrjQHnHG4zq02/l43qbjMnY1ex1CXMKsM1OIPa6S21pph+tm2I/9sjuNrtmhQp5GD9jCXesDApB2VosIa6rJIA0xtHbRY5koKotBlYaQDsIEh13kush2ke8i6SKALlLqoQ4bt7EbvwFwuc19DpA3mfSO2BJ7YiEGIF63iC7Y4ANAsONS72p2tmZfs9QMNYNSNWsY7UtwtoQSfAlylbn/Sq/FKe0DVk0vmWcPAMHUUTR2djz2YwB7KukEkJ8Y1NB4pYRjY1LjmpMEH6OU6WtlTXo4vG1+/8f8eNRxSVqKaU3YXn5C1bFeH0L8ugTgQ2ZVjsaU6r+mo8r10sqNujSDCjJMdDmRUQE3ZLQ5RKHtDLT0sYlRlVPcA2I21SjzqM5rOtIEidWeDdvm2DCEFPWJncw9YDFNJIUDiOWxgIAWSkcbYA9Ml0eDM3o380QpvM0N2IlfS0uvS9gcCdPlxkHSmgCvtPrLrex7gB3JYhyxHel1ONtL/YPocsA5sG8CX8Jf8SXer8gJIm4Qjlb5WysYdtk2YbQnpyC5o3N07EOFuy7aYd1Zz0anpH3HIMUcZcH+eet2ga2C8zCrr6LQhHm+WfWjsEuwC55duoTcLs7meUmXltfgcob1OwY3pMlI8MaMIiFuHo6BSPN43JWKU1Q+d8s1efbdUJh+1zcxcs1n3CFXXVdfqC4Wk/QAUtbU0o6gymdn+Ya0fOz5cWgDsahyi0xhV8QU87kttRq6wl7TzRjVCqTq55roYxW6RLwDYqEkdOSNjXoLTTWVOyhKxT2XAVWRbs1nSzRk2tqtclf4LbgqF1cRaV7hhEDxB9Y0ud8+HPK/97AhvfE4NnCE5Vp6oCKoS3Rhq/ilYu80XB4HVqgckoOvrVF5aE1eMSO9rG94y+qK5qasNGW2dlKk2s+Cwk+YbF06TQHrs1BevHhYVCnK+pypRg0KF5crW8d0aRZ8ouLcQHOCgGX8ci+d/HE4GGCmLtHHWpnVp8GT11HuibqgQfmFHlDAg+VK5kiyllXfGqv6j0KFLEJLkC6mWSzrlwtsr5ACDyW8N87d59r4k092DlNp/sk4SSf/wb2aiHkKCkOqQPPXcvY8m7TfFzrb+u8pST0IrcOOiBZnbhxR/q4ixRwJsa5+LuKJXf0HnHTzoMn6mcyUlpKS0LUvx4B3ykSK70ikYRfYAphviGJibeti1NagLTBJ5gMtOoano1irQQaf67Prhz9OxCh82JIHkusqr9H0qMrl9jxxXrG6BCkwEsbBA3P87cvUxGFwI/qlQcjJQ0nhIUU521w0nheBpgCvkPbaWZt/yG0DSGDYsS53S5QDRCS+RqfwOOhBSOWuKMJjHeMdQBjZbJxIOG9cZ8aJwkjwLSwzud3WKv3u/mPEHq7Ygjv/vzCsipZhiWEpF+tIqz0hllkWFBk+4p91gvSfdOWrirljye3H6rDHe9Hmm3viOknTbnAHNMqXdGENfbsFGxIW4SM1M41AgATegiguNzlMgyOtJ5nHtCVbNg2ASMApR8BrxSNQBGUavrnkVZZnaAwl/DaI9UcckeI+TEH24LwmjvXZ9QD9jcPb6PMhdnSqeMGwjUgV+oQ/AMMdlYU7HqQY/xPKaV0xYj7hjfkCQX+uIC3qYBOG/byolIMh/+Ydj/Za5+vOs4gmjHEtgebREgqPTJeICkrrgG3/0nuVEYt1lOWWSYHhI1RwW26tYDrNLq6J54/QwytzR0rvM+/wdGtZErlz5wc2qimm4cHktvO9QyfvX9hOCfvZ4A/K4pReFcRshC2wZSqHxb0o5n5dZDH4zWgFTSzX2z8EGUd7LctTQwrG5curKth08TtLNy5wd4zmsm4brfC5MM1pB5CcZbHU1KI5DVxhF9JrUlodydBHqlzYq0hk1aT0qGvWPmWr3haPWA6a6pr9hWHgjk2XWxw/N3i0PV6eidHaEm2wFwQDe2zBC6SgW3d00+6y7Wb/mnJafgWqPXH3Y7D+WLpWELrSiCDBrAv6mSaMVSIpf1m+068Ez1vWL9keXm7yt16Y+Jov6fJQsLCWYymRnE0nQ94Wc0fIN8AgFgk8xo4AYa7ZtDLW40cLF0HVgZ8GMkQ6RycC7wQRQipSoLtxWMWsxMyUcG4U6GtOMneVCN9FJxLUQIP/VA0a4kVNrDYeN9gCcTZiSJgAw50jfhHzVmtQl+rf8iLbOExQzkgbL1GtAWlCFI2UVXEsK/K+XtY6fKege58zczNyqQVb7mGtUjei6OGsdVrlO1CEXrFRYyb3YoUrSxFY3duubS5JseS2Z7K82CKLOWMi6xlmzqfOY4Wqg8eCzty2xLFxOGcX9LkeXRrylVLGtRPuhKJQUBg9fxi2LbCzqm0KPq9I8jcdIBtxDL9pViCwWhZa9cZpSds3EKDDY3IXSJyKeJueuyH33nj8UrQBo/tg2nYengbmtPELxIX+y+yyViW+aMJqwv88moITJ96dkyZLAUyLRU5vF8JEECxrZ6BPIY1mTbqNd1AzdXPMNiKBhMPLaQqVGOXVcumMFJWK5R+H9t2QfN1eV7W6BTAsDEDaMq5u7rIifs525h9FfFHpgmKqab4nc6Hv0gnvhGtZFaqGjtLoLQ9VPOetpiHE/7AJp6p5FYYEaggIl1CbzupKuAffVxODinQkUKy6wq/3yDVFanqenLS4kRCrrEZmEdOFii4z0bgfNoy1zIOvYU5g7KWUpkRXnQGHeTXpmYi0w26p8npcI3eNTev7TCBVNmajQ2GtekPOEHHQMo0I0ocGoCltLwd5ujNGqj4qFQ/Ok37mIEwDC/7xJKDxWTHtyC4QbAHDdWp2XxfsueMMj5UClnkqkY2lNLFVpuLNadV6hwn87rW6IICPaeJFIFNaK8jwsEqCq6iVnEYwfWKth3mQ6pGPW7gmymSg8FgJibQWJG7IQvnA5KC9Em3QxGwYozP6wBFvfCCPpzWhyPlyitdNaGAkxFngf/eRPG/vW8zrx6gLms5Bua+Ugd+5DausIDfUC4vdfdROCamnRNmqpGTAH7KAm8sBiYEjwoRqgY50vZNHVRD2loilnqXmfjzU/WJVsWal1qhQG91gms6CnOPF5fWUoN+tHKCerB+tbnADFI8FD4WV0D6gj6mwKdkHEjPCrrr3C3tpPvecDBofpS0wP3MHTWAsivWrmiOCbgTc0yd4N+XH61P3DsOeAaPL2ja0gvfwFEnIlmKzx1y+Hu/bdL98ZiAGvpvTqPK6h+A5yqbm4ZBcq9LaUppjS6hP5bdEeP8eDShMp6kQy/WAXDiCzB12u7j87Dq0XZ5EJ7GtJdUEvGhTN55SSEf93K30ncpQ6jKSSfFnAjvfl2daFrlXZKHofZILDJ7HhENzYUCtR9RoZIrbY1JQFlj5wdhC/6s4ObmZ5kMrpcGMKyzGwZFU4vr03pTraidCu6ZGEe1wROjmLVgFUYe1fPMaUGnj+6Rlnajmgi01er0jmJGIj1dIC8RRs3wKD4Qmk1eLKyrZkwklsEk20R9zx7DnUdS/ATs0iHw/FXKSo4/PfXYPO26vYETafjF5L8RXSlRRenJL2B/LtcrPznM6bgt45cQKUqfmXHGVd0VDXi7WqpfLbsjOpxwpUeS1raXwnw8Se1DlCaE3ArFfihObvqOEXKQioiVxIfCTT8IDzWyZljdi2wFqNPqYzNdsuf3Vfxbko5qwPTzaggc/FVGYV68iExqG9LsuYR/B42NJ1Sex1YOrFWNPhrsG6XmrqMrpAkx5o3OAWkIYWd5+rB9SRdBC4cyga1CaOXPNDA+33rEEISmbhrKy4Aw3jAXkvP7oXaVvN0vpB/mTRAzEuvZGg0ixXpnhX29ca2yRpE3qwTkd4x01JKnYiN9z9L1lnLPOWB8gBUeW4C8ZkIDbf0KaW3k5+s38Iipo81eoulJ+/giJP/P44+ozf5SKd2vPVSFQ4n+VccntCFnqv2OzMBm6zb1wfPZcJ7p4lraDRROhZ9NzU89hA8KKkWwdS7RBH6L41wb+sWezIv1uAe1KJOXdLazFkinvxynuBORymos1ueRKIFeX4xf2sdfnSTDXa/Y6exUgq00/mjP4BN36PVUaOrKhb7SpNPTNsujj7Yt0VE8xzVQ8enDEyPewxu6MInr4DiDu5kqi5ZJyXvztepK7b9cTBXLKL1+T6+wBbPArg70Wa7yNnEbbuo/Hw2fF3gi4Bw/g+2fkIxm+uH9Z5SsbfF0gBW2xpKc5fvDB2wpzZgTGcJ7eyjhRoU/srM7L8Qq/4OsljAtKU0Iol/iPnGlAyg8V43MjzsxD+SFh/E1h+ZnFgp72t1ZbTKxj2nn79IkUFcsnejI72uOnL/6h4xD8d09EOwR8M9sTtEzR3i8/Z4s4ElNAVZgVdUVyanFMWZdOS/yZM2KAIAnNnC5Ylp1ucppc3MgwHfGOa5b05Pkl9AdouOR9uuQt1xONLQujgHB8dufX/OCFFVixhy4eg9WVb10Lh12hHWlNjGsC59qPoQw2pnxZHEzz1kopbaMuV/IpcbfxIurFlNz6Kxpb3t82cWaZgjsMZBdkyFfZ6J1HXuE+XEJvm8X/JH1b5PH5x2rP38exHisljz5HroeG3O1z6ZFIgQRbNvnzh8l1kszxou58Isfpgm8XnOa5OxTcUoi2vxVXU0sw0ilv+X08BRyExp6TmGehy5XxMerEdX1IAxgz3shgzwIDg2xHeuljHjWC98yr9FYoZW7Z6dku1D9LfJmX9E2r1jaDe5z1QonhvVxY+ZiPpeJ5IOPmaf0Jb09q5+4NOYDAps0L3Q9lFTavXbno+7d9J/xteHm/nTvh3BPFfnlLsmTPLUriSdLPydGq7itda9WU0d0Y6L+94EkgZaENiXBUx2ots1hvfKgmRjUBj8KVmBZwr8fsGdFvo+y1jMCe/h9pshhEYpGsiWW/8XTg4GpsHgvctoY86R6OUFh1YezpSOIXzGPciEAmnIYfx4XZ8Rxztl8AsQCCqniC5rSGRD9fGjfwERjOdNUvdjd9lUbrYURaE8OsEVVu1+RqOLKQI0zg5QVgB/xjMwfFKW8+f+p8Uu3gLXFmPQkCg1Mdjqp3KdqqMNoYXWGSNBAiqg73aTlmtBzG0EuBmZxHFLAHFoN47z0fjJ60y2J/QwVrb3/sg9ZfiDCfnEIl+QwcxESCrSwNyBtGQdhDAvFHDdDkfWhSubiCgCxbuw4VciZ14PPoOWjsD6CUXD0AsGYPibeEJjefLIBSd5OEx9HwIjU51WfgIKPehyJCFSx7JBuwf/S/g9SB3W5FOOhFWi+9v6XYhORWU9disKEtNJcWk/iB8b+UWlzkSPuaBsUzVF6XhHWgLmWvzTKCfcWtJOo3F3cR4d0QvTAfFc7nroZITgXavdoA3CEdXuZnWvBuWqB3wS8zrhvt2rf2i2wCFCJkQuJQEneqHSMOXO6dWz/vbTj9o8M7nJvQKsuJjuZuOKewprcTrAxobt/PB83ufU7CrvEoOtLLdc25CZYsAhQqZJHjkBLPa49W/nX2oRgGdmZxaWh3mV9SWs1l7KPlWiflyeUxO3sbinyM7AROyc6F2Gvh2YrxQrhMTeprv+lA0xGLalThu/c3RnRn39/aIq8I8jQXECiHMZxSIIY4lzKJA2thsZRbVEZ515IomJNWVJBTpVreqqjMzsgWp6FxjPDu4rpj18xXquc619em496o7nd927J3eKheh+PjKQWBkM/fX6/Ys4nmfvuznzP38nLGjiK+PM2KEMRjqF9EwOteZ4j18gNgdnwSCbsiNWAcaBOsZW8c3MrCGJMSvrj1UgdXFhGEbwYn3ojGZ9AptAJ/Ctx9n9NO0f1iEJN78HYE7lVyDHqdLVZOu6ah2aNJUkBow8dIb/duGRUDdGvDYoyOz95g1rrxP5YnXvqnF789jOafIZC/5k27EFvi6B53Gl6ha6LATES7F6uxpLZIdm0meTFe6Vgi2llMpwrrE2x72QXLbfjOpGISQmPV1PG26EvoJPdY+qsIZ3vDVN3mfWkX8jY356m8BU01NvEJGn9Sx1qhdePXw627MVYi7qA0+ZAIu5WSURVAnVo8SX+Fz80MB1nleSzcYI2ztiS70selXJvWET2pmLSuqkOlNb7GVz8SbiuLA+/7j1NjlKpMdDCA0a1nOqwIcqGyiyw2lhTXRZoNohlqSdbGtjdNeQ0S4qrSiGw2sFBtI86k0j+czxsJuQ58+qaX2aiv+St7sbZKG37G5dSLy852LilKk18F4IHtUOagSg+2GqnqqfsvRaEeG2pwj1OZDmFj70vG1IyCk88c7opmoD7CM/ZF65xcplF0sp5rKik+6IWc7jw+GV5fMfhcaCkcHY++2X24uz/zRwUsM9b2f1Um0JXnSgim5AOWWm0y1128E0LQB3Hcu13/VvD9LLTQ2yPK9ug6+K5cgT3lTV3oebln+iYJuJSTW7h3zuvzWl5tLkxuDkgjO4YfuP7ViOEgH05Z4l/J/dlo1jBTGjI4KrR8ylnvKXDcv4yXFdoJ07DReE6eIv3n99RRih1jkl1glSNTWlyEhudYkvpmkd291FnSoyvMYJq3DigPxMeakO8lBZRvkcEOcOnnnz0t/jFnSOLq0DHNCG76QnLD3BNpMhbEJz4hmJWDSxsR06wCwUJac8ec7XqGGUESe3Fh2Rz3ZCFhhrfiZX86E+7R/d3fk1VwzLu4no9GmF75A36A/nlqfdak4mtKBXIQA68QxBytrIaTxPfRO6Cu7EgKUofMRFz+f3scjmUS1+14f7yZJMAiVOW+/2IjDGxHKSxk8ODxa6gOhyq4vvIbr66LzkQDDpEs9Hc00HR+y99odjGbZVFu+ygZ3sJ/S/plL24jcnnp34Urp6ZnG2dKorUagQPlK4qmC8uLot7ljUPW5NoCNR7aKXwQ5zwfYuDs3Iqm2pePhXs2ZB84ESg9fkCQiCNyCs39HMX4jbPDDq/b2X30uKmU3WqnbGmEmOKC92HBwYimlPPw71G+GE0KkdY6ZzBm6XPwpqSCSuwN910ixqyhIrgR4BSKUUZpjTGf1W6qU1BZ6svARbfh749HgWfEiUplrHaq84o1wq2MUhEP0GY6K2YDAgc0QNcWwy+BTWGGceN+h08RrLUkz1/M0R5X0VowGhXc+pcvxUMl2hIi6BYyFzMgenk4gNjnOHDmEdlQpockVEPl44NFJwz0TKJlk6BACHnDi1kf3Wbom1oyF3f/fOlEcuMjz8u6ndV1c87UU3sfd7sQ2RGMoKEDbNFIjJLFGnp7jZsZn+35fyYwrZT+n5Xg3zaquoEUCFC0R1EYy+2iIxAtXZTpBBSJXWvaxXOLHebCqvaYohgAVHOoHDpyT0pzar4sATrRZlzkzMr1WsTd9Uw6rCHh9a7lJ28FcsBr2dTtlyxNQNZ6EOmPP2+cfS1l4K3aKyC9rRDHLzvETYLwK9A1xYTm9Lx1UTATSofYeePfrnO0D1ZmNQwmXN1Vg6ov5CEhMTiCaWYq/GaEyJRMBUw5Ok7aPBjjLFJQhjrZ6F9ynpoZFLyrWEhibQtCc2Mkbxm/BojhPkMi0RwI1gZM5HDufiDe6ORiBYdbkJ9RO1BR7UTaDjb5uWUJRDhF531HQqofIaMQu5I0+HMogQC+YdxD+e0EFZcyqHirFOYp2dMHFy4j2dvStmEpqWyY7aP1qi+IRkGNAf6Ll21oStoBjsEacrLaHur5FLypKJlIqPM1bJlXRRmVxUsLW9wR9948KROpmN3Txi8hOEBGS6YuFRUJffAbwWZglZShGCXceJm1B+1CJRLouguuAVmOPbLwPxtDdvJr1LocNCtlF0V/c/Pe0kapSg3LRdqZ/Ug7yn/0yvbau/lcT3Jd5tF4Xe6XtRt5yshu9nwvuCp53/uncuBIbZG67aGeUQd6bLZmoHTp6gISB/bj32JVviCua8Q2foqKPNjwEYrW2VUtv3k5aIStpjKNYuK20r8B1+3i9XwXXJllufVVLf5XgsltSCG/K7t11h61XKrZ2J+vKu3d/W71zTMzuA0InM4lxWU7HsatRWEYK+m2rummcNO91aV08f7rGRz6PY+ZLSdryPV5rKYK88NHz658u/iW29JBsNzp/Fjykz7T89Yxh2f/opn8vxMANBJLge1NOeppqrab/SeXwdkD7bzsVNEmShF3VaeWCtI8B59nhZ9uwjmutj6E+utdUqze9AZgifg2krrdcH2ygTvNWONJN0oS8X/OfObAjQNjvhf6ecFxejrMsu/lJNOE8eePgs93vzdQtY6G1+kl/mqTuLm+uUWHdUByD7oMXJmeBb1UFXG8kkMEW7R+s6WG+Wvt+ngg/k8uo8xvyEiG3Inpjodn0LGFgr2y70QAjNYl9UVJBx4RXDaLjdZ4QGawZjbzVybBviQakV5Rv6S4FD40sX7T+oXtvGu8582Gpy/DFPcx3UzXq2p4PmkTzYpgmhgw5zjZVfxVBYlpS9O1QofQF0CmCkTbD6xtYHS2luYQVO4REtkVXj7UkBpXJCkZGRZSk8ZkOD+Gl7k373IdzUtI0WSvU/+QVTRTZDjT1mnsgb/7beMLesxnKL2VANJxLnQ/k+HpCS9x7Lzv0Kqhu4bS0rasj9Ag8yeqYGnNUmqj40IQKYwycfassbLl0tLilAVk/qHCgzjmjWRq9cFdfwnD13cY+Xquc/p09nGbW59cVZq5T4iNItbTQ9KclH+XKwpt9vLqgiq/PQsEg8mO4ZNNLNqGrJNMqyy72t81tKWxqxQq7hUeBJA0DiLx8BNZQxO/++9fG7UREDgmpe3IfWIHRmJamsxpB2gJwiEYgJC5L9SYY3REqIXWOBfnQGGLJFVjwRKW29gFkRtPiGatsxiN9ODsiJ9OgalSHoPvELwif93In5o0C6k8vBuQDo3FheljcAfvTAVyfZyDzlunfD4A24TJ3cvFEUTt71g4of3R78VKGDd7obSLLIRP3KLkZc0S3GTSBOYyUCgDUlGdZCHtldK69DUvEiincMhgJ+vsKnuaUHDs+MCbwq1vV7PDiMs8GhHn63NQLSJ9RBkmT24tLNYnlxcVB48tLjmEjaU+/U3+WAPMD/qJD+eXVWvbyUnm8ApU7K+MCnotrbXeVrtaA8HoLCJ6d1njbioF5w5x8+Rn13cVbNa0HAokGEGavlFJ2awVv98a3re508Jy5LOJePCSKCdbW5NZmmeH0aFkvGg53y3raxgim/h4d4iLsmAavBEORoaPjyn3hXOiLnQ0uTo1Pyc9Wc/Xq75bW44KWCF0BMmGRLUORm36ixGVJpmb77HG3Bvfnk7Bsp11pBgBiTdkOVBZO5f77GDdYH2ftpWwxFlcHkJskDZu7cAQRl+WIHOdse4QnNbEqIXJ3uPV4FFieiU1BMu5K/mQxt5CIF+sPlwmcRfoBDuF46kvav4nlc9wTrDrhE6HTGqqDeuQlGMVxeKCebzPbxIEvdGAqM/a15Cn4SgvWMxA7HEIiDJcG0AZzoeA0ta3u5b+ETJIljw9oZVYrDo+rx+d3SOjeRvCtD3eZSFDwkS5yC3ypPSmSxyDRKx3COBe5kLOmKdn75cpWfWyP7wpTie0jKX2clDmR4yaMxzsGpX8JnERa+bmL9Kt97w55GgKhJruTkaOXycVN0WylZVBBg7PxE8jb6FWW8WZ9XT4n15Up1OZ1g7CmR3YBOPnxqxOGhnvCXE1Hhk3fOmt1SHH8VPX2iGEDCMBmGvLDVv4+p9GwDyVrrq2M284G/TA5gzn4N55x1/LwOqtuBjVdbV+nkLTvALjKapD9P3WFQEjX3FdD8SkFeQsZ7zd/6v5IDaOPlvIA4CfGvq7AptFWL2DJ1oE7wMWIrlWLTFDOG/Z+6dIQnQVB6BUd/9oaAqm9ERVQfXL+nKThE1vwOd5gJANv3i+rrr3Yt0jKozOjgCR7W/MVE6mJA1fTwq3aIlaWqt+fd2s/6MNFeaGcPtzd3VfnLuw/bNtLeq22nYMV2VrvKVW6SiUkztq5Jsaq0omTFlgbTwRI7aIye3BwpNUCt6hms71WnqmN9VQhD+wUtyx0MKo7qHsCPlPVWTXHGLUyjyvV+RGK/zK3kBXe7g2XCggE0E1MFFjna2LBAiAS8ZakH6pwKemsYqsR0e8VfHNqSx04y5KDpvmYCEvVYPl65au6zwwC7FF3qz7VsWthbpIYSjXkcfGY8A3Y/NpRGDwN5U10BV4sdXhoUMI5CX+kFGwkaK+OrAJ1U8tEc0BGL0iEME8XuSghy1saualF1vzzxDo2zHIqJlKJeZos974ieBkYkPUPERd55MuqdZHBRXA8J4PGOjD2perFrLoeX5eSYNASrlKA084d5sT4mH+oqrjtg4YMQ7N7oiv2EWGTbZ2m1Jzycz08wkuVmxNZb/llLyStRFm5AhNP81eYkE7X7a/KZxp3M2ETbYGeZJUAZnrLSDOxQT79Kd5tVhRMFeEBvfrlWukg/tJm3gLUg5DHR5dP8ojxaHjTX6PxiJ0Z2yixYlgwigdy6IYM4Mum+xtHAiVvja6/oqhNX3Tk4g61ZRMYNU/JnmwRm7TU0tepHRzUzYXN0n5noqCJL5wfMcnhvhXgBZ5RihSL161zJBoFTJpvWwwJSEeEiipOdl8ePqDRP3PvpIT8jFpMKipDHRZK/XYBhNIqDKjyRXkPjs8KTOAE4ai1VkheXzs8o4DwmT0DV7B/uaKPG1hQSJKakLCWQwOXxFpggm7sckZVi6IK5tVM0lRk8YsS/a1N89pn5UknNhCBbQjt533vLoHY3XSAVcrqalUfCDMQULMm1AFG7jXQ+fwPdP6WDqcu+9HwFI6qtnkGAwa+WQMkp1MBdeBDuwyMUyMtKDZnOZN9Wqyj37IoaGYvc4Nkw1FWYXesiAXJnXbIJrKFk1azKcbTj65czWVLKyNtnoC9rdrf7/9HS7DUXmr8fPA5n8zZ8RDM7FOyXOxRhiUlFZnNMO0qwwl7bRjoFZkKtm72GkEjHA8BKYY6XnR8KPAEEuf5qx/lDd5lPhLNp+GoRCizdoyZtwthVDeYF102aTDyWSabHdRVsDrMKS7GeXNGQKbuxHjbwQqrqg9UMEbvKX6LQWK7IYsskGHQ45XIi+uICg0EPPp+E+TcmFwKjkHzWHwTbntVneoMAONjne7QqzGod8fPe8TJ4KlhHF319apuZu2FGeR8K/x4n+mdOS+4qtnsYa7stqIc8CGWyUktj1Nyyvi2vI9M9IIlKzGisZemx0DY3J/QEGdvrjkZjr/38jpBBc5FYTxaEkJadVQKUqgR5O/wIIE8Q1gFt/YgzhiddIlf6dQKfjcsMuOXwo8pwtcbja8ZPg0Q05B/OA06tY15eWbMVltdVVl9saIjmGGQ/lCi9jukRQ1lHLMBflVRm5iSvb+SYPck6MV7RTcrMSVPOgNGvU16lSe4pPR/LO/zQlUpazvYEad/oT4+DMQbtfC4s2rO7oPzzROfXxnqtvM7Pq+obnZUbevdKjPEJna7Q18oV5lFjWIUAiJTpK4koRv1fmsJqp5/DkLQsqYPmOFnuMBgF6Km7FmeTqD4TJpCEFx1G0KBv0LBxXOvTvIDNMGCngbTiL5EBmFY+6fU1IIXubHSJiQZdzboAC/0johP57Sb5OXwjBvuXD5Chi2SFYohNLEWWerxfDSrf7nexKSWBleFc5RmP86z+myzdd28skEwMnclQwQt9nz97OGt+e5CzX1uU3PzrdHSmv8Z0ZKGuvL0rMcEvdod0n6+axqKDHMaf8i3kWFz1czbv4ZB+n4cEyCCpseYbNzXoCyToXw0rJr+4pY/nWTqM/70ZizOZko0gbIRi8C/Nlag4pJOqIQwrbhfWMzwTSLVeMbn85NN1vCoT7Id66msANJHHHGAspZqhtk4UUqdhGfhCh8ICTLTEQsSdsYl2j7+tnB6GZdEXYX9zXqk/jBH9vRj9a6XpIsDwtfK6vrjzfA6/GYXUIRSosE5Tny8ygo7UB8PLzej4xFnUaoAOgCjuWx+JvEYnTBRkcvBhBh5PHg0NdvMugbGnhtSXqqL/AVKKBDVDZcX7cW+L5/zpMaqcFHAayx3qaUv82SpLNeKXtGTxXRfN6dKLyU8HPBfOZx9X/YVfwXoVTLT1kJschoU8XxSPzCVwajnZXfeCZIrKH3c3hqkTNT/AW1pJCK+j0o/ZA7BblNyo1l8V7HhYsKaejfQt5Kfcm85XGv7bpNy7lOWSb+XRV6fuLAN0neiobUcp80/aqBgwUOW7i179EvAoXUwc/Gq5whPoXCudNMpZZmltvNd83RiCsuLMkIC/JathVwMp2y0pZF3o7XYQdQjJPdLKT/0bXh+AgRVi2skeNAAiMv52Uo90NyvqRWkKfLaMqZVgqRXgiqUdooQSDKyPrdWsQDhCTMZSBGebTWs1VGhd8y4i9jb6f2H4YnBcgrt+ZrpKCtH2P/NaHTXlZYr7mrP/70QarzKrH7bBWJzTkaS1m4MDL1ZqIhzD3N3HEeLXRmQTT0yTDCf/RpJd0WRvRRydfU6XhDOgHdmv+CLaDkXvsrDrIM4nlMXWmm3oFt8FU0mE5TOf6/53Fplq/t8ddbjwhrD1XhTZLTMf9EVZHZveOX8GauMpfe7pGqWKtDjiLEER4dIefTWnnJjEqfZcS3AmOfcaOS5eOLOJ8N7b7jf4wnOlV6MSE2DuMXwy7LhjZZ5CwHm2bbHMHo0leL840UcDO/WY5BdB58WsYLNKFcwSiz5CvNtH+1hyDdW0sI4YykK0iD84jekYs/G0O+6H12L0ZqF+z5JWNPL1b1jpLhJdFBpJzUk+d7ON7AyW6Jv8alhEpDmDWLY6dvc/hRT5nFnLYZv5N2KiqCpNNLMkCeFw+FyyGc/IVsqyUyU/SPrVUMwybSH2CS6NPpJ5cJO4jtcmeiBRP8KWUgBb5Fk7jn9Z/ig7x+CgLR0knZ3kibkQJaWwsKU/bUgvmahKz45avA51mBCTxgGJiXjfoOaqxLynYmfvIpa94PzRLfkF8bqQuM/hVG8ngjTEqMsDCa2ynv9jHV6goKltbWg+B/sVDB7lFW3N7wkXs/Is3Uh5vT9Zo9FVFXNjTaUWV+SLiyTD60NQtb+ooVcGEm7PKrRrwK+AKYV68IrngQ772sPNgV0xLLr82uRBnilwlYiLZmITAzDG/bT43jJXPorbI4DokmrES+wmyH5fSQ+xHgIvwzJLYBsucuxkztJVeYBQlku3QLP3ZL/LXa3IYkDaEXZK5edrRBGV5OiRW/+nY+CWo65RdNqHd9Q4jWjXggGx8++2QoI7RVvaqXtXxNnvKH+6CbK1Rrz53/D16tPw3i0jU1vUVlESAJjUn8voIDKbOa+thRsKiSgWW78+6f9aaganmNd4oJdFGW0XyS8sQwuUNNepcVNBq7CXAjjHw0/MMhe47aajBVyKey7mfYp48GNdCE0YW5E/FIYWtVcKUN+ECPKIjjDdMKw6gAFveh7HJQoRahTdpEmf2WFmUZG6sNFEQbnfB5mBcNE8013GxdXDp2XcwcyDAwpvBO9dcTan/GNxBsEoVLjqvKTt3D0BY4Sh5Bvyu3hin19cjxfpYrfmAuXWvQGqOLDNjHT7VzOo4FbMy7aMHcT2ZPKa+Ai7l3T1fumtFRvoRDYAlvm9/lW3uaQsqj5pYcWPMy763upht2tXzxeGMTUi5Wfalu5ihQjTFWaWBf/+NKoQZlLUqNhiumehz2kUWqpZ86vfjcT9PjFOwr/yUa8NXqYkvBLiunIrqwPw/5T6gX4Uh8Du2tpm9iE61zlA/lXNVs+sI1CURcp4s58r6PTjEI35gaiNogQ0aqigsjx59ZshOsvBWbeaq+Tysbc296u0/ZC14XzlFZdW21/imfO0jG84cC9qTr4yBLqyX5CMNvWHNY7WqU5nfbzJAPA0bleZRYnqiuIFO47CJJV1I2SIH0+dnGhsyGr80sPergh0BKefAGxKDcSXt5F1XualOvGR72PeE5fOU+qHex4U/BLtjZQh0xky16CtD0ZYRkm58JKJ6Ph7H+u/yrMVamwHNZvzrempeaX2Hq3vRCgEFkg7wEPR6Fh8KlcFbnNCEhIwmbYZRaAvJkIw7/jwNBK5iNK0Ig6AX1RnLiU9tk4xo0bKwwQNeelzQwjdPrZnY0whXR7QJnLj8NyDL+klY7CjEDsOIcWeYd1wTovtfWoNRvPUN3u9MACl0zBaYYnKV53KkEub452RTx0cdSyoFnUM/8r0hnzNgp3F39oxJn3s6Fumzu56s2FHj9h2JX5MWZhr7LpVw4hJy3Ju702t3vPoRZw1Ftu7Avs3sZ5RiaiAQnitva5rb9eshLFA35i8gBT3ciXkUyIy/AWz034qqTJYZrAY63O8SUo1tdPvxO8y+L0tiCbNRfiC+lPI0MDnS1dMwa1JRpBxOF0VqSc63BHf1UCt4dclG3SuS0Qp7bxsHvUNjIJcSmg+obBMqFC8tluxtF5Il1pVr62rke+qm/I/ZSWNuVowRZDmy5J6UV8Eq2wAWSGwY7qw9UNf8sJf/mv5HCCuASd3F5CLlheL93fNo5ulTPTmeF19/StTct1VmjMjqMAXf5+9i//TNPvtrVD2G1GB0DzctFfKSjylLA30qk7X/iufHCgcZ8nKA/4NpSNP7H/pUA3Pkfnxc55WSQhny4N1ihehIQ96ayTYf3fMxWXWHPJfwBUvAYrTAP8FdUE6gAsIrGbYIxVIrKY2koyBQsOqNeTP5SQphcMd686SJQ8owx5i2J7r8cZeUHbkmxJdOq9UwzUddpD1mJXNvjQBJqKsxYdmelVw4j5CZ+FRWtocOrrfP+E9C/jOeiyJ+pL2bm7b41P/Zli59kFB3/6993WsldSIc6ddwoEsm2Eaj9wNSGU9M1zAyfEL0PGjeLSC5Lv9g7i6KTP+UEYhWA7E0bYPe5oirV7Yi2J/eTvoCai+2bFBmvE45cosHZNjz06Qt9h/GVhP1Y6865QKWTbUdLEBl/r4xgU9q2F71IjoIBr/llXCdCwYDhJDjO8OixzXMWdBL4wE3ZbHXT0RByZI2KVE5qTAJJ0OyJpNxW+oAoCtiLaOV6vpf3UDEJE8b8H6mucgXPacSUFsSHnRo8yZ95AO+vLkq5nZH6uWauDCa/x28iIDJZFZQgssqScpGMMpM8IPq50uUS9VhehmBWeOrXa1Z7OfU0TlAVB4qu3eR2NZ9lozJoX4A8+X7BEUqZAt+L444EaDdlv5Y6x8aXaC0XUXUGeQUAvdn4Dh/9Pg3AHEV3LG1n9BE8o/+PEfJa+FugwsXPL/XiPwxSlRbKLBLAlmHD0gAdQDR1w7gkXfLpyIBNHocl5CchuEj0ESsPKYTt4NW2uT1D6stGTFxWduj8YFvo4udX8v8nBpRQpPYNDbwc11H726arkM+iCGBtwmxqlsYAzXMqNL69cZ4WeW50csqL8OeX+/8TrGUR7z4Onu3G93HThVW0J7rug6dkdJr3GdfV0SG9wVTOJPslGIZEMaH12MW8G+tlhQj25JOGXAkNAZ7LZSsgrfd5EhbpTIkGFOmtiiMqgSjooXZiT0897h+66Zidc1RSGfLHh6Z5bOabogt8i1n4/uP+drsee/bFvwhyRiUw4GCQ+2FRp5b5249JtIFVJNSccwdkDrdKcW2RPosVJ96z9syEnGjl6VSQzKuDr44CuY4NAb3Jg+xFadTS0OdQFd459c2lKVgimg/3w/P4nFa1MuCQp2FxZRJN1njFcV62zKl2HiKO0UXYRvCr9T+So5t1HpTWNOTFOk1jBw4mOb3CGWMWERG2aWCeEEnRAsz08oBjQeEuT8PfHFEueviLOQQKVskIoULdqDhgKFTp4Sdh7bQ+OoJJW4ugiwMHj8Re9C68OC+VdEFtUM7ZJHf4jzWI4KsXaJPE1VKEaBzEFdumxsPSPEAjS3eQXbFSTWpGOF4d+6uTYY199t96PQI4jNPQ3ZxTtdzRU2lWVota5ASmspzrnrNLl1QgCqwRdqw+a7ElwWK6h5mo0GCbJ+GvQ2m4uvXJXTu1B6pJ49+bqV7aMjQO5YsGlLU8tmWdYlwkoKawnhHeYghNNggekF46uVgR7IzT8YAHLvfD6c02CUgiAqTP5hbiIDZnOWVZDXabgIq9MjhdMArB6hGPLCt2bAFbo6T7gwqIoOXgcNMM+sgneJOH8OKsqM5Ewgl7FJdgVW7Ko30dyX44WAQVxS8R1W8UQZoiwLmcb0gPHN1p26F3EXN9/wVNjNIjcVHvhbImDspxkICqzFQ+atjntumA1LQFBmGk1i8Joum+mSExmbhwA+hUJpXQ/u2TSMdwDqpcipKbyZk8qyOCAJvCtQ1tVEQ35pORzvndcZGphY8TL+HfSOd6Odmi2PWAJ9T2baIPGzj7ZifDgb8aa++LRh48UY7Iy5DLHBCvLUZMBufDzqEz1KzD/7MGzoaFUBHleVNyU/NjacpOG8Yh8UTO1LRyn4CmeSCMU+mhNAFPj0pyehkELCnHyh/mxVLVJApAcokFVVq0Kk+xdIb3A0XIKNwQpOe/saHtfrZmrpNVaD/bx+LFLFEplTBEOij7he18PBTHoqIbQmQ2Xtxj7JzeLHz5dHw6PS3nbV2VRiNwHVSJD/igs9Ax84EFfTq5wFN1ETiUCvbhWMnLezl5sAdOVeJDleaTUxqjrds7hQgFhHDxrExTV/OecXFKYpbXQYohVI+Tpxn0M/fB9LNKs66mQXemawDWe6O3F2RUf3fvUToRbRVviU/t0snxDALU5DDFBReqT3Zc6ih8plMUOTjrgj32dFAHWeC63PhrBBd2hKjLUOyITJJpT++8NLB3vaZxbSVfQ78lEIQya78KuxMZBWObQgU/bDAWxUMyBDw8MAKc0aCkChqahPMBedoVQo4EqUvBLhR5JwDGoUa9Zu0Kxk9xSUDEDcGIyoJS7gOfYATBFu08hY3MSC5YBDJ6AIL/Tphl+JWNJ7OZKJRSDQ55HpbxMAAbg3ARILUbj1YMYREnTxtOEbwO8DqvBxQwQzBSJ8Ce7DZ4yxorkAkHKUsFISD1owswwvy2g5QpGMghSb0OJlcF9UmONNlQYjUUR56CoRZpsPwz7sRiQlPhYu06VeKpeuolwycVUrgQnxGtidgunyKFI00Gt2Fd4Zhj+9Jy7Vc7xayQI40bUtzM36lQ6Z2V92iRBLEWHnDhGnP7LrEvLqgCLoNKGD1VeIM3pBdPwqsZkCWM9/NDXKwoPgQe8xgDZENlCt0Ko52D0eWkOGlQvkj8D/OdyKgVWSplASK1IDs0sSR6ZRP4qVgHR9NLjQkT87LAaWCitenYJPX6JHab2a3EtsYGZaov2itMT0IJtTqWo7Lep6w9arcBbg0K8wrUpG0IjGR7Hpo0XZcnr5AbzGB3iJrFivYBKHHAFEyehpUPDWJGe3el+9MKCppLNNFycTsBDQFbCxxO3FsGzjj7Ew9cK+DM0PKwD0a3YVSSzDnPQ3RTFYZ7sVwKkrOszL767CTjwGMEusfEJZcJjT1qzRocjRBTkYb+Kc7IPIMaC0wm04t8ULi46/0dRu4NTzH4loFuCQgkuAkhfQDYEdu6jDNyxX3u03SxgRcZtqhSZkqLeNT2DJiOfmgh7bsgIVOqxaX3SHT8xRXM+ZpDbmSRGikkXiFnKWaJIeEPdwMwk+XURK/zqJxZsReDtE5t9wKlyfwGTSR+ongS6zsUmBG2RlxIqdTgyp4qCK50zZ8DzcPOtsUsEgHClC1B+9cdU3JAk2OhOt10PALGApob/Jlw7/9JCXlvAnH68Nf5aKx83NtqO8QDKYMjIHseSxSbzEPEZ81GWjaXWK+09IugMIPdtZZ0zwXHg7VtXkjTBdIZnqb51Z7HCtap2FbVJdvCva3QnkbgXGUEvLpkFrTzM4dEljQ5GRyJmmlIGj2gXAGwYCg2h/NVJQZa92vOcX3Ga/HRQKgIifvLICsisS/bR9k2BpqlCNwPLDwqgyqsGHHGVbq5lIA0LFyJ0MfyQnIL8+gpwMA1trmfrdE2hBi9cUoiIePrRKedBpbFpGqMkTRgn2dhWZs1b4QwkfPZgl2OiAMYbnDmoo6ZjOYGCMYjXdTgG84oDFpCw9Vv31aDABGvNo0+4TUGl5OxCa0bzPN5j21KECo2/wVK/Aabs4w5Tw8wiyzduToPjVPXvDGF9K9g3KFQMmFwHrLTerrXPx5lR1UiHDo3pAS1dUQdmRI1yvEILrH9pnkCI2eU/oJ87/9FT3MeKAIIpFn9vLidgIYEzoM8bTx+Kpgxm/DSV4JxRXEepcKeUuY7JQF2MIY4n+T/+Yqs2T+mxbmdbarVG0VzFZ2DhsDD6q/fFpmMfXGp0/EO7yQMTVtAN2QCF9PKZ21BeJJ+glrxccXpbZiBOXOkEf8X6U7J6rJPUlrsGUKg6990EWtbphjuS4ZY48VQd7AyXYuqwaCUOCAZMktipwxVPl9ieKmrxBFHboknEyX+YHMyT7fs2fCMDggF7F2bwVRMnF9ynad5tc0hBHnUSE0whbiWVU6T4AxU910riQr8SBmdtjYrVvBY5RJrprpwcj8UNbMh7XsfCMonLXsveTwjCLiHDPsud720Tk5Qj2Q0tlwTreQDIA7pGtGAf5u8DeaNflJrjy1VEoWcm/wLhRhsWWm4xPrAVisKztHNcXW1yYDPTwsMBFU/x1Ud9ltkkkuSeqeHnYyqayrJj/OvlGmbZWaH8z6ZVM6vlbmH376uOaPAnqO+6cglKLmZvfc1gbtYiPTOETCEDaWpifa22mDrlXJtXG4Ht25wHHDMak9hP8rT6xzrFii6lTnISLxlPcGyaZg8nVRBaQ1C1sLoeEVFR9URuLTTiwE1Sfx95CnWATVUMlyKBroChYCpv2+9VLvbCpuvifkLJ28+FJlW9y8+/SrxNm8n/eLzlcAuu9ab6U8+ug1zVMJ4j3WQXd5JFXzoBpG66nU+MOWVl2etVnGEgHsb1HhNvQZHILPzPBWq3A6UygtlzTLkW9X3/mrQYFZYGTRJ1FdxKO+HhTKEaKrXnp6Bk9ggERZAeqly5c/E5hQbWK0TkwqdOAily9Cah4GlxATxaBdCCHvUtpS17RbsmqAIVwmcXCPyX1AI+wEcEhvzyrBAXP4NJRUmCdLsIE+LiK+If+sO+58+LUuSUke4qi5AajxC48OeyPAMWN3HwhaB+zf+Enf0gah/eZwxDB32/CWG0lWIDOYGoGp5FSigBBTHxHouIraeYZiKrN+ndhuyn1CC3qAQLA2yaCYb4eRqKLc6XhKkNqn/TSMwikHsb4F1ePl8f/k+3O42Y681VgayUd3yIixmwuy0t4jcL2ozxi6gLZylu7TCDMsNBRHcGPHIm1MZ1JLdSehKtr/iSmhNXOBR0xiiHYT50ZS8C0Oi4FhBQ16/2CbzGlsAtimCgES+wUksacHwnxxAKGKTOdLFCWVnsW7Ct/POm/wR5yZlGRGMzTy5gao+T0zbZFpWvxpyYHCQHwzdVY36sQN9xvw4zOpk4mYvCAhQkuGg8t+ZCfvI1S6vikxwDJ0RXuM1f+/WCwxZdc9YAubD/g5xY/R3eVIRS1f7hYT4T1QypFNDOX9DAMF/2Jz7OYqJSk+a9/rep0c3jRRczq7DoxtfvamyNAoEh+ByWBzW6mwfjR5xW0xrQlMg1KQfXQEQj22M4WomJZrFvE4mEglDNEHe8d+MBEBDQknKKiIwLTISe/UwT2rOnBEOOMCD3lkgtxFAMzCFveDCaa1JHRhRKPAF/t6te3/jyQVQbJHpFqdtWc9tc+Li24qQsqoELpYifDHPL4O3HtnAhq5VCXRDCXPV4BRtlAzqlhuuTeaIUIVB/gZZU/c8u0SSUHlZszgjCf+n7w9vQ1QoD6FMFnZF2RyDInE2PICP2hQ8wl+GR/JYU48XhlkElhz1bpl2atWFVpTkaVKqcprNrA7H0q3HOk2FrRsM7Pa2GxTATEwVnOwPnXFVTDxOyV2yXSS4i0ApMktwxIrP6wwwkHX8jCPVJ+zL/nlvueqKYw96gSHHkfxQUW+jfeZOwGyw9s43m2mTg7OquQ126gQUEU/JKDh4gkXQbFO+brPoVaFXAWWfGVqOx+puPSLJ8+2Mccjhvl0lfr9ioRVM3BZBBOwyLdkZlUk6oTmZqAmyhsW89ShkLey2Le+2TBmMV5lgWVPMMSB1OLC3CyRMrhvIeSU2va2ZuM8ma+pwkXxpyc3U0nquXkauQxOzI+/j7iwtV+5rMVcyK05aTsq6Z2Y8PfhBbOGLp+NhHOLn5Jkz4F4G6bjDnXwvGbE91Jchb1JHqhVM0axpDgydXeh3JZJNgJJpoaRZllLD2xJlj5WKtg1XiqhgoQhxfaJjgreCYiq6HLaWGeS7XScpp6XofvCNw76/B0/hE1ZMg1PnUkWD4P3qRtQ8wFATay11Senq2eEcW7lWwx68QrdbavtsNa+SeVZndfNmWvM14vYDG01WC8Up6LZceafu/VB///X2+viwXMSvyesDdQYvR1I6bR1ElIGIvSK28ocPbHIVcp54E439ScBuW6K+zXHZd3rved/FZoWpNMX81bLaG3v/edfuVO8F4ylRzphEJEEzM62qEBeDrhPiPVMNUQpD3fHzh93aWYTyw4FhI26Dbgvahi6VWFjmerWyaR2o0EfhFSPsD9Ay6vYB/xSfvH17mcYHSmcun6XLkvihCl5HpaZum88/wPm6bSx88PLh4/Fj6Ju5ndOU8jZ1djD4gcLT4hfWPH/azNmDdcQMI4WER/bTfls30dxd7/dfPMzjkH44WsSnra2xkezGTjTaaPRaCutz6EJmVDsrvLkPbBX2SIqJWyMyDdrdN4GAYGW1PJs0VaplEgWV3Z5LEP1oI8qSWy7KNpy+OmnBUi9rYL2DrWD2KQixd6BxuzhnHe5hdshyzFtTyfLa2kiml7+BfeZvePM+eHHvBkH54nzJIAidRXMpCdAKjGc2po5mSGrnqHo7vKiUUdXOLnshdbAXWX+KSmqV3afgHuiLx/1jknklKJisIFlG1VBBglvi8qwa67wJUyhzyKdzS5HMgGalFCchrg9/iun2sWstfPjq8fPpcxzah+4hy6jbucRgEggJsFtFEOtdFyxe8TIOGalM60uujUw1pQVmjRUOWpIFniOCdqQqWf+Nra5aDOKvXwb3XAgIxzUlxlLxKdreXrZIKLdwfeGctahakgOs10zE7hKDmWiTeBbL5Dww5WwDdQ4BEAb4iH0gbMWYQUODsWBhfElICLvID/pBHpbAqQvOObdNpkLfieDdynZ7wrMalf46EXJAxk9qsi2JbNKchghzFAguSdA4nYamigL6xt4IzOAxm4VTjK+TEh0nMWs9l0zlnaStzZAOaczUftS2WvvKTDUlthmuCAbOTnVJJPhOW41DXSiH/3Cyw+ZtyWhhuvtcylYVWlnaNemYjalPcuAoU0pTZ+LQ25WJQ1IfLZSyxZYtm8TPG6OtmJKzYlDILhUOLaixqkt11/eUFDWc6vPaJKVYdcRaO0+jOq47rlpk2JYkHnUjDVbAoTcDk+xu3B/oFilG1Xwt3TJ5tLbdBlsTXMnseqVDqArw4+TIVoy/aW6LICLFGLGvfp7ruSqhpoZIgdeqt0UnIv1K7dqtiNnYkqpo864tsjjik5iqV/Awadm3MlP73q0Mff9tMk2ywvyS6sAnPe2rIFJ1PuiG5KUk1sbak5gECaJmBsI6Kn5bVBcwR9y7Mk9iMXvzm3FUouP6Gz233gBJINdjN6ferQg03vnQmgaLXCWCwxa1tQiOh5/6lgkX36DpBVFTsb5v9dPzcKEd5Y07ozxOHunj0wf9baEx4ocDRtiGUcDo2OLFSsA9WUwhXdDGkyeABVx4cwmANKYc6MUi0OA4H9I7KDfLcNH2qSKaSzw3xRnjuXp+P9qiHPcbVZtAbkswMvIlJAxtQaO8Byjjb7gXZMDVrrbnW3j7SVvzXsZSDNzVKafpyj/566di7fGMI3FDXGGDIDFgrcYIzRqxVuVoODmTpCyOZfrznhIL7z3rP4aPusxScqf38zkSKKMVtlqrQsinL8N1ZINFn+BLt6XSAHjWp2xTgfYN397UNsd45SyuweIsOWvIDQopI6JAbBIOvdXoOtFtQQAKBYukWSxkmevZE++v8/f6djquSjF5kyD61KaQVFXZToiPnnnrLFM8iwHPbyvK+4aeSEDW6kQtHVfQhpTnZspgO2sztmh+dFAzDQteLH6PdY2BqdLKnvmBK3VfuBgYdb2XO3yOn02VZ7RnvTOuK1MccNCpa82352vrczuVU1BNqDpItNa61aN6CaY0IzkraE3VhCr+IKEWN5IY96iyHFNzqt59Nr5Or01lN8wTh544PsweVmCGwyMpz+7wOstDPDeaj+2lOPWXMf4TKCjnhivWtvtEaQ/Mhql95VqLHhKWbY9q4E5D/dw8Z0YmbgUqhBA4Hz4R3w/mWbAdKh4R+gYVrWVdAKlUFzMho32YxrXP5ZzF2DxWi3Ns1Y5kUlXTFDLMXV5ukOvAtIARNx6mSkCq1BKMwv673VIWjVxV7LHq2ML+EzwN96Yqc62i0OPQvQ7dULMecZjO40d7pSPkATgEDo6hKwou4gpAGYG65nec22CKPvcYvEPXmn9omBtNi6/92PPMyPg2xKu86tlvwaHXDZYrD65goZEnRtwGZVY/mo558UWkR7JcoFW0sNYr3+1JSsm+k1BLvWZCbjeLFlux1ErHIsAP1a3zII1m47p1DANRAMgui1Rz5aOMPpPnHY3nZCmiWu2Z1ph97rT+8R6uPIvFRDvxwo2quKhYEpnlpXTq4RO9AVRQhZ8NbkXr0pmBrT8Nlo+9RT63N54+CrTH4CSqNEWnhWGPpANFvGfplEr9WhLxzUUSOo00R0VXyj4w0eMW0M+anbr1g4AzKGXSteVQDalJClnkrOmaZ0bGOlZ4iWuAnbjboiVjXonKXf4FBiQq24RCtxFaU79pzcKk9XYUHPNUFHCK/Xv8EJUThpgg6naKZItTn5ul5t/vRoAImEh2FZ0F1+scRxzJkMAm2pcQ8KiKAoK3Che/ZZV6ETOSbNtyzC5xlfpqCT39ldxoJ2I+PHRb/lRljwqP3q0YpwNbRXdY+LzCT1/YojpjvXr6lsLVQ/vS0PzEOJN+fLmrY7Jk30gw0fm6vUOsGZh0rflPQm5QqDmT8K3sbydxS6gTK5MVVImcg1BbKqs+UyVt6sGwUT3c64fmAUHlYZOd8mzPXEr+cC56TIkubI6c/lLbO63SA+Go/WbBGZ9ZTKmgNMVcFVCDW3BLlvQy7JAF3Tt182fb1KJYJAPiM5ilUnbWYGWrTDAAKMb2LWXL6LGhr3Y6KhmJLXZIUdXMhifHQqqseCFvvmLKaNQiNzdGbLn7XG6NJG3fLxnPqTE2FLEb5kQayyQhuUGhZKfhMlH81p5DBRhd71TbYiMyYarrXixWXiwkFS9QgP2m3uHvNJnp7FaKMvQZcXsLjWKzgpz5RdnNrFfQCuyy7R+DdyiCYispIqw0VCNPe5yCzTJ6MsDpI42NqHomNTGVviBywxg6uxMbYuYrfvhdu10NGXF3JZgzrvfyvbCdVPZWmWXyeM3XmIziXLM3zCvPeBYuZmdc9KtKVehiiXGoccgsPNmCjhvrhjHrXkpvqKRaQ5/Fw85/h9KOBjUxcFWdohLap1fmzboXo19HMgS89ViXqY5De0dKkvJLPHI0zoFmnYiyuZw3ts2saeQqzhoJCfhhmrZ3OXYR6VZpPzGVV3CBTC3SxSbkdoELca5Dnu8iI06jt/tKcUBRpiYp4oyAq0j6EOT73SF8s1XLgDWqterv9dRMeaYqXW2hdr6ECXw6Rd4iisxtWQgIh8PDvA1o8yC7Ec+w5Zf7PXe9Ng3pxMNfv6r99NhUtFt/ZZAyz9IkJOEfiHKbMVCM1ycSqciv2y4XeBQyxVWmjLsnWbe7ymLZCSnXdA/kS79tMxsWqsw2RBB/kI+7PL/P0zdOD+eH3XZ6m9+43HS4AxdJXKeWj6wRDWg0VPlazXGCqy5cUPrRtrQXy3XpRH5V4p9ZS64fCneIxePq85RXZVs5fG+WUHXlledSEy1ctES1JCOKV28XovFdIn11GlOfrPmaFFR90htihSo4dysOJLUFd3QJvHOl6r9zSygoYtQPLODj148PZW5U4EXrjn+DNzoPQ59dBOIkjlE+6dtB/wnGJEl2kve0iiMcKhETJkndX6IhOxs6C9MCSl1qabDQ0A2PeyLJeeD9l4/5GgAMMZjoMJKpqCU7bwGe2dcFDH/r5M3SGWhg9V+Cv+ry37bgFJtBECp+oYEaP42MW4x7XJdM0Whi6s+qBSg7/tjhAKlNgpYuQ1H0LJJmyC3d0gJuEa2VmxebpXIDiFAEufGmISPksgPNI46y8jZPGGP8ZlH30lcZhZtD2bu8ps/ELsMR73L8ucBoAYxOiuOBm4rktL4A/ib/MOqlUD7uFHifFri/z4uJUBzPrnFJkc2kSQk3mcxZ3TIbcDLHIQnbSyb5pHR1uZGGY1W07Jj5SHgmnjffFuWmFMm2784PRUDcEuOBnsh3/CuyczzsX3+wqxw67yiCszQMNXTZClKRHVtp0tSOHWg1+GS/ooPScQ2csVfqNV/dZBt8c6cmTxG1egHHwN/nN9TRZdK8xpnlNnty0cw0lQx01zxqtn2YhqY2CGCocKYueRH+Pu/kRV4LP9oYNSgsstz7zDZyQUGwBZsobOgLiZjrs0slyEE52SAtjji9jUIfUuKRxjv0MaAxY3vEkqYHG/9lDzbPYoU4pWs5+rZ3TGo0Zf89F7ZREwtsnvlZxh4Hzni010w3xVD6hHqbiAAw5P/MkNognvVJrsJLAC49rDh9EDFkj/33zqV4RuCRhIMuAj4qcViahvD8SvNZljH5IF8tJI+WwxYcFP838r7WPtVt3JBTRUHzQJXxIeCuHt5XKp/eroe61ZSqDkq+EnjHqqF/EKzGiKmYxEL6jFWsv/uFhTvdVK3yVH8r4LtYE+i9Q2YLDddSvRratFCLrTteR06slZBmaxQhMAt71egbo2ayBJ9zZ7WZC2bvK2s98NrghfFrCr1aQrJhjEutiqwUyeMto1Kdg9INV/WC/Grqkgv8XC7O2giQQab/lFL5+EpgRoovBbpFiB71lUTeitAr/v95x6AMwyTyZA5enqRk6HPOMNmawStc6QhPek6m5bSOs3kbmKR97CHQeUZPalBnaqWVdBCgVXayCuwuHasprBY86YQGefd3FcjsqIwCdHO1OH2UVU0JLXBpLzIts11NFa2grFHsypBpR4uqqEof/TOMJmMRYx41bAzqTqqiqa30HFbXsTjrIQhpM8RA3YT1RQYwMtDbKElkR8JNUvk7FIgB6Y8fpz9bNZjSwQzPsLfqO4rHeb6iiKiBR0nMxjMuqqCnmnznD5HpAWfg/rB5aM8GLGfAbKfPaN6lS1BtTMZbdf6yFQDriLn0SVE2VMaGo2tTq69MVealpLPxjt8YWWukT3WN9nFavTmzWxw6kLLtOu074YNUe5fEfCIQf2ikoNIDELnOEIyW0BwBJLqMXzpc6ZkEmcLPZJDIcqYAB1/PFKHw8EwnzGRK1dVqk1SPcyvQkq7+1I5kEDuwC03oTKuc2nXcHEMXtW2sdqioLTCjK6BSljI0mkc3oh3RFNDhcjalOs3ozDOwA+3hJDDVOG/Hk8k7MM6JL12fSUtUvCtNaEPd67bGkEo6wtmORrShGZ3avJJsSysaS1STl/UpxDctUZbGtVebc5q70VVteaL2Wzk2umNRTKFd3zqeqd/AUlRFpcJIZBm7xtWrhRbvSC9PbWhByzbjTbDbjeWuT4I3tT0TWhF/qFU5AzvSDI76Dlq3+nhnenFjvdXmFZ6XY3zBrsvE5osW4zlHO+wICN6iNkSNx1iGkLUVnxB/6z/ACgGO/yXwPe9A/fwsWNld97toLqWWlcB+vh7cXngxf9Dg81Hsy/LD3ENSUNUI03T+j/MrMJby+PXjFp2vWyucSGa/o8CXKYzp2PGaJ+P6r8z70YOrS7lFJWId4P9x8l+J8WPqSQUAAA==) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.0","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Library adopter","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["library"]},"evidence":[],"taste":{"bindingSHA256":"1108c3fce3d9fcc6e440d90ce70ef79a1ada50c43409b28decf927bf629186d1","decisions":[{"rationale":"1 subjects are explicitly linked to the selected Questions.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"design":{"audience":"Library adopter","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["library"]}},"rule":"question-focus"},{"rationale":"Retain 5 displayed subjects, including required references and their declared containers.","questionRefs":["publication"],"subjectRefs":["library","project","project.profile","project.scenario","project.inputs"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"question-scope"},{"rationale":"Focal subjects have 2 incoming and 0 outgoing relationships; select ELK UP.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"UP"}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"dependency-layout"},{"rationale":"Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"UP"}},"roles":{"library":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"visual-hierarchy"}]},"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"UP"}},"roles":{"library":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"63be78f1745618eef5d201f28a0d080c369f78f91fd7429496d0d5fdd5562297","model":{"subjects":[{"id":"library","type":"rectangle","level":1,"label":"Library\nDefinitions and contracts"},{"id":"project","type":"rectangle","level":1,"label":"Project"},{"id":"project.profile","type":"rectangle","level":2,"label":"Profile\nSelects published definitions"},{"id":"project.scenario","type":"rectangle","level":2,"label":"Scenario\nBinds project inputs"},{"id":"project.inputs","type":"rectangle","level":2,"label":"Repository inputs\nModels / Org / decisions"}],"relations":[{"id":"(project.profile -> library)[0]","src":"project.profile","dst":"library","label":"selects","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> profile)[0]","src":"project.scenario","dst":"project.profile","label":"binds","srcArrow":"none","dstArrow":"triangle"},{"id":"(project.scenario -> library)[0]","src":"project.scenario","dst":"library","label":"references definitions","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> inputs)[0]","src":"project.scenario","dst":"project.inputs","label":"binds actual inputs","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2","title":"Library / Profile / Scenario: Question-driven design","purpose":"architecture","kind":"design-comparison","question":{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]},"basis":{"captureRef":"design-candidate:library-design-taste","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.145-design-taste-public-contracts.org"],"evidenceRefs":[]}},"questions":[{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]}],"references":{"capture-gap":"scenarios/project-formation/func.ss","case":"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2","library":"library/project-organization/objects.ss","model":"project.sysml","profile":"profiles/library-formation.ss","scenario":"scenarios/project-formation/func.ss","source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2"},"sourceSHA256":{"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2":"865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc","docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2":"394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481","library/project-organization/objects.ss":"f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/design-case.ts":"70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea","packages/render/examples/design-choices.ts":"c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536","packages/render/package.json":"cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371","packages/render/src/design.ts":"5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2","packages/render/src/figure.ts":"4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/taste-policies.ts":"9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9","packages/render/src/taste-selection.ts":"0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897","packages/render/src/taste.ts":"4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893","profiles/library-formation.ss":"5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f","project.sysml":"a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1","scenarios/project-formation/func.ss":"b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1200,"height":932},"subjects":[{"id":"project","role":"default","x":325.8243408203125,"y":322.19061279296875,"width":550.8900756835938,"height":341.99114990234375},{"id":"library","role":"focal","x":438,"y":131.58004760742188,"width":215.15960693359375,"height":86.89974975585938},{"id":"project.profile","role":"default","owner":"project","x":392.9620361328125,"y":402,"width":229.5379638671875,"height":83.45523071289062},{"id":"project.scenario","role":"default","owner":"project","x":462.71929931640625,"y":563.423583984375,"width":181.41455078125,"height":84.1339111328125},{"id":"project.inputs","role":"default","owner":"project","x":642.5,"y":401.65966796875,"width":208.4544677734375,"height":84.07254028320312}],"relations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1160,"height":48},{"role":"question","x":20,"y":68,"width":1160,"height":34},{"role":"answer","x":20,"y":695,"width":1160,"height":31},{"role":"note","x":20,"y":730,"width":1160,"height":27},{"role":"note","x":20,"y":761,"width":1160,"height":27},{"role":"note","x":20,"y":792,"width":1160,"height":27},{"role":"note","x":20,"y":823,"width":1160,"height":27},{"role":"note","x":20,"y":854,"width":1160,"height":27},{"role":"note","x":20,"y":885,"width":1160,"height":27}]},"readability":{"minimumTextSize":12,"samples":23},"bounds":{"model":{"x":20,"y":110,"width":1160,"height":571}}}}Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"UP"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsbinds actual inputsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisionsLibrary adopter1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 2 incoming and 0 outgoing relationships; select ELK UP.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued \ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,d09GMgABAAAAAFaAABEAAAAAzyQAAFYgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhxkBmAAhAgIdAmXFhEICoLsXILFNwuDQAABNgIkA4Z8BCAFhBwHIAyBGRuZuBXjmIXbQYJA9XI8G2F3bKuWzgzkdohQxX4f8P8JCTLkMHlc2qIYK0DBG+pjP3o/bYx+elObdo1mu0V3Ux706zGe6J034rAvZXMcB3uIDWWNo/ysFdiFo/eLT6UaulanZjlbev8FG6Fi4Sxv/Mek7ixraCbFKYLFUPBFYOMyRrJy8vrPs7k/94ETMYoZK9/MbUbkx1/VzZUu3T2dHimsKL6X8iPtExsUn4FAsjlsrFOGqzppU7nu4r//TatzLr4qQyZxABvYdqUHgC1L6VlyS+VFZ4BKFef7ewdgbab0RSbHRZJXwRV3xwVwZAnSLRjkFGW6sBp1YdRS537vrPVP58LN9bu1Q27pw5vAieEniD4WcTJ32MakLURw1GZmz/7+F7z4AANMOMAssQD4eJ68vf0bWJ3PKPLAJNIoa/f9JzfrQxyIMMigCR7327fm7aVoulPyfzW1uq/dMzcpkjkEDjsZAnuIS10ee97Kg9r3tDxEVdeqzU1kS4m8iSyrRSYU2A6QjL/7K6PJOos+LN7I9qh7BZ6TogqnvgLZBQq4JFMR9Iryp7ljhlnbdHLCU8sbPAUC/pc5+39dEkKsRFD0ql5v61/2Wz9EiFvtRCsUlwoFcufvnjc3REWephtUVEdFg7NyrfGzn8dkDDhgjWB4lf/PdFX6qxsjdnjz4OyuZ72NgWHWhOdMdtlml0lV1Sp1dasldYsxEsMOrWUMGgNqYEGMQaqWVkiCZ2bWMXvGekaMeU+shbUuPRteZIyJLrrLkovju/CCILksOPh/uJ967v095RkNMOot2po2bfSJ5uG02fIKYZEI49q7pN/kOhar+TWA32GHKV8icXLP//9+pROUJIMjFDpAIzYb3j7H1+p4xft9//0Td7exgpIaZDlLFyhtj2fbAnglLqA0yeqQXDeA9jZSSNQftvzmz55Zo0CA9OlX3dgj/ZhvjcxEkP7ON5m9hRz7S50Jiy1k1SdxJmPp7LTd92iCgoDJ5fRcIABuCCqzhQTcRbjnPla/XoZpTqeia24NJIiklqZxUIrTHaQhJJXvZve1FHiMWuKQtve5BxJfnCCOzQRJM6TPzeAGHe5p5Vt/4JUgEMogMkf2UgE2OhFAGZyD6kuwaDpDcG1npJT6mlgErsUizvc7QIyI7yJMMTXVnJ8ALjsKIY5QXgvSCnIUJs90UqhQw1+6whd0j5GIOOqPnNBCpEHTRor34GgDVYYqHhxrZHs9ONHIjntwspHd9uBUI7vrwelGvvTgTAM/UU/H6Cy6RNfoPLpF9+gSekbP6Cp6R+/oGvpAn+g62qM9uqn/w4NbjdZnD243Bh97cKcx+OxcuMsTFGS9iU46Y+CI8PDK89UfjYZRJXvzRm7n7tL5GThBO4iCLDgED3ytVRGLjPcR5mnmLGxd+fQjsAKv7f5/bFT78bOPPqWtB/0//95/7x8efLjr5Imjh54feHRz2o37J0AIAh30uPFA/XO2InSuZbote7j07vJlWu0KY+jSUHylN9wFW7y4aajLWvb9C7VxUycJBMK6rxV4zejya/pWf3g2nrGwHSaI61tkRncYgADHQxkYawnbBClVD4gMLiMSdXeSkRFG4MMHcvNHX8CQrIf1p5/eijVxS+fSkrd0tg3YyW3rbCsSYU83YiGtlHgxUoVXqOGhHyaI370hhNSQ5Xo9D+WkFrS+B4KqGqKtKoQlP1bNqBBqkBvdCFTlB09VOPqEM9Yq0c3ISaxYjJJ65HBRBXDqWaLi1kMqlgV9ElH//gftVFENcvOjDx9M90m9KGK9s+o7N4bR1n2yq0r0yxs9MPeAL+BfNgoIbUtHdjRR9XhLo2pl9BMUHRiWwwMORzDfFXNchRWq8WgB6v1hkLW7bh0OwcwO0EOS1qMttcORGwF1FB5G3jLhmUd3Un9Gx0eDqBjSVc2UExYRYZ6JQDhBBBs1fx8OKePeGrF63cqIKCXGxnmC7MkYoy0MqClfifAN+oRTRkvQCoo6M8YJTLhlBA44HEfhcVtkQHQDMRDIfAl6/cUnflLpRVrTqWwNTtLrj/7154qIsZucPmeKEsRfvgbiURrRc4zbalQfM1yKHCg6gpgTUDFOnhzoJDdc/K43vd6yQvXndUMDzPdKrv7KiGwZnX2VLDLockPioglgRSqiJAz3iPjteyBNUwn29sUzLhxqhoVjSFBxHQLR200kpiHGqIvu35TP5p1tLmjGDCVI38iYpQT5/DuI9AWl9A1O+gEv/UIl/UEtRRAkBY0E/RepBCEn7qtswZVsw/XntUZTXNt1opdIQzrS0CukoQGkIYE0lEcaMpCGTKSh10hDBaQBQQEuFAcGJlyUktJKSgJ4cdLciBKxaLNoWUuZgNYFG7Z0a2Jl7qPWGatHqELRwphj2UoqZmt/W0Fq1e64C0nUCA9qVuvYfTh+UJxoFyBcsyG3A7/95lRPZC3VMHs9Y4NQoK15HUE2b/8aNSk/UWRshYeJVR9lZJsSg9wl5BYjCHVveRm/Twrf18EPjDXeH+H6FmJ29XrGDhFy5MZBwuZnUN4Yx5IAitiBtOpGkeexyYWLjIHuzFd1lv0202d1s83M2afqfDAZkIhiR1iafVYux4kHL6KGPw+TYSRUZDdqvkSkM8KDD2Xdd786AchNabo1IwzIhswIyUn7DHjRxfEC/Mb9//Cq0VHNHCM3UWlGIR4jUKcbd15Ab+h5IOfVTtXswzop1kpy/xIMCAegwQdixvjgGgGhdPVosOZzFGIN2cLtQLXtEZ+RmfDyBqZkCVWssMOFlINDVRiSHh6u6Kww/XT2DZMg79y8zSePQvNUwsyNUv1Imw9FnB3iuI/8htixE6ePErt21PVCMPuKnacB5DJnCR6SKgOTyXCooEAuayk3jlEKHFPt5Pgv0SoQQ8Ae88GFrBnLefO11TpjvCHdHnhibeW1g6UHW5Oj7IAuepjF/kqtbFj1TJ2nKQEm5mzKcYbYDpn9B7lakKOJwuvVYo4kOedsBcOLeeoBKtOCkcUagpaMsUyn2itNsFpD0Jox1qHn3miCzRqCtoyxDZXeaYLdGoL2jLEPNT5ogsMaglxjeJDzURMc1xB0YjydEnuujrOCOYd7cq4RLhaQgxwup30O3qZ93qX94ftBDh+mgw8f00E+pYN8Tge5Koa4Toe4SYe4TYee7mg7yNkvUH13PgdOqeQ/bP1ceZOVBIE0DTsIqgfmtH9jZGn93URvgFcTqPj3J+iQnY0LECGARIuxvM6QedcIIlAKtrijK0ZyMweXIbMgQ59aVsbzsAxKiUOSpgBnymFDJl2xqZ04MkCsxAXaiPlOFmIRrLQVQW/8u+0fZGP+3e7vj/RCL5Ri5w/DlNEazgbrSZdhs9AhBky01eRw+KIumhC2ud6sFsd8MvennrjQHnHG4zq02/l43qbjMnY1ex1CXMKsM1OIPa6S21pph+tm2I/9sjuNrtmhQp5GD9jCXesDApB2VosIa6rJIA0xtHbRY5koKotBlYaQDsIEh13kush2ke8i6SKALlLqoQ4bt7EbvwFwuc19DpA3mfSO2BJ7YiEGIF63iC7Y4ANAsONS72p2tmZfs9QMNYNSNWsY7UtwtoQSfAlylbn/Sq/FKe0DVk0vmWcPAMHUUTR2djz2YwB7KukEkJ8Y1NB4pYRjY1LjmpMEH6OU6WtlTXo4vG1+/8f8eNRxSVqKaU3YXn5C1bFeH0L8ugTgQ2ZVjsaU6r+mo8r10sqNujSDCjJMdDmRUQE3ZLQ5RKHtDLT0sYlRlVPcA2I21SjzqM5rOtIEidWeDdvm2DCEFPWJncw9YDFNJIUDiOWxgIAWSkcbYA9Ml0eDM3o380QpvM0N2IlfS0uvS9gcCdPlxkHSmgCvtPrLrex7gB3JYhyxHel1ONtL/YPocsA5sG8CX8Jf8SXer8gJIm4Qjlb5WysYdtk2YbQnpyC5o3N07EOFuy7aYd1Zz0anpH3HIMUcZcH+eet2ga2C8zCrr6LQhHm+WfWjsEuwC55duoTcLs7meUmXltfgcob1OwY3pMlI8MaMIiFuHo6BSPN43JWKU1Q+d8s1efbdUJh+1zcxcs1n3CFXXVdfqC4Wk/QAUtbU0o6gymdn+Ya0fOz5cWgDsahyi0xhV8QU87kttRq6wl7TzRjVCqTq55roYxW6RLwDYqEkdOSNjXoLTTWVOyhKxT2XAVWRbs1nSzRk2tqtclf4LbgqF1cRaV7hhEDxB9Y0ud8+HPK/97AhvfE4NnCE5Vp6oCKoS3Rhq/ilYu80XB4HVqgckoOvrVF5aE1eMSO9rG94y+qK5qasNGW2dlKk2s+Cwk+YbF06TQHrs1BevHhYVCnK+pypRg0KF5crW8d0aRZ8ouLcQHOCgGX8ci+d/HE4GGCmLtHHWpnVp8GT11HuibqgQfmFHlDAg+VK5kiyllXfGqv6j0KFLEJLkC6mWSzrlwtsr5ACDyW8N87d59r4k092DlNp/sk4SSf/wb2aiHkKCkOqQPPXcvY8m7TfFzrb+u8pST0IrcOOiBZnbhxR/q4ixRwJsa5+LuKJXf0HnHTzoMn6mcyUlpKS0LUvx4B3ykSK70ikYRfYAphviGJibeti1NagLTBJ5gMtOoano1irQQaf67Prhz9OxCh82JIHkusqr9H0qMrl9jxxXrG6BCkwEsbBA3P87cvUxGFwI/qlQcjJQ0nhIUU521w0nheBpgCvkPbaWZt/yG0DSGDYsS53S5QDRCS+RqfwOOhBSOWuKMJjHeMdQBjZbJxIOG9cZ8aJwkjwLSwzud3WKv3u/mPEHq7Ygjv/vzCsipZhiWEpF+tIqz0hllkWFBk+4p91gvSfdOWrirljye3H6rDHe9Hmm3viOknTbnAHNMqXdGENfbsFGxIW4SM1M41AgATegiguNzlMgyOtJ5nHtCVbNg2ASMApR8BrxSNQBGUavrnkVZZnaAwl/DaI9UcckeI+TEH24LwmjvXZ9QD9jcPb6PMhdnSqeMGwjUgV+oQ/AMMdlYU7HqQY/xPKaV0xYj7hjfkCQX+uIC3qYBOG/byolIMh/+Ydj/Za5+vOs4gmjHEtgebREgqPTJeICkrrgG3/0nuVEYt1lOWWSYHhI1RwW26tYDrNLq6J54/QwytzR0rvM+/wdGtZErlz5wc2qimm4cHktvO9QyfvX9hOCfvZ4A/K4pReFcRshC2wZSqHxb0o5n5dZDH4zWgFTSzX2z8EGUd7LctTQwrG5curKth08TtLNy5wd4zmsm4brfC5MM1pB5CcZbHU1KI5DVxhF9JrUlodydBHqlzYq0hk1aT0qGvWPmWr3haPWA6a6pr9hWHgjk2XWxw/N3i0PV6eidHaEm2wFwQDe2zBC6SgW3d00+6y7Wb/mnJafgWqPXH3Y7D+WLpWELrSiCDBrAv6mSaMVSIpf1m+068Ez1vWL9keXm7yt16Y+Jov6fJQsLCWYymRnE0nQ94Wc0fIN8AgFgk8xo4AYa7ZtDLW40cLF0HVgZ8GMkQ6RycC7wQRQipSoLtxWMWsxMyUcG4U6GtOMneVCN9FJxLUQIP/VA0a4kVNrDYeN9gCcTZiSJgAw50jfhHzVmtQl+rf8iLbOExQzkgbL1GtAWlCFI2UVXEsK/K+XtY6fKege58zczNyqQVb7mGtUjei6OGsdVrlO1CEXrFRYyb3YoUrSxFY3duubS5JseS2Z7K82CKLOWMi6xlmzqfOY4Wqg8eCzty2xLFxOGcX9LkeXRrylVLGtRPuhKJQUBg9fxi2LbCzqm0KPq9I8jcdIBtxDL9pViCwWhZa9cZpSds3EKDDY3IXSJyKeJueuyH33nj8UrQBo/tg2nYengbmtPELxIX+y+yyViW+aMJqwv88moITJ96dkyZLAUyLRU5vF8JEECxrZ6BPIY1mTbqNd1AzdXPMNiKBhMPLaQqVGOXVcumMFJWK5R+H9t2QfN1eV7W6BTAsDEDaMq5u7rIifs525h9FfFHpgmKqab4nc6Hv0gnvhGtZFaqGjtLoLQ9VPOetpiHE/7AJp6p5FYYEaggIl1CbzupKuAffVxODinQkUKy6wq/3yDVFanqenLS4kRCrrEZmEdOFii4z0bgfNoy1zIOvYU5g7KWUpkRXnQGHeTXpmYi0w26p8npcI3eNTev7TCBVNmajQ2GtekPOEHHQMo0I0ocGoCltLwd5ujNGqj4qFQ/Ok37mIEwDC/7xJKDxWTHtyC4QbAHDdWp2XxfsueMMj5UClnkqkY2lNLFVpuLNadV6hwn87rW6IICPaeJFIFNaK8jwsEqCq6iVnEYwfWKth3mQ6pGPW7gmymSg8FgJibQWJG7IQvnA5KC9Em3QxGwYozP6wBFvfCCPpzWhyPlyitdNaGAkxFngf/eRPG/vW8zrx6gLms5Bua+Ugd+5DausIDfUC4vdfdROCamnRNmqpGTAH7KAm8sBiYEjwoRqgY50vZNHVRD2loilnqXmfjzU/WJVsWal1qhQG91gms6CnOPF5fWUoN+tHKCerB+tbnADFI8FD4WV0D6gj6mwKdkHEjPCrrr3C3tpPvecDBofpS0wP3MHTWAsivWrmiOCbgTc0yd4N+XH61P3DsOeAaPL2ja0gvfwFEnIlmKzx1y+Hu/bdL98ZiAGvpvTqPK6h+A5yqbm4ZBcq9LaUppjS6hP5bdEeP8eDShMp6kQy/WAXDiCzB12u7j87Dq0XZ5EJ7GtJdUEvGhTN55SSEf93K30ncpQ6jKSSfFnAjvfl2daFrlXZKHofZILDJ7HhENzYUCtR9RoZIrbY1JQFlj5wdhC/6s4ObmZ5kMrpcGMKyzGwZFU4vr03pTraidCu6ZGEe1wROjmLVgFUYe1fPMaUGnj+6Rlnajmgi01er0jmJGIj1dIC8RRs3wKD4Qmk1eLKyrZkwklsEk20R9zx7DnUdS/ATs0iHw/FXKSo4/PfXYPO26vYETafjF5L8RXSlRRenJL2B/LtcrPznM6bgt45cQKUqfmXHGVd0VDXi7WqpfLbsjOpxwpUeS1raXwnw8Se1DlCaE3ArFfihObvqOEXKQioiVxIfCTT8IDzWyZljdi2wFqNPqYzNdsuf3Vfxbko5qwPTzaggc/FVGYV68iExqG9LsuYR/B42NJ1Sex1YOrFWNPhrsG6XmrqMrpAkx5o3OAWkIYWd5+rB9SRdBC4cyga1CaOXPNDA+33rEEISmbhrKy4Aw3jAXkvP7oXaVvN0vpB/mTRAzEuvZGg0ixXpnhX29ca2yRpE3qwTkd4x01JKnYiN9z9L1lnLPOWB8gBUeW4C8ZkIDbf0KaW3k5+s38Iipo81eoulJ+/giJP/P44+ozf5SKd2vPVSFQ4n+VccntCFnqv2OzMBm6zb1wfPZcJ7p4lraDRROhZ9NzU89hA8KKkWwdS7RBH6L41wb+sWezIv1uAe1KJOXdLazFkinvxynuBORymos1ueRKIFeX4xf2sdfnSTDXa/Y6exUgq00/mjP4BN36PVUaOrKhb7SpNPTNsujj7Yt0VE8xzVQ8enDEyPewxu6MInr4DiDu5kqi5ZJyXvztepK7b9cTBXLKL1+T6+wBbPArg70Wa7yNnEbbuo/Hw2fF3gi4Bw/g+2fkIxm+uH9Z5SsbfF0gBW2xpKc5fvDB2wpzZgTGcJ7eyjhRoU/srM7L8Qq/4OsljAtKU0Iol/iPnGlAyg8V43MjzsxD+SFh/E1h+ZnFgp72t1ZbTKxj2nn79IkUFcsnejI72uOnL/6h4xD8d09EOwR8M9sTtEzR3i8/Z4s4ElNAVZgVdUVyanFMWZdOS/yZM2KAIAnNnC5Ylp1ucppc3MgwHfGOa5b05Pkl9AdouOR9uuQt1xONLQujgHB8dufX/OCFFVixhy4eg9WVb10Lh12hHWlNjGsC59qPoQw2pnxZHEzz1kopbaMuV/IpcbfxIurFlNz6Kxpb3t82cWaZgjsMZBdkyFfZ6J1HXuE+XEJvm8X/JH1b5PH5x2rP38exHisljz5HroeG3O1z6ZFIgQRbNvnzh8l1kszxou58Isfpgm8XnOa5OxTcUoi2vxVXU0sw0ilv+X08BRyExp6TmGehy5XxMerEdX1IAxgz3shgzwIDg2xHeuljHjWC98yr9FYoZW7Z6dku1D9LfJmX9E2r1jaDe5z1QonhvVxY+ZiPpeJ5IOPmaf0Jb09q5+4NOYDAps0L3Q9lFTavXbno+7d9J/xteHm/nTvh3BPFfnlLsmTPLUriSdLPydGq7itda9WU0d0Y6L+94EkgZaENiXBUx2ots1hvfKgmRjUBj8KVmBZwr8fsGdFvo+y1jMCe/h9pshhEYpGsiWW/8XTg4GpsHgvctoY86R6OUFh1YezpSOIXzGPciEAmnIYfx4XZ8Rxztl8AsQCCqniC5rSGRD9fGjfwERjOdNUvdjd9lUbrYURaE8OsEVVu1+RqOLKQI0zg5QVgB/xjMwfFKW8+f+p8Uu3gLXFmPQkCg1Mdjqp3KdqqMNoYXWGSNBAiqg73aTlmtBzG0EuBmZxHFLAHFoN47z0fjJ60y2J/QwVrb3/sg9ZfiDCfnEIl+QwcxESCrSwNyBtGQdhDAvFHDdDkfWhSubiCgCxbuw4VciZ14PPoOWjsD6CUXD0AsGYPibeEJjefLIBSd5OEx9HwIjU51WfgIKPehyJCFSx7JBuwf/S/g9SB3W5FOOhFWi+9v6XYhORWU9disKEtNJcWk/iB8b+UWlzkSPuaBsUzVF6XhHWgLmWvzTKCfcWtJOo3F3cR4d0QvTAfFc7nroZITgXavdoA3CEdXuZnWvBuWqB3wS8zrhvt2rf2i2wCFCJkQuJQEneqHSMOXO6dWz/vbTj9o8M7nJvQKsuJjuZuOKewprcTrAxobt/PB83ufU7CrvEoOtLLdc25CZYsAhQqZJHjkBLPa49W/nX2oRgGdmZxaWh3mV9SWs1l7KPlWiflyeUxO3sbinyM7AROyc6F2Gvh2YrxQrhMTeprv+lA0xGLalThu/c3RnRn39/aIq8I8jQXECiHMZxSIIY4lzKJA2thsZRbVEZ515IomJNWVJBTpVreqqjMzsgWp6FxjPDu4rpj18xXquc619em496o7nd927J3eKheh+PjKQWBkM/fX6/Ys4nmfvuznzP38nLGjiK+PM2KEMRjqF9EwOteZ4j18gNgdnwSCbsiNWAcaBOsZW8c3MrCGJMSvrj1UgdXFhGEbwYn3ojGZ9AptAJ/Ctx9n9NO0f1iEJN78HYE7lVyDHqdLVZOu6ah2aNJUkBow8dIb/duGRUDdGvDYoyOz95g1rrxP5YnXvqnF789jOafIZC/5k27EFvi6B53Gl6ha6LATES7F6uxpLZIdm0meTFe6Vgi2llMpwrrE2x72QXLbfjOpGISQmPV1PG26EvoJPdY+qsIZ3vDVN3mfWkX8jY356m8BU01NvEJGn9Sx1qhdePXw627MVYi7qA0+ZAIu5WSURVAnVo8SX+Fz80MB1nleSzcYI2ztiS70selXJvWET2pmLSuqkOlNb7GVz8SbiuLA+/7j1NjlKpMdDCA0a1nOqwIcqGyiyw2lhTXRZoNohlqSdbGtjdNeQ0S4qrSiGw2sFBtI86k0j+czxsJuQ58+qaX2aiv+St7sbZKG37G5dSLy852LilKk18F4IHtUOagSg+2GqnqqfsvRaEeG2pwj1OZDmFj70vG1IyCk88c7opmoD7CM/ZF65xcplF0sp5rKik+6IWc7jw+GV5fMfhcaCkcHY++2X24uz/zRwUsM9b2f1Um0JXnSgim5AOWWm0y1128E0LQB3Hcu13/VvD9LLTQ2yPK9ug6+K5cgT3lTV3oebln+iYJuJSTW7h3zuvzWl5tLkxuDkgjO4YfuP7ViOEgH05Z4l/J/dlo1jBTGjI4KrR8ylnvKXDcv4yXFdoJ07DReE6eIv3n99RRih1jkl1glSNTWlyEhudYkvpmkd291FnSoyvMYJq3DigPxMeakO8lBZRvkcEOcOnnnz0t/jFnSOLq0DHNCG76QnLD3BNpMhbEJz4hmJWDSxsR06wCwUJac8ec7XqGGUESe3Fh2Rz3ZCFhhrfiZX86E+7R/d3fk1VwzLu4no9GmF75A36A/nlqfdak4mtKBXIQA68QxBytrIaTxPfRO6Cu7EgKUofMRFz+f3scjmUS1+14f7yZJMAiVOW+/2IjDGxHKSxk8ODxa6gOhyq4vvIbr66LzkQDDpEs9Hc00HR+y99odjGbZVFu+ygZ3sJ/S/plL24jcnnp34Urp6ZnG2dKorUagQPlK4qmC8uLot7ljUPW5NoCNR7aKXwQ5zwfYuDs3Iqm2pePhXs2ZB84ESg9fkCQiCNyCs39HMX4jbPDDq/b2X30uKmU3WqnbGmEmOKC92HBwYimlPPw71G+GE0KkdY6ZzBm6XPwpqSCSuwN910ixqyhIrgR4BSKUUZpjTGf1W6qU1BZ6svARbfh749HgWfEiUplrHaq84o1wq2MUhEP0GY6K2YDAgc0QNcWwy+BTWGGceN+h08RrLUkz1/M0R5X0VowGhXc+pcvxUMl2hIi6BYyFzMgenk4gNjnOHDmEdlQpockVEPl44NFJwz0TKJlk6BACHnDi1kf3Wbom1oyF3f/fOlEcuMjz8u6ndV1c87UU3sfd7sQ2RGMoKEDbNFIjJLFGnp7jZsZn+35fyYwrZT+n5Xg3zaquoEUCFC0R1EYy+2iIxAtXZTpBBSJXWvaxXOLHebCqvaYohgAVHOoHDpyT0pzar4sATrRZlzkzMr1WsTd9Uw6rCHh9a7lJ28FcsBr2dTtlyxNQNZ6EOmPP2+cfS1l4K3aKyC9rRDHLzvETYLwK9A1xYTm9Lx1UTATSofYeePfrnO0D1ZmNQwmXN1Vg6ov5CEhMTiCaWYq/GaEyJRMBUw5Ok7aPBjjLFJQhjrZ6F9ynpoZFLyrWEhibQtCc2Mkbxm/BojhPkMi0RwI1gZM5HDufiDe6ORiBYdbkJ9RO1BR7UTaDjb5uWUJRDhF531HQqofIaMQu5I0+HMogQC+YdxD+e0EFZcyqHirFOYp2dMHFy4j2dvStmEpqWyY7aP1qi+IRkGNAf6Ll21oStoBjsEacrLaHur5FLypKJlIqPM1bJlXRRmVxUsLW9wR9948KROpmN3Txi8hOEBGS6YuFRUJffAbwWZglZShGCXceJm1B+1CJRLouguuAVmOPbLwPxtDdvJr1LocNCtlF0V/c/Pe0kapSg3LRdqZ/Ug7yn/0yvbau/lcT3Jd5tF4Xe6XtRt5yshu9nwvuCp53/uncuBIbZG67aGeUQd6bLZmoHTp6gISB/bj32JVviCua8Q2foqKPNjwEYrW2VUtv3k5aIStpjKNYuK20r8B1+3i9XwXXJllufVVLf5XgsltSCG/K7t11h61XKrZ2J+vKu3d/W71zTMzuA0InM4lxWU7HsatRWEYK+m2rummcNO91aV08f7rGRz6PY+ZLSdryPV5rKYK88NHz658u/iW29JBsNzp/Fjykz7T89Yxh2f/opn8vxMANBJLge1NOeppqrab/SeXwdkD7bzsVNEmShF3VaeWCtI8B59nhZ9uwjmutj6E+utdUqze9AZgifg2krrdcH2ygTvNWONJN0oS8X/OfObAjQNjvhf6ecFxejrMsu/lJNOE8eePgs93vzdQtY6G1+kl/mqTuLm+uUWHdUByD7oMXJmeBb1UFXG8kkMEW7R+s6WG+Wvt+ngg/k8uo8xvyEiG3Inpjodn0LGFgr2y70QAjNYl9UVJBx4RXDaLjdZ4QGawZjbzVybBviQakV5Rv6S4FD40sX7T+oXtvGu8582Gpy/DFPcx3UzXq2p4PmkTzYpgmhgw5zjZVfxVBYlpS9O1QofQF0CmCkTbD6xtYHS2luYQVO4REtkVXj7UkBpXJCkZGRZSk8ZkOD+Gl7k373IdzUtI0WSvU/+QVTRTZDjT1mnsgb/7beMLesxnKL2VANJxLnQ/k+HpCS9x7Lzv0Kqhu4bS0rasj9Ag8yeqYGnNUmqj40IQKYwycfassbLl0tLilAVk/qHCgzjmjWRq9cFdfwnD13cY+Xquc/p09nGbW59cVZq5T4iNItbTQ9KclH+XKwpt9vLqgiq/PQsEg8mO4ZNNLNqGrJNMqyy72t81tKWxqxQq7hUeBJA0DiLx8BNZQxO/++9fG7UREDgmpe3IfWIHRmJamsxpB2gJwiEYgJC5L9SYY3REqIXWOBfnQGGLJFVjwRKW29gFkRtPiGatsxiN9ODsiJ9OgalSHoPvELwif93In5o0C6k8vBuQDo3FheljcAfvTAVyfZyDzlunfD4A24TJ3cvFEUTt71g4of3R78VKGDd7obSLLIRP3KLkZc0S3GTSBOYyUCgDUlGdZCHtldK69DUvEiincMhgJ+vsKnuaUHDs+MCbwq1vV7PDiMs8GhHn63NQLSJ9RBkmT24tLNYnlxcVB48tLjmEjaU+/U3+WAPMD/qJD+eXVWvbyUnm8ApU7K+MCnotrbXeVrtaA8HoLCJ6d1njbioF5w5x8+Rn13cVbNa0HAokGEGavlFJ2awVv98a3re508Jy5LOJePCSKCdbW5NZmmeH0aFkvGg53y3raxgim/h4d4iLsmAavBEORoaPjyn3hXOiLnQ0uTo1Pyc9Wc/Xq75bW44KWCF0BMmGRLUORm36ixGVJpmb77HG3Bvfnk7Bsp11pBgBiTdkOVBZO5f77GDdYH2ftpWwxFlcHkJskDZu7cAQRl+WIHOdse4QnNbEqIXJ3uPV4FFieiU1BMu5K/mQxt5CIF+sPlwmcRfoBDuF46kvav4nlc9wTrDrhE6HTGqqDeuQlGMVxeKCebzPbxIEvdGAqM/a15Cn4SgvWMxA7HEIiDJcG0AZzoeA0ta3u5b+ETJIljw9oZVYrDo+rx+d3SOjeRvCtD3eZSFDwkS5yC3ypPSmSxyDRKx3COBe5kLOmKdn75cpWfWyP7wpTie0jKX2clDmR4yaMxzsGpX8JnERa+bmL9Kt97w55GgKhJruTkaOXycVN0WylZVBBg7PxE8jb6FWW8WZ9XT4n15Up1OZ1g7CmR3YBOPnxqxOGhnvCXE1Hhk3fOmt1SHH8VPX2iGEDCMBmGvLDVv4+p9GwDyVrrq2M284G/TA5gzn4N55x1/LwOqtuBjVdbV+nkLTvALjKapD9P3WFQEjX3FdD8SkFeQsZ7zd/6v5IDaOPlvIA4CfGvq7AptFWL2DJ1oE7wMWIrlWLTFDOG/Z+6dIQnQVB6BUd/9oaAqm9ERVQfXL+nKThE1vwOd5gJANv3i+rrr3Yt0jKozOjgCR7W/MVE6mJA1fTwq3aIlaWqt+fd2s/6MNFeaGcPtzd3VfnLuw/bNtLeq22nYMV2VrvKVW6SiUkztq5Jsaq0omTFlgbTwRI7aIye3BwpNUCt6hms71WnqmN9VQhD+wUtyx0MKo7qHsCPlPVWTXHGLUyjyvV+RGK/zK3kBXe7g2XCggE0E1MFFjna2LBAiAS8ZakH6pwKemsYqsR0e8VfHNqSx04y5KDpvmYCEvVYPl65au6zwwC7FF3qz7VsWthbpIYSjXkcfGY8A3Y/NpRGDwN5U10BV4sdXhoUMI5CX+kFGwkaK+OrAJ1U8tEc0BGL0iEME8XuSghy1saualF1vzzxDo2zHIqJlKJeZos974ieBkYkPUPERd55MuqdZHBRXA8J4PGOjD2perFrLoeX5eSYNASrlKA084d5sT4mH+oqrjtg4YMQ7N7oiv2EWGTbZ2m1Jzycz08wkuVmxNZb/llLyStRFm5AhNP81eYkE7X7a/KZxp3M2ETbYGeZJUAZnrLSDOxQT79Kd5tVhRMFeEBvfrlWukg/tJm3gLUg5DHR5dP8ojxaHjTX6PxiJ0Z2yixYlgwigdy6IYM4Mum+xtHAiVvja6/oqhNX3Tk4g61ZRMYNU/JnmwRm7TU0tepHRzUzYXN0n5noqCJL5wfMcnhvhXgBZ5RihSL161zJBoFTJpvWwwJSEeEiipOdl8ePqDRP3PvpIT8jFpMKipDHRZK/XYBhNIqDKjyRXkPjs8KTOAE4ai1VkheXzs8o4DwmT0DV7B/uaKPG1hQSJKakLCWQwOXxFpggm7sckZVi6IK5tVM0lRk8YsS/a1N89pn5UknNhCBbQjt533vLoHY3XSAVcrqalUfCDMQULMm1AFG7jXQ+fwPdP6WDqcu+9HwFI6qtnkGAwa+WQMkp1MBdeBDuwyMUyMtKDZnOZN9Wqyj37IoaGYvc4Nkw1FWYXesiAXJnXbIJrKFk1azKcbTj65czWVLKyNtnoC9rdrf7/9HS7DUXmr8fPA5n8zZ8RDM7FOyXOxRhiUlFZnNMO0qwwl7bRjoFZkKtm72GkEjHA8BKYY6XnR8KPAEEuf5qx/lDd5lPhLNp+GoRCizdoyZtwthVDeYF102aTDyWSabHdRVsDrMKS7GeXNGQKbuxHjbwQqrqg9UMEbvKX6LQWK7IYsskGHQ45XIi+uICg0EPPp+E+TcmFwKjkHzWHwTbntVneoMAONjne7QqzGod8fPe8TJ4KlhHF319apuZu2FGeR8K/x4n+mdOS+4qtnsYa7stqIc8CGWyUktj1Nyyvi2vI9M9IIlKzGisZemx0DY3J/QEGdvrjkZjr/38jpBBc5FYTxaEkJadVQKUqgR5O/wIIE8Q1gFt/YgzhiddIlf6dQKfjcsMuOXwo8pwtcbja8ZPg0Q05B/OA06tY15eWbMVltdVVl9saIjmGGQ/lCi9jukRQ1lHLMBflVRm5iSvb+SYPck6MV7RTcrMSVPOgNGvU16lSe4pPR/LO/zQlUpazvYEad/oT4+DMQbtfC4s2rO7oPzzROfXxnqtvM7Pq+obnZUbevdKjPEJna7Q18oV5lFjWIUAiJTpK4koRv1fmsJqp5/DkLQsqYPmOFnuMBgF6Km7FmeTqD4TJpCEFx1G0KBv0LBxXOvTvIDNMGCngbTiL5EBmFY+6fU1IIXubHSJiQZdzboAC/0johP57Sb5OXwjBvuXD5Chi2SFYohNLEWWerxfDSrf7nexKSWBleFc5RmP86z+myzdd28skEwMnclQwQt9nz97OGt+e5CzX1uU3PzrdHSmv8Z0ZKGuvL0rMcEvdod0n6+axqKDHMaf8i3kWFz1czbv4ZB+n4cEyCCpseYbNzXoCyToXw0rJr+4pY/nWTqM/70ZizOZko0gbIRi8C/Nlag4pJOqIQwrbhfWMzwTSLVeMbn85NN1vCoT7Id66msANJHHHGAspZqhtk4UUqdhGfhCh8ICTLTEQsSdsYl2j7+tnB6GZdEXYX9zXqk/jBH9vRj9a6XpIsDwtfK6vrjzfA6/GYXUIRSosE5Tny8ygo7UB8PLzej4xFnUaoAOgCjuWx+JvEYnTBRkcvBhBh5PHg0NdvMugbGnhtSXqqL/AVKKBDVDZcX7cW+L5/zpMaqcFHAayx3qaUv82SpLNeKXtGTxXRfN6dKLyU8HPBfOZx9X/YVfwXoVTLT1kJschoU8XxSPzCVwajnZXfeCZIrKH3c3hqkTNT/AW1pJCK+j0o/ZA7BblNyo1l8V7HhYsKaejfQt5Kfcm85XGv7bpNy7lOWSb+XRV6fuLAN0neiobUcp80/aqBgwUOW7i179EvAoXUwc/Gq5whPoXCudNMpZZmltvNd83RiCsuLMkIC/JathVwMp2y0pZF3o7XYQdQjJPdLKT/0bXh+AgRVi2skeNAAiMv52Uo90NyvqRWkKfLaMqZVgqRXgiqUdooQSDKyPrdWsQDhCTMZSBGebTWs1VGhd8y4i9jb6f2H4YnBcgrt+ZrpKCtH2P/NaHTXlZYr7mrP/70QarzKrH7bBWJzTkaS1m4MDL1ZqIhzD3N3HEeLXRmQTT0yTDCf/RpJd0WRvRRydfU6XhDOgHdmv+CLaDkXvsrDrIM4nlMXWmm3oFt8FU0mE5TOf6/53Fplq/t8ddbjwhrD1XhTZLTMf9EVZHZveOX8GauMpfe7pGqWKtDjiLEER4dIefTWnnJjEqfZcS3AmOfcaOS5eOLOJ8N7b7jf4wnOlV6MSE2DuMXwy7LhjZZ5CwHm2bbHMHo0leL840UcDO/WY5BdB58WsYLNKFcwSiz5CvNtH+1hyDdW0sI4YykK0iD84jekYs/G0O+6H12L0ZqF+z5JWNPL1b1jpLhJdFBpJzUk+d7ON7AyW6Jv8alhEpDmDWLY6dvc/hRT5nFnLYZv5N2KiqCpNNLMkCeFw+FyyGc/IVsqyUyU/SPrVUMwybSH2CS6NPpJ5cJO4jtcmeiBRP8KWUgBb5Fk7jn9Z/ig7x+CgLR0knZ3kibkQJaWwsKU/bUgvmahKz45avA51mBCTxgGJiXjfoOaqxLynYmfvIpa94PzRLfkF8bqQuM/hVG8ngjTEqMsDCa2ynv9jHV6goKltbWg+B/sVDB7lFW3N7wkXs/Is3Uh5vT9Zo9FVFXNjTaUWV+SLiyTD60NQtb+ooVcGEm7PKrRrwK+AKYV68IrngQ772sPNgV0xLLr82uRBnilwlYiLZmITAzDG/bT43jJXPorbI4DokmrES+wmyH5fSQ+xHgIvwzJLYBsucuxkztJVeYBQlku3QLP3ZL/LXa3IYkDaEXZK5edrRBGV5OiRW/+nY+CWo65RdNqHd9Q4jWjXggGx8++2QoI7RVvaqXtXxNnvKH+6CbK1Rrz53/D16tPw3i0jU1vUVlESAJjUn8voIDKbOa+thRsKiSgWW78+6f9aaganmNd4oJdFGW0XyS8sQwuUNNepcVNBq7CXAjjHw0/MMhe47aajBVyKey7mfYp48GNdCE0YW5E/FIYWtVcKUN+ECPKIjjDdMKw6gAFveh7HJQoRahTdpEmf2WFmUZG6sNFEQbnfB5mBcNE8013GxdXDp2XcwcyDAwpvBO9dcTan/GNxBsEoVLjqvKTt3D0BY4Sh5Bvyu3hin19cjxfpYrfmAuXWvQGqOLDNjHT7VzOo4FbMy7aMHcT2ZPKa+Ai7l3T1fumtFRvoRDYAlvm9/lW3uaQsqj5pYcWPMy763upht2tXzxeGMTUi5Wfalu5ihQjTFWaWBf/+NKoQZlLUqNhiumehz2kUWqpZ86vfjcT9PjFOwr/yUa8NXqYkvBLiunIrqwPw/5T6gX4Uh8Du2tpm9iE61zlA/lXNVs+sI1CURcp4s58r6PTjEI35gaiNogQ0aqigsjx59ZshOsvBWbeaq+Tysbc296u0/ZC14XzlFZdW21/imfO0jG84cC9qTr4yBLqyX5CMNvWHNY7WqU5nfbzJAPA0bleZRYnqiuIFO47CJJV1I2SIH0+dnGhsyGr80sPergh0BKefAGxKDcSXt5F1XualOvGR72PeE5fOU+qHex4U/BLtjZQh0xky16CtD0ZYRkm58JKJ6Ph7H+u/yrMVamwHNZvzrempeaX2Hq3vRCgEFkg7wEPR6Fh8KlcFbnNCEhIwmbYZRaAvJkIw7/jwNBK5iNK0Ig6AX1RnLiU9tk4xo0bKwwQNeelzQwjdPrZnY0whXR7QJnLj8NyDL+klY7CjEDsOIcWeYd1wTovtfWoNRvPUN3u9MACl0zBaYYnKV53KkEub452RTx0cdSyoFnUM/8r0hnzNgp3F39oxJn3s6Fumzu56s2FHj9h2JX5MWZhr7LpVw4hJy3Ju702t3vPoRZw1Ftu7Avs3sZ5RiaiAQnitva5rb9eshLFA35i8gBT3ciXkUyIy/AWz034qqTJYZrAY63O8SUo1tdPvxO8y+L0tiCbNRfiC+lPI0MDnS1dMwa1JRpBxOF0VqSc63BHf1UCt4dclG3SuS0Qp7bxsHvUNjIJcSmg+obBMqFC8tluxtF5Il1pVr62rke+qm/I/ZSWNuVowRZDmy5J6UV8Eq2wAWSGwY7qw9UNf8sJf/mv5HCCuASd3F5CLlheL93fNo5ulTPTmeF19/StTct1VmjMjqMAXf5+9i//TNPvtrVD2G1GB0DzctFfKSjylLA30qk7X/iufHCgcZ8nKA/4NpSNP7H/pUA3Pkfnxc55WSQhny4N1ihehIQ96ayTYf3fMxWXWHPJfwBUvAYrTAP8FdUE6gAsIrGbYIxVIrKY2koyBQsOqNeTP5SQphcMd686SJQ8owx5i2J7r8cZeUHbkmxJdOq9UwzUddpD1mJXNvjQBJqKsxYdmelVw4j5CZ+FRWtocOrrfP+E9C/jOeiyJ+pL2bm7b41P/Zli59kFB3/6993WsldSIc6ddwoEsm2Eaj9wNSGU9M1zAyfEL0PGjeLSC5Lv9g7i6KTP+UEYhWA7E0bYPe5oirV7Yi2J/eTvoCai+2bFBmvE45cosHZNjz06Qt9h/GVhP1Y6865QKWTbUdLEBl/r4xgU9q2F71IjoIBr/llXCdCwYDhJDjO8OixzXMWdBL4wE3ZbHXT0RByZI2KVE5qTAJJ0OyJpNxW+oAoCtiLaOV6vpf3UDEJE8b8H6mucgXPacSUFsSHnRo8yZ95AO+vLkq5nZH6uWauDCa/x28iIDJZFZQgssqScpGMMpM8IPq50uUS9VhehmBWeOrXa1Z7OfU0TlAVB4qu3eR2NZ9lozJoX4A8+X7BEUqZAt+L444EaDdlv5Y6x8aXaC0XUXUGeQUAvdn4Dh/9Pg3AHEV3LG1n9BE8o/+PEfJa+FugwsXPL/XiPwxSlRbKLBLAlmHD0gAdQDR1w7gkXfLpyIBNHocl5CchuEj0ESsPKYTt4NW2uT1D6stGTFxWduj8YFvo4udX8v8nBpRQpPYNDbwc11H726arkM+iCGBtwmxqlsYAzXMqNL69cZ4WeW50csqL8OeX+/8TrGUR7z4Onu3G93HThVW0J7rug6dkdJr3GdfV0SG9wVTOJPslGIZEMaH12MW8G+tlhQj25JOGXAkNAZ7LZSsgrfd5EhbpTIkGFOmtiiMqgSjooXZiT0897h+66Zidc1RSGfLHh6Z5bOabogt8i1n4/uP+drsee/bFvwhyRiUw4GCQ+2FRp5b5249JtIFVJNSccwdkDrdKcW2RPosVJ96z9syEnGjl6VSQzKuDr44CuY4NAb3Jg+xFadTS0OdQFd459c2lKVgimg/3w/P4nFa1MuCQp2FxZRJN1njFcV62zKl2HiKO0UXYRvCr9T+So5t1HpTWNOTFOk1jBw4mOb3CGWMWERG2aWCeEEnRAsz08oBjQeEuT8PfHFEueviLOQQKVskIoULdqDhgKFTp4Sdh7bQ+OoJJW4ugiwMHj8Re9C68OC+VdEFtUM7ZJHf4jzWI4KsXaJPE1VKEaBzEFdumxsPSPEAjS3eQXbFSTWpGOF4d+6uTYY199t96PQI4jNPQ3ZxTtdzRU2lWVota5ASmspzrnrNLl1QgCqwRdqw+a7ElwWK6h5mo0GCbJ+GvQ2m4uvXJXTu1B6pJ49+bqV7aMjQO5YsGlLU8tmWdYlwkoKawnhHeYghNNggekF46uVgR7IzT8YAHLvfD6c02CUgiAqTP5hbiIDZnOWVZDXabgIq9MjhdMArB6hGPLCt2bAFbo6T7gwqIoOXgcNMM+sgneJOH8OKsqM5Ewgl7FJdgVW7Ko30dyX44WAQVxS8R1W8UQZoiwLmcb0gPHN1p26F3EXN9/wVNjNIjcVHvhbImDspxkICqzFQ+atjntumA1LQFBmGk1i8Joum+mSExmbhwA+hUJpXQ/u2TSMdwDqpcipKbyZk8qyOCAJvCtQ1tVEQ35pORzvndcZGphY8TL+HfSOd6Odmi2PWAJ9T2baIPGzj7ZifDgb8aa++LRh48UY7Iy5DLHBCvLUZMBufDzqEz1KzD/7MGzoaFUBHleVNyU/NjacpOG8Yh8UTO1LRyn4CmeSCMU+mhNAFPj0pyehkELCnHyh/mxVLVJApAcokFVVq0Kk+xdIb3A0XIKNwQpOe/saHtfrZmrpNVaD/bx+LFLFEplTBEOij7he18PBTHoqIbQmQ2Xtxj7JzeLHz5dHw6PS3nbV2VRiNwHVSJD/igs9Ax84EFfTq5wFN1ETiUCvbhWMnLezl5sAdOVeJDleaTUxqjrds7hQgFhHDxrExTV/OecXFKYpbXQYohVI+Tpxn0M/fB9LNKs66mQXemawDWe6O3F2RUf3fvUToRbRVviU/t0snxDALU5DDFBReqT3Zc6ih8plMUOTjrgj32dFAHWeC63PhrBBd2hKjLUOyITJJpT++8NLB3vaZxbSVfQ78lEIQya78KuxMZBWObQgU/bDAWxUMyBDw8MAKc0aCkChqahPMBedoVQo4EqUvBLhR5JwDGoUa9Zu0Kxk9xSUDEDcGIyoJS7gOfYATBFu08hY3MSC5YBDJ6AIL/Tphl+JWNJ7OZKJRSDQ55HpbxMAAbg3ARILUbj1YMYREnTxtOEbwO8DqvBxQwQzBSJ8Ce7DZ4yxorkAkHKUsFISD1owswwvy2g5QpGMghSb0OJlcF9UmONNlQYjUUR56CoRZpsPwz7sRiQlPhYu06VeKpeuolwycVUrgQnxGtidgunyKFI00Gt2Fd4Zhj+9Jy7Vc7xayQI40bUtzM36lQ6Z2V92iRBLEWHnDhGnP7LrEvLqgCLoNKGD1VeIM3pBdPwqsZkCWM9/NDXKwoPgQe8xgDZENlCt0Ko52D0eWkOGlQvkj8D/OdyKgVWSplASK1IDs0sSR6ZRP4qVgHR9NLjQkT87LAaWCitenYJPX6JHab2a3EtsYGZaov2itMT0IJtTqWo7Lep6w9arcBbg0K8wrUpG0IjGR7Hpo0XZcnr5AbzGB3iJrFivYBKHHAFEyehpUPDWJGe3el+9MKCppLNNFycTsBDQFbCxxO3FsGzjj7Ew9cK+DM0PKwD0a3YVSSzDnPQ3RTFYZ7sVwKkrOszL767CTjwGMEusfEJZcJjT1qzRocjRBTkYb+Kc7IPIMaC0wm04t8ULi46/0dRu4NTzH4loFuCQgkuAkhfQDYEdu6jDNyxX3u03SxgRcZtqhSZkqLeNT2DJiOfmgh7bsgIVOqxaX3SHT8xRXM+ZpDbmSRGikkXiFnKWaJIeEPdwMwk+XURK/zqJxZsReDtE5t9wKlyfwGTSR+ongS6zsUmBG2RlxIqdTgyp4qCK50zZ8DzcPOtsUsEgHClC1B+9cdU3JAk2OhOt10PALGApob/Jlw7/9JCXlvAnH68Nf5aKx83NtqO8QDKYMjIHseSxSbzEPEZ81GWjaXWK+09IugMIPdtZZ0zwXHg7VtXkjTBdIZnqb51Z7HCtap2FbVJdvCva3QnkbgXGUEvLpkFrTzM4dEljQ5GRyJmmlIGj2gXAGwYCg2h/NVJQZa92vOcX3Ga/HRQKgIifvLICsisS/bR9k2BpqlCNwPLDwqgyqsGHHGVbq5lIA0LFyJ0MfyQnIL8+gpwMA1trmfrdE2hBi9cUoiIePrRKedBpbFpGqMkTRgn2dhWZs1b4QwkfPZgl2OiAMYbnDmoo6ZjOYGCMYjXdTgG84oDFpCw9Vv31aDABGvNo0+4TUGl5OxCa0bzPN5j21KECo2/wVK/Aabs4w5Tw8wiyzduToPjVPXvDGF9K9g3KFQMmFwHrLTerrXPx5lR1UiHDo3pAS1dUQdmRI1yvEILrH9pnkCI2eU/oJ87/9FT3MeKAIIpFn9vLidgIYEzoM8bTx+Kpgxm/DSV4JxRXEepcKeUuY7JQF2MIY4n+T/+Yqs2T+mxbmdbarVG0VzFZ2DhsDD6q/fFpmMfXGp0/EO7yQMTVtAN2QCF9PKZ21BeJJ+glrxccXpbZiBOXOkEf8X6U7J6rJPUlrsGUKg6990EWtbphjuS4ZY48VQd7AyXYuqwaCUOCAZMktipwxVPl9ieKmrxBFHboknEyX+YHMyT7fs2fCMDggF7F2bwVRMnF9ynad5tc0hBHnUSE0whbiWVU6T4AxU910riQr8SBmdtjYrVvBY5RJrprpwcj8UNbMh7XsfCMonLXsveTwjCLiHDPsud720Tk5Qj2Q0tlwTreQDIA7pGtGAf5u8DeaNflJrjy1VEoWcm/wLhRhsWWm4xPrAVisKztHNcXW1yYDPTwsMBFU/x1Ud9ltkkkuSeqeHnYyqayrJj/OvlGmbZWaH8z6ZVM6vlbmH376uOaPAnqO+6cglKLmZvfc1gbtYiPTOETCEDaWpifa22mDrlXJtXG4Ht25wHHDMak9hP8rT6xzrFii6lTnISLxlPcGyaZg8nVRBaQ1C1sLoeEVFR9URuLTTiwE1Sfx95CnWATVUMlyKBroChYCpv2+9VLvbCpuvifkLJ28+FJlW9y8+/SrxNm8n/eLzlcAuu9ab6U8+ug1zVMJ4j3WQXd5JFXzoBpG66nU+MOWVl2etVnGEgHsb1HhNvQZHILPzPBWq3A6UygtlzTLkW9X3/mrQYFZYGTRJ1FdxKO+HhTKEaKrXnp6Bk9ggERZAeqly5c/E5hQbWK0TkwqdOAily9Cah4GlxATxaBdCCHvUtpS17RbsmqAIVwmcXCPyX1AI+wEcEhvzyrBAXP4NJRUmCdLsIE+LiK+If+sO+58+LUuSUke4qi5AajxC48OeyPAMWN3HwhaB+zf+Enf0gah/eZwxDB32/CWG0lWIDOYGoGp5FSigBBTHxHouIraeYZiKrN+ndhuyn1CC3qAQLA2yaCYb4eRqKLc6XhKkNqn/TSMwikHsb4F1ePl8f/k+3O42Y681VgayUd3yIixmwuy0t4jcL2ozxi6gLZylu7TCDMsNBRHcGPHIm1MZ1JLdSehKtr/iSmhNXOBR0xiiHYT50ZS8C0Oi4FhBQ16/2CbzGlsAtimCgES+wUksacHwnxxAKGKTOdLFCWVnsW7Ct/POm/wR5yZlGRGMzTy5gao+T0zbZFpWvxpyYHCQHwzdVY36sQN9xvw4zOpk4mYvCAhQkuGg8t+ZCfvI1S6vikxwDJ0RXuM1f+/WCwxZdc9YAubD/g5xY/R3eVIRS1f7hYT4T1QypFNDOX9DAMF/2Jz7OYqJSk+a9/rep0c3jRRczq7DoxtfvamyNAoEh+ByWBzW6mwfjR5xW0xrQlMg1KQfXQEQj22M4WomJZrFvE4mEglDNEHe8d+MBEBDQknKKiIwLTISe/UwT2rOnBEOOMCD3lkgtxFAMzCFveDCaa1JHRhRKPAF/t6te3/jyQVQbJHpFqdtWc9tc+Li24qQsqoELpYifDHPL4O3HtnAhq5VCXRDCXPV4BRtlAzqlhuuTeaIUIVB/gZZU/c8u0SSUHlZszgjCf+n7w9vQ1QoD6FMFnZF2RyDInE2PICP2hQ8wl+GR/JYU48XhlkElhz1bpl2atWFVpTkaVKqcprNrA7H0q3HOk2FrRsM7Pa2GxTATEwVnOwPnXFVTDxOyV2yXSS4i0ApMktwxIrP6wwwkHX8jCPVJ+zL/nlvueqKYw96gSHHkfxQUW+jfeZOwGyw9s43m2mTg7OquQ126gQUEU/JKDh4gkXQbFO+brPoVaFXAWWfGVqOx+puPSLJ8+2Mccjhvl0lfr9ioRVM3BZBBOwyLdkZlUk6oTmZqAmyhsW89ShkLey2Le+2TBmMV5lgWVPMMSB1OLC3CyRMrhvIeSU2va2ZuM8ma+pwkXxpyc3U0nquXkauQxOzI+/j7iwtV+5rMVcyK05aTsq6Z2Y8PfhBbOGLp+NhHOLn5Jkz4F4G6bjDnXwvGbE91Jchb1JHqhVM0axpDgydXeh3JZJNgJJpoaRZllLD2xJlj5WKtg1XiqhgoQhxfaJjgreCYiq6HLaWGeS7XScpp6XofvCNw76/B0/hE1ZMg1PnUkWD4P3qRtQ8wFATay11Senq2eEcW7lWwx68QrdbavtsNa+SeVZndfNmWvM14vYDG01WC8Up6LZceafu/VB///X2+viwXMSvyesDdQYvR1I6bR1ElIGIvSK28ocPbHIVcp54E439ScBuW6K+zXHZd3rved/FZoWpNMX81bLaG3v/edfuVO8F4ylRzphEJEEzM62qEBeDrhPiPVMNUQpD3fHzh93aWYTyw4FhI26Dbgvahi6VWFjmerWyaR2o0EfhFSPsD9Ay6vYB/xSfvH17mcYHSmcun6XLkvihCl5HpaZum88/wPm6bSx88PLh4/Fj6Ju5ndOU8jZ1djD4gcLT4hfWPH/azNmDdcQMI4WER/bTfls30dxd7/dfPMzjkH44WsSnra2xkezGTjTaaPRaCutz6EJmVDsrvLkPbBX2SIqJWyMyDdrdN4GAYGW1PJs0VaplEgWV3Z5LEP1oI8qSWy7KNpy+OmnBUi9rYL2DrWD2KQixd6BxuzhnHe5hdshyzFtTyfLa2kiml7+BfeZvePM+eHHvBkH54nzJIAidRXMpCdAKjGc2po5mSGrnqHo7vKiUUdXOLnshdbAXWX+KSmqV3afgHuiLx/1jknklKJisIFlG1VBBglvi8qwa67wJUyhzyKdzS5HMgGalFCchrg9/iun2sWstfPjq8fPpcxzah+4hy6jbucRgEggJsFtFEOtdFyxe8TIOGalM60uujUw1pQVmjRUOWpIFniOCdqQqWf+Nra5aDOKvXwb3XAgIxzUlxlLxKdreXrZIKLdwfeGctahakgOs10zE7hKDmWiTeBbL5Dww5WwDdQ4BEAb4iH0gbMWYQUODsWBhfElICLvID/pBHpbAqQvOObdNpkLfieDdynZ7wrMalf46EXJAxk9qsi2JbNKchghzFAguSdA4nYamigL6xt4IzOAxm4VTjK+TEh0nMWs9l0zlnaStzZAOaczUftS2WvvKTDUlthmuCAbOTnVJJPhOW41DXSiH/3Cyw+ZtyWhhuvtcylYVWlnaNemYjalPcuAoU0pTZ+LQ25WJQ1IfLZSyxZYtm8TPG6OtmJKzYlDILhUOLaixqkt11/eUFDWc6vPaJKVYdcRaO0+jOq47rlpk2JYkHnUjDVbAoTcDk+xu3B/oFilG1Xwt3TJ5tLbdBlsTXMnseqVDqArw4+TIVoy/aW6LICLFGLGvfp7ruSqhpoZIgdeqt0UnIv1K7dqtiNnYkqpo864tsjjik5iqV/Awadm3MlP73q0Mff9tMk2ywvyS6sAnPe2rIFJ1PuiG5KUk1sbak5gECaJmBsI6Kn5bVBcwR9y7Mk9iMXvzm3FUouP6Gz233gBJINdjN6ferQg03vnQmgaLXCWCwxa1tQiOh5/6lgkX36DpBVFTsb5v9dPzcKEd5Y07ozxOHunj0wf9baEx4ocDRtiGUcDo2OLFSsA9WUwhXdDGkyeABVx4cwmANKYc6MUi0OA4H9I7KDfLcNH2qSKaSzw3xRnjuXp+P9qiHPcbVZtAbkswMvIlJAxtQaO8Byjjb7gXZMDVrrbnW3j7SVvzXsZSDNzVKafpyj/566di7fGMI3FDXGGDIDFgrcYIzRqxVuVoODmTpCyOZfrznhIL7z3rP4aPusxScqf38zkSKKMVtlqrQsinL8N1ZINFn+BLt6XSAHjWp2xTgfYN397UNsd45SyuweIsOWvIDQopI6JAbBIOvdXoOtFtQQAKBYukWSxkmevZE++v8/f6djquSjF5kyD61KaQVFXZToiPnnnrLFM8iwHPbyvK+4aeSEDW6kQtHVfQhpTnZspgO2sztmh+dFAzDQteLH6PdY2BqdLKnvmBK3VfuBgYdb2XO3yOn02VZ7RnvTOuK1MccNCpa82352vrczuVU1BNqDpItNa61aN6CaY0IzkraE3VhCr+IKEWN5IY96iyHFNzqt59Nr5Or01lN8wTh544PsweVmCGwyMpz+7wOstDPDeaj+2lOPWXMf4TKCjnhivWtvtEaQ/Mhql95VqLHhKWbY9q4E5D/dw8Z0YmbgUqhBA4Hz4R3w/mWbAdKh4R+gYVrWVdAKlUFzMho32YxrXP5ZzF2DxWi3Ns1Y5kUlXTFDLMXV5ukOvAtIARNx6mSkCq1BKMwv673VIWjVxV7LHq2ML+EzwN96Yqc62i0OPQvQ7dULMecZjO40d7pSPkATgEDo6hKwou4gpAGYG65nec22CKPvcYvEPXmn9omBtNi6/92PPMyPg2xKu86tlvwaHXDZYrD65goZEnRtwGZVY/mo558UWkR7JcoFW0sNYr3+1JSsm+k1BLvWZCbjeLFlux1ErHIsAP1a3zII1m47p1DANRAMgui1Rz5aOMPpPnHY3nZCmiWu2Z1ph97rT+8R6uPIvFRDvxwo2quKhYEpnlpXTq4RO9AVRQhZ8NbkXr0pmBrT8Nlo+9RT63N54+CrTH4CSqNEWnhWGPpANFvGfplEr9WhLxzUUSOo00R0VXyj4w0eMW0M+anbr1g4AzKGXSteVQDalJClnkrOmaZ0bGOlZ4iWuAnbjboiVjXonKXf4FBiQq24RCtxFaU79pzcKk9XYUHPNUFHCK/Xv8EJUThpgg6naKZItTn5ul5t/vRoAImEh2FZ0F1+scRxzJkMAm2pcQ8KiKAoK3Che/ZZV6ETOSbNtyzC5xlfpqCT39ldxoJ2I+PHRb/lRljwqP3q0YpwNbRXdY+LzCT1/YojpjvXr6lsLVQ/vS0PzEOJN+fLmrY7Jk30gw0fm6vUOsGZh0rflPQm5QqDmT8K3sbydxS6gTK5MVVImcg1BbKqs+UyVt6sGwUT3c64fmAUHlYZOd8mzPXEr+cC56TIkubI6c/lLbO63SA+Go/WbBGZ9ZTKmgNMVcFVCDW3BLlvQy7JAF3Tt182fb1KJYJAPiM5ilUnbWYGWrTDAAKMb2LWXL6LGhr3Y6KhmJLXZIUdXMhifHQqqseCFvvmLKaNQiNzdGbLn7XG6NJG3fLxnPqTE2FLEb5kQayyQhuUGhZKfhMlH81p5DBRhd71TbYiMyYarrXixWXiwkFS9QgP2m3uHvNJnp7FaKMvQZcXsLjWKzgpz5RdnNrFfQCuyy7R+DdyiCYispIqw0VCNPe5yCzTJ6MsDpI42NqHomNTGVviBywxg6uxMbYuYrfvhdu10NGXF3JZgzrvfyvbCdVPZWmWXyeM3XmIziXLM3zCvPeBYuZmdc9KtKVehiiXGoccgsPNmCjhvrhjHrXkpvqKRaQ5/Fw85/h9KOBjUxcFWdohLap1fmzboXo19HMgS89ViXqY5De0dKkvJLPHI0zoFmnYiyuZw3ts2saeQqzhoJCfhhmrZ3OXYR6VZpPzGVV3CBTC3SxSbkdoELca5Dnu8iI06jt/tKcUBRpiYp4oyAq0j6EOT73SF8s1XLgDWqterv9dRMeaYqXW2hdr6ECXw6Rd4iisxtWQgIh8PDvA1o8yC7Ec+w5Zf7PXe9Ng3pxMNfv6r99NhUtFt/ZZAyz9IkJOEfiHKbMVCM1ycSqciv2y4XeBQyxVWmjLsnWbe7ymLZCSnXdA/kS79tMxsWqsw2RBB/kI+7PL/P0zdOD+eH3XZ6m9+43HS4AxdJXKeWj6wRDWg0VPlazXGCqy5cUPrRtrQXy3XpRH5V4p9ZS64fCneIxePq85RXZVs5fG+WUHXlledSEy1ctES1JCOKV28XovFdIn11GlOfrPmaFFR90htihSo4dysOJLUFd3QJvHOl6r9zSygoYtQPLODj148PZW5U4EXrjn+DNzoPQ59dBOIkjlE+6dtB/wnGJEl2kve0iiMcKhETJkndX6IhOxs6C9MCSl1qabDQ0A2PeyLJeeD9l4/5GgAMMZjoMJKpqCU7bwGe2dcFDH/r5M3SGWhg9V+Cv+ry37bgFJtBECp+oYEaP42MW4x7XJdM0Whi6s+qBSg7/tjhAKlNgpYuQ1H0LJJmyC3d0gJuEa2VmxebpXIDiFAEufGmISPksgPNI46y8jZPGGP8ZlH30lcZhZtD2bu8ps/ELsMR73L8ucBoAYxOiuOBm4rktL4A/ib/MOqlUD7uFHifFri/z4uJUBzPrnFJkc2kSQk3mcxZ3TIbcDLHIQnbSyb5pHR1uZGGY1W07Jj5SHgmnjffFuWmFMm2784PRUDcEuOBnsh3/CuyczzsX3+wqxw67yiCszQMNXTZClKRHVtp0tSOHWg1+GS/ooPScQ2csVfqNV/dZBt8c6cmTxG1egHHwN/nN9TRZdK8xpnlNnty0cw0lQx01zxqtn2YhqY2CGCocKYueRH+Pu/kRV4LP9oYNSgsstz7zDZyQUGwBZsobOgLiZjrs0slyEE52SAtjji9jUIfUuKRxjv0MaAxY3vEkqYHG/9lDzbPYoU4pWs5+rZ3TGo0Zf89F7ZREwtsnvlZxh4Hzni010w3xVD6hHqbiAAw5P/MkNognvVJrsJLAC49rDh9EDFkj/33zqV4RuCRhIMuAj4qcViahvD8SvNZljH5IF8tJI+WwxYcFP838r7WPtVt3JBTRUHzQJXxIeCuHt5XKp/eroe61ZSqDkq+EnjHqqF/EKzGiKmYxEL6jFWsv/uFhTvdVK3yVH8r4LtYE+i9Q2YLDddSvRratFCLrTteR06slZBmaxQhMAt71egbo2ayBJ9zZ7WZC2bvK2s98NrghfFrCr1aQrJhjEutiqwUyeMto1Kdg9INV/WC/Grqkgv8XC7O2giQQab/lFL5+EpgRoovBbpFiB71lUTeitAr/v95x6AMwyTyZA5enqRk6HPOMNmawStc6QhPek6m5bSOs3kbmKR97CHQeUZPalBnaqWVdBCgVXayCuwuHasprBY86YQGefd3FcjsqIwCdHO1OH2UVU0JLXBpLzIts11NFa2grFHsypBpR4uqqEof/TOMJmMRYx41bAzqTqqiqa30HFbXsTjrIQhpM8RA3YT1RQYwMtDbKElkR8JNUvk7FIgB6Y8fpz9bNZjSwQzPsLfqO4rHeb6iiKiBR0nMxjMuqqCnmnznD5HpAWfg/rB5aM8GLGfAbKfPaN6lS1BtTMZbdf6yFQDriLn0SVE2VMaGo2tTq69MVealpLPxjt8YWWukT3WN9nFavTmzWxw6kLLtOu074YNUe5fEfCIQf2ikoNIDELnOEIyW0BwBJLqMXzpc6ZkEmcLPZJDIcqYAB1/PFKHw8EwnzGRK1dVqk1SPcyvQkq7+1I5kEDuwC03oTKuc2nXcHEMXtW2sdqioLTCjK6BSljI0mkc3oh3RFNDhcjalOs3ozDOwA+3hJDDVOG/Hk8k7MM6JL12fSUtUvCtNaEPd67bGkEo6wtmORrShGZ3avJJsSysaS1STl/UpxDctUZbGtVebc5q70VVteaL2Wzk2umNRTKFd3zqeqd/AUlRFpcJIZBm7xtWrhRbvSC9PbWhByzbjTbDbjeWuT4I3tT0TWhF/qFU5AzvSDI76Dlq3+nhnenFjvdXmFZ6XY3zBrsvE5osW4zlHO+wICN6iNkSNx1iGkLUVnxB/6z/ACgGO/yXwPe9A/fwsWNld97toLqWWlcB+vh7cXngxf9Dg81Hsy/LD3ENSUNUI03T+j/MrMJby+PXjFp2vWyucSGa/o8CXKYzp2PGaJ+P6r8z70YOrS7lFJWId4P9x8l+J8WPqSQUAAA==) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.2","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Library adopter","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["library"]},"evidence":[],"taste":{"bindingSHA256":"3e361595113a44987e3fbe95b12234dce0fa2f38336c00b73fbd1809041ac0a4","decisions":[{"rationale":"1 subjects are explicitly linked to the selected Questions.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"design":{"audience":"Library adopter","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["library"]}},"rule":"question-focus"},{"rationale":"Retain 5 displayed subjects, including required references and their declared containers.","questionRefs":["publication"],"subjectRefs":["library","project","project.profile","project.scenario","project.inputs"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"question-scope"},{"rationale":"Focal subjects have 2 incoming and 0 outgoing relationships; select ELK UP.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"UP"}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"dependency-layout"},{"rationale":"Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"UP"}},"roles":{"library":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"visual-hierarchy"}]},"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"UP"}},"roles":{"library":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"c9da52c5e2e14513439941fe728f4f4213c3b0bbb0e1535e6d3b5c1bae3846d3","model":{"subjects":[{"id":"library","type":"rectangle","level":1,"label":"Library\nDefinitions and contracts"},{"id":"project","type":"rectangle","level":1,"label":"Project"},{"id":"project.profile","type":"rectangle","level":2,"label":"Profile\nSelects published definitions"},{"id":"project.scenario","type":"rectangle","level":2,"label":"Scenario\nBinds project inputs"},{"id":"project.inputs","type":"rectangle","level":2,"label":"Repository inputs\nModels / Org / decisions"}],"relations":[{"id":"(project.profile -> library)[0]","src":"project.profile","dst":"library","label":"selects","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> profile)[0]","src":"project.scenario","dst":"project.profile","label":"binds","srcArrow":"none","dstArrow":"triangle"},{"id":"(project.scenario -> library)[0]","src":"project.scenario","dst":"library","label":"references definitions","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> inputs)[0]","src":"project.scenario","dst":"project.inputs","label":"declares input bindings","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2","title":"Library / Profile / Scenario: Question-driven design","purpose":"architecture","kind":"design-comparison","question":{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]},"basis":{"captureRef":"design-candidate:library-design-taste","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.145-design-taste-public-contracts.org"],"evidenceRefs":[]}},"questions":[{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]}],"references":{"capture-gap":"library/project-formation/objects.ss","case":"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2","library":"library/project-organization/objects.ss","model":"project.sysml","profile":"library/library-formation-profiles/objects.ss","scenario":"library/project-formation/func.ss","source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2"},"sourceSHA256":{"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2":"bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033","docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2":"f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0","library/library-formation-profiles/objects.ss":"52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547","library/project-formation/func.ss":"c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21","library/project-formation/objects.ss":"a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957","library/project-organization/objects.ss":"8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1","package.json":"b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/design-case.ts":"70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea","packages/render/examples/design-choices.ts":"fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0","packages/render/src/design.ts":"5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c","packages/render/src/figure.ts":"5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/taste-policies.ts":"9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9","packages/render/src/taste-selection.ts":"0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897","packages/render/src/taste.ts":"4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893","project.sysml":"a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1200,"height":932},"subjects":[{"id":"project","role":"default","x":325.8243408203125,"y":322.19061279296875,"width":550.8900756835938,"height":341.99114990234375},{"id":"library","role":"focal","x":438,"y":131.58004760742188,"width":215.15960693359375,"height":86.89974975585938},{"id":"project.profile","role":"default","owner":"project","x":392.9620361328125,"y":402,"width":229.5379638671875,"height":83.45523071289062},{"id":"project.scenario","role":"default","owner":"project","x":462.71929931640625,"y":563.423583984375,"width":181.41455078125,"height":84.1339111328125},{"id":"project.inputs","role":"default","owner":"project","x":642.5,"y":401.65966796875,"width":208.4544677734375,"height":84.07254028320312}],"relations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1160,"height":48},{"role":"question","x":20,"y":68,"width":1160,"height":34},{"role":"answer","x":20,"y":695,"width":1160,"height":31},{"role":"note","x":20,"y":730,"width":1160,"height":27},{"role":"note","x":20,"y":761,"width":1160,"height":27},{"role":"note","x":20,"y":792,"width":1160,"height":27},{"role":"note","x":20,"y":823,"width":1160,"height":27},{"role":"note","x":20,"y":854,"width":1160,"height":27},{"role":"note","x":20,"y":885,"width":1160,"height":27}]},"readability":{"minimumTextSize":12,"samples":23},"bounds":{"model":{"x":20,"y":110,"width":1160,"height":571}}}}Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"UP"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsdeclares input bindingsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisionsLibrary adopter1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 2 incoming and 0 outgoing relationships; select ELK UP.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.html b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.html index a23dab4..1dee169 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.html +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.html @@ -20,4 +20,4 @@ [data-figure]{padding:20px}main>svg{margin-bottom:10px}section{margin-top:18px;border-top:1px dashed var(--border)}img{display:block;width:100%;height:auto} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important}
One Taste pipeline. Different Questions and source observations.Model facts and required references stay fixed; Taste selects scope, hierarchy and ELK preferences.
adopter
maintainer
source-gap
\ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,d09GMgABAAAAAFaAABEAAAAAzyQAAFYgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhxkBmAAhAgIdAmXFhEICoLsXILFNwuDQAABNgIkA4Z8BCAFhBwHIAyBGRuZuBXjmIXbQYJA9XI8G2F3bKuWzgzkdohQxX4f8P8JCTLkMHlc2qIYK0DBG+pjP3o/bYx+elObdo1mu0V3Ux706zGe6J034rAvZXMcB3uIDWWNo/ysFdiFo/eLT6UaulanZjlbev8FG6Fi4Sxv/Mek7ixraCbFKYLFUPBFYOMyRrJy8vrPs7k/94ETMYoZK9/MbUbkx1/VzZUu3T2dHimsKL6X8iPtExsUn4FAsjlsrFOGqzppU7nu4r//TatzLr4qQyZxABvYdqUHgC1L6VlyS+VFZ4BKFef7ewdgbab0RSbHRZJXwRV3xwVwZAnSLRjkFGW6sBp1YdRS537vrPVP58LN9bu1Q27pw5vAieEniD4WcTJ32MakLURw1GZmz/7+F7z4AANMOMAssQD4eJ68vf0bWJ3PKPLAJNIoa/f9JzfrQxyIMMigCR7327fm7aVoulPyfzW1uq/dMzcpkjkEDjsZAnuIS10ee97Kg9r3tDxEVdeqzU1kS4m8iSyrRSYU2A6QjL/7K6PJOos+LN7I9qh7BZ6TogqnvgLZBQq4JFMR9Iryp7ljhlnbdHLCU8sbPAUC/pc5+39dEkKsRFD0ql5v61/2Wz9EiFvtRCsUlwoFcufvnjc3REWephtUVEdFg7NyrfGzn8dkDDhgjWB4lf/PdFX6qxsjdnjz4OyuZ72NgWHWhOdMdtlml0lV1Sp1dasldYsxEsMOrWUMGgNqYEGMQaqWVkiCZ2bWMXvGekaMeU+shbUuPRteZIyJLrrLkovju/CCILksOPh/uJ967v095RkNMOot2po2bfSJ5uG02fIKYZEI49q7pN/kOhar+TWA32GHKV8icXLP//9+pROUJIMjFDpAIzYb3j7H1+p4xft9//0Td7exgpIaZDlLFyhtj2fbAnglLqA0yeqQXDeA9jZSSNQftvzmz55Zo0CA9OlX3dgj/ZhvjcxEkP7ON5m9hRz7S50Jiy1k1SdxJmPp7LTd92iCgoDJ5fRcIABuCCqzhQTcRbjnPla/XoZpTqeia24NJIiklqZxUIrTHaQhJJXvZve1FHiMWuKQtve5BxJfnCCOzQRJM6TPzeAGHe5p5Vt/4JUgEMogMkf2UgE2OhFAGZyD6kuwaDpDcG1npJT6mlgErsUizvc7QIyI7yJMMTXVnJ8ALjsKIY5QXgvSCnIUJs90UqhQw1+6whd0j5GIOOqPnNBCpEHTRor34GgDVYYqHhxrZHs9ONHIjntwspHd9uBUI7vrwelGvvTgTAM/UU/H6Cy6RNfoPLpF9+gSekbP6Cp6R+/oGvpAn+g62qM9uqn/w4NbjdZnD243Bh97cKcx+OxcuMsTFGS9iU46Y+CI8PDK89UfjYZRJXvzRm7n7tL5GThBO4iCLDgED3ytVRGLjPcR5mnmLGxd+fQjsAKv7f5/bFT78bOPPqWtB/0//95/7x8efLjr5Imjh54feHRz2o37J0AIAh30uPFA/XO2InSuZbote7j07vJlWu0KY+jSUHylN9wFW7y4aajLWvb9C7VxUycJBMK6rxV4zejya/pWf3g2nrGwHSaI61tkRncYgADHQxkYawnbBClVD4gMLiMSdXeSkRFG4MMHcvNHX8CQrIf1p5/eijVxS+fSkrd0tg3YyW3rbCsSYU83YiGtlHgxUoVXqOGhHyaI370hhNSQ5Xo9D+WkFrS+B4KqGqKtKoQlP1bNqBBqkBvdCFTlB09VOPqEM9Yq0c3ISaxYjJJ65HBRBXDqWaLi1kMqlgV9ElH//gftVFENcvOjDx9M90m9KGK9s+o7N4bR1n2yq0r0yxs9MPeAL+BfNgoIbUtHdjRR9XhLo2pl9BMUHRiWwwMORzDfFXNchRWq8WgB6v1hkLW7bh0OwcwO0EOS1qMttcORGwF1FB5G3jLhmUd3Un9Gx0eDqBjSVc2UExYRYZ6JQDhBBBs1fx8OKePeGrF63cqIKCXGxnmC7MkYoy0MqClfifAN+oRTRkvQCoo6M8YJTLhlBA44HEfhcVtkQHQDMRDIfAl6/cUnflLpRVrTqWwNTtLrj/7154qIsZucPmeKEsRfvgbiURrRc4zbalQfM1yKHCg6gpgTUDFOnhzoJDdc/K43vd6yQvXndUMDzPdKrv7KiGwZnX2VLDLockPioglgRSqiJAz3iPjteyBNUwn29sUzLhxqhoVjSFBxHQLR200kpiHGqIvu35TP5p1tLmjGDCVI38iYpQT5/DuI9AWl9A1O+gEv/UIl/UEtRRAkBY0E/RepBCEn7qtswZVsw/XntUZTXNt1opdIQzrS0CukoQGkIYE0lEcaMpCGTKSh10hDBaQBQQEuFAcGJlyUktJKSgJ4cdLciBKxaLNoWUuZgNYFG7Z0a2Jl7qPWGatHqELRwphj2UoqZmt/W0Fq1e64C0nUCA9qVuvYfTh+UJxoFyBcsyG3A7/95lRPZC3VMHs9Y4NQoK15HUE2b/8aNSk/UWRshYeJVR9lZJsSg9wl5BYjCHVveRm/Twrf18EPjDXeH+H6FmJ29XrGDhFy5MZBwuZnUN4Yx5IAitiBtOpGkeexyYWLjIHuzFd1lv0202d1s83M2afqfDAZkIhiR1iafVYux4kHL6KGPw+TYSRUZDdqvkSkM8KDD2Xdd786AchNabo1IwzIhswIyUn7DHjRxfEC/Mb9//Cq0VHNHCM3UWlGIR4jUKcbd15Ab+h5IOfVTtXswzop1kpy/xIMCAegwQdixvjgGgGhdPVosOZzFGIN2cLtQLXtEZ+RmfDyBqZkCVWssMOFlINDVRiSHh6u6Kww/XT2DZMg79y8zSePQvNUwsyNUv1Imw9FnB3iuI/8htixE6ePErt21PVCMPuKnacB5DJnCR6SKgOTyXCooEAuayk3jlEKHFPt5Pgv0SoQQ8Ae88GFrBnLefO11TpjvCHdHnhibeW1g6UHW5Oj7IAuepjF/kqtbFj1TJ2nKQEm5mzKcYbYDpn9B7lakKOJwuvVYo4kOedsBcOLeeoBKtOCkcUagpaMsUyn2itNsFpD0Jox1qHn3miCzRqCtoyxDZXeaYLdGoL2jLEPNT5ogsMaglxjeJDzURMc1xB0YjydEnuujrOCOYd7cq4RLhaQgxwup30O3qZ93qX94ftBDh+mgw8f00E+pYN8Tge5Koa4Toe4SYe4TYee7mg7yNkvUH13PgdOqeQ/bP1ceZOVBIE0DTsIqgfmtH9jZGn93URvgFcTqPj3J+iQnY0LECGARIuxvM6QedcIIlAKtrijK0ZyMweXIbMgQ59aVsbzsAxKiUOSpgBnymFDJl2xqZ04MkCsxAXaiPlOFmIRrLQVQW/8u+0fZGP+3e7vj/RCL5Ri5w/DlNEazgbrSZdhs9AhBky01eRw+KIumhC2ud6sFsd8MvennrjQHnHG4zq02/l43qbjMnY1ex1CXMKsM1OIPa6S21pph+tm2I/9sjuNrtmhQp5GD9jCXesDApB2VosIa6rJIA0xtHbRY5koKotBlYaQDsIEh13kush2ke8i6SKALlLqoQ4bt7EbvwFwuc19DpA3mfSO2BJ7YiEGIF63iC7Y4ANAsONS72p2tmZfs9QMNYNSNWsY7UtwtoQSfAlylbn/Sq/FKe0DVk0vmWcPAMHUUTR2djz2YwB7KukEkJ8Y1NB4pYRjY1LjmpMEH6OU6WtlTXo4vG1+/8f8eNRxSVqKaU3YXn5C1bFeH0L8ugTgQ2ZVjsaU6r+mo8r10sqNujSDCjJMdDmRUQE3ZLQ5RKHtDLT0sYlRlVPcA2I21SjzqM5rOtIEidWeDdvm2DCEFPWJncw9YDFNJIUDiOWxgIAWSkcbYA9Ml0eDM3o380QpvM0N2IlfS0uvS9gcCdPlxkHSmgCvtPrLrex7gB3JYhyxHel1ONtL/YPocsA5sG8CX8Jf8SXer8gJIm4Qjlb5WysYdtk2YbQnpyC5o3N07EOFuy7aYd1Zz0anpH3HIMUcZcH+eet2ga2C8zCrr6LQhHm+WfWjsEuwC55duoTcLs7meUmXltfgcob1OwY3pMlI8MaMIiFuHo6BSPN43JWKU1Q+d8s1efbdUJh+1zcxcs1n3CFXXVdfqC4Wk/QAUtbU0o6gymdn+Ya0fOz5cWgDsahyi0xhV8QU87kttRq6wl7TzRjVCqTq55roYxW6RLwDYqEkdOSNjXoLTTWVOyhKxT2XAVWRbs1nSzRk2tqtclf4LbgqF1cRaV7hhEDxB9Y0ud8+HPK/97AhvfE4NnCE5Vp6oCKoS3Rhq/ilYu80XB4HVqgckoOvrVF5aE1eMSO9rG94y+qK5qasNGW2dlKk2s+Cwk+YbF06TQHrs1BevHhYVCnK+pypRg0KF5crW8d0aRZ8ouLcQHOCgGX8ci+d/HE4GGCmLtHHWpnVp8GT11HuibqgQfmFHlDAg+VK5kiyllXfGqv6j0KFLEJLkC6mWSzrlwtsr5ACDyW8N87d59r4k092DlNp/sk4SSf/wb2aiHkKCkOqQPPXcvY8m7TfFzrb+u8pST0IrcOOiBZnbhxR/q4ixRwJsa5+LuKJXf0HnHTzoMn6mcyUlpKS0LUvx4B3ykSK70ikYRfYAphviGJibeti1NagLTBJ5gMtOoano1irQQaf67Prhz9OxCh82JIHkusqr9H0qMrl9jxxXrG6BCkwEsbBA3P87cvUxGFwI/qlQcjJQ0nhIUU521w0nheBpgCvkPbaWZt/yG0DSGDYsS53S5QDRCS+RqfwOOhBSOWuKMJjHeMdQBjZbJxIOG9cZ8aJwkjwLSwzud3WKv3u/mPEHq7Ygjv/vzCsipZhiWEpF+tIqz0hllkWFBk+4p91gvSfdOWrirljye3H6rDHe9Hmm3viOknTbnAHNMqXdGENfbsFGxIW4SM1M41AgATegiguNzlMgyOtJ5nHtCVbNg2ASMApR8BrxSNQBGUavrnkVZZnaAwl/DaI9UcckeI+TEH24LwmjvXZ9QD9jcPb6PMhdnSqeMGwjUgV+oQ/AMMdlYU7HqQY/xPKaV0xYj7hjfkCQX+uIC3qYBOG/byolIMh/+Ydj/Za5+vOs4gmjHEtgebREgqPTJeICkrrgG3/0nuVEYt1lOWWSYHhI1RwW26tYDrNLq6J54/QwytzR0rvM+/wdGtZErlz5wc2qimm4cHktvO9QyfvX9hOCfvZ4A/K4pReFcRshC2wZSqHxb0o5n5dZDH4zWgFTSzX2z8EGUd7LctTQwrG5curKth08TtLNy5wd4zmsm4brfC5MM1pB5CcZbHU1KI5DVxhF9JrUlodydBHqlzYq0hk1aT0qGvWPmWr3haPWA6a6pr9hWHgjk2XWxw/N3i0PV6eidHaEm2wFwQDe2zBC6SgW3d00+6y7Wb/mnJafgWqPXH3Y7D+WLpWELrSiCDBrAv6mSaMVSIpf1m+068Ez1vWL9keXm7yt16Y+Jov6fJQsLCWYymRnE0nQ94Wc0fIN8AgFgk8xo4AYa7ZtDLW40cLF0HVgZ8GMkQ6RycC7wQRQipSoLtxWMWsxMyUcG4U6GtOMneVCN9FJxLUQIP/VA0a4kVNrDYeN9gCcTZiSJgAw50jfhHzVmtQl+rf8iLbOExQzkgbL1GtAWlCFI2UVXEsK/K+XtY6fKege58zczNyqQVb7mGtUjei6OGsdVrlO1CEXrFRYyb3YoUrSxFY3duubS5JseS2Z7K82CKLOWMi6xlmzqfOY4Wqg8eCzty2xLFxOGcX9LkeXRrylVLGtRPuhKJQUBg9fxi2LbCzqm0KPq9I8jcdIBtxDL9pViCwWhZa9cZpSds3EKDDY3IXSJyKeJueuyH33nj8UrQBo/tg2nYengbmtPELxIX+y+yyViW+aMJqwv88moITJ96dkyZLAUyLRU5vF8JEECxrZ6BPIY1mTbqNd1AzdXPMNiKBhMPLaQqVGOXVcumMFJWK5R+H9t2QfN1eV7W6BTAsDEDaMq5u7rIifs525h9FfFHpgmKqab4nc6Hv0gnvhGtZFaqGjtLoLQ9VPOetpiHE/7AJp6p5FYYEaggIl1CbzupKuAffVxODinQkUKy6wq/3yDVFanqenLS4kRCrrEZmEdOFii4z0bgfNoy1zIOvYU5g7KWUpkRXnQGHeTXpmYi0w26p8npcI3eNTev7TCBVNmajQ2GtekPOEHHQMo0I0ocGoCltLwd5ujNGqj4qFQ/Ok37mIEwDC/7xJKDxWTHtyC4QbAHDdWp2XxfsueMMj5UClnkqkY2lNLFVpuLNadV6hwn87rW6IICPaeJFIFNaK8jwsEqCq6iVnEYwfWKth3mQ6pGPW7gmymSg8FgJibQWJG7IQvnA5KC9Em3QxGwYozP6wBFvfCCPpzWhyPlyitdNaGAkxFngf/eRPG/vW8zrx6gLms5Bua+Ugd+5DausIDfUC4vdfdROCamnRNmqpGTAH7KAm8sBiYEjwoRqgY50vZNHVRD2loilnqXmfjzU/WJVsWal1qhQG91gms6CnOPF5fWUoN+tHKCerB+tbnADFI8FD4WV0D6gj6mwKdkHEjPCrrr3C3tpPvecDBofpS0wP3MHTWAsivWrmiOCbgTc0yd4N+XH61P3DsOeAaPL2ja0gvfwFEnIlmKzx1y+Hu/bdL98ZiAGvpvTqPK6h+A5yqbm4ZBcq9LaUppjS6hP5bdEeP8eDShMp6kQy/WAXDiCzB12u7j87Dq0XZ5EJ7GtJdUEvGhTN55SSEf93K30ncpQ6jKSSfFnAjvfl2daFrlXZKHofZILDJ7HhENzYUCtR9RoZIrbY1JQFlj5wdhC/6s4ObmZ5kMrpcGMKyzGwZFU4vr03pTraidCu6ZGEe1wROjmLVgFUYe1fPMaUGnj+6Rlnajmgi01er0jmJGIj1dIC8RRs3wKD4Qmk1eLKyrZkwklsEk20R9zx7DnUdS/ATs0iHw/FXKSo4/PfXYPO26vYETafjF5L8RXSlRRenJL2B/LtcrPznM6bgt45cQKUqfmXHGVd0VDXi7WqpfLbsjOpxwpUeS1raXwnw8Se1DlCaE3ArFfihObvqOEXKQioiVxIfCTT8IDzWyZljdi2wFqNPqYzNdsuf3Vfxbko5qwPTzaggc/FVGYV68iExqG9LsuYR/B42NJ1Sex1YOrFWNPhrsG6XmrqMrpAkx5o3OAWkIYWd5+rB9SRdBC4cyga1CaOXPNDA+33rEEISmbhrKy4Aw3jAXkvP7oXaVvN0vpB/mTRAzEuvZGg0ixXpnhX29ca2yRpE3qwTkd4x01JKnYiN9z9L1lnLPOWB8gBUeW4C8ZkIDbf0KaW3k5+s38Iipo81eoulJ+/giJP/P44+ozf5SKd2vPVSFQ4n+VccntCFnqv2OzMBm6zb1wfPZcJ7p4lraDRROhZ9NzU89hA8KKkWwdS7RBH6L41wb+sWezIv1uAe1KJOXdLazFkinvxynuBORymos1ueRKIFeX4xf2sdfnSTDXa/Y6exUgq00/mjP4BN36PVUaOrKhb7SpNPTNsujj7Yt0VE8xzVQ8enDEyPewxu6MInr4DiDu5kqi5ZJyXvztepK7b9cTBXLKL1+T6+wBbPArg70Wa7yNnEbbuo/Hw2fF3gi4Bw/g+2fkIxm+uH9Z5SsbfF0gBW2xpKc5fvDB2wpzZgTGcJ7eyjhRoU/srM7L8Qq/4OsljAtKU0Iol/iPnGlAyg8V43MjzsxD+SFh/E1h+ZnFgp72t1ZbTKxj2nn79IkUFcsnejI72uOnL/6h4xD8d09EOwR8M9sTtEzR3i8/Z4s4ElNAVZgVdUVyanFMWZdOS/yZM2KAIAnNnC5Ylp1ucppc3MgwHfGOa5b05Pkl9AdouOR9uuQt1xONLQujgHB8dufX/OCFFVixhy4eg9WVb10Lh12hHWlNjGsC59qPoQw2pnxZHEzz1kopbaMuV/IpcbfxIurFlNz6Kxpb3t82cWaZgjsMZBdkyFfZ6J1HXuE+XEJvm8X/JH1b5PH5x2rP38exHisljz5HroeG3O1z6ZFIgQRbNvnzh8l1kszxou58Isfpgm8XnOa5OxTcUoi2vxVXU0sw0ilv+X08BRyExp6TmGehy5XxMerEdX1IAxgz3shgzwIDg2xHeuljHjWC98yr9FYoZW7Z6dku1D9LfJmX9E2r1jaDe5z1QonhvVxY+ZiPpeJ5IOPmaf0Jb09q5+4NOYDAps0L3Q9lFTavXbno+7d9J/xteHm/nTvh3BPFfnlLsmTPLUriSdLPydGq7itda9WU0d0Y6L+94EkgZaENiXBUx2ots1hvfKgmRjUBj8KVmBZwr8fsGdFvo+y1jMCe/h9pshhEYpGsiWW/8XTg4GpsHgvctoY86R6OUFh1YezpSOIXzGPciEAmnIYfx4XZ8Rxztl8AsQCCqniC5rSGRD9fGjfwERjOdNUvdjd9lUbrYURaE8OsEVVu1+RqOLKQI0zg5QVgB/xjMwfFKW8+f+p8Uu3gLXFmPQkCg1Mdjqp3KdqqMNoYXWGSNBAiqg73aTlmtBzG0EuBmZxHFLAHFoN47z0fjJ60y2J/QwVrb3/sg9ZfiDCfnEIl+QwcxESCrSwNyBtGQdhDAvFHDdDkfWhSubiCgCxbuw4VciZ14PPoOWjsD6CUXD0AsGYPibeEJjefLIBSd5OEx9HwIjU51WfgIKPehyJCFSx7JBuwf/S/g9SB3W5FOOhFWi+9v6XYhORWU9disKEtNJcWk/iB8b+UWlzkSPuaBsUzVF6XhHWgLmWvzTKCfcWtJOo3F3cR4d0QvTAfFc7nroZITgXavdoA3CEdXuZnWvBuWqB3wS8zrhvt2rf2i2wCFCJkQuJQEneqHSMOXO6dWz/vbTj9o8M7nJvQKsuJjuZuOKewprcTrAxobt/PB83ufU7CrvEoOtLLdc25CZYsAhQqZJHjkBLPa49W/nX2oRgGdmZxaWh3mV9SWs1l7KPlWiflyeUxO3sbinyM7AROyc6F2Gvh2YrxQrhMTeprv+lA0xGLalThu/c3RnRn39/aIq8I8jQXECiHMZxSIIY4lzKJA2thsZRbVEZ515IomJNWVJBTpVreqqjMzsgWp6FxjPDu4rpj18xXquc619em496o7nd927J3eKheh+PjKQWBkM/fX6/Ys4nmfvuznzP38nLGjiK+PM2KEMRjqF9EwOteZ4j18gNgdnwSCbsiNWAcaBOsZW8c3MrCGJMSvrj1UgdXFhGEbwYn3ojGZ9AptAJ/Ctx9n9NO0f1iEJN78HYE7lVyDHqdLVZOu6ah2aNJUkBow8dIb/duGRUDdGvDYoyOz95g1rrxP5YnXvqnF789jOafIZC/5k27EFvi6B53Gl6ha6LATES7F6uxpLZIdm0meTFe6Vgi2llMpwrrE2x72QXLbfjOpGISQmPV1PG26EvoJPdY+qsIZ3vDVN3mfWkX8jY356m8BU01NvEJGn9Sx1qhdePXw627MVYi7qA0+ZAIu5WSURVAnVo8SX+Fz80MB1nleSzcYI2ztiS70selXJvWET2pmLSuqkOlNb7GVz8SbiuLA+/7j1NjlKpMdDCA0a1nOqwIcqGyiyw2lhTXRZoNohlqSdbGtjdNeQ0S4qrSiGw2sFBtI86k0j+czxsJuQ58+qaX2aiv+St7sbZKG37G5dSLy852LilKk18F4IHtUOagSg+2GqnqqfsvRaEeG2pwj1OZDmFj70vG1IyCk88c7opmoD7CM/ZF65xcplF0sp5rKik+6IWc7jw+GV5fMfhcaCkcHY++2X24uz/zRwUsM9b2f1Um0JXnSgim5AOWWm0y1128E0LQB3Hcu13/VvD9LLTQ2yPK9ug6+K5cgT3lTV3oebln+iYJuJSTW7h3zuvzWl5tLkxuDkgjO4YfuP7ViOEgH05Z4l/J/dlo1jBTGjI4KrR8ylnvKXDcv4yXFdoJ07DReE6eIv3n99RRih1jkl1glSNTWlyEhudYkvpmkd291FnSoyvMYJq3DigPxMeakO8lBZRvkcEOcOnnnz0t/jFnSOLq0DHNCG76QnLD3BNpMhbEJz4hmJWDSxsR06wCwUJac8ec7XqGGUESe3Fh2Rz3ZCFhhrfiZX86E+7R/d3fk1VwzLu4no9GmF75A36A/nlqfdak4mtKBXIQA68QxBytrIaTxPfRO6Cu7EgKUofMRFz+f3scjmUS1+14f7yZJMAiVOW+/2IjDGxHKSxk8ODxa6gOhyq4vvIbr66LzkQDDpEs9Hc00HR+y99odjGbZVFu+ygZ3sJ/S/plL24jcnnp34Urp6ZnG2dKorUagQPlK4qmC8uLot7ljUPW5NoCNR7aKXwQ5zwfYuDs3Iqm2pePhXs2ZB84ESg9fkCQiCNyCs39HMX4jbPDDq/b2X30uKmU3WqnbGmEmOKC92HBwYimlPPw71G+GE0KkdY6ZzBm6XPwpqSCSuwN910ixqyhIrgR4BSKUUZpjTGf1W6qU1BZ6svARbfh749HgWfEiUplrHaq84o1wq2MUhEP0GY6K2YDAgc0QNcWwy+BTWGGceN+h08RrLUkz1/M0R5X0VowGhXc+pcvxUMl2hIi6BYyFzMgenk4gNjnOHDmEdlQpockVEPl44NFJwz0TKJlk6BACHnDi1kf3Wbom1oyF3f/fOlEcuMjz8u6ndV1c87UU3sfd7sQ2RGMoKEDbNFIjJLFGnp7jZsZn+35fyYwrZT+n5Xg3zaquoEUCFC0R1EYy+2iIxAtXZTpBBSJXWvaxXOLHebCqvaYohgAVHOoHDpyT0pzar4sATrRZlzkzMr1WsTd9Uw6rCHh9a7lJ28FcsBr2dTtlyxNQNZ6EOmPP2+cfS1l4K3aKyC9rRDHLzvETYLwK9A1xYTm9Lx1UTATSofYeePfrnO0D1ZmNQwmXN1Vg6ov5CEhMTiCaWYq/GaEyJRMBUw5Ok7aPBjjLFJQhjrZ6F9ynpoZFLyrWEhibQtCc2Mkbxm/BojhPkMi0RwI1gZM5HDufiDe6ORiBYdbkJ9RO1BR7UTaDjb5uWUJRDhF531HQqofIaMQu5I0+HMogQC+YdxD+e0EFZcyqHirFOYp2dMHFy4j2dvStmEpqWyY7aP1qi+IRkGNAf6Ll21oStoBjsEacrLaHur5FLypKJlIqPM1bJlXRRmVxUsLW9wR9948KROpmN3Txi8hOEBGS6YuFRUJffAbwWZglZShGCXceJm1B+1CJRLouguuAVmOPbLwPxtDdvJr1LocNCtlF0V/c/Pe0kapSg3LRdqZ/Ug7yn/0yvbau/lcT3Jd5tF4Xe6XtRt5yshu9nwvuCp53/uncuBIbZG67aGeUQd6bLZmoHTp6gISB/bj32JVviCua8Q2foqKPNjwEYrW2VUtv3k5aIStpjKNYuK20r8B1+3i9XwXXJllufVVLf5XgsltSCG/K7t11h61XKrZ2J+vKu3d/W71zTMzuA0InM4lxWU7HsatRWEYK+m2rummcNO91aV08f7rGRz6PY+ZLSdryPV5rKYK88NHz658u/iW29JBsNzp/Fjykz7T89Yxh2f/opn8vxMANBJLge1NOeppqrab/SeXwdkD7bzsVNEmShF3VaeWCtI8B59nhZ9uwjmutj6E+utdUqze9AZgifg2krrdcH2ygTvNWONJN0oS8X/OfObAjQNjvhf6ecFxejrMsu/lJNOE8eePgs93vzdQtY6G1+kl/mqTuLm+uUWHdUByD7oMXJmeBb1UFXG8kkMEW7R+s6WG+Wvt+ngg/k8uo8xvyEiG3Inpjodn0LGFgr2y70QAjNYl9UVJBx4RXDaLjdZ4QGawZjbzVybBviQakV5Rv6S4FD40sX7T+oXtvGu8582Gpy/DFPcx3UzXq2p4PmkTzYpgmhgw5zjZVfxVBYlpS9O1QofQF0CmCkTbD6xtYHS2luYQVO4REtkVXj7UkBpXJCkZGRZSk8ZkOD+Gl7k373IdzUtI0WSvU/+QVTRTZDjT1mnsgb/7beMLesxnKL2VANJxLnQ/k+HpCS9x7Lzv0Kqhu4bS0rasj9Ag8yeqYGnNUmqj40IQKYwycfassbLl0tLilAVk/qHCgzjmjWRq9cFdfwnD13cY+Xquc/p09nGbW59cVZq5T4iNItbTQ9KclH+XKwpt9vLqgiq/PQsEg8mO4ZNNLNqGrJNMqyy72t81tKWxqxQq7hUeBJA0DiLx8BNZQxO/++9fG7UREDgmpe3IfWIHRmJamsxpB2gJwiEYgJC5L9SYY3REqIXWOBfnQGGLJFVjwRKW29gFkRtPiGatsxiN9ODsiJ9OgalSHoPvELwif93In5o0C6k8vBuQDo3FheljcAfvTAVyfZyDzlunfD4A24TJ3cvFEUTt71g4of3R78VKGDd7obSLLIRP3KLkZc0S3GTSBOYyUCgDUlGdZCHtldK69DUvEiincMhgJ+vsKnuaUHDs+MCbwq1vV7PDiMs8GhHn63NQLSJ9RBkmT24tLNYnlxcVB48tLjmEjaU+/U3+WAPMD/qJD+eXVWvbyUnm8ApU7K+MCnotrbXeVrtaA8HoLCJ6d1njbioF5w5x8+Rn13cVbNa0HAokGEGavlFJ2awVv98a3re508Jy5LOJePCSKCdbW5NZmmeH0aFkvGg53y3raxgim/h4d4iLsmAavBEORoaPjyn3hXOiLnQ0uTo1Pyc9Wc/Xq75bW44KWCF0BMmGRLUORm36ixGVJpmb77HG3Bvfnk7Bsp11pBgBiTdkOVBZO5f77GDdYH2ftpWwxFlcHkJskDZu7cAQRl+WIHOdse4QnNbEqIXJ3uPV4FFieiU1BMu5K/mQxt5CIF+sPlwmcRfoBDuF46kvav4nlc9wTrDrhE6HTGqqDeuQlGMVxeKCebzPbxIEvdGAqM/a15Cn4SgvWMxA7HEIiDJcG0AZzoeA0ta3u5b+ETJIljw9oZVYrDo+rx+d3SOjeRvCtD3eZSFDwkS5yC3ypPSmSxyDRKx3COBe5kLOmKdn75cpWfWyP7wpTie0jKX2clDmR4yaMxzsGpX8JnERa+bmL9Kt97w55GgKhJruTkaOXycVN0WylZVBBg7PxE8jb6FWW8WZ9XT4n15Up1OZ1g7CmR3YBOPnxqxOGhnvCXE1Hhk3fOmt1SHH8VPX2iGEDCMBmGvLDVv4+p9GwDyVrrq2M284G/TA5gzn4N55x1/LwOqtuBjVdbV+nkLTvALjKapD9P3WFQEjX3FdD8SkFeQsZ7zd/6v5IDaOPlvIA4CfGvq7AptFWL2DJ1oE7wMWIrlWLTFDOG/Z+6dIQnQVB6BUd/9oaAqm9ERVQfXL+nKThE1vwOd5gJANv3i+rrr3Yt0jKozOjgCR7W/MVE6mJA1fTwq3aIlaWqt+fd2s/6MNFeaGcPtzd3VfnLuw/bNtLeq22nYMV2VrvKVW6SiUkztq5Jsaq0omTFlgbTwRI7aIye3BwpNUCt6hms71WnqmN9VQhD+wUtyx0MKo7qHsCPlPVWTXHGLUyjyvV+RGK/zK3kBXe7g2XCggE0E1MFFjna2LBAiAS8ZakH6pwKemsYqsR0e8VfHNqSx04y5KDpvmYCEvVYPl65au6zwwC7FF3qz7VsWthbpIYSjXkcfGY8A3Y/NpRGDwN5U10BV4sdXhoUMI5CX+kFGwkaK+OrAJ1U8tEc0BGL0iEME8XuSghy1saualF1vzzxDo2zHIqJlKJeZos974ieBkYkPUPERd55MuqdZHBRXA8J4PGOjD2perFrLoeX5eSYNASrlKA084d5sT4mH+oqrjtg4YMQ7N7oiv2EWGTbZ2m1Jzycz08wkuVmxNZb/llLyStRFm5AhNP81eYkE7X7a/KZxp3M2ETbYGeZJUAZnrLSDOxQT79Kd5tVhRMFeEBvfrlWukg/tJm3gLUg5DHR5dP8ojxaHjTX6PxiJ0Z2yixYlgwigdy6IYM4Mum+xtHAiVvja6/oqhNX3Tk4g61ZRMYNU/JnmwRm7TU0tepHRzUzYXN0n5noqCJL5wfMcnhvhXgBZ5RihSL161zJBoFTJpvWwwJSEeEiipOdl8ePqDRP3PvpIT8jFpMKipDHRZK/XYBhNIqDKjyRXkPjs8KTOAE4ai1VkheXzs8o4DwmT0DV7B/uaKPG1hQSJKakLCWQwOXxFpggm7sckZVi6IK5tVM0lRk8YsS/a1N89pn5UknNhCBbQjt533vLoHY3XSAVcrqalUfCDMQULMm1AFG7jXQ+fwPdP6WDqcu+9HwFI6qtnkGAwa+WQMkp1MBdeBDuwyMUyMtKDZnOZN9Wqyj37IoaGYvc4Nkw1FWYXesiAXJnXbIJrKFk1azKcbTj65czWVLKyNtnoC9rdrf7/9HS7DUXmr8fPA5n8zZ8RDM7FOyXOxRhiUlFZnNMO0qwwl7bRjoFZkKtm72GkEjHA8BKYY6XnR8KPAEEuf5qx/lDd5lPhLNp+GoRCizdoyZtwthVDeYF102aTDyWSabHdRVsDrMKS7GeXNGQKbuxHjbwQqrqg9UMEbvKX6LQWK7IYsskGHQ45XIi+uICg0EPPp+E+TcmFwKjkHzWHwTbntVneoMAONjne7QqzGod8fPe8TJ4KlhHF319apuZu2FGeR8K/x4n+mdOS+4qtnsYa7stqIc8CGWyUktj1Nyyvi2vI9M9IIlKzGisZemx0DY3J/QEGdvrjkZjr/38jpBBc5FYTxaEkJadVQKUqgR5O/wIIE8Q1gFt/YgzhiddIlf6dQKfjcsMuOXwo8pwtcbja8ZPg0Q05B/OA06tY15eWbMVltdVVl9saIjmGGQ/lCi9jukRQ1lHLMBflVRm5iSvb+SYPck6MV7RTcrMSVPOgNGvU16lSe4pPR/LO/zQlUpazvYEad/oT4+DMQbtfC4s2rO7oPzzROfXxnqtvM7Pq+obnZUbevdKjPEJna7Q18oV5lFjWIUAiJTpK4koRv1fmsJqp5/DkLQsqYPmOFnuMBgF6Km7FmeTqD4TJpCEFx1G0KBv0LBxXOvTvIDNMGCngbTiL5EBmFY+6fU1IIXubHSJiQZdzboAC/0johP57Sb5OXwjBvuXD5Chi2SFYohNLEWWerxfDSrf7nexKSWBleFc5RmP86z+myzdd28skEwMnclQwQt9nz97OGt+e5CzX1uU3PzrdHSmv8Z0ZKGuvL0rMcEvdod0n6+axqKDHMaf8i3kWFz1czbv4ZB+n4cEyCCpseYbNzXoCyToXw0rJr+4pY/nWTqM/70ZizOZko0gbIRi8C/Nlag4pJOqIQwrbhfWMzwTSLVeMbn85NN1vCoT7Id66msANJHHHGAspZqhtk4UUqdhGfhCh8ICTLTEQsSdsYl2j7+tnB6GZdEXYX9zXqk/jBH9vRj9a6XpIsDwtfK6vrjzfA6/GYXUIRSosE5Tny8ygo7UB8PLzej4xFnUaoAOgCjuWx+JvEYnTBRkcvBhBh5PHg0NdvMugbGnhtSXqqL/AVKKBDVDZcX7cW+L5/zpMaqcFHAayx3qaUv82SpLNeKXtGTxXRfN6dKLyU8HPBfOZx9X/YVfwXoVTLT1kJschoU8XxSPzCVwajnZXfeCZIrKH3c3hqkTNT/AW1pJCK+j0o/ZA7BblNyo1l8V7HhYsKaejfQt5Kfcm85XGv7bpNy7lOWSb+XRV6fuLAN0neiobUcp80/aqBgwUOW7i179EvAoXUwc/Gq5whPoXCudNMpZZmltvNd83RiCsuLMkIC/JathVwMp2y0pZF3o7XYQdQjJPdLKT/0bXh+AgRVi2skeNAAiMv52Uo90NyvqRWkKfLaMqZVgqRXgiqUdooQSDKyPrdWsQDhCTMZSBGebTWs1VGhd8y4i9jb6f2H4YnBcgrt+ZrpKCtH2P/NaHTXlZYr7mrP/70QarzKrH7bBWJzTkaS1m4MDL1ZqIhzD3N3HEeLXRmQTT0yTDCf/RpJd0WRvRRydfU6XhDOgHdmv+CLaDkXvsrDrIM4nlMXWmm3oFt8FU0mE5TOf6/53Fplq/t8ddbjwhrD1XhTZLTMf9EVZHZveOX8GauMpfe7pGqWKtDjiLEER4dIefTWnnJjEqfZcS3AmOfcaOS5eOLOJ8N7b7jf4wnOlV6MSE2DuMXwy7LhjZZ5CwHm2bbHMHo0leL840UcDO/WY5BdB58WsYLNKFcwSiz5CvNtH+1hyDdW0sI4YykK0iD84jekYs/G0O+6H12L0ZqF+z5JWNPL1b1jpLhJdFBpJzUk+d7ON7AyW6Jv8alhEpDmDWLY6dvc/hRT5nFnLYZv5N2KiqCpNNLMkCeFw+FyyGc/IVsqyUyU/SPrVUMwybSH2CS6NPpJ5cJO4jtcmeiBRP8KWUgBb5Fk7jn9Z/ig7x+CgLR0knZ3kibkQJaWwsKU/bUgvmahKz45avA51mBCTxgGJiXjfoOaqxLynYmfvIpa94PzRLfkF8bqQuM/hVG8ngjTEqMsDCa2ynv9jHV6goKltbWg+B/sVDB7lFW3N7wkXs/Is3Uh5vT9Zo9FVFXNjTaUWV+SLiyTD60NQtb+ooVcGEm7PKrRrwK+AKYV68IrngQ772sPNgV0xLLr82uRBnilwlYiLZmITAzDG/bT43jJXPorbI4DokmrES+wmyH5fSQ+xHgIvwzJLYBsucuxkztJVeYBQlku3QLP3ZL/LXa3IYkDaEXZK5edrRBGV5OiRW/+nY+CWo65RdNqHd9Q4jWjXggGx8++2QoI7RVvaqXtXxNnvKH+6CbK1Rrz53/D16tPw3i0jU1vUVlESAJjUn8voIDKbOa+thRsKiSgWW78+6f9aaganmNd4oJdFGW0XyS8sQwuUNNepcVNBq7CXAjjHw0/MMhe47aajBVyKey7mfYp48GNdCE0YW5E/FIYWtVcKUN+ECPKIjjDdMKw6gAFveh7HJQoRahTdpEmf2WFmUZG6sNFEQbnfB5mBcNE8013GxdXDp2XcwcyDAwpvBO9dcTan/GNxBsEoVLjqvKTt3D0BY4Sh5Bvyu3hin19cjxfpYrfmAuXWvQGqOLDNjHT7VzOo4FbMy7aMHcT2ZPKa+Ai7l3T1fumtFRvoRDYAlvm9/lW3uaQsqj5pYcWPMy763upht2tXzxeGMTUi5Wfalu5ihQjTFWaWBf/+NKoQZlLUqNhiumehz2kUWqpZ86vfjcT9PjFOwr/yUa8NXqYkvBLiunIrqwPw/5T6gX4Uh8Du2tpm9iE61zlA/lXNVs+sI1CURcp4s58r6PTjEI35gaiNogQ0aqigsjx59ZshOsvBWbeaq+Tysbc296u0/ZC14XzlFZdW21/imfO0jG84cC9qTr4yBLqyX5CMNvWHNY7WqU5nfbzJAPA0bleZRYnqiuIFO47CJJV1I2SIH0+dnGhsyGr80sPergh0BKefAGxKDcSXt5F1XualOvGR72PeE5fOU+qHex4U/BLtjZQh0xky16CtD0ZYRkm58JKJ6Ph7H+u/yrMVamwHNZvzrempeaX2Hq3vRCgEFkg7wEPR6Fh8KlcFbnNCEhIwmbYZRaAvJkIw7/jwNBK5iNK0Ig6AX1RnLiU9tk4xo0bKwwQNeelzQwjdPrZnY0whXR7QJnLj8NyDL+klY7CjEDsOIcWeYd1wTovtfWoNRvPUN3u9MACl0zBaYYnKV53KkEub452RTx0cdSyoFnUM/8r0hnzNgp3F39oxJn3s6Fumzu56s2FHj9h2JX5MWZhr7LpVw4hJy3Ju702t3vPoRZw1Ftu7Avs3sZ5RiaiAQnitva5rb9eshLFA35i8gBT3ciXkUyIy/AWz034qqTJYZrAY63O8SUo1tdPvxO8y+L0tiCbNRfiC+lPI0MDnS1dMwa1JRpBxOF0VqSc63BHf1UCt4dclG3SuS0Qp7bxsHvUNjIJcSmg+obBMqFC8tluxtF5Il1pVr62rke+qm/I/ZSWNuVowRZDmy5J6UV8Eq2wAWSGwY7qw9UNf8sJf/mv5HCCuASd3F5CLlheL93fNo5ulTPTmeF19/StTct1VmjMjqMAXf5+9i//TNPvtrVD2G1GB0DzctFfKSjylLA30qk7X/iufHCgcZ8nKA/4NpSNP7H/pUA3Pkfnxc55WSQhny4N1ihehIQ96ayTYf3fMxWXWHPJfwBUvAYrTAP8FdUE6gAsIrGbYIxVIrKY2koyBQsOqNeTP5SQphcMd686SJQ8owx5i2J7r8cZeUHbkmxJdOq9UwzUddpD1mJXNvjQBJqKsxYdmelVw4j5CZ+FRWtocOrrfP+E9C/jOeiyJ+pL2bm7b41P/Zli59kFB3/6993WsldSIc6ddwoEsm2Eaj9wNSGU9M1zAyfEL0PGjeLSC5Lv9g7i6KTP+UEYhWA7E0bYPe5oirV7Yi2J/eTvoCai+2bFBmvE45cosHZNjz06Qt9h/GVhP1Y6865QKWTbUdLEBl/r4xgU9q2F71IjoIBr/llXCdCwYDhJDjO8OixzXMWdBL4wE3ZbHXT0RByZI2KVE5qTAJJ0OyJpNxW+oAoCtiLaOV6vpf3UDEJE8b8H6mucgXPacSUFsSHnRo8yZ95AO+vLkq5nZH6uWauDCa/x28iIDJZFZQgssqScpGMMpM8IPq50uUS9VhehmBWeOrXa1Z7OfU0TlAVB4qu3eR2NZ9lozJoX4A8+X7BEUqZAt+L444EaDdlv5Y6x8aXaC0XUXUGeQUAvdn4Dh/9Pg3AHEV3LG1n9BE8o/+PEfJa+FugwsXPL/XiPwxSlRbKLBLAlmHD0gAdQDR1w7gkXfLpyIBNHocl5CchuEj0ESsPKYTt4NW2uT1D6stGTFxWduj8YFvo4udX8v8nBpRQpPYNDbwc11H726arkM+iCGBtwmxqlsYAzXMqNL69cZ4WeW50csqL8OeX+/8TrGUR7z4Onu3G93HThVW0J7rug6dkdJr3GdfV0SG9wVTOJPslGIZEMaH12MW8G+tlhQj25JOGXAkNAZ7LZSsgrfd5EhbpTIkGFOmtiiMqgSjooXZiT0897h+66Zidc1RSGfLHh6Z5bOabogt8i1n4/uP+drsee/bFvwhyRiUw4GCQ+2FRp5b5249JtIFVJNSccwdkDrdKcW2RPosVJ96z9syEnGjl6VSQzKuDr44CuY4NAb3Jg+xFadTS0OdQFd459c2lKVgimg/3w/P4nFa1MuCQp2FxZRJN1njFcV62zKl2HiKO0UXYRvCr9T+So5t1HpTWNOTFOk1jBw4mOb3CGWMWERG2aWCeEEnRAsz08oBjQeEuT8PfHFEueviLOQQKVskIoULdqDhgKFTp4Sdh7bQ+OoJJW4ugiwMHj8Re9C68OC+VdEFtUM7ZJHf4jzWI4KsXaJPE1VKEaBzEFdumxsPSPEAjS3eQXbFSTWpGOF4d+6uTYY199t96PQI4jNPQ3ZxTtdzRU2lWVota5ASmspzrnrNLl1QgCqwRdqw+a7ElwWK6h5mo0GCbJ+GvQ2m4uvXJXTu1B6pJ49+bqV7aMjQO5YsGlLU8tmWdYlwkoKawnhHeYghNNggekF46uVgR7IzT8YAHLvfD6c02CUgiAqTP5hbiIDZnOWVZDXabgIq9MjhdMArB6hGPLCt2bAFbo6T7gwqIoOXgcNMM+sgneJOH8OKsqM5Ewgl7FJdgVW7Ko30dyX44WAQVxS8R1W8UQZoiwLmcb0gPHN1p26F3EXN9/wVNjNIjcVHvhbImDspxkICqzFQ+atjntumA1LQFBmGk1i8Joum+mSExmbhwA+hUJpXQ/u2TSMdwDqpcipKbyZk8qyOCAJvCtQ1tVEQ35pORzvndcZGphY8TL+HfSOd6Odmi2PWAJ9T2baIPGzj7ZifDgb8aa++LRh48UY7Iy5DLHBCvLUZMBufDzqEz1KzD/7MGzoaFUBHleVNyU/NjacpOG8Yh8UTO1LRyn4CmeSCMU+mhNAFPj0pyehkELCnHyh/mxVLVJApAcokFVVq0Kk+xdIb3A0XIKNwQpOe/saHtfrZmrpNVaD/bx+LFLFEplTBEOij7he18PBTHoqIbQmQ2Xtxj7JzeLHz5dHw6PS3nbV2VRiNwHVSJD/igs9Ax84EFfTq5wFN1ETiUCvbhWMnLezl5sAdOVeJDleaTUxqjrds7hQgFhHDxrExTV/OecXFKYpbXQYohVI+Tpxn0M/fB9LNKs66mQXemawDWe6O3F2RUf3fvUToRbRVviU/t0snxDALU5DDFBReqT3Zc6ih8plMUOTjrgj32dFAHWeC63PhrBBd2hKjLUOyITJJpT++8NLB3vaZxbSVfQ78lEIQya78KuxMZBWObQgU/bDAWxUMyBDw8MAKc0aCkChqahPMBedoVQo4EqUvBLhR5JwDGoUa9Zu0Kxk9xSUDEDcGIyoJS7gOfYATBFu08hY3MSC5YBDJ6AIL/Tphl+JWNJ7OZKJRSDQ55HpbxMAAbg3ARILUbj1YMYREnTxtOEbwO8DqvBxQwQzBSJ8Ce7DZ4yxorkAkHKUsFISD1owswwvy2g5QpGMghSb0OJlcF9UmONNlQYjUUR56CoRZpsPwz7sRiQlPhYu06VeKpeuolwycVUrgQnxGtidgunyKFI00Gt2Fd4Zhj+9Jy7Vc7xayQI40bUtzM36lQ6Z2V92iRBLEWHnDhGnP7LrEvLqgCLoNKGD1VeIM3pBdPwqsZkCWM9/NDXKwoPgQe8xgDZENlCt0Ko52D0eWkOGlQvkj8D/OdyKgVWSplASK1IDs0sSR6ZRP4qVgHR9NLjQkT87LAaWCitenYJPX6JHab2a3EtsYGZaov2itMT0IJtTqWo7Lep6w9arcBbg0K8wrUpG0IjGR7Hpo0XZcnr5AbzGB3iJrFivYBKHHAFEyehpUPDWJGe3el+9MKCppLNNFycTsBDQFbCxxO3FsGzjj7Ew9cK+DM0PKwD0a3YVSSzDnPQ3RTFYZ7sVwKkrOszL767CTjwGMEusfEJZcJjT1qzRocjRBTkYb+Kc7IPIMaC0wm04t8ULi46/0dRu4NTzH4loFuCQgkuAkhfQDYEdu6jDNyxX3u03SxgRcZtqhSZkqLeNT2DJiOfmgh7bsgIVOqxaX3SHT8xRXM+ZpDbmSRGikkXiFnKWaJIeEPdwMwk+XURK/zqJxZsReDtE5t9wKlyfwGTSR+ongS6zsUmBG2RlxIqdTgyp4qCK50zZ8DzcPOtsUsEgHClC1B+9cdU3JAk2OhOt10PALGApob/Jlw7/9JCXlvAnH68Nf5aKx83NtqO8QDKYMjIHseSxSbzEPEZ81GWjaXWK+09IugMIPdtZZ0zwXHg7VtXkjTBdIZnqb51Z7HCtap2FbVJdvCva3QnkbgXGUEvLpkFrTzM4dEljQ5GRyJmmlIGj2gXAGwYCg2h/NVJQZa92vOcX3Ga/HRQKgIifvLICsisS/bR9k2BpqlCNwPLDwqgyqsGHHGVbq5lIA0LFyJ0MfyQnIL8+gpwMA1trmfrdE2hBi9cUoiIePrRKedBpbFpGqMkTRgn2dhWZs1b4QwkfPZgl2OiAMYbnDmoo6ZjOYGCMYjXdTgG84oDFpCw9Vv31aDABGvNo0+4TUGl5OxCa0bzPN5j21KECo2/wVK/Aabs4w5Tw8wiyzduToPjVPXvDGF9K9g3KFQMmFwHrLTerrXPx5lR1UiHDo3pAS1dUQdmRI1yvEILrH9pnkCI2eU/oJ87/9FT3MeKAIIpFn9vLidgIYEzoM8bTx+Kpgxm/DSV4JxRXEepcKeUuY7JQF2MIY4n+T/+Yqs2T+mxbmdbarVG0VzFZ2DhsDD6q/fFpmMfXGp0/EO7yQMTVtAN2QCF9PKZ21BeJJ+glrxccXpbZiBOXOkEf8X6U7J6rJPUlrsGUKg6990EWtbphjuS4ZY48VQd7AyXYuqwaCUOCAZMktipwxVPl9ieKmrxBFHboknEyX+YHMyT7fs2fCMDggF7F2bwVRMnF9ynad5tc0hBHnUSE0whbiWVU6T4AxU910riQr8SBmdtjYrVvBY5RJrprpwcj8UNbMh7XsfCMonLXsveTwjCLiHDPsud720Tk5Qj2Q0tlwTreQDIA7pGtGAf5u8DeaNflJrjy1VEoWcm/wLhRhsWWm4xPrAVisKztHNcXW1yYDPTwsMBFU/x1Ud9ltkkkuSeqeHnYyqayrJj/OvlGmbZWaH8z6ZVM6vlbmH376uOaPAnqO+6cglKLmZvfc1gbtYiPTOETCEDaWpifa22mDrlXJtXG4Ht25wHHDMak9hP8rT6xzrFii6lTnISLxlPcGyaZg8nVRBaQ1C1sLoeEVFR9URuLTTiwE1Sfx95CnWATVUMlyKBroChYCpv2+9VLvbCpuvifkLJ28+FJlW9y8+/SrxNm8n/eLzlcAuu9ab6U8+ug1zVMJ4j3WQXd5JFXzoBpG66nU+MOWVl2etVnGEgHsb1HhNvQZHILPzPBWq3A6UygtlzTLkW9X3/mrQYFZYGTRJ1FdxKO+HhTKEaKrXnp6Bk9ggERZAeqly5c/E5hQbWK0TkwqdOAily9Cah4GlxATxaBdCCHvUtpS17RbsmqAIVwmcXCPyX1AI+wEcEhvzyrBAXP4NJRUmCdLsIE+LiK+If+sO+58+LUuSUke4qi5AajxC48OeyPAMWN3HwhaB+zf+Enf0gah/eZwxDB32/CWG0lWIDOYGoGp5FSigBBTHxHouIraeYZiKrN+ndhuyn1CC3qAQLA2yaCYb4eRqKLc6XhKkNqn/TSMwikHsb4F1ePl8f/k+3O42Y681VgayUd3yIixmwuy0t4jcL2ozxi6gLZylu7TCDMsNBRHcGPHIm1MZ1JLdSehKtr/iSmhNXOBR0xiiHYT50ZS8C0Oi4FhBQ16/2CbzGlsAtimCgES+wUksacHwnxxAKGKTOdLFCWVnsW7Ct/POm/wR5yZlGRGMzTy5gao+T0zbZFpWvxpyYHCQHwzdVY36sQN9xvw4zOpk4mYvCAhQkuGg8t+ZCfvI1S6vikxwDJ0RXuM1f+/WCwxZdc9YAubD/g5xY/R3eVIRS1f7hYT4T1QypFNDOX9DAMF/2Jz7OYqJSk+a9/rep0c3jRRczq7DoxtfvamyNAoEh+ByWBzW6mwfjR5xW0xrQlMg1KQfXQEQj22M4WomJZrFvE4mEglDNEHe8d+MBEBDQknKKiIwLTISe/UwT2rOnBEOOMCD3lkgtxFAMzCFveDCaa1JHRhRKPAF/t6te3/jyQVQbJHpFqdtWc9tc+Li24qQsqoELpYifDHPL4O3HtnAhq5VCXRDCXPV4BRtlAzqlhuuTeaIUIVB/gZZU/c8u0SSUHlZszgjCf+n7w9vQ1QoD6FMFnZF2RyDInE2PICP2hQ8wl+GR/JYU48XhlkElhz1bpl2atWFVpTkaVKqcprNrA7H0q3HOk2FrRsM7Pa2GxTATEwVnOwPnXFVTDxOyV2yXSS4i0ApMktwxIrP6wwwkHX8jCPVJ+zL/nlvueqKYw96gSHHkfxQUW+jfeZOwGyw9s43m2mTg7OquQ126gQUEU/JKDh4gkXQbFO+brPoVaFXAWWfGVqOx+puPSLJ8+2Mccjhvl0lfr9ioRVM3BZBBOwyLdkZlUk6oTmZqAmyhsW89ShkLey2Le+2TBmMV5lgWVPMMSB1OLC3CyRMrhvIeSU2va2ZuM8ma+pwkXxpyc3U0nquXkauQxOzI+/j7iwtV+5rMVcyK05aTsq6Z2Y8PfhBbOGLp+NhHOLn5Jkz4F4G6bjDnXwvGbE91Jchb1JHqhVM0axpDgydXeh3JZJNgJJpoaRZllLD2xJlj5WKtg1XiqhgoQhxfaJjgreCYiq6HLaWGeS7XScpp6XofvCNw76/B0/hE1ZMg1PnUkWD4P3qRtQ8wFATay11Senq2eEcW7lWwx68QrdbavtsNa+SeVZndfNmWvM14vYDG01WC8Up6LZceafu/VB///X2+viwXMSvyesDdQYvR1I6bR1ElIGIvSK28ocPbHIVcp54E439ScBuW6K+zXHZd3rved/FZoWpNMX81bLaG3v/edfuVO8F4ylRzphEJEEzM62qEBeDrhPiPVMNUQpD3fHzh93aWYTyw4FhI26Dbgvahi6VWFjmerWyaR2o0EfhFSPsD9Ay6vYB/xSfvH17mcYHSmcun6XLkvihCl5HpaZum88/wPm6bSx88PLh4/Fj6Ju5ndOU8jZ1djD4gcLT4hfWPH/azNmDdcQMI4WER/bTfls30dxd7/dfPMzjkH44WsSnra2xkezGTjTaaPRaCutz6EJmVDsrvLkPbBX2SIqJWyMyDdrdN4GAYGW1PJs0VaplEgWV3Z5LEP1oI8qSWy7KNpy+OmnBUi9rYL2DrWD2KQixd6BxuzhnHe5hdshyzFtTyfLa2kiml7+BfeZvePM+eHHvBkH54nzJIAidRXMpCdAKjGc2po5mSGrnqHo7vKiUUdXOLnshdbAXWX+KSmqV3afgHuiLx/1jknklKJisIFlG1VBBglvi8qwa67wJUyhzyKdzS5HMgGalFCchrg9/iun2sWstfPjq8fPpcxzah+4hy6jbucRgEggJsFtFEOtdFyxe8TIOGalM60uujUw1pQVmjRUOWpIFniOCdqQqWf+Nra5aDOKvXwb3XAgIxzUlxlLxKdreXrZIKLdwfeGctahakgOs10zE7hKDmWiTeBbL5Dww5WwDdQ4BEAb4iH0gbMWYQUODsWBhfElICLvID/pBHpbAqQvOObdNpkLfieDdynZ7wrMalf46EXJAxk9qsi2JbNKchghzFAguSdA4nYamigL6xt4IzOAxm4VTjK+TEh0nMWs9l0zlnaStzZAOaczUftS2WvvKTDUlthmuCAbOTnVJJPhOW41DXSiH/3Cyw+ZtyWhhuvtcylYVWlnaNemYjalPcuAoU0pTZ+LQ25WJQ1IfLZSyxZYtm8TPG6OtmJKzYlDILhUOLaixqkt11/eUFDWc6vPaJKVYdcRaO0+jOq47rlpk2JYkHnUjDVbAoTcDk+xu3B/oFilG1Xwt3TJ5tLbdBlsTXMnseqVDqArw4+TIVoy/aW6LICLFGLGvfp7ruSqhpoZIgdeqt0UnIv1K7dqtiNnYkqpo864tsjjik5iqV/Awadm3MlP73q0Mff9tMk2ywvyS6sAnPe2rIFJ1PuiG5KUk1sbak5gECaJmBsI6Kn5bVBcwR9y7Mk9iMXvzm3FUouP6Gz233gBJINdjN6ferQg03vnQmgaLXCWCwxa1tQiOh5/6lgkX36DpBVFTsb5v9dPzcKEd5Y07ozxOHunj0wf9baEx4ocDRtiGUcDo2OLFSsA9WUwhXdDGkyeABVx4cwmANKYc6MUi0OA4H9I7KDfLcNH2qSKaSzw3xRnjuXp+P9qiHPcbVZtAbkswMvIlJAxtQaO8Byjjb7gXZMDVrrbnW3j7SVvzXsZSDNzVKafpyj/566di7fGMI3FDXGGDIDFgrcYIzRqxVuVoODmTpCyOZfrznhIL7z3rP4aPusxScqf38zkSKKMVtlqrQsinL8N1ZINFn+BLt6XSAHjWp2xTgfYN397UNsd45SyuweIsOWvIDQopI6JAbBIOvdXoOtFtQQAKBYukWSxkmevZE++v8/f6djquSjF5kyD61KaQVFXZToiPnnnrLFM8iwHPbyvK+4aeSEDW6kQtHVfQhpTnZspgO2sztmh+dFAzDQteLH6PdY2BqdLKnvmBK3VfuBgYdb2XO3yOn02VZ7RnvTOuK1MccNCpa82352vrczuVU1BNqDpItNa61aN6CaY0IzkraE3VhCr+IKEWN5IY96iyHFNzqt59Nr5Or01lN8wTh544PsweVmCGwyMpz+7wOstDPDeaj+2lOPWXMf4TKCjnhivWtvtEaQ/Mhql95VqLHhKWbY9q4E5D/dw8Z0YmbgUqhBA4Hz4R3w/mWbAdKh4R+gYVrWVdAKlUFzMho32YxrXP5ZzF2DxWi3Ns1Y5kUlXTFDLMXV5ukOvAtIARNx6mSkCq1BKMwv673VIWjVxV7LHq2ML+EzwN96Yqc62i0OPQvQ7dULMecZjO40d7pSPkATgEDo6hKwou4gpAGYG65nec22CKPvcYvEPXmn9omBtNi6/92PPMyPg2xKu86tlvwaHXDZYrD65goZEnRtwGZVY/mo558UWkR7JcoFW0sNYr3+1JSsm+k1BLvWZCbjeLFlux1ErHIsAP1a3zII1m47p1DANRAMgui1Rz5aOMPpPnHY3nZCmiWu2Z1ph97rT+8R6uPIvFRDvxwo2quKhYEpnlpXTq4RO9AVRQhZ8NbkXr0pmBrT8Nlo+9RT63N54+CrTH4CSqNEWnhWGPpANFvGfplEr9WhLxzUUSOo00R0VXyj4w0eMW0M+anbr1g4AzKGXSteVQDalJClnkrOmaZ0bGOlZ4iWuAnbjboiVjXonKXf4FBiQq24RCtxFaU79pzcKk9XYUHPNUFHCK/Xv8EJUThpgg6naKZItTn5ul5t/vRoAImEh2FZ0F1+scRxzJkMAm2pcQ8KiKAoK3Che/ZZV6ETOSbNtyzC5xlfpqCT39ldxoJ2I+PHRb/lRljwqP3q0YpwNbRXdY+LzCT1/YojpjvXr6lsLVQ/vS0PzEOJN+fLmrY7Jk30gw0fm6vUOsGZh0rflPQm5QqDmT8K3sbydxS6gTK5MVVImcg1BbKqs+UyVt6sGwUT3c64fmAUHlYZOd8mzPXEr+cC56TIkubI6c/lLbO63SA+Go/WbBGZ9ZTKmgNMVcFVCDW3BLlvQy7JAF3Tt182fb1KJYJAPiM5ilUnbWYGWrTDAAKMb2LWXL6LGhr3Y6KhmJLXZIUdXMhifHQqqseCFvvmLKaNQiNzdGbLn7XG6NJG3fLxnPqTE2FLEb5kQayyQhuUGhZKfhMlH81p5DBRhd71TbYiMyYarrXixWXiwkFS9QgP2m3uHvNJnp7FaKMvQZcXsLjWKzgpz5RdnNrFfQCuyy7R+DdyiCYispIqw0VCNPe5yCzTJ6MsDpI42NqHomNTGVviBywxg6uxMbYuYrfvhdu10NGXF3JZgzrvfyvbCdVPZWmWXyeM3XmIziXLM3zCvPeBYuZmdc9KtKVehiiXGoccgsPNmCjhvrhjHrXkpvqKRaQ5/Fw85/h9KOBjUxcFWdohLap1fmzboXo19HMgS89ViXqY5De0dKkvJLPHI0zoFmnYiyuZw3ts2saeQqzhoJCfhhmrZ3OXYR6VZpPzGVV3CBTC3SxSbkdoELca5Dnu8iI06jt/tKcUBRpiYp4oyAq0j6EOT73SF8s1XLgDWqterv9dRMeaYqXW2hdr6ECXw6Rd4iisxtWQgIh8PDvA1o8yC7Ec+w5Zf7PXe9Ng3pxMNfv6r99NhUtFt/ZZAyz9IkJOEfiHKbMVCM1ycSqciv2y4XeBQyxVWmjLsnWbe7ymLZCSnXdA/kS79tMxsWqsw2RBB/kI+7PL/P0zdOD+eH3XZ6m9+43HS4AxdJXKeWj6wRDWg0VPlazXGCqy5cUPrRtrQXy3XpRH5V4p9ZS64fCneIxePq85RXZVs5fG+WUHXlledSEy1ctES1JCOKV28XovFdIn11GlOfrPmaFFR90htihSo4dysOJLUFd3QJvHOl6r9zSygoYtQPLODj148PZW5U4EXrjn+DNzoPQ59dBOIkjlE+6dtB/wnGJEl2kve0iiMcKhETJkndX6IhOxs6C9MCSl1qabDQ0A2PeyLJeeD9l4/5GgAMMZjoMJKpqCU7bwGe2dcFDH/r5M3SGWhg9V+Cv+ry37bgFJtBECp+oYEaP42MW4x7XJdM0Whi6s+qBSg7/tjhAKlNgpYuQ1H0LJJmyC3d0gJuEa2VmxebpXIDiFAEufGmISPksgPNI46y8jZPGGP8ZlH30lcZhZtD2bu8ps/ELsMR73L8ucBoAYxOiuOBm4rktL4A/ib/MOqlUD7uFHifFri/z4uJUBzPrnFJkc2kSQk3mcxZ3TIbcDLHIQnbSyb5pHR1uZGGY1W07Jj5SHgmnjffFuWmFMm2784PRUDcEuOBnsh3/CuyczzsX3+wqxw67yiCszQMNXTZClKRHVtp0tSOHWg1+GS/ooPScQ2csVfqNV/dZBt8c6cmTxG1egHHwN/nN9TRZdK8xpnlNnty0cw0lQx01zxqtn2YhqY2CGCocKYueRH+Pu/kRV4LP9oYNSgsstz7zDZyQUGwBZsobOgLiZjrs0slyEE52SAtjji9jUIfUuKRxjv0MaAxY3vEkqYHG/9lDzbPYoU4pWs5+rZ3TGo0Zf89F7ZREwtsnvlZxh4Hzni010w3xVD6hHqbiAAw5P/MkNognvVJrsJLAC49rDh9EDFkj/33zqV4RuCRhIMuAj4qcViahvD8SvNZljH5IF8tJI+WwxYcFP838r7WPtVt3JBTRUHzQJXxIeCuHt5XKp/eroe61ZSqDkq+EnjHqqF/EKzGiKmYxEL6jFWsv/uFhTvdVK3yVH8r4LtYE+i9Q2YLDddSvRratFCLrTteR06slZBmaxQhMAt71egbo2ayBJ9zZ7WZC2bvK2s98NrghfFrCr1aQrJhjEutiqwUyeMto1Kdg9INV/WC/Grqkgv8XC7O2giQQab/lFL5+EpgRoovBbpFiB71lUTeitAr/v95x6AMwyTyZA5enqRk6HPOMNmawStc6QhPek6m5bSOs3kbmKR97CHQeUZPalBnaqWVdBCgVXayCuwuHasprBY86YQGefd3FcjsqIwCdHO1OH2UVU0JLXBpLzIts11NFa2grFHsypBpR4uqqEof/TOMJmMRYx41bAzqTqqiqa30HFbXsTjrIQhpM8RA3YT1RQYwMtDbKElkR8JNUvk7FIgB6Y8fpz9bNZjSwQzPsLfqO4rHeb6iiKiBR0nMxjMuqqCnmnznD5HpAWfg/rB5aM8GLGfAbKfPaN6lS1BtTMZbdf6yFQDriLn0SVE2VMaGo2tTq69MVealpLPxjt8YWWukT3WN9nFavTmzWxw6kLLtOu074YNUe5fEfCIQf2ikoNIDELnOEIyW0BwBJLqMXzpc6ZkEmcLPZJDIcqYAB1/PFKHw8EwnzGRK1dVqk1SPcyvQkq7+1I5kEDuwC03oTKuc2nXcHEMXtW2sdqioLTCjK6BSljI0mkc3oh3RFNDhcjalOs3ozDOwA+3hJDDVOG/Hk8k7MM6JL12fSUtUvCtNaEPd67bGkEo6wtmORrShGZ3avJJsSysaS1STl/UpxDctUZbGtVebc5q70VVteaL2Wzk2umNRTKFd3zqeqd/AUlRFpcJIZBm7xtWrhRbvSC9PbWhByzbjTbDbjeWuT4I3tT0TWhF/qFU5AzvSDI76Dlq3+nhnenFjvdXmFZ6XY3zBrsvE5osW4zlHO+wICN6iNkSNx1iGkLUVnxB/6z/ACgGO/yXwPe9A/fwsWNld97toLqWWlcB+vh7cXngxf9Dg81Hsy/LD3ENSUNUI03T+j/MrMJby+PXjFp2vWyucSGa/o8CXKYzp2PGaJ+P6r8z70YOrS7lFJWId4P9x8l+J8WPqSQUAAA==) format('woff2')}
One Taste pipeline. Different Questions and source observations.Model facts and required references stay fixed; Taste selects scope, hierarchy and ELK preferences.
adopter
maintainer
source-gap
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.json b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.json index b722140..c890ad3 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.json +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.json @@ -1,26 +1,53 @@ { "sources": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "receipt": { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 514473, + "outputBytes": 281968 + }, + "sha256": "28d22b3348d118c8faf311b0549bdbd1ec8d103ccd68118158656c4baaed5ec0" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 514473, + "outputBytes": 514473, + "selected": "original" + }, + "regions": {} + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -62,12 +89,12 @@ "minimumTextSize": 13, "samples": 2 }, - "inputSHA256": "19efe618b37a6690026d2d953917772c1b07d425e25d81d1337e3ed583afc619", + "inputSHA256": "7e6dfe063413d906332fcbcfc0269690d4e736b33c415c60a14f32c48b94c1d2", "scenes": [], "svgSHA256": [ - "e85d0058944ef3ca98acfa51fb9782f4ccb2964e6083d8abec53cfae6b9efe13" + "4ceda622ca69531ce74189241406bdeb8832ba76e0fc6336c9d3d79cf0fd206c" ], - "composedHTMLSHA256": "99975b4745fb51837d87b3dd32e7836fd0c7704d9f07304bf58b2a0e06676a68", + "composedHTMLSHA256": "de5ba4fc52f73be0a9d29318204504e1908860f0af29a51cff3ffc20aef2a04d", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -76,18 +103,19 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": {}, - "htmlSHA256": "191ab6e4f696ccecc06bd8286999253ba745341109716dca1b0896f136f9c015", + "htmlSHA256": "3388aef7dafc65d31449f6e1ffc1082b7e25b642cbcb9fa43cb4ad5c21803caf", "drawing": "roughjs@4.6.6", "routing": "none", "assetSHA256": { "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" }, - "pngSHA256": "95b8a5bd7331f1547941abace6a44bae1693575382ac54ed0137e22ce5c003f6", + "pngSHA256": "d6655b4e06f7a2cb51bd658636b3cd57c722e83cfbd820c1f2992d038f4884f7", "browser": "156.0.8078.4", "width": 1200, "height": 2946, @@ -97,17 +125,17 @@ "candidates": [ { "name": "adopter", - "hash": "9ac66a732fc3c7de88a07d0dab2586552fa035dee6b60dfa522e1f85e6e5a3bb", + "hash": "e90efa4592ff422e81424e852393f57c27c276cb23910d46e75d912e6b6b892c", "drawing": "roughjs@4.6.6" }, { "name": "maintainer", - "hash": "46f3e5a829a8ac9d9daba9cad6e1bfe8db828ee44e50d5f2323c56ea549118e5", + "hash": "91c9f4a2deb92c1e486bfb368c2cd77eeb98145348c24adceee498593653d370", "drawing": "roughjs@4.6.6" }, { "name": "source-gap", - "hash": "5c236bc5935cb9d57bdaa52098980b9cdc480084939ec379217efc9230588837", + "hash": "e21eafa2cb9eea5db2dd91e74873b3320fb56502726dccea1ad7eacfbc0cc2e6", "drawing": "roughjs@4.6.6" } ] diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.png b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.png index bfa06b4..acb3393 100644 Binary files a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.png and b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-comparison.png differ diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.html b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.html index cd7769e..266b3bb 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.html +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.html @@ -72,4 +72,4 @@ footer{margin-top:14px}footer>svg{margin-top:4px} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important}
Library / Profile / Scenario: Question-driven design?Who binds the actual project inputs?
{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsbinds actual inputsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisions
Project maintainer1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued
\ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}
Library / Profile / Scenario: Question-driven design?Who declares the project input bindings?
{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsdeclares input bindingsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisions
Project maintainer1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.json b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.json index fd409c7..47f8f40 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.json +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.json @@ -1,26 +1,53 @@ { "sources": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "receipt": { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 241462, + "outputBytes": 106742 + }, + "sha256": "de046043759b9f15c3b4c83eb3e6a57b42e12cef97c773caa51aeac51e3da6f5" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 241462, + "outputBytes": 241462, + "selected": "original" + }, + "regions": {} + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -160,21 +187,21 @@ "minimumTextSize": 12, "samples": 23 }, - "inputSHA256": "a7c85da16b5416aa04c6314bb7648667c20ba06d4ca63840d95eed64ee95f853", + "inputSHA256": "584365caca483b4fbe738d8777972ab1bbd5b5c81c23feae45b0e33520f6457d", "scenes": [ { - "inputSHA256": "3ccce8014486dc272fee21693d2f3319a0c4aa467bc0ff4f8245c423297b7197", - "layoutSHA256": "8d88bb23ac52b9dd04475148f845d5252945bdc4f9f8336efbccce1e22857f86", + "inputSHA256": "1c4d7ab93e34c5f8fb6162e41218e493786e93e3789f3aad317ad3207ca36165", + "layoutSHA256": "72250993ce3b1ed0c0fff985597f7ad0441faa2f5bc0be1b9bd1a423aa696db2", "nodes": 5, "edges": 4, - "milliseconds": 147.6472920000001 + "milliseconds": 465.12966700000015 } ], "svgSHA256": [ - "97a7067b796391c2db2ad4464eada2c6fac7256a839aed5124f1d79ba8205611", - "b29fc862c86af70d62150f8d24e10980cf783ff7d67c5ec3154a9a4641354180" + "83bf9b5de42fa5992b304334472313c1fd95c71b48a7ed973ba15ff821c21c2a", + "a7c0b1adc9b80200ffb0f871f3ffa57ec1d18a3453fbda62cbdff202c4214b81" ], - "composedHTMLSHA256": "2304f3f6483394532319a8d1bcfaee44f24586a1ad797999975a1816c3493c7b", + "composedHTMLSHA256": "139204b3b2dad79bb150a8e9925309fbb636476ac09eadee80d9c4d783752f9f", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -183,18 +210,19 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": {}, - "htmlSHA256": "360bf71643d0c759785cbd8a7d621749163143602c4bed60a8fd26ccba042543", + "htmlSHA256": "79a5946ea63f267f82078382c9b2d87fecc194508a1a94c05276de077957dbb2", "drawing": "roughjs@4.6.6", "routing": "elkjs@0.12.1", "assetSHA256": { - "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93", - "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb" + "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", + "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" }, - "pngSHA256": "46f3e5a829a8ac9d9daba9cad6e1bfe8db828ee44e50d5f2323c56ea549118e5", + "pngSHA256": "91c9f4a2deb92c1e486bfb368c2cd77eeb98145348c24adceee498593653d370", "browser": "156.0.8078.4", "width": 1800, "height": 1398, @@ -209,13 +237,13 @@ } }, "taste": { - "inputSHA256": "a7c85da16b5416aa04c6314bb7648667c20ba06d4ca63840d95eed64ee95f853", - "htmlSHA256": "360bf71643d0c759785cbd8a7d621749163143602c4bed60a8fd26ccba042543", - "pngSHA256": "46f3e5a829a8ac9d9daba9cad6e1bfe8db828ee44e50d5f2323c56ea549118e5", + "inputSHA256": "584365caca483b4fbe738d8777972ab1bbd5b5c81c23feae45b0e33520f6457d", + "htmlSHA256": "79a5946ea63f267f82078382c9b2d87fecc194508a1a94c05276de077957dbb2", + "pngSHA256": "91c9f4a2deb92c1e486bfb368c2cd77eeb98145348c24adceee498593653d370", "design": { "audience": "Project maintainer", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "binding" ], @@ -237,28 +265,29 @@ ] }, "sourceSHA256": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "selection": { - "bindingSHA256": "7e962aea1ac96f9b62bb4b0b288ad19efd404f75145919824331ad092b27a6b3", + "bindingSHA256": "bef870e2979da78ef6221d6bf4f75a2050459413e4b69cbeb653bac4d94149cf", "decisions": [ { "rationale": "1 subjects are explicitly linked to the selected Questions.", @@ -273,7 +302,7 @@ "design": { "audience": "Project maintainer", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "binding" ], diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.png b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.png index 9c1f254..90b6195 100644 Binary files a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.png and b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.png differ diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.svg b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.svg index 51a78b0..4fa34c8 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.svg +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-maintainer.svg @@ -72,4 +72,4 @@ footer{margin-top:14px}footer>svg{margin-top:4px} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important} @font-face{font-family:"Kalam";font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format('woff2')} -@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.0","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Project maintainer","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["binding"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]},"evidence":[],"taste":{"bindingSHA256":"7e962aea1ac96f9b62bb4b0b288ad19efd404f75145919824331ad092b27a6b3","decisions":[{"rationale":"1 subjects are explicitly linked to the selected Questions.","questionRefs":["binding"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"design":{"audience":"Project maintainer","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["binding"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]}},"rule":"question-focus"},{"rationale":"Retain 5 displayed subjects, including required references and their declared containers.","questionRefs":["binding"],"subjectRefs":["library","project","project.profile","project.scenario","project.inputs"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"question-scope"},{"rationale":"Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.","questionRefs":["binding"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"dependency-layout"},{"rationale":"Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.","questionRefs":["binding"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"visual-hierarchy"}]},"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"a7c85da16b5416aa04c6314bb7648667c20ba06d4ca63840d95eed64ee95f853","model":{"subjects":[{"id":"library","type":"rectangle","level":1,"label":"Library\nDefinitions and contracts"},{"id":"project","type":"rectangle","level":1,"label":"Project"},{"id":"project.profile","type":"rectangle","level":2,"label":"Profile\nSelects published definitions"},{"id":"project.scenario","type":"rectangle","level":2,"label":"Scenario\nBinds project inputs"},{"id":"project.inputs","type":"rectangle","level":2,"label":"Repository inputs\nModels / Org / decisions"}],"relations":[{"id":"(project.profile -> library)[0]","src":"project.profile","dst":"library","label":"selects","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> profile)[0]","src":"project.scenario","dst":"project.profile","label":"binds","srcArrow":"none","dstArrow":"triangle"},{"id":"(project.scenario -> library)[0]","src":"project.scenario","dst":"library","label":"references definitions","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> inputs)[0]","src":"project.scenario","dst":"project.inputs","label":"binds actual inputs","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2","title":"Library / Profile / Scenario: Question-driven design","purpose":"architecture","kind":"design-comparison","question":{"subjectRefs":["project.scenario"],"ref":"binding","text":"Who binds the actual project inputs?","focusRefs":["scenario","model"]},"basis":{"captureRef":"design-candidate:library-design-taste","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.145-design-taste-public-contracts.org"],"evidenceRefs":[]}},"questions":[{"subjectRefs":["project.scenario"],"ref":"binding","text":"Who binds the actual project inputs?","focusRefs":["scenario","model"]}],"references":{"capture-gap":"scenarios/project-formation/func.ss","case":"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2","library":"library/project-organization/objects.ss","model":"project.sysml","profile":"profiles/library-formation.ss","scenario":"scenarios/project-formation/func.ss","source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2"},"sourceSHA256":{"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2":"865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc","docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2":"394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481","library/project-organization/objects.ss":"f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/design-case.ts":"70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea","packages/render/examples/design-choices.ts":"c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536","packages/render/package.json":"cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371","packages/render/src/design.ts":"5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2","packages/render/src/figure.ts":"4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/taste-policies.ts":"9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9","packages/render/src/taste-selection.ts":"0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897","packages/render/src/taste.ts":"4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893","profiles/library-formation.ss":"5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f","project.sysml":"a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1","scenarios/project-formation/func.ss":"b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1200,"height":932},"subjects":[{"id":"project","role":"default","x":325.8243408203125,"y":131.19061279296875,"width":550.8900756835938,"height":343.50054931640625},{"id":"library","role":"default","x":438,"y":575.580078125,"width":215.15960693359375,"height":85.39031982421875},{"id":"project.profile","role":"default","owner":"project","x":392.9620361328125,"y":375,"width":229.5379638671875,"height":83.45523071289062},{"id":"project.scenario","role":"focal","owner":"project","x":462.71929931640625,"y":210.42356872558594,"width":181.41455078125,"height":86.76896667480469},{"id":"project.inputs","role":"default","owner":"project","x":642.5,"y":374.65966796875,"width":208.4544677734375,"height":84.07254028320312}],"relations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1160,"height":48},{"role":"question","x":20,"y":68,"width":1160,"height":34},{"role":"answer","x":20,"y":695,"width":1160,"height":31},{"role":"note","x":20,"y":730,"width":1160,"height":27},{"role":"note","x":20,"y":761,"width":1160,"height":27},{"role":"note","x":20,"y":792,"width":1160,"height":27},{"role":"note","x":20,"y":823,"width":1160,"height":27},{"role":"note","x":20,"y":854,"width":1160,"height":27},{"role":"note","x":20,"y":885,"width":1160,"height":27}]},"readability":{"minimumTextSize":12,"samples":23},"bounds":{"model":{"x":20,"y":110,"width":1160,"height":571}}}}Library / Profile / Scenario: Question-driven design?Who binds the actual project inputs?{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsbinds actual inputsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisionsProject maintainer1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued \ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.2","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Project maintainer","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["binding"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]},"evidence":[],"taste":{"bindingSHA256":"bef870e2979da78ef6221d6bf4f75a2050459413e4b69cbeb653bac4d94149cf","decisions":[{"rationale":"1 subjects are explicitly linked to the selected Questions.","questionRefs":["binding"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"design":{"audience":"Project maintainer","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["binding"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]}},"rule":"question-focus"},{"rationale":"Retain 5 displayed subjects, including required references and their declared containers.","questionRefs":["binding"],"subjectRefs":["library","project","project.profile","project.scenario","project.inputs"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"question-scope"},{"rationale":"Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.","questionRefs":["binding"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"dependency-layout"},{"rationale":"Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.","questionRefs":["binding"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"visual-hierarchy"}]},"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"focal"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"584365caca483b4fbe738d8777972ab1bbd5b5c81c23feae45b0e33520f6457d","model":{"subjects":[{"id":"library","type":"rectangle","level":1,"label":"Library\nDefinitions and contracts"},{"id":"project","type":"rectangle","level":1,"label":"Project"},{"id":"project.profile","type":"rectangle","level":2,"label":"Profile\nSelects published definitions"},{"id":"project.scenario","type":"rectangle","level":2,"label":"Scenario\nBinds project inputs"},{"id":"project.inputs","type":"rectangle","level":2,"label":"Repository inputs\nModels / Org / decisions"}],"relations":[{"id":"(project.profile -> library)[0]","src":"project.profile","dst":"library","label":"selects","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> profile)[0]","src":"project.scenario","dst":"project.profile","label":"binds","srcArrow":"none","dstArrow":"triangle"},{"id":"(project.scenario -> library)[0]","src":"project.scenario","dst":"library","label":"references definitions","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> inputs)[0]","src":"project.scenario","dst":"project.inputs","label":"declares input bindings","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2","title":"Library / Profile / Scenario: Question-driven design","purpose":"architecture","kind":"design-comparison","question":{"subjectRefs":["project.scenario"],"ref":"binding","text":"Who declares the project input bindings?","focusRefs":["scenario","model"]},"basis":{"captureRef":"design-candidate:library-design-taste","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.145-design-taste-public-contracts.org"],"evidenceRefs":[]}},"questions":[{"subjectRefs":["project.scenario"],"ref":"binding","text":"Who declares the project input bindings?","focusRefs":["scenario","model"]}],"references":{"capture-gap":"library/project-formation/objects.ss","case":"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2","library":"library/project-organization/objects.ss","model":"project.sysml","profile":"library/library-formation-profiles/objects.ss","scenario":"library/project-formation/func.ss","source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2"},"sourceSHA256":{"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2":"bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033","docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2":"f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0","library/library-formation-profiles/objects.ss":"52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547","library/project-formation/func.ss":"c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21","library/project-formation/objects.ss":"a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957","library/project-organization/objects.ss":"8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1","package.json":"b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/design-case.ts":"70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea","packages/render/examples/design-choices.ts":"fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0","packages/render/src/design.ts":"5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c","packages/render/src/figure.ts":"5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/taste-policies.ts":"9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9","packages/render/src/taste-selection.ts":"0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897","packages/render/src/taste.ts":"4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893","project.sysml":"a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1200,"height":932},"subjects":[{"id":"project","role":"default","x":325.8243408203125,"y":131.19061279296875,"width":550.8900756835938,"height":343.50054931640625},{"id":"library","role":"default","x":438,"y":575.580078125,"width":215.15960693359375,"height":85.39031982421875},{"id":"project.profile","role":"default","owner":"project","x":392.9620361328125,"y":375,"width":229.5379638671875,"height":83.45523071289062},{"id":"project.scenario","role":"focal","owner":"project","x":462.71929931640625,"y":210.42356872558594,"width":181.41455078125,"height":86.76896667480469},{"id":"project.inputs","role":"default","owner":"project","x":642.5,"y":374.65966796875,"width":208.4544677734375,"height":84.07254028320312}],"relations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1160,"height":48},{"role":"question","x":20,"y":68,"width":1160,"height":34},{"role":"answer","x":20,"y":695,"width":1160,"height":31},{"role":"note","x":20,"y":730,"width":1160,"height":27},{"role":"note","x":20,"y":761,"width":1160,"height":27},{"role":"note","x":20,"y":792,"width":1160,"height":27},{"role":"note","x":20,"y":823,"width":1160,"height":27},{"role":"note","x":20,"y":854,"width":1160,"height":27},{"role":"note","x":20,"y":885,"width":1160,"height":27}]},"readability":{"minimumTextSize":12,"samples":23},"bounds":{"model":{"x":20,"y":110,"width":1160,"height":571}}}}Library / Profile / Scenario: Question-driven design?Who declares the project input bindings?{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsdeclares input bindingsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsRepository inputsModels / Org / decisionsProject maintainer1 subjects are explicitly linked to the selected Questions.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: unobservedCurrent repository source observations only · no C/Q/R issued \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.html b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.html index 2b93fbe..f0bc3aa 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.html +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.html @@ -79,4 +79,4 @@ footer{margin-top:14px}footer>svg{margin-top:4px} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important}
Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?
{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsbinds actual inputsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsmissing · capture-gapRepository inputsModels / Org / decisions
Source review1 subjects are explicitly linked to the selected Questions.Selected source projections contain missing; their subjects take visual priority without changing model facts.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: missingCurrent repository source observations only · no C/Q/R issued
\ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}
Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?
{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsdeclares input bindingsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsmissing · capture-gapRepository inputsModels / Org / decisions
Source review1 subjects are explicitly linked to the selected Questions.Selected source projections contain missing; their subjects take visual priority without changing model facts.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: missingCurrent repository source observations only · no C/Q/R issued
\ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.json b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.json index 60feb78..787af1d 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.json +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.json @@ -1,26 +1,53 @@ { "sources": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "receipt": { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 265059, + "outputBytes": 112952 + }, + "sha256": "680c788ee20e32af739b259d4be5993078c68a5e719d09497077084cf7e307ce" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 265059, + "outputBytes": 265059, + "selected": "original" + }, + "regions": {} + }, "attribution": { "copyright": [ "2026 hardenedlinux Linux Team and Contributors", @@ -167,21 +194,21 @@ "minimumTextSize": 12, "samples": 25 }, - "inputSHA256": "61e2bcfba40751bdda1aca5f6a0b1c60d81d8b494a7aa6f1923e2d5e44f0f506", + "inputSHA256": "25ff3ba422ed7d1ca36d40930602817c01d41748fc922fde25406a786dc7c636", "scenes": [ { - "inputSHA256": "ec0db347189261f683946d7806bed97a456696489ad5e88d9cec707b75c7343b", - "layoutSHA256": "df6cd03806de3f3fab65a4293e9106776c110733848c1022805fec70d12c9801", + "inputSHA256": "f0ba1ba87478f575634874fb195ee9d2044fd829500ddcf83376e8453065dc21", + "layoutSHA256": "fd0ba59abe6254b39f73b87238ff7f3c21332436e5f506f9de12a9d3d17e519d", "nodes": 5, "edges": 4, - "milliseconds": 154.13745900000004 + "milliseconds": 154.70308300000033 } ], "svgSHA256": [ - "924ac65275013962826ba957d34990934c5ccb88eae3b20cb2c022dc28bb32f7", - "aacf3583fb4bc7f7539e6b6055d1e11db3d2e23a3df8fa7a2be64c7875e6a8be" + "ab6da9c8e9c837e0f3945eac76111770b6ca07c4bd224abacb37917cfa5b51f4", + "2e854af87f7abca39135e458f8fed404603c8a27eabd136d2e5e775206da83aa" ], - "composedHTMLSHA256": "6fc68e3dfbac970cc39e5a34e02712f27d4a5c8ec184a50d283d487bf5ee22b0", + "composedHTMLSHA256": "c7485c4557332bcecbb23e610a5248915015908c10eb9456c8f3beef7512560c", "dependencies": { "@fontsource/inter": "5.3.0", "@fontsource/kalam": "5.3.0", @@ -190,18 +217,19 @@ "elkjs": "0.12.1", "parse5": "8.0.1", "roughjs": "4.6.6", + "sharp": "0.35.5", "valibot": "1.2.0", "web-worker": "1.5.0" }, "regionSHA256": {}, - "htmlSHA256": "6427b0885d8dc48109cb6bad83491e894eeb28441e434d7a79c98767243fc82e", + "htmlSHA256": "f468d9fe6d821bd28bc4ab405adc0842e4ef0e8fa550c60084230b1598c2600c", "drawing": "roughjs@4.6.6", "routing": "elkjs@0.12.1", "assetSHA256": { "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb", "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93" }, - "pngSHA256": "5c236bc5935cb9d57bdaa52098980b9cdc480084939ec379217efc9230588837", + "pngSHA256": "e21eafa2cb9eea5db2dd91e74873b3320fb56502726dccea1ad7eacfbc0cc2e6", "browser": "156.0.8078.4", "width": 1800, "height": 1493, @@ -216,13 +244,13 @@ } }, "taste": { - "inputSHA256": "61e2bcfba40751bdda1aca5f6a0b1c60d81d8b494a7aa6f1923e2d5e44f0f506", - "htmlSHA256": "6427b0885d8dc48109cb6bad83491e894eeb28441e434d7a79c98767243fc82e", - "pngSHA256": "5c236bc5935cb9d57bdaa52098980b9cdc480084939ec379217efc9230588837", + "inputSHA256": "25ff3ba422ed7d1ca36d40930602817c01d41748fc922fde25406a786dc7c636", + "htmlSHA256": "f468d9fe6d821bd28bc4ab405adc0842e4ef0e8fa550c60084230b1598c2600c", + "pngSHA256": "e21eafa2cb9eea5db2dd91e74873b3320fb56502726dccea1ad7eacfbc0cc2e6", "design": { "audience": "Source review", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], @@ -244,28 +272,29 @@ ] }, "sourceSHA256": { - "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc", - "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481", - "library/project-organization/objects.ss": "f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6", + "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2": "bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033", + "docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2": "f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0", + "library/library-formation-profiles/objects.ss": "52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547", + "library/project-formation/func.ss": "c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21", + "library/project-formation/objects.ss": "a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957", + "library/project-organization/objects.ss": "8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", "packages/render/examples/design-case.ts": "70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea", - "packages/render/examples/design-choices.ts": "c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536", - "packages/render/package.json": "cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371", + "packages/render/examples/design-choices.ts": "fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0", "packages/render/src/design.ts": "5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a", "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", - "packages/render/src/export.ts": "791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2", - "packages/render/src/figure.ts": "4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", "packages/render/src/taste-policies.ts": "9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9", "packages/render/src/taste-selection.ts": "0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897", "packages/render/src/taste.ts": "4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893", - "profiles/library-formation.ss": "5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f", - "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1", - "scenarios/project-formation/func.ss": "b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350" + "project.sysml": "a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1" }, "selection": { - "bindingSHA256": "14f7b16a9b7155c88ae130c3a4619f8b191a43d80adcb77b23e58355b5e57f42", + "bindingSHA256": "a3ec03565a404c02c932de72d16775075e5ef575cd0caf6e9ba5d7d58eb6fc36", "decisions": [ { "rationale": "1 subjects are explicitly linked to the selected Questions.", @@ -280,7 +309,7 @@ "design": { "audience": "Source review", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], @@ -319,7 +348,7 @@ "design": { "audience": "Source review", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.png b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.png index 75a783f..7e7329a 100644 Binary files a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.png and b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.png differ diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.svg b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.svg index cb702a1..4dde809 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.svg +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices-source-gap.svg @@ -79,4 +79,4 @@ footer{margin-top:14px}footer>svg{margin-top:4px} .scene-groups .sketch-surface path:not([stroke="none"]){stroke:var(--muted);stroke-width:1.5}[data-figure]{background:var(--background)!important}[data-panel]{border-radius:2px!important;background:transparent!important;border:0!important;border-top:1px dashed var(--border)!important}[data-heading]{letter-spacing:0!important}[data-summary]{background:var(--tint)!important;color:var(--ink)!important;border-radius:0!important}[data-surface]{position:relative;isolation:isolate;border-color:transparent!important;border-radius:0!important;background:transparent!important}[data-surface]>*{position:relative;z-index:1}[data-surface]>.sketch-surface{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:visible}[data-badge]{background:transparent!important;border-bottom:2px solid var(--secondary);border-radius:0!important} @font-face{font-family:"Kalam";font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format('woff2')} -@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.0","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Source review","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]},"evidence":[{"sourceRef":"capture-gap","excerpt":"status: 'capture-blocked","state":"missing","subjectRefs":["project.scenario"],"relationRefs":[]}],"taste":{"bindingSHA256":"14f7b16a9b7155c88ae130c3a4619f8b191a43d80adcb77b23e58355b5e57f42","decisions":[{"rationale":"1 subjects are explicitly linked to the selected Questions.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"design":{"audience":"Source review","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["library"]}},"rule":"question-focus"},{"rationale":"Selected source projections contain missing; their subjects take visual priority without changing model facts.","questionRefs":["publication"],"subjectRefs":["project.scenario"],"evidenceRefs":["capture-gap"],"changes":{"design":{"audience":"Source review","medium":"README component view","message":"Library publishes; Profile selects; Scenario binds actual inputs.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]}},"rule":"evidence-focus"},{"rationale":"Retain 5 displayed subjects, including required references and their declared containers.","questionRefs":["publication"],"subjectRefs":["library","project","project.profile","project.scenario","project.inputs"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"question-scope"},{"rationale":"Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.","questionRefs":["publication"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"dependency-layout"},{"rationale":"Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.","questionRefs":["publication"],"subjectRefs":["project.scenario"],"evidenceRefs":["capture-gap"],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"pending"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"visual-hierarchy"}]},"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"pending"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"61e2bcfba40751bdda1aca5f6a0b1c60d81d8b494a7aa6f1923e2d5e44f0f506","model":{"subjects":[{"id":"library","type":"rectangle","level":1,"label":"Library\nDefinitions and contracts"},{"id":"project","type":"rectangle","level":1,"label":"Project"},{"id":"project.profile","type":"rectangle","level":2,"label":"Profile\nSelects published definitions"},{"id":"project.scenario","type":"rectangle","level":2,"label":"Scenario\nBinds project inputs"},{"id":"project.inputs","type":"rectangle","level":2,"label":"Repository inputs\nModels / Org / decisions"}],"relations":[{"id":"(project.profile -> library)[0]","src":"project.profile","dst":"library","label":"selects","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> profile)[0]","src":"project.scenario","dst":"project.profile","label":"binds","srcArrow":"none","dstArrow":"triangle"},{"id":"(project.scenario -> library)[0]","src":"project.scenario","dst":"library","label":"references definitions","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> inputs)[0]","src":"project.scenario","dst":"project.inputs","label":"binds actual inputs","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2","title":"Library / Profile / Scenario: Question-driven design","purpose":"architecture","kind":"design-comparison","question":{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]},"basis":{"captureRef":"design-candidate:library-design-taste","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.145-design-taste-public-contracts.org"],"evidenceRefs":["capture-gap"]}},"questions":[{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]}],"references":{"capture-gap":"scenarios/project-formation/func.ss","case":"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2","library":"library/project-organization/objects.ss","model":"project.sysml","profile":"profiles/library-formation.ss","scenario":"scenarios/project-formation/func.ss","source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2"},"sourceSHA256":{"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2":"865851b9efa36c9ddadd9d4e5284b4214564d6f57e3e6e85930709a92f7a96fc","docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2":"394c73914d695c9990f1f3fa85d2a2964c6838c7380f0cc6f0d60b912eb03481","library/project-organization/objects.ss":"f660d3d90a55a9d7deff8782194dbdc952e85ecfd52463577e8ab1be9905a6b6","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/design-case.ts":"70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea","packages/render/examples/design-choices.ts":"c549f116af5faded85ae887590bfd123cc5db298302cab0c0f8ad12c45680536","packages/render/package.json":"cdb4f5d8639d7fdd389973db286612d5db57b42c873fdc3a2316dd1ac9f0c371","packages/render/src/design.ts":"5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"791963ea500bb6c08af8def6605b1366b5afc887796862f01b3ee76465dbfab2","packages/render/src/figure.ts":"4f994cc394859027e4986635bffc1b45144a01140e19a1ce6b7b5748fa58bbd7","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/taste-policies.ts":"9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9","packages/render/src/taste-selection.ts":"0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897","packages/render/src/taste.ts":"4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893","profiles/library-formation.ss":"5b124cfda09b5d2d950481ae8f1e6143a135f7f1c0ce0328fd3de5407e732c1f","project.sysml":"a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1","scenarios/project-formation/func.ss":"b3943c92bf48daac75b456e5a994aedba099226ba6aa232e937dae57e53e1350"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1200,"height":995},"subjects":[{"id":"project","role":"default","x":325.8243408203125,"y":131.19061279296875,"width":550.8900756835938,"height":372.9342346191406},{"id":"library","role":"default","x":438,"y":607.580078125,"width":215.15960693359375,"height":85.39031982421875},{"id":"project.profile","role":"default","owner":"project","x":392.9620361328125,"y":407,"width":229.5379638671875,"height":83.45523071289062},{"id":"project.scenario","role":"pending","owner":"project","x":460.104736328125,"y":210.42356872558594,"width":190.99334716796875,"height":118.46678161621094},{"id":"project.inputs","role":"default","owner":"project","x":642.5,"y":406.65966796875,"width":208.4544677734375,"height":84.07254028320312}],"relations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1160,"height":48},{"role":"question","x":20,"y":68,"width":1160,"height":34},{"role":"answer","x":20,"y":727,"width":1160,"height":31},{"role":"note","x":20,"y":762,"width":1160,"height":27},{"role":"note","x":20,"y":793,"width":1160,"height":27},{"role":"note","x":20,"y":824,"width":1160,"height":27},{"role":"note","x":20,"y":855,"width":1160,"height":27},{"role":"note","x":20,"y":886,"width":1160,"height":27},{"role":"note","x":20,"y":917,"width":1160,"height":27},{"role":"note","x":20,"y":948,"width":1160,"height":27}]},"readability":{"minimumTextSize":12,"samples":25},"bounds":{"model":{"x":20,"y":110,"width":1160,"height":603}}}}Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsbinds actual inputsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsmissing · capture-gapRepository inputsModels / Org / decisionsSource review1 subjects are explicitly linked to the selected Questions.Selected source projections contain missing; their subjects take visual priority without changing model facts.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: missingCurrent repository source observations only · no C/Q/R issued \ No newline at end of file +@font-face{font-family:"Kalam";font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format('woff2')}{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.2","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"design":{"audience":"Source review","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]},"evidence":[{"sourceRef":"capture-gap","excerpt":"authority: 'design-only","state":"missing","subjectRefs":["project.scenario"],"relationRefs":[]}],"taste":{"bindingSHA256":"a3ec03565a404c02c932de72d16775075e5ef575cd0caf6e9ba5d7d58eb6fc36","decisions":[{"rationale":"1 subjects are explicitly linked to the selected Questions.","questionRefs":["publication"],"subjectRefs":["library"],"evidenceRefs":[],"changes":{"design":{"audience":"Source review","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["library"]}},"rule":"question-focus"},{"rationale":"Selected source projections contain missing; their subjects take visual priority without changing model facts.","questionRefs":["publication"],"subjectRefs":["project.scenario"],"evidenceRefs":["capture-gap"],"changes":{"design":{"audience":"Source review","medium":"README component view","message":"Library publishes; Profile selects; Scenario declares input bindings.","questionRefs":["publication"],"requiredSubjects":["library","project","project.profile","project.scenario","project.inputs"],"requiredRelations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"focalSubjects":["project.scenario"]}},"rule":"evidence-focus"},{"rationale":"Retain 5 displayed subjects, including required references and their declared containers.","questionRefs":["publication"],"subjectRefs":["library","project","project.profile","project.scenario","project.inputs"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"question-scope"},{"rationale":"Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.","questionRefs":["publication"],"subjectRefs":["project.scenario"],"evidenceRefs":[],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"dependency-layout"},{"rationale":"Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.","questionRefs":["publication"],"subjectRefs":["project.scenario"],"evidenceRefs":["capture-gap"],"changes":{"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"pending"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true}},"rule":"visual-hierarchy"}]},"presentation":{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.direction":"DOWN"}},"roles":{"project.scenario":"pending"},"icons":{"library":"library","project.profile":"selection","project.scenario":"capture","project.inputs":"document"},"edgeLabels":true},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"25ff3ba422ed7d1ca36d40930602817c01d41748fc922fde25406a786dc7c636","model":{"subjects":[{"id":"library","type":"rectangle","level":1,"label":"Library\nDefinitions and contracts"},{"id":"project","type":"rectangle","level":1,"label":"Project"},{"id":"project.profile","type":"rectangle","level":2,"label":"Profile\nSelects published definitions"},{"id":"project.scenario","type":"rectangle","level":2,"label":"Scenario\nBinds project inputs"},{"id":"project.inputs","type":"rectangle","level":2,"label":"Repository inputs\nModels / Org / decisions"}],"relations":[{"id":"(project.profile -> library)[0]","src":"project.profile","dst":"library","label":"selects","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> profile)[0]","src":"project.scenario","dst":"project.profile","label":"binds","srcArrow":"none","dstArrow":"triangle"},{"id":"(project.scenario -> library)[0]","src":"project.scenario","dst":"library","label":"references definitions","srcArrow":"none","dstArrow":"triangle"},{"id":"project.(scenario -> inputs)[0]","src":"project.scenario","dst":"project.inputs","label":"declares input bindings","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2","title":"Library / Profile / Scenario: Question-driven design","purpose":"architecture","kind":"design-comparison","question":{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]},"basis":{"captureRef":"design-candidate:library-design-taste","modelRefs":["project.sysml"],"obligationRefs":["docs/10-19-design/10-architecture/10.145-design-taste-public-contracts.org"],"evidenceRefs":["capture-gap"]}},"questions":[{"subjectRefs":["library"],"ref":"publication","text":"Who owns the reusable definitions?","focusRefs":["library","profile","model"]}],"references":{"capture-gap":"library/project-formation/objects.ss","case":"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2","library":"library/project-organization/objects.ss","model":"project.sysml","profile":"library/library-formation-profiles/objects.ss","scenario":"library/project-formation/func.ss","source":"docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2"},"sourceSHA256":{"docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2":"bbcc94fc077815765f3ef29b99c0956734e0e9f150bb7411a9ab968203340033","docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2":"f9af06472909e14fc64f5e460a64f065fc7c398f337c0b1488aa770f5c05d2f0","library/library-formation-profiles/objects.ss":"52c362627a35823055c58a27c3cc810d69b19e576b7ddc9dcf9d24668323f547","library/project-formation/func.ss":"c2f3216385862b397d752d55763d0d905dd6ef4f7c28c26644344a9513d68e21","library/project-formation/objects.ss":"a8d7120f5c3378cb8e5cb499439504f7b52435f9d24383b0336411e23619f957","library/project-organization/objects.ss":"8a843f07c8963f52e4b2adb324c92f2438979dd31f1caf4767a92f8fb9402db1","package.json":"b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/design-case.ts":"70c1e9886e11e867023ac72db3bc0c7e0c62bf3ea3d52db334a9251d63a108ea","packages/render/examples/design-choices.ts":"fc834cf666c970031ca0206eb6a12a97bea1f3c23c36c9c17e5df7e66b7d5ec0","packages/render/src/design.ts":"5cf15ef5faa1b968800e1c08822e473b2d2fd1f86c921aad9d2e1f9a75f4fc1a","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c","packages/render/src/figure.ts":"5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/taste-policies.ts":"9a6b5519ea51c8560b6fa33e6582cdc99ac3b6a19e69387fbb8e2a284d2058d9","packages/render/src/taste-selection.ts":"0d1d9477176d8da9f15c4f33bc8dc9d057384abd0d9cd13862f48e410fe2e897","packages/render/src/taste.ts":"4ae78ea584e10525d66dd6df685205a3bd6d7e635da531475e84a95262067893","project.sysml":"a1df4b8bd19d07011e1bf7d54b46ef855c66029ac543424743c7e388146bd9b1"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1200,"height":995},"subjects":[{"id":"project","role":"default","x":325.8243408203125,"y":131.19061279296875,"width":550.8900756835938,"height":372.9342346191406},{"id":"library","role":"default","x":438,"y":607.580078125,"width":215.15960693359375,"height":85.39031982421875},{"id":"project.profile","role":"default","owner":"project","x":392.9620361328125,"y":407,"width":229.5379638671875,"height":83.45523071289062},{"id":"project.scenario","role":"pending","owner":"project","x":460.104736328125,"y":210.42356872558594,"width":190.99334716796875,"height":118.46678161621094},{"id":"project.inputs","role":"default","owner":"project","x":642.5,"y":406.65966796875,"width":208.4544677734375,"height":84.07254028320312}],"relations":["(project.profile -> library)[0]","project.(scenario -> profile)[0]","(project.scenario -> library)[0]","project.(scenario -> inputs)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1160,"height":48},{"role":"question","x":20,"y":68,"width":1160,"height":34},{"role":"answer","x":20,"y":727,"width":1160,"height":31},{"role":"note","x":20,"y":762,"width":1160,"height":27},{"role":"note","x":20,"y":793,"width":1160,"height":27},{"role":"note","x":20,"y":824,"width":1160,"height":27},{"role":"note","x":20,"y":855,"width":1160,"height":27},{"role":"note","x":20,"y":886,"width":1160,"height":27},{"role":"note","x":20,"y":917,"width":1160,"height":27},{"role":"note","x":20,"y":948,"width":1160,"height":27}]},"readability":{"minimumTextSize":12,"samples":25},"bounds":{"model":{"x":20,"y":110,"width":1160,"height":603}}}}Library / Profile / Scenario: Question-driven design?Who owns the reusable definitions?{"graph":{"id":"ownership","children":[{"id":"library"},{"id":"project","children":[{"id":"project.profile"},{"id":"project.scenario"},{"id":"project.inputs"}]}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"36","elk.direction":"DOWN"},"edges":[{"id":"(project.profile -> library)[0]","sources":["project.profile"],"targets":["library"]},{"id":"project.(scenario -> profile)[0]","sources":["project.scenario"],"targets":["project.profile"]},{"id":"(project.scenario -> library)[0]","sources":["project.scenario"],"targets":["library"]},{"id":"project.(scenario -> inputs)[0]","sources":["project.scenario"],"targets":["project.inputs"]}]},"marker":"arrow-c322333a681a"}Projectselectsbindsreferences definitionsdeclares input bindingsLibraryDefinitions and contractsProfileSelects published definitionsScenarioBinds project inputsmissing · capture-gapRepository inputsModels / Org / decisionsSource review1 subjects are explicitly linked to the selected Questions.Selected source projections contain missing; their subjects take visual priority without changing model facts.Retain 5 displayed subjects, including required references and their declared containers.Focal subjects have 0 incoming and 3 outgoing relationships; select ELK DOWN.Selected focal and source-gap roles use the chosen theme; no evidence state is promoted to approval.Selected source observations: missingCurrent repository source observations only · no C/Q/R issued \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2 b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2 index 62f8a79..bf816a8 100644 --- a/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2 +++ b/docs/90-99-views/90-architecture-views/90.138-library-design-taste-choices.d2 @@ -26,7 +26,7 @@ vars: {d2-config: {data: {figure: |json }, { "ref": "binding", - "text": "Who binds the actual project inputs?", + "text": "Who declares the project input bindings?", "focusRefs": [ "scenario", "model" @@ -41,9 +41,9 @@ vars: {d2-config: {data: {figure: |json "model": "project.sysml", "case": "docs/90-99-views/90-architecture-views/90.132-library-profile-scenario-architecture.d2", "library": "library/project-organization/objects.ss", - "profile": "profiles/library-formation.ss", - "scenario": "scenarios/project-formation/func.ss", - "capture-gap": "scenarios/project-formation/func.ss" + "profile": "library/library-formation-profiles/objects.ss", + "scenario": "library/project-formation/func.ss", + "capture-gap": "library/project-formation/objects.ss" }, "basis": { "captureRef": "design-candidate:library-design-taste", @@ -66,7 +66,7 @@ vars: {d2-config: {data: {figure: |json "design": { "audience": "Library adopter", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], @@ -132,7 +132,7 @@ vars: {d2-config: {data: {figure: |json "design": { "audience": "Library adopter", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], @@ -161,7 +161,7 @@ vars: {d2-config: {data: {figure: |json "design": { "audience": "Project maintainer", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "binding" ], @@ -192,7 +192,7 @@ vars: {d2-config: {data: {figure: |json "design": { "audience": "Source review", "medium": "README component view", - "message": "Library publishes; Profile selects; Scenario binds actual inputs.", + "message": "Library publishes; Profile selects; Scenario declares input bindings.", "questionRefs": [ "publication" ], @@ -216,7 +216,7 @@ vars: {d2-config: {data: {figure: |json "evidence": [ { "sourceRef": "capture-gap", - "excerpt": "status: 'capture-blocked", + "excerpt": "authority: 'design-only", "state": "missing", "subjectRefs": [ "project.scenario" @@ -236,4 +236,4 @@ project: Project { project.profile -> library: selects project.scenario -> project.profile: binds project.scenario -> library: references definitions -project.scenario -> project.inputs: binds actual inputs +project.scenario -> project.inputs: declares input bindings diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2 b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2 new file mode 100644 index 0000000..575d8bc --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2 @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +# Org authority: ../../10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org +# Design projection; rendering is not verification or approval. +vars: {d2-config: {data: {figure: |json +{ + "title": "Source contracts: from Library obligation to scoped evidence", + "purpose": "workflow", + "kind": "library-workflow", + "language": "en", + "width": 1400, + "primary": "ownership", + "questions": [ + { + "ref": "ownership", + "text": "How does a consumer check actual C/C++ code without turning the Library into a Runtime?", + "focusRefs": [ + "authority", + "declaration" + ], + "subjectRefs": [ + "parent", + "methods", + "ascent" + ] + } + ], + "references": { + "authority": "docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org", + "declaration": "docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2" + }, + "basis": { + "captureRef": "design-candidate:90.139-source-bound-c-and-cpp-contract-verification", + "modelRefs": [ + "docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org" + ], + "obligationRefs": [], + "evidenceRefs": [] + }, + "copy": {}, + "themes": [ + "sketchbook", + "compact" + ], + "presentation": { + "options": { + "elk.direction": "DOWN", + "elk.layered.spacing.nodeNodeBetweenLayers": "48" + }, + "edgeLabels": false + } +} +|}}} +direction: down + +parent: "Parent Library\nModels, rules and obligations" +profile: "Profile Module\nABI, macros and method bounds" +scenario: "Consumer Scenario\nReal source, callers and faults" +contracts: "Source contracts\nPre/postconditions, writes and owners" +plans: "Scheme method declarations\nTyped verification plans; no execution" +methods: "Development verification\nReal body + callers; bounded CBMC / native tests" +math: "Lean / Quint correspondence\nNumeric lemmas / state-order assumptions" +oracle: "Independent checks\nLiteral gold and actual source mutants\nOccupied refusal / self transfer" +closure: "Captured evidence inputs\nSource, harness, tools, bounds and configuration\nSix retained real results; five full test cases" +ascent: "ASCENT relations\nSupport, counter, pending and reuse premises" +consumer: "External consuming ecosystem\nReview and current-use authorization" +change: "Changed source or assumptions\nNew capture; retain old witnesses and frozen queries" +parent -> profile -> scenario +parent -> contracts +profile -> plans +scenario -> methods +contracts -> methods +plans -> methods +math -> oracle +methods -> oracle -> closure -> ascent -> consumer +consumer -> change -> scenario diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.json b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.json new file mode 100644 index 0000000..38ad8e3 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.json @@ -0,0 +1,255 @@ +{ + "status": "Design projection only; no Scheme or verifier acceptance", + "sources": { + "bun.lock": "641fa6fb5dd7cc87c32d15ea62a71664efe83d06b0f0f3fe8373f58fb130b346", + "docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org": "251358b226d04f2a0173e7f349e3a8ae6335f12a5eff683539b1c230f27ce6e3", + "docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2": "0de4c4f5b4ca75696edad61238188d7417112fff0d8264e74e5d03eb589bdd85", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", + "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", + "packages/render/examples/library-boundary.ts": "8a797e2f1700589373bcc173d3c7b80cfc933fd3b8fdc29b1b6cec87b1a609b5", + "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", + "packages/render/src/png.ts": "8d1da534a9fe8d8f27fccbf61b7e4ec0e8fd6754970c09c42105381b32b34d54", + "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", + "packages/render/src/webp.ts": "67dcfc1f1e333ae933f0f9d48b10640ba11b81fad394ff3361ca9b5f952223e0" + }, + "receipt": { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 503397, + "outputBytes": 224014 + }, + "sha256": "b28dbcc7a994622e8f2a347ccde614eaaa6716dec4fa0a23b48d18f8d98d79ee" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 503397, + "outputBytes": 496970, + "selected": "compressed" + }, + "regions": {} + }, + "attribution": { + "copyright": [ + "2026 hardenedlinux Linux Team and Contributors", + "2014 Indian Type Foundry (info@indiantypefoundry.com)" + ], + "license": "LGPL-2.1-or-later AND OFL-1.1" + }, + "observation": { + "canvas": { + "x": 0, + "y": 0, + "width": 1400, + "height": 1106.984375 + }, + "subjects": [ + { + "id": "parent", + "role": "default", + "x": 556.4854736328125, + "y": 262.18817138671875, + "width": 202.6021728515625, + "height": 85.6507568359375 + }, + { + "id": "profile", + "role": "default", + "x": 578.1608276367188, + "y": 393.57550048828125, + "width": 218.4364013671875, + "height": 85.38897705078125 + }, + { + "id": "scenario", + "role": "default", + "x": 854.9517822265625, + "y": 524.993408203125, + "width": 203.1610107421875, + "height": 83.453857421875 + }, + { + "id": "contracts", + "role": "default", + "x": 250.80201721191406, + "y": 524.4169921875, + "width": 249.3784637451172, + "height": 84.132568359375 + }, + { + "id": "plans", + "role": "default", + "x": 522.828369140625, + "y": 524.60498046875, + "width": 256.45037841796875, + "height": 84.1192626953125 + }, + { + "id": "methods", + "role": "default", + "x": 488.3865051269531, + "y": 655.3336181640625, + "width": 325.6199645996094, + "height": 84.178955078125 + }, + { + "id": "math", + "role": "default", + "x": 836.8213500976562, + "y": 655.275146484375, + "width": 281.31756591796875, + "height": 84.17138671875 + }, + { + "id": "oracle", + "role": "default", + "x": 807.847412109375, + "y": 786.9891967773438, + "width": 254.6597900390625, + "height": 115.314453125 + }, + { + "id": "closure", + "role": "default", + "x": 729.6583862304688, + "y": 949.2947387695312, + "width": 307.99517822265625, + "height": 116.42706298828125 + }, + { + "id": "ascent", + "role": "default", + "x": 795.4906616210938, + "y": 131.58506774902344, + "width": 297.56597900390625, + "height": 85.02330017089844 + }, + { + "id": "consumer", + "role": "default", + "x": 854.8197021484375, + "y": 262.616455078125, + "width": 274.7335205078125, + "height": 85.08010864257812 + }, + { + "id": "change", + "role": "default", + "x": 820.1569213867188, + "y": 393.63360595703125, + "width": 344.87969970703125, + "height": 85.3089599609375 + } + ], + "relations": [ + "(parent -> profile)[0]", + "(profile -> scenario)[0]", + "(parent -> contracts)[0]", + "(profile -> plans)[0]", + "(scenario -> methods)[0]", + "(contracts -> methods)[0]", + "(plans -> methods)[0]", + "(math -> oracle)[0]", + "(methods -> oracle)[0]", + "(oracle -> closure)[0]", + "(closure -> ascent)[0]", + "(ascent -> consumer)[0]", + "(consumer -> change)[0]", + "(change -> scenario)[0]" + ], + "headings": [ + { + "role": "title", + "x": 20, + "y": 20, + "width": 1360, + "height": 48 + }, + { + "role": "question", + "x": 20, + "y": 68, + "width": 1360, + "height": 34 + } + ] + }, + "canvas": { + "background": "rgb(250, 247, 238)", + "transparent": false + }, + "readability": { + "minimumTextSize": 12, + "samples": 29, + "requiredMinimum": 12 + }, + "inputSHA256": "b7f54b147012ec58f23e94c7eaed4f296f495f7d52125140034e2a50b86b81a4", + "scenes": [ + { + "inputSHA256": "31d1311b741b47d9b14d121f4c339168fcc9cd73b2594fef66b27412aa9f9dfb", + "layoutSHA256": "83759a261357f43dc42d9fde8cb09663d52bedcce2f49559cab7b6435bc2d7cc", + "nodes": 12, + "edges": 14, + "milliseconds": 126.78108299999985 + } + ], + "svgSHA256": [ + "40c0cc5519c26cd7f5ba801c7021e7ce78414737721b1b72dd212c2917dd884f", + "99b53fb54dc44210216ef3b3255792e8209e88eeab73a43d26bcda4e05abb600" + ], + "composedHTMLSHA256": "3dd41d37efce5f92035fba680632d92a412b84a5119a8e6867509a9528552938", + "dependencies": { + "@fontsource/inter": "5.3.0", + "@fontsource/kalam": "5.3.0", + "@terrastruct/d2": "0.1.33", + "@xyflow/system": "0.0.83", + "elkjs": "0.12.1", + "parse5": "8.0.1", + "roughjs": "4.6.6", + "sharp": "0.35.5", + "valibot": "1.2.0", + "web-worker": "1.5.0" + }, + "regionSHA256": {}, + "htmlSHA256": "428394a88e1634fdd7b145825bfa4611ba5d7e45eb8a78478196014991f5c74f", + "drawing": "roughjs@4.6.6", + "routing": "elkjs@0.12.1", + "assetSHA256": { + "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93", + "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb" + }, + "pngSHA256": "f36503304cf4e9ecb5b5898ebfdd2f3b4539e09ffcf3c802f3a4589044e5db71", + "browser": "156.0.8078.4", + "width": 2100, + "height": 1661, + "scale": 1.5, + "bounds": { + "model": { + "x": 20, + "y": 110, + "width": 1360, + "height": 976.984375 + } + } + }, + "rasterComparison": { + "pngBytes": 496970, + "webpBytes": 224014, + "decodedPixelsEqual": true, + "decodedPixelSHA256": "617345000cadfb663979b0cbfb3f16737ea1aea6e32504a3b2b6f98afab39af7", + "preferredRaster": "webp" + } +} diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.json.license b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.json.license new file mode 100644 index 0000000..55f2106 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) +SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.png b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.png new file mode 100644 index 0000000..297d942 Binary files /dev/null and b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.png differ diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.png.license b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.png.license new file mode 100644 index 0000000..55f2106 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.png.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) +SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.svg b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.svg new file mode 100644 index 0000000..4d69dd2 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.svg @@ -0,0 +1,27 @@ + +{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.2","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"evidence":[],"presentation":{"options":{"elk.direction":"DOWN","elk.layered.spacing.nodeNodeBetweenLayers":"48"},"edgeLabels":false},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"b7f54b147012ec58f23e94c7eaed4f296f495f7d52125140034e2a50b86b81a4","model":{"subjects":[{"id":"parent","type":"rectangle","level":1,"label":"Parent Library\nModels, rules and obligations"},{"id":"profile","type":"rectangle","level":1,"label":"Profile Module\nABI, macros and method bounds"},{"id":"scenario","type":"rectangle","level":1,"label":"Consumer Scenario\nReal source, callers and faults"},{"id":"contracts","type":"rectangle","level":1,"label":"Source contracts\nPre/postconditions, writes and owners"},{"id":"plans","type":"rectangle","level":1,"label":"Scheme method declarations\nTyped verification plans; no execution"},{"id":"methods","type":"rectangle","level":1,"label":"Development verification\nReal body + callers; bounded CBMC / native tests"},{"id":"math","type":"rectangle","level":1,"label":"Lean / Quint correspondence\nNumeric lemmas / state-order assumptions"},{"id":"oracle","type":"rectangle","level":1,"label":"Independent checks\nLiteral gold and actual source mutants\nOccupied refusal / self transfer"},{"id":"closure","type":"rectangle","level":1,"label":"Captured evidence inputs\nSource, harness, tools, bounds and configuration\nSix retained real results; five full test cases"},{"id":"ascent","type":"rectangle","level":1,"label":"ASCENT relations\nSupport, counter, pending and reuse premises"},{"id":"consumer","type":"rectangle","level":1,"label":"External consuming ecosystem\nReview and current-use authorization"},{"id":"change","type":"rectangle","level":1,"label":"Changed source or assumptions\nNew capture; retain old witnesses and frozen queries"}],"relations":[{"id":"(parent -> profile)[0]","src":"parent","dst":"profile","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(profile -> scenario)[0]","src":"profile","dst":"scenario","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(parent -> contracts)[0]","src":"parent","dst":"contracts","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(profile -> plans)[0]","src":"profile","dst":"plans","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(scenario -> methods)[0]","src":"scenario","dst":"methods","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(contracts -> methods)[0]","src":"contracts","dst":"methods","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(plans -> methods)[0]","src":"plans","dst":"methods","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(math -> oracle)[0]","src":"math","dst":"oracle","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(methods -> oracle)[0]","src":"methods","dst":"oracle","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(oracle -> closure)[0]","src":"oracle","dst":"closure","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(closure -> ascent)[0]","src":"closure","dst":"ascent","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(ascent -> consumer)[0]","src":"ascent","dst":"consumer","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(consumer -> change)[0]","src":"consumer","dst":"change","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(change -> scenario)[0]","src":"change","dst":"scenario","label":"","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2","title":"Source contracts: from Library obligation to scoped evidence","purpose":"workflow","kind":"library-workflow","question":{"subjectRefs":["parent","methods","ascent"],"ref":"ownership","text":"How does a consumer check actual C/C++ code without turning the Library into a Runtime?","focusRefs":["authority","declaration"]},"basis":{"captureRef":"design-candidate:90.139-source-bound-c-and-cpp-contract-verification","modelRefs":["docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org"],"obligationRefs":[],"evidenceRefs":[]}},"questions":[{"subjectRefs":["parent","methods","ascent"],"ref":"ownership","text":"How does a consumer check actual C/C++ code without turning the Library into a Runtime?","focusRefs":["authority","declaration"]}],"references":{"authority":"docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org","declaration":"docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2"},"sourceSHA256":{"bun.lock":"641fa6fb5dd7cc87c32d15ea62a71664efe83d06b0f0f3fe8373f58fb130b346","docs/10-19-design/10-architecture/10.147-source-bound-c-and-cpp-contract-verification.org":"251358b226d04f2a0173e7f349e3a8ae6335f12a5eff683539b1c230f27ce6e3","docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.d2":"0de4c4f5b4ca75696edad61238188d7417112fff0d8264e74e5d03eb589bdd85","package.json":"b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/library-boundary.ts":"8a797e2f1700589373bcc173d3c7b80cfc933fd3b8fdc29b1b6cec87b1a609b5","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c","packages/render/src/figure.ts":"5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/png.ts":"8d1da534a9fe8d8f27fccbf61b7e4ec0e8fd6754970c09c42105381b32b34d54","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/webp.ts":"67dcfc1f1e333ae933f0f9d48b10640ba11b81fad394ff3361ca9b5f952223e0"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1400,"height":1106.984375},"subjects":[{"id":"parent","role":"default","x":556.4854736328125,"y":262.18817138671875,"width":202.6021728515625,"height":85.6507568359375},{"id":"profile","role":"default","x":578.1608276367188,"y":393.57550048828125,"width":218.4364013671875,"height":85.38897705078125},{"id":"scenario","role":"default","x":854.9517822265625,"y":524.993408203125,"width":203.1610107421875,"height":83.453857421875},{"id":"contracts","role":"default","x":250.80201721191406,"y":524.4169921875,"width":249.3784637451172,"height":84.132568359375},{"id":"plans","role":"default","x":522.828369140625,"y":524.60498046875,"width":256.45037841796875,"height":84.1192626953125},{"id":"methods","role":"default","x":488.3865051269531,"y":655.3336181640625,"width":325.6199645996094,"height":84.178955078125},{"id":"math","role":"default","x":836.8213500976562,"y":655.275146484375,"width":281.31756591796875,"height":84.17138671875},{"id":"oracle","role":"default","x":807.847412109375,"y":786.9891967773438,"width":254.6597900390625,"height":115.314453125},{"id":"closure","role":"default","x":729.6583862304688,"y":949.2947387695312,"width":307.99517822265625,"height":116.42706298828125},{"id":"ascent","role":"default","x":795.4906616210938,"y":131.58506774902344,"width":297.56597900390625,"height":85.02330017089844},{"id":"consumer","role":"default","x":854.8197021484375,"y":262.616455078125,"width":274.7335205078125,"height":85.08010864257812},{"id":"change","role":"default","x":820.1569213867188,"y":393.63360595703125,"width":344.87969970703125,"height":85.3089599609375}],"relations":["(parent -> profile)[0]","(profile -> scenario)[0]","(parent -> contracts)[0]","(profile -> plans)[0]","(scenario -> methods)[0]","(contracts -> methods)[0]","(plans -> methods)[0]","(math -> oracle)[0]","(methods -> oracle)[0]","(oracle -> closure)[0]","(closure -> ascent)[0]","(ascent -> consumer)[0]","(consumer -> change)[0]","(change -> scenario)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1360,"height":48},{"role":"question","x":20,"y":68,"width":1360,"height":34}]},"readability":{"minimumTextSize":12,"samples":29,"requiredMinimum":12},"bounds":{"model":{"x":20,"y":110,"width":1360,"height":976.984375}}}}Source contracts: from Library obligation to scoped evidence?How does a consumer check actual C/C++ code without turning the Library into a Runtime?{"graph":{"id":"model-root","children":[{"id":"parent"},{"id":"profile"},{"id":"scenario"},{"id":"contracts"},{"id":"plans"},{"id":"methods"},{"id":"math"},{"id":"oracle"},{"id":"closure"},{"id":"ascent"},{"id":"consumer"},{"id":"change"}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"48","elk.direction":"DOWN"},"edges":[{"id":"(parent -> profile)[0]","sources":["parent"],"targets":["profile"]},{"id":"(profile -> scenario)[0]","sources":["profile"],"targets":["scenario"]},{"id":"(parent -> contracts)[0]","sources":["parent"],"targets":["contracts"]},{"id":"(profile -> plans)[0]","sources":["profile"],"targets":["plans"]},{"id":"(scenario -> methods)[0]","sources":["scenario"],"targets":["methods"]},{"id":"(contracts -> methods)[0]","sources":["contracts"],"targets":["methods"]},{"id":"(plans -> methods)[0]","sources":["plans"],"targets":["methods"]},{"id":"(math -> oracle)[0]","sources":["math"],"targets":["oracle"]},{"id":"(methods -> oracle)[0]","sources":["methods"],"targets":["oracle"]},{"id":"(oracle -> closure)[0]","sources":["oracle"],"targets":["closure"]},{"id":"(closure -> ascent)[0]","sources":["closure"],"targets":["ascent"]},{"id":"(ascent -> consumer)[0]","sources":["ascent"],"targets":["consumer"]},{"id":"(consumer -> change)[0]","sources":["consumer"],"targets":["change"]},{"id":"(change -> scenario)[0]","sources":["change"],"targets":["scenario"]}]},"marker":"arrow-3445a32acd5d"}Parent LibraryModels, rules and obligationsProfile ModuleABI, macros and method boundsConsumer ScenarioReal source, callers and faultsSource contractsPre/postconditions, writes and ownersScheme method declarationsTyped verification plans; no executionDevelopment verificationReal body + callers; bounded CBMC / native testsLean / Quint correspondenceNumeric lemmas / state-order assumptionsIndependent checksLiteral gold and actual source mutantsOccupied refusal / self transferCaptured evidence inputsSource, harness, tools, bounds and configurationSix retained real results; five full test casesASCENT relationsSupport, counter, pending and reuse premisesExternal consuming ecosystemReview and current-use authorizationChanged source or assumptionsNew capture; retain old witnesses and frozen queries \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.webp b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.webp new file mode 100644 index 0000000..5b45686 Binary files /dev/null and b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.webp differ diff --git a/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.webp.license b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.webp.license new file mode 100644 index 0000000..55f2106 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.139-source-bound-c-and-cpp-contract-verification.webp.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) +SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2 b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2 new file mode 100644 index 0000000..9cc7bdf --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2 @@ -0,0 +1,93 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +# Org authority: ../../10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org +# Design projection; rendering is not verification or approval. +vars: {d2-config: {data: {figure: |json +{ + "title": "Declarative Library: ownership and selection", + "purpose": "architecture", + "kind": "library-architecture", + "language": "en", + "width": 1400, + "primary": "ownership", + "questions": [ + { + "ref": "ownership", + "text": "Which responsibilities belong to the Library, its development tools and consuming ecosystems?", + "focusRefs": [ + "authority", + "declaration" + ], + "subjectRefs": [ + "selection", + "plans", + "external" + ] + } + ], + "references": { + "authority": "docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org", + "declaration": "docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2", + "package": "gerbil.pkg", + "selection": "init.ss", + "build": "build.ss", + "example": "examples/programs.ss", + "program-config": "config.ss", + "config-contract": "docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org", + "profiles": "library/source-contract-profiles/interface.ss", + "config": "config.ss", + "method-config": "library/source-contracts/config.ss", + "plans": "library/source-contracts/methods.ss", + "native-case": "t/source-contract-owner-config-test.ss" + }, + "basis": { + "captureRef": "design-candidate:90.140-flat-declarative-library-boundary", + "modelRefs": [ + "docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org" + ], + "obligationRefs": [], + "evidenceRefs": [] + }, + "copy": {}, + "themes": [ + "sketchbook", + "compact" + ], + "presentation": { + "options": { + "elk.direction": "DOWN", + "elk.layered.spacing.nodeNodeBetweenLayers": "48" + }, + "edgeLabels": false + } +} +|}}} +direction: down + +package: "gerbil.pkg\nOne AI Agentic Lab dependency" +selection: "Root init.ss\nFlat library//\nNative tag Profiles and yuanxu!" +domains: "Parent domain Modules\nCapacity, lifetime and organization" +specialization: "Language-specialized Modules\nRust / Tokio / Rayon correspondence" +profiles: "Profile Modules\nprograms / languages / enable / settings\nNative config-defaults + sealed Config Type" +plans: "Source-contract declarations\nConfig: enable + typed settings\nFinal-scope plan / disabled refusal\nStep-derived external tool closure" +rules: "ASCENT declarations\nObligations and evidence relations" +build: "Root build.ss\ninit.exports std-make-spec only\nNative build and compiled metadata pass" +sysml: "SysML declarations\nResponsibilities and relationships" +development: "Development boundary: t/*-test.ss\nActual tools, independent gold and real subjects" +external: "External consuming ecosystem\nMarlin / Aitia / other Runtime\nSessions, approval and recovery" +pending: "Open acceptance gates\nCandidate cohort / full install / CI\nNative recursive defaults and typed language projections\nCurrent whole-product acceptance pending" +example: "User Examples\nC / C++ values in one programs tree\nInternal inheritance stays in Library" +example -> profiles: "recursive defaults; native admission" +package -> selection +selection -> domains +selection -> build +sysml -> domains +domains -> specialization +domains -> profiles -> plans +domains -> rules +plans -> development +rules -> development +plans -> external: "declarations" +rules -> external: "data contracts" +development -> pending diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json new file mode 100644 index 0000000..dd4c94f --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json @@ -0,0 +1,273 @@ +{ + "status": "Design projection only; no Scheme or verifier acceptance", + "sources": { + "build.ss": "7ecd0d052e15ef7ccdcb595421f18f29a82534bb3c89f0af80cc1532ff683ddc", + "bun.lock": "641fa6fb5dd7cc87c32d15ea62a71664efe83d06b0f0f3fe8373f58fb130b346", + "config.ss": "3e9865637939ade5b7024295db5a6119df325333e8d8303a16294ef583b18cd2", + "docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org": "9c05b32cb0d8aa82cd1fa624a791aaeb805af23d247b66ed31385266405121d8", + "docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org": "a775a482eec08d7dc84187d2d63e4b020a3f54b0621b159e8ea0949366ffeac5", + "docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2": "ead1384c6b69bb494e0379f65579ed9199d648ac160e41f7446c5cec36501429", + "examples/programs.ss": "5452aaca51b2df0aefd69b5e7e8ba57f4e016245323023256fcb03f84d49e43d", + "gerbil.pkg": "413236e4c63a6a5dddac316be86998f32b27e45ecfd5d66f38fe96ec646d4c7b", + "init.ss": "964584fb153d68ea2d03f3ca082d80cbcf631ddf61364fc6d18580b05237b688", + "library/source-contract-profiles/interface.ss": "4ce4d3f31549582cd20e7ff4a17912516f88e5fcb05a56e76666eb7ff1312dac", + "library/source-contracts/config.ss": "1641ede3f3e85e5e64e74c41a7f7a29e7322aa8dccc6034fdf54362807ae9779", + "library/source-contracts/methods.ss": "ecbc50f99dbc8f63e063b6019196d2d7a967922a184ad0f3dd594e5e84ffcb55", + "package.json": "b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53", + "packages/render/examples/attribution.ts": "58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892", + "packages/render/examples/library-boundary.ts": "8a797e2f1700589373bcc173d3c7b80cfc933fd3b8fdc29b1b6cec87b1a609b5", + "packages/render/src/diagram.ts": "c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b", + "packages/render/src/export.ts": "52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c", + "packages/render/src/figure.ts": "5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972", + "packages/render/src/model-view.ts": "8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc", + "packages/render/src/png.ts": "8d1da534a9fe8d8f27fccbf61b7e4ec0e8fd6754970c09c42105381b32b34d54", + "packages/render/src/scene-export.ts": "f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217", + "packages/render/src/webp.ts": "67dcfc1f1e333ae933f0f9d48b10640ba11b81fad394ff3361ca9b5f952223e0", + "t/source-contract-owner-config-test.ss": "4546d70c1447fc76c8ecff97efb9085787218514aa08bdd7fcb5e07f889f1220" + }, + "receipt": { + "webp": { + "encoding": { + "encoder": "sharp@0.35.5", + "options": { + "lossless": true, + "effort": 4 + }, + "inputBytes": 640032, + "outputBytes": 280408 + }, + "sha256": "a65e229f986761d1c51d1e408560a99ca47a8cd8fef2d64bc66f77e79b42205a" + }, + "preferredRaster": "webp", + "pngCompression": { + "figure": { + "encoder": "sharp@0.35.5", + "options": { + "compressionLevel": 9, + "adaptiveFiltering": true + }, + "inputBytes": 640032, + "outputBytes": 632815, + "selected": "compressed" + }, + "regions": {} + }, + "attribution": { + "copyright": [ + "2026 hardenedlinux Linux Team and Contributors", + "2014 Indian Type Foundry (info@indiantypefoundry.com)" + ], + "license": "LGPL-2.1-or-later AND OFL-1.1" + }, + "observation": { + "canvas": { + "x": 0, + "y": 0, + "width": 1400, + "height": 1298.984375 + }, + "subjects": [ + { + "id": "package", + "role": "default", + "x": 584.8258666992188, + "y": 131.19033813476562, + "width": 217.24951171875, + "height": 85.65093994140625 + }, + { + "id": "selection", + "role": "default", + "x": 587.50146484375, + "y": 262.5780029296875, + "width": 215.47796630859375, + "height": 121.61477661132812 + }, + { + "id": "domains", + "role": "default", + "x": 339.1335144042969, + "y": 445.1955261230469, + "width": 230.80770874023438, + "height": 83.45413208007812 + }, + { + "id": "specialization", + "role": "default", + "x": 408.1398620605469, + "y": 588.4171752929688, + "width": 262.5001525878906, + "height": 84.1328125 + }, + { + "id": "profiles", + "role": "default", + "x": 818.1651000976562, + "y": 588.6004638671875, + "width": 285.45062255859375, + "height": 116.286865234375 + }, + { + "id": "plans", + "role": "default", + "x": 832.2224731445312, + "y": 751.3338012695312, + "width": 257.39154052734375, + "height": 148.05426025390625 + }, + { + "id": "rules", + "role": "default", + "x": 284.42803955078125, + "y": 793.94140625, + "width": 225.56118774414062, + "height": 83.87005615234375 + }, + { + "id": "build", + "role": "default", + "x": 593.5250244140625, + "y": 425.99578857421875, + "width": 269.74957275390625, + "height": 115.31475830078125 + }, + { + "id": "sysml", + "role": "default", + "x": 307.33856201171875, + "y": 294.52581787109375, + "width": 218.69927978515625, + "height": 83.755126953125 + }, + { + "id": "development", + "role": "default", + "x": 797.33203125, + "y": 957.258544921875, + "width": 311.999755859375, + "height": 85.0057373046875 + }, + { + "id": "external", + "role": "default", + "x": 269.3357238769531, + "y": 946.6077270507812, + "width": 275.6835632324219, + "height": 121.00811767578125 + }, + { + "id": "pending", + "role": "default", + "x": 773.3323364257812, + "y": 1109.624755859375, + "width": 360.25848388671875, + "height": 151.124755859375 + }, + { + "id": "example", + "role": "default", + "x": 885.8997802734375, + "y": 425.4309997558594, + "width": 243.9129638671875, + "height": 115.56326293945312 + } + ], + "relations": [ + "(example -> profiles)[0]", + "(package -> selection)[0]", + "(selection -> domains)[0]", + "(selection -> build)[0]", + "(sysml -> domains)[0]", + "(domains -> specialization)[0]", + "(domains -> profiles)[0]", + "(profiles -> plans)[0]", + "(domains -> rules)[0]", + "(plans -> development)[0]", + "(rules -> development)[0]", + "(plans -> external)[0]", + "(rules -> external)[0]", + "(development -> pending)[0]" + ], + "headings": [ + { + "role": "title", + "x": 20, + "y": 20, + "width": 1360, + "height": 48 + }, + { + "role": "question", + "x": 20, + "y": 68, + "width": 1360, + "height": 34 + } + ] + }, + "canvas": { + "background": "rgb(250, 247, 238)", + "transparent": false + }, + "readability": { + "minimumTextSize": 12, + "samples": 38, + "requiredMinimum": 12 + }, + "inputSHA256": "d756bccc4b33d41fca72f7ee2535fef0f8774682d1aaf238d929f3e986e155d7", + "scenes": [ + { + "inputSHA256": "777ef5defec905c56b80b24e2a7c2331ee455dd9caea1302e8759dafb8900834", + "layoutSHA256": "e63a5885f888a01ebc12b9077f050fade5df98a1891c1587c771254cc212162a", + "nodes": 13, + "edges": 14, + "milliseconds": 729.3841250000005 + } + ], + "svgSHA256": [ + "b139564be8edad607f3943b11f167d79ee60e51fdffb09600d1b85feaf570701", + "f6ac725e9a3542525879ea675c949d4b56b4a67c8648b580284f14ebc7af457c" + ], + "composedHTMLSHA256": "2a3ab28969f07c7956efa37852517253b4b0c220a9ababf1118045f763c76049", + "dependencies": { + "@fontsource/inter": "5.3.0", + "@fontsource/kalam": "5.3.0", + "@terrastruct/d2": "0.1.33", + "@xyflow/system": "0.0.83", + "elkjs": "0.12.1", + "parse5": "8.0.1", + "roughjs": "4.6.6", + "sharp": "0.35.5", + "valibot": "1.2.0", + "web-worker": "1.5.0" + }, + "regionSHA256": {}, + "htmlSHA256": "20e3453330a4393e6801fc862c3557a025515848fd512df3bae6661c7d0a76b3", + "drawing": "roughjs@4.6.6", + "routing": "elkjs@0.12.1", + "assetSHA256": { + "@fontsource/kalam/files/kalam-latin-700-normal.woff2": "252063af6ade8b9a744cde4ddad0fc21ea53b8ba711eed121a0c2e8610ea9c93", + "@fontsource/kalam/files/kalam-latin-400-normal.woff2": "954410601a823f37e219f7930b7446f86afa15621326a7078d56fb9c910135cb" + }, + "pngSHA256": "9fd31b8e30f5619234dee8ed571d7c3613f8cb31470fb5b8073dfa63e4a51ebf", + "browser": "156.0.8078.4", + "width": 2100, + "height": 1949, + "scale": 1.5, + "bounds": { + "model": { + "x": 20, + "y": 110, + "width": 1360, + "height": 1168.984375 + } + } + }, + "rasterComparison": { + "pngBytes": 632815, + "webpBytes": 280408, + "decodedPixelsEqual": true, + "decodedPixelSHA256": "e6b31a9a24cd72b8d8089b9db1d4c42e997052bb3b29c16101239dc06f40ee80", + "preferredRaster": "webp" + } +} diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json.license b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json.license new file mode 100644 index 0000000..55f2106 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) +SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.png b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.png new file mode 100644 index 0000000..1c703e9 Binary files /dev/null and b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.png differ diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.png.license b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.png.license new file mode 100644 index 0000000..55f2106 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.png.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) +SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.svg b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.svg new file mode 100644 index 0000000..5730c89 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.svg @@ -0,0 +1,27 @@ + +{"renderer":{"package":"@deterministic-engineering/render","version":"1.0.2","icons":{"capture":"a647d42aa11f4e5e85d0bbf66f483f57f3c4ba3a9536362ed0eaaaae10a89cee","decision":"3535642a5b613372c3fd374151ec90aafa19b64b2d33d10b19162cad07a35c7a","document":"0bf9674a401262da8a646305cab00006954721c07765b9962e0dee1c31d560f7","evidence":"0a91b169aaa644829a054cbb94194efffaf4298f2b6f8fa8c6ec2b7b413a1766","library":"df474fa36a74016b79236fff58a980a8c18c682d1866211776e349a0eb4b2979","model":"0cfd1f9ed3873f556ace725a7b6a251ebe75d7d976567699276f34df36b2443b","obligation":"e76f4d34a7190400446c89e4e7d187762b885808a64a00c99455599d902570c5","pending":"cca7589bc3b1dcdebacb867c6836c6fc166257f05823555a268354ff9bfac00c","question":"dbf231e1568dc37189d5674d73c4bfc58a17eb8ada579b3f03bf2813d33c56f4","reference":"3814c570f79ab294252c36530de464c9364814b797afb862d9c62e728a8660fc","selection":"82b4ab6faf195fea0a891c35268e61c186e93e7c6a9d7967a4f6a73dbf25ae7f"}},"evidence":[],"presentation":{"options":{"elk.direction":"DOWN","elk.layered.spacing.nodeNodeBetweenLayers":"48"},"edgeLabels":false},"drawing":{"mode":"sketch","options":{"seed":29,"roughness":1.3,"strokeWidth":1.2,"fillStyle":"hachure","hachureGap":9,"fillWeight":0.6}},"fonts":[{"family":"Kalam","weight":400,"source":"@fontsource/kalam/files/kalam-latin-400-normal.woff2"},{"family":"Kalam","weight":700,"source":"@fontsource/kalam/files/kalam-latin-700-normal.woff2"}],"palette":{"background":"#FAF7EE","surface":"#FFFDF7","ink":"#283E43","muted":"#63716F","border":"#ADBBB5","accent":"#287F79","secondary":"#946B42","tint":"#EDF4E9","secondaryTint":"#F6EDD8","onAccent":"#FFFFFF","supported":"#237C69","pending":"#9A6C25","conflict":"#A84C60"},"inputSHA256":"d756bccc4b33d41fca72f7ee2535fef0f8774682d1aaf238d929f3e986e155d7","model":{"subjects":[{"id":"package","type":"rectangle","level":1,"label":"gerbil.pkg\nOne AI Agentic Lab dependency"},{"id":"selection","type":"rectangle","level":1,"label":"Root init.ss\nFlat library/\u003cmodule-name>/\nNative tag Profiles and yuanxu!"},{"id":"domains","type":"rectangle","level":1,"label":"Parent domain Modules\nCapacity, lifetime and organization"},{"id":"specialization","type":"rectangle","level":1,"label":"Language-specialized Modules\nRust / Tokio / Rayon correspondence"},{"id":"profiles","type":"rectangle","level":1,"label":"Profile Modules\nprograms / languages / enable / settings\nNative config-defaults + sealed Config Type"},{"id":"plans","type":"rectangle","level":1,"label":"Source-contract declarations\nConfig: enable + typed settings\nFinal-scope plan / disabled refusal\nStep-derived external tool closure"},{"id":"rules","type":"rectangle","level":1,"label":"ASCENT declarations\nObligations and evidence relations"},{"id":"build","type":"rectangle","level":1,"label":"Root build.ss\ninit.exports std-make-spec only\nNative build and compiled metadata pass"},{"id":"sysml","type":"rectangle","level":1,"label":"SysML declarations\nResponsibilities and relationships"},{"id":"development","type":"rectangle","level":1,"label":"Development boundary: t/*-test.ss\nActual tools, independent gold and real subjects"},{"id":"external","type":"rectangle","level":1,"label":"External consuming ecosystem\nMarlin / Aitia / other Runtime\nSessions, approval and recovery"},{"id":"pending","type":"rectangle","level":1,"label":"Open acceptance gates\nCandidate cohort / full install / CI\nNative recursive defaults and typed language projections\nCurrent whole-product acceptance pending"},{"id":"example","type":"rectangle","level":1,"label":"User Examples\nC / C++ values in one programs tree\nInternal inheritance stays in Library"}],"relations":[{"id":"(example -> profiles)[0]","src":"example","dst":"profiles","label":"recursive defaults; native admission","srcArrow":"none","dstArrow":"triangle"},{"id":"(package -> selection)[0]","src":"package","dst":"selection","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(selection -> domains)[0]","src":"selection","dst":"domains","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(selection -> build)[0]","src":"selection","dst":"build","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(sysml -> domains)[0]","src":"sysml","dst":"domains","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(domains -> specialization)[0]","src":"domains","dst":"specialization","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(domains -> profiles)[0]","src":"domains","dst":"profiles","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(profiles -> plans)[0]","src":"profiles","dst":"plans","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(domains -> rules)[0]","src":"domains","dst":"rules","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(plans -> development)[0]","src":"plans","dst":"development","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(rules -> development)[0]","src":"rules","dst":"development","label":"","srcArrow":"none","dstArrow":"triangle"},{"id":"(plans -> external)[0]","src":"plans","dst":"external","label":"declarations","srcArrow":"none","dstArrow":"triangle"},{"id":"(rules -> external)[0]","src":"rules","dst":"external","label":"data contracts","srcArrow":"none","dstArrow":"triangle"},{"id":"(development -> pending)[0]","src":"development","dst":"pending","label":"","srcArrow":"none","dstArrow":"triangle"}]},"view":{"source":"docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2","title":"Declarative Library: ownership and selection","purpose":"architecture","kind":"library-architecture","question":{"subjectRefs":["selection","plans","external"],"ref":"ownership","text":"Which responsibilities belong to the Library, its development tools and consuming ecosystems?","focusRefs":["authority","declaration"]},"basis":{"captureRef":"design-candidate:90.140-flat-declarative-library-boundary","modelRefs":["docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org"],"obligationRefs":[],"evidenceRefs":[]}},"questions":[{"subjectRefs":["selection","plans","external"],"ref":"ownership","text":"Which responsibilities belong to the Library, its development tools and consuming ecosystems?","focusRefs":["authority","declaration"]}],"references":{"authority":"docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org","build":"build.ss","config":"config.ss","config-contract":"docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org","declaration":"docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2","example":"examples/programs.ss","method-config":"library/source-contracts/config.ss","native-case":"t/source-contract-owner-config-test.ss","package":"gerbil.pkg","plans":"library/source-contracts/methods.ss","profiles":"library/source-contract-profiles/interface.ss","program-config":"config.ss","selection":"init.ss"},"sourceSHA256":{"build.ss":"7ecd0d052e15ef7ccdcb595421f18f29a82534bb3c89f0af80cc1532ff683ddc","bun.lock":"641fa6fb5dd7cc87c32d15ea62a71664efe83d06b0f0f3fe8373f58fb130b346","config.ss":"3e9865637939ade5b7024295db5a6119df325333e8d8303a16294ef583b18cd2","docs/10-19-design/10-architecture/10.148-flat-declarative-library-boundary.org":"9c05b32cb0d8aa82cd1fa624a791aaeb805af23d247b66ed31385266405121d8","docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org":"a775a482eec08d7dc84187d2d63e4b020a3f54b0621b159e8ea0949366ffeac5","docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.d2":"ead1384c6b69bb494e0379f65579ed9199d648ac160e41f7446c5cec36501429","examples/programs.ss":"5452aaca51b2df0aefd69b5e7e8ba57f4e016245323023256fcb03f84d49e43d","gerbil.pkg":"413236e4c63a6a5dddac316be86998f32b27e45ecfd5d66f38fe96ec646d4c7b","init.ss":"964584fb153d68ea2d03f3ca082d80cbcf631ddf61364fc6d18580b05237b688","library/source-contract-profiles/interface.ss":"4ce4d3f31549582cd20e7ff4a17912516f88e5fcb05a56e76666eb7ff1312dac","library/source-contracts/config.ss":"1641ede3f3e85e5e64e74c41a7f7a29e7322aa8dccc6034fdf54362807ae9779","library/source-contracts/methods.ss":"ecbc50f99dbc8f63e063b6019196d2d7a967922a184ad0f3dd594e5e84ffcb55","package.json":"b0c1736c46211bf763696ec088c92281cea4de6dece9644d3b647f5d746dfb53","packages/render/examples/attribution.ts":"58f7914284a69c4ce42db61ec24c06cf9194232ed3402fc7ae12e3ded4187892","packages/render/examples/library-boundary.ts":"8a797e2f1700589373bcc173d3c7b80cfc933fd3b8fdc29b1b6cec87b1a609b5","packages/render/src/diagram.ts":"c0e831979970fc90c418820e4462d2097492811f10c7619dab1469b31194a32b","packages/render/src/export.ts":"52f5eda85f800d16f504556e3dad95ec6441f08bb753c674f5d10146f293967c","packages/render/src/figure.ts":"5e26825463ff0017dbd465ada1048a68994dee17a69bacc13d6806f416ca7972","packages/render/src/model-view.ts":"8a2c575c8c1a2f09770fb4cfdbe6718121a66c4fe8b32c97f7b2d88c9f7a57fc","packages/render/src/png.ts":"8d1da534a9fe8d8f27fccbf61b7e4ec0e8fd6754970c09c42105381b32b34d54","packages/render/src/scene-export.ts":"f5ba1250e1fe5e6c952ada3bc501979e4f9b8a8a0506a62a6e4cebdaf256a217","packages/render/src/webp.ts":"67dcfc1f1e333ae933f0f9d48b10640ba11b81fad394ff3361ca9b5f952223e0","t/source-contract-owner-config-test.ss":"4546d70c1447fc76c8ecff97efb9085787218514aa08bdd7fcb5e07f889f1220"},"rendered":{"observation":{"canvas":{"x":0,"y":0,"width":1400,"height":1298.984375},"subjects":[{"id":"package","role":"default","x":584.8258666992188,"y":131.19033813476562,"width":217.24951171875,"height":85.65093994140625},{"id":"selection","role":"default","x":587.50146484375,"y":262.5780029296875,"width":215.47796630859375,"height":121.61477661132812},{"id":"domains","role":"default","x":339.1335144042969,"y":445.1955261230469,"width":230.80770874023438,"height":83.45413208007812},{"id":"specialization","role":"default","x":408.1398620605469,"y":588.4171752929688,"width":262.5001525878906,"height":84.1328125},{"id":"profiles","role":"default","x":818.1651000976562,"y":588.6004638671875,"width":285.45062255859375,"height":116.286865234375},{"id":"plans","role":"default","x":832.2224731445312,"y":751.3338012695312,"width":257.39154052734375,"height":148.05426025390625},{"id":"rules","role":"default","x":284.42803955078125,"y":793.94140625,"width":225.56118774414062,"height":83.87005615234375},{"id":"build","role":"default","x":593.5250244140625,"y":425.99578857421875,"width":269.74957275390625,"height":115.31475830078125},{"id":"sysml","role":"default","x":307.33856201171875,"y":294.52581787109375,"width":218.69927978515625,"height":83.755126953125},{"id":"development","role":"default","x":797.33203125,"y":957.258544921875,"width":311.999755859375,"height":85.0057373046875},{"id":"external","role":"default","x":269.3357238769531,"y":946.6077270507812,"width":275.6835632324219,"height":121.00811767578125},{"id":"pending","role":"default","x":773.3323364257812,"y":1109.624755859375,"width":360.25848388671875,"height":151.124755859375},{"id":"example","role":"default","x":885.8997802734375,"y":425.4309997558594,"width":243.9129638671875,"height":115.56326293945312}],"relations":["(example -> profiles)[0]","(package -> selection)[0]","(selection -> domains)[0]","(selection -> build)[0]","(sysml -> domains)[0]","(domains -> specialization)[0]","(domains -> profiles)[0]","(profiles -> plans)[0]","(domains -> rules)[0]","(plans -> development)[0]","(rules -> development)[0]","(plans -> external)[0]","(rules -> external)[0]","(development -> pending)[0]"],"headings":[{"role":"title","x":20,"y":20,"width":1360,"height":48},{"role":"question","x":20,"y":68,"width":1360,"height":34}]},"readability":{"minimumTextSize":12,"samples":38,"requiredMinimum":12},"bounds":{"model":{"x":20,"y":110,"width":1360,"height":1168.984375}}}}Declarative Library: ownership and selection?Which responsibilities belong to the Library, its development tools and consuming ecosystems?{"graph":{"id":"model-root","children":[{"id":"package"},{"id":"selection"},{"id":"domains"},{"id":"specialization"},{"id":"profiles"},{"id":"plans"},{"id":"rules"},{"id":"build"},{"id":"sysml"},{"id":"development"},{"id":"external"},{"id":"pending"},{"id":"example"}],"layoutOptions":{"elk.spacing.nodeNode":"24","elk.layered.spacing.nodeNodeBetweenLayers":"48","elk.direction":"DOWN"},"edges":[{"id":"(example -> profiles)[0]","sources":["example"],"targets":["profiles"]},{"id":"(package -> selection)[0]","sources":["package"],"targets":["selection"]},{"id":"(selection -> domains)[0]","sources":["selection"],"targets":["domains"]},{"id":"(selection -> build)[0]","sources":["selection"],"targets":["build"]},{"id":"(sysml -> domains)[0]","sources":["sysml"],"targets":["domains"]},{"id":"(domains -> specialization)[0]","sources":["domains"],"targets":["specialization"]},{"id":"(domains -> profiles)[0]","sources":["domains"],"targets":["profiles"]},{"id":"(profiles -> plans)[0]","sources":["profiles"],"targets":["plans"]},{"id":"(domains -> rules)[0]","sources":["domains"],"targets":["rules"]},{"id":"(plans -> development)[0]","sources":["plans"],"targets":["development"]},{"id":"(rules -> development)[0]","sources":["rules"],"targets":["development"]},{"id":"(plans -> external)[0]","sources":["plans"],"targets":["external"]},{"id":"(rules -> external)[0]","sources":["rules"],"targets":["external"]},{"id":"(development -> pending)[0]","sources":["development"],"targets":["pending"]}]},"marker":"arrow-54b359e5c4fe"}gerbil.pkgOne AI Agentic Lab dependencyRoot init.ssFlat library/<module-name>/Native tag Profiles and yuanxu!Parent domain ModulesCapacity, lifetime and organizationLanguage-specialized ModulesRust / Tokio / Rayon correspondenceProfile Modulesprograms / languages / enable / settingsNative config-defaults + sealed Config TypeSource-contract declarationsConfig: enable + typed settingsFinal-scope plan / disabled refusalStep-derived external tool closureASCENT declarationsObligations and evidence relationsRoot build.ssinit.exports std-make-spec onlyNative build and compiled metadata passSysML declarationsResponsibilities and relationshipsDevelopment boundary: t/*-test.ssActual tools, independent gold and real subjectsExternal consuming ecosystemMarlin / Aitia / other RuntimeSessions, approval and recoveryOpen acceptance gatesCandidate cohort / full install / CINative recursive defaults and typed language projectionsCurrent whole-product acceptance pendingUser ExamplesC / C++ values in one programs treeInternal inheritance stays in Library \ No newline at end of file diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp new file mode 100644 index 0000000..31b3ff3 Binary files /dev/null and b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp differ diff --git a/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp.license b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp.license new file mode 100644 index 0000000..55f2106 --- /dev/null +++ b/docs/90-99-views/90-architecture-views/90.140-flat-declarative-library-boundary.webp.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-FileCopyrightText: 2014 Indian Type Foundry (info@indiantypefoundry.com) +SPDX-License-Identifier: LGPL-2.1-or-later AND OFL-1.1 diff --git a/examples/README.org b/examples/README.org new file mode 100644 index 0000000..bd26a98 --- /dev/null +++ b/examples/README.org @@ -0,0 +1,66 @@ +# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +# SPDX-License-Identifier: LGPL-2.1-or-later + +#+TITLE: Unified Engineering Configuration +#+LANGUAGE: en +#+STARTUP: overview +#+OPTIONS: toc:1 num:nil + +* One configuration tree +:PROPERTIES: +:CUSTOM_ID: user-config-assignment +:PUBLIC_IMPORT: :deterministic-engineering/config +:DEFAULTS_OWNER: config.ss +:MERGE_OWNER: :yuanxu/configuration/json::config-defaults +:END: + +[[file:programs.ss][The complete user example]] configures the same interface for C and C++: + +#+INCLUDE: "programs.ss" src scheme :lines "4-" + +The maintained [[file:../config.ss][Config]] disables both languages by default. A downstream +Module combines its assigned values with that Config using Yuanxu's native +=config-defaults=. Only supplied fields override defaults. Nested objects merge +recursively; explicit false stays false, and lists/scalars replace their field. +The result must pass the named Config Type. Examples contain no inheritance, +loader, tool paths, evidence session or custom merge implementation. + +* What these settings do +| Path below programs.deterministic-engineering | Meaning | +|----------------------------------------------+---------| +| languages.c.enable | Enable the configured C verification capability | +| languages.c.settings.profile | Select a maintained C Profile, such as capacity-native or capacity-contract | +| languages.cpp.enable | Enable the configured C++ verification capability | +| languages.cpp.settings.profile | Select a maintained C++ Profile, such as lifetime-native | +| languages..settings.timeout | Per-command wall-clock seconds; default and maximum 45, minimum 1 | + +| Language / example Profile | Actual engineering subject | Check | +|----------------------------+----------------------------+-------| +| C / capacity-native | [[file:../languages-engineering/c/numeric/bounded-capacity/][Buffer, parser and pool capacity calculation]] | Native assertions for capacity arithmetic, overflow and preserved failure output | +| C++ / lifetime-native | [[file:../languages-engineering/cpp/memory/resource-lifetime/][Resource ownership and transfer]] | Native assertions for transfer, occupied refusal, cleanup and destruction | + +Other maintained choices are C =capacity-body=, =capacity-contract= and +=capacity-callers=, and C++ =lifetime-body=. They select the existing real CBMC +checks. A Profile belonging to another language refuses before tool execution. +This interface currently supports C and C++; it does not advertise executable +support for an unimplemented language. + +Omitting C++ while configuring C preserves the C++ defaults. Setting C enable to +false does not change C++ settings. Disabled language plans refuse; prior evidence +is retained as historical data. Assignment does not execute tools or grant +application authorization. Mandatory safety flags remain Library-owned. + +* Maintainer verification +=just test-file t/user-configuration-test.ss= checks defaults, the actual Example, +recursive partial overrides, false preservation and all prior selection controls. +Internal selection declarations remain under =t/support/=. + +=just test-source-contracts '.*' t/source-contract-owner-config-test.ss= consumes +the actual Example through a native Module owner, compiles and runs the real C and +C++ subjects, and registers/queries both results in ASCENT. It disables only C in +a new configuration snapshot, checks old-owner/result refusal and frozen evidence, +and confirms that C++ remains enabled with its original settings and plan. + +=just test-source-contracts= retains the complete actual C/C++ independent counter, +tool-closure and cross-project reuse/invalidation suite. See +[[file:../docs/10-19-design/10-architecture/10.149-unified-language-engineering-configuration.org][the interface contract and qualification limits]]. diff --git a/examples/programs.ss b/examples/programs.ss new file mode 100644 index 0000000..f0cae84 --- /dev/null +++ b/examples/programs.ss @@ -0,0 +1,31 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object) +(export Config) + +(def Config + (.o + programs: + (.o + deterministic-engineering: + (.o + languages: + (.o + c: + (.o + enable: #t + settings: + (.o + ;; Real C capacity/overflow and failure-state checks. + profile: 'capacity-native + ;; Wall-clock seconds per command; default/maximum is 45. + timeout: 30)) + cpp: + (.o + enable: #t + settings: + (.o + ;; Real C++ ownership transfer, refusal and destruction checks. + profile: 'lifetime-native + timeout: 20))))))) diff --git a/gerbil.pkg b/gerbil.pkg index f98c32a..5ea7170 100644 --- a/gerbil.pkg +++ b/gerbil.pkg @@ -1,9 +1,6 @@ ;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; ;;; SPDX-License-Identifier: LGPL-2.1-or-later (package: deterministic-engineering prelude: :tao3k/yuanxu/prelude - depend: ("github.com/tao3k/lambda-aitia@2c418d5e6377077dded87d1c347f5ace53f712e8" - "github.com/tao3k/agentic-ai-lab@177ac1c448aa846345cde7a1538ab6f788548692" - "github.com/tao3k/gebril-yuanxu@e77698c35bc0e9a0a01458447fa61c720ee59290")) + depend: ("github.com/tao3k/agentic-ai-lab@558e9bd5b8acf1ec644c74c9621007a3695de636")) diff --git a/init.ss b/init.ss index 49f320f..e491a4e 100644 --- a/init.ss +++ b/init.ss @@ -1,17 +1,9 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later -;;; -*- Gerbil -*- +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;;; Scheme ownership is flat; native Tags and Profile select the required roles. (import :yuanxu/module-system/selection/init-syntax) -;; Framework knowledge/drivers and language engineering have distinct owners. (yuanxu! - :load-modules "./library" mode: explicit rename: Library - (backpressure-memory @ "./library/concurrency/resource-control/backpressure-memory/abstract") - (backpressure-tokio-rayon @ "./library/concurrency/resource-control/backpressure-memory/tokio-rayon") - (evidence @ "./library/drivers/evidence") - (rust-resources @ "./library/drivers/rust-resources") - :load-modules "./scenarios" mode: explicit rename: Scenarios - (gateway-review) - (resource-lifecycle)) + :load-modules "./library" mode: auto profile: engineering rename: Library) diff --git a/languages-engineering/c/numeric/bounded-capacity/capacity.c b/languages-engineering/c/numeric/bounded-capacity/capacity.c new file mode 100644 index 0000000..47ee7d4 --- /dev/null +++ b/languages-engineering/c/numeric/bounded-capacity/capacity.c @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "capacity.h" + +int capacity_total(uint32_t payload, uint32_t overhead, uint32_t *out) +{ + if (payload > UINT32_MAX - overhead) + return 0; + + *out = payload + overhead; + return 1; +} diff --git a/languages-engineering/c/numeric/bounded-capacity/capacity.h b/languages-engineering/c/numeric/bounded-capacity/capacity.h new file mode 100644 index 0000000..64354e6 --- /dev/null +++ b/languages-engineering/c/numeric/bounded-capacity/capacity.h @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef DE_CAPACITY_H +#define DE_CAPACITY_H + +#include + +/* Bytes throughout. Failure preserves the caller's output object. The wider + * expression in the specification is mathematical accounting, not a wrapped + * uint32_t addition. Native callers must provide a writable, live output. */ +int capacity_total(uint32_t payload, uint32_t overhead, uint32_t *out) +#ifdef __CPROVER + __CPROVER_requires(__CPROVER_is_fresh(out, sizeof(*out))) + __CPROVER_assigns(*out) + __CPROVER_ensures(__CPROVER_return_value == 0 || __CPROVER_return_value == 1) + __CPROVER_ensures( + (__CPROVER_return_value == 1) == + ((uint64_t)payload + (uint64_t)overhead <= UINT32_MAX)) + __CPROVER_ensures( + __CPROVER_return_value == 1 ? + (uint64_t)*out == (uint64_t)payload + (uint64_t)overhead : + *out == __CPROVER_old(*out)) +#endif +; + +int parser_fits(uint32_t payload, uint32_t header, uint32_t available); +int pool_fits(uint32_t retained, uint32_t incoming, uint32_t budget); + +#endif diff --git a/languages-engineering/c/numeric/bounded-capacity/native-test.c b/languages-engineering/c/numeric/bounded-capacity/native-test.c new file mode 100644 index 0000000..5a25221 --- /dev/null +++ b/languages-engineering/c/numeric/bounded-capacity/native-test.c @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "capacity.h" +#include + +int main(void) +{ + /* Literal boundary gold: independent of the production implementation. */ + static const struct { + uint32_t a, b, available, total; + int ok, fits; + } cases[] = { + {0, 0, 0, 0, 1, 1}, + {100, 8, 107, 108, 1, 0}, + {100, 8, 108, 108, 1, 1}, + {UINT32_MAX, 0, UINT32_MAX, UINT32_MAX, 1, 1}, + {UINT32_MAX, 1, UINT32_MAX, 77, 0, 0}, + {UINT32_MAX - 3, 4, UINT32_MAX, 77, 0, 0} + }; + + for (unsigned i = 0; i < sizeof(cases) / sizeof(cases[0]); ++i) { + uint32_t out = 77; + assert(capacity_total(cases[i].a, cases[i].b, &out) == cases[i].ok); + assert(out == cases[i].total); + assert(parser_fits(cases[i].a, cases[i].b, cases[i].available) == cases[i].fits); + assert(pool_fits(cases[i].a, cases[i].b, cases[i].available) == cases[i].fits); + } + return 0; +} diff --git a/languages-engineering/c/numeric/bounded-capacity/parser.c b/languages-engineering/c/numeric/bounded-capacity/parser.c new file mode 100644 index 0000000..66724c5 --- /dev/null +++ b/languages-engineering/c/numeric/bounded-capacity/parser.c @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "capacity.h" + +/* A parser admits a payload only after accounting for its framing bytes. */ +int parser_fits(uint32_t payload, uint32_t header, uint32_t available) +{ + uint32_t total = 0; + return capacity_total(payload, header, &total) && total <= available; +} diff --git a/languages-engineering/c/numeric/bounded-capacity/pool.c b/languages-engineering/c/numeric/bounded-capacity/pool.c new file mode 100644 index 0000000..c123ff3 --- /dev/null +++ b/languages-engineering/c/numeric/bounded-capacity/pool.c @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "capacity.h" + +/* A pool uses the same checked arithmetic, with different caller semantics. */ +int pool_fits(uint32_t retained, uint32_t incoming, uint32_t budget) +{ + uint32_t total = 0; + return capacity_total(retained, incoming, &total) && total <= budget; +} diff --git a/languages-engineering/c/numeric/bounded-capacity/proof.c b/languages-engineering/c/numeric/bounded-capacity/proof.c new file mode 100644 index 0000000..dc2e1de --- /dev/null +++ b/languages-engineering/c/numeric/bounded-capacity/proof.c @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "capacity.h" + +extern uint32_t nondet_u32(void); + +/* Contract enforcement supplies arbitrary states satisfying its precondition. + * The separate capacity_harness checks the original caller-visible state. */ +void contract_harness(void) +{ + uint32_t out = nondet_u32(); + capacity_total(nondet_u32(), nondet_u32(), &out); +} + +void capacity_harness(void) +{ + uint32_t a = nondet_u32(); + uint32_t b = nondet_u32(); + uint32_t initial = nondet_u32(); + uint32_t out = initial; + int ok = capacity_total(a, b, &out); + + __CPROVER_assert(ok == ((uint64_t)a + b <= UINT32_MAX), "capacity.result"); + __CPROVER_assert(ok ? (uint64_t)out == (uint64_t)a + b : out == initial, + "capacity.output-and-failure-frame"); +} + +void callers_harness(void) +{ + uint32_t a = nondet_u32(); + uint32_t b = nondet_u32(); + uint32_t available = nondet_u32(); + int expected = (uint64_t)a + b <= available; + + __CPROVER_assert(parser_fits(a, b, available) == expected, "parser.admission"); + __CPROVER_assert(pool_fits(a, b, available) == expected, "pool.admission"); +} diff --git a/languages-engineering/cpp/memory/resource-lifetime/native-test.cpp b/languages-engineering/cpp/memory/resource-lifetime/native-test.cpp new file mode 100644 index 0000000..5b0c99f --- /dev/null +++ b/languages-engineering/cpp/memory/resource-lifetime/native-test.cpp @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "slot.hpp" +#include + +int main() +{ + unsigned live = 0; + { + ResourceSlot first(&live); + assert(live == 1 && first.owns()); + { + ResourceSlot second; + assert(first.transfer_to(second)); + assert(live == 1 && second.owns() && !first.owns()); + assert(!first.transfer_to(second)); + } + assert(live == 0); + first.reset(); + assert(live == 0); + } + assert(live == 0); + unsigned source_live = 0; + unsigned destination_live = 0; + { + ResourceSlot source(&source_live); + ResourceSlot destination(&destination_live); + assert(!source.transfer_to(destination)); + assert(source.owns() && destination.owns()); + assert(source_live == 1 && destination_live == 1); + assert(!source.transfer_to(source)); + assert(source.owns() && source_live == 1); + } + assert(source_live == 0 && destination_live == 0); + + ResourceSlot empty_source; + ResourceSlot empty_destination; + assert(empty_source.transfer_to(empty_destination)); + assert(!empty_source.owns() && !empty_destination.owns()); + return 0; +} diff --git a/languages-engineering/cpp/memory/resource-lifetime/proof.cpp b/languages-engineering/cpp/memory/resource-lifetime/proof.cpp new file mode 100644 index 0000000..2e08b3e --- /dev/null +++ b/languages-engineering/cpp/memory/resource-lifetime/proof.cpp @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "slot.hpp" + +extern bool nondet_bool(); + +void lifetime_harness() +{ + unsigned live = 0; + { + ResourceSlot original(&live); + __CPROVER_assert(live == 1 && original.owns(), "owner.acquired"); + { + ResourceSlot moved; + bool transferred = original.transfer_to(moved); + __CPROVER_assert(transferred && live == 1 && moved.owns() && !original.owns(), + "owner.unique-after-transfer"); + __CPROVER_assert(!original.transfer_to(moved) && live == 1 && moved.owns(), + "owner.occupied-refusal"); + if (nondet_bool()) + moved.reset(); + moved.reset(); + __CPROVER_assert(live == 0 && !moved.owns(), "owner.idempotent-release"); + } + __CPROVER_assert(live == 0, "owner.inner-destruction"); + } + __CPROVER_assert(live == 0, "owner.outer-destruction"); + + unsigned source_live = 0; + unsigned destination_live = 0; + { + ResourceSlot source(&source_live); + ResourceSlot destination(&destination_live); + __CPROVER_assert(!source.transfer_to(destination) && + source.owns() && destination.owns() && + source_live == 1 && destination_live == 1, + "owner.occupied-preserves-both"); + __CPROVER_assert(!source.transfer_to(source) && + source.owns() && source_live == 1, + "owner.self-refusal"); + } + __CPROVER_assert(source_live == 0 && destination_live == 0, + "owner.distinct-counter-destruction"); + + ResourceSlot empty_source; + ResourceSlot empty_destination; + __CPROVER_assert(empty_source.transfer_to(empty_destination) && + !empty_source.owns() && !empty_destination.owns(), + "owner.empty-transfer"); +} diff --git a/languages-engineering/cpp/memory/resource-lifetime/slot.hpp b/languages-engineering/cpp/memory/resource-lifetime/slot.hpp new file mode 100644 index 0000000..12568aa --- /dev/null +++ b/languages-engineering/cpp/memory/resource-lifetime/slot.hpp @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef DE_SLOT_HPP +#define DE_SLOT_HPP + +/* A single externally tracked resource. Native code and the verifier compile + * this same implementation. The caller keeps the live counter alive and never + * duplicates an ownership token. Acquisition requires a non-null counter with + * room for one increment; external code must not decrement outstanding tokens. + * This is not an allocator or a concurrency API. The bounded verification + * Profile starts counters at zero and does not establish these caller premises + * for arbitrary external projects. */ +class ResourceSlot { + unsigned *live_; + +public: + ResourceSlot() : live_(nullptr) {} + explicit ResourceSlot(unsigned *live) : live_(live) { ++*live_; } + ResourceSlot(const ResourceSlot &) = delete; + ResourceSlot &operator=(const ResourceSlot &) = delete; + + /* Transfer is explicit and refuses an occupied destination without changing + * either owner. This Profile covers this operation, not C++ move constructors. */ + bool transfer_to(ResourceSlot &destination) { + if (destination.owns()) + return false; + destination.live_ = live_; + live_ = nullptr; + return true; + } + + ~ResourceSlot() { reset(); } + + bool owns() const { return live_ != nullptr; } + + void reset() { + if (live_) { + --*live_; + live_ = nullptr; + } + } +}; + +#endif diff --git a/library/concurrency/resource-control/backpressure-memory/budget.lean b/library/backpressure-memory/budget.lean similarity index 100% rename from library/concurrency/resource-control/backpressure-memory/budget.lean rename to library/backpressure-memory/budget.lean diff --git a/library/concurrency/resource-control/backpressure-memory/abstract/config.ss b/library/backpressure-memory/config.ss similarity index 54% rename from library/concurrency/resource-control/backpressure-memory/abstract/config.ss rename to library/backpressure-memory/config.ss index f181cdb..55fdb4b 100644 --- a/library/concurrency/resource-control/backpressure-memory/abstract/config.ss +++ b/library/backpressure-memory/config.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later (import :clan/poo/object diff --git a/library/concurrency/resource-control/backpressure-memory/abstract/interface.ss b/library/backpressure-memory/interface.ss similarity index 74% rename from library/concurrency/resource-control/backpressure-memory/abstract/interface.ss rename to library/backpressure-memory/interface.ss index 9e205c2..891380a 100644 --- a/library/concurrency/resource-control/backpressure-memory/abstract/interface.ss +++ b/library/backpressure-memory/interface.ss @@ -1,19 +1,19 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later (import (only-in :yuanxu/module-system/source/declaration .def)) (.def BackpressureLibrary identity: 'backpressure-memory + tags: '(engineering domain concurrency) admissions: (.o Config: (.o export-path: '(config) contract-path: '(contracts config))) core: (.o requires: (.o) - scope-contract: BackpressureScopeContract - exports: (.o + scope-contract: (.get BackpressureScopeContract value-contract) + exports: (.o (:: scope) self: scope config: Config declaration: (.get scope config declaration) diff --git a/library/concurrency/resource-control/backpressure-memory/model.qnt b/library/backpressure-memory/model.qnt similarity index 100% rename from library/concurrency/resource-control/backpressure-memory/model.qnt rename to library/backpressure-memory/model.qnt diff --git a/library/concurrency/resource-control/backpressure-memory/abstract/objects.ss b/library/backpressure-memory/objects.ss similarity index 94% rename from library/concurrency/resource-control/backpressure-memory/abstract/objects.ss rename to library/backpressure-memory/objects.ss index af15dde..222555d 100644 --- a/library/concurrency/resource-control/backpressure-memory/abstract/objects.ss +++ b/library/backpressure-memory/objects.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Authored generic meaning; no repo capture, tool lookup or execution here. (import @@ -77,13 +76,13 @@ revision: "ownership-budget/v1" owner: 'backpressure-memory kind: 'quint - relative-path: "../model.qnt") + relative-path: "./model.qnt") (.o identity: 'backpressure.budget revision: "ownership-budget/v1" owner: 'backpressure-memory kind: 'lean - relative-path: "../budget.lean")) + relative-path: "./budget.lean")) capabilities: '(quint-model-asset lean-budget-asset) method-refs: '() qualification: 'conditional-abstract-model) diff --git a/library/concurrency/resource-control/backpressure-memory/abstract/types.ss b/library/backpressure-memory/types.ss similarity index 95% rename from library/concurrency/resource-control/backpressure-memory/abstract/types.ss rename to library/backpressure-memory/types.ss index 5d1ff73..1fcdb94 100644 --- a/library/concurrency/resource-control/backpressure-memory/abstract/types.ss +++ b/library/backpressure-memory/types.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Generic family Types consume neutral Library Types, never child objects. (import @@ -10,7 +9,7 @@ (only-in :clan/poo/recursive-validation closed?) (only-in :clan/poo/object-contract ObjectContract. refine) (only-in :yuanxu/object-types/contracts YuanxuContract. yuanxu-predicate-type) - "../../../../../types.ss") + "../../types.ss") (export BackpressureDeclarationContract BackpressureModelContract @@ -80,6 +79,7 @@ validation: (yuanxu-predicate-type 'library/value-closure closed?))))) (define-type (BackpressureScopeType @ LibraryScopeType.) + identity: 'backpressure-memory/scope scope-shape: ScopeShape closed-shape: diff --git a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/config.ss b/library/backpressure-tokio-rayon/config.ss similarity index 74% rename from library/concurrency/resource-control/backpressure-memory/tokio-rayon/config.ss rename to library/backpressure-tokio-rayon/config.ss index 0343edc..5c1b6e7 100644 --- a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/config.ss +++ b/library/backpressure-tokio-rayon/config.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Pure configuration of the selected specialization Library. (import :clan/poo/object "objects.ss") diff --git a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/interface.ss b/library/backpressure-tokio-rayon/interface.ss similarity index 70% rename from library/concurrency/resource-control/backpressure-memory/tokio-rayon/interface.ss rename to library/backpressure-tokio-rayon/interface.ss index 6db495a..7cc6a2a 100644 --- a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/interface.ss +++ b/library/backpressure-tokio-rayon/interface.ss @@ -1,16 +1,16 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Authored specialization is an atomic native Module, separate from execution. (import (only-in :yuanxu/module-system/source/declaration .def)) (.def TokioRayonLibrary identity: 'backpressure-tokio-rayon + tags: '(engineering domain rust concurrency) admissions: (.o Config: (.o export-path: '(config) contract-path: '(contracts config))) core: (.o - requires: (.o Parent: (.o module-id: 'backpressure-memory contract: BackpressureScopeContract)) - scope-contract: TokioRayonScopeContract + requires: (.o Parent: (.o module-id: 'backpressure-memory contract: (.get BackpressureScopeContract value-contract))) + scope-contract: (.get TokioRayonScopeContract value-contract) exports: (.o config: Config contracts: (.o config: TokioRayonConfigContract scope: TokioRayonScopeContract) diff --git a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss b/library/backpressure-tokio-rayon/objects.ss similarity index 97% rename from library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss rename to library/backpressure-tokio-rayon/objects.ss index 95b9509..3227e96 100644 --- a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss +++ b/library/backpressure-tokio-rayon/objects.ss @@ -1,9 +1,8 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Pure Rust/Tokio/Rayon specialization of the selected generic model. -(import :clan/poo/object "types.ss" "../abstract/types.ss") +(import :clan/poo/object "types.ss" "../backpressure-memory/types.ss") (export specialize-backpressure make-backpressure-integration BackpressureCodingPolicy BackpressureDesignPolicy integration-case-definitions OwnershipCatalog TraceMapping) @@ -121,7 +120,7 @@ revision: "observed-ownership-constraint" owner: 'backpressure-tokio-rayon kind: 'sysml - relative-path: "library/concurrency/resource-control/backpressure-memory/tokio-rayon/ownership.sysml") + relative-path: "library/backpressure-tokio-rayon/ownership.sysml") package: 'BackpressureOwnership definition: 'Ownership attributes: '(live reserved) diff --git a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/ownership.sysml b/library/backpressure-tokio-rayon/ownership.sysml similarity index 99% rename from library/concurrency/resource-control/backpressure-memory/tokio-rayon/ownership.sysml rename to library/backpressure-tokio-rayon/ownership.sysml index abfb53c..2f923f2 100644 --- a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/ownership.sysml +++ b/library/backpressure-tokio-rayon/ownership.sysml @@ -1,5 +1,4 @@ // SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -// // SPDX-License-Identifier: LGPL-2.1-or-later package BackpressureOwnership { diff --git a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/types.ss b/library/backpressure-tokio-rayon/types.ss similarity index 98% rename from library/concurrency/resource-control/backpressure-memory/tokio-rayon/types.ss rename to library/backpressure-tokio-rayon/types.ss index 32164e3..48a616a 100644 --- a/library/concurrency/resource-control/backpressure-memory/tokio-rayon/types.ss +++ b/library/backpressure-tokio-rayon/types.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Authored Tokio/Rayon model, correspondence and review contracts; no execution. (import :clan/poo/object @@ -11,8 +10,8 @@ (only-in :clan/poo/object-contract ObjectContract. refine) (only-in :yuanxu/object-types/contracts YuanxuContract. yuanxu-predicate-type) (only-in :std/list/list duplicates) - "../../../../../types.ss" - "../abstract/types.ss") + "../../types.ss" + "../backpressure-memory/types.ss") (export BackpressureScopeContract TokioRayonScopeContract @@ -370,6 +369,7 @@ (andmap (lambda (name) (eq? (.ref value name) (.ref canonical name))) names))))))) (define-type (TokioRayonScopeType @ Type.) + identity: 'tokio-rayon/scope .element?: (lambda (value) (if (and (object? value) (.slot? value 'validation)) diff --git a/library/bounded-capacity/config.ss b/library/bounded-capacity/config.ss new file mode 100644 index 0000000..67f67bf --- /dev/null +++ b/library/bounded-capacity/config.ss @@ -0,0 +1,7 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object "objects.ss") +(export Config) +(.def Config + entry: CapacityModel) diff --git a/library/bounded-capacity/interface.ss b/library/bounded-capacity/interface.ss new file mode 100644 index 0000000..ae256fb --- /dev/null +++ b/library/bounded-capacity/interface.ss @@ -0,0 +1,15 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def)) +(.def BoundedCapacity + identity: 'bounded-capacity + tags: '(engineering domain numeric source-contract) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(contracts config))) + core: (.o + requires: (.o) + scope-contract: (.get CatalogScopeContract value-contract) + exports: (.o entry: (.get Config entry) + config: Config + contracts: (.o config: CatalogConfigContract))) + features: (.o)) diff --git a/library/bounded-capacity/objects.ss b/library/bounded-capacity/objects.ss new file mode 100644 index 0000000..bad8d22 --- /dev/null +++ b/library/bounded-capacity/objects.ss @@ -0,0 +1,21 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Domain-owned meaning; no language asset or verifier is loaded here. +(import :clan/poo/object) +(export CapacityModel) + +(.def CapacityModel + identity: 'numeric.bounded-capacity + family: 'numeric.bounded-capacity + parent: #f + revision: "1" + factor-implications: '() + rules: '((checked-capacity CAP-BODY cbmc) + (capacity-client CAP-CALLER cbmc) + (native-capacity CAP-NATIVE native)) + dependencies: '((CAP-BODY source) (CAP-BODY profile) (CAP-BODY method) + (CAP-CALLER source) (CAP-CALLER profile) (CAP-CALLER method) + (CAP-NATIVE source) (CAP-NATIVE profile) (CAP-NATIVE method)) + invariant: "Quantities share units; overflow refuses admission and preserves output." + limits: "Representation, callers and native artifact require their own selected evidence.") diff --git a/library/bounded-capacity/types.ss b/library/bounded-capacity/types.ss new file mode 100644 index 0000000..db01744 --- /dev/null +++ b/library/bounded-capacity/types.ss @@ -0,0 +1,7 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object "../../types.ss") +(export CatalogConfigContract CatalogScopeContract) +(def CatalogConfigContract LibraryCatalogConfigContract) +(def CatalogScopeContract (library-catalog-scope-contract 'bounded-capacity/scope)) diff --git a/library/drivers/evidence/config.ss b/library/drivers/evidence/config.ss deleted file mode 100644 index b5ca5b1..0000000 --- a/library/drivers/evidence/config.ss +++ /dev/null @@ -1,10 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - "./objects.ss") -(export - Config) -(def Config EvidencePolicy) diff --git a/library/drivers/evidence/interface.ss b/library/drivers/evidence/interface.ss deleted file mode 100644 index 61fcd14..0000000 --- a/library/drivers/evidence/interface.ss +++ /dev/null @@ -1,18 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - (only-in :yuanxu/module-system/source/declaration .def)) -(.def ResourceEvidence - identity: 'evidence - core: - (.o - requires: (.o) - scope-contract: ResourceEvidenceScopeContract - exports: (.o - open-review: open-resource-review - make-evidence: make-resource-evidence - policy: Config)) - features: (.o)) diff --git a/library/drivers/project-formation/config.ss b/library/drivers/project-formation/config.ss deleted file mode 100644 index f73caf1..0000000 --- a/library/drivers/project-formation/config.ss +++ /dev/null @@ -1,9 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import - "./objects.ss") -(export - Config) -(def Config FormationSemantics) diff --git a/library/drivers/project-formation/inputs.ss b/library/drivers/project-formation/inputs.ss deleted file mode 100644 index 4d1dba6..0000000 --- a/library/drivers/project-formation/inputs.ss +++ /dev/null @@ -1,98 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; Real repository file acquisition, using Core's source/currentness authority. -;;; This observation does not attest user confirmation, role mandate or final C. -(import - :clan/poo/object - (only-in :clan/poo/mop validate) - (only-in :yuanxu/modules/json-schema/json-schema-source yuanxu-json-schema-read-port) - (only-in :std/source this-source-file) - (only-in :yuanxu/modules/json-schema/contracts schema-value-contract) - (only-in :std/string/path path-absolute?) - (only-in - :yuanxu/module-system/source/admission - module-source-type - module-source-read - module-source-admit-current! - call-with-module-source-fresh-reads)) -(export - formation-acquire-inputs - formation-inputs-current! - formation-input-observation) -(defstruct repository-inputs (root observations deadline) final: #t) -(def (now) (real-time)) -(def (directory-chain! directory) - (unless (eq? (module-source-type directory) 'directory) - (error "project input ancestor must be an ordinary directory" directory)) - (def parent (path-directory (path-strip-trailing-directory-separator directory))) - (unless (equal? parent directory) (directory-chain! parent))) -(def (relative-name? value) - (and - (string? value) - (not (string-empty? value)) - (not (path-absolute? value)) - (andmap - (lambda (part) (and (not (string-empty? part)) (not (member part '("." ".."))))) - (string-split value #\/)))) -(def (formation-acquire-inputs root-input relative-paths max-bytes lifetime-seconds) - ;; Yuanxu owns structural constraints and their precise Schema diagnostics. - ;; Resolve the actual schema source at the request boundary, not a stale cache. - (def request-contract - (call-with-module-source-fresh-reads - (lambda () - (schema-value-contract 'engineering/repository-input-request - (call-with-input-string - (module-source-read - (path-expand "repository-input.schema.json" (path-directory (this-source-file)))) - yuanxu-json-schema-read-port))))) - (validate request-contract - (.o root: root-input paths: relative-paths maxBytes: max-bytes lifetimeSeconds: lifetime-seconds)) - ;; Path traversal and native byte accounting remain filesystem semantics. - (unless (and (andmap relative-name? relative-paths) (exact-integer? max-bytes)) - (error "invalid repository path or exact native byte bound")) - (def selected-root (path-expand root-input)) - (def deadline (+ (now) lifetime-seconds)) - (def total 0) - (def observations - (map - (lambda (relative) - (def path (path-expand relative selected-root)) - (directory-chain! (path-directory path)) - (unless (eq? (module-source-type path) 'regular) - (error "required project input missing or not regular" relative)) - (def expected-size (file-info-size (file-info path #f))) - (set! total (+ total expected-size)) - (when (> total max-bytes) (error "project input byte bound exceeded")) - (def content (module-source-read path)) - ;; Refuse growth between stat and read as well as across the whole closure. - (when (not (= (u8vector-length (string->utf8 content)) expected-size)) - (error "project input changed while acquiring" relative)) - (cons path content)) - relative-paths)) - (def acquired (make-repository-inputs selected-root observations deadline)) - (formation-inputs-current! acquired) - acquired) -(def (formation-inputs-current! acquired) - (unless (repository-inputs? acquired) (error "original repository acquisition required")) - (when (>= (now) (repository-inputs-deadline acquired)) (error "repository acquisition expired")) - (call-with-module-source-fresh-reads - (lambda () - (for-each - (lambda (row) (directory-chain! (path-directory (car row)))) - (repository-inputs-observations acquired)) - (module-source-admit-current! - (repository-inputs-observations acquired) - "repository input changed; reacquire, do not relabel original observation"))) - acquired) -(def (formation-input-observation acquired) - (formation-inputs-current! acquired) - ;; Copies are documentary content, never an acquisition constructor. - (.o - status: 'repository-observation - root: (string-copy (repository-inputs-root acquired)) - inputs: (map - (lambda (row) (list (string-copy (car row)) (string-copy (cdr row)))) - (repository-inputs-observations acquired)) - missing-origins: '(user-confirmation proposal-occurrence role-mandate))) diff --git a/library/drivers/rust-resources/func.ss b/library/drivers/rust-resources/func.ss deleted file mode 100644 index 7bee035..0000000 --- a/library/drivers/rust-resources/func.ss +++ /dev/null @@ -1,69 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object - (only-in :clan/poo/mop validate map-object-values) - "types.ss" - "methods.ss" - "oracle.ss") -(export - bind-resource-methods) -(def ResourceUtilities - (.o - native-context: resource-native-context - context-current!: resource-context-current! - integration-scopes: resource-integration-scopes - native-oracle: resource-native-oracle - native-scopes: resource-native-scopes - scopes: resource-real-scopes - register: resource-register-results! - record: resource-result-record - id: resource-result-id - reference: resource-result-reference - claim: resource-result-claim - current!: resource-result-current! - file-digest: resource-digest-file - value-digest: resource-digest-value - write-json: resource-write-json)) - -(def (current-result-set! results) - (for-each resource-result-current! results) - results) - -;; The only operation-to-implementation association. No model meaning lives here. -(def MethodImplementations - (.o - native: (.o run: resource-run-native current!: current-result-set!) - quint: (.o run: resource-run-qnt current!: resource-result-current!) - lean: (.o run: resource-run-lean current!: resource-result-current!) - integration: (.o run: resource-run-integration current!: current-result-set!))) - -(.def ResourceMethodBinding. - definition: (error "A method binding requires its admitted definition") - provider: 'rust-resources - operation-name: (.get definition operation) - operation: (validate (.get definition signature) - (.get (.ref MethodImplementations operation-name) run)) - current!: (.get (.ref MethodImplementations operation-name) current!)) - -(def (bind-resource-methods expected-definitions) - (def selected-definitions (validate ResourceMethodDefinitionsShape expected-definitions)) - (def (bind-entry row) - (def key (car row)) - (def definition-value (cdr row)) - (unless (eq? (.get definition-value operation) key) - (error "method definition/operation mismatch" key)) - (cons key (.o (:: @ ResourceMethodBinding.) definition: definition-value))) - (def selected-bindings - (object<-alist (map bind-entry (.alist selected-definitions)))) - (def selected-operations - (.+ - ResourceUtilities - (map-object-values (lambda (binding) (.get binding operation)) selected-bindings))) - (.o - definitions: selected-definitions - bindings: selected-bindings - operations: selected-operations)) diff --git a/library/drivers/rust-resources/methods.ss b/library/drivers/rust-resources/methods.ss deleted file mode 100644 index d5cf3f3..0000000 --- a/library/drivers/rust-resources/methods.ss +++ /dev/null @@ -1,989 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Rust mechanism method observation. Core Ops owns spawning/deadlines; native ASCENT -;;; evaluates relations. Flow owns context exchange; the method issuer verifies receipts. -(import - :clan/poo/object - :std/encoding/json - (only-in :yuanxu/ops/process-script ProcessScript.) - (only-in :std/crypto/digest sha256) - (only-in :std/encoding/hex hex-encode) - (only-in :std/misc/ports read-all-as-u8vector read-all-as-string) - :gerbil-ascent/program/session - (only-in :agentic-ai-lab/modules/ai-agentic-context/clue-exchange open-trajectory-clue-exchange) - "oracle.ss" - "correspondence.ss" - (only-in - "types.ss" - resource-model-initializer - ResourceNativeProfileContract - ResourceNativeContextContract) - (only-in :clan/poo/mop validate)) -(export - resource-digest-file - resource-digest-value - resource-write-json - resource-real-scopes - resource-run-qnt - resource-run-lean - resource-result-record - resource-result-reference - resource-result-claim - resource-result-id - resource-register-results! - resource-result-current! - resource-native-scopes - resource-run-native - resource-native-context - resource-context-current! - resource-run-integration - resource-integration-scopes) - -;; A saved JSON record is review material, never a constructor for an issued run. -(defstruct resource-result (payload identity footprint files) final: #t) -(def (resource-result-record result) - (call-with-input-string - (json->string (resource-result-payload result)) - (cut read-json <> object-as-hash: #t))) -(def (resource-result-id result) - (unless (resource-result? result) (error "issued native method result required")) - (string-copy (hash-ref (resource-result-payload result) "id"))) -(def (resource-result-reference result) (string-copy (resource-result-identity result))) -(def (resource-digest-file path) - (unless (eq? (file-info-type (file-info path #f)) 'regular) - (error "method source/artifact must be an ordinary file" path)) - (hex-encode (sha256 (call-with-input-file path read-all-as-u8vector)))) -(def (resource-digest-value value) - (hex-encode (sha256 (string->utf8 (json->string value))))) -(def (resource-write-json path value) - (call-with-output-file - (list path: path truncate: #t) - (lambda (port) (write-json port value) (newline port)))) -(def (text path) (call-with-input-file path read-all-as-string)) -(def (write-text path value) - (call-with-output-file (list path: path truncate: #t) (cut display value <>))) -;; Domain-owned interpretation inputs; framework import/build closure is observed -;; by Core, rather than reconstructed by an application import walker. -(def (resource-interpretation-files root) - (map - (cut path-expand <> root) - '("types.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/types.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/config.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/interface.ss" - "library/drivers/rust-resources/types.ss" - "library/drivers/rust-resources/objects.ss" - "library/drivers/rust-resources/config.ss" - "library/drivers/rust-resources/interface.ss" - "library/drivers/rust-resources/func.ss" - "library/drivers/rust-resources/methods.ss" - "library/drivers/rust-resources/oracle.ss" - "library/drivers/rust-resources/correspondence.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/types.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/config.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/interface.ss"))) -(def (file-pairs paths) (map (lambda (path) (cons path (resource-digest-file path))) paths)) -(def (assert-files! pairs) - (for-each - (lambda (pair) - (unless (equal? (cdr pair) (resource-digest-file (car pair))) - (error "method inputs or recorded artifacts changed" (car pair)))) - pairs)) -(def (json-files pairs) (map (lambda (p) (list (car p) (cdr p))) pairs)) -(def (command process-script out name argv) - (def log (path-expand (string-append name ".log") out)) - (def receipt - (.call - (.cc process-script 'command argv 'directory out - 'timeout 45 'log log 'check-status #f) - .run)) - (hash - ("argv" argv) - ("exit" (.ref receipt 'status)) - ("seconds" (.ref receipt 'seconds)) - ("timeoutSeconds" 45) - ("log" log) - ("logSha256" (resource-digest-file log)))) -(def (json-read path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (model-initializer profile mode) - (or - (resource-model-initializer profile mode) - (error "unsupported QNT Profile/mode" (.get profile capacity) (.get profile queue) mode))) -(def (model-basis/input digest profile mode) - (resource-digest-value - (list - "quint-tlc/safe/v1" - digest - (model-initializer profile mode) - (if (eq? mode 'normal) "step" "earlyRelease") - "five-jobs"))) -(def (model-basis root profile mode) - (model-basis/input - (resource-digest-file - (path-expand "library/concurrency/resource-control/backpressure-memory/model.qnt" root)) - profile - mode)) -(def (arithmetic-basis root profile) - (resource-digest-value - (list - "lean/selected-budget/v1" - (resource-digest-file - (path-expand "library/concurrency/resource-control/backpressure-memory/budget.lean" root)) - "abstract-accounting-units" - (map (cut .ref profile <>) '(queue capacity item fixed cache-bytes budget))))) -(def (resource-real-scopes root profile usage source (mode 'normal)) - (list - (list usage 'model (model-basis root profile mode)) - (list usage 'arithmetic (arithmetic-basis root profile)) - (list usage 'source (resource-digest-file source)) - (list usage 'inventory (resource-digest-value '(waiting queued running returned cleanup done))) - (list - usage - 'runtime - (resource-digest-value - (map (cut .ref profile <>) '(runtime lock tokio-workers rayon-workers cpu-budget)))) - (list - usage - 'workload - (resource-digest-value - (map (cut .ref profile <>) '(workload capacity queue cache-bytes)))) - (list usage 'cache (resource-digest-value (list (.ref profile 'cache-bytes)))))) -(def (issue - out - obligation - method - outcome - footprint - commands - inputs - artifacts - oracle - (boundary - "Local model/proof result; no Rust source correspondence, performance or execution authority")) - (assert-files! inputs) - (def record-path (path-expand "record.json" out)) - (def review-path (path-expand "review.json" out)) - (def record - (hash - ("schema" "rust.resource.method-observation.v1") - ("obligation" (symbol->string obligation)) - ("method" (symbol->string method)) - ("outcome" (symbol->string outcome)) - ("footprint" (map (lambda (p) (list (symbol->string (car p)) (cdr p))) footprint)) - ("commands" commands) - ("inputs" (json-files inputs)) - ("artifacts" (json-files (file-pairs artifacts))) - ("boundary" boundary))) - (resource-write-json record-path record) - (def reference (string-append "sha256:" (resource-digest-file record-path))) - (resource-write-json - review-path - (hash - ("schema" "rust.resource.method-review.v1") - ("result" reference) - ("oracle" oracle) - ("inputClosureUnchanged" #t) - ("issuer" "local-Core-Ops-and-method-observer") - ("authentication" "local-host-trust; no external signature"))) - (make-resource-result - (hash - ("observation" record) - ("recordPath" record-path) - ("reviewPath" review-path) - ("id" (string-append "method-" (resource-digest-file record-path)))) - reference - footprint - (append inputs (file-pairs (append artifacts (list record-path review-path)))))) -(def (resource-result-current! result) - (unless (resource-result? result) - (error "issued native method result required; JSON assertions are not issuers")) - (assert-files! (resource-result-files result))) -(def (resource-run-qnt root profile executable out (mode 'normal)) - (def process-script ProcessScript.) - (create-directory out) - (def source (path-expand "library/concurrency/resource-control/backpressure-memory/model.qnt" root)) - (def before (file-pairs (append (list source executable) (resource-interpretation-files root)))) - (def selected-capacity (.ref profile 'capacity)) - (def selected-queue (.ref profile 'queue)) - (def frozen-profile - (.o - capacity: selected-capacity - queue: selected-queue)) - (def basis (model-basis/input (cdr (assoc source before)) frozen-profile mode)) - (def copy (path-expand "BackpressureOwners.qnt" out)) - (write-text copy (text source)) - (unless (equal? (resource-digest-file copy) (cdr (assoc source before))) - (error "model changed while capturing its owned input")) - (def version (command process-script out "version" (list executable "--version"))) - (def result-path (path-expand "tlc-result.json" out)) - (def init (model-initializer frozen-profile mode)) - (def step (if (eq? mode 'normal) "step" "earlyRelease")) - (def run - (command - process-script - out - "tlc" - (list - executable - "verify" - copy - "--backend" - "tlc" - "--init" - init - "--step" - step - "--invariant" - "safe" - "--out" - result-path))) - (unless (file-exists? result-path) (error "QNT produced no structured result" run)) - (def report (json-read result-path)) - (def expected (if (eq? mode 'normal) "ok" "violation")) - (unless (and - (= (hash-ref version "exit") 0) - (= (hash-ref run "exit") (if (eq? mode 'normal) 0 1)) - (equal? (hash-ref report "stage") "verifying") - (equal? (hash-ref report "status") expected)) - (error "QNT did not complete the selected property check" run)) - (def commands (list version run)) - (def artifacts (list copy result-path (hash-ref version "log") (hash-ref run "log"))) - (def oracle - (if (eq? mode 'normal) - (resource-ownership-oracle selected-capacity selected-queue) - (let* ((trace (path-expand "counter.itf.json" out)) - (machine (path-expand "counter-run.json" out)) - (negative - (command - process-script - out - "counter" - (list - executable - "run" - copy - "--backend" - "typescript" - "--init" - init - "--step" - step - "--invariant" - "safe" - "--max-samples" - "1" - "--max-steps" - "1" - "--seed" - "42" - "--out-itf" - trace - "--out" - machine)))) - (unless (and - (= (hash-ref negative "exit") 1) - (equal? (hash-ref (json-read machine) "status") "violation")) - (error "counter trace is not a method counterexample")) - (set! commands (append commands (list negative))) - (set! artifacts (append artifacts (list trace machine (hash-ref negative "log")))) - (resource-counter-oracle trace)))) - (issue - out - 'BP-O02 - 'quint - (if (eq? mode 'normal) 'pass 'fail) - (list (cons 'model basis)) - commands - before - artifacts - oracle)) -(def (resource-run-lean root profile executable out) - (def process-script ProcessScript.) - (create-directory out) - (def source - (path-expand "library/concurrency/resource-control/backpressure-memory/budget.lean" root)) - (def before (file-pairs (append (list source executable) (resource-interpretation-files root)))) - (def params (map (cut .ref profile <>) '(queue capacity item fixed cache-bytes budget))) - (def basis - (resource-digest-value - (list - "lean/selected-budget/v1" - (cdr (assoc source before)) - "abstract-accounting-units" - params))) - (def source-text (text source)) - (unless (equal? (hex-encode (sha256 (string->utf8 source-text))) (cdr (assoc source before))) - (error "proof changed while capturing its owned input")) - (def oracle (apply resource-budget-oracle params)) - (def within (hash-ref oracle "within")) - (def selected (path-expand "SelectedBudget.lean" out)) - (def olean (path-expand "SelectedBudget.olean" out)) - (def (n index) (number->string (list-ref params index))) - (write-text - selected - (string-append - source-text - "\ntheorem RustResources.selected_budget : " - (if within "" "¬ ") - "RustResources.retained " - (n 0) - " " - (n 1) - " " - (n 2) - " " - (n 3) - " " - (n 4) - " ≤ " - (n 5) - " := by decide\n" - "#print axioms RustResources.selected_budget\n" - "#print axioms RustResources.capacity_monotone\n" - "#print axioms RustResources.budget_reuse\n")) - (def version (command process-script out "version" (list executable "--version"))) - (def run (command process-script out "lean" (list executable "-o" olean selected))) - (def output (text (hash-ref run "log"))) - (unless (and - (= (hash-ref version "exit") 0) - (= (hash-ref run "exit") 0) - (andmap - (lambda (name) - (string-contains output (string-append "'RustResources." name "' does not depend on any axioms"))) - '("selected_budget" "capacity_monotone" "budget_reuse")) - (not (string-contains output "sorryAx")) - (not (string-contains output "error:")) - (file-exists? olean)) - (error "Lean kernel/proposition/axiom receipt incomplete" run)) - (issue - out - 'BP-O03 - 'lean - (if within 'pass 'fail) - (list (cons 'arithmetic basis)) - (list version run) - before - (list selected olean (hash-ref version "log") (hash-ref run "log")) - oracle)) -(def (resource-result-claim result) - (string-append - (hash-ref (hash-ref (resource-result-payload result) "observation") "obligation") - ":" - (resource-digest-value - (map - (lambda (p) (list (symbol->string (car p)) (cdr p))) - (resource-result-footprint result))))) -(def (result-clue result) - (def record (resource-result-payload result)) - (def observation (hash-ref record "observation")) - (hash - ("id" (hash-ref record "id")) - ("claim" (resource-result-claim result)) - ("polarity" (if (equal? (hash-ref observation "outcome") "pass") "support" "counter")) - ("role" "observation") - ("source" (hash-ref record "recordPath")) - ("factors" (hash-ref observation "footprint")) - ("links" '()))) -(def (clue-digest clue context) - (resource-digest-value - (list - (hash-ref context "sourceIdentity") - (hash-ref clue "id") - (hash-ref clue "claim") - (hash-ref clue "polarity") - (hash-ref clue "role") - (hash-ref clue "source") - (hash-ref clue "factors") - (hash-ref clue "links")))) -(def (result-set-current! results) - ;; Only this registration boundary shares checks; no prior read is trusted. - (def expected (make-hash-table)) - (for-each - (lambda (r) - (unless (resource-result? r) (error "issued native method result required")) - (for-each - (lambda (pair) - (def old (hash-get expected (car pair))) - (when (and old (not (equal? old (cdr pair)))) - (error "conflicting expected content for one dependency path" (car pair))) - (hash-put! expected (car pair) (cdr pair))) - (resource-result-files r))) - results) - (hash-for-each - (lambda (path digest) - (unless (equal? digest (resource-digest-file path)) - (error "method inputs or recorded artifacts changed" path))) - expected)) -;; Private projection value, never a constructor for an issued method result. -(def (result-registration-rows result) - (def record (resource-result-payload result)) - (def observation (hash-ref record "observation")) - (def id (string->symbol (hash-ref record "id"))) - (def reference (resource-result-reference result)) - (def review-digest (resource-digest-file (hash-ref record "reviewPath"))) - (.o - witness: (list - id - (string->symbol (hash-ref observation "obligation")) - (string->symbol (hash-ref observation "method")) - reference - (string->symbol (hash-ref observation "outcome"))) - inputs: (map (lambda (pair) (list id (car pair) (cdr pair))) (resource-result-footprint result)) - checked: (list id reference (string-append "sha256:" review-digest)))) -(def (resource-register-results! session results trajectory rules-path) - (def rule-digest (resource-digest-file rules-path)) - (def by-id (make-hash-table)) - (result-set-current! results) - (for-each (lambda (r) (hash-put! by-id (resource-result-id r) r)) results) - (def exchange - (open-trajectory-clue-exchange - trajectory - (lambda (id digest source context) - (def found (hash-get by-id id)) - (and - found - (equal? rule-digest (resource-digest-file rules-path)) - (equal? source (hash-ref (resource-result-payload found) "recordPath")) - (equal? digest (clue-digest (result-clue found) context)) - (let ((descriptor (resource-result-payload found))) - (assert-files! - (map - (lambda (key) - (or - (assoc (hash-ref descriptor key) (resource-result-files found)) - (error "issued result closure incomplete" key))) - '("recordPath" "reviewPath"))) - (resource-result-reference found)))) - (resource-digest-file rules-path))) - (exchange 'submit (map result-clue results) 0) - ;; Native attestation is read before any domain source transaction is made. - (for-each - (lambda (r) - (def view (exchange 'query (resource-result-claim r))) - (def descriptor (resource-result-payload r)) - (def observation (hash-ref descriptor "observation")) - (def relation (if (equal? (hash-ref observation "outcome") "pass") "support" "counterevidence")) - (unless (and - (null? (hash-ref view "unavailable")) - (find - (lambda (row) - (and - (equal? (list-ref row 1) (hash-ref descriptor "id")) - (equal? (list-ref row 4) (resource-result-reference r)))) - (hash-ref view relation))) - (error "native method attestation unavailable"))) - results) - ;; Digest acquisition remains effectful; only the subsequent field/row - ;; projection is declarative. Keep digest reads in result order, then retain - ;; the existing reverse-result wire order. - (def additions (reverse (map result-registration-rows results))) - (result-set-current! results) - (unless (equal? rule-digest (resource-digest-file rules-path)) - (error "rule source changed before registration")) - ;; Historical observations are retained; only freshly attested method checks - ;; enter this current view. The native Session remains the sole fact store. - (def old (gerbil-ascent-session-run session)) - (def (union-rows relation additions) - (foldl - (lambda (row out) (if (member row out) out (cons row out))) - ((.ref old 'rows-of) relation) - additions)) - (gerbil-ascent-session-replace-sources! - session - (list - (cons 'witness (union-rows 'witness (map (cut .get <> witness) additions))) - (cons - 'witness_input - (union-rows 'witness_input (apply append (map (cut .get <> inputs) additions)))) - (cons 'checked (map (cut .get <> checked) additions)))) - exchange) - -(def (native-context-files root) - (def (configs directory) - (filter - file-exists? - (list - (path-expand ".cargo/config" directory) - (path-expand ".cargo/config.toml" directory)))) - (def parent-files - (let loop - ((dir root) (files '())) - (def parent (path-directory (path-strip-trailing-directory-separator dir))) - (def next (append files (configs dir))) - (if (or (equal? parent dir) (equal? dir "/")) next (loop parent next)))) - (def cargo-home (getenv "CARGO_HOME" (path-expand ".cargo" (getenv "HOME")))) - (append - parent-files - (filter - file-exists? - (list - (path-expand "config" cargo-home) - (path-expand "config.toml" cargo-home))))) -(def (native-environment) - (map - (lambda (key) (list key (getenv key ""))) - '("RUSTFLAGS" "CARGO_ENCODED_RUSTFLAGS" "RUSTC_WRAPPER" "RUSTC_WORKSPACE_WRAPPER" - "CARGO_BUILD_TARGET" "CARGO_BUILD_RUSTFLAGS" "CARGO_PROFILE_DEV_PANIC" "CARGO_PROFILE_DEV_OPT_LEVEL" - "RUSTUP_TOOLCHAIN" "CARGO_HOME"))) -(def (native-source-basis crate) - (resource-digest-value - (map - (lambda (p) (list p (resource-digest-file (path-expand p crate)))) - '("Cargo.toml" "src/main.rs")))) -(def (resource-native-scopes root crate cargo rustc size usage) - (list - (list usage 'source (native-source-basis crate)) - (list - usage - 'runtime - (resource-digest-value - (list - "cargo-locked-offline/current-thread/rayon1/unwind/v1" - (resource-digest-file (path-expand "Cargo.toml" crate)) - (resource-digest-file (path-expand "Cargo.lock" crate)) - (resource-digest-file cargo) - (resource-digest-file rustc) - (native-environment) - (json-files (file-pairs (native-context-files root)))))) - (list usage 'workload (resource-digest-value (list "native-six-case-suite/v1" size))) - (list - usage - 'inventory - (resource-digest-file - (path-expand "library/drivers/rust-resources/oracle.ss" root))))) -(def (resource-native-context - selected-root - selected-entry - profile-input - selected-crate - selected-cargo - selected-rustc - selected-usage - (selected-mode 'normal)) - (def selected-profile (validate ResourceNativeProfileContract profile-input)) - (unless (and (symbol? selected-usage) (string? selected-root) (string? selected-crate)) - (error "invalid native context selection")) - (def generic - (resource-real-scopes - selected-root - selected-profile - selected-usage - (path-expand "src/main.rs" selected-crate) - selected-mode)) - (def captured-scopes - (append - (filter (lambda (r) (memq (cadr r) '(model arithmetic cache))) generic) - (resource-native-scopes - selected-root - selected-crate - selected-cargo - selected-rustc - (.ref selected-profile 'item) - selected-usage))) - (def captured-snapshot - (resource-digest-value - (list - "native-resource/v2" - (.ref selected-entry 'revision) - (.ref selected-entry 'rules) - (.ref selected-entry 'dependencies) - (map - (cut .ref selected-profile <>) - '(identity - capacity - queue - item - fixed - budget - cache-bytes - factors - workload - runtime - inventory - tokio-workers - rayon-workers - cpu-budget - lock)) - (map (lambda (r) (list (symbol->string (cadr r)) (caddr r))) captured-scopes)))) - (def context - (.o - root: selected-root - entry: selected-entry - profile: selected-profile - crate: selected-crate - cargo: selected-cargo - rustc: selected-rustc - usage: selected-usage - mode: selected-mode - snapshot: captured-snapshot - scopes: captured-scopes)) - (validate ResourceNativeContextContract context)) -(def (resource-context-current! selected-context) - (def context (validate ResourceNativeContextContract selected-context)) - (def expected - (resource-native-context - (.ref context 'root) - (.ref context 'entry) - (.ref context 'profile) - (.ref context 'crate) - (.ref context 'cargo) - (.ref context 'rustc) - (.ref context 'usage) - (.ref context 'mode))) - (unless (and - (equal? (.ref expected 'snapshot) (.ref context 'snapshot)) - (equal? (.ref expected 'scopes) (.ref context 'scopes))) - (error "native context no longer matches selected source/Profile/tools")) - ;; Structural validation can rebind computed Profile fields. A currentness - ;; check must retain the captured context identity after all checks succeed; - ;; its normalized checking view is not a newly issued capture. - selected-context) - -(def (append-map fn xs) (apply append (map fn xs))) -(def (registry-inputs directory) - (append-map - (lambda (name) - (def path (path-expand name directory)) - (case - (file-info-type (file-info path #f)) - ((directory) (registry-inputs path)) - ((regular) - (if (or - (and - (>= (string-length name) 3) - (equal? (substring name (- (string-length name) 3) (string-length name)) ".rs")) - (equal? name "Cargo.toml")) - (list path) - '())) - (else '()))) - (directory-files directory))) -(def (resource-run-native root crate cargo rustc size out) - (def process-script ProcessScript.) - (unless (and (integer? size) (> size 0) (<= size 4096)) - (error "native bounded payload domain" size)) - (create-directory out) - (unless (equal? (native-context-files root) (native-context-files out)) - (error "native output has an unbound Cargo configuration" out)) - (def source-scopes (resource-native-scopes root crate cargo rustc size 'native)) - (def footprint (map (lambda (r) (cons (cadr r) (caddr r))) source-scopes)) - (def source-files - (append - (native-context-files root) - (map (cut path-expand <> crate) '("Cargo.toml" "Cargo.lock" "src/main.rs")))) - (def before - (file-pairs (append source-files (list cargo rustc) (resource-interpretation-files root)))) - (def owned (path-expand "input" out)) - (create-directory owned) - (create-directory (path-expand "src" owned)) - (for-each - (lambda (name) - (def from (path-expand name crate)) - (def to (path-expand name owned)) - (write-text to (text from)) - (unless (equal? (resource-digest-file to) (cdr (assoc from before))) - (error "native source changed while capturing" name))) - '("Cargo.toml" "Cargo.lock" "src/main.rs")) - (def manifest (path-expand "Cargo.toml" owned)) - (def cargo-version (command process-script out "cargo-version" (list cargo "--version"))) - (def compiler (command process-script out "rustc-version" (list rustc "-vV"))) - (def metadata - (command - process-script - out - "metadata" - (list - cargo - "--config" - (string-append "build.rustc=\"" rustc "\"") - "metadata" - "--offline" - "--locked" - "--format-version" - "1" - "--manifest-path" - manifest))) - (unless (and - (= (hash-ref cargo-version "exit") 0) - (= (hash-ref compiler "exit") 0) - (= (hash-ref metadata "exit") 0)) - (error "native toolchain/metadata failed")) - (def resolved (json-read (hash-ref metadata "log"))) - (unless (equal? (path-normalize (hash-ref resolved "workspace_root")) (path-normalize owned)) - (error "native experiment requires its captured isolated Cargo workspace")) - (def dependency-files - (append-map - (lambda (pkg) - (registry-inputs (path-directory (hash-ref pkg "manifest_path")))) - (hash-ref resolved "packages"))) - (set! before (append before (file-pairs dependency-files))) - (def target (path-expand "target" out)) - (def build - (command - process-script - out - "cargo-build" - (list - cargo - "--config" - (string-append "build.rustc=\"" rustc "\"") - "build" - "--offline" - "--locked" - "--manifest-path" - manifest - "--target-dir" - target))) - (unless (= (hash-ref build "exit") 0) (error "native Cargo build failed" build)) - (def executable (path-expand "debug/rust-resource-lifecycle" target)) - (def executable-before (resource-digest-file executable)) - (def result (path-expand "observations.json" out)) - (def run (command process-script out "native-run" (list executable result (number->string size)))) - (unless (and (= (hash-ref run "exit") 0) (equal? executable-before (resource-digest-file executable))) - (error "native process failed or executable changed" run)) - (unless (equal? (native-context-files root) (native-context-files out)) - (error "native Cargo configuration changed at the execution directory" out)) - (def observed (json-read result)) - (unless (= size (hash-ref observed "payloadBytes")) (error "native payload invocation differs")) - (def gold (resource-native-oracle observed)) - (unless (equal? source-scopes (resource-native-scopes root crate cargo rustc size 'native)) - (error "native scope changed during execution")) - (def commands (list cargo-version compiler metadata build run)) - (def artifacts - (append - (list result executable) - (map (cut path-expand <> owned) '("Cargo.toml" "Cargo.lock" "src/main.rs")) - (map (cut hash-ref <> "log") commands))) - (map - (lambda (oracle) - (def name (hash-ref oracle "case")) - (def destination (path-expand name out)) - (create-directory destination) - (issue - destination - (string->symbol (string-append "RL-" name)) - 'native - (if (equal? (hash-ref oracle "outcome") "pass") 'pass 'fail) - footprint - commands - before - artifacts - oracle)) - gold)) - -;; Opt-in facets retain the native result issuer and its complete observation closure. -(def (resource-integration-scopes context sysml quint) - (resource-context-current! context) - (def root (.ref context 'root)) - (resource-slice-tool-scopes - (.ref context 'usage) - (resource-digest-value - (list - (resource-mapping-value (.get context entry mapping)) - (resource-mapping-value (.get context entry catalog)) - (resource-digest-file - (path-expand - (.get context entry catalog asset relative-path) - root)) - (resource-digest-file - (path-expand "library/drivers/rust-resources/objects.ss" root)) - (resource-digest-file - (path-expand "library/drivers/rust-resources/types.ss" root)) - (resource-digest-file - (path-expand "library/drivers/rust-resources/correspondence.ss" root)) - (resource-digest-file - (path-expand "library/concurrency/resource-control/backpressure-memory/model.qnt" root)))) - (resource-digest-file sysml) - (resource-digest-file quint))) -(def (resource-run-integration context native sysml quint out) - (def process-script ProcessScript.) - (resource-context-current! context) - (unless (and (= (length native) 6) (andmap resource-result? native)) - (error "six issued native results required")) - (result-set-current! native) - (unless (equal? - (map - (lambda (r) (hash-ref (hash-ref (resource-result-payload r) "observation") "obligation")) - native) - '("RL-M01" "RL-M02" "RL-M03" "RL-M04" "RL-M05" "RL-M06")) - (error "native integration case inventory differs")) - (def root (.ref context 'root)) - (def original (resource-result-footprint (car native))) - (unless (andmap - (lambda (r) - (and - (equal? original (resource-result-footprint r)) - (equal? (hash-ref (hash-ref (resource-result-payload r) "observation") "method") "native"))) - native) - (error "integration native inputs differ")) - (for-each - (lambda (p) - (unless (member (list (.ref context 'usage) (car p) (cdr p)) (.ref context 'scopes)) - (error "native result differs from captured integration context" p))) - original) - (def observed-paths - (map - (lambda (r) - (def artifacts (hash-ref (hash-ref (resource-result-payload r) "observation") "artifacts")) - (def row (find (lambda (p) (equal? (path-strip-directory (car p)) "observations.json")) artifacts)) - (unless row (error "native observation artifact missing")) - (car row)) - native)) - (unless (andmap (cut equal? <> (car observed-paths)) observed-paths) - (error "native cases did not observe one captured run")) - (def model (path-expand "library/concurrency/resource-control/backpressure-memory/model.qnt" root)) - (def mapper - (path-expand "library/drivers/rust-resources/correspondence.ss" root)) - (def catalog-path - (path-expand - (.get context entry catalog asset relative-path) - root)) - (def scopes (resource-integration-scopes context sysml quint)) - (def (scope key) (cons key (caddr (find (lambda (r) (eq? (cadr r) key)) scopes)))) - (def before - (append - (resource-result-files (car native)) - (file-pairs - (append - (list model mapper catalog-path sysml quint "/usr/bin/env") - (resource-interpretation-files root))) - (file-pairs - (apply - append - (map - (lambda (r) - (list - (hash-ref (resource-result-payload r) "recordPath") - (hash-ref (resource-result-payload r) "reviewPath"))) - native))))) - (def projections (resource-trace-projections (.get context entry) (json-read (car observed-paths)))) - (create-directory out) - (def home (path-expand "sysml-home" out)) - (create-directory home) - (def (sysml-command . args) - (append (list "/usr/bin/env" "-i" (string-append "HOME=" home) "PATH=/usr/bin:/bin" sysml) args)) - (def sv (command process-script out "sysml-version" (sysml-command "-version"))) - (def qv (command process-script out "quint-version" (list quint "--version"))) - (unless (and (= (hash-ref sv "exit") 0) (= (hash-ref qv "exit") 0)) - (error "integration tool identity failed")) - (def all-results - (apply - append - (map - (lambda (p) - (def name (hash-ref p "case")) - (def dir (path-expand name out)) - (create-directory dir) - (def projection (path-expand "projection.json" dir)) - (resource-write-json projection p) - (def notation (path-expand "ownership.sysml" dir)) - (write-text notation (resource-trace-sysml (.get context entry) p)) - (def runs - (map - (lambda (cut) - (def label (hash-ref cut "label")) - (def good (= (hash-ref cut "live") (hash-ref cut "reserved"))) - (def target (string-append "BackpressureSlice::" name "::cut_" label)) - (def run - (command - process-script - dir - (string-append "sysml-" label) - (sysml-command - "-strict" - "-json" - "-instantiate" - (string-append "BackpressureSlice::" name) - (string-append "-validate=" target) - notation - catalog-path))) - (def report (json-read (hash-ref run "log"))) - (unless (and - (= (hash-ref run "exit") (if good 0 1)) - (= (hash-ref report "exit") (if good 0 1)) - (equal? (hash-ref report "status") (if good "holds" "fails")) - (= (length (hash-ref report "checks")) 2) - (string-prefix? - (string-append - "assert constraint " - (symbol->string (.get context entry catalog constraint)) - " on ") - (hash-ref (car (hash-ref report "checks")) "subject")) - (equal? (hash-ref (car (hash-ref report "checks")) "status") (if good "holds" "fails"))) - (error "SysML cut assertion differs from independent ownership check" name label run)) - run) - (hash-ref p "cuts"))) - (def sysdir (path-expand "sysml" dir)) - (create-directory sysdir) - (def sysresult - (issue - sysdir - (string->symbol (string-append "SI-" name)) - 'sysml - (string->symbol (hash-ref p "outcome")) - (append original (list (scope 'correspondence) (scope 'sysml-tool))) - (cons sv runs) - before - (append (list projection notation) (map (cut hash-ref <> "log") (cons sv runs))) - p - "Concrete ownership assertions over observed native cuts; no behavioral refinement or native authority")) - (def trace (path-expand "Trace.qnt" dir)) - (write-text trace (resource-trace-qnt (.get context entry) (text model) p)) - (def machine (path-expand "quint.json" dir)) - (def replay - (command - process-script - dir - "quint-path" - (list - quint - "verify" - trace - "--backend" - "tlc" - "--main" - "BackpressureOwners" - "--init" - "replayInit" - "--step" - "replayStep" - "--invariant" - "unfinished" - "--out" - machine))) - (def reached (equal? (hash-ref p "outcome") "pass")) - (unless (file-exists? machine) - (error "Quint correspondence produced no structured result" name replay)) - (def report (json-read machine)) - ;; A violation of unfinished witnesses a complete path through the original - ;; transitions plus the explicitly named queued-cancellation extension. - (unless (and - (= (hash-ref replay "exit") (if reached 1 0)) - (equal? (hash-ref report "stage") "verifying") - (equal? (hash-ref report "status") (if reached "violation" "ok"))) - (error "Quint path existence differs from independent native ownership result" name replay)) - (def qdir (path-expand "correspondence" dir)) - (create-directory qdir) - (list - sysresult - (issue - qdir - (string->symbol (string-append "TM-" name)) - 'correspondence - (if reached 'pass 'fail) - (append original (list (scope 'correspondence) (scope 'quint-tool))) - (list qv replay) - before - (list projection trace machine (hash-ref qv "log") (hash-ref replay "log")) - p - "Bounded abstract path existence for one observed sequence; TLC exports no ITF witness here; queued cancellation extends base QNT; not all Rust executions"))) - projections))) - (resource-context-current! context) - (unless (equal? scopes (resource-integration-scopes context sysml quint)) - (error "integration mapping/tools changed")) - (result-set-current! native) - all-results) diff --git a/library/drivers/rust-resources/oracle.ss b/library/drivers/rust-resources/oracle.ss deleted file mode 100644 index e5605b4..0000000 --- a/library/drivers/rust-resources/oracle.ss +++ /dev/null @@ -1,213 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Independent finite oracle: explicit job stages and a reservation bit mask. -;;; It reads neither Quint ASTs nor ASCENT rules. -(import - :std/encoding/json) -(export - resource-ownership-oracle - resource-counter-oracle - resource-budget-oracle - resource-native-oracle) -(def (bit job) (arithmetic-shift 1 job)) -(def (occupancy stages stage) (length (filter (cut = <> stage) stages))) -(def (holders stages) - (let loop - ((rest stages) (job 0) (mask 0)) - (if (null? rest) - mask - (loop - (cdr rest) - (+ job 1) - (if (<= 1 (car rest) 4) (bitwise-ior mask (bit job)) mask))))) -(def (safe? stages mask limit queue) - (and - (= mask (holders stages)) - (<= (length (filter (lambda (s) (<= 1 s 4)) stages)) limit) - (<= (occupancy stages 1) queue))) -(def (transition state job target) - (let* ((stages (car state)) - (mask (cadr state)) - (next - (let loop - ((rest stages) (i 0)) - (if (null? rest) - '() - (cons (if (= i job) target (car rest)) (loop (cdr rest) (+ i 1))))))) - (list - next - (cond - ((= target 1) (bitwise-ior mask (bit job))) - ((= target 5) (bitwise-and mask (bitwise-not (bit job)))) - (else mask))))) -(def (resource-ownership-oracle limit queue) - (unless (or (and (= limit 1) (= queue 1)) (and (member limit '(2 4)) (= queue 2))) - (error "unsupported ownership domain")) - (def seen (make-hash-table)) - (let loop - ((todo '(((0 0 0 0 0) 0))) (states 0) (edges 0)) - (if (null? todo) - (hash - ("oracle" "explicit-five-job-bfs/v1") - ("safe" #t) - ("states" states) - ("transitions" edges) - ("limit" limit) - ("queue" queue)) - (let* ((state (car todo)) (stages (car state)) (mask (cadr state))) - (if (hash-get seen state) - (loop (cdr todo) states edges) - (let ((next '())) - (unless (safe? stages mask limit queue) (error "independent ownership oracle violation" state)) - (hash-put! seen state #t) - (let jobs - ((rest stages) (job 0)) - (unless (null? rest) - (for-each - (lambda (target) (set! next (cons (transition state job target) next))) - (case - (car rest) - ((0) - (if (and - (< (occupancy stages 1) queue) - (< (length (filter (lambda (s) (<= 1 s 4)) stages)) limit)) - '(1) - '())) - ((1) '(2)) - ((2) '(3 4)) - ((3 4) '(5)) - (else '()))) - (jobs (cdr rest) (+ job 1)))) - (loop (append next (cdr todo)) (+ states 1) (+ edges (length next))))))))) -(def (itf-int value) (string->number (hash-ref value "#bigint"))) -(def (itf-set state field) (map itf-int (hash-ref (hash-ref state field) "#set"))) -(def (resource-counter-oracle trace-file) - (def trace (call-with-input-file trace-file (cut read-json <> object-as-hash: #t))) - (def states (hash-ref trace "states")) - (unless (= (length states) 2) (error "expected the independent two-state counter schedule")) - (def before (hash-ref (car states) "s")) - (def after (hash-ref (cadr states) "s")) - (unless (and - (equal? (itf-set before "running") '(0)) - (equal? (itf-set before "admitted") '(0)) - (null? (itf-set before "cleanup")) - (null? (itf-set after "running")) - (null? (itf-set after "admitted")) - (equal? (itf-set after "cleanup") '(0))) - (error "trace does not establish retained cleanup without reservation")) - (hash - ("oracle" "explicit-job0-cancel/v1") - ("retainedJob" 0) - ("reservationAfter" #f) - ("cleanupAfter" #t) - ("violation" #t))) -(def (resource-budget-oracle queue active item fixed cache budget) - (def planned (+ (* (+ queue active) item) fixed cache)) - (hash - ("oracle" "integer-accounting/v1") - ("planned" planned) - ("budget" budget) - ("within" (<= planned budget)))) - -;; Independent event/cut oracle. The Rust producer emits observations, not gold. -(def (resource-native-oracle report) - (unless (and - (equal? (hash-ref report "schema") "rust.resource-lifecycle.v1") - (= (hash-ref report "capacity") 1) - (equal? (hash-ref report "tokioFlavor") "current_thread") - (= (hash-ref report "rayonThreads") 1) - (equal? (hash-ref report "panic") "unwind")) - (error "native producer scope differs")) - (def cases (hash-ref report "cases")) - (unless (equal? (map (cut hash-ref <> "case") cases) '("M01" "M02" "M03" "M04" "M05" "M06")) - (error "native case closure incomplete or duplicated")) - (map - (lambda (case) - (def name (hash-ref case "case")) - (def events (hash-ref case "events")) - (def labels (map (cut hash-ref <> "event") events)) - (def (at label) - (or - (find (lambda (e) (equal? (hash-ref e "event") label)) events) - (error "native event absent" name label))) - (def (index label) - (let loop - ((xs labels) (i 0)) - (cond - ((null? xs) (error "native order event absent" name label)) - ((equal? (car xs) label) i) - (else (loop (cdr xs) (+ i 1)))))) - (def (before a b) (unless (< (index a) (index b)) (error "native partial order violated" name a b))) - (for-each - (lambda (label) - (unless (= (length (filter (cut equal? <> label) labels)) 1) - (error "native event closure duplicated/missing" name label))) - '("payload-created" "payload-dropped" "held" "final")) - (def held (at "held")) - (def final (at "final")) - (unless (and - (= (hash-ref held "live") 1) - (= (hash-ref held "drops") 0) - (= (hash-ref held "available") (if (equal? name "M06") 1 0)) - (= (hash-ref final "live") 0) - (= (hash-ref final "drops") 1) - (= (hash-ref final "available") 1)) - (error "native holder/permit gold mismatch" name)) - (before "payload-created" "held") - (before "held" "payload-dropped") - (before "payload-dropped" "final") - (if (equal? name "M02") - (begin - (before "waiter-pending" "waiter-cancelled") - (before "waiter-cancelled" "held") - (unless (= (hash-ref case "acquiredByWaiter") 0) (error "cancelled waiter acquired"))) - (begin - (before "cpu-started" "started") - (before "started" "held") - (before "held" "cpu-released") - (before "cpu-released" "cpu-finished") - (before "cpu-finished" "final") - (cond - ((equal? name "M01") - (def returned (at "returned")) - (unless (and (= (hash-ref returned "live") 1) (= (hash-ref returned "available") 0)) - (error "result owner lost reservation")) - (before "cpu-released" "returned") - (before "returned" "payload-dropped")) - ((equal? name "M03") - (before "receiver-dropped" "held") - (before "cpu-released" "delivery-failed-retained") - (before "delivery-failed-retained" "payload-dropped")) - ((or (equal? name "M04") (equal? name "M06")) - (before "caller-cancelled" "held") - (before "cpu-released" "delivery-failed-retained") - (before "delivery-failed-retained" "payload-dropped")) - ((equal? name "M05") - (before "cpu-released" "cleanup-full-retained") - (before "cleanup-full-retained" "payload-dropped"))))) - (def projection - (map - (lambda (e) - (def live (hash-ref e "live")) - (def reserved (- 1 (hash-ref e "available"))) - (hash - ("cut" (hash-ref e "event")) - ("owners" live) - ("reserved" reserved) - ("safe" (= live reserved)))) - (filter (lambda (e) (hash-key? e "live")) events))) - (unless (equal? (andmap (cut hash-ref <> "safe") projection) (not (equal? name "M06"))) - (error "cut projection differs from ownership invariant" name)) - (hash - ("oracle" "independent-cut-and-ownership/v1") - ("projection" projection) - ("case" name) - ("outcome" (if (equal? name "M06") "fail" "pass")) - ("heldLive" 1) - ("heldAvailable" (hash-ref held "available")) - ("finalLive" 0) - ("finalAvailable" 1))) - cases)) diff --git a/library/drivers/rust-resources/reassessment-oracle.ss b/library/drivers/rust-resources/reassessment-oracle.ss deleted file mode 100644 index a311e5b..0000000 --- a/library/drivers/rust-resources/reassessment-oracle.ss +++ /dev/null @@ -1,66 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Independent ownership-cut oracle for source-changing mechanism experiments. -;;; The Rust producer reports events; neither case labels nor producer verdicts decide safety. -(import - :std/encoding/json - :std/list/list) -(export - backpressure-reassessment-oracle) -(def (backpressure-reassessment-oracle raw) - (unless (and - (equal? (hash-ref raw "schema") "rust.resource-lifecycle.v1") - (= (hash-ref raw "capacity") 1) - (= (hash-ref raw "rayonThreads") 1) - (equal? (hash-ref raw "tokioFlavor") "current_thread") - (equal? (hash-ref raw "panic") "unwind")) - (error "unsupported reassessment mechanism")) - (def cases (hash-ref raw "cases")) - (unless (equal? (map (cut hash-ref <> "case") cases) '("M01" "M02" "M03" "M04" "M05" "M06")) - (error "incomplete native reassessment cases")) - (map - (lambda (case) - (def events (hash-ref case "events")) - (def (one label) - (def found (filter (lambda (e) (equal? (hash-ref e "event") label)) events)) - (unless (= (length found) 1) (error "incomplete or duplicate native event" label)) - (car found)) - (def (index label) - (let loop - ((xs events) (i 0)) - (cond - ((null? xs) (error "missing native order event" label)) - ((equal? (hash-ref (car xs) "event") label) i) - (else (loop (cdr xs) (+ i 1)))))) - (def held (one "held")) - (def final (one "final")) - (unless (and - (< (index "payload-created") (index "held")) - (< (index "held") (index "payload-dropped")) - (< (index "payload-dropped") (index "final")) - (= (hash-ref held "live") 1) - (= (hash-ref held "drops") 0) - (= (hash-ref final "live") 0) - (= (hash-ref final "drops") 1) - (= (hash-ref final "available") 1)) - (error "invalid disposal event closure")) - (when (member (hash-ref case "case") '("M04" "M06")) - (unless (and - (< (index "caller-waiting") (index "held")) - (< (index "caller-cancelled") (index "held")) - (< (index "held") (index "cpu-released")) - (< (index "cpu-released") (index "cpu-finished"))) - (error "caller-abort cut not established"))) - (def safe - (every - (lambda (e) - (or (not (hash-key? e "live")) (= (hash-ref e "live") (- 1 (hash-ref e "available"))))) - events)) - (hash - ("case" (hash-ref case "case")) - ("outcome" (if safe "pass" "fail")) - ("payloadBytes" (hash-ref raw "payloadBytes")))) - cases)) diff --git a/library/evidence/config.ss b/library/evidence/config.ss new file mode 100644 index 0000000..f743555 --- /dev/null +++ b/library/evidence/config.ss @@ -0,0 +1,9 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; -*- Gerbil -*- +(import :clan/poo/object + "objects.ss") +(export + Config) +(.def (Config @ EvidencePolicy)) diff --git a/library/drivers/evidence/func.ss b/library/evidence/func.ss similarity index 91% rename from library/drivers/evidence/func.ss rename to library/evidence/func.ss index b6eaa54..20dbb8c 100644 --- a/library/drivers/evidence/func.ss +++ b/library/evidence/func.ss @@ -1,15 +1,14 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- (import :clan/poo/object - :gerbil-ascent/rules/interface + :gerbil-ascent/rules/func (only-in :gerbil-ascent/rules/declaration rule-module-program)) (export make-resource-evidence - open-resource-review) + resource-review-sources) ;; Finite project rules over native Evidence sources. Host-supplied checked rows ;; record method validation; inferred support never authorizes execution. @@ -20,6 +19,7 @@ obligation requires support + unopposed_support counter pending mismatch @@ -75,6 +75,7 @@ (validation string?) (review string?))) (relation supported ((usage symbol?) (obligation symbol?))) + (relation unopposed_support ((usage symbol?) (obligation symbol?))) (relation pending ((usage symbol?) (obligation symbol?) (method symbol?))) (relation t_use ((usage symbol?) (snapshot string?) (obligation symbol?) (witness symbol?))) ((factor U D) @@ -117,6 +118,9 @@ ((support U O W V A) <-- (applicable U O W) (witness W O M V (lit 'pass)) (checked W V A)) ((counter U O W V A) <-- (applicable U O W) (witness W O M V (lit 'fail)) (checked W V A)) ((supported U O) <-- (support U O W V A)) + ;; Support is a retained observation, not a verdict. An applicable counter + ;; prevents even this narrow unopposed-support conclusion; it grants no authority. + ((unopposed_support U O) <-- (supported U O) (not (counter U O _ _ _))) ((pending U O M) <-- (obligation U O M) (not (supported U O))) ((t_use U S O W) <-- @@ -138,9 +142,3 @@ (map (lambda (row) (cons (.get entry identity) row)) (.get entry factor-implications))) (cons 'factor (map (cut list usage <>) (.get profile factors))) (cons 'scope scopes))) -(def (open-resource-review entry profile usage snapshot scopes) - (def session (gerbil-ascent-open-session (rule-module-program (make-resource-evidence)))) - (gerbil-ascent-session-replace-sources! - session - (resource-review-sources entry profile usage snapshot scopes)) - session) diff --git a/library/evidence/interface.ss b/library/evidence/interface.ss new file mode 100644 index 0000000..0efb514 --- /dev/null +++ b/library/evidence/interface.ss @@ -0,0 +1,21 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; -*- Gerbil -*- +(import + (only-in :yuanxu/module-system/source/declaration .def)) +(.def ResourceEvidence + identity: 'evidence + tags: '(engineering driver reasoning source-contract) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(config-contract))) + core: + (.o + requires: (.o) + scope-contract: (.get ResourceEvidenceScopeContract value-contract) + exports: (.o + sources: resource-review-sources + make-evidence: make-resource-evidence + config: Config + config-contract: ResourceEvidencePolicyType + policy: Config)) + features: (.o)) diff --git a/library/drivers/evidence/objects.ss b/library/evidence/objects.ss similarity index 59% rename from library/drivers/evidence/objects.ss rename to library/evidence/objects.ss index 1485905..5216efe 100644 --- a/library/drivers/evidence/objects.ss +++ b/library/evidence/objects.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- (import diff --git a/library/drivers/evidence/types.ss b/library/evidence/types.ss similarity index 75% rename from library/drivers/evidence/types.ss rename to library/evidence/types.ss index ab1db79..152da83 100644 --- a/library/drivers/evidence/types.ss +++ b/library/evidence/types.ss @@ -1,20 +1,20 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- ;;; Evidence admission describes inputs and results; it grants no execution authority. (import (only-in :clan/poo/object .o) - (only-in :clan/poo/mop Type. Object Function define-type element?) + (only-in :clan/poo/mop Type Type. Any Object Function define-type element?) (only-in :clan/poo/type Record Symbol List Pair Exactly) (only-in :clan/poo/object-contract ObjectContract.) (only-in :yuanxu/object-types/contracts YuanxuContract.) (only-in :gerbil-ascent/program/types - GerbilAscentProgramContract GerbilAscentSessionContract) + GerbilAscentProgramContract) (only-in :gerbil-ascent/rules/declaration rule-module? rule-module-program) - (only-in "../../../types.ss" - LibraryNonemptyString LibrarySymbolPair LibrarySymbolTriple LibraryScopeBinding)) + (only-in "../../types.ss" + LibraryNonemptyString LibrarySymbolPair LibrarySymbolTriple LibraryScopeBinding + LibraryRuleCatalogShape)) (export ResourceEvidenceScopeContract @@ -23,20 +23,14 @@ ResourceEvidenceProfileProjection ResourceEvidenceModuleType ResourceMakeEvidenceSignature - ResourceOpenReviewSignature) + ResourceSourcesSignature) ;; Consume only the declared projection. Full family admission stays with its Library. ;; Object is the explicit open envelope; extra fields are not domain-admitted here. -(define-type (ResourceEvidenceEntryProjection @ ObjectContract.) +(define-type (ResourceEvidenceEntryProjection @ LibraryRuleCatalogShape) identity: 'resource-evidence/entry-projection extra-fields: 'delegate - constraints: (list Object) - responsibilities: - (.o - identity: Symbol - rules: (List LibrarySymbolTriple) - factor-implications: (List LibrarySymbolTriple) - dependencies: (List LibrarySymbolPair))) + constraints: (list Object)) (define-type (ResourceEvidenceProfileProjection @ ObjectContract.) identity: 'resource-evidence/profile-projection @@ -64,9 +58,9 @@ (define-type ResourceMakeEvidenceSignature (Function (list ResourceEvidenceModuleType) '())) -(define-type ResourceOpenReviewSignature +(define-type ResourceSourcesSignature (Function - (list GerbilAscentSessionContract) + (list (List Any)) (list ResourceEvidenceEntryProjection ResourceEvidenceProfileProjection Symbol @@ -78,8 +72,11 @@ (ResourceEvidenceScopeShape @ (Record make-evidence: [ResourceMakeEvidenceSignature] - open-review: [ResourceOpenReviewSignature] + sources: [ResourceSourcesSignature] + config: [ResourceEvidencePolicyType] + config-contract: [Type] policy: [ResourceEvidencePolicyType])) + identity: 'resource-evidence/value sealed: #t) (define-type (ResourceEvidenceScopeContract @ YuanxuContract.) diff --git a/library/gateway-profiles/config.ss b/library/gateway-profiles/config.ss new file mode 100644 index 0000000..5b6adeb --- /dev/null +++ b/library/gateway-profiles/config.ss @@ -0,0 +1,6 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object) +(export Config) +(def Config (.o purpose: 'gateway-profiles)) diff --git a/library/gateway-profiles/interface.ss b/library/gateway-profiles/interface.ss new file mode 100644 index 0000000..3c9b677 --- /dev/null +++ b/library/gateway-profiles/interface.ss @@ -0,0 +1,18 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def)) +(.def ProfileModule + identity: 'gateway-profiles + tags: '(engineering profile) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(config-type))) + core: + (.o + requires: (.o) + scope-contract: ScopeType + exports: + (.o + config: Config + config-type: ConfigType + profiles: (.o LocalProfile Cap2Profile CacheProfile RetryProfile))) + features: (.o)) diff --git a/profiles/gateway.ss b/library/gateway-profiles/objects.ss similarity index 87% rename from profiles/gateway.ss rename to library/gateway-profiles/objects.ss index 03d31c1..98b7bbe 100644 --- a/profiles/gateway.ss +++ b/library/gateway-profiles/objects.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- (import diff --git a/library/gateway-profiles/types.ss b/library/gateway-profiles/types.ss new file mode 100644 index 0000000..d258615 --- /dev/null +++ b/library/gateway-profiles/types.ss @@ -0,0 +1,12 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object + (only-in :clan/poo/mop define-type Object Type) + (only-in :clan/poo/type Record Exactly)) +(export ConfigType ScopeType) + +(define-type ConfigType (Record purpose: [(Exactly 'gateway-profiles)])) +(define-type ScopeType + (.cc (Record config: [ConfigType] config-type: [Type] profiles: [Object]) + 'identity 'gateway-profiles/scope)) diff --git a/library/library-formation-profiles/config.ss b/library/library-formation-profiles/config.ss new file mode 100644 index 0000000..3162170 --- /dev/null +++ b/library/library-formation-profiles/config.ss @@ -0,0 +1,6 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object) +(export Config) +(def Config (.o purpose: 'library-formation-profiles)) diff --git a/library/library-formation-profiles/interface.ss b/library/library-formation-profiles/interface.ss new file mode 100644 index 0000000..7552c14 --- /dev/null +++ b/library/library-formation-profiles/interface.ss @@ -0,0 +1,18 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def)) +(.def ProfileModule + identity: 'library-formation-profiles + tags: '(engineering profile) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(config-type))) + core: + (.o + requires: (.o) + scope-contract: ScopeType + exports: + (.o + config: Config + config-type: ConfigType + profiles: (.o LibraryFormationProfile))) + features: (.o)) diff --git a/profiles/library-formation.ss b/library/library-formation-profiles/objects.ss similarity index 95% rename from profiles/library-formation.ss rename to library/library-formation-profiles/objects.ss index c2b050b..78e49ad 100644 --- a/profiles/library-formation.ss +++ b/library/library-formation-profiles/objects.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later (import :clan/poo/object) @@ -31,7 +30,7 @@ project: "DE-CASE-01" intent: "reusable-library" project-inputs: '("gerbil.pkg" "projects/library-formation/init.ss" - "profiles/library-formation.ss" "project.sysml" + "library/library-formation-profiles/objects.ss" "project.sysml" "docs/10-19-design/10-architecture/10.107-implementation-progress-and-execution-gates.org") input-byte-limit: 1048576 input-lifetime-seconds: 60 diff --git a/library/library-formation-profiles/types.ss b/library/library-formation-profiles/types.ss new file mode 100644 index 0000000..2f9c202 --- /dev/null +++ b/library/library-formation-profiles/types.ss @@ -0,0 +1,12 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object + (only-in :clan/poo/mop define-type Object Type) + (only-in :clan/poo/type Record Exactly)) +(export ConfigType ScopeType) + +(define-type ConfigType (Record purpose: [(Exactly 'library-formation-profiles)])) +(define-type ScopeType + (.cc (Record config: [ConfigType] config-type: [Type] profiles: [Object]) + 'identity 'library-formation-profiles/scope)) diff --git a/library/project-formation/config.ss b/library/project-formation/config.ss new file mode 100644 index 0000000..debb452 --- /dev/null +++ b/library/project-formation/config.ss @@ -0,0 +1,8 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import + "./objects.ss") +(export + Config) +(def Config FormationSemantics) diff --git a/library/drivers/project-formation/func.ss b/library/project-formation/func.ss similarity index 98% rename from library/drivers/project-formation/func.ss rename to library/project-formation/func.ss index 899eff5..28dd74a 100644 --- a/library/drivers/project-formation/func.ss +++ b/library/project-formation/func.ss @@ -1,13 +1,12 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later (import :clan/poo/object (only-in :clan/poo/mop validate) :std/list/list :std/format - :gerbil-ascent/rules/interface + :gerbil-ascent/rules/func "./types.ss" (only-in :gerbil-ascent/rules/declaration rule-module-program rule-module-bindings)) (export diff --git a/library/drivers/project-formation/interface.ss b/library/project-formation/interface.ss similarity index 67% rename from library/drivers/project-formation/interface.ss rename to library/project-formation/interface.ss index fe70e4e..c5d7dd7 100644 --- a/library/drivers/project-formation/interface.ss +++ b/library/project-formation/interface.ss @@ -1,24 +1,25 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later (import (only-in :yuanxu/module-system/source/declaration .def)) (.def ProjectFormation identity: 'project-formation + tags: '(engineering driver organization) admissions: (.o Config: (.o - export-path: '(semantics) + export-path: '(config) contract-path: '(contracts config))) core: (.o requires: (.o Library: (.o module-id: 'project-organization - contract: OrganizationScopeContract)) - scope-contract: FormationScopeContract - exports: (.o + contract: (.get OrganizationScopeContract value-contract))) + scope-contract: (.get FormationScopeContract value-contract) + exports: (.o (:: module-scope) self: module-scope library: Library + config: Config semantics: Config contracts: (.o config: FormationConfigContract diff --git a/library/drivers/project-formation/objects.ss b/library/project-formation/objects.ss similarity index 72% rename from library/drivers/project-formation/objects.ss rename to library/project-formation/objects.ss index 5665785..ab32f6e 100644 --- a/library/drivers/project-formation/objects.ss +++ b/library/project-formation/objects.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later (import :clan/poo/object) diff --git a/library/drivers/project-formation/repository-input.schema.json b/library/project-formation/repository-input.schema.json similarity index 100% rename from library/drivers/project-formation/repository-input.schema.json rename to library/project-formation/repository-input.schema.json diff --git a/library/drivers/project-formation/repository-input.schema.json.license b/library/project-formation/repository-input.schema.json.license similarity index 99% rename from library/drivers/project-formation/repository-input.schema.json.license rename to library/project-formation/repository-input.schema.json.license index 2b7acd7..b6e69b7 100644 --- a/library/drivers/project-formation/repository-input.schema.json.license +++ b/library/project-formation/repository-input.schema.json.license @@ -1,3 +1,2 @@ SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors - SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/library/drivers/project-formation/types.ss b/library/project-formation/types.ss similarity index 93% rename from library/drivers/project-formation/types.ss rename to library/project-formation/types.ss index 72ef951..532e841 100644 --- a/library/drivers/project-formation/types.ss +++ b/library/project-formation/types.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Complete effective Module shape; Library definitions remain a dependency. (import @@ -10,7 +9,7 @@ (only-in :clan/poo/object-contract ObjectContract.) (only-in :yuanxu/object-types/contracts YuanxuContract. yuanxu-predicate-type) (only-in :gerbil-ascent/program/types GerbilAscentProgramContract) - "../../project-organization/types.ss") + "../project-organization/types.ss") (export OrganizationScopeContract FormationConfigContract @@ -52,6 +51,7 @@ (.o config: (selected-value 'formation/config-contract FormationConfigContract) scope: (selected-value 'formation/scope-contract FormationScopeContract))) + config: FormationConfigShape semantics: FormationConfigShape program: GerbilAscentProgramContract method-bindings: FormationBindingsShape @@ -72,6 +72,7 @@ ;; Validate their full relation and retain them; never normalize away those links. (define-type (FormationScopeType @ Type.) + identity: 'project-formation/scope .element?: associated? .validate: diff --git a/library/project-organization/config.ss b/library/project-organization/config.ss index b19bff5..7946a7c 100644 --- a/library/project-organization/config.ss +++ b/library/project-organization/config.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :clan/poo/object "objects.ss") diff --git a/library/project-organization/interface.ss b/library/project-organization/interface.ss index 2e908d0..a9cae0d 100644 --- a/library/project-organization/interface.ss +++ b/library/project-organization/interface.ss @@ -1,19 +1,20 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import (only-in :yuanxu/module-system/source/declaration .def)) (.def ProjectOrganizationLibrary identity: 'project-organization + tags: '(engineering domain organization) admissions: (.o Config: (.o export-path: '(config) contract-path: '(contracts config))) core: (.o requires: (.o) - scope-contract: OrganizationScopeContract - exports: (.o + scope-contract: (.get OrganizationScopeContract value-contract) + exports: (.o (:: scope) self: scope config: Config declaration: (.get scope config declaration) diff --git a/library/project-organization/objects.ss b/library/project-organization/objects.ss index 86ac88e..e61261e 100644 --- a/library/project-organization/objects.ss +++ b/library/project-organization/objects.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :clan/poo/object "types.ss") diff --git a/library/project-organization/types.ss b/library/project-organization/types.ss index c01979f..4762c1d 100644 --- a/library/project-organization/types.ss +++ b/library/project-organization/types.ss @@ -225,6 +225,7 @@ validation: (yuanxu-predicate-type 'library/value-closure closed?))))) (define-type (OrganizationScopeType @ LibraryScopeType.) + identity: 'project-organization/scope scope-shape: ScopeShape closed-shape: diff --git a/library/resource-lifecycle-profiles/config.ss b/library/resource-lifecycle-profiles/config.ss new file mode 100644 index 0000000..b2b0185 --- /dev/null +++ b/library/resource-lifecycle-profiles/config.ss @@ -0,0 +1,6 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object) +(export Config) +(def Config (.o purpose: 'resource-lifecycle-profiles)) diff --git a/library/resource-lifecycle-profiles/interface.ss b/library/resource-lifecycle-profiles/interface.ss new file mode 100644 index 0000000..8af17af --- /dev/null +++ b/library/resource-lifecycle-profiles/interface.ss @@ -0,0 +1,18 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def)) +(.def ProfileModule + identity: 'resource-lifecycle-profiles + tags: '(engineering profile) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(config-type))) + core: + (.o + requires: (.o) + scope-contract: ScopeType + exports: + (.o + config: Config + config-type: ConfigType + profiles: (.o LifecycleProfile LargerPayloadProfile))) + features: (.o)) diff --git a/profiles/resource-lifecycle.ss b/library/resource-lifecycle-profiles/objects.ss similarity index 86% rename from profiles/resource-lifecycle.ss rename to library/resource-lifecycle-profiles/objects.ss index beb2e8d..3b80219 100644 --- a/profiles/resource-lifecycle.ss +++ b/library/resource-lifecycle-profiles/objects.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- (import diff --git a/library/resource-lifecycle-profiles/types.ss b/library/resource-lifecycle-profiles/types.ss new file mode 100644 index 0000000..ac09d08 --- /dev/null +++ b/library/resource-lifecycle-profiles/types.ss @@ -0,0 +1,12 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object + (only-in :clan/poo/mop define-type Object Type) + (only-in :clan/poo/type Record Exactly)) +(export ConfigType ScopeType) + +(define-type ConfigType (Record purpose: [(Exactly 'resource-lifecycle-profiles)])) +(define-type ScopeType + (.cc (Record config: [ConfigType] config-type: [Type] profiles: [Object]) + 'identity 'resource-lifecycle-profiles/scope)) diff --git a/library/resource-lifetime/config.ss b/library/resource-lifetime/config.ss new file mode 100644 index 0000000..bb040a6 --- /dev/null +++ b/library/resource-lifetime/config.ss @@ -0,0 +1,7 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object "objects.ss") +(export Config) +(.def Config + entry: LifetimeModel) diff --git a/library/resource-lifetime/interface.ss b/library/resource-lifetime/interface.ss new file mode 100644 index 0000000..e0050e3 --- /dev/null +++ b/library/resource-lifetime/interface.ss @@ -0,0 +1,15 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def)) +(.def ResourceLifetime + identity: 'resource-lifetime + tags: '(engineering domain memory source-contract) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(contracts config))) + core: (.o + requires: (.o) + scope-contract: (.get CatalogScopeContract value-contract) + exports: (.o entry: (.get Config entry) + config: Config + contracts: (.o config: CatalogConfigContract))) + features: (.o)) diff --git a/library/resource-lifetime/objects.ss b/library/resource-lifetime/objects.ss new file mode 100644 index 0000000..2d0e910 --- /dev/null +++ b/library/resource-lifetime/objects.ss @@ -0,0 +1,19 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Ownership is generic; concrete holders and language semantics are Profile inputs. +(import :clan/poo/object) +(export LifetimeModel) + +(.def LifetimeModel + identity: 'memory.resource-lifetime + family: 'memory.resource-lifetime + parent: #f + revision: "1" + factor-implications: '() + rules: '((resource-transfer LIFE-BODY cbmc) + (native-lifetime LIFE-NATIVE native)) + dependencies: '((LIFE-BODY source) (LIFE-BODY profile) (LIFE-BODY method) + (LIFE-NATIVE source) (LIFE-NATIVE profile) (LIFE-NATIVE method)) + invariant: "Transfer preserves unique ownership; refusal preserves both owners; release is idempotent." + limits: "The initial Profile starts live counters at zero and checks bounded explicit transfer and normal destruction. External callers must keep counters live, preserve outstanding-token accounting and reserve increment headroom. Arbitrary caller admission, exceptions and concurrency are not proved.") diff --git a/library/resource-lifetime/types.ss b/library/resource-lifetime/types.ss new file mode 100644 index 0000000..4847195 --- /dev/null +++ b/library/resource-lifetime/types.ss @@ -0,0 +1,7 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object "../../types.ss") +(export CatalogConfigContract CatalogScopeContract) +(def CatalogConfigContract LibraryCatalogConfigContract) +(def CatalogScopeContract (library-catalog-scope-contract 'resource-lifetime/scope)) diff --git a/library/drivers/rust-resources/config.ss b/library/rust-resources/config.ss similarity index 59% rename from library/drivers/rust-resources/config.ss rename to library/rust-resources/config.ss index cd02472..f6ef20c 100644 --- a/library/drivers/rust-resources/config.ss +++ b/library/rust-resources/config.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Driver configuration receives admitted policies from its required model Library. (import :clan/poo/object) diff --git a/library/drivers/rust-resources/correspondence.ss b/library/rust-resources/correspondence.ss similarity index 98% rename from library/drivers/rust-resources/correspondence.ss rename to library/rust-resources/correspondence.ss index 91e1c5d..461d01e 100644 --- a/library/drivers/rust-resources/correspondence.ss +++ b/library/rust-resources/correspondence.ss @@ -1,6 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- ;;; Single-job observation mapping; synthesized states are abstract witnesses. diff --git a/library/drivers/rust-resources/interface.ss b/library/rust-resources/interface.ss similarity index 78% rename from library/drivers/rust-resources/interface.ss rename to library/rust-resources/interface.ss index c198029..767b3a0 100644 --- a/library/drivers/rust-resources/interface.ss +++ b/library/rust-resources/interface.ss @@ -1,11 +1,11 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- (import (only-in :yuanxu/module-system/source/declaration .def)) (.def RustResources identity: 'rust-resources + tags: '(engineering driver rust) admissions: (.o Config: (.o export-path: '(config) @@ -15,13 +15,13 @@ requires: (.o Parent: (.o module-id: 'backpressure-memory - contract: BackpressureScopeContract) + contract: (.get BackpressureScopeContract value-contract)) ModelLibrary: (.o module-id: 'backpressure-tokio-rayon - contract: TokioRayonScopeContract)) - scope-contract: RustResourcesScopeContract - exports: (.o - self: scope + contract: (.get TokioRayonScopeContract value-contract))) + scope-contract: (.get RustResourcesScopeContract value-contract) + exports: (.o (:: scope) + definitions: RustMethodDefinitions parent: Parent config: (.o (:: @ Config) coding-policy: (.get ModelLibrary config coding-policy) @@ -44,7 +44,5 @@ (method-ref (.get RustMethodDefinitions integration))) profile-contract: ResourceProfileContract native-profile-contract: ResourceNativeProfileContract - context-contract: ResourceNativeContextContract - bound-methods: (bind-resource-methods RustMethodDefinitions) - methods: (.get scope bound-methods operations))) +)) features: (.o)) diff --git a/library/drivers/rust-resources/objects.ss b/library/rust-resources/objects.ss similarity index 85% rename from library/drivers/rust-resources/objects.ss rename to library/rust-resources/objects.ss index 42c3e69..9565981 100644 --- a/library/drivers/rust-resources/objects.ss +++ b/library/rust-resources/objects.ss @@ -1,18 +1,17 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; Tool method declarations; authored domain meaning lives in the Library. (import :clan/poo/object "types.ss" - "../../concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - (only-in "../../concurrency/resource-control/backpressure-memory/abstract/types.ss" BackpressureDeclarationContract)) + "../backpressure-tokio-rayon/objects.ss" + (only-in "../backpressure-memory/types.ss" BackpressureDeclarationContract)) (export RustMethodDefinitions method-ref) ;; Each operation has an authored contract and complete required input classes. ;; Capturing those classes and their actual origins is a later operation boundary. (.def ResourceMethod. operation: (error "Resource method requires an explicit operation") identity: (string->symbol (string-append "rust.resources." (symbol->string operation))) - revision: "resource-method-observation" + revision: "resource-method-declaration/v1" owner: 'rust-resources role: 'method family: 'concurrency.resource-control.backpressure-memory @@ -44,12 +43,12 @@ catalog-ref: #f mapping-ref: #f) (.def ResourceMethodAsset. - revision: "resource-method-observation" + revision: "resource-method-declaration/v1" owner: 'rust-resources) (.def (MethodObserverAsset @ ResourceMethodAsset.) identity: 'observer kind: 'scheme - relative-path: "methods.ss") + relative-path: "objects.ss") (def RustMethodDefinitions (.o native: (.o (:: @ ResourceMethod.) @@ -61,7 +60,7 @@ identity: 'native-subject owner: 'rust-resource-lifecycle kind: 'rust - relative-path: "../../../languages-engineering/rust/concurrency/resource-control/backpressure-memory/src/main.rs") + relative-path: "../../languages-engineering/rust/concurrency/resource-control/backpressure-memory/src/main.rs") MethodObserverAsset (.o (:: @ ResourceMethodAsset.) identity: 'oracle @@ -76,7 +75,7 @@ identity: 'ownership-model owner: 'backpressure-memory kind: 'quint - relative-path: "../../concurrency/resource-control/backpressure-memory/model.qnt") + relative-path: "../backpressure-memory/model.qnt") MethodObserverAsset)) lean: (.o (:: @ ResourceMethod.) operation: 'lean @@ -87,7 +86,7 @@ identity: 'budget-proof owner: 'backpressure-memory kind: 'lean - relative-path: "../../concurrency/resource-control/backpressure-memory/budget.lean") + relative-path: "../backpressure-memory/budget.lean") MethodObserverAsset)) integration: (.o (:: @ ResourceMethod.) operation: 'integration diff --git a/library/drivers/rust-resources/types.ss b/library/rust-resources/types.ss similarity index 54% rename from library/drivers/rust-resources/types.ss rename to library/rust-resources/types.ss index a77a5c4..b192b93 100644 --- a/library/drivers/rust-resources/types.ss +++ b/library/rust-resources/types.ss @@ -1,24 +1,23 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later ;;; -*- Gerbil -*- (import :clan/poo/object - (only-in :clan/poo/mop Type Type. Any Function define-type element? raise-type-error) + (only-in :clan/poo/mop Type Type. Any Object Function define-type element? raise-type-error) (only-in :clan/poo/recursive-validation close-validation closed? closed-ref) (only-in :yuanxu/object-types/contracts YuanxuContract. yuanxu-predicate-contract yuanxu-predicate-type) - (only-in :clan/poo/type String Symbol List) + (only-in :clan/poo/type String Symbol List Record) (only-in :std/list/list duplicates) (only-in :clan/poo/object-contract ObjectContract. refine) - "../../../types.ss" - "../../concurrency/resource-control/backpressure-memory/tokio-rayon/types.ss" + "../../types.ss" + "../backpressure-tokio-rayon/types.ss" (only-in - "../../concurrency/resource-control/backpressure-memory/abstract/types.ss" + "../backpressure-memory/types.ss" BackpressureScopeContract BackpressureDeclarationContract BackpressureModelContract @@ -380,214 +379,21 @@ quint: (.get ResourceMethodDefinitionContract value-contract) lean: (.get ResourceMethodDefinitionContract value-contract) integration: (.get ResourceMethodDefinitionContract value-contract)))) -(def MethodsShape - (.cc ObjectContract. 'responsibilities - (foldl - (lambda (key fields) - (.cc fields key (yuanxu-predicate-type 'rust-resources/deferred-operation procedure?))) - (.o) - method-keys))) -(def (method-binding-shape key signature-value) - (.cc LibraryMethodBindingShape 'responsibilities - (.+ - (.get LibraryMethodBindingShape responsibilities) - (.o - definition: (.get ResourceMethodDefinitionContract value-contract) - provider: (same-type 'rust-resources/method-provider 'rust-resources) - operation-name: (same-type 'rust-resources/operation-name key) - operation: signature-value)))) -(def BoundMethodsShape - (.cc ObjectContract. 'responsibilities - (.o - definitions: ResourceMethodDefinitionsShape - operations: MethodsShape - bindings: (.cc ObjectContract. 'responsibilities - (.o - native: (method-binding-shape 'native ResourceNativeSignature) - quint: (method-binding-shape 'quint ResourceQuintSignature) - lean: (method-binding-shape 'lean ResourceLeanSignature) - integration: (method-binding-shape 'integration ResourceIntegrationSignature)))))) -(def BoundMethodsType - (yuanxu-predicate-type - 'rust-resources/bound-methods - (lambda (v) - (and - (element? BoundMethodsShape v) - (andmap - (lambda (key) - (and - (eq? (.get (.ref (.get v bindings) key) definition) (.ref (.get v definitions) key)) - (eq? (.get (.ref (.get v bindings) key) operation) (.ref (.get v operations) key)))) - '(native quint lean integration)))))) -(def RustScopeShape - (.cc ObjectContract. 'responsibilities - (.o - contracts: (.cc ObjectContract. 'responsibilities - (.o - scope: (same-type 'rust-resources/scope-contract RustResourcesScopeContract) - config: (same-type 'rust-resources/config-contract RustResourcesConfigContract) - model: (same-type 'rust-resources/model-contract RustResourceModelContract) - integration: (same-type 'rust-resources/integration-contract BackpressureIntegrationContract) - coding-policy: (same-type 'rust-resources/coding-policy-contract BackpressureReviewPolicyContract) - design-policy: (same-type 'rust-resources/design-policy-contract BackpressureDesignReviewPolicyContract))) - parent: (.get BackpressureScopeContract value-contract) - model-library: (.get TokioRayonScopeContract value-contract) - config: RustResourcesConfigShape - entry: (.get RustResourceModelContract value-contract) - integration-entry: (.get BackpressureIntegrationContract value-contract) - policies: PolicySelectionShape - profile-contract: (same-type 'rust-resources/profile-contract ResourceProfileContract) - native-profile-contract: (same-type 'rust-resources/native-profile-contract ResourceNativeProfileContract) - context-contract: (same-type 'rust-resources/context-contract ResourceNativeContextContract) - bound-methods: BoundMethodsType - methods: MethodsShape))) -(def ClosedRustScopeShape - (.cc RustScopeShape 'responsibilities - (.+ - (.get RustScopeShape responsibilities) - (.o - validation: (yuanxu-predicate-type 'rust-resources/finite-value-closure closed?))))) -(def (method-reference-matches? reference definition) - (and - (eq? (.get reference identity) (.get definition identity)) - (equal? (.get reference revision) (.get definition revision)) - (eq? (.get reference owner) (.get definition owner)))) -(def (method-model-links? scope-value) - (def definitions (.get scope-value bound-methods definitions)) - (def policies - (list (.get scope-value policies coding identity) (.get scope-value policies design identity))) - (and - (andmap - (lambda (key) - (def definition (.ref definitions key)) - (def selected-models - (case - key - ((native) (list (.get scope-value entry))) - ((integration) (list (.get scope-value integration-entry))) - (else (list (.get scope-value parent entry) (.get scope-value entry))))) - (def obligations - (apply - append - (map - (lambda (model) - (append (map cadr (.get model rules)) (map (cut .get <> identity) (.get model claims)))) - selected-models))) - (and - (equal? (.get definition model-ids) (map (cut .get <> identity) selected-models)) - (andmap (cut memq <> obligations) (.get definition claims)) - (equal? (.get definition policy-ids) policies) - (find - (cut method-reference-matches? <> definition) - (.get scope-value integration-entry method-refs)))) - '(native quint lean integration)) - (let (definition (.get definitions integration)) - (and - (method-reference-matches? - (.get definition catalog-ref) - (.get scope-value integration-entry catalog)) - (method-reference-matches? - (.get definition mapping-ref) - (.get scope-value integration-entry mapping)))))) -(def (associated-rust-scope? value) - (and - (method-model-links? value) - (eq? (.get value parent) (.get value model-library parent)) - (eq? (.get value config coding-policy) (.get value model-library config coding-policy)) - (eq? (.get value config design-policy) (.get value model-library config design-policy)) - (eq? (.get value methods) (.get value bound-methods operations)) - (eq? (.get value entry parent) (.get value parent entry)) - (eq? (.get value integration-entry parent) (.get value entry)) - (eq? (.get value config coding-policy) (.get value policies coding)) - (eq? (.get value config design-policy) (.get value policies design)))) -(def (closed-rust-scope? value) - (and - (element? ClosedRustScopeShape value) - (associated-rust-scope? value) - (let (graph (.get value validation)) - (and - (eq? (.get value entry) (closed-ref graph 'entry)) - (eq? (.get value integration-entry) (closed-ref graph 'integration)) - (eq? (.get value config) (closed-ref graph 'config)) - (eq? (.get value policies) (closed-ref graph 'policies)) - (eq? (.get value bound-methods) (closed-ref graph 'bound-methods)))))) -(define-type - (RustScopeType @ Type.) - .element?: - (lambda (value) - (if (and (object? value) (.slot? value 'validation)) - (closed-rust-scope? value) - (and (element? RustScopeShape value) (associated-rust-scope? value)))) - .validate: - (lambda (value) - (if (and (object? value) (.slot? value 'validation)) - (begin (unless (closed-rust-scope? value) (raise-type-error @ value)) value) - (let () - (unless (and (element? RustScopeShape value) (associated-rust-scope? value)) - (raise-type-error @ value)) - ;; Parent SD belongs to Core. It anchors this finite local closure; it is - ;; never transplanted into another close-validation graph or normalized again. - (def inherited-scope (.get value parent)) - (def graph - (close-validation - (lambda (reference) - (def entry-type (.get RustResourceModelContract value-contract)) - (def integration-type (.get BackpressureIntegrationContract value-contract)) - (list - (list - 'bound-methods - (.cc ObjectContract. 'responsibilities - (.o - definitions: (same-type 'rust-resources/definitions (.get value bound-methods definitions)) - bindings: (same-type 'rust-resources/bindings (.get value bound-methods bindings)) - operations: (same-type 'rust-resources/operations (.get value bound-methods operations)))) - (.get value bound-methods)) - (list - 'entry - (.cc entry-type 'responsibilities - (.+ - (.get entry-type responsibilities) - (.o - parent: (same-type 'rust-resources/external-parent (.get inherited-scope entry))))) - (.get value entry)) - (list - 'integration - (.cc integration-type 'responsibilities - (.+ - (.get integration-type responsibilities) - (.o - parent: (reference 'entry)))) - (.get value integration-entry)) - ;; Model-owned policies are external anchors, like the Parent Scope. - ;; Only driver-owned Config/selection nodes join this finite graph. - (list - 'config - (.cc RustResourcesConfigShape 'responsibilities - (.+ - (.get RustResourcesConfigShape responsibilities) - (.o - coding-policy: (same-type 'rust-resources/model-coding-policy - (.get value model-library config coding-policy)) - design-policy: (same-type 'rust-resources/model-design-policy - (.get value model-library config design-policy))))) - (.o - purpose: (.get value config purpose) - coding-policy: (.get value policies coding) - design-policy: (.get value policies design))) - (list - 'policies - (.cc ObjectContract. 'responsibilities - (.o - coding: (same-type 'rust-resources/model-coding-policy - (.get value model-library config coding-policy)) - design: (same-type 'rust-resources/model-design-policy - (.get value model-library config design-policy)))) - (.o - coding: (.get value policies coding) - design: (.get value policies design))))) - 5)) - (.cc value 'entry (closed-ref graph 'entry) 'integration-entry (closed-ref graph 'integration) - 'config (closed-ref graph 'config) 'policies (closed-ref graph 'policies) - 'bound-methods (closed-ref graph 'bound-methods) 'validation graph))))) + +;; The public Module supplies declarations and specialization, not a tool Runtime. +(define-type RustMethodScopeType + (.cc + (Record config: [(.get RustResourcesConfigContract value-contract)] + contracts: [Object] + definitions: [ResourceMethodDefinitionsShape] + parent: [Object] + model-library: [Object] + policies: [PolicySelectionShape] + entry: [(.get RustResourceModelContract value-contract)] + integration-entry: [(.get BackpressureIntegrationContract value-contract)] + profile-contract: [Type] + native-profile-contract: [Type]) + 'identity 'rust-resources/declaration-scope)) (def RustResourcesScopeContract - (.cc YuanxuContract. 'identity 'rust-resources/scope 'value-contract RustScopeType)) + (.cc YuanxuContract. 'identity 'rust-resources/scope + 'value-contract RustMethodScopeType)) diff --git a/library/source-contract-profiles/config.ss b/library/source-contract-profiles/config.ss new file mode 100644 index 0000000..3d9eb42 --- /dev/null +++ b/library/source-contract-profiles/config.ss @@ -0,0 +1,8 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object + (prefix-in "../../config.ss" program-)) +(export Config) + +(.def (Config @ program-Config)) diff --git a/library/source-contract-profiles/interface.ss b/library/source-contract-profiles/interface.ss new file mode 100644 index 0000000..bdaff47 --- /dev/null +++ b/library/source-contract-profiles/interface.ss @@ -0,0 +1,30 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def) + (only-in :yuanxu/configuration/json config-defaults) + (only-in :clan/poo/mop validate)) +(.def ProfileModule + identity: 'source-contract-profiles + tags: '(engineering profile source-contract) + admissions: (.o Config: (.o export-path: '(config) contract-path: '(config-type))) + core: + (.o + requires: (.o Driver: (.o module-id: 'source-contracts)) + scope-contract: ScopeType + exports: + (.o + config: Config + config-type: ConfigType + configure: (lambda (overrides) (validate ConfigType (config-defaults config overrides))) + plan-library: Driver + profiles: (source-contract-profiles (.get Driver strategies)) + languages: + (.o + c: + (configured-language Driver profiles (.get Driver strategies c11) + (.get config programs deterministic-engineering languages c)) + cpp: + (configured-language Driver profiles (.get Driver strategies cpp11) + (.get config programs deterministic-engineering languages cpp))))) + features: (.o)) diff --git a/library/source-contract-profiles/objects.ss b/library/source-contract-profiles/objects.ss new file mode 100644 index 0000000..96258e4 --- /dev/null +++ b/library/source-contract-profiles/objects.ss @@ -0,0 +1,102 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Profiles consume strategies from the selected native owner, not a second import. +(import :clan/poo/object + (only-in :clan/poo/mop validate)) +(export source-contract-profiles configured-language) + +(def (source-contract-profiles selected-strategies) + (def capacity-base + (.o + identity: 'c-capacity-body + language: (.get selected-strategies c11) + executor: (.get selected-strategies cbmc) + obligation: 'CAP-BODY + factor: 'checked-capacity + method: (.get executor method) + function: "capacity_harness" + enforce: "" + instrumentation: (.get selected-strategies direct) + units: '("languages-engineering/c/numeric/bounded-capacity/capacity.c" + "languages-engineering/c/numeric/bounded-capacity/parser.c" + "languages-engineering/c/numeric/bounded-capacity/pool.c" + "languages-engineering/c/numeric/bounded-capacity/proof.c") + inputs: (cons "languages-engineering/c/numeric/bounded-capacity/capacity.h" units) + expected-properties: '("capacity.result" "capacity.output-and-failure-frame"))) + (def lifetime-base + (.o + identity: 'cpp-lifetime + language: (.get selected-strategies cpp11) + executor: (.get selected-strategies cbmc) + obligation: 'LIFE-BODY + factor: 'resource-transfer + method: (.get executor method) + function: "lifetime_harness" + enforce: "" + instrumentation: (.get selected-strategies direct) + units: '("languages-engineering/cpp/memory/resource-lifetime/proof.cpp") + inputs: (cons "languages-engineering/cpp/memory/resource-lifetime/slot.hpp" units) + expected-properties: '("owner.acquired" "owner.unique-after-transfer" + "owner.occupied-refusal" "owner.idempotent-release" + "owner.inner-destruction" "owner.outer-destruction" + "owner.occupied-preserves-both" "owner.self-refusal" + "owner.distinct-counter-destruction" "owner.empty-transfer"))) + (.o + capacity-body: capacity-base + capacity-contract: + (.o (:: @ capacity-base) + identity: 'c-capacity-contract + function: "contract_harness" + enforce: "capacity_total" + instrumentation: (.get selected-strategies enforce) + expected-properties: + '("Check ensures clause of contract contract::capacity_total for function capacity_total")) + capacity-callers: + (.o (:: @ capacity-base) + identity: 'c-capacity-callers + obligation: 'CAP-CALLER + factor: 'capacity-client + function: "callers_harness" + enforce: "capacity_total" + instrumentation: (.get selected-strategies replace) + expected-properties: '("parser.admission" "pool.admission")) + capacity-native: + (.o (:: @ capacity-base) + identity: 'c-capacity-native + obligation: 'CAP-NATIVE + factor: 'native-capacity + executor: (.get selected-strategies native) + units: '("languages-engineering/c/numeric/bounded-capacity/capacity.c" + "languages-engineering/c/numeric/bounded-capacity/parser.c" + "languages-engineering/c/numeric/bounded-capacity/pool.c" + "languages-engineering/c/numeric/bounded-capacity/native-test.c") + expected-properties: '()) + lifetime-body: lifetime-base + lifetime-native: + (.o (:: @ lifetime-base) + identity: 'cpp-lifetime-native + obligation: 'LIFE-NATIVE + factor: 'native-lifetime + executor: (.get selected-strategies native) + units: '("languages-engineering/cpp/memory/resource-lifetime/native-test.cpp") + expected-properties: '()))) + +;; Select an existing Profile and derive its method scope from final language values. +(def (configured-language method profiles language configuration) + (def name (.get configuration settings profile)) + (unless (.slot? profiles name) + (error "unknown engineering Profile" name)) + (def selected (.ref profiles name)) + (unless (eq? (.get selected language identity) (.get language identity)) + (error "engineering Profile belongs to another language" name)) + (.o + config: configuration + profile: selected + plan-library: + (validate (.get method contracts scope) + (.cc method + 'config + (.call method configure + (.o enable: (.get configuration enable) + settings: (.o timeout: (.get configuration settings timeout)))))))) diff --git a/library/source-contract-profiles/types.ss b/library/source-contract-profiles/types.ss new file mode 100644 index 0000000..f0171d2 --- /dev/null +++ b/library/source-contract-profiles/types.ss @@ -0,0 +1,38 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object + (only-in :clan/poo/mop define-type Object Type Bool Function) + (only-in :clan/poo/type Record Symbol) + (only-in "../source-contracts/types.ss" SourceContractPolicyShape)) +(export ConfigType ScopeType) + +(define-type + (LanguageSettings @ + (Record profile: [Symbol] + timeout: [(.get SourceContractPolicyShape slots timeout type)])) + sealed: #t) +(define-type + (LanguageConfig @ (Record enable: [Bool] settings: [LanguageSettings])) + sealed: #t) +(define-type + (Languages @ (Record c: [LanguageConfig] cpp: [LanguageConfig])) + sealed: #t) +(define-type + (EngineeringProgram @ (Record languages: [Languages])) + sealed: #t) +(define-type + (Programs @ (Record deterministic-engineering: [EngineeringProgram])) + sealed: #t) +(define-type + (ConfigType @ (Record programs: [Programs])) + sealed: #t) +(define-type ScopeType + (.cc + (Record config: [ConfigType] + config-type: [Type] + configure: [(Function (list ConfigType) (list Object))] + plan-library: [Object] + profiles: [Object] + languages: [Object]) + 'identity 'source-contract-profiles/scope)) diff --git a/library/source-contracts/config.ss b/library/source-contracts/config.ss new file mode 100644 index 0000000..9721b75 --- /dev/null +++ b/library/source-contracts/config.ss @@ -0,0 +1,25 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; The maintained functional configuration; consumers assign Config values. +(import :clan/poo/object + (only-in :clan/poo/mop validate) + (only-in :yuanxu/configuration/json config-defaults) + "types.ss") +(export Config resolve-config) + +(.def Config + enable: #t + settings: + (.o + timeout: 45 + safety-flags: + '("--bounds-check" "--pointer-check" + "--signed-overflow-check" "--unsigned-overflow-check" + "--unwinding-assertions" "--unwind" "8"))) + +;; Native composition supplies defaults; Examples contain only assigned values. +(def (resolve-config defaults overrides) + (def base (validate SourceContractConfig defaults)) + (def assigned (validate SourceContractConfigOverrides overrides)) + (validate SourceContractConfig (config-defaults base assigned))) diff --git a/library/source-contracts/func.ss b/library/source-contracts/func.ss new file mode 100644 index 0000000..b78d6ad --- /dev/null +++ b/library/source-contracts/func.ss @@ -0,0 +1,6 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; The native func role publishes declarative generic methods only. +(import "methods.ss") +(export (import: "methods.ss")) diff --git a/library/source-contracts/interface.ss b/library/source-contracts/interface.ss new file mode 100644 index 0000000..cf8c71f --- /dev/null +++ b/library/source-contracts/interface.ss @@ -0,0 +1,35 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import (only-in :yuanxu/module-system/source/declaration .def)) +(.def SourceContracts + identity: 'source-contracts + tags: '(engineering method verification source-contract) + admissions: + (.o Config: (.o export-path: '(config) contract-path: '(config-type))) + core: + (.o + requires: (.o) + scope-contract: SourceContractScopeType + exports: + (.o + config: Config + config-type: SourceContractConfig + configure: (lambda (overrides) (resolve-config config overrides)) + strategies: + (.o cbmc: CbmcExecutor. + native: NativeExecutor. + c11: C11Language. + cpp11: Cpp11Language. + direct: DirectContract. + enforce: CheckedContract. + replace: ReplacedContract.) + scenario: SourceContractScenario. + plan: (lambda (executor profile) (contract-plan config executor profile)) + contracts: + (.o scope: SourceContractScopeType + scenario: SourceContractScenario + profile: SourceContractProfile + tools: SourceContractTools + plan: SourceContractPlan))) + features: (.o)) diff --git a/library/source-contracts/methods.ss b/library/source-contracts/methods.ss new file mode 100644 index 0000000..c122c40 --- /dev/null +++ b/library/source-contracts/methods.ss @@ -0,0 +1,92 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Pure verification-plan declarations. Consumers own execution and evidence issuance. +(import + :clan/poo/object + (only-in :clan/poo/mop validate) + (only-in :yuanxu/poo-clos/generic-syntax .defgeneric .defmethod) + "types.ss" + "objects.ss") +(export contract-plan) + +(.defgeneric verification-steps (executor profile policy)) +(.defgeneric instrumentation-steps (instrumentation profile)) + +(.defmethod (instrumentation-steps + (instrumentation (prototype DirectContract.)) profile) + (.o steps: '() solver-inputs: '(sources))) + +;; Replacement inherits this method; its native prototype supplies the option. +(.defmethod (instrumentation-steps + (instrumentation (prototype CheckedContract.)) profile) + (.o + steps: + (list + (.o tool: 'goto-cc + arguments: (list "-D__CPROVER" "--function" (.get profile function) + "-o" 'raw-module 'sources) + expected: 'zero + artifacts: '(raw-module)) + (.o tool: 'goto-instrument + arguments: (list "--dfcc" (.get profile function) + (.get instrumentation option) (.get profile enforce) + 'raw-module 'checked-module) + expected: 'zero + artifacts: '(checked-module))) + solver-inputs: '(checked-module))) + +(.defmethod (verification-steps (executor (prototype CbmcExecutor.)) profile policy) + (def preparation + (instrumentation-steps (.get profile instrumentation) profile)) + (append + (.get preparation steps) + (list + (.o tool: 'cbmc + arguments: + (append (.get preparation solver-inputs) + (.get profile language verifier-flags) + (list "--function" (.get profile function) "--json-ui") + (.get policy safety-flags)) + expected: 'solver + artifacts: '())))) + +(.defmethod (verification-steps (executor (prototype NativeExecutor.)) profile policy) + (list + (.o tool: (.get profile language compiler-key) + arguments: (list (.get profile language native-standard) + "-Wall" "-Wextra" "-Werror" "-o" 'native-binary 'sources) + expected: 'zero + artifacts: '(native-binary)) + (.o tool: 'native-binary + arguments: '() + expected: 'zero + artifacts: '()))) + +(def (contract-plan configuration executor profile) + (def selected-config (validate SourceContractConfig configuration)) + (unless (.get selected-config enable) + (error "source-contract capability is disabled; no plan issued")) + (def selected-policy (.get selected-config settings)) + (def selected-profile (validate SourceContractProfile profile)) + (unless (eq? (.get selected-profile method) (.get executor method)) + (error "Profile and executor declare different methods")) + (unless (eq? (.get selected-profile instrumentation requires-function?) + (not (string=? (.get selected-profile enforce) ""))) + (error "Profile and instrumentation declare different function boundaries")) + (.o + kind: 'verification-plan + obligation: (.get selected-profile obligation) + method: (.get selected-profile method) + timeout: (.get selected-policy timeout) + steps: (verification-steps executor selected-profile selected-policy) + external-tools: + (foldr + (lambda (tool names) + (if (or (eq? tool 'native-binary) (memq tool names)) + names + (cons tool names))) + '() + (map (lambda (step) (.get step tool)) steps)) + expected-properties: (.get selected-profile expected-properties) + boundary: "A plan declares checks; it neither executes tools nor issues evidence or authority.")) diff --git a/library/source-contracts/objects.ss b/library/source-contracts/objects.ss new file mode 100644 index 0000000..6b8283e --- /dev/null +++ b/library/source-contracts/objects.ss @@ -0,0 +1,44 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :clan/poo/object) +(export CbmcExecutor. NativeExecutor. C11Language. Cpp11Language. + DirectContract. CheckedContract. ReplacedContract. SourceContractScenario.) + +;; Pure strategy descriptors. Methods specialize their prototype ancestry. +(.def CbmcExecutor. + identity: 'cbmc + method: 'cbmc + requires-properties?: #t) +(.def NativeExecutor. + identity: 'native + method: 'native + requires-properties?: #f) +(.def C11Language. + identity: 'c11 + compiler-key: 'cc + native-standard: "-std=c11" + verifier-flags: '("--c11")) +(.def Cpp11Language. + identity: 'cpp11 + compiler-key: 'cxx + native-standard: "-std=c++11" + verifier-flags: '("--cpp11")) +(.def DirectContract. + identity: 'direct + option: "" + requires-function?: #f) +(.def CheckedContract. + identity: 'enforce + option: "--enforce-contract" + requires-function?: #t) +(.def (ReplacedContract. @ CheckedContract.) + identity: 'replace + option: "--replace-call-with-contract") + +;; A Scenario binds domain meaning and a Profile to a source location. It is +;; declarative data; source capture, tools and issued observations belong to Host. +(.def SourceContractScenario. + root: (error "The consuming project supplies its source directory") + entry: (error "Select a domain Catalog leaf") + profile: (error "Select the language Profile")) diff --git a/library/source-contracts/types.ss b/library/source-contracts/types.ss new file mode 100644 index 0000000..10482e0 --- /dev/null +++ b/library/source-contracts/types.ss @@ -0,0 +1,160 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Public value contracts describe inputs and plans; none grants execution rights. +(import + :clan/poo/object + (only-in :clan/poo/mop define-type Any Object Function Type Type. Bool) + (only-in :clan/poo/type Record Symbol String List Exactly Or) + (only-in "../../types.ss" LibraryNonemptyString LibraryRuleCatalogShape)) +(export SourceContractProfile SourceContractTools SourceContractPlan + SourceContractPolicyShape SourceContractConfig SourceContractConfigOverrides + SourceContractScopeType SourceContractScenario) + +(define-type + (SourceLanguage @ + (Record identity: [Symbol] + compiler-key: [Symbol] + native-standard: [LibraryNonemptyString] + verifier-flags: [(List LibraryNonemptyString)])) + sealed: #t) + +(define-type + (SourceExecutor @ + (Record identity: [Symbol] + method: [Symbol] + requires-properties?: [Bool])) + sealed: #t) + +(define-type + (SourceInstrumentation @ + (Record identity: [Symbol] + option: [String] + requires-function?: [Bool])) + sealed: #t) + +(define-type + (SourceContractProfile @ + (Record identity: [Symbol] + language: [SourceLanguage] + executor: [SourceExecutor] + obligation: [Symbol] + factor: [Symbol] + method: [Symbol] + function: [LibraryNonemptyString] + enforce: [String] + instrumentation: [SourceInstrumentation] + units: [(List LibraryNonemptyString)] + inputs: [(List LibraryNonemptyString)] + expected-properties: [(List LibraryNonemptyString)])) + sealed: #t) + +;; Pure finite binding checks belong to the Library, not an execution adapter. +(def (scenario-binding-diagnostics value location) + (def profile (.get value profile)) + (def entry (.get value entry)) + (filter-map + (lambda (check) + (and (not (cdr check)) (.o kind: (car check) path: location))) + (list + (cons 'scenario/method-agreement + (eq? (.get profile method) (.get profile executor method))) + (cons 'scenario/instrumentation-boundary + (eq? (.get profile instrumentation requires-function?) + (not (string=? (.get profile enforce) "")))) + (cons 'scenario/catalog-obligation + (member (list (.get profile factor) (.get profile obligation) (.get profile method)) + (.get entry rules))) + (cons 'scenario/nonempty-capture + (and (pair? (.get profile units)) (pair? (.get profile inputs)) + (or (not (.get profile executor requires-properties?)) + (pair? (.get profile expected-properties))))) + (cons 'scenario/unit-closure + (andmap (lambda (unit) (member unit (.get profile inputs))) + (.get profile units)))))) + +(define-type + (SourceContractScenario @ + (Record root: [LibraryNonemptyString] + entry: [LibraryRuleCatalogShape] + profile: [SourceContractProfile])) + .element?: => + (lambda (inherited) + (lambda (value) + (and (inherited value) (null? (scenario-binding-diagnostics value '()))))) + sealed: #t) + +;; Tool locations are an external consumer's input contract, not discovered here. +(define-type + (SourceContractTools @ + (Record cbmc: [LibraryNonemptyString] + goto-cc: [LibraryNonemptyString] + goto-instrument: [LibraryNonemptyString] + cc: [LibraryNonemptyString] + cxx: [LibraryNonemptyString])) + sealed: #t) + +(define-type + (VerificationStep @ + (Record tool: [Symbol] + arguments: [(List (Or String Symbol))] + expected: [(Or (Exactly 'zero) (Exactly 'solver))] + artifacts: [(List Symbol)])) + sealed: #t) + +(define-type (SourceCommandTimeout @ Type.) + .element?: (lambda (value) + (and (exact-integer? value) (<= 1 value 45)))) + +(define-type + (SourceContractPlan @ + (Record kind: [(Exactly 'verification-plan)] + obligation: [Symbol] + method: [Symbol] + timeout: [SourceCommandTimeout] + steps: [(List VerificationStep)] + external-tools: [(List Symbol)] + expected-properties: [(List LibraryNonemptyString)] + boundary: [LibraryNonemptyString])) + sealed: #t) + +(define-type + (SourceContractPolicyShape @ + (Record timeout: [SourceCommandTimeout] + safety-flags: + [(Exactly '("--bounds-check" "--pointer-check" + "--signed-overflow-check" "--unsigned-overflow-check" + "--unwinding-assertions" "--unwind" "8"))])) + sealed: #t) + +(define-type + (SourceContractConfig @ + (Record enable: [Bool] + settings: [SourceContractPolicyShape])) + sealed: #t) + +(define-type + (SourceContractSettingsOverrides @ + (Record timeout: [SourceCommandTimeout optional: #t] + safety-flags: + [(.get SourceContractPolicyShape slots safety-flags type) optional: #t])) + sealed: #t) + +(define-type + (SourceContractConfigOverrides @ + (Record enable: [Bool optional: #t] + settings: [SourceContractSettingsOverrides optional: #t])) + sealed: #t) + +(define-type SourceContractScopeType + (.cc + (Record config: [SourceContractConfig] + config-type: [Type] + configure: [(Function (list SourceContractConfig) + (list SourceContractConfigOverrides))] + strategies: [Object] + scenario: [Object] + plan: [(Function (list SourceContractPlan) + (list Object SourceContractProfile))] + contracts: [Object]) + 'identity 'source-contracts/scope)) diff --git a/observation/BackpressureOwners.qnt b/observation/BackpressureOwners.qnt new file mode 100644 index 0000000..8fd0f87 --- /dev/null +++ b/observation/BackpressureOwners.qnt @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +// Project-owned bounded abstraction; no Rust scheduler or allocation claim. +module BackpressureOwners { + type State = { + limit: int, queueLimit: int, admitted: Set[int], queued: Set[int], running: Set[int], + returned: Set[int], cleanup: Set[int], done: Set[int] + } + var s: State + pure val jobs = Set(0, 1, 2, 3, 4) + pure def initial: State = { + limit: 2, queueLimit: 2, admitted: Set(), queued: Set(), running: Set(), + returned: Set(), cleanup: Set(), done: Set() + } + action init = s' = initial + action initResource = s' = { ...initial, limit: 1, queueLimit: 1 } + action initResourceRunning = s' = { ...initial, limit: 1, queueLimit: 1, admitted: Set(0), running: Set(0) } + action initC2 = s' = { ...initial, limit: 4 } + action initRunning = s' = { ...initial, admitted: Set(0), running: Set(0) } + val owners = s.queued.union(s.running).union(s.returned).union(s.cleanup) + val safe = all { + owners == s.admitted, + s.admitted.size() <= s.limit, + s.queued.size() <= s.queueLimit, + s.queued.intersect(s.running).size() == 0, + s.queued.intersect(s.returned).size() == 0, + s.queued.intersect(s.cleanup).size() == 0, + s.running.intersect(s.returned).size() == 0, + s.running.intersect(s.cleanup).size() == 0, + s.returned.intersect(s.cleanup).size() == 0, + s.done.intersect(owners).size() == 0 + } + val hasCleanup = s.cleanup.size() > 0 + val hasReturned = s.returned.size() > 0 + val allDone = s.done == jobs + action admit = { + nondet j = jobs.oneOf() + all { not(owners.contains(j)), not(s.done.contains(j)), + s.admitted.size() < s.limit, s.queued.size() < s.queueLimit, + s' = { ...s, admitted: s.admitted.union(Set(j)), queued: s.queued.union(Set(j)) } } + } + action start = { + nondet j = jobs.oneOf() + all { s.queued.contains(j), s' = { ...s, + queued: s.queued.exclude(Set(j)), running: s.running.union(Set(j)) } } + } + action finish = { + nondet j = jobs.oneOf() + all { s.running.contains(j), s' = { ...s, + running: s.running.exclude(Set(j)), returned: s.returned.union(Set(j)) } } + } + action cancel = { + nondet j = jobs.oneOf() + all { s.running.contains(j), s' = { ...s, + running: s.running.exclude(Set(j)), cleanup: s.cleanup.union(Set(j)) } } + } + action drain = { + nondet j = jobs.oneOf() + all { s.returned.contains(j), s' = { ...s, + returned: s.returned.exclude(Set(j)), admitted: s.admitted.exclude(Set(j)), + done: s.done.union(Set(j)) } } + } + action clean = { + nondet j = jobs.oneOf() + all { s.cleanup.contains(j), s' = { ...s, + cleanup: s.cleanup.exclude(Set(j)), admitted: s.admitted.exclude(Set(j)), + done: s.done.union(Set(j)) } } + } + action step = any { admit, start, finish, cancel, drain, clean, s' = s } + // Independent negative schedule: cancellation abandons its permit, yet the + // non-abortable CPU job still owns its payload in cleanup. + action earlyRelease = s' = { ...s, + running: Set(), cleanup: Set(0), admitted: Set() } +} diff --git a/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/detailed.log b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/detailed.log new file mode 100644 index 0000000..d3f9dfa --- /dev/null +++ b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/detailed.log @@ -0,0 +1,4 @@ +2026-10-30T00:38:39,883 [main] INFO a.f.a.t.Tool$ - # APALACHE version: 0.62.1 | build: a321771 +2026-10-30T00:38:39,889 [main] INFO a.f.a.t.t.o.ServerCmd - Starting checker server on port 8822... +2026-10-30T00:38:41,771 [zio-default-async-5] INFO a.f.a.i.p.PassChainExecutor - PASS #0: SanyParser +2026-10-30T00:38:42,057 [zio-default-async-5] DEBUG a.f.a.i.p.PassChainExecutor - PASS #0: SanyParser [OK] diff --git a/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/detailed.log.license b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/detailed.log.license new file mode 100644 index 0000000..b6e69b7 --- /dev/null +++ b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/detailed.log.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/run.txt b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/run.txt new file mode 100644 index 0000000..ac7e5d7 --- /dev/null +++ b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/run.txt @@ -0,0 +1 @@ + server --port=8822 diff --git a/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/run.txt.license b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/run.txt.license new file mode 100644 index 0000000..b6e69b7 --- /dev/null +++ b/observation/_apalache-out/server/2026-10-30T00-38-39_562948017610330374/run.txt.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/observation/record.json b/observation/record.json new file mode 100644 index 0000000..cf1bb82 --- /dev/null +++ b/observation/record.json @@ -0,0 +1 @@ +{"boundary":"Local model/proof result; no Rust source correspondence, performance or execution authority","obligation":"BP-O02","schema":"rust.resource.method-observation.v1","footprint":[["model","72450fc364b1c294018e319c5d9e6e1f5e3e8ddfb51a1aa1e8b955ffb8c295b6"]],"artifacts":[["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/BackpressureOwners.qnt","f018b2385342488de907cb2d967310b4e08c51102def1c4c5b784dc7d1b2d92b"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/tlc-result.json","8fc2bf7ebc5fce6ddaa891ee7a7f908ef5fb146f2d4a8cb28b14c62c9c3b6d3b"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/version.log","d553a58a6837c95f31bae39ac344e63cc82fa81cc524966a7cd5174db38c8fa6"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/tlc.log","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"]],"commands":[{"log":"/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/version.log","argv":["/opt/homebrew/Cellar/quint/0.33.0/libexec/lib/node_modules/@informalsystems/quint/dist/src/cli.js","--version"],"timeoutSeconds":45,"exit":0,"logSha256":"d553a58a6837c95f31bae39ac344e63cc82fa81cc524966a7cd5174db38c8fa6","seconds":0.3470299243927002},{"logSha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","timeoutSeconds":45,"exit":0,"argv":["/opt/homebrew/Cellar/quint/0.33.0/libexec/lib/node_modules/@informalsystems/quint/dist/src/cli.js","verify","/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/BackpressureOwners.qnt","--backend","tlc","--init","initResource","--step","step","--invariant","safe","--out","/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/tlc-result.json"],"log":"/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/observation/tlc.log","seconds":3.6287121772766113}],"outcome":"pass","method":"quint","inputs":[["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/concurrency/resource-control/backpressure-memory/model.qnt","f018b2385342488de907cb2d967310b4e08c51102def1c4c5b784dc7d1b2d92b"],["/opt/homebrew/Cellar/quint/0.33.0/libexec/lib/node_modules/@informalsystems/quint/dist/src/cli.js","ad009937066fd22ef96c5bde0df9d26df1e761ae3fc579378eaf84b56e2c2aa2"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/types.ss","50ea860a131f948a314f8893b05389178e1767472e85010a49218f56b1519c60"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/concurrency/resource-control/backpressure-memory/abstract/types.ss","6150653d84c111effcaa9539edfbe569415eca3e07c6fea5ed61f34216d5bd79"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/concurrency/resource-control/backpressure-memory/abstract/objects.ss","0d22f4529716fdfe674d40e670b9c1a6f70e5432e6704270150f950273cef0ba"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/concurrency/resource-control/backpressure-memory/abstract/config.ss","52db0ab0d846acce3d1dfd969f010ff4a62669c025c32c2a4ab279870a6aedd6"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/concurrency/resource-control/backpressure-memory/abstract/interface.ss","595eba14fb2027428afa544ae6063ad145d8d69d794b860ae753b138e76610c1"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/types.ss","da8767f505f2a437c2b66bcc6e92144a9a36beb1615436bacfe53968b718f04f"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/objects.ss","df7d922f8c6d658bde688a633ce29367c4bc473bf69128284a27853747743870"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/config.ss","9b525ed2c021990faad2323cf6fe2a985261e0e591c343ed5bcaa35bc0fdd7ba"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/interface.ss","427f058601cbcafbb6ff89a84b0dfaad1b1a4c20fee7a9cc364199fc4fce3fe2"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/func.ss","59da2d1378a04e6579f2b9cca3edf9dbc997bbdffd9680dbbaf32eabc9e4113e"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/methods.ss","dfc15c7761f53c88524ab8a795202f7cfc5719d3ea2704cb90d30910a1fc1b22"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/oracle.ss","4cf5cd72d1d4c9d02b4e650cbbf47bc59cef53f5b457ce40a43d016a83af5a79"],["/Users/guangtao/ghq/github.com/tao3k/deterministic-engineering/library/drivers/rust-resources/correspondence.ss","0765d570ca6b8d0308f44ab66d0b20ca12f19bbab6c167ccbaf6359f39e2a7b9"]]} diff --git a/observation/record.json.license b/observation/record.json.license new file mode 100644 index 0000000..b6e69b7 --- /dev/null +++ b/observation/record.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/observation/review.json b/observation/review.json new file mode 100644 index 0000000..960a8c9 --- /dev/null +++ b/observation/review.json @@ -0,0 +1 @@ +{"inputClosureUnchanged":true,"result":"sha256:09c54d8c62ce05e5237b2a67dfedc979aacba92eb452b2a150cd3ee5b3c99d8c","oracle":{"limit":1,"oracle":"explicit-five-job-bfs/v1","transitions":480,"queue":1,"states":352,"safe":true},"schema":"rust.resource.method-review.v1","authentication":"local-host-trust; no external signature","issuer":"local-Core-Ops-and-method-observer"} diff --git a/observation/review.json.license b/observation/review.json.license new file mode 100644 index 0000000..b6e69b7 --- /dev/null +++ b/observation/review.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/observation/tlc-result.json b/observation/tlc-result.json new file mode 100644 index 0000000..fe6bcd1 --- /dev/null +++ b/observation/tlc-result.json @@ -0,0 +1 @@ +{"stage":"verifying","warnings":[],"modules":[{"id":465,"name":"BackpressureOwners","declarations":[{"id":16,"kind":"typedef","name":"State","type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"depth":0},{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]}},{"kind":"var","name":"s","typeAnnotation":{"id":17,"kind":"const","name":"State"},"id":18,"depth":0},{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"typeAnnotation":{"id":26,"kind":"const","name":"State"}},{"id":111,"kind":"def","name":"owners","qualifier":"val","expr":{"id":110,"kind":"app","opcode":"union","args":[{"id":106,"kind":"app","opcode":"union","args":[{"id":102,"kind":"app","opcode":"union","args":[{"id":98,"kind":"app","opcode":"field","args":[{"id":96,"kind":"name","name":"s"},{"id":97,"kind":"str","value":"queued"}]},{"id":101,"kind":"app","opcode":"field","args":[{"id":99,"kind":"name","name":"s"},{"id":100,"kind":"str","value":"running"}]}]},{"id":105,"kind":"app","opcode":"field","args":[{"id":103,"kind":"name","name":"s"},{"id":104,"kind":"str","value":"returned"}]}]},{"id":109,"kind":"app","opcode":"field","args":[{"id":107,"kind":"name","name":"s"},{"id":108,"kind":"str","value":"cleanup"}]}]}},{"id":209,"kind":"def","name":"hasCleanup","qualifier":"val","expr":{"id":208,"kind":"app","opcode":"igt","args":[{"id":206,"kind":"app","opcode":"size","args":[{"id":205,"kind":"app","opcode":"field","args":[{"id":203,"kind":"name","name":"s"},{"id":204,"kind":"str","value":"cleanup"}]}]},{"id":207,"kind":"int","value":0}]}},{"id":216,"kind":"def","name":"hasReturned","qualifier":"val","expr":{"id":215,"kind":"app","opcode":"igt","args":[{"id":213,"kind":"app","opcode":"size","args":[{"id":212,"kind":"app","opcode":"field","args":[{"id":210,"kind":"name","name":"s"},{"id":211,"kind":"str","value":"returned"}]}]},{"id":214,"kind":"int","value":0}]}},{"id":222,"kind":"def","name":"allDone","qualifier":"val","expr":{"id":221,"kind":"app","opcode":"eq","args":[{"id":219,"kind":"app","opcode":"field","args":[{"id":217,"kind":"name","name":"s"},{"id":218,"kind":"str","value":"done"}]},{"id":220,"kind":"name","name":"jobs"}]}},{"id":303,"kind":"def","name":"start","qualifier":"action","expr":{"id":302,"kind":"let","opdef":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]}},"expr":{"id":301,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"app","opcode":"contains","args":[{"id":279,"kind":"app","opcode":"field","args":[{"id":277,"kind":"name","name":"s"},{"id":278,"kind":"str","value":"queued"}]},{"id":280,"kind":"name","name":"j"}]},{"id":300,"kind":"app","opcode":"assign","args":[{"id":299,"kind":"name","name":"s"},{"id":298,"kind":"app","opcode":"with","args":[{"id":297,"kind":"app","opcode":"with","args":[{"id":282,"kind":"name","name":"s"},{"id":289,"kind":"str","value":"queued"},{"id":288,"kind":"app","opcode":"exclude","args":[{"id":285,"kind":"app","opcode":"field","args":[{"id":283,"kind":"name","name":"s"},{"id":284,"kind":"str","value":"queued"}]},{"id":287,"kind":"app","opcode":"Set","args":[{"id":286,"kind":"name","name":"j"}]}]}]},{"id":296,"kind":"str","value":"running"},{"id":295,"kind":"app","opcode":"union","args":[{"id":292,"kind":"app","opcode":"field","args":[{"id":290,"kind":"name","name":"s"},{"id":291,"kind":"str","value":"running"}]},{"id":294,"kind":"app","opcode":"Set","args":[{"id":293,"kind":"name","name":"j"}]}]}]}]}]}}},{"id":333,"kind":"def","name":"finish","qualifier":"action","expr":{"id":332,"kind":"let","opdef":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]}},"expr":{"id":331,"kind":"app","opcode":"actionAll","args":[{"id":311,"kind":"app","opcode":"contains","args":[{"id":309,"kind":"app","opcode":"field","args":[{"id":307,"kind":"name","name":"s"},{"id":308,"kind":"str","value":"running"}]},{"id":310,"kind":"name","name":"j"}]},{"id":330,"kind":"app","opcode":"assign","args":[{"id":329,"kind":"name","name":"s"},{"id":328,"kind":"app","opcode":"with","args":[{"id":327,"kind":"app","opcode":"with","args":[{"id":312,"kind":"name","name":"s"},{"id":319,"kind":"str","value":"running"},{"id":318,"kind":"app","opcode":"exclude","args":[{"id":315,"kind":"app","opcode":"field","args":[{"id":313,"kind":"name","name":"s"},{"id":314,"kind":"str","value":"running"}]},{"id":317,"kind":"app","opcode":"Set","args":[{"id":316,"kind":"name","name":"j"}]}]}]},{"id":326,"kind":"str","value":"returned"},{"id":325,"kind":"app","opcode":"union","args":[{"id":322,"kind":"app","opcode":"field","args":[{"id":320,"kind":"name","name":"s"},{"id":321,"kind":"str","value":"returned"}]},{"id":324,"kind":"app","opcode":"Set","args":[{"id":323,"kind":"name","name":"j"}]}]}]}]}]}}},{"id":363,"kind":"def","name":"cancel","qualifier":"action","expr":{"id":362,"kind":"let","opdef":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]}},"expr":{"id":361,"kind":"app","opcode":"actionAll","args":[{"id":341,"kind":"app","opcode":"contains","args":[{"id":339,"kind":"app","opcode":"field","args":[{"id":337,"kind":"name","name":"s"},{"id":338,"kind":"str","value":"running"}]},{"id":340,"kind":"name","name":"j"}]},{"id":360,"kind":"app","opcode":"assign","args":[{"id":359,"kind":"name","name":"s"},{"id":358,"kind":"app","opcode":"with","args":[{"id":357,"kind":"app","opcode":"with","args":[{"id":342,"kind":"name","name":"s"},{"id":349,"kind":"str","value":"running"},{"id":348,"kind":"app","opcode":"exclude","args":[{"id":345,"kind":"app","opcode":"field","args":[{"id":343,"kind":"name","name":"s"},{"id":344,"kind":"str","value":"running"}]},{"id":347,"kind":"app","opcode":"Set","args":[{"id":346,"kind":"name","name":"j"}]}]}]},{"id":356,"kind":"str","value":"cleanup"},{"id":355,"kind":"app","opcode":"union","args":[{"id":352,"kind":"app","opcode":"field","args":[{"id":350,"kind":"name","name":"s"},{"id":351,"kind":"str","value":"cleanup"}]},{"id":354,"kind":"app","opcode":"Set","args":[{"id":353,"kind":"name","name":"j"}]}]}]}]}]}}},{"id":401,"kind":"def","name":"drain","qualifier":"action","expr":{"id":400,"kind":"let","opdef":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]}},"expr":{"id":399,"kind":"app","opcode":"actionAll","args":[{"id":371,"kind":"app","opcode":"contains","args":[{"id":369,"kind":"app","opcode":"field","args":[{"id":367,"kind":"name","name":"s"},{"id":368,"kind":"str","value":"returned"}]},{"id":370,"kind":"name","name":"j"}]},{"id":398,"kind":"app","opcode":"assign","args":[{"id":397,"kind":"name","name":"s"},{"id":396,"kind":"app","opcode":"with","args":[{"id":395,"kind":"app","opcode":"with","args":[{"id":394,"kind":"app","opcode":"with","args":[{"id":372,"kind":"name","name":"s"},{"id":379,"kind":"str","value":"returned"},{"id":378,"kind":"app","opcode":"exclude","args":[{"id":375,"kind":"app","opcode":"field","args":[{"id":373,"kind":"name","name":"s"},{"id":374,"kind":"str","value":"returned"}]},{"id":377,"kind":"app","opcode":"Set","args":[{"id":376,"kind":"name","name":"j"}]}]}]},{"id":386,"kind":"str","value":"admitted"},{"id":385,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"app","opcode":"field","args":[{"id":380,"kind":"name","name":"s"},{"id":381,"kind":"str","value":"admitted"}]},{"id":384,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"name","name":"j"}]}]}]},{"id":393,"kind":"str","value":"done"},{"id":392,"kind":"app","opcode":"union","args":[{"id":389,"kind":"app","opcode":"field","args":[{"id":387,"kind":"name","name":"s"},{"id":388,"kind":"str","value":"done"}]},{"id":391,"kind":"app","opcode":"Set","args":[{"id":390,"kind":"name","name":"j"}]}]}]}]}]}}},{"id":439,"kind":"def","name":"clean","qualifier":"action","expr":{"id":438,"kind":"let","opdef":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]}},"expr":{"id":437,"kind":"app","opcode":"actionAll","args":[{"id":409,"kind":"app","opcode":"contains","args":[{"id":407,"kind":"app","opcode":"field","args":[{"id":405,"kind":"name","name":"s"},{"id":406,"kind":"str","value":"cleanup"}]},{"id":408,"kind":"name","name":"j"}]},{"id":436,"kind":"app","opcode":"assign","args":[{"id":435,"kind":"name","name":"s"},{"id":434,"kind":"app","opcode":"with","args":[{"id":433,"kind":"app","opcode":"with","args":[{"id":432,"kind":"app","opcode":"with","args":[{"id":410,"kind":"name","name":"s"},{"id":417,"kind":"str","value":"cleanup"},{"id":416,"kind":"app","opcode":"exclude","args":[{"id":413,"kind":"app","opcode":"field","args":[{"id":411,"kind":"name","name":"s"},{"id":412,"kind":"str","value":"cleanup"}]},{"id":415,"kind":"app","opcode":"Set","args":[{"id":414,"kind":"name","name":"j"}]}]}]},{"id":424,"kind":"str","value":"admitted"},{"id":423,"kind":"app","opcode":"exclude","args":[{"id":420,"kind":"app","opcode":"field","args":[{"id":418,"kind":"name","name":"s"},{"id":419,"kind":"str","value":"admitted"}]},{"id":422,"kind":"app","opcode":"Set","args":[{"id":421,"kind":"name","name":"j"}]}]}]},{"id":431,"kind":"str","value":"done"},{"id":430,"kind":"app","opcode":"union","args":[{"id":427,"kind":"app","opcode":"field","args":[{"id":425,"kind":"name","name":"s"},{"id":426,"kind":"str","value":"done"}]},{"id":429,"kind":"app","opcode":"Set","args":[{"id":428,"kind":"name","name":"j"}]}]}]}]}]}}},{"id":464,"kind":"def","name":"earlyRelease","qualifier":"action","expr":{"id":463,"kind":"app","opcode":"assign","args":[{"id":462,"kind":"name","name":"s"},{"id":461,"kind":"app","opcode":"with","args":[{"id":460,"kind":"app","opcode":"with","args":[{"id":459,"kind":"app","opcode":"with","args":[{"id":451,"kind":"name","name":"s"},{"id":453,"kind":"str","value":"running"},{"id":452,"kind":"app","opcode":"Set","args":[]}]},{"id":456,"kind":"str","value":"cleanup"},{"id":455,"kind":"app","opcode":"Set","args":[{"id":454,"kind":"int","value":0}]}]},{"id":458,"kind":"str","value":"admitted"},{"id":457,"kind":"app","opcode":"Set","args":[]}]}]}},{"id":48,"kind":"def","name":"init","qualifier":"action","expr":{"id":47,"kind":"app","opcode":"assign","args":[{"id":46,"kind":"name","name":"s"},{"id":45,"kind":"name","name":"initial"}]}},{"id":58,"kind":"def","name":"initResource","qualifier":"action","expr":{"id":57,"kind":"app","opcode":"assign","args":[{"id":56,"kind":"name","name":"s"},{"id":55,"kind":"app","opcode":"with","args":[{"id":54,"kind":"app","opcode":"with","args":[{"id":49,"kind":"name","name":"initial"},{"id":51,"kind":"str","value":"limit"},{"id":50,"kind":"int","value":1}]},{"id":53,"kind":"str","value":"queueLimit"},{"id":52,"kind":"int","value":1}]}]}},{"id":76,"kind":"def","name":"initResourceRunning","qualifier":"action","expr":{"id":75,"kind":"app","opcode":"assign","args":[{"id":74,"kind":"name","name":"s"},{"id":73,"kind":"app","opcode":"with","args":[{"id":72,"kind":"app","opcode":"with","args":[{"id":71,"kind":"app","opcode":"with","args":[{"id":70,"kind":"app","opcode":"with","args":[{"id":59,"kind":"name","name":"initial"},{"id":61,"kind":"str","value":"limit"},{"id":60,"kind":"int","value":1}]},{"id":63,"kind":"str","value":"queueLimit"},{"id":62,"kind":"int","value":1}]},{"id":66,"kind":"str","value":"admitted"},{"id":65,"kind":"app","opcode":"Set","args":[{"id":64,"kind":"int","value":0}]}]},{"id":69,"kind":"str","value":"running"},{"id":68,"kind":"app","opcode":"Set","args":[{"id":67,"kind":"int","value":0}]}]}]}},{"id":83,"kind":"def","name":"initC2","qualifier":"action","expr":{"id":82,"kind":"app","opcode":"assign","args":[{"id":81,"kind":"name","name":"s"},{"id":80,"kind":"app","opcode":"with","args":[{"id":77,"kind":"name","name":"initial"},{"id":79,"kind":"str","value":"limit"},{"id":78,"kind":"int","value":4}]}]}},{"id":95,"kind":"def","name":"initRunning","qualifier":"action","expr":{"id":94,"kind":"app","opcode":"assign","args":[{"id":93,"kind":"name","name":"s"},{"id":92,"kind":"app","opcode":"with","args":[{"id":91,"kind":"app","opcode":"with","args":[{"id":84,"kind":"name","name":"initial"},{"id":87,"kind":"str","value":"admitted"},{"id":86,"kind":"app","opcode":"Set","args":[{"id":85,"kind":"int","value":0}]}]},{"id":90,"kind":"str","value":"running"},{"id":89,"kind":"app","opcode":"Set","args":[{"id":88,"kind":"int","value":0}]}]}]}},{"id":202,"kind":"def","name":"safe","qualifier":"val","expr":{"id":201,"kind":"app","opcode":"actionAll","args":[{"id":116,"kind":"app","opcode":"eq","args":[{"id":112,"kind":"name","name":"owners"},{"id":115,"kind":"app","opcode":"field","args":[{"id":113,"kind":"name","name":"s"},{"id":114,"kind":"str","value":"admitted"}]}]},{"id":124,"kind":"app","opcode":"ilte","args":[{"id":120,"kind":"app","opcode":"size","args":[{"id":119,"kind":"app","opcode":"field","args":[{"id":117,"kind":"name","name":"s"},{"id":118,"kind":"str","value":"admitted"}]}]},{"id":123,"kind":"app","opcode":"field","args":[{"id":121,"kind":"name","name":"s"},{"id":122,"kind":"str","value":"limit"}]}]},{"id":132,"kind":"app","opcode":"ilte","args":[{"id":128,"kind":"app","opcode":"size","args":[{"id":127,"kind":"app","opcode":"field","args":[{"id":125,"kind":"name","name":"s"},{"id":126,"kind":"str","value":"queued"}]}]},{"id":131,"kind":"app","opcode":"field","args":[{"id":129,"kind":"name","name":"s"},{"id":130,"kind":"str","value":"queueLimit"}]}]},{"id":142,"kind":"app","opcode":"eq","args":[{"id":140,"kind":"app","opcode":"size","args":[{"id":139,"kind":"app","opcode":"intersect","args":[{"id":135,"kind":"app","opcode":"field","args":[{"id":133,"kind":"name","name":"s"},{"id":134,"kind":"str","value":"queued"}]},{"id":138,"kind":"app","opcode":"field","args":[{"id":136,"kind":"name","name":"s"},{"id":137,"kind":"str","value":"running"}]}]}]},{"id":141,"kind":"int","value":0}]},{"id":152,"kind":"app","opcode":"eq","args":[{"id":150,"kind":"app","opcode":"size","args":[{"id":149,"kind":"app","opcode":"intersect","args":[{"id":145,"kind":"app","opcode":"field","args":[{"id":143,"kind":"name","name":"s"},{"id":144,"kind":"str","value":"queued"}]},{"id":148,"kind":"app","opcode":"field","args":[{"id":146,"kind":"name","name":"s"},{"id":147,"kind":"str","value":"returned"}]}]}]},{"id":151,"kind":"int","value":0}]},{"id":162,"kind":"app","opcode":"eq","args":[{"id":160,"kind":"app","opcode":"size","args":[{"id":159,"kind":"app","opcode":"intersect","args":[{"id":155,"kind":"app","opcode":"field","args":[{"id":153,"kind":"name","name":"s"},{"id":154,"kind":"str","value":"queued"}]},{"id":158,"kind":"app","opcode":"field","args":[{"id":156,"kind":"name","name":"s"},{"id":157,"kind":"str","value":"cleanup"}]}]}]},{"id":161,"kind":"int","value":0}]},{"id":172,"kind":"app","opcode":"eq","args":[{"id":170,"kind":"app","opcode":"size","args":[{"id":169,"kind":"app","opcode":"intersect","args":[{"id":165,"kind":"app","opcode":"field","args":[{"id":163,"kind":"name","name":"s"},{"id":164,"kind":"str","value":"running"}]},{"id":168,"kind":"app","opcode":"field","args":[{"id":166,"kind":"name","name":"s"},{"id":167,"kind":"str","value":"returned"}]}]}]},{"id":171,"kind":"int","value":0}]},{"id":182,"kind":"app","opcode":"eq","args":[{"id":180,"kind":"app","opcode":"size","args":[{"id":179,"kind":"app","opcode":"intersect","args":[{"id":175,"kind":"app","opcode":"field","args":[{"id":173,"kind":"name","name":"s"},{"id":174,"kind":"str","value":"running"}]},{"id":178,"kind":"app","opcode":"field","args":[{"id":176,"kind":"name","name":"s"},{"id":177,"kind":"str","value":"cleanup"}]}]}]},{"id":181,"kind":"int","value":0}]},{"id":192,"kind":"app","opcode":"eq","args":[{"id":190,"kind":"app","opcode":"size","args":[{"id":189,"kind":"app","opcode":"intersect","args":[{"id":185,"kind":"app","opcode":"field","args":[{"id":183,"kind":"name","name":"s"},{"id":184,"kind":"str","value":"returned"}]},{"id":188,"kind":"app","opcode":"field","args":[{"id":186,"kind":"name","name":"s"},{"id":187,"kind":"str","value":"cleanup"}]}]}]},{"id":191,"kind":"int","value":0}]},{"id":200,"kind":"app","opcode":"eq","args":[{"id":198,"kind":"app","opcode":"size","args":[{"id":197,"kind":"app","opcode":"intersect","args":[{"id":195,"kind":"app","opcode":"field","args":[{"id":193,"kind":"name","name":"s"},{"id":194,"kind":"str","value":"done"}]},{"id":196,"kind":"name","name":"owners"}]}]},{"id":199,"kind":"int","value":0}]}]}},{"id":273,"kind":"def","name":"admit","qualifier":"action","expr":{"id":272,"kind":"let","opdef":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]}},"expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":229,"kind":"app","opcode":"not","args":[{"id":228,"kind":"app","opcode":"contains","args":[{"id":226,"kind":"name","name":"owners"},{"id":227,"kind":"name","name":"j"}]}]},{"id":235,"kind":"app","opcode":"not","args":[{"id":234,"kind":"app","opcode":"contains","args":[{"id":232,"kind":"app","opcode":"field","args":[{"id":230,"kind":"name","name":"s"},{"id":231,"kind":"str","value":"done"}]},{"id":233,"kind":"name","name":"j"}]}]},{"id":243,"kind":"app","opcode":"ilt","args":[{"id":239,"kind":"app","opcode":"size","args":[{"id":238,"kind":"app","opcode":"field","args":[{"id":236,"kind":"name","name":"s"},{"id":237,"kind":"str","value":"admitted"}]}]},{"id":242,"kind":"app","opcode":"field","args":[{"id":240,"kind":"name","name":"s"},{"id":241,"kind":"str","value":"limit"}]}]},{"id":251,"kind":"app","opcode":"ilt","args":[{"id":247,"kind":"app","opcode":"size","args":[{"id":246,"kind":"app","opcode":"field","args":[{"id":244,"kind":"name","name":"s"},{"id":245,"kind":"str","value":"queued"}]}]},{"id":250,"kind":"app","opcode":"field","args":[{"id":248,"kind":"name","name":"s"},{"id":249,"kind":"str","value":"queueLimit"}]}]},{"id":270,"kind":"app","opcode":"assign","args":[{"id":269,"kind":"name","name":"s"},{"id":268,"kind":"app","opcode":"with","args":[{"id":267,"kind":"app","opcode":"with","args":[{"id":252,"kind":"name","name":"s"},{"id":259,"kind":"str","value":"admitted"},{"id":258,"kind":"app","opcode":"union","args":[{"id":255,"kind":"app","opcode":"field","args":[{"id":253,"kind":"name","name":"s"},{"id":254,"kind":"str","value":"admitted"}]},{"id":257,"kind":"app","opcode":"Set","args":[{"id":256,"kind":"name","name":"j"}]}]}]},{"id":266,"kind":"str","value":"queued"},{"id":265,"kind":"app","opcode":"union","args":[{"id":262,"kind":"app","opcode":"field","args":[{"id":260,"kind":"name","name":"s"},{"id":261,"kind":"str","value":"queued"}]},{"id":264,"kind":"app","opcode":"Set","args":[{"id":263,"kind":"name","name":"j"}]}]}]}]}]}}},{"id":450,"kind":"def","name":"step","qualifier":"action","expr":{"id":449,"kind":"app","opcode":"actionAny","args":[{"id":440,"kind":"name","name":"admit"},{"id":441,"kind":"name","name":"start"},{"id":442,"kind":"name","name":"finish"},{"id":443,"kind":"name","name":"cancel"},{"id":444,"kind":"name","name":"drain"},{"id":445,"kind":"name","name":"clean"},{"id":448,"kind":"app","opcode":"assign","args":[{"id":447,"kind":"name","name":"s"},{"id":446,"kind":"name","name":"s"}]}]}},{"id":469,"kind":"def","name":"q::init","qualifier":"action","expr":{"id":468,"kind":"name","name":"initResource"}},{"id":471,"kind":"def","name":"q::step","qualifier":"action","expr":{"id":470,"kind":"name","name":"step"}},{"id":474,"kind":"def","name":"q::inv","qualifier":"val","expr":{"id":473,"kind":"app","opcode":"and","args":[{"id":472,"kind":"name","name":"safe"}]}}]}],"table":{"25":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"44":{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"depth":0},"45":{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"46":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"48":{"id":48,"kind":"def","name":"init","qualifier":"action","expr":{"id":47,"kind":"app","opcode":"assign","args":[{"id":46,"kind":"name","name":"s"},{"id":45,"kind":"name","name":"initial"}]},"depth":0},"49":{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"56":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"58":{"id":58,"kind":"def","name":"initResource","qualifier":"action","expr":{"id":57,"kind":"app","opcode":"assign","args":[{"id":56,"kind":"name","name":"s"},{"id":55,"kind":"app","opcode":"with","args":[{"id":54,"kind":"app","opcode":"with","args":[{"id":49,"kind":"name","name":"initial"},{"id":51,"kind":"str","value":"limit"},{"id":50,"kind":"int","value":1}]},{"id":53,"kind":"str","value":"queueLimit"},{"id":52,"kind":"int","value":1}]}]},"depth":0},"59":{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"74":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"76":{"id":76,"kind":"def","name":"initResourceRunning","qualifier":"action","expr":{"id":75,"kind":"app","opcode":"assign","args":[{"id":74,"kind":"name","name":"s"},{"id":73,"kind":"app","opcode":"with","args":[{"id":72,"kind":"app","opcode":"with","args":[{"id":71,"kind":"app","opcode":"with","args":[{"id":70,"kind":"app","opcode":"with","args":[{"id":59,"kind":"name","name":"initial"},{"id":61,"kind":"str","value":"limit"},{"id":60,"kind":"int","value":1}]},{"id":63,"kind":"str","value":"queueLimit"},{"id":62,"kind":"int","value":1}]},{"id":66,"kind":"str","value":"admitted"},{"id":65,"kind":"app","opcode":"Set","args":[{"id":64,"kind":"int","value":0}]}]},{"id":69,"kind":"str","value":"running"},{"id":68,"kind":"app","opcode":"Set","args":[{"id":67,"kind":"int","value":0}]}]}]},"depth":0},"77":{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"81":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"83":{"id":83,"kind":"def","name":"initC2","qualifier":"action","expr":{"id":82,"kind":"app","opcode":"assign","args":[{"id":81,"kind":"name","name":"s"},{"id":80,"kind":"app","opcode":"with","args":[{"id":77,"kind":"name","name":"initial"},{"id":79,"kind":"str","value":"limit"},{"id":78,"kind":"int","value":4}]}]},"depth":0},"84":{"id":44,"kind":"def","name":"initial","qualifier":"puredef","expr":{"id":43,"kind":"app","opcode":"Rec","args":[{"id":28,"kind":"str","value":"limit"},{"id":27,"kind":"int","value":2},{"id":30,"kind":"str","value":"queueLimit"},{"id":29,"kind":"int","value":2},{"id":32,"kind":"str","value":"admitted"},{"id":31,"kind":"app","opcode":"Set","args":[]},{"id":34,"kind":"str","value":"queued"},{"id":33,"kind":"app","opcode":"Set","args":[]},{"id":36,"kind":"str","value":"running"},{"id":35,"kind":"app","opcode":"Set","args":[]},{"id":38,"kind":"str","value":"returned"},{"id":37,"kind":"app","opcode":"Set","args":[]},{"id":40,"kind":"str","value":"cleanup"},{"id":39,"kind":"app","opcode":"Set","args":[]},{"id":42,"kind":"str","value":"done"},{"id":41,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"93":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"95":{"id":95,"kind":"def","name":"initRunning","qualifier":"action","expr":{"id":94,"kind":"app","opcode":"assign","args":[{"id":93,"kind":"name","name":"s"},{"id":92,"kind":"app","opcode":"with","args":[{"id":91,"kind":"app","opcode":"with","args":[{"id":84,"kind":"name","name":"initial"},{"id":87,"kind":"str","value":"admitted"},{"id":86,"kind":"app","opcode":"Set","args":[{"id":85,"kind":"int","value":0}]}]},{"id":90,"kind":"str","value":"running"},{"id":89,"kind":"app","opcode":"Set","args":[{"id":88,"kind":"int","value":0}]}]}]},"depth":0},"96":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"99":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"103":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"107":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"111":{"id":111,"kind":"def","name":"owners","qualifier":"val","expr":{"id":110,"kind":"app","opcode":"union","args":[{"id":106,"kind":"app","opcode":"union","args":[{"id":102,"kind":"app","opcode":"union","args":[{"id":98,"kind":"app","opcode":"field","args":[{"id":96,"kind":"name","name":"s"},{"id":97,"kind":"str","value":"queued"}]},{"id":101,"kind":"app","opcode":"field","args":[{"id":99,"kind":"name","name":"s"},{"id":100,"kind":"str","value":"running"}]}]},{"id":105,"kind":"app","opcode":"field","args":[{"id":103,"kind":"name","name":"s"},{"id":104,"kind":"str","value":"returned"}]}]},{"id":109,"kind":"app","opcode":"field","args":[{"id":107,"kind":"name","name":"s"},{"id":108,"kind":"str","value":"cleanup"}]}]},"depth":0},"112":{"id":111,"kind":"def","name":"owners","qualifier":"val","expr":{"id":110,"kind":"app","opcode":"union","args":[{"id":106,"kind":"app","opcode":"union","args":[{"id":102,"kind":"app","opcode":"union","args":[{"id":98,"kind":"app","opcode":"field","args":[{"id":96,"kind":"name","name":"s"},{"id":97,"kind":"str","value":"queued"}]},{"id":101,"kind":"app","opcode":"field","args":[{"id":99,"kind":"name","name":"s"},{"id":100,"kind":"str","value":"running"}]}]},{"id":105,"kind":"app","opcode":"field","args":[{"id":103,"kind":"name","name":"s"},{"id":104,"kind":"str","value":"returned"}]}]},{"id":109,"kind":"app","opcode":"field","args":[{"id":107,"kind":"name","name":"s"},{"id":108,"kind":"str","value":"cleanup"}]}]},"depth":0},"113":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"117":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"121":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"125":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"129":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"133":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"136":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"143":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"146":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"153":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"156":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"163":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"166":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"173":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"176":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"183":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"186":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"193":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"196":{"id":111,"kind":"def","name":"owners","qualifier":"val","expr":{"id":110,"kind":"app","opcode":"union","args":[{"id":106,"kind":"app","opcode":"union","args":[{"id":102,"kind":"app","opcode":"union","args":[{"id":98,"kind":"app","opcode":"field","args":[{"id":96,"kind":"name","name":"s"},{"id":97,"kind":"str","value":"queued"}]},{"id":101,"kind":"app","opcode":"field","args":[{"id":99,"kind":"name","name":"s"},{"id":100,"kind":"str","value":"running"}]}]},{"id":105,"kind":"app","opcode":"field","args":[{"id":103,"kind":"name","name":"s"},{"id":104,"kind":"str","value":"returned"}]}]},{"id":109,"kind":"app","opcode":"field","args":[{"id":107,"kind":"name","name":"s"},{"id":108,"kind":"str","value":"cleanup"}]}]},"depth":0},"202":{"id":202,"kind":"def","name":"safe","qualifier":"val","expr":{"id":201,"kind":"app","opcode":"actionAll","args":[{"id":116,"kind":"app","opcode":"eq","args":[{"id":112,"kind":"name","name":"owners"},{"id":115,"kind":"app","opcode":"field","args":[{"id":113,"kind":"name","name":"s"},{"id":114,"kind":"str","value":"admitted"}]}]},{"id":124,"kind":"app","opcode":"ilte","args":[{"id":120,"kind":"app","opcode":"size","args":[{"id":119,"kind":"app","opcode":"field","args":[{"id":117,"kind":"name","name":"s"},{"id":118,"kind":"str","value":"admitted"}]}]},{"id":123,"kind":"app","opcode":"field","args":[{"id":121,"kind":"name","name":"s"},{"id":122,"kind":"str","value":"limit"}]}]},{"id":132,"kind":"app","opcode":"ilte","args":[{"id":128,"kind":"app","opcode":"size","args":[{"id":127,"kind":"app","opcode":"field","args":[{"id":125,"kind":"name","name":"s"},{"id":126,"kind":"str","value":"queued"}]}]},{"id":131,"kind":"app","opcode":"field","args":[{"id":129,"kind":"name","name":"s"},{"id":130,"kind":"str","value":"queueLimit"}]}]},{"id":142,"kind":"app","opcode":"eq","args":[{"id":140,"kind":"app","opcode":"size","args":[{"id":139,"kind":"app","opcode":"intersect","args":[{"id":135,"kind":"app","opcode":"field","args":[{"id":133,"kind":"name","name":"s"},{"id":134,"kind":"str","value":"queued"}]},{"id":138,"kind":"app","opcode":"field","args":[{"id":136,"kind":"name","name":"s"},{"id":137,"kind":"str","value":"running"}]}]}]},{"id":141,"kind":"int","value":0}]},{"id":152,"kind":"app","opcode":"eq","args":[{"id":150,"kind":"app","opcode":"size","args":[{"id":149,"kind":"app","opcode":"intersect","args":[{"id":145,"kind":"app","opcode":"field","args":[{"id":143,"kind":"name","name":"s"},{"id":144,"kind":"str","value":"queued"}]},{"id":148,"kind":"app","opcode":"field","args":[{"id":146,"kind":"name","name":"s"},{"id":147,"kind":"str","value":"returned"}]}]}]},{"id":151,"kind":"int","value":0}]},{"id":162,"kind":"app","opcode":"eq","args":[{"id":160,"kind":"app","opcode":"size","args":[{"id":159,"kind":"app","opcode":"intersect","args":[{"id":155,"kind":"app","opcode":"field","args":[{"id":153,"kind":"name","name":"s"},{"id":154,"kind":"str","value":"queued"}]},{"id":158,"kind":"app","opcode":"field","args":[{"id":156,"kind":"name","name":"s"},{"id":157,"kind":"str","value":"cleanup"}]}]}]},{"id":161,"kind":"int","value":0}]},{"id":172,"kind":"app","opcode":"eq","args":[{"id":170,"kind":"app","opcode":"size","args":[{"id":169,"kind":"app","opcode":"intersect","args":[{"id":165,"kind":"app","opcode":"field","args":[{"id":163,"kind":"name","name":"s"},{"id":164,"kind":"str","value":"running"}]},{"id":168,"kind":"app","opcode":"field","args":[{"id":166,"kind":"name","name":"s"},{"id":167,"kind":"str","value":"returned"}]}]}]},{"id":171,"kind":"int","value":0}]},{"id":182,"kind":"app","opcode":"eq","args":[{"id":180,"kind":"app","opcode":"size","args":[{"id":179,"kind":"app","opcode":"intersect","args":[{"id":175,"kind":"app","opcode":"field","args":[{"id":173,"kind":"name","name":"s"},{"id":174,"kind":"str","value":"running"}]},{"id":178,"kind":"app","opcode":"field","args":[{"id":176,"kind":"name","name":"s"},{"id":177,"kind":"str","value":"cleanup"}]}]}]},{"id":181,"kind":"int","value":0}]},{"id":192,"kind":"app","opcode":"eq","args":[{"id":190,"kind":"app","opcode":"size","args":[{"id":189,"kind":"app","opcode":"intersect","args":[{"id":185,"kind":"app","opcode":"field","args":[{"id":183,"kind":"name","name":"s"},{"id":184,"kind":"str","value":"returned"}]},{"id":188,"kind":"app","opcode":"field","args":[{"id":186,"kind":"name","name":"s"},{"id":187,"kind":"str","value":"cleanup"}]}]}]},{"id":191,"kind":"int","value":0}]},{"id":200,"kind":"app","opcode":"eq","args":[{"id":198,"kind":"app","opcode":"size","args":[{"id":197,"kind":"app","opcode":"intersect","args":[{"id":195,"kind":"app","opcode":"field","args":[{"id":193,"kind":"name","name":"s"},{"id":194,"kind":"str","value":"done"}]},{"id":196,"kind":"name","name":"owners"}]}]},{"id":199,"kind":"int","value":0}]}]},"depth":0},"203":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"209":{"id":209,"kind":"def","name":"hasCleanup","qualifier":"val","expr":{"id":208,"kind":"app","opcode":"igt","args":[{"id":206,"kind":"app","opcode":"size","args":[{"id":205,"kind":"app","opcode":"field","args":[{"id":203,"kind":"name","name":"s"},{"id":204,"kind":"str","value":"cleanup"}]}]},{"id":207,"kind":"int","value":0}]},"depth":0},"210":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"216":{"id":216,"kind":"def","name":"hasReturned","qualifier":"val","expr":{"id":215,"kind":"app","opcode":"igt","args":[{"id":213,"kind":"app","opcode":"size","args":[{"id":212,"kind":"app","opcode":"field","args":[{"id":210,"kind":"name","name":"s"},{"id":211,"kind":"str","value":"returned"}]}]},{"id":214,"kind":"int","value":0}]},"depth":0},"217":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"220":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"222":{"id":222,"kind":"def","name":"allDone","qualifier":"val","expr":{"id":221,"kind":"app","opcode":"eq","args":[{"id":219,"kind":"app","opcode":"field","args":[{"id":217,"kind":"name","name":"s"},{"id":218,"kind":"str","value":"done"}]},{"id":220,"kind":"name","name":"jobs"}]},"depth":0},"223":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"225":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"226":{"id":111,"kind":"def","name":"owners","qualifier":"val","expr":{"id":110,"kind":"app","opcode":"union","args":[{"id":106,"kind":"app","opcode":"union","args":[{"id":102,"kind":"app","opcode":"union","args":[{"id":98,"kind":"app","opcode":"field","args":[{"id":96,"kind":"name","name":"s"},{"id":97,"kind":"str","value":"queued"}]},{"id":101,"kind":"app","opcode":"field","args":[{"id":99,"kind":"name","name":"s"},{"id":100,"kind":"str","value":"running"}]}]},{"id":105,"kind":"app","opcode":"field","args":[{"id":103,"kind":"name","name":"s"},{"id":104,"kind":"str","value":"returned"}]}]},{"id":109,"kind":"app","opcode":"field","args":[{"id":107,"kind":"name","name":"s"},{"id":108,"kind":"str","value":"cleanup"}]}]},"depth":0},"227":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"230":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"233":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"236":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"240":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"244":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"248":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"252":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"253":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"256":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"260":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"263":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"269":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"273":{"id":273,"kind":"def","name":"admit","qualifier":"action","expr":{"id":272,"kind":"let","opdef":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]}},"expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":229,"kind":"app","opcode":"not","args":[{"id":228,"kind":"app","opcode":"contains","args":[{"id":226,"kind":"name","name":"owners"},{"id":227,"kind":"name","name":"j"}]}]},{"id":235,"kind":"app","opcode":"not","args":[{"id":234,"kind":"app","opcode":"contains","args":[{"id":232,"kind":"app","opcode":"field","args":[{"id":230,"kind":"name","name":"s"},{"id":231,"kind":"str","value":"done"}]},{"id":233,"kind":"name","name":"j"}]}]},{"id":243,"kind":"app","opcode":"ilt","args":[{"id":239,"kind":"app","opcode":"size","args":[{"id":238,"kind":"app","opcode":"field","args":[{"id":236,"kind":"name","name":"s"},{"id":237,"kind":"str","value":"admitted"}]}]},{"id":242,"kind":"app","opcode":"field","args":[{"id":240,"kind":"name","name":"s"},{"id":241,"kind":"str","value":"limit"}]}]},{"id":251,"kind":"app","opcode":"ilt","args":[{"id":247,"kind":"app","opcode":"size","args":[{"id":246,"kind":"app","opcode":"field","args":[{"id":244,"kind":"name","name":"s"},{"id":245,"kind":"str","value":"queued"}]}]},{"id":250,"kind":"app","opcode":"field","args":[{"id":248,"kind":"name","name":"s"},{"id":249,"kind":"str","value":"queueLimit"}]}]},{"id":270,"kind":"app","opcode":"assign","args":[{"id":269,"kind":"name","name":"s"},{"id":268,"kind":"app","opcode":"with","args":[{"id":267,"kind":"app","opcode":"with","args":[{"id":252,"kind":"name","name":"s"},{"id":259,"kind":"str","value":"admitted"},{"id":258,"kind":"app","opcode":"union","args":[{"id":255,"kind":"app","opcode":"field","args":[{"id":253,"kind":"name","name":"s"},{"id":254,"kind":"str","value":"admitted"}]},{"id":257,"kind":"app","opcode":"Set","args":[{"id":256,"kind":"name","name":"j"}]}]}]},{"id":266,"kind":"str","value":"queued"},{"id":265,"kind":"app","opcode":"union","args":[{"id":262,"kind":"app","opcode":"field","args":[{"id":260,"kind":"name","name":"s"},{"id":261,"kind":"str","value":"queued"}]},{"id":264,"kind":"app","opcode":"Set","args":[{"id":263,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"274":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"276":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]},"depth":2},"277":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"280":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]},"depth":2},"282":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"283":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"286":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]},"depth":2},"290":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"293":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]},"depth":2},"299":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"303":{"id":303,"kind":"def","name":"start","qualifier":"action","expr":{"id":302,"kind":"let","opdef":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]}},"expr":{"id":301,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"app","opcode":"contains","args":[{"id":279,"kind":"app","opcode":"field","args":[{"id":277,"kind":"name","name":"s"},{"id":278,"kind":"str","value":"queued"}]},{"id":280,"kind":"name","name":"j"}]},{"id":300,"kind":"app","opcode":"assign","args":[{"id":299,"kind":"name","name":"s"},{"id":298,"kind":"app","opcode":"with","args":[{"id":297,"kind":"app","opcode":"with","args":[{"id":282,"kind":"name","name":"s"},{"id":289,"kind":"str","value":"queued"},{"id":288,"kind":"app","opcode":"exclude","args":[{"id":285,"kind":"app","opcode":"field","args":[{"id":283,"kind":"name","name":"s"},{"id":284,"kind":"str","value":"queued"}]},{"id":287,"kind":"app","opcode":"Set","args":[{"id":286,"kind":"name","name":"j"}]}]}]},{"id":296,"kind":"str","value":"running"},{"id":295,"kind":"app","opcode":"union","args":[{"id":292,"kind":"app","opcode":"field","args":[{"id":290,"kind":"name","name":"s"},{"id":291,"kind":"str","value":"running"}]},{"id":294,"kind":"app","opcode":"Set","args":[{"id":293,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"304":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"306":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"307":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"310":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"312":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"313":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"316":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"320":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"323":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"329":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"333":{"id":333,"kind":"def","name":"finish","qualifier":"action","expr":{"id":332,"kind":"let","opdef":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]}},"expr":{"id":331,"kind":"app","opcode":"actionAll","args":[{"id":311,"kind":"app","opcode":"contains","args":[{"id":309,"kind":"app","opcode":"field","args":[{"id":307,"kind":"name","name":"s"},{"id":308,"kind":"str","value":"running"}]},{"id":310,"kind":"name","name":"j"}]},{"id":330,"kind":"app","opcode":"assign","args":[{"id":329,"kind":"name","name":"s"},{"id":328,"kind":"app","opcode":"with","args":[{"id":327,"kind":"app","opcode":"with","args":[{"id":312,"kind":"name","name":"s"},{"id":319,"kind":"str","value":"running"},{"id":318,"kind":"app","opcode":"exclude","args":[{"id":315,"kind":"app","opcode":"field","args":[{"id":313,"kind":"name","name":"s"},{"id":314,"kind":"str","value":"running"}]},{"id":317,"kind":"app","opcode":"Set","args":[{"id":316,"kind":"name","name":"j"}]}]}]},{"id":326,"kind":"str","value":"returned"},{"id":325,"kind":"app","opcode":"union","args":[{"id":322,"kind":"app","opcode":"field","args":[{"id":320,"kind":"name","name":"s"},{"id":321,"kind":"str","value":"returned"}]},{"id":324,"kind":"app","opcode":"Set","args":[{"id":323,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"334":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"336":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"337":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"340":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"342":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"343":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"346":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"350":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"353":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"359":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"363":{"id":363,"kind":"def","name":"cancel","qualifier":"action","expr":{"id":362,"kind":"let","opdef":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]}},"expr":{"id":361,"kind":"app","opcode":"actionAll","args":[{"id":341,"kind":"app","opcode":"contains","args":[{"id":339,"kind":"app","opcode":"field","args":[{"id":337,"kind":"name","name":"s"},{"id":338,"kind":"str","value":"running"}]},{"id":340,"kind":"name","name":"j"}]},{"id":360,"kind":"app","opcode":"assign","args":[{"id":359,"kind":"name","name":"s"},{"id":358,"kind":"app","opcode":"with","args":[{"id":357,"kind":"app","opcode":"with","args":[{"id":342,"kind":"name","name":"s"},{"id":349,"kind":"str","value":"running"},{"id":348,"kind":"app","opcode":"exclude","args":[{"id":345,"kind":"app","opcode":"field","args":[{"id":343,"kind":"name","name":"s"},{"id":344,"kind":"str","value":"running"}]},{"id":347,"kind":"app","opcode":"Set","args":[{"id":346,"kind":"name","name":"j"}]}]}]},{"id":356,"kind":"str","value":"cleanup"},{"id":355,"kind":"app","opcode":"union","args":[{"id":352,"kind":"app","opcode":"field","args":[{"id":350,"kind":"name","name":"s"},{"id":351,"kind":"str","value":"cleanup"}]},{"id":354,"kind":"app","opcode":"Set","args":[{"id":353,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"364":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"366":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"367":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"370":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"372":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"373":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"376":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"380":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"383":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"387":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"390":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"397":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"401":{"id":401,"kind":"def","name":"drain","qualifier":"action","expr":{"id":400,"kind":"let","opdef":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]}},"expr":{"id":399,"kind":"app","opcode":"actionAll","args":[{"id":371,"kind":"app","opcode":"contains","args":[{"id":369,"kind":"app","opcode":"field","args":[{"id":367,"kind":"name","name":"s"},{"id":368,"kind":"str","value":"returned"}]},{"id":370,"kind":"name","name":"j"}]},{"id":398,"kind":"app","opcode":"assign","args":[{"id":397,"kind":"name","name":"s"},{"id":396,"kind":"app","opcode":"with","args":[{"id":395,"kind":"app","opcode":"with","args":[{"id":394,"kind":"app","opcode":"with","args":[{"id":372,"kind":"name","name":"s"},{"id":379,"kind":"str","value":"returned"},{"id":378,"kind":"app","opcode":"exclude","args":[{"id":375,"kind":"app","opcode":"field","args":[{"id":373,"kind":"name","name":"s"},{"id":374,"kind":"str","value":"returned"}]},{"id":377,"kind":"app","opcode":"Set","args":[{"id":376,"kind":"name","name":"j"}]}]}]},{"id":386,"kind":"str","value":"admitted"},{"id":385,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"app","opcode":"field","args":[{"id":380,"kind":"name","name":"s"},{"id":381,"kind":"str","value":"admitted"}]},{"id":384,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"name","name":"j"}]}]}]},{"id":393,"kind":"str","value":"done"},{"id":392,"kind":"app","opcode":"union","args":[{"id":389,"kind":"app","opcode":"field","args":[{"id":387,"kind":"name","name":"s"},{"id":388,"kind":"str","value":"done"}]},{"id":391,"kind":"app","opcode":"Set","args":[{"id":390,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"402":{"id":25,"kind":"def","name":"jobs","qualifier":"pureval","expr":{"id":24,"kind":"app","opcode":"Set","args":[{"id":19,"kind":"int","value":0},{"id":20,"kind":"int","value":1},{"id":21,"kind":"int","value":2},{"id":22,"kind":"int","value":3},{"id":23,"kind":"int","value":4}]},"depth":0},"404":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"405":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"408":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"410":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"411":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"414":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"418":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"421":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"425":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"428":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]},"depth":2,"shadowing":false},"435":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"439":{"id":439,"kind":"def","name":"clean","qualifier":"action","expr":{"id":438,"kind":"let","opdef":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]}},"expr":{"id":437,"kind":"app","opcode":"actionAll","args":[{"id":409,"kind":"app","opcode":"contains","args":[{"id":407,"kind":"app","opcode":"field","args":[{"id":405,"kind":"name","name":"s"},{"id":406,"kind":"str","value":"cleanup"}]},{"id":408,"kind":"name","name":"j"}]},{"id":436,"kind":"app","opcode":"assign","args":[{"id":435,"kind":"name","name":"s"},{"id":434,"kind":"app","opcode":"with","args":[{"id":433,"kind":"app","opcode":"with","args":[{"id":432,"kind":"app","opcode":"with","args":[{"id":410,"kind":"name","name":"s"},{"id":417,"kind":"str","value":"cleanup"},{"id":416,"kind":"app","opcode":"exclude","args":[{"id":413,"kind":"app","opcode":"field","args":[{"id":411,"kind":"name","name":"s"},{"id":412,"kind":"str","value":"cleanup"}]},{"id":415,"kind":"app","opcode":"Set","args":[{"id":414,"kind":"name","name":"j"}]}]}]},{"id":424,"kind":"str","value":"admitted"},{"id":423,"kind":"app","opcode":"exclude","args":[{"id":420,"kind":"app","opcode":"field","args":[{"id":418,"kind":"name","name":"s"},{"id":419,"kind":"str","value":"admitted"}]},{"id":422,"kind":"app","opcode":"Set","args":[{"id":421,"kind":"name","name":"j"}]}]}]},{"id":431,"kind":"str","value":"done"},{"id":430,"kind":"app","opcode":"union","args":[{"id":427,"kind":"app","opcode":"field","args":[{"id":425,"kind":"name","name":"s"},{"id":426,"kind":"str","value":"done"}]},{"id":429,"kind":"app","opcode":"Set","args":[{"id":428,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"440":{"id":273,"kind":"def","name":"admit","qualifier":"action","expr":{"id":272,"kind":"let","opdef":{"id":225,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":224,"kind":"app","opcode":"oneOf","args":[{"id":223,"kind":"name","name":"jobs"}]}},"expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":229,"kind":"app","opcode":"not","args":[{"id":228,"kind":"app","opcode":"contains","args":[{"id":226,"kind":"name","name":"owners"},{"id":227,"kind":"name","name":"j"}]}]},{"id":235,"kind":"app","opcode":"not","args":[{"id":234,"kind":"app","opcode":"contains","args":[{"id":232,"kind":"app","opcode":"field","args":[{"id":230,"kind":"name","name":"s"},{"id":231,"kind":"str","value":"done"}]},{"id":233,"kind":"name","name":"j"}]}]},{"id":243,"kind":"app","opcode":"ilt","args":[{"id":239,"kind":"app","opcode":"size","args":[{"id":238,"kind":"app","opcode":"field","args":[{"id":236,"kind":"name","name":"s"},{"id":237,"kind":"str","value":"admitted"}]}]},{"id":242,"kind":"app","opcode":"field","args":[{"id":240,"kind":"name","name":"s"},{"id":241,"kind":"str","value":"limit"}]}]},{"id":251,"kind":"app","opcode":"ilt","args":[{"id":247,"kind":"app","opcode":"size","args":[{"id":246,"kind":"app","opcode":"field","args":[{"id":244,"kind":"name","name":"s"},{"id":245,"kind":"str","value":"queued"}]}]},{"id":250,"kind":"app","opcode":"field","args":[{"id":248,"kind":"name","name":"s"},{"id":249,"kind":"str","value":"queueLimit"}]}]},{"id":270,"kind":"app","opcode":"assign","args":[{"id":269,"kind":"name","name":"s"},{"id":268,"kind":"app","opcode":"with","args":[{"id":267,"kind":"app","opcode":"with","args":[{"id":252,"kind":"name","name":"s"},{"id":259,"kind":"str","value":"admitted"},{"id":258,"kind":"app","opcode":"union","args":[{"id":255,"kind":"app","opcode":"field","args":[{"id":253,"kind":"name","name":"s"},{"id":254,"kind":"str","value":"admitted"}]},{"id":257,"kind":"app","opcode":"Set","args":[{"id":256,"kind":"name","name":"j"}]}]}]},{"id":266,"kind":"str","value":"queued"},{"id":265,"kind":"app","opcode":"union","args":[{"id":262,"kind":"app","opcode":"field","args":[{"id":260,"kind":"name","name":"s"},{"id":261,"kind":"str","value":"queued"}]},{"id":264,"kind":"app","opcode":"Set","args":[{"id":263,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"441":{"id":303,"kind":"def","name":"start","qualifier":"action","expr":{"id":302,"kind":"let","opdef":{"id":276,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":275,"kind":"app","opcode":"oneOf","args":[{"id":274,"kind":"name","name":"jobs"}]}},"expr":{"id":301,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"app","opcode":"contains","args":[{"id":279,"kind":"app","opcode":"field","args":[{"id":277,"kind":"name","name":"s"},{"id":278,"kind":"str","value":"queued"}]},{"id":280,"kind":"name","name":"j"}]},{"id":300,"kind":"app","opcode":"assign","args":[{"id":299,"kind":"name","name":"s"},{"id":298,"kind":"app","opcode":"with","args":[{"id":297,"kind":"app","opcode":"with","args":[{"id":282,"kind":"name","name":"s"},{"id":289,"kind":"str","value":"queued"},{"id":288,"kind":"app","opcode":"exclude","args":[{"id":285,"kind":"app","opcode":"field","args":[{"id":283,"kind":"name","name":"s"},{"id":284,"kind":"str","value":"queued"}]},{"id":287,"kind":"app","opcode":"Set","args":[{"id":286,"kind":"name","name":"j"}]}]}]},{"id":296,"kind":"str","value":"running"},{"id":295,"kind":"app","opcode":"union","args":[{"id":292,"kind":"app","opcode":"field","args":[{"id":290,"kind":"name","name":"s"},{"id":291,"kind":"str","value":"running"}]},{"id":294,"kind":"app","opcode":"Set","args":[{"id":293,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"442":{"id":333,"kind":"def","name":"finish","qualifier":"action","expr":{"id":332,"kind":"let","opdef":{"id":306,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":305,"kind":"app","opcode":"oneOf","args":[{"id":304,"kind":"name","name":"jobs"}]}},"expr":{"id":331,"kind":"app","opcode":"actionAll","args":[{"id":311,"kind":"app","opcode":"contains","args":[{"id":309,"kind":"app","opcode":"field","args":[{"id":307,"kind":"name","name":"s"},{"id":308,"kind":"str","value":"running"}]},{"id":310,"kind":"name","name":"j"}]},{"id":330,"kind":"app","opcode":"assign","args":[{"id":329,"kind":"name","name":"s"},{"id":328,"kind":"app","opcode":"with","args":[{"id":327,"kind":"app","opcode":"with","args":[{"id":312,"kind":"name","name":"s"},{"id":319,"kind":"str","value":"running"},{"id":318,"kind":"app","opcode":"exclude","args":[{"id":315,"kind":"app","opcode":"field","args":[{"id":313,"kind":"name","name":"s"},{"id":314,"kind":"str","value":"running"}]},{"id":317,"kind":"app","opcode":"Set","args":[{"id":316,"kind":"name","name":"j"}]}]}]},{"id":326,"kind":"str","value":"returned"},{"id":325,"kind":"app","opcode":"union","args":[{"id":322,"kind":"app","opcode":"field","args":[{"id":320,"kind":"name","name":"s"},{"id":321,"kind":"str","value":"returned"}]},{"id":324,"kind":"app","opcode":"Set","args":[{"id":323,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"443":{"id":363,"kind":"def","name":"cancel","qualifier":"action","expr":{"id":362,"kind":"let","opdef":{"id":336,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":335,"kind":"app","opcode":"oneOf","args":[{"id":334,"kind":"name","name":"jobs"}]}},"expr":{"id":361,"kind":"app","opcode":"actionAll","args":[{"id":341,"kind":"app","opcode":"contains","args":[{"id":339,"kind":"app","opcode":"field","args":[{"id":337,"kind":"name","name":"s"},{"id":338,"kind":"str","value":"running"}]},{"id":340,"kind":"name","name":"j"}]},{"id":360,"kind":"app","opcode":"assign","args":[{"id":359,"kind":"name","name":"s"},{"id":358,"kind":"app","opcode":"with","args":[{"id":357,"kind":"app","opcode":"with","args":[{"id":342,"kind":"name","name":"s"},{"id":349,"kind":"str","value":"running"},{"id":348,"kind":"app","opcode":"exclude","args":[{"id":345,"kind":"app","opcode":"field","args":[{"id":343,"kind":"name","name":"s"},{"id":344,"kind":"str","value":"running"}]},{"id":347,"kind":"app","opcode":"Set","args":[{"id":346,"kind":"name","name":"j"}]}]}]},{"id":356,"kind":"str","value":"cleanup"},{"id":355,"kind":"app","opcode":"union","args":[{"id":352,"kind":"app","opcode":"field","args":[{"id":350,"kind":"name","name":"s"},{"id":351,"kind":"str","value":"cleanup"}]},{"id":354,"kind":"app","opcode":"Set","args":[{"id":353,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"444":{"id":401,"kind":"def","name":"drain","qualifier":"action","expr":{"id":400,"kind":"let","opdef":{"id":366,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":365,"kind":"app","opcode":"oneOf","args":[{"id":364,"kind":"name","name":"jobs"}]}},"expr":{"id":399,"kind":"app","opcode":"actionAll","args":[{"id":371,"kind":"app","opcode":"contains","args":[{"id":369,"kind":"app","opcode":"field","args":[{"id":367,"kind":"name","name":"s"},{"id":368,"kind":"str","value":"returned"}]},{"id":370,"kind":"name","name":"j"}]},{"id":398,"kind":"app","opcode":"assign","args":[{"id":397,"kind":"name","name":"s"},{"id":396,"kind":"app","opcode":"with","args":[{"id":395,"kind":"app","opcode":"with","args":[{"id":394,"kind":"app","opcode":"with","args":[{"id":372,"kind":"name","name":"s"},{"id":379,"kind":"str","value":"returned"},{"id":378,"kind":"app","opcode":"exclude","args":[{"id":375,"kind":"app","opcode":"field","args":[{"id":373,"kind":"name","name":"s"},{"id":374,"kind":"str","value":"returned"}]},{"id":377,"kind":"app","opcode":"Set","args":[{"id":376,"kind":"name","name":"j"}]}]}]},{"id":386,"kind":"str","value":"admitted"},{"id":385,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"app","opcode":"field","args":[{"id":380,"kind":"name","name":"s"},{"id":381,"kind":"str","value":"admitted"}]},{"id":384,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"name","name":"j"}]}]}]},{"id":393,"kind":"str","value":"done"},{"id":392,"kind":"app","opcode":"union","args":[{"id":389,"kind":"app","opcode":"field","args":[{"id":387,"kind":"name","name":"s"},{"id":388,"kind":"str","value":"done"}]},{"id":391,"kind":"app","opcode":"Set","args":[{"id":390,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"445":{"id":439,"kind":"def","name":"clean","qualifier":"action","expr":{"id":438,"kind":"let","opdef":{"id":404,"kind":"def","name":"j","qualifier":"nondet","expr":{"id":403,"kind":"app","opcode":"oneOf","args":[{"id":402,"kind":"name","name":"jobs"}]}},"expr":{"id":437,"kind":"app","opcode":"actionAll","args":[{"id":409,"kind":"app","opcode":"contains","args":[{"id":407,"kind":"app","opcode":"field","args":[{"id":405,"kind":"name","name":"s"},{"id":406,"kind":"str","value":"cleanup"}]},{"id":408,"kind":"name","name":"j"}]},{"id":436,"kind":"app","opcode":"assign","args":[{"id":435,"kind":"name","name":"s"},{"id":434,"kind":"app","opcode":"with","args":[{"id":433,"kind":"app","opcode":"with","args":[{"id":432,"kind":"app","opcode":"with","args":[{"id":410,"kind":"name","name":"s"},{"id":417,"kind":"str","value":"cleanup"},{"id":416,"kind":"app","opcode":"exclude","args":[{"id":413,"kind":"app","opcode":"field","args":[{"id":411,"kind":"name","name":"s"},{"id":412,"kind":"str","value":"cleanup"}]},{"id":415,"kind":"app","opcode":"Set","args":[{"id":414,"kind":"name","name":"j"}]}]}]},{"id":424,"kind":"str","value":"admitted"},{"id":423,"kind":"app","opcode":"exclude","args":[{"id":420,"kind":"app","opcode":"field","args":[{"id":418,"kind":"name","name":"s"},{"id":419,"kind":"str","value":"admitted"}]},{"id":422,"kind":"app","opcode":"Set","args":[{"id":421,"kind":"name","name":"j"}]}]}]},{"id":431,"kind":"str","value":"done"},{"id":430,"kind":"app","opcode":"union","args":[{"id":427,"kind":"app","opcode":"field","args":[{"id":425,"kind":"name","name":"s"},{"id":426,"kind":"str","value":"done"}]},{"id":429,"kind":"app","opcode":"Set","args":[{"id":428,"kind":"name","name":"j"}]}]}]}]}]}},"depth":0},"446":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"447":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"450":{"id":450,"kind":"def","name":"step","qualifier":"action","expr":{"id":449,"kind":"app","opcode":"actionAny","args":[{"id":440,"kind":"name","name":"admit"},{"id":441,"kind":"name","name":"start"},{"id":442,"kind":"name","name":"finish"},{"id":443,"kind":"name","name":"cancel"},{"id":444,"kind":"name","name":"drain"},{"id":445,"kind":"name","name":"clean"},{"id":448,"kind":"app","opcode":"assign","args":[{"id":447,"kind":"name","name":"s"},{"id":446,"kind":"name","name":"s"}]}]},"depth":0},"451":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"462":{"kind":"var","name":"s","typeAnnotation":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}},"id":18,"depth":0},"464":{"id":464,"kind":"def","name":"earlyRelease","qualifier":"action","expr":{"id":463,"kind":"app","opcode":"assign","args":[{"id":462,"kind":"name","name":"s"},{"id":461,"kind":"app","opcode":"with","args":[{"id":460,"kind":"app","opcode":"with","args":[{"id":459,"kind":"app","opcode":"with","args":[{"id":451,"kind":"name","name":"s"},{"id":453,"kind":"str","value":"running"},{"id":452,"kind":"app","opcode":"Set","args":[]}]},{"id":456,"kind":"str","value":"cleanup"},{"id":455,"kind":"app","opcode":"Set","args":[{"id":454,"kind":"int","value":0}]}]},{"id":458,"kind":"str","value":"admitted"},{"id":457,"kind":"app","opcode":"Set","args":[]}]}]},"depth":0},"468":{"id":58,"kind":"def","name":"initResource","qualifier":"action","expr":{"id":57,"kind":"app","opcode":"assign","args":[{"id":56,"kind":"name","name":"s"},{"id":55,"kind":"app","opcode":"with","args":[{"id":54,"kind":"app","opcode":"with","args":[{"id":49,"kind":"name","name":"initial"},{"id":51,"kind":"str","value":"limit"},{"id":50,"kind":"int","value":1}]},{"id":53,"kind":"str","value":"queueLimit"},{"id":52,"kind":"int","value":1}]}]},"depth":0},"469":{"id":469,"kind":"def","name":"q::init","qualifier":"action","expr":{"id":468,"kind":"name","name":"initResource"},"depth":0},"470":{"id":450,"kind":"def","name":"step","qualifier":"action","expr":{"id":449,"kind":"app","opcode":"actionAny","args":[{"id":440,"kind":"name","name":"admit"},{"id":441,"kind":"name","name":"start"},{"id":442,"kind":"name","name":"finish"},{"id":443,"kind":"name","name":"cancel"},{"id":444,"kind":"name","name":"drain"},{"id":445,"kind":"name","name":"clean"},{"id":448,"kind":"app","opcode":"assign","args":[{"id":447,"kind":"name","name":"s"},{"id":446,"kind":"name","name":"s"}]}]},"depth":0},"471":{"id":471,"kind":"def","name":"q::step","qualifier":"action","expr":{"id":470,"kind":"name","name":"step"},"depth":0},"472":{"id":202,"kind":"def","name":"safe","qualifier":"val","expr":{"id":201,"kind":"app","opcode":"actionAll","args":[{"id":116,"kind":"app","opcode":"eq","args":[{"id":112,"kind":"name","name":"owners"},{"id":115,"kind":"app","opcode":"field","args":[{"id":113,"kind":"name","name":"s"},{"id":114,"kind":"str","value":"admitted"}]}]},{"id":124,"kind":"app","opcode":"ilte","args":[{"id":120,"kind":"app","opcode":"size","args":[{"id":119,"kind":"app","opcode":"field","args":[{"id":117,"kind":"name","name":"s"},{"id":118,"kind":"str","value":"admitted"}]}]},{"id":123,"kind":"app","opcode":"field","args":[{"id":121,"kind":"name","name":"s"},{"id":122,"kind":"str","value":"limit"}]}]},{"id":132,"kind":"app","opcode":"ilte","args":[{"id":128,"kind":"app","opcode":"size","args":[{"id":127,"kind":"app","opcode":"field","args":[{"id":125,"kind":"name","name":"s"},{"id":126,"kind":"str","value":"queued"}]}]},{"id":131,"kind":"app","opcode":"field","args":[{"id":129,"kind":"name","name":"s"},{"id":130,"kind":"str","value":"queueLimit"}]}]},{"id":142,"kind":"app","opcode":"eq","args":[{"id":140,"kind":"app","opcode":"size","args":[{"id":139,"kind":"app","opcode":"intersect","args":[{"id":135,"kind":"app","opcode":"field","args":[{"id":133,"kind":"name","name":"s"},{"id":134,"kind":"str","value":"queued"}]},{"id":138,"kind":"app","opcode":"field","args":[{"id":136,"kind":"name","name":"s"},{"id":137,"kind":"str","value":"running"}]}]}]},{"id":141,"kind":"int","value":0}]},{"id":152,"kind":"app","opcode":"eq","args":[{"id":150,"kind":"app","opcode":"size","args":[{"id":149,"kind":"app","opcode":"intersect","args":[{"id":145,"kind":"app","opcode":"field","args":[{"id":143,"kind":"name","name":"s"},{"id":144,"kind":"str","value":"queued"}]},{"id":148,"kind":"app","opcode":"field","args":[{"id":146,"kind":"name","name":"s"},{"id":147,"kind":"str","value":"returned"}]}]}]},{"id":151,"kind":"int","value":0}]},{"id":162,"kind":"app","opcode":"eq","args":[{"id":160,"kind":"app","opcode":"size","args":[{"id":159,"kind":"app","opcode":"intersect","args":[{"id":155,"kind":"app","opcode":"field","args":[{"id":153,"kind":"name","name":"s"},{"id":154,"kind":"str","value":"queued"}]},{"id":158,"kind":"app","opcode":"field","args":[{"id":156,"kind":"name","name":"s"},{"id":157,"kind":"str","value":"cleanup"}]}]}]},{"id":161,"kind":"int","value":0}]},{"id":172,"kind":"app","opcode":"eq","args":[{"id":170,"kind":"app","opcode":"size","args":[{"id":169,"kind":"app","opcode":"intersect","args":[{"id":165,"kind":"app","opcode":"field","args":[{"id":163,"kind":"name","name":"s"},{"id":164,"kind":"str","value":"running"}]},{"id":168,"kind":"app","opcode":"field","args":[{"id":166,"kind":"name","name":"s"},{"id":167,"kind":"str","value":"returned"}]}]}]},{"id":171,"kind":"int","value":0}]},{"id":182,"kind":"app","opcode":"eq","args":[{"id":180,"kind":"app","opcode":"size","args":[{"id":179,"kind":"app","opcode":"intersect","args":[{"id":175,"kind":"app","opcode":"field","args":[{"id":173,"kind":"name","name":"s"},{"id":174,"kind":"str","value":"running"}]},{"id":178,"kind":"app","opcode":"field","args":[{"id":176,"kind":"name","name":"s"},{"id":177,"kind":"str","value":"cleanup"}]}]}]},{"id":181,"kind":"int","value":0}]},{"id":192,"kind":"app","opcode":"eq","args":[{"id":190,"kind":"app","opcode":"size","args":[{"id":189,"kind":"app","opcode":"intersect","args":[{"id":185,"kind":"app","opcode":"field","args":[{"id":183,"kind":"name","name":"s"},{"id":184,"kind":"str","value":"returned"}]},{"id":188,"kind":"app","opcode":"field","args":[{"id":186,"kind":"name","name":"s"},{"id":187,"kind":"str","value":"cleanup"}]}]}]},{"id":191,"kind":"int","value":0}]},{"id":200,"kind":"app","opcode":"eq","args":[{"id":198,"kind":"app","opcode":"size","args":[{"id":197,"kind":"app","opcode":"intersect","args":[{"id":195,"kind":"app","opcode":"field","args":[{"id":193,"kind":"name","name":"s"},{"id":194,"kind":"str","value":"done"}]},{"id":196,"kind":"name","name":"owners"}]}]},{"id":199,"kind":"int","value":0}]}]},"depth":0},"474":{"id":474,"kind":"def","name":"q::inv","qualifier":"val","expr":{"id":473,"kind":"app","opcode":"and","args":[{"id":472,"kind":"name","name":"safe"}]},"depth":0}},"types":{"18":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"19":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"20":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"21":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"22":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"23":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"24":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"25":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"27":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"28":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"29":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"30":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"31":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},"32":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"33":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},"34":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"35":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},"36":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"37":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},"38":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"39":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},"40":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"41":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}},"42":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"43":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"44":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"45":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"46":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"47":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"48":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"49":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"50":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"51":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"52":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"53":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"54":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"55":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"56":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"57":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"58":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"59":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"60":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"61":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"62":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"63":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"64":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"65":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"66":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"67":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"68":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"69":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"70":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"71":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"72":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"73":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"running","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"74":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"75":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"76":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"77":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"78":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"79":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"80":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"81":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"82":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"83":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"84":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"85":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"86":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"87":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"88":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"89":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"90":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"91":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"92":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"running","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"limit","fieldType":{"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"kind":"int"}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":2}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":2}},{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":2}}],"other":{"kind":"empty"}}}},"93":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"94":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"95":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"96":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"97":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"98":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"99":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"100":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"101":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"102":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"103":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"104":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"105":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"106":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"107":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"108":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"109":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"110":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"111":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"112":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"113":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"114":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"115":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},"116":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"117":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"118":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"119":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},"120":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"121":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"122":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"123":{"typeVariables":[],"rowVariables":[],"type":{"id":1,"kind":"int"}},"124":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"125":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"126":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"127":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"128":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"129":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"130":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"131":{"typeVariables":[],"rowVariables":[],"type":{"id":2,"kind":"int"}},"132":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"133":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"134":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"135":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"136":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"137":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"138":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"139":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"140":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"141":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"142":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"143":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"144":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"145":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"146":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"147":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"148":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"149":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"150":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"151":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"152":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"153":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"154":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"155":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"156":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"157":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"158":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"159":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"160":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"161":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"162":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"163":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"164":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"165":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"166":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"167":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"168":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"169":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},"170":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"171":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"172":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"173":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"174":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"175":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"176":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"177":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"178":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"179":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},"180":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"181":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"182":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"183":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"184":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"185":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"186":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"187":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"188":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"189":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},"190":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"191":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"192":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"193":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"194":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"195":{"typeVariables":[],"rowVariables":[],"type":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}},"196":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"197":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":13,"kind":"int"},"id":6}},"198":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"199":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"200":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"201":{"typeVariables":[],"rowVariables":[],"type":{"id":11,"kind":"bool"}},"202":{"typeVariables":[],"rowVariables":[],"type":{"id":11,"kind":"bool"}},"203":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"204":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"205":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"206":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"207":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"208":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"209":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"210":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"211":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"212":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"213":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"214":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"215":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"216":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"217":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"218":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"219":{"typeVariables":[],"rowVariables":[],"type":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}},"220":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"221":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"222":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"223":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"224":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"225":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"226":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"227":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"228":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"229":{"typeVariables":[],"rowVariables":[],"type":{"id":2,"kind":"bool"}},"230":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"231":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"232":{"typeVariables":[],"rowVariables":[],"type":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}},"233":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"234":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"235":{"typeVariables":[],"rowVariables":[],"type":{"id":2,"kind":"bool"}},"236":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"237":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"238":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},"239":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"240":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"241":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"242":{"typeVariables":[],"rowVariables":[],"type":{"id":1,"kind":"int"}},"243":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"244":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"245":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"246":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"247":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"int"}},"248":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"249":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"250":{"typeVariables":[],"rowVariables":[],"type":{"id":2,"kind":"int"}},"251":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"252":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"253":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"254":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"255":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},"256":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"257":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"258":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},"259":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"260":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"261":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"262":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"263":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"264":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"265":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"266":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"267":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"268":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"269":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"270":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"271":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"bool"}},"272":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"bool"}},"273":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"bool"}},"274":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"275":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"276":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"277":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"278":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"279":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"280":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"281":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"282":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"283":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"284":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"285":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},"286":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"287":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"288":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},"289":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"290":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"291":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"292":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"293":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"294":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"295":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},"296":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"297":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"298":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},{"fieldName":"queued","fieldType":{"kind":"set","elem":{"id":5,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"299":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"300":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"301":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"302":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"303":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"304":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"305":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"306":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"307":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"308":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"309":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"310":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"311":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"312":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"313":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"314":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"315":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"316":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"317":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"318":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},"319":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"320":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"321":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"322":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"323":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"324":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"325":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},"326":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"327":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"328":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"329":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"330":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"331":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"332":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"333":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"334":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"335":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"336":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"337":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"338":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"339":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"340":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"341":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"342":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"343":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"344":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"345":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},"346":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"347":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"348":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},"349":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"350":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"351":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"352":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"353":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"354":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"355":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":11,"kind":"int"},"id":6}},"356":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"357":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"358":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":6}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"359":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"360":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"361":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"362":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"363":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"364":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"365":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"366":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"367":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"368":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"369":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"370":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"371":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"372":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"373":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"374":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"375":{"typeVariables":[],"rowVariables":[],"type":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},"376":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"377":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"378":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},"379":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"380":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"381":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"382":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},"383":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"384":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"385":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},"386":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"387":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"388":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"389":{"typeVariables":[],"rowVariables":[],"type":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}},"390":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"391":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"392":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":13,"kind":"int"},"id":6}},"393":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"394":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"395":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"396":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":6}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},{"fieldName":"returned","fieldType":{"kind":"set","elem":{"id":9,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}}],"other":{"kind":"empty"}}}},"397":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"398":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"399":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"400":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"401":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"402":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":7}},"403":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"404":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"405":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"406":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"407":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"408":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"409":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"bool"}},"410":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"411":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"412":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"413":{"typeVariables":[],"rowVariables":[],"type":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},"414":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"415":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"416":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":11,"kind":"int"},"id":6}},"417":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"418":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"419":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"420":{"typeVariables":[],"rowVariables":[],"type":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},"421":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"422":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"423":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},"424":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"425":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"426":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"427":{"typeVariables":[],"rowVariables":[],"type":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}},"428":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"429":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"430":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":13,"kind":"int"},"id":6}},"431":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"432":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"433":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"434":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"done","fieldType":{"kind":"set","elem":{"id":13,"kind":"int"},"id":6}},{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":6}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"id":11,"kind":"int"},"id":6}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}}],"other":{"kind":"empty"}}}},"435":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"436":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"437":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"438":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"439":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"440":{"typeVariables":[],"rowVariables":[],"type":{"id":6,"kind":"bool"}},"441":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"442":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"443":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"444":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"445":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"446":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"447":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"448":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"449":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"bool"}},"450":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"bool"}},"451":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"452":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},"453":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"454":{"typeVariables":[],"rowVariables":[],"type":{"kind":"int"}},"455":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"kind":"int"},"id":3}},"456":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"457":{"typeVariables":[],"rowVariables":[],"type":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},"458":{"typeVariables":[],"rowVariables":[],"type":{"kind":"str"}},"459":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"460":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"461":{"typeVariables":[],"rowVariables":[],"type":{"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"admitted","fieldType":{"kind":"set","elem":{"id":3,"kind":"int"},"id":2}},{"fieldName":"cleanup","fieldType":{"kind":"set","elem":{"kind":"int"},"id":3}},{"fieldName":"running","fieldType":{"kind":"set","elem":{"id":7,"kind":"int"},"id":2}},{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"462":{"typeVariables":[],"rowVariables":[],"type":{"id":15,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"limit","fieldType":{"id":1,"kind":"int"}},{"fieldName":"queueLimit","fieldType":{"id":2,"kind":"int"}},{"fieldName":"admitted","fieldType":{"id":4,"kind":"set","elem":{"id":3,"kind":"int"}}},{"fieldName":"queued","fieldType":{"id":6,"kind":"set","elem":{"id":5,"kind":"int"}}},{"fieldName":"running","fieldType":{"id":8,"kind":"set","elem":{"id":7,"kind":"int"}}},{"fieldName":"returned","fieldType":{"id":10,"kind":"set","elem":{"id":9,"kind":"int"}}},{"fieldName":"cleanup","fieldType":{"id":12,"kind":"set","elem":{"id":11,"kind":"int"}}},{"fieldName":"done","fieldType":{"id":14,"kind":"set","elem":{"id":13,"kind":"int"}}}],"other":{"kind":"empty"}}}},"463":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"464":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"468":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"469":{"typeVariables":[],"rowVariables":[],"type":{"id":3,"kind":"bool"}},"470":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"bool"}},"471":{"typeVariables":[],"rowVariables":[],"type":{"id":8,"kind":"bool"}},"472":{"typeVariables":[],"rowVariables":[],"type":{"id":11,"kind":"bool"}},"473":{"typeVariables":[],"rowVariables":[],"type":{"id":2,"kind":"bool"}},"474":{"typeVariables":[],"rowVariables":[],"type":{"id":2,"kind":"bool"}}},"effects":{"18":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"19":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"20":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"21":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"22":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"23":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"24":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"25":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"27":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"28":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"29":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"30":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"31":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"32":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"33":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"34":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"35":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"36":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"37":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"38":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"39":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"40":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"41":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"42":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"43":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"44":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"45":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"46":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"47":{"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"48":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"49":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"50":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"51":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"52":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"53":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"54":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"55":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"56":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"57":{"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"58":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"59":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"60":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"61":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"62":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"63":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"64":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"65":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"66":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"67":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"68":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"69":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"70":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"71":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"72":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"73":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"74":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"75":{"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"76":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"77":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"78":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"79":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"80":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"81":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"82":{"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"83":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"84":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"85":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"86":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"87":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"88":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"89":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"90":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"91":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"92":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"93":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"94":{"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"95":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"96":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"97":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"98":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"99":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"100":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"101":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"102":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"103":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"104":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"105":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"106":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"107":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"108":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"109":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"110":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"111":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"112":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"113":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"114":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"115":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"116":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"117":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"118":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"119":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"120":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"121":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"122":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"123":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"124":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"125":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"126":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"127":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"128":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"129":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"130":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"131":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"132":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"133":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"134":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"135":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"136":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"137":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"138":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"139":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"140":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"141":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"142":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"143":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"144":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"145":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"146":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"147":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"148":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"149":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"150":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"151":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"152":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"153":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"154":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"155":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"156":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"157":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"158":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"159":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"160":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"161":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"162":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"163":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"164":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"165":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"166":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"167":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"168":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"169":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"170":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"171":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"172":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"173":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"174":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"175":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"176":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"177":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"178":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"179":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"180":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"181":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"182":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"183":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"184":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"185":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"186":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"187":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"188":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"189":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"190":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"191":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"192":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"193":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"194":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"195":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"196":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"197":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"198":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"199":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"200":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"201":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"202":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"203":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"204":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"205":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"206":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"207":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"208":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"209":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"210":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"211":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"212":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"213":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"214":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"215":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"216":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"217":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"218":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"219":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"220":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"221":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"222":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"223":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"224":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"225":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"226":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"227":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"228":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"229":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"230":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"231":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"232":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"233":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"234":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"235":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"236":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"237":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"238":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"239":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"240":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"241":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"242":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"243":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"244":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"245":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"246":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"247":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"248":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"249":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"250":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"251":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"252":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"253":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"254":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"255":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"256":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"257":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"258":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"259":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"260":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"261":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"262":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"263":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"264":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"265":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"266":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"267":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"268":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"269":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"270":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"271":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"272":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"273":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"274":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"275":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"276":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"277":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"278":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"279":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"280":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"281":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"282":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"283":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"284":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"285":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"286":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"287":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"288":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"289":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"290":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"291":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"292":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"293":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"294":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"295":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"296":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"297":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"298":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"299":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"300":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"301":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"302":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"303":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"304":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"305":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"306":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"307":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"308":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"309":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"310":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"311":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"312":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"313":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"314":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"315":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"316":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"317":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"318":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"319":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"320":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"321":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"322":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"323":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"324":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"325":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"326":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"327":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"328":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"329":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"330":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"331":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"332":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"333":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"334":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"335":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"336":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"337":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"338":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"339":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"340":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"341":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"342":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"343":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"344":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"345":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"346":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"347":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"348":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"349":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"350":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"351":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"352":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"353":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"354":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"355":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"356":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"357":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"358":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"359":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"360":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"361":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"362":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"363":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"364":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"365":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"366":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"367":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"368":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"369":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"370":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"371":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"372":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"373":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"374":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"375":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"376":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"377":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"378":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"379":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"380":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"381":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"382":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"383":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"384":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"385":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"386":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"387":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"388":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"389":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"390":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"391":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"392":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"393":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"394":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"395":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"396":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"397":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"398":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"399":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"400":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"401":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"402":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"403":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"404":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[]}},"405":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"406":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"407":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"408":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"409":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"410":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"411":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"412":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"413":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"414":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"415":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"416":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"417":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"418":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"419":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"420":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"421":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"422":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"423":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"424":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"425":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"426":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"427":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"428":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"429":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"430":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"431":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"432":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"433":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"434":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"435":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"436":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"437":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"438":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"439":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"440":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"441":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"442":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"443":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"444":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"445":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"446":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"447":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"448":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"449":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"450":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}},"451":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"452":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"453":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"454":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"455":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"456":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"457":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"458":{"effect":{"kind":"concrete","components":[]},"effectVariables":[],"entityVariables":[]},"459":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"460":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"461":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"462":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"463":{"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]},"effectVariables":[],"entityVariables":[]},"464":{"effectVariables":[],"entityVariables":[],"effect":{"kind":"concrete","components":[{"kind":"read","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}},{"kind":"update","entity":{"kind":"concrete","stateVariables":[{"name":"s","reference":18}]}}]}}},"errors":[],"status":"ok","main":"BackpressureOwners"} \ No newline at end of file diff --git a/observation/tlc-result.json.license b/observation/tlc-result.json.license new file mode 100644 index 0000000..b6e69b7 --- /dev/null +++ b/observation/tlc-result.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/observation/tlc.log b/observation/tlc.log new file mode 100644 index 0000000..e69de29 diff --git a/observation/version.log b/observation/version.log new file mode 100644 index 0000000..be386c9 --- /dev/null +++ b/observation/version.log @@ -0,0 +1 @@ +0.33.0 diff --git a/observation/version.log.license b/observation/version.log.license new file mode 100644 index 0000000..b6e69b7 --- /dev/null +++ b/observation/version.log.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +SPDX-License-Identifier: LGPL-2.1-or-later diff --git a/package.json b/package.json index 12ed475..0b9fdbf 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "example:compare": "bun packages/render/examples/comparison.ts", "example:overviews": "bun packages/render/examples/overviews.ts", "example:design": "bun packages/render/examples/design-choices.ts", - "example:images": "bun packages/render/examples/raster-comparison.ts" + "example:images": "bun packages/render/examples/raster-comparison.ts", + "example:library-boundary": "bun packages/render/examples/library-boundary.ts" }, "dependencies": { "@fontsource/inter": "5.3.0", diff --git a/packages/render/examples/library-boundary.ts b/packages/render/examples/library-boundary.ts new file mode 100644 index 0000000..d06c224 --- /dev/null +++ b/packages/render/examples/library-boundary.ts @@ -0,0 +1,82 @@ +// SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +// SPDX-License-Identifier: LGPL-2.1-or-later + +import {createHash} from 'node:crypto'; +import {mkdir, readFile, writeFile} from 'node:fs/promises'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {chromium} from 'playwright'; +import sharp from 'sharp'; +import {compileFigureSource, composeFigure, composeModelView} from '@deterministic-engineering/render'; +import {exportFigure} from '@deterministic-engineering/render/export'; +import {attributionFor} from './attribution'; + +const root = fileURLToPath(new URL('../../../', import.meta.url)); +const directory = 'docs/90-99-views/90-architecture-views/'; +const names = [ + '90.139-source-bound-c-and-cpp-contract-verification', + '90.140-flat-declarative-library-boundary', +]; +const output = path.join(root, '.cache/render/library-boundary'); +const compositionSources = [ + 'packages/render/examples/library-boundary.ts', + 'packages/render/examples/attribution.ts', + 'packages/render/src/model-view.ts', + 'packages/render/src/figure.ts', + 'packages/render/src/diagram.ts', + 'packages/render/src/scene-export.ts', + 'packages/render/src/export.ts', + 'packages/render/src/png.ts', + 'packages/render/src/webp.ts', + 'package.json', + 'bun.lock', +]; +const digest = (bytes: Uint8Array) => createHash('sha256').update(bytes).digest('hex'); +await mkdir(output, {recursive: true}); +const browser = await chromium.launch(); +try { + for (const name of names) { + const file = directory + name + '.d2'; + const input = await compileFigureSource({[file]: await readFile(path.join(root, file), 'utf8')}, file); + const sources = Object.fromEntries(await Promise.all( + [...new Set([...compositionSources, ...Object.values(input.references)])] + .map(async source => [source, await readFile(path.join(root, source), 'utf8')]), + )); + const figure = composeFigure({...input, sources: {...input.sources, ...sources}}, composeModelView); + const result = await exportFigure(figure, browser, { + scale: 1.5, + minimumTextSize: 12, + attribution: attributionFor(figure), + }); + if (result.svg.length === 0 || !result.webp) throw new Error('Expected vector scene and lossless WebP'); + const png = await sharp(result.png).ensureAlpha().raw().toBuffer({resolveWithObject: true}); + const webp = await sharp(result.webp).ensureAlpha().raw().toBuffer({resolveWithObject: true}); + if (JSON.stringify(png.info) !== JSON.stringify(webp.info) || !png.data.equals(webp.data)) { + throw new Error('Lossless raster pixels changed'); + } + for (const [source, hash] of Object.entries(figure.sourceSHA256)) { + if (digest(await readFile(path.join(root, source))) !== hash) throw new Error('Stale source: ' + source); + } + const receipt = { + status: 'Design projection only; no Scheme or verifier acceptance', + sources: figure.sourceSHA256, + receipt: result.receipt, + rasterComparison: { + pngBytes: result.png.byteLength, + webpBytes: result.webp.byteLength, + decodedPixelsEqual: true, + decodedPixelSHA256: digest(png.data), + preferredRaster: result.preferredRaster.format, + }, + }; + for (const [extension, bytes] of [ + ['svg', result.svg[0]!], ['png', result.png], ['webp', result.webp], + ['html', result.html], ['json', JSON.stringify(receipt, null, 2) + '\n'], + ] as const) { + await writeFile(path.join(output, `${name}.${extension}`), bytes); + } + console.log(name, result.receipt.width, result.receipt.height, receipt.rasterComparison); + } +} finally { + await browser.close(); +} diff --git a/packages/render/examples/library-case/architecture.ts b/packages/render/examples/library-case/architecture.ts index 51ec7bb..b80732f 100644 --- a/packages/render/examples/library-case/architecture.ts +++ b/packages/render/examples/library-case/architecture.ts @@ -20,7 +20,7 @@ ${architectureDiagram(context)}

3${text(question('boundaries').text)}

${icon('library')}

${text(copy("annotation-24"))}

${text(copy("annotation-25"))}
${text(copy("annotation-26"))}

${icon('selection')}

${text(copy("annotation-27"))}

${text(copy("annotation-28"))}
${text(copy("annotation-29"))}

${icon('reference')}

${text(copy("annotation-30"))}

${text(copy("annotation-31"))}
${text(copy("annotation-32"))}

${icon('evidence')}

${text(copy("annotation-33"))}

${text(copy("annotation-34"))}
${text(copy("annotation-35"))}

4${text(question('products').text)}

${icon('model')}
${text(copy("model-label"))}${text(copy("annotation-36"))}
${icon('document')}
${text(copy("annotation-37"))}${text(copy("annotation-38"))}
${icon('decision')}
${text(copy("annotation-39"))}${text(copy("annotation-40"))}
${icon('pending')}${text(copy("annotation-41"))}
-

${icon('reference')}${text(question('evidence').text)}

${icon('reference')}
${text(copy("annotation-42"))}
${text(copy("annotation-43"))}
${icon('reference')}
${text(copy("annotation-44"))}
${text(copy("annotation-45"))}

${icon('pending')}${text(copy("annotation-46"))}

${icon('pending')}
${text(copy("annotation-47"))}
${text(copy("annotation-48"))}
${icon('pending')}
${text(copy("annotation-49"))}
${text(copy("annotation-50"))}
+

${icon('reference')}${text(question('evidence').text)}

${icon('reference')}
${text(copy("annotation-42"))}
${text(copy("annotation-43"))}
${icon('reference')}
${text(copy("annotation-44"))}
${text(copy("annotation-45"))}

${icon('pending')}${text(copy("annotation-46"))}

${icon('pending')}
${text(copy("annotation-47"))}
${text(copy("annotation-48"))}
${icon('pending')}
${text(copy("annotation-49"))}
${text(copy("annotation-50"))}
${icon('question')}${text(copy("annotation-51"))}
${text(copy("annotation-52"))}${text(copy("annotation-53"))}
`}; return result; }; diff --git a/packages/render/examples/library-case/workflow.ts b/packages/render/examples/library-case/workflow.ts index d8619c0..7815919 100644 --- a/packages/render/examples/library-case/workflow.ts +++ b/packages/render/examples/library-case/workflow.ts @@ -7,10 +7,10 @@ import { caseStyle } from './style'; import { workflowDiagram } from './workflow-diagram'; export const workflow: FigureComposer = (context) => { const {question, reference: ref, icon, text, copy, relation} = context; -for (const [from, to] of [['confirmation','selection'],['selection','acquisition'],['acquisition','association'],['association','preparation'],['preparation','blocked']] as const) relation(from, to); +for (const [from, to] of [['confirmation','selection'],['selection','requirements'],['requirements','association'],['association','preparation'],['preparation','blocked']] as const) relation(from, to); return {css: caseStyle, markup: `
${text(copy("badge"))}
${text(copy("eyebrow"))}

${text(copy("title"))}${text(copy("emphasis"))}

${text(copy("annotation-01"))}

-

1${text(question('progress').text)}${text(copy("annotation-02"))}

${text(copy("annotation-03"))}

${workflowDiagram(context)}
${icon('pending')}${text(copy("annotation-09"))}
+

1${text(question('progress').text)}${text(copy("annotation-02"))}

${text(copy("annotation-03"))}

${workflowDiagram(context)}
${icon('pending')}${text(copy("annotation-09"))}

2${text(question('exchange').text)}

${text(copy("annotation-10"))}${text(copy("annotation-11"))}${text(copy("annotation-12"))}
${text(copy("annotation-13"))}${text(copy("annotation-14"))}${text(copy("annotation-15"))}
${text(copy("annotation-16"))}${text(copy("annotation-17"))}${text(copy("annotation-18"))}
${text(copy("annotation-19"))}${text(copy("annotation-20"))}${text(copy("annotation-21"))}
${text(copy("annotation-22"))}${text(copy("annotation-23"))}${text(copy("annotation-24"))}

${icon('reference')}${text(question('stops').text)}

${icon('reference')}
${text(copy("annotation-25"))}
${icon('reference')}
${text(copy("annotation-26"))}
${icon('reference')}
${text(copy("annotation-27"))}

${icon('pending')}${text(copy("annotation-28"))}

${icon('pending')}
${text(copy("annotation-29"))}
${icon('pending')}
${text(copy("annotation-30"))}
${icon('pending')}
${text(copy("annotation-31"))}
diff --git a/packages/render/examples/test/declarations.test.ts b/packages/render/examples/test/declarations.test.ts index d0e34c0..80bd66a 100644 --- a/packages/render/examples/test/declarations.test.ts +++ b/packages/render/examples/test/declarations.test.ts @@ -21,7 +21,7 @@ test('real Library/Profile/Scenario D2 selects downstream kinds, themes and icon expect(variant.theme!.colors.accent).toBe('#246B59'); expect(variant.icons!.library!.label).toBe('Repository publication'); const figure = composeFigure(variant, input.view.purpose === 'architecture' ? architecture : workflow); - expect(figure.html).toContain('capture-blocked'); expect(figure.html).toContain('"evidenceRefs":[]'); + expect(figure.html).toContain('design-only'); expect(figure.html).toContain('"evidenceRefs":[]'); expect(() => composeFigure({...variant, layout:'not-declared'}, input.view.purpose === 'architecture' ? architecture : workflow)).toThrow('Unsupported case'); } },30000); diff --git a/projects/library-formation/init.ss b/projects/library-formation/init.ss index 37064a6..75c2f17 100644 --- a/projects/library-formation/init.ss +++ b/projects/library-formation/init.ss @@ -1,13 +1,13 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; One declared Project source root, using existing per-owner source annotations. (import :yuanxu/module-system/selection/init-syntax) (yuanxu! source: "../../library" mode: explicit - (backpressure-memory @ "../../library/concurrency/resource-control/backpressure-memory/abstract") - (backpressure-tokio-rayon @ "../../library/concurrency/resource-control/backpressure-memory/tokio-rayon") - (rust-resources @ "../../library/drivers/rust-resources") + (backpressure-memory @ "../../library/backpressure-memory") + (backpressure-tokio-rayon @ "../../library/backpressure-tokio-rayon") + (rust-resources @ "../../library/rust-resources") (project-organization @ "../../library/project-organization") - (project-formation @ "../../library/drivers/project-formation") - (library-project-formation @ "../../scenarios/project-formation")) + (project-formation @ "../../library/project-formation") + (project-intake @ "../../library/project-intake")) diff --git a/scenarios/gateway-review/config.ss b/scenarios/gateway-review/config.ss deleted file mode 100644 index bca003d..0000000 --- a/scenarios/gateway-review/config.ss +++ /dev/null @@ -1,13 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object - "../../profiles/gateway.ss") -(export - Config) -(def Config - (.o - profile: LocalProfile)) diff --git a/scenarios/gateway-review/func.ss b/scenarios/gateway-review/func.ss deleted file mode 100644 index 2a603b8..0000000 --- a/scenarios/gateway-review/func.ss +++ /dev/null @@ -1,93 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object - (only-in :clan/poo/mop validate) - :gerbil-ascent/rules/interface - (only-in :gerbil-ascent/rules/declaration rule-module-program) - "../../profiles/gateway.ss" - "./objects.ss" - "./config.ss") -(export - gateway-review-scope - gateway-scope-rows) - -;; This finite fixture mapping is not a cryptographic identity implementation. -;; Every semantic parameter used here is explicit. Host source/lockfile capture -;; and verified method receipts remain external obligations. -(def (scope-key fields) - (call-with-output-string (lambda (port) (write fields port)))) - -(def (gateway-scope-rows profile usage source) - (list - (list usage 'inventory (.ref profile 'inventory)) - (list usage 'source source) - (list - usage - 'runtime - (scope-key - (list - (.ref profile 'runtime) - (.ref profile 'lock) - (.ref profile 'tokio-workers) - (.ref profile 'rayon-workers) - (.ref profile 'cpu-budget)))) - (list - usage - 'workload - (scope-key - (list - (.ref profile 'workload) - (.ref profile 'capacity) - (.ref profile 'queue) - (.ref profile 'cache-bytes)))) - (list - usage - 'model - (scope-key - (list - 'owners-v1 - (.ref profile 'capacity) - (.ref profile 'queue) - (.ref profile 'factors)))) - (list - usage - 'arithmetic - (scope-key - (list - 'sum-v1 - (.ref profile 'capacity) - (.ref profile 'queue) - (.ref profile 'item) - (.ref profile 'fixed) - (.ref profile 'cache-bytes) - (.ref profile 'budget)))) - (list usage 'cache (scope-key (list 'cache-v1 (.ref profile 'cache-bytes)))))) - -(.def GatewayReviewScenario. - domain: (error "Gateway example requires its domain") - evidence: (error "Gateway example requires its evidence Module") - entry: (.get domain entry) - Scenario: (.cc GatewayCase 'profile (.get Config profile)) - ;; These profiles remain independently authored fixture publications. - cases: (list LocalProfile Cap2Profile CacheProfile RetryProfile) - scope-rows: gateway-scope-rows - methods: (.get domain methods) - open-review: (lambda (profile usage snapshot source (captured-scopes #f)) - (validate (.get domain profile-contract) profile) - (unless (eq? entry (.get domain entry)) (error "Scenario entry differs from selected domain")) - (unless (and (symbol? usage) (string? snapshot) (string? source)) - (error "explicit usage, snapshot and source required")) - ((.get evidence open-review) - entry - profile - usage - snapshot - (or captured-scopes (scope-rows profile usage source))))) -(def (gateway-review-scope selected-domain selected-evidence) - (.o (:: @ GatewayReviewScenario.) - domain: selected-domain - evidence: selected-evidence)) diff --git a/scenarios/gateway-review/interface.ss b/scenarios/gateway-review/interface.ss deleted file mode 100644 index c41b2f5..0000000 --- a/scenarios/gateway-review/interface.ss +++ /dev/null @@ -1,21 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - (only-in :yuanxu/module-system/source/declaration .def)) -(.def GatewayReview - identity: 'gateway-review - core: - (.o - requires: (.o - Domain: (.o - module-id: 'rust-resources - contract: RustResourcesScopeContract) - Evidence: (.o - module-id: 'evidence - contract: ResourceEvidenceScopeContract)) - scope-contract: ScenarioScopeContract - exports: (gateway-review-scope Domain Evidence)) - features: (.o)) diff --git a/scenarios/gateway-review/objects.ss b/scenarios/gateway-review/objects.ss deleted file mode 100644 index b2ad1b1..0000000 --- a/scenarios/gateway-review/objects.ss +++ /dev/null @@ -1,14 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object) -(export - GatewayCase) -(.def GatewayCase - identity: 'gateway-review - library-key: 'rust.resources.backpressure-memory - purpose: 'dependency-and-evidence-review - design: '("10.09" "10.12")) diff --git a/scenarios/gateway-review/types.ss b/scenarios/gateway-review/types.ss deleted file mode 100644 index bdcda56..0000000 --- a/scenarios/gateway-review/types.ss +++ /dev/null @@ -1,22 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object - (only-in :yuanxu/object-types/contracts yuanxu-predicate-contract) - (only-in - "../../library/drivers/rust-resources/types.ss" - RustResourcesScopeContract) - (only-in "../../library/drivers/evidence/types.ss" ResourceEvidenceScopeContract)) -(export - RustResourcesScopeContract - ResourceEvidenceScopeContract - ScenarioScopeContract) -(def ScenarioScopeContract - (yuanxu-predicate-contract - 'gateway/scenario-scope - (lambda (v) - (and (object? v) (.slot? v 'open-review) (procedure? (.ref v 'open-review)))) - (lambda (_v _c) '()))) diff --git a/scenarios/project-formation/codex-source.py b/scenarios/project-formation/codex-source.py deleted file mode 100644 index 3100b60..0000000 --- a/scenarios/project-formation/codex-source.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -# -# SPDX-License-Identifier: LGPL-2.1-or-later - -"""Bounded read-only Codex app-server transport. No inference or authority issuance.""" -import argparse -import hashlib -import json -import os -from pathlib import Path -import selectors -import shutil -import subprocess -import time - - -def observe(thread, turn, messages): - cli = shutil.which('codex') - if not cli: - raise RuntimeError('configured Codex executable is unavailable') - cli = Path(cli).resolve(strict=True) - fingerprint = hashlib.sha256(cli.read_bytes()).hexdigest() - deadline = time.monotonic() + 25 - process = subprocess.Popen([str(cli), 'app-server', '--stdio', '-c', 'analytics.enabled=false'], - stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) - selector = selectors.DefaultSelector() - selector.register(process.stdout, selectors.EVENT_READ) - buffer = b'' - consumed = 0 - request_id = 0 - - def rpc(method, params): - nonlocal buffer, consumed, request_id - request_id += 1 - process.stdin.write((json.dumps(dict(id=request_id, method=method, params=params))+'\n').encode()) - process.stdin.flush() - while time.monotonic() < deadline: - while b'\n' in buffer: - line, buffer = buffer.split(b'\n', 1) - if not line: - continue - response = json.loads(line) - if response.get('id') == request_id: - if 'error' in response: - # Never include an arbitrary remote diagnostic or token in output. - raise RuntimeError('Codex read RPC refused: '+method) - return response['result'] - remaining = deadline-time.monotonic() - if remaining <= 0 or not selector.select(remaining): - break - chunk = os.read(process.stdout.fileno(), 65536) - if not chunk: - raise RuntimeError('Codex read transport closed') - consumed += len(chunk) - if consumed > 16777216: - raise RuntimeError('Codex response byte bound exceeded') - buffer += chunk - raise RuntimeError('Codex read deadline exceeded') - - def account(): - result = rpc('account/read', {'refreshToken': False}) - value = result.get('account') - # Transport redaction only. Scheme owns evidence and authority semantics. - return {'type': value.get('type'), - 'emailSha256': hashlib.sha256(value['email'].encode()).hexdigest() - if isinstance(value.get('email'), str) and value['email'] else None - } if isinstance(value, dict) else None - - try: - rpc('initialize', {'clientInfo': {'name': 'deterministic_engineering_source', - 'version': hashlib.sha256(Path(__file__).read_bytes()).hexdigest()}}) - process.stdin.write(b'{"method":"initialized"}\n') - process.stdin.flush() - before = account() - metadata = rpc('thread/read', {'threadId': thread, 'includeTurns': False})['thread'] - selected = {} - cursor = None - for _ in range(8): - params = dict(threadId=thread, turnId=turn, limit=32, sortDirection='asc') - if cursor is not None: - params['cursor'] = cursor - page = rpc('thread/items/list', params) - for entry in page['data']: - item = entry['item'] - if item.get('id') in messages: - selected[item['id']] = {'turnId': entry['turnId'], 'item': item} - if all(identity in selected for identity in messages): - break - cursor = page.get('nextCursor') - if cursor is None: - break - latest_user = None - cursor = None - for _ in range(8): - params = dict(threadId=thread, limit=32, sortDirection='desc') - if cursor is not None: - params['cursor'] = cursor - page = rpc('thread/items/list', params) - latest_user = next((dict(turnId=row['turnId'], messageId=row['item']['id']) - for row in page['data'] if row['item'].get('type') == 'userMessage'), None) - if latest_user is not None: - break - cursor = page.get('nextCursor') - if cursor is None: - break - after = account() - if hashlib.sha256(cli.read_bytes()).hexdigest() != fingerprint: - raise RuntimeError('Codex executable changed during observation') - return {'accountBefore': before, 'accountAfter': after, - 'threadId': metadata['id'], 'cwd': metadata['cwd'], - 'messages': [selected[x] for x in messages if x in selected], - 'latestUser': latest_user, - 'executable': str(cli), 'executableSha256': fingerprint} - finally: - selector.close() - if process.poll() is None: - process.terminate() - try: - process.wait(timeout=2) - except subprocess.TimeoutExpired: - process.kill() - process.wait() - process.stdin.close() - process.stdout.close() - - -def main(): - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('--thread', required=True) - parser.add_argument('--turn', required=True) - parser.add_argument('--message', action='append', required=True) - args = parser.parse_args() - if not (1 <= len(args.message) <= 16) or len(set(args.message)) != len(args.message): - parser.error('one to sixteen distinct message references required') - for value in [args.thread, args.turn, *args.message]: - if not value or len(value) > 256: - parser.error('bounded nonempty source references required') - print(json.dumps(observe(args.thread, args.turn, args.message), ensure_ascii=False)) - - -if __name__ == '__main__': - main() diff --git a/scenarios/project-formation/codex.ss b/scenarios/project-formation/codex.ss deleted file mode 100644 index d3619d9..0000000 --- a/scenarios/project-formation/codex.ss +++ /dev/null @@ -1,291 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; Actual Codex read transport. This is an observation, not a historical-actor attester. -(import - :clan/poo/object - :std/encoding/json - "objects.ss" - (only-in :std/source this-source-file) - (only-in :std/io/tempfile call-with-temporary-directory) - (only-in :std/misc/ports read-all-as-u8vector) - (only-in :std/crypto/digest sha256) - (only-in :std/encoding/hex hex-encode) - (only-in :yuanxu/ops/process-script ProcessScript.) - (only-in - :yuanxu/contribution/verification - yuanxu-verification-adapter - yuanxu-verify - yuanxu-verification-valid? - yuanxu-revoke-verification!)) -(export - formation-acquire-codex - formation-codex-current! - formation-codex-observation - formation-verify-codex - formation-codex-verification-current! - formation-revoke-codex! - formation-authorize-codex - formation-codex-authorized! - formation-codex-authority-observation) -(def transport (path-expand "codex-source.py" (path-directory (this-source-file)))) -(def consent-source (path-expand "objects.ss" (path-directory (this-source-file)))) -(defstruct codex-inputs (thread turn messages root basis deadline transport-digest) final: #t) -(def (digest path) - (unless (eq? (file-info-type (file-info path #f)) 'regular) - (error "ordinary source executable required" path)) - (hex-encode (sha256 (call-with-input-file path read-all-as-u8vector)))) -(def (bounded-id? value) - (and (string? value) (> (string-length value) 0) (<= (string-length value) 256))) -(def (read-codex thread-id turn-id message-ids) - (call-with-temporary-directory - "codex-source" - (lambda (directory) - (def log (path-expand "read.json" directory)) - (def result - (.call - (.cc ProcessScript. 'command - (append - (list "python3" "-I" transport "--thread" thread-id "--turn" turn-id) - (apply append (map (lambda (id) (list "--message" id)) message-ids))) - 'directory directory 'timeout 30 'log log 'check-status #f) - .run)) - (unless (= (.get result status) 0) - (error "actual Codex read operation failed" (.get result status))) - (when (> (file-info-size (file-info log #f)) 1048576) - (error "Codex observation byte bound exceeded")) - (call-with-input-file log (cut read-json <> object-as-hash: #t))))) -(def (account-key value) - (and (hash-table? value) (list (hash-ref value "type" #f) (hash-ref value "emailSha256" #f)))) -(def (basis-key value) - (list - (account-key (hash-ref value "accountBefore" #f)) - (account-key (hash-ref value "accountAfter" #f)) - (hash-ref value "threadId") - (hash-ref value "cwd") - (hash-ref value "executable") - (hash-ref value "executableSha256") - (let (latest (hash-ref value "latestUser")) - (list (hash-ref latest "turnId") (hash-ref latest "messageId")) - (map - (lambda (row) - (def item (hash-ref row "item")) - (list - (hash-ref row "turnId") - (hash-ref item "type") - (hash-ref item "id") - (hash-ref item "clientId" #f) - (map - (lambda (content) (list (hash-ref content "type") (hash-ref content "text"))) - (hash-ref item "content")))) - (hash-ref value "messages"))))) -(def (admit-basis! basis thread-id turn-id message-ids root) - (def before (hash-ref basis "accountBefore" #f)) - (def after (hash-ref basis "accountAfter" #f)) - (unless (and - (hash-table? before) - (equal? (account-key before) (account-key after)) - (equal? (hash-ref before "type" #f) "chatgpt") - (bounded-id? (hash-ref before "emailSha256" #f))) - (error "Codex account unavailable or changed within observation")) - (unless (equal? thread-id (hash-ref basis "threadId" #f)) - (error "Codex thread association differs")) - (unless (equal? - (path-strip-trailing-directory-separator (path-normalize (path-expand root))) - (path-strip-trailing-directory-separator (path-normalize (path-expand (hash-ref basis "cwd"))))) - (error "Codex repository association differs" root (hash-ref basis "cwd"))) - (unless (equal? - message-ids - (map (lambda (row) (hash-ref (hash-ref row "item") "id")) (hash-ref basis "messages"))) - (error - "required original Codex messages are absent or different" - message-ids - (map (lambda (row) (hash-ref (hash-ref row "item") "id")) (hash-ref basis "messages")))) - (for-each - (lambda (row) - (def item (hash-ref row "item")) - (unless (and - (equal? turn-id (hash-ref row "turnId" #f)) - (equal? (hash-ref item "type" #f) "userMessage") - (pair? (hash-ref item "content")) - (andmap - (lambda (content) - (and - (equal? (hash-ref content "type") "text") - (string? (hash-ref content "text")))) - (hash-ref item "content"))) - (error "original text user-message occurrence required"))) - (hash-ref basis "messages")) - (unless (equal? (hash-ref basis "executableSha256") (digest (hash-ref basis "executable"))) - (error "actual Codex executable changed")) - basis) -(def (formation-acquire-codex thread-id turn-id message-ids root lifetime) - (unless (and - (bounded-id? thread-id) - (bounded-id? turn-id) - (string? root) - (list? message-ids) - (pair? message-ids) - (<= (length message-ids) 16) - (andmap bounded-id? message-ids) - (let loop - ((ids message-ids)) - (or (null? ids) (and (not (member (car ids) (cdr ids))) (loop (cdr ids))))) - (real? lifetime) - (> lifetime 0) - (<= lifetime 120)) - (error "invalid bounded Codex source request")) - (def deadline (+ (real-time) lifetime)) - (def before (list (digest transport) (digest consent-source))) - (def basis - (admit-basis! (read-codex thread-id turn-id message-ids) thread-id turn-id message-ids root)) - (unless (and (equal? before (list (digest transport) (digest consent-source))) (< (real-time) deadline)) - (error "Codex source changed or expired during acquisition")) - (make-codex-inputs - (string-copy thread-id) - (string-copy turn-id) - (map string-copy message-ids) - (path-normalize (path-expand root)) - basis - deadline - before)) -(def (formation-codex-current! original) - (unless (codex-inputs? original) - (error "original Codex observation required; exported JSON is documentary")) - (unless (and - (< (real-time) (codex-inputs-deadline original)) - (equal? (codex-inputs-transport-digest original) (list (digest transport) (digest consent-source)))) - (error "Codex observation expired or transport changed")) - (def fresh - (admit-basis! - (read-codex - (codex-inputs-thread original) - (codex-inputs-turn original) - (codex-inputs-messages original)) - (codex-inputs-thread original) - (codex-inputs-turn original) - (codex-inputs-messages original) - (codex-inputs-root original))) - (unless (and - (equal? (basis-key fresh) (basis-key (codex-inputs-basis original))) - (< (real-time) (codex-inputs-deadline original)) - (equal? (codex-inputs-transport-digest original) (list (digest transport) (digest consent-source)))) - (error "Codex account or original message basis changed; reacquire")) - original) -(def (formation-codex-observation original) - (unless (and - (codex-inputs? original) - (< (real-time) (codex-inputs-deadline original)) - (equal? (codex-inputs-transport-digest original) (list (digest transport) (digest consent-source)))) - (error "current original Codex observation required")) - (.o - status: 'codex-account-and-message-observation - basis: (call-with-input-string - (json->string (codex-inputs-basis original)) - (cut read-json <> object-as-hash: #t)) - historical-actor-binding: 'unavailable - authority: 'observation-only)) - -;; The expected source owner fixes operation and real clock. There is no caller verifier. -;; This verifies only the supported local account/text observation, not C or a role grant. -(defstruct codex-verification (original receipt) final: #t) -(def (instant) (inexact->exact (floor (* 1000 (real-time))))) -(def source-verifier - (yuanxu-verification-adapter - "project-formation/codex-observation" - (lambda (original _now _until) (formation-codex-current! original) #t) - (lambda (original) - (unless (codex-inputs? original) (error "original Codex observation required")) - (object->string - (list - (basis-key (codex-inputs-basis original)) - (codex-inputs-deadline original) - (codex-inputs-transport-digest original)))))) -(def (formation-verify-codex original) - (unless (codex-inputs? original) (error "original Codex observation required")) - (def receipt - (yuanxu-verify - source-verifier - original - (instant) - (inexact->exact (floor (* 1000 (codex-inputs-deadline original)))))) - (unless (and receipt (yuanxu-verification-valid? source-verifier receipt original (instant))) - (when receipt (yuanxu-revoke-verification! source-verifier receipt)) - (error "Codex verification expired during actual source operation")) - (make-codex-verification original receipt)) -(def (formation-codex-verification-current! verification) - (unless (codex-verification? verification) (error "original source verification required")) - (def original (codex-verification-original verification)) - (unless (yuanxu-verification-valid? - source-verifier - (codex-verification-receipt verification) - original - (instant)) - (error "Codex verification expired, revoked or changed")) - (formation-codex-current! original) - (unless (yuanxu-verification-valid? - source-verifier - (codex-verification-receipt verification) - original - (instant)) - (error "Codex verification expired, revoked or changed")) - verification) -(def (formation-revoke-codex! verification) - (unless (codex-verification? verification) (error "original source verification required")) - (yuanxu-revoke-verification! source-verifier (codex-verification-receipt verification))) - -;; Admission is explicitly local: current host account + exact confirmed user choices. -;; It never interprets a declaration, login or owner role as independent-review authority. -(defstruct codex-authority (verification role-source trust-source) final: #t) -(def (reply-answer item) - (def content (hash-ref item "content")) - (and - (= (length content) 1) - (let* ((text (hash-ref (car content) "text")) - (prefix "\n") - (suffix "\n\n")) - (and - (string-prefix? prefix text) - (string-suffix? suffix text) - (let (rows - (call-with-input-string - (substring text (string-length prefix) (- (string-length text) (string-length suffix))) - (cut read-json <> object-as-hash: #t))) - (and (list? rows) (= (length rows) 1) (hash-ref (car rows) "answer" #f))))))) -(def (formation-authorize-codex original) - (unless (codex-inputs? original) (error "original Codex observation required")) - (def rows (hash-ref (codex-inputs-basis original) "messages")) - (def (choice expected) - (def matching (filter (lambda (row) (equal? (reply-answer (hash-ref row "item")) expected)) rows)) - (unless (= (length matching) 1) (error "one original, explicit local consent choice required")) - (hash-ref (hash-ref (car matching) "item") "id")) - (def role-source (choice (.get LocalCodexConsent role-answer))) - (def trust-source (choice (.get LocalCodexConsent trust-answer))) - (unless (equal? trust-source (hash-ref (hash-ref (codex-inputs-basis original) "latestUser") "messageId")) - (error "newer human input requires fresh consent-context evaluation")) - (make-codex-authority (formation-verify-codex original) role-source trust-source)) -(def (formation-codex-authorized! authority purpose root) - (unless (and (codex-authority? authority) (memq purpose (.get LocalCodexConsent purposes))) - (error "original local authority for a supported purpose required")) - (def verification (codex-authority-verification authority)) - (def original (codex-verification-original verification)) - (unless (equal? - (path-strip-trailing-directory-separator (path-normalize (path-expand root))) - (path-strip-trailing-directory-separator (codex-inputs-root original))) - (error "local authority cannot cross repository boundaries")) - (formation-codex-verification-current! verification) - authority) -(def (formation-codex-authority-observation authority) - (unless (codex-authority? authority) (error "original local authority required")) - (def original (codex-verification-original (codex-authority-verification authority))) - (.o - status: 'local-codex-operational-authority - account-subject: (string-copy (hash-ref (hash-ref (codex-inputs-basis original) "accountBefore") "emailSha256")) - root: (string-copy (codex-inputs-root original)) - roles: (append (.get LocalCodexConsent roles) '()) - purposes: (append (.get LocalCodexConsent purposes) '()) - role-source: (string-copy (codex-authority-role-source authority)) - trust-source: (string-copy (codex-authority-trust-source authority)) - trust-boundary: (.get LocalCodexConsent trust-boundary) - limitations: (append (.get LocalCodexConsent limitations) '()))) diff --git a/scenarios/project-formation/config.ss b/scenarios/project-formation/config.ss deleted file mode 100644 index 742db7b..0000000 --- a/scenarios/project-formation/config.ss +++ /dev/null @@ -1,9 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import - "objects.ss") -(export - Config) -(def Config FormationCase) diff --git a/scenarios/project-formation/func.ss b/scenarios/project-formation/func.ss deleted file mode 100644 index 131d375..0000000 --- a/scenarios/project-formation/func.ss +++ /dev/null @@ -1,216 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import - :clan/poo/object - :std/list/list - "../../library/drivers/project-formation/inputs.ss" - "./codex.ss" - "./types.ss" - (only-in :clan/poo/mop validate)) -(export - formation-inputs - project-formation-scope) -(def (formation-inputs declaration profile) - (def candidates (.ref profile 'candidates)) - (unless (pair? (.ref profile 'layout)) (error "selected model layout must be nonempty")) - (def (unique-values? xs) (= (length xs) (length (delete-duplicates/hash xs)))) - (for-each - (lambda (slot) - (unless (and (pair? (.ref declaration slot)) (list? (.ref declaration slot))) - (error "formation requires independent nonempty demand" slot))) - '(roles products duties required-capabilities)) - (unless (and - (pair? candidates) - (list? candidates) - (unique-values? (map (lambda (c) (.ref c 'identity)) candidates)) - (unique-values? (map car (.ref declaration 'roles))) - (unique-values? (map car (.ref profile 'layout))) - (unique-values? (map cadr (.ref profile 'layout))) - (unique-values? (map caddr (.ref profile 'layout))) - (unique-values? (map car (.ref profile 'dependencies)))) - (error "ambiguous candidate/role/layout identity")) - (def role-names (map car (.ref declaration 'roles))) - (unless (andmap - (lambda (edge) - (and - (list? edge) - (= (length edge) 3) - (member (cadr edge) role-names) - (member (caddr edge) role-names))) - (.ref profile 'dependencies)) - (error "dependency must reference declared roles")) - (for-each - (lambda (c) - (unless (unique-values? (map car (.ref c 'owners))) - (error "ambiguous role assignment" (.ref c 'identity)))) - candidates) - (def (rows slot) - (append-map (lambda (c) (map (lambda (r) (cons (.ref c 'identity) r)) (.ref c slot))) candidates)) - (map - (lambda (entry) - (cons - (car entry) - (map - (lambda (row) - (map - (lambda (cell) - (unless (string? cell) (error "formation facts must be strings" cell)) - (string-copy cell)) - row)) - (cdr entry)))) - (list - (cons 'intent (list (list (.ref profile 'project) (.ref profile 'intent)))) - (cons - 'project_layout - (list - (list - (.ref profile 'project) - (.ref profile 'model-package) - (.ref profile 'model-instance) - (.ref profile 'model-library) - (.ref profile 'model-root)))) - (cons - 'candidate - (map (lambda (c) (list (.ref c 'identity) (.ref c 'project) (.ref c 'basis))) candidates)) - (cons 'proposed_owner (rows 'owners)) - (cons - 'proposed_product - (append-map - (lambda (c) (map (lambda (x) (list (.ref c 'identity) x)) (.ref c 'products))) - candidates)) - (cons - 'proposed_duty - (append-map (lambda (c) (map (lambda (x) (list (.ref c 'identity) x)) (.ref c 'duties))) candidates)) - (cons 'declared_capability (rows 'capabilities)) - (cons 'required_role (map (lambda (r) (list (car r))) (.ref declaration 'roles))) - (cons 'allowed_owner (map (lambda (r) (list (car r) (cadr r))) (.ref declaration 'roles))) - (cons 'role_scope (map (lambda (r) (list (car r) (caddr r))) (.ref declaration 'roles))) - (cons 'owner_kind (.ref declaration 'owner-kinds)) - (cons 'protected_owner (.ref declaration 'protected)) - (cons 'required_product (map list (.ref declaration 'products))) - (cons 'required_duty (map list (.ref declaration 'duties))) - (cons 'required_capability (map list (.ref declaration 'required-capabilities))) - (cons 'role_layout (.ref profile 'layout)) - (cons 'role_dependency (.ref profile 'dependencies))))) -;; Composition keeps dependency owners as values. Derived callables use the -;; effective Scenario; acquisition and authority checks remain in their owners. -(.def FormationScenario. - library: (error "Formation Scenario requires its Library") - engine: (error "Formation Scenario requires its engine") - resources: (error "Formation Scenario requires its resource scope") - acquire-codex: formation-acquire-codex - codex-current!: formation-codex-current! - observe-codex: formation-codex-observation - authorize-codex: formation-authorize-codex - codex-authorized!: formation-codex-authorized! - codex-authority-observation: formation-codex-authority-observation - verify-codex: formation-verify-codex - codex-verification-current!: formation-codex-verification-current! - revoke-codex!: formation-revoke-codex! - select: (lambda (profile) (select-formation-profile library engine resources profile)) - prepare-capture: (lambda (request (authority #f)) - (prepare-formation-capture library engine resources request authority)) - input-current!: formation-inputs-current! - observe-inputs: formation-input-observation - acquire: (lambda (root profile) - (formation-acquire-inputs - root - (.get profile project-inputs) - (.get profile input-byte-limit) - (.get profile input-lifetime-seconds))) - inputs: (lambda (profile) (formation-inputs (.get library entry) profile)) - run: (lambda (profile) ((.get engine reason) (inputs profile))) - render: (.get engine render)) -(def (project-formation-scope selected-library selected-engine selected-resources) - (.o (:: @ FormationScenario.) - library: selected-library - engine: selected-engine - resources: selected-resources)) - -(def (select-formation-profile library engine selected-resource-scope profile-input) - (def selected-profile (validate (.get FormationProfileContract value-contract) profile-input)) - (def organization-model (.get library entry)) - (def integration-model (.get selected-resource-scope integration-entry)) - (unless (and - (eq? (.get engine library entry) organization-model) - (eq? (.get selected-profile organization) (.get organization-model identity)) - (eq? (.get selected-profile model-catalog) (.get organization-model catalog identity)) - (eq? (.get selected-profile model-mapping) (.get organization-model mapping identity)) - (equal? - (.get selected-profile model-library) - (symbol->string (.get organization-model catalog package))) - (eq? (.get selected-profile resource-model) (.get selected-resource-scope entry identity)) - (eq? (.get selected-profile integration) (.get integration-model identity)) - (eq? (.get integration-model parent) (.get selected-resource-scope entry)) - (eq? (.get selected-resource-scope entry parent) (.get selected-resource-scope parent entry)) - (eq? (.get selected-profile coding-policy) (.get selected-resource-scope policies coding identity)) - (eq? (.get selected-profile design-policy) (.get selected-resource-scope policies design identity))) - (error "Profile choice or admitted parent/Library/Program association differs")) - (def selected-methods (.get selected-profile resource-methods)) - (unless (and - (pair? selected-methods) - (= (length selected-methods) (length (delete-duplicates/hash selected-methods))) - (andmap - (lambda (key) (.slot? (.get selected-resource-scope bound-methods bindings) key)) - selected-methods)) - (error "Profile must select distinct actual published method bindings")) - (for-each - (lambda (row) - (def mapping-row (assoc (car row) (.get organization-model mapping roles))) - (unless (and mapping-row (equal? (caddr row) (cadr mapping-row)) (equal? (cadddr row) (cadr mapping-row))) - (error "Profile layout does not reference its selected Library catalog/mapping" row))) - (.get selected-profile layout)) - (.o - profile: selected-profile - organization: library - module: engine - resources: selected-resource-scope - methods: (map - (lambda (key) (.ref (.get selected-resource-scope bound-methods bindings) key)) - selected-methods))) - -;; This is an actual preparation and missing-capability report, never C issuance. -;; No callback/record/namespace spelling is admitted as original user authority. -(def (prepare-formation-capture library engine selected-resource-scope request-input authority) - (def request (validate (.get FormationCaptureRequestContract value-contract) request-input)) - (when authority (formation-codex-authorized! authority (.get request purpose) (.get request root))) - (def selected - (select-formation-profile library engine selected-resource-scope (.get request profile))) - (def profile-value (.get selected profile)) - (def acquired - (formation-acquire-inputs - (.get request root) - (.get profile-value project-inputs) - (.get profile-value input-byte-limit) - (.get profile-value input-lifetime-seconds))) - (def repository-observation (formation-input-observation acquired)) - (def origin-findings - (map - (lambda (role-value) - (.o - kind: 'missing-original-source-capability - role: role-value - requirement: "A qualified original host/source occurrence and verifier are required; declared content is not origin.")) - (filter - (lambda (role-value) (not (and authority (eq? role-value 'role-mandate)))) - (.get repository-observation missing-origins)))) - (when authority (formation-codex-authorized! authority (.get request purpose) (.get request root))) - (.o - status: 'capture-blocked - purpose: (.get request purpose) - selection: selected - local-authority: (and authority (formation-codex-authority-observation authority)) - repository-inputs: acquired - observation: repository-observation - findings: (append - origin-findings - (map - (lambda (binding) - (.o - kind: 'unacquired-method-footprint - method: (.get binding definition identity) - required-inputs: (.get binding definition input-demands))) - (.get selected methods))) - capture: #f)) diff --git a/scenarios/project-formation/interface.ss b/scenarios/project-formation/interface.ss deleted file mode 100644 index bcbe4c8..0000000 --- a/scenarios/project-formation/interface.ss +++ /dev/null @@ -1,22 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import - (only-in :yuanxu/module-system/source/declaration .def)) -(.def LibraryProjectFormation - identity: 'library-project-formation - core: (.o - requires: (.o - Library: (.o - module-id: 'project-organization - contract: OrganizationScopeContract) - Engine: (.o - module-id: 'project-formation - contract: FormationScopeContract) - Resources: (.o - module-id: 'rust-resources - contract: RustResourcesScopeContract)) - scope-contract: FormationScenarioContract - exports: (project-formation-scope Library Engine Resources)) - features: (.o)) diff --git a/scenarios/project-formation/objects.ss b/scenarios/project-formation/objects.ss deleted file mode 100644 index d0cc747..0000000 --- a/scenarios/project-formation/objects.ss +++ /dev/null @@ -1,26 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import - :clan/poo/object) -(export - FormationCase - LocalCodexConsent) -(def FormationCase - (.o - identity: 'library-project-formation - purpose: 'design-reasoning)) - -;; Source-channel decoding data for this explicitly confirmed local scope. -;; These localized labels describe human choices; they are not Library versions. -(def LocalCodexConsent - (.o - identity: 'local-codex-consent - revision: "bounded-project-operation" - role-answer: "授予 project-owner 和 implementation-owner,限本仓库设计、实现与验证" - trust-answer: "采用本机受信来源,保留限制,不扩展到独立审查或交付" - roles: '(project-owner implementation-owner) - purposes: '(repository-design implementation verification) - trust-boundary: 'trusted-local-codex - limitations: '(no-historical-account-signature no-independent-review no-delivery no-recipient-authority))) diff --git a/scenarios/project-formation/types.ss b/scenarios/project-formation/types.ss deleted file mode 100644 index dd3fb39..0000000 --- a/scenarios/project-formation/types.ss +++ /dev/null @@ -1,102 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import - :clan/poo/object - (only-in :clan/poo/mop Any Function) - (only-in :clan/poo/type String Symbol List) - (only-in :clan/poo/object-contract ObjectContract.) - (only-in :yuanxu/object-types/contracts YuanxuContract. yuanxu-predicate-type) - "../../types.ss" - (only-in - "../../library/drivers/rust-resources/types.ss" - RustResourcesScopeContract) - (only-in :yuanxu/object-types/contracts yuanxu-predicate-contract) - "../../library/project-organization/types.ss" - "../../library/drivers/project-formation/types.ss") -(export - FormationProfileContract - FormationCaptureRequestContract - RustResourcesScopeContract - OrganizationScopeContract - FormationScopeContract - FormationScenarioContract) -(def FormationScenarioContract - (yuanxu-predicate-contract - 'project-formation/scenario - (lambda (v) - (and - (object? v) - (andmap - (lambda (slot) (and (.slot? v slot) (procedure? (.ref v slot)))) - '(inputs - run - render - acquire - input-current! - observe-inputs - select - prepare-capture - acquire-codex - codex-current! - observe-codex - verify-codex - codex-verification-current! - revoke-codex! - authorize-codex - codex-authorized! - codex-authority-observation)))) - (lambda (_v _c) '()))) - -(def (text-row size) - (yuanxu-predicate-type - 'formation/text-row - (lambda (v) (and (list? v) (= (length v) size) (andmap string? v))))) -(def CandidateShape - (.cc ObjectContract. 'responsibilities - (.o - identity: LibraryNonemptyString - project: LibraryNonemptyString - basis: LibraryNonemptyString - owners: (List (text-row 2)) - products: (List LibraryNonemptyString) - duties: (List LibraryNonemptyString) - capabilities: (List (text-row 2))))) -(def FormationProfileContract - (.cc YuanxuContract. 'identity 'project-formation/profile - 'value-contract (.cc ObjectContract. 'responsibilities - (.o - project: LibraryNonemptyString - intent: LibraryNonemptyString - model-root: LibraryNonemptyString - model-package: LibraryNonemptyString - model-instance: LibraryNonemptyString - model-library: LibraryNonemptyString - layout: (List (text-row 4)) - dependencies: (List (text-row 3)) - candidates: (List CandidateShape) - project-inputs: (List LibraryNonemptyString) - input-byte-limit: (yuanxu-predicate-type - 'formation/byte-bound - (lambda (v) (and (exact-integer? v) (> v 0) (<= v 16777216)))) - input-lifetime-seconds: (yuanxu-predicate-type - 'formation/lifetime - (lambda (v) (and (real? v) (> v 0) (<= v 120)))) - organization: Symbol - model-catalog: Symbol - model-mapping: Symbol - resource-model: Symbol - integration: Symbol - coding-policy: Symbol - design-policy: Symbol - resource-methods: (List Symbol))))) -(def FormationCaptureRequestContract - (.cc YuanxuContract. 'identity 'project-formation/capture-request - 'value-contract (.cc ObjectContract. 'responsibilities - (.o - purpose: (yuanxu-predicate-type - 'formation/capture-purpose - (lambda (v) (eq? v 'repository-design))) - root: LibraryNonemptyString - profile: (.get FormationProfileContract value-contract))))) diff --git a/scenarios/resource-lifecycle/config.ss b/scenarios/resource-lifecycle/config.ss deleted file mode 100644 index 38ec712..0000000 --- a/scenarios/resource-lifecycle/config.ss +++ /dev/null @@ -1,12 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object) -(export - Config) -(def Config - (.o - purpose: 'native-resource-lifecycle)) diff --git a/scenarios/resource-lifecycle/func.ss b/scenarios/resource-lifecycle/func.ss deleted file mode 100644 index 2f8f574..0000000 --- a/scenarios/resource-lifecycle/func.ss +++ /dev/null @@ -1,39 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object - (only-in :clan/poo/mop validate)) -(export - resource-lifecycle-scope) -(.def ResourceLifecycleScenario. - domain: (error "Resource Scenario requires its domain") - evidence: (error "Resource Scenario requires its evidence Module") - contracts: (error "Resource Scenario requires its owner Contract") - entry: (.get domain entry) - integration-entry: (.get domain integration-entry) - methods: (.get domain methods) - capture: (lambda (root profile crate cargo rustc usage (mode 'normal)) - ((.get methods native-context) root entry profile crate cargo rustc usage mode)) - open-review: (lambda (context) - (validate (.get domain context-contract) context) - (unless (and - (eq? entry (.get domain entry)) - (eq? methods (.get domain methods)) - (eq? (.get context entry) entry)) - (error "context or Scenario belongs to another Library entry")) - ((.get methods context-current!) context) - ((.get evidence open-review) - entry - (.get context profile) - (.get context usage) - (.get context snapshot) - (.get context scopes)))) -(def (resource-lifecycle-scope selected-domain selected-evidence selected-contract) - (.o (:: @ ResourceLifecycleScenario.) - domain: selected-domain - evidence: selected-evidence - contracts: (.o - scope: selected-contract))) diff --git a/scenarios/resource-lifecycle/interface.ss b/scenarios/resource-lifecycle/interface.ss deleted file mode 100644 index d1bcb2e..0000000 --- a/scenarios/resource-lifecycle/interface.ss +++ /dev/null @@ -1,21 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - (only-in :yuanxu/module-system/source/declaration .def)) -(.def ResourceLifecycle - identity: 'resource-lifecycle - core: - (.o - requires: (.o - Domain: (.o - module-id: 'rust-resources - contract: RustResourcesScopeContract) - Evidence: (.o - module-id: 'evidence - contract: ResourceEvidenceScopeContract)) - scope-contract: ResourceLifecycleScopeContract - exports: (resource-lifecycle-scope Domain Evidence ResourceLifecycleScopeContract)) - features: (.o)) diff --git a/scenarios/resource-lifecycle/objects.ss b/scenarios/resource-lifecycle/objects.ss deleted file mode 100644 index ddfc34c..0000000 --- a/scenarios/resource-lifecycle/objects.ss +++ /dev/null @@ -1,14 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object) -(export - ResourceLifecycleCase) -(.def ResourceLifecycleCase - identity: 'resource-lifecycle - library-key: 'rust.resources.backpressure-memory - purpose: 'native-owner-protocol-review - design: '("10.14" "10.15")) diff --git a/scenarios/resource-lifecycle/review/archive.ss b/scenarios/resource-lifecycle/review/archive.ss deleted file mode 100644 index 2b55de4..0000000 --- a/scenarios/resource-lifecycle/review/archive.ss +++ /dev/null @@ -1,396 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Root-selected closed history is data. Existing Aitia/Core issue new authority. -(import - :clan/poo/object - :std/encoding/json - :std/list/list - (only-in :std/hash/misc hash-remove!) - (only-in :std/crypto/digest sha256) - (only-in :std/crypto/random random-bytes) - (only-in :std/encoding/hex hex-encode) - "./func.ss" - "./cross-intake.ss") -(export - open-archived-review-source - review-recovery-activation? - recovery-reader-identity - review-repair-prefix!) -;; Freshness bookkeeping only; never history, approval or persisted authority. -(def fresh-readers (make-hash-table)) -(def (recovery-reader-identity) - (def reader (hex-encode (random-bytes 32))) - (hash-put! fresh-readers (string-copy reader) #t) - (string-copy reader)) -(def (load path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (clone value) - (call-with-input-string (json->string value) (cut read-json <> object-as-hash: #t))) -(def (digest value) (hex-encode (sha256 (string->utf8 value)))) -(def (review-recovery-activation? selected root-public tools checkpoint) - (with-catch - (lambda (_) #f) - (lambda () - (def path (.ref selected 'path)) - (def expected (.ref selected 'digest)) - (and - (equal? (review-file-digest path) expected) - ((.ref tools 'verify) root-public path (.ref selected 'signature)) - (let (head (load path)) - (and - (equal? (hash-ref head "schema") "aitia.recovery-head/v1") - (member (hash-ref head "state") '("sealed" "checkpoint")) - (eq? (hash-ref head "reader") #f) - (equal? - (map (lambda (key) (hash-ref head key)) '("archive" "archiveSha256" "owner" "cut")) - checkpoint) - (equal? (review-file-digest (car checkpoint)) (cadr checkpoint)) - (equal? (review-file-digest path) expected))))))) -;; Shared archive contract for activated recovery and explicit repair. -(def (read-review-archive archive-path owner archived-cut reject!) - (def value (with-catch (lambda (_) (reject!)) (lambda () (load archive-path)))) - (def records (hash-ref value "records")) - (def submissions (hash-ref value "submissions")) - (def origins (hash-ref value "origins")) - (def native (hash-ref value "native")) - (def old-packet (hash-ref value "technicalPacket")) - (def old-body (call-with-input-string old-packet (cut read-json <> object-as-hash: #t))) - (def native-data (call-with-input-string native read)) - (unless (and - (or - (and - (equal? (hash-ref value "schema") "aitia.review-archive/v1") - (eq? (hash-ref value "sealed") #t)) - (and - (equal? (hash-ref value "schema") "aitia.review-archive/v2") - (eq? (hash-ref value "sealed") #f) - (equal? (hash-ref value "closure") "accepted-prefix") - (string? (hash-ref value "previousHead")) - (= (hash-ref value "acceptedCount") (length records)))) - (equal? (hash-ref value "owner") owner) - (equal? (hash-ref value "cut") archived-cut) - (list? records) - (list? submissions) - (list? origins) - (= (length records) (length submissions) (length origins)) - (equal? (map car records) (map car origins)) - (= (length records) (length (delete-duplicates/hash (map car records)))) - (list? native-data) - (= (length native-data) 5) - (equal? native (review-history-wire owner (digest old-packet) (list-ref native-data 3) records)) - (equal? archived-cut (digest native))) - (reject!)) - (for-each - (lambda (record submission origin-row) - (def origin (cadr origin-row)) - (def signed (cadr record)) - (unless (and - (list? origin) - (= (length origin) 5) - (every string? origin) - (equal? (car origin) (cadar (hash-ref value "rootReferences"))) - (equal? (cddr origin) (map (lambda (key) (hash-ref old-body key)) '("subject" "revision" "scope")))) - (reject!)) - (unless (equal? - (hash-ref signed "target") - (digest - (json->string - (append - (list "review-family/v1" (car origin) (cadr origin) (hash-ref signed "policy")) - (cddr origin))))) - (reject!)) - (unless (and - (list? submission) - (= (length submission) 4) - (equal? (map car (caddr record)) (filter identity submission)) - (equal? (car record) (cadar (caddr record)))) - (reject!))) - records - submissions - origins) - (def references - (append - (hash-ref value "rootReferences") - (append-map caddr records) - (cadr (list-ref native-data 3)))) - (list - (clone value) - old-body - references - (json->string (review-mechanical-basis old-packet)))) - -;; Explicit storage repair only. Native handover rechecks original decisions; -;; neither this function nor its result can issue a review receipt. -;; host is a trusted serial publisher with selected and publish-repair! methods. -(def (review-repair-prefix! host tools root-public authorization signature) - (def status 'repair-refused) - (with-catch - (lambda (_) status) - (lambda () - (def (refuse!) (set! status 'repair-refused) (error "repair binding refused")) - (def references '()) - (def (require-file! path expected) - (unless (file-exists? path) (set! status 'repair-pending) (error "repair input unavailable")) - (unless (equal? (review-file-digest path) expected) (refuse!)) - (set! references (cons (list path expected) references))) - (def (signed-head reference) - (unless (and (list? reference) (= (length reference) 3) (every string? reference)) (refuse!)) - (require-file! (car reference) (cadr reference)) - (unless (file-exists? (caddr reference)) - (set! status 'repair-pending) - (error "signature unavailable")) - (require-file! (caddr reference) (review-file-digest (caddr reference))) - (unless ((.ref tools 'verify) root-public (car reference) (caddr reference)) (refuse!)) - (def head (load (car reference))) - (unless (equal? (hash-ref head "schema") "aitia.recovery-head/v1") (refuse!)) - head) - (def (selection) - (def ref ((.ref host 'selected))) - (list (.ref ref 'path) (.ref ref 'digest) (.ref ref 'signature))) - (unless (and (file-exists? authorization) (file-exists? signature)) - (set! status 'repair-pending) - (error "repair authorization unavailable")) - (require-file! root-public (review-file-digest root-public)) - (require-file! authorization (review-file-digest authorization)) - (require-file! signature (review-file-digest signature)) - ((.ref tools 'current!)) - (unless ((.ref tools 'verify) root-public authorization signature) (refuse!)) - (def grant (load authorization)) - (unless (and - (= (hash-length grant) 7) - (equal? (hash-ref grant "schema") "aitia.prefix-repair/v1") - (equal? (hash-ref grant "action") "complete-exact-prefix")) - (refuse!)) - (def writing-ref (hash-ref grant "writing")) - (def prior-ref (hash-ref grant "prior")) - (def writing (signed-head writing-ref)) - (def prior (signed-head prior-ref)) - (def candidate (hash-ref grant "candidate")) - (def output (hash-ref grant "outputArchive")) - (def output-head (hash-ref grant "outputHead")) - (unless (and - (every string? (list candidate output output-head)) - (not (member output (list candidate (hash-ref writing "archive")))) - (not (member output-head (map car references))) - (not (equal? output output-head)) - (equal? (hash-ref writing "state") "writing") - (equal? (hash-ref prior "state") "active") - (equal? (hash-ref prior "reader") (hash-ref writing "owner"))) - (refuse!)) - ;; A known later selection refuses replay even if candidate bytes are gone. - (unless (or (equal? (selection) writing-ref) (equal? (car (selection)) output-head)) (refuse!)) - (require-file! candidate (hash-ref writing "archiveSha256")) - (require-file! (hash-ref prior "archive") (hash-ref prior "archiveSha256")) - (def complete - (read-review-archive candidate (hash-ref writing "owner") (hash-ref writing "cut") refuse!)) - (def previous - (read-review-archive - (hash-ref prior "archive") - (hash-ref prior "owner") - (hash-ref prior "cut") - refuse!)) - (def value (car complete)) - (def older (car previous)) - (unless (and - (equal? (hash-ref value "schema") "aitia.review-archive/v2") - (equal? (hash-ref value "previousHead") (cadr prior-ref)) - (equal? (hash-ref value "rootReferences") (hash-ref older "rootReferences")) - ;; Different reader trajectories may have different native packet bytes. - ;; Original record origins remain exact; this repair changes no project. - (equal? - (map (lambda (key) (hash-ref (cadr complete) key)) '("subject" "revision" "scope")) - (map (lambda (key) (hash-ref (cadr previous) key)) '("subject" "revision" "scope"))) - (every - (lambda (key) - (def old (hash-ref older key)) - (def new (hash-ref value key)) - (and (<= (length old) (length new)) (review-json-equal? old (take new (length old))))) - '("records" "submissions" "origins"))) - (refuse!)) - (for-each - (lambda (pair) (require-file! (car pair) (cadr pair))) - (append (caddr complete) (caddr previous) (hash-ref prior "repairReferences" '()))) - (def closure (delete-duplicates/hash (reverse references))) - (def head - (hash - ("schema" "aitia.recovery-head/v1") - ("state" "checkpoint") - ("reader" #f) - ("owner" (hash-ref writing "owner")) - ("cut" (hash-ref writing "cut")) - ("archive" output) - ("archiveSha256" (hash-ref writing "archiveSha256")) - ("previousHead" (cadr prior-ref)) - ("acceptedCount" (length (hash-ref value "records"))) - ("repairAuthorization" (review-file-digest authorization)) - ("repairReferences" closure))) - (def (closure-current!) - ((.ref tools 'current!)) - (for-each (lambda (pair) (require-file! (car pair) (cadr pair))) closure)) - (def (completed-current?) - (def current (selection)) - (and - (equal? (car current) output-head) - (review-json-equal? (signed-head current) head) - (equal? (review-file-digest output) (hash-ref head "archiveSha256")))) - (closure-current!) - (if (equal? (selection) writing-ref) - (let () - ;; Never overwrite the interrupted bytes or any existing output. - (when (or - (file-exists? output) - (file-exists? (string-append output ".pending")) - (file-exists? output-head) - (file-exists? (string-append output-head ".sig"))) - (refuse!)) - (call-with-output-file - (string-append output ".pending") - (lambda (port) - (call-with-input-file - candidate - (lambda (input) - (let loop () (def c (read-char input)) (unless (eof-object? c) (write-char c port) (loop))))))) - (unless (equal? (review-file-digest (string-append output ".pending")) (hash-ref head "archiveSha256")) - (refuse!)) - (rename-file (string-append output ".pending") output) - (closure-current!) - (unless (equal? (selection) writing-ref) (refuse!)) - ((.ref host 'publish-repair!) (json->string head) output-head (cadr writing-ref)) - (unless (completed-current?) (refuse!)) - (closure-current!) - 'repair-completed) - (begin - ;; An activated reader or later prefix can never be replaced by retry. - (unless (completed-current?) (refuse!)) - (closure-current!) - 'repair-reused))))) - -;; mandate is a trusted host capability, not a deserialized archive declaration. -;; head returns a host-selected immutable path/digest/signature reference. -(def (open-archived-review-source mandate tools) - (def owner (string-copy (.ref mandate 'owner))) - (def archived-cut (string-copy (.ref mandate 'cut))) - (def reader (string-copy (.ref mandate 'reader))) - (unless (hash-get fresh-readers reader) - (error "recovery reader must be freshly issued and unclaimed in this process")) - (hash-remove! fresh-readers reader) - (def bound-owner? #f) - (def (claim-archive-owner! id) - (unless (and (not bound-owner?) (equal? id reader)) - (error "recovery source already bound or wrong owner")) - (set! bound-owner? #t)) - (def archive-path (string-copy (.ref mandate 'archive))) - (def root-public (string-copy (.ref mandate 'root-public))) - (def root-sha (review-file-digest root-public)) - (def read-head (.ref mandate 'head)) - (def archive-state 'history-discovery-required) - ;; Publish the checked key and parsed archive as one private relation. A cold - ;; read obtains its local result from the verification branch itself, rather - ;; than observing a separately initialized mutable result later in the thunk. - (def admitted-state #f) - (def (reject!) - (set! archive-state 'archive-refused) - (error "archive reference or contract mismatch")) - (def (check! path expected) - (unless (file-exists? path) - (set! archive-state 'history-discovery-required) - (error "archive dependency unavailable")) - (unless (equal? (review-file-digest path) expected) (reject!))) - (def (read-data path) - (with-catch (lambda (_) (reject!)) (lambda () (load path)))) - (def (capture-archive) - (set! archive-state 'history-discovery-required) - (with-catch - (lambda (_) #f) - (lambda () - (def head-reference (read-head)) - (def head-path (string-copy (.ref head-reference 'path))) - (def head-sha (string-copy (.ref head-reference 'digest))) - (def signature (string-copy (.ref head-reference 'signature))) - (check! head-path head-sha) - (check! root-public root-sha) - ((.ref tools 'current!)) - (def head (read-data head-path)) - (unless (and - (equal? (hash-ref head "schema") "aitia.recovery-head/v1") - (equal? (hash-ref head "owner") owner) - (equal? (hash-ref head "cut") archived-cut) - (equal? (hash-ref head "archive") archive-path)) - (reject!)) - ;; A sealed checkpoint may be selected, but only current activation can import it. - (unless (and - (equal? (hash-ref head "state") "active") - (equal? (hash-ref head "reader") reader)) - (error "history has no current reader activation")) - (def archive-sha (hash-ref head "archiveSha256")) - (check! archive-path archive-sha) - (def signature-sha (review-file-digest signature)) - (def key (list head-path head-sha signature signature-sha archive-path archive-sha root-sha)) - (def cached admitted-state) - (def admitted - (if (and cached (equal? key (car cached))) - (cdr cached) - (begin - (unless ((.ref tools 'verify) root-public head-path signature) (reject!)) - (let (parsed (read-review-archive archive-path owner archived-cut reject!)) - (set! admitted-state (cons key parsed)) - parsed)))) - ;; Reuse the verified signature relation only while its entire byte closure is current. - (for-each - (lambda (pair) (check! (car pair) (cadr pair))) - (append (caddr admitted) (hash-ref head "repairReferences" '()))) - (check! head-path head-sha) - (check! signature signature-sha) - (check! archive-path archive-sha) - (def value (car admitted)) - (def wire - (call-with-output-string - (lambda (port) - (write - (list - 'aitia-archive-source/v1 - owner - archived-cut - archive-path - archive-sha - head-path - head-sha - signature - signature-sha - reader) - port)))) - (set! archive-state 'archive-available) - (let ((selected-owner (string-copy owner)) - (selected-cut (digest wire)) - (selected-native wire) - (selected-records (clone (hash-ref value "records"))) - (selected-submissions (clone (hash-ref value "submissions"))) - (selected-origins (clone (hash-ref value "origins"))) - (selected-basis (string-copy (list-ref admitted 3))) - (selected-roots (clone (hash-ref value "rootReferences"))) - (selected-storage - (delete-duplicates/hash - (append - (clone (caddr admitted)) - (clone (hash-ref head "repairReferences" '())) - (list (list head-path head-sha) (list signature signature-sha) (list archive-path archive-sha)))))) - (.o - owner: selected-owner - cut: selected-cut - native: selected-native - records: selected-records - submissions: selected-submissions - origins: selected-origins - basis: selected-basis - root-references: selected-roots - storage-references: selected-storage))))) - (def owner-identity (string-copy owner)) - (def reader-identity (string-copy reader)) - (.o - owner: owner-identity - reader: reader-identity - handover-capture: capture-archive - status: (lambda () archive-state) - claim-owner!: claim-archive-owner!)) diff --git a/scenarios/resource-lifecycle/review/cross-intake.ss b/scenarios/resource-lifecycle/review/cross-intake.ss deleted file mode 100644 index f4c3288..0000000 --- a/scenarios/resource-lifecycle/review/cross-intake.ss +++ /dev/null @@ -1,833 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Finite authoritative discovery and signed decisions consume existing native owners. -(import - :clan/poo/object - :std/encoding/json - :std/list/list - (only-in :std/os/pid getpid) - (only-in :std/crypto/digest sha256) - (only-in :std/encoding/hex hex-encode) - :yuanxu/contribution/verification - :agentic-ai-lab/lambda-aitia/modules/sdlc/objects - :agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority - "./func.ss" - "./reassessment.ss") -(export - cross-intake-history - open-cross-intake-group - open-cross-intake-approval - review-history-wire - review-mechanical-basis) -(def (load path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (clone x) (call-with-input-string (json->string x) (cut read-json <> object-as-hash: #t))) -(def (digest x) (hex-encode (sha256 (string->utf8 x)))) -(def (same-set? a b) - (and - (= (length a) (length b)) - (= (length a) (length (delete-duplicates/hash a))) - (every (lambda (x) (and (member x b) #t)) a))) -(.def ReviewArchiveProjection. - schema: "aitia.review-archive/v1" - sealed?: #t - owner: (error "Archive projection requires an owner") - capture: (error "Archive projection requires a frozen capture") - technical: (error "Archive projection requires its technical packet") - roots: (error "Archive projection requires its root references") - producer-pid: (error "Archive projection requires its producer") - fields: (list - (cons "schema" schema) - (cons "sealed" sealed?) - (cons "producerPid" producer-pid) - (cons "owner" owner) - (cons "cut" (.get capture cut)) - (cons "native" (.get capture native)) - (cons "records" (.get capture records)) - (cons "submissions" (.get capture submissions)) - (cons "origins" (.get capture origins)) - (cons "technicalPacket" technical) - (cons "rootReferences" roots)) - json: (list->hash-table fields)) -(def (review-history-wire owner technical lineage records) - (call-with-output-string - (lambda (port) - (write - (list - 'aitia-review-owner/v1 - owner - technical - lineage - (map - (lambda (row) - (list - (car row) - (map - (lambda (key) (hash-ref (cadr row) key)) - '("signer" "policy" "decision" "supersedes" "target")) - (caddr row))) - records)) - port)))) -(def (review-mechanical-basis wire) - (def body (call-with-input-string wire (cut read-json <> object-as-hash: #t))) - (list - (map - (lambda (key) (hash-ref body key)) - '("schema" "policy" "subject" "revision" "scope" "source" "sourceSha256" "sourceBundle" "consumerSourcesSha256")) - (hash-ref body "failures") - (hash-ref body "dispositions") - (map - (lambda (row) - (map - (lambda (key) (hash-ref row key)) - '("id" "claim" "role" "polarity" "source" "sourceIdentity" "digest" "factors" "links"))) - (hash-ref (hash-ref body "history") "clues")))) -(def (review-basis-equivalent? old current) - (def (data value) - (if (string? value) - (call-with-input-string value (cut read-json <> object-as-hash: #t)) - value)) - (let ((old-data (data old)) (current-data (data current))) - (and - (= (length old-data) 4) - (= (length current-data) 4) - (equal? (car old-data) (car current-data)) - (every same-set? (cdr old-data) (cdr current-data))))) -(def (cross-intake-history bindings acceptance sources) - (cross-intake-from bindings (open-backpressure-history acceptance sources))) -(def (open-cross-intake-group identities acceptance sources) - (unless (and (pair? identities) (every string? identities) (same-set? identities identities)) - (error "distinct nonempty intake identities required")) - (def names (map string-copy identities)) - (def owners (open-backpressure-histories acceptance sources (+ 1 (length names)))) - (def histories - (let loop - ((rest owners) (remaining (length names))) - (if (= remaining 0) '() (cons (car rest) (loop (cdr rest) (- remaining 1)))))) - (def aggregate (list-ref owners (length names))) - (def bindings - (map - (lambda (name history) - (let ((selected-name name) (selected-history history)) - (.o - identity: selected-name - history: selected-history))) - names - histories)) - (def federation (cross-intake-from bindings aggregate)) - (let ((selected-histories histories) (selected-federation federation)) - (.o - histories: selected-histories - federation: selected-federation))) -(def (cross-intake-from bindings aggregate) - (def required (map (lambda (binding) (.ref binding 'identity)) bindings)) - (unless (and (pair? required) (same-set? required required)) - (error "duplicate/empty intake mandate")) - (def (discover-intakes) - (map - (lambda (binding) - (list (.ref binding 'identity) ((.ref (.ref binding 'history) 'capture)))) - bindings)) - (def synced-cut #f) - (def rebuilds 0) - (def reuses 0) - (def (sync!) - (def captures (discover-intakes)) - (def source-cut - (digest - (json->string - (map - (lambda (item) - (list (car item) (hash-ref (cadr (cadr item)) "viewIdentity"))) - captures)))) - (if (equal? source-cut synced-cut) - (set! reuses (+ reuses 1)) - (let ((seen (make-hash-table)) (missing-set (make-hash-table)) (missing '())) - (for-each - (lambda (binding item) - (def source-history (.ref binding 'history)) - (for-each - (lambda (clue) - (def id (hash-ref clue "id")) - (def entry ((.ref source-history 'reference) id)) - (def prior (hash-ref seen id #f)) - (when (and prior (not (equal? prior (.ref entry 'digest)))) - (error "same history identity has conflicting content")) - (hash-put! seen id (.ref entry 'digest)) - (def existing (with-catch (lambda (_) #f) (lambda () ((.ref aggregate 'reference) id)))) - (if existing - (unless (equal? (.ref existing 'digest) (.ref entry 'digest)) (error "aggregate history conflict")) - (let (path (.ref entry 'path)) - (unless (hash-key? missing-set path) - (hash-put! missing-set path #t) - (set! missing (cons path missing)))))) - (hash-ref (car (cadr item)) "clues"))) - bindings - captures) - (unless (null? missing) ((.ref aggregate 'add-runs!) (reverse missing))) - (def snapshot ((.ref aggregate 'exchange) 'snapshot)) - (unless (same-set? (hash-keys seen) (map (cut hash-ref <> "id") (hash-ref snapshot "clues"))) - (error "intake disappearance cannot erase aggregate history")) - ((.ref aggregate 'observe!) source-cut) - (set! synced-cut source-cut) - (set! rebuilds (+ rebuilds 1)))) - captures) - (def (federation-stats) - (let ((selected-rebuilds rebuilds) (selected-reuses reuses)) - (.o - rebuilds: selected-rebuilds - reuses: selected-reuses))) - (def (capture-federation) (sync!) ((.ref aggregate 'capture))) - (def (current-federation!) (sync!) ((.ref aggregate 'current!))) - (def (capture-current-federation!) (sync!) ((.ref aggregate 'current-capture!))) - (def required-identities (map string-copy required)) - (.o - current-capture!: capture-current-federation! - sync-stats: federation-stats - capture: capture-federation - current!: current-federation! - discover: discover-intakes - required: required-identities - registration-stats: (.get aggregate registration-stats) - reference: (.get aggregate reference) - capture-stats: (.get aggregate capture-stats) - entry: (.get aggregate entry) - source-current!: (.get aggregate source-current!) - sources: (.get aggregate sources) - source-seal: (.get aggregate source-seal))) - -(def (open-cross-intake-approval - federation - mechanical - tools - directory - directory-signature - root-public - alice-public - bob-public - predecessor: - (predecessor #f) - incarnation: - (incarnation #f) - persistence: - (persistence #f)) - ;; A mutable live ancestor cannot be frozen by a successor checkpoint. - ;; Require the existing closed archive source before durable owner handover. - (when (and persistence predecessor (not (.slot? predecessor 'reader))) - (error "durable owner requires a closed archive predecessor; seal and recover first")) - ;; The trusted host pins the actual predecessor capability before agent input. - ;; The label is only a signed presentation identity, never source authority. - (def owner-id - (if incarnation (string-copy incarnation) (symbol->string (gensym 'aitia-review-owner)))) - (when (and predecessor (.slot? predecessor 'reader) (not (equal? owner-id (.ref predecessor 'reader)))) - (error "archive reader must be the actual successor incarnation")) - (def available? #t) - ;; Persistence is host custody, never a deserialized receipt or a second gate. - (def committed-head (and persistence (string-copy (.ref ((.ref persistence 'selected)) 'digest)))) - (def committed-references '()) - (def (commit-current?) - (with-catch - (lambda (_) #f) - (lambda () - (or - (not persistence) - (and - committed-head - (equal? committed-head (.ref ((.ref persistence 'selected)) 'digest)) - (every (lambda (pair) (equal? (review-file-digest (car pair)) (cadr pair))) committed-references)))))) - (def intake-required (map string-copy (.ref federation 'required))) - (def predecessor-id (and predecessor (string-copy (.ref predecessor 'owner)))) - (def predecessor-source (and predecessor-id (string-append "predecessor:" predecessor-id))) - (def required (append intake-required (if predecessor-source (list predecessor-source) '()))) - (def inherited-cut #f) - (def handover-references '()) - (def retained-predecessor #f) - (def directory-sha (review-file-digest directory)) - (def root-sha (review-file-digest root-public)) - (def alice-sha (review-file-digest alice-public)) - (def bob-sha (review-file-digest bob-public)) - (def technical-packet (.ref mechanical 'packet)) - (def technical-digest (digest technical-packet)) - (def mechanical-basis (json->string (review-mechanical-basis technical-packet))) - (def body (call-with-input-string technical-packet (cut read-json <> object-as-hash: #t))) - (def content-request (.ref mechanical 'content-request)) - (def content (.ref content-request 'facts)) - (unless (and - (eq? (.ref content-request 'purpose) 'criterion-content) - (equal? technical-digest (.ref content 'artifact-digest)) - (equal? (.ref content 'standard) "nasa/sdlc/npr-7150.2") - (equal? (.ref content 'requirement) "SWE-061") - (equal? (.ref content 'criterion) "SWE-061/p1") - (every - (lambda (key) (equal? (.ref content-request key) (hash-ref body (symbol->string key)))) - '(subject revision scope))) - (error "mechanical packet differs from its native bound content request")) - (def project - (sdlc-project (hash-ref body "subject") (hash-ref body "revision") (hash-ref body "scope") #t)) - (def verify (.ref tools 'verify)) - (def source-captures ((.ref federation 'discover))) - (unless (and - (equal? - (hash-ref body "viewIdentity") - (hash-ref (cadr ((.ref federation 'capture))) "viewIdentity")) - (equal? - (map (lambda (item) (hash-ref (cadr (cadr item)) "viewIdentity")) source-captures) - (map (lambda (item) (hash-ref (cadr (cadr item)) "viewIdentity")) ((.ref federation 'discover))))) - (error "authority requires the exact current mechanical/source capture")) - (def source-artifacts - (map - (lambda (item) - (def wire (json->string (cadr item))) - (list (car item) wire (digest wire))) - source-captures)) - ;; Accepted authority decisions are append-only within this review family. - ;; Their content is signed; failed untrusted submissions never become authority decisions. - (def decisions '()) - (def decision-references (make-hash-table)) - (def decision-bodies (make-hash-table)) - (def decision-origins (make-hash-table)) - (def (decision-current? decision) - (with-catch - (lambda (_) #f) - (lambda () - (every - (lambda (pair) (equal? (review-file-digest (car pair)) (cadr pair))) - (hash-ref decision-references (car decision)))))) - ;; The actual root signature is verified once. Reuse is conditional on every - ;; authority input and the verifier binary remaining byte-identical/available. - (def directory-body (load directory)) - (def root-references - (map - (lambda (path) (list path (review-file-digest path))) - (list directory directory-signature root-public alice-public bob-public))) - (def root-admitted? - (and - (equal? directory-sha (review-file-digest directory)) - (equal? root-sha (review-file-digest root-public)) - (equal? alice-sha (review-file-digest alice-public)) - (equal? bob-sha (review-file-digest bob-public)) - (same-set? intake-required (hash-ref directory-body "sources")) - (equal? (hash-ref directory-body "requiredSigner") "test-reviewer-a") - (verify root-public directory directory-signature))) - (def (root-current?) - (and - root-admitted? - ((.ref tools 'current!)) - (every (lambda (pair) (equal? (cadr pair) (review-file-digest (car pair)))) root-references))) - (def current-origin - (list - directory-sha - technical-digest - (hash-ref body "subject") - (hash-ref body "revision") - (hash-ref body "scope"))) - (def (origin-target policy origin) - (digest - (json->string (append (list "review-family/v1" (car origin) (cadr origin) policy) (cddr origin))))) - (def (target policy) (origin-target policy current-origin)) - (def (authorized-document? path signature delegation delegation-signature origin) - (with-catch - (lambda (_) #f) - (lambda () - (def value (load path)) - (def signer (hash-ref value "signer")) - (def policy (hash-ref value "policy")) - (and - available? - (root-current?) - (member policy (hash-ref directory-body "policies")) - (equal? (hash-ref value "target") (origin-target policy origin)) - (member (hash-ref value "decision") '("approved" "rejected")) - (list? (hash-ref value "supersedes")) - (= - (length (hash-ref value "supersedes")) - (length (delete-duplicates/hash (hash-ref value "supersedes")))) - (every - (lambda (id) - (and - (string? id) - (find - (lambda (row) - (and - (equal? id (car row)) - (equal? (hash-ref (hash-ref decision-bodies (car row)) "decision") "rejected"))) - decisions) - #t)) - (hash-ref value "supersedes")) - (or - (and (equal? signer "test-reviewer-a") (verify alice-public path signature)) - (and - (equal? signer "test-reviewer-b") - delegation - delegation-signature - (verify bob-public path signature) - (verify alice-public delegation delegation-signature) - (let (grant (load delegation)) - (and - (equal? (hash-ref grant "delegate") signer) - (equal? (hash-ref grant "publicKey") bob-sha) - (equal? (hash-ref grant "target") (hash-ref value "target")) - (equal? (hash-ref grant "supersedes") (hash-ref value "supersedes")))))))))) - (def (admit-document! - origin - path-value - signature-value - (delegation-value #f) - (delegation-signature-value #f) - current?: - (check-current? #f)) - (def path (string-copy path-value)) - (def signature (string-copy signature-value)) - (def delegation (and delegation-value (string-copy delegation-value))) - (def delegation-signature (and delegation-signature-value (string-copy delegation-signature-value))) - (def references - (map - (lambda (path) (list path (review-file-digest path))) - (filter identity (list path signature delegation delegation-signature)))) - (if (authorized-document? path signature delegation delegation-signature origin) - (let ((id (review-file-digest path)) (value (load path))) - (unless (and - available? - (or (not check-current?) (not predecessor) (not (.slot? predecessor 'reader)) (handover-current?)) - (equal? id (cadar references)) - (every (lambda (pair) (equal? (cadr pair) (review-file-digest (car pair)))) references)) - (error "approval inputs changed during actual verification")) - (unless (find (lambda (d) (equal? (car d) id)) decisions) - (hash-put! decision-origins id (clone origin)) - (hash-put! decision-references id references) - (hash-put! decision-bodies id (clone value)) - (set! decisions (append decisions (list (list id path signature delegation delegation-signature))))) - (string-copy id)) - #f)) - (def (submit! path signature (delegation #f) (delegation-signature #f)) - (if (or - (not (commit-current?)) - (and predecessor (.slot? predecessor 'reader) (not (handover-current?)))) - #f - (let* ((before (map car decisions)) - (id (admit-document! current-origin path signature delegation delegation-signature current?: #t))) - (if (and id persistence (not (member id before))) - ;; A failed/ambiguous publication is terminal. The accepted negative - ;; stays retained; no old frame may authorize continued use. - (with-catch - (lambda (_) (set! available? #f) #f) - (lambda () (persist-prefix!) id)) - id)))) - (def (decision-data decision-cut) - (map - (lambda (decision) - (list - (string-copy (car decision)) - (clone (hash-ref decision-bodies (car decision))) - (clone (hash-ref decision-references (car decision))))) - decision-cut)) - (def (accepted-decisions) (decision-data decisions)) - (def (handover-capture) - (and - available? - (handover-current?) - (let* ((records (decision-data decisions)) - (native - (review-history-wire - owner-id - technical-digest - (list inherited-cut handover-references) - records)) - (selected-cut (digest native)) - (selected-owner (string-copy owner-id)) - (selected-records records) - (selected-native native) - (selected-submissions (map (lambda (row) (clone (cdr row))) decisions)) - (selected-origins - (map - (lambda (row) (list (string-copy (car row)) (clone (hash-ref decision-origins (car row))))) - decisions)) - (selected-basis (string-copy mechanical-basis)) - (selected-roots (clone root-references))) - (.o - owner: selected-owner - cut: selected-cut - records: selected-records - native: selected-native - submissions: selected-submissions - origins: selected-origins - basis: selected-basis - root-references: selected-roots)))) - (def (predecessor-capture) - (and - predecessor - (or - (and retained-predecessor (commit-current?) retained-predecessor) - (with-catch (lambda (_) #f) (lambda () ((.ref predecessor 'handover-capture))))))) - (def (handover-current?) - (or - (not predecessor) - (with-catch - (lambda (_) #f) - (lambda () - (def current (predecessor-capture)) - (and - current - inherited-cut - (equal? predecessor-id (.ref current 'owner)) - (equal? inherited-cut (.ref current 'cut)) - (every (lambda (pair) (equal? (cadr pair) (review-file-digest (car pair)))) handover-references)))))) - (def (accept-handover! path-value signature-value) - (def path (string-copy path-value)) - (def signature (string-copy signature-value)) - (def prior (predecessor-capture)) - (if (not prior) - 'history-discovery-required - (with-catch - (lambda (_) 'handover-refused) - (lambda () - (def grant (load path)) - (def references (map (lambda (p) (list p (review-file-digest p))) (list path signature))) - (def prior-records (.ref prior 'records)) - (if (not - (and - available? - (root-current?) - (review-basis-equivalent? (.ref prior 'basis) mechanical-basis) - (equal? (.ref prior 'root-references) root-references) - (equal? (.ref prior 'owner) predecessor-id) - (same-set? (hash-keys grant) '("schema" "from" "to" "technicalDigest" "cut" "records")) - (equal? (hash-ref grant "schema") "aitia.owner-handover/v1") - (equal? (hash-ref grant "from") predecessor-id) - (equal? (hash-ref grant "to") owner-id) - (equal? (hash-ref grant "technicalDigest") technical-digest) - (equal? (hash-ref grant "cut") (.ref prior 'cut)) - (equal? (hash-ref grant "records") (map car prior-records)) - ((.ref tools 'verify) root-public path signature))) - 'handover-refused - (let ((imported - (map - (lambda (submission) - (let* ((id (review-file-digest (car submission))) - (entry (assoc id (.ref prior 'origins)))) - (and entry (apply admit-document! (cadr entry) submission)))) - (.ref prior 'submissions)))) - ;; Even partial import retains every accepted negative. It grants no discovery. - (if (and - available? - (equal? imported (map car prior-records)) - (every - (lambda (row) - (let (accepted (assoc (car row) (accepted-decisions))) - (and accepted (equal? (caddr row) (caddr accepted))))) - prior-records) - (equal? (.ref prior 'cut) (.ref (predecessor-capture) 'cut)) - (every (lambda (pair) (equal? (cadr pair) (review-file-digest (car pair)))) references)) - (begin - (set! inherited-cut (string-copy (.ref prior 'cut))) - (set! - handover-references - (delete-duplicates/hash - (append - references - (if (.slot? prior 'storage-references) (clone (.ref prior 'storage-references)) '())))) - 'handover-accepted) - 'handover-refused))))))) - (def (persist-prefix!) - (unless (and available? (commit-current?) (root-current?)) (error "persistence custody changed")) - (def capture (or (handover-capture) (error "cannot persist incomplete history"))) - (def imported-prefix (and predecessor (predecessor-capture))) - (def prefix-capture capture) - (def value - (.get - (.o (:: @ ReviewArchiveProjection.) - schema: "aitia.review-archive/v2" - sealed?: #f - producer-pid: (getpid) - owner: owner-id - capture: prefix-capture - technical: technical-packet - roots: root-references - fields: => (cut - append - <> - (list - (cons "closure" "accepted-prefix") - (cons "previousHead" committed-head) - (cons "acceptedCount" (length decisions))))) - json)) - (def wire (json->string value)) - ;; The trusted host must serialize intent -> write/close -> signed head -> - ;; current selection. It receives owned bytes and the expected prior pin. - (def reference ((.ref persistence 'commit!) (string-copy wire) (string-copy committed-head))) - (def head-path (.ref reference 'path)) - (def head-sha (.ref reference 'digest)) - (def signature-path (string-copy (.ref reference 'signature))) - (def signature-sha (review-file-digest signature-path)) - (def head (load head-path)) - (unless (and - available? - (root-current?) - (equal? head-sha (review-file-digest head-path)) - (equal? head-sha (.ref ((.ref persistence 'selected)) 'digest)) - (verify root-public head-path signature-path) - (equal? (hash-ref head "schema") "aitia.recovery-head/v1") - (equal? (hash-ref head "state") "checkpoint") - (eq? (hash-ref head "reader") #f) - (equal? (hash-ref head "owner") owner-id) - (equal? (hash-ref head "cut") (.ref capture 'cut)) - (equal? (hash-ref head "previousHead") committed-head) - (equal? (hash-ref head "acceptedCount") (length decisions)) - (equal? (hash-ref head "archiveSha256") (digest wire)) - (equal? (review-file-digest (hash-ref head "archive")) (digest wire)) - (equal? (map car decisions) (map car (.ref capture 'records))) - (every decision-current? decisions) - (equal? head-sha (review-file-digest head-path)) - (equal? head-sha (.ref ((.ref persistence 'selected)) 'digest))) - (error "persistent prefix publication incomplete or changed")) - (unless (equal? signature-sha (review-file-digest signature-path)) - (error "checkpoint signature changed")) - (set! - committed-references - (list - (list (string-copy head-path) (string-copy head-sha)) - (list signature-path signature-sha) - (list (string-copy (hash-ref head "archive")) (string-copy (hash-ref head "archiveSha256"))))) - (set! committed-head (string-copy head-sha)) - ;; The new selected checkpoint now carries the complete imported inventory. - ;; Keep the admitted predecessor capture for the same native discovery; - ;; signatures, inherited grant, actual files and current own head still check. - (when imported-prefix (set! retained-predecessor imported-prefix))) - (def (retire-chain!) - (when (and predecessor (.slot? predecessor 'retire-chain!)) ((.ref predecessor 'retire-chain!))) - (set! available? #f)) - (def (seal-history! path-value retire-predecessor?: (retire? #f)) - (when (and predecessor (.slot? predecessor 'retire-chain!) (not retire?)) - (error "sealing live predecessor history requires explicit host retirement")) - (def path (string-copy path-value)) - (when (or (file-exists? path) (file-exists? (string-append path ".pending"))) - (error "archive destination must be fresh")) - (def capture (or (handover-capture) (error "cannot seal incomplete history"))) - (def seal-capture capture) - (def value - (.get - (.o (:: @ ReviewArchiveProjection.) - producer-pid: (getpid) - owner: owner-id - capture: seal-capture - technical: technical-packet - roots: root-references) - json)) - (unless (and available? (equal? (map car decisions) (map car (.ref capture 'records)))) - (error "history advanced while capturing seal")) - ;; Explicit host custody closes every known live ancestor before archive IO. - ;; In-flight signature admission rechecks available? before acknowledging. - (if retire? (retire-chain!) (set! available? #f)) - (call-with-output-file (string-append path ".pending") (cut write-json <> value)) - (rename-file (string-append path ".pending") path) - (list path (review-file-digest path) (string-copy owner-id) (.ref capture 'cut))) - (def (frame policy (declared #f)) - (def captures (clone source-captures)) - (def declared-ids (map string-copy (or declared required))) - (def intake-sources - (map - (lambda (item) - (def observation (cadr item)) - (sdlc-history-source - (car item) - (hash-ref (car observation) "ownerIdentity") - (hash-ref (cadr observation) "viewIdentity") - (caddr (assoc (car item) source-artifacts)) - #t)) - (filter (lambda (item) (member (car item) declared-ids)) captures))) - (def captured-handover inherited-cut) - (def captured-handover-references (clone handover-references)) - (def model-sources - (append - intake-sources - (if predecessor-source - (list - (sdlc-history-source - predecessor-source - predecessor-id - (or captured-handover "unavailable") - (if (pair? handover-references) (cadar handover-references) technical-digest) - (and (handover-current?) #t))) - '()))) - (def discovery - (sdlc-history-discovery - "cross-intake-history" - project - directory-sha - policy - (map string-copy required) - model-sources - technical-digest)) - (def discovery-request (sdlc-history-request discovery)) - (def decision-cut decisions) - (def request-rows - (map - (lambda (decision) - (def value (clone (hash-ref decision-bodies (car decision)))) - (def approval - (sdlc-review-approval - (car decision) - project - "nasa/sdlc/npr-7150.2" - "SWE-061" - (hash-ref value "signer") - (string-append "sha256:" (car decision)) - (string->symbol (hash-ref value "decision")) - (hash-ref value "target"))) - (list - decision - (sdlc-approval-request - approval - discovery - technical-digest - (hash-ref value "policy") - supersedes: - (hash-ref value "supersedes") - references: - (clone (hash-ref decision-references (car decision)))))) - decision-cut)) - (def discovery-seal (sdlc-review-authority-snapshot discovery-request)) - (def request-seals - (map - (lambda (request) (cons request (sdlc-review-authority-snapshot request))) - (cons discovery-request (map cadr request-rows)))) - (def (request-current? request) - (def entry (assq request request-seals)) - (and entry (equal? (cdr entry) (sdlc-review-authority-snapshot request)))) - (def last-check "not-checked") - (def guards - (list - (cons "owner" (lambda () available?)) - (cons "persistent-head" commit-current?) - (cons "root-authority" root-current?) - (cons "predecessor" handover-current?) - (cons "handover-cut" (lambda () (equal? captured-handover inherited-cut))) - (cons "handover-references" (lambda () (equal? captured-handover-references handover-references))) - (cons "native-request" (lambda () (request-current? discovery-request))) - (cons "required-sources" (lambda () (same-set? declared-ids required))) - (cons "policy" (lambda () (member policy (hash-ref directory-body "policies")))) - (cons - "source-views" - (lambda () - (equal? - (map (lambda (item) (hash-ref (cadr (cadr item)) "viewIdentity")) captures) - (map (lambda (item) (hash-ref (cadr (cadr item)) "viewIdentity")) ((.ref federation 'discover)))))))) - (def (discovery-current?) - (with-catch - (lambda (_) (set! last-check (string-append "error/" last-check)) #f) - (lambda () - (and - (every (lambda (entry) (set! last-check (car entry)) (and ((cdr entry)) #t)) guards) - (begin (set! last-check "current") #t))))) - (def adapter - (sdlc-review-authority-adapter - "cross-intake-authority/v1" - (lambda (request now until) - (and - (discovery-current?) - (request-current? request) - (or - (eq? request discovery-request) - (any - (lambda (row) - (def item (car row)) - (and (eq? request (cadr row)) (decision-current? item))) - request-rows)))))) - (def captured-decisions (map car decision-cut)) - (def packet - (json->string - (hash - ("schema" "aitia.cross-intake-authority-input/v1") - ("policy" policy) - ("technicalPacket" technical-packet) - ("technicalDigest" technical-digest) - ("requiredSources" required) - ("declaredSources" declared-ids) - ("sourceArtifacts" source-artifacts) - ("rootReferences" root-references) - ("owner" owner-id) - ("predecessor" (or predecessor-id #f)) - ("handoverCut" (or captured-handover #f)) - ("handoverReferences" handover-references) - ("acceptedAtCapture" (decision-data decision-cut)) - ("nativeRequests" (map (lambda (entry) (cdr entry)) request-seals)) - ("receiptMetadataIsAuthority" #f)))) - ;; Every use refreshes the complete technical closure; query reuse alone is - ;; never a substitute for admission at the actual native gate. - (def (gate mechanical-receipts authority-receipts now) - (def technical (reassessment-stage mechanical mechanical-receipts now)) - (def current - (and - (discovery-current?) - (or - (equal? captured-decisions (map car decisions)) - (begin (set! last-check "decision-inventory") #f)))) - (def usable - (if current - (filter - (lambda (receipt) - (or - (yuanxu-verification-valid? adapter receipt discovery-request now) - (any - (lambda (row) - (and - (decision-current? (car row)) - (yuanxu-verification-valid? adapter receipt (cadr row) now))) - request-rows))) - authority-receipts) - '())) - (def result - (sdlc-review-authority-gate - technical - discovery - (map cadr request-rows) - adapter - usable - now - policy: - policy)) - (let (selected-result result) - (.o (:: @ selected-result) - current-use-checked?: #t))) - (let ((selected-adapter adapter) - (selected-discovery discovery-request) - (selected-rows (map (lambda (row) (list (clone (car row)) (cadr row))) request-rows)) - (selected-packet packet) - (selected-gate gate) - (selected-model discovery) - (selected-check (lambda () (string-copy last-check)))) - (.o - adapter: selected-adapter - discovery-request: selected-discovery - approval-requests: selected-rows - gate: selected-gate - discovery: selected-model - packet: selected-packet - current-check: selected-check))) - (when (and predecessor (.slot? predecessor 'claim-owner!)) - ((.ref predecessor 'claim-owner!) owner-id)) - (let ((selected-owner (string-copy owner-id)) - (selected-handover handover-capture) - (selected-accept accept-handover!) - (selected-seal seal-history!) - (selected-retire retire-chain!) - (selected-close (lambda () (set! available? #f))) - (selected-target target) - (selected-frame frame) - (selected-submit submit!) - (selected-accepted accepted-decisions) - (selected-digest (string-copy technical-digest))) - (.o - owner: selected-owner - handover-capture: selected-handover - accept-handover!: selected-accept - seal-history!: selected-seal - retire-chain!: selected-retire - close!: selected-close - target: selected-target - frame: selected-frame - submit!: selected-submit - accepted-decisions: selected-accepted - technical-digest: selected-digest))) diff --git a/scenarios/resource-lifecycle/review/func.ss b/scenarios/resource-lifecycle/review/func.ss deleted file mode 100644 index bdd12f8..0000000 --- a/scenarios/resource-lifecycle/review/func.ss +++ /dev/null @@ -1,533 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; SDLC consumer of captured Library evidence; no result issuer or rule engine. -(import - :clan/poo/object - :std/encoding/json - :std/list/list - (only-in :std/crypto/digest sha256 Digest::sha256 digest-update! digest-final!) - (only-in :std/encoding/hex hex-encode) - :yuanxu/contribution/verification - :agentic-ai-lab/lambda-aitia/modules/sdlc/objects - :agentic-ai-lab/lambda-aitia/modules/sdlc/standards/nasa-review - :agentic-ai-lab/lambda-aitia/modules/sdlc/standards/nasa-lifecycle - (only-in - :deterministic-engineering/library/drivers/rust-resources/oracle - resource-native-oracle - resource-ownership-oracle - resource-counter-oracle - resource-budget-oracle)) -(export - audit-backpressure-content - make-backpressure-review - verify-review-context - verify-review-content - backpressure-stage - review-file-digest - review-reference-path - validate-producer-source-custody - review-json-equal?) -(def (review-file-digest path buffer: (shared-buffer #f)) - (call-with-input-file - path - (lambda (port) - (def context (Digest::sha256)) - (def buffer (or shared-buffer (make-u8vector 65536))) - (unless (and (u8vector? buffer) (> (u8vector-length buffer) 0)) - (error "digest buffer must be nonempty bytes")) - (let loop - () - (def count (read-subu8vector buffer 0 (u8vector-length buffer) port)) - (unless (= count 0) (digest-update! context buffer 0 count) (loop))) - (hex-encode (digest-final! context))))) -(def (load-json path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (require-equal actual expected message) - (unless (equal? actual expected) (error message actual expected))) -;; Historical producer source locations are explicit, sealed input custody. -;; The public validator issues no receipt and cannot install a reader binding. -(def producer-custody-selection 'not-selected) -(def (custody-directory path) (path-strip-trailing-directory-separator (path-normalize path))) -(def (load-producer-source-custody custody-path sources-path acceptance-path) - (def sources (load-json sources-path)) - (def declared (assoc custody-path (hash-ref sources "files"))) - (unless declared (error "producer custody is absent from consumer source declaration" custody-path)) - (def custody-sha (review-file-digest custody-path)) - (require-equal custody-sha (cadr declared) "producer custody declaration changed") - (def custody (load-json custody-path)) - (def acceptance (load-json acceptance-path)) - (def acceptance-sha (review-file-digest acceptance-path)) - (def report-path (hash-ref acceptance "report")) - (def report-sha (review-file-digest report-path)) - (require-equal - (hash-ref custody "schema") - "backpressure.producer-source-custody/v1" - "unsupported producer custody") - (require-equal - acceptance-sha - (hash-ref custody "acceptanceSha256") - "custody belongs to another acceptance") - (require-equal report-sha (hash-ref acceptance "reportSha256") "accepted producer report changed") - (require-equal report-sha (hash-ref custody "reportSha256") "custody belongs to another report") - (def report (load-json report-path)) - (def inputs (hash-ref report "sourceInputs")) - (def references (hash-ref custody "references")) - (def origin (custody-directory (hash-ref custody "originRoot"))) - (def execution (custody-directory (hash-ref custody "executionRoot"))) - (require-equal execution (custody-directory (current-directory)) "custody execution root differs") - (require-equal - origin - (custody-directory (path-directory (caar inputs))) - "custody producer root differs") - (unless (and (list? references) (= (length references) (length inputs))) - (error "producer custody inventory is incomplete")) - (def prefix (string-append origin "/")) - (def selected (make-hash-table)) - (for-each - (lambda (row) - (unless (and (list? row) (= (length row) 3) (every string? row)) - (error "malformed producer custody reference")) - (def original (car row)) - (def digest (cadr row)) - (def location (caddr row)) - (def expected (assoc original inputs)) - (unless (and - expected - (equal? digest (cadr expected)) - (not (hash-key? selected original)) - (> (string-length original) (string-length prefix)) - (equal? prefix (substring original 0 (string-length prefix)))) - (error "producer custody origin or version differs" original)) - (def relative (substring original (string-length prefix) (string-length original))) - (require-equal - (path-normalize location) - (path-normalize (path-expand relative execution)) - "producer custody location is outside its selected source copy") - (require-equal (review-file-digest location) digest "producer custody bytes differ") - (hash-put! selected original (list (string-copy digest) (string-copy location)))) - references) - (require-equal (review-file-digest custody-path) custody-sha "custody changed while checking") - (vector - (string-copy custody-path) - custody-sha - selected - (string-copy sources-path) - (review-file-digest sources-path) - acceptance-sha - report-sha)) -(def (validate-producer-source-custody custody-path sources-path acceptance-path) - (load-producer-source-custody custody-path sources-path acceptance-path) - #t) -(def (select-producer-custody! acceptance-path) - (def configured (getenv "BACKPRESSURE_PRODUCER_CUSTODY" #f)) - (if (eq? producer-custody-selection 'not-selected) - (set! - producer-custody-selection - (and - configured - (load-producer-source-custody - configured - (getenv "BACKPRESSURE_REVIEW_SOURCES") - acceptance-path))) - (require-equal - configured - (and producer-custody-selection (vector-ref producer-custody-selection 0)) - "producer custody selection cannot change within a process")) - (when producer-custody-selection - (require-equal - (review-file-digest acceptance-path) - (vector-ref producer-custody-selection 5) - "custody cannot retarget another acceptance")) - producer-custody-selection) -(def (review-reference-path path expected) - (def selected - (and - (vector? producer-custody-selection) - (hash-ref (vector-ref producer-custody-selection 2) path #f))) - (if selected - (begin - (require-equal expected (car selected) "producer reference version differs") - (string-copy (cadr selected))) - path)) -(def (current-files pairs) - (def buffer (make-u8vector 65536)) - (for-each - (lambda (pair) - (require-equal - (review-file-digest (review-reference-path (car pair) (cadr pair)) buffer: buffer) - (cadr pair) - (string-append "review dependency changed: " (car pair)))) - pairs)) -(def (review-json-equal? a b) - (cond - ((hash-table? a) - (and - (hash-table? b) - (= (hash-length a) (hash-length b)) - (every - (lambda (key) (and (hash-key? b key) (review-json-equal? (hash-ref a key) (hash-ref b key)))) - (hash-keys a)))) - ((pair? a) - (and (pair? b) (review-json-equal? (car a) (car b)) (review-json-equal? (cdr a) (cdr b)))) - (else (equal? a b)))) -(def (oracle-equal actual expected) - (unless (review-json-equal? actual expected) (error "independent oracle differs"))) -(def (artifact record suffix) - (or - (find - (lambda (pair) - (let (path (car pair)) - (and - (>= (string-length path) (string-length suffix)) - (equal? - suffix - (substring path (- (string-length path) (string-length suffix)) (string-length path)))))) - (hash-ref record "artifacts")) - (error "required raw artifact absent" suffix))) -(def (audit-backpressure-content-fresh acceptance-path target-selection) - (unless (memq target-selection '(worker-owned caller-owned)) - (error "unsupported coding-method selection")) - (def closure (make-hash-table)) - (def (track-files pairs) - (for-each - (lambda (pair) - (def prior (hash-ref closure (car pair) #f)) - (when prior (require-equal prior (cadr pair) "conflicting dependency digests")) - (hash-put! closure (car pair) (cadr pair))) - pairs)) - (def (capture-file path) (track-files (list (list path (review-file-digest path))))) - (when (vector? producer-custody-selection) - (track-files - (list - (list (vector-ref producer-custody-selection 0) (vector-ref producer-custody-selection 1)) - (list (vector-ref producer-custody-selection 3) (vector-ref producer-custody-selection 4))))) - (capture-file acceptance-path) - (def acceptance (load-json acceptance-path)) - (require-equal - (hash-ref acceptance "schema") - "qualification.domain-owner-slice/v1" - "wrong acceptance schema") - (require-equal (hash-ref acceptance "qualified") #t "unqualified evidence") - (def report-path (hash-ref acceptance "report")) - (require-equal - (review-file-digest report-path) - (hash-ref acceptance "reportSha256") - "accepted report changed") - (track-files (list (list report-path (hash-ref acceptance "reportSha256")))) - (def report (load-json report-path)) - (require-equal (hash-ref report "status") "passed" "investigation incomplete") - (track-files (hash-ref report "sourceInputs")) - (track-files (hash-ref report "queries")) - (track-files (hash-ref report "nativeExchanges")) - (def snapshot-path (hash-ref acceptance "sourceSnapshotManifest")) - (require-equal - (review-file-digest snapshot-path) - (hash-ref acceptance "sourceSnapshotManifestSha256") - "Core snapshot manifest changed") - (track-files (list (list snapshot-path (hash-ref acceptance "sourceSnapshotManifestSha256")))) - (def snapshot (load-json snapshot-path)) - (track-files - (map - (lambda (key) - (list (path-expand key (hash-ref snapshot "snapshot")) (hash-ref (hash-ref snapshot "files") key))) - (hash-keys (hash-ref snapshot "files")))) - (def results (hash-ref report "results")) - (require-equal (length results) 22 "result closure incomplete") - (def counts (make-hash-table)) - (def native-paths '()) - (for-each - (lambda (row) - (def record (load-json (hash-ref row "recordPath"))) - (require-equal - (review-json-equal? record (hash-ref row "observation")) - #t - "record differs from accepted observation") - (capture-file (hash-ref row "recordPath")) - (capture-file (hash-ref row "reviewPath")) - (def review (load-json (hash-ref row "reviewPath"))) - (require-equal - (hash-ref review "result") - (string-append "sha256:" (review-file-digest (hash-ref row "recordPath"))) - "review is bound to different result") - (track-files (hash-ref record "inputs")) - (track-files (hash-ref record "artifacts")) - (for-each - (lambda (command) - (track-files (list (list (hash-ref command "log") (hash-ref command "logSha256"))))) - (hash-ref record "commands")) - (def method (hash-ref record "method")) - (def observed (hash-ref record "outcome")) - (def key (string-append method "/" observed)) - (hash-put! counts key (+ 1 (hash-ref counts key 0))) - (def recorded-oracle (hash-ref review "oracle")) - (cond - ((equal? method "native") - (def raw (car (artifact record "/observations.json"))) - (set! native-paths (cons raw native-paths)) - (def independent (resource-native-oracle (load-json raw))) - (def gold - (or - (find (lambda (g) (equal? (hash-ref g "case") (hash-ref recorded-oracle "case"))) independent) - (error "unknown native case"))) - (oracle-equal recorded-oracle gold) - (require-equal observed (hash-ref gold "outcome") "producer outcome contradicts event oracle") - (for-each - (lambda (c) (require-equal (hash-ref c "exit") 0 "native process failed")) - (hash-ref record "commands"))) - ((equal? method "quint") - (if (equal? observed "pass") - (begin - (oracle-equal recorded-oracle (resource-ownership-oracle 1 1)) - (require-equal - (hash-ref (load-json (car (artifact record "/tlc-result.json"))) "status") - "ok" - "TLC did not pass")) - (oracle-equal recorded-oracle (resource-counter-oracle (car (artifact record ".itf.json")))))) - ((equal? method "lean") - (def budget (hash-ref recorded-oracle "budget")) - (def planned (hash-ref recorded-oracle "planned")) - (unless (member planned '(128 256)) (error "unsupported selected Lean budget")) - (oracle-equal recorded-oracle (resource-budget-oracle 1 1 (/ planned 2) 0 0 budget)) - (require-equal budget 256 "budget scope differs") - (require-equal observed "pass" "arithmetic check failed") - (for-each - (lambda (c) (require-equal (hash-ref c "exit") 0 "Lean command failed")) - (hash-ref record "commands"))) - (else (error "unrecognized verification method" method)))) - results) - (for-each - (lambda (pair) - (require-equal (hash-ref counts (car pair) 0) (cadr pair) "method/outcome inventory differs")) - '(("native/pass" 15) ("native/fail" 3) ("quint/pass" 1) ("quint/fail" 1) ("lean/pass" 2))) - (require-equal (length (delete-duplicates/hash native-paths)) 3 "native workload closure differs") - (def gold '((0 0 0) (2 0 2) (7 1 8) (2 0 8) (7 1 14) (1 0 14) (7 1 21) (7 1 21) (6 2 22))) - (require-equal (length (hash-ref report "queries")) 9 "ASCENT query closure incomplete") - (for-each - (lambda (pair expected) - (def q (load-json (car pair))) - (require-equal - (map (lambda (relation) (length (hash-ref q relation))) '("support" "counter" "witness")) - expected - "ASCENT relation gold differs")) - (hash-ref report "queries") - gold) - (def selected-dependencies - (map (lambda (path) (list path (hash-ref closure path))) (hash-keys closure))) - (current-files selected-dependencies) - ;; Raw evidence of M06 is an adherence failure only when caller-owned is selected. - (.o - outcome: (if (eq? target-selection 'caller-owned) 'fail 'pass) - report: report-path - report-digest: (review-file-digest report-path) - records: 22 - expected-counters: 4 - target: target-selection - dependencies: (map (lambda (pair) (map string-copy pair)) selected-dependencies))) -;; One producer-private completed audit, not a receipt or a query-result cache. -;; Every hit streams the complete original dependency closure again. Public -;; presentations own their lists and strings; edits cannot alter this record. -(def completed-content-audit #f) -(def (copy-dependencies pairs) - (map (lambda (pair) (map string-copy pair)) pairs)) -(def (audit-presentation record target reused?) - (let ((selected-report (string-copy (vector-ref record 2))) - (selected-report-digest (string-copy (vector-ref record 3))) - (selected-dependencies (copy-dependencies (vector-ref record 4))) - (selected-target target) - (selected-reused reused?)) - (.o - outcome: (if (eq? selected-target 'caller-owned) 'fail 'pass) - report: selected-report - report-digest: selected-report-digest - dependencies: selected-dependencies - records: 22 - expected-counters: 4 - target: selected-target - reused-content?: selected-reused))) -(def (audit-backpressure-content acceptance-path target-selection) - (unless (memq target-selection '(worker-owned caller-owned)) - (error "unsupported coding-method selection")) - (select-producer-custody! acceptance-path) - (def selected-sha (review-file-digest acceptance-path)) - (def prior completed-content-audit) - (if (and - prior - (equal? acceptance-path (vector-ref prior 0)) - (equal? selected-sha (vector-ref prior 1))) - (begin - (current-files (vector-ref prior 4)) - (audit-presentation prior target-selection #t)) - (let* ((fresh (audit-backpressure-content-fresh acceptance-path target-selection)) - (record - (vector - (string-copy acceptance-path) - (string-copy selected-sha) - (string-copy (.ref fresh 'report)) - (string-copy (.ref fresh 'report-digest)) - (copy-dependencies (.ref fresh 'dependencies))))) - (unless (and - (equal? selected-sha (review-file-digest acceptance-path)) - (equal? selected-sha (cadr (assoc acceptance-path (vector-ref record 4))))) - (error "acceptance changed during content audit")) - (set! completed-content-audit record) - (audit-presentation record target-selection #f)))) -(def (make-backpressure-review - profile - acceptance-path - previous: - (previous #f) - sources: - (sources-path (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - (def source-manifest-digest (review-file-digest sources-path)) - (def source-manifest (load-json sources-path)) - (require-equal - (hash-ref source-manifest "schema") - "aitia.backpressure-consumer-sources/v1" - "invalid consumer source manifest") - (current-files (hash-ref source-manifest "files")) - (def (profile-snapshot) - (call-with-output-string - (lambda (port) - (write (map (cut .ref profile <>) '(identity subject revision scope software-class target)) port)))) - (def captured-profile (profile-snapshot)) - (unless (eq? (.ref profile 'identity) 'backpressure-coding-method/v1) - (error "unsupported coding policy")) - (require-equal (.ref profile 'subject) "rust.backpressure-lifecycle" "unsupported review subject") - (unless previous - (require-equal - (.ref profile 'revision) - "accepted-owner-slice/r1" - "new revision requires explicit prior review")) - (def selected-target (.ref profile 'target)) - (require-equal - (.ref profile 'scope) - (if (eq? selected-target 'caller-owned) "bounded-permit-method/M06" "bounded-permit-method/M01-M05") - "scope does not name the selected coding method") - (def audit (audit-backpressure-content acceptance-path selected-target)) - (def audited-files (map (lambda (pair) (map string-copy pair)) (.ref audit 'dependencies))) - (def acceptance-digest (review-file-digest acceptance-path)) - (def project - (sdlc-project (.ref profile 'subject) (.ref profile 'revision) (.ref profile 'scope) #t)) - (def context (.ref profile 'context)) - (def class-value (.ref profile 'software-class)) - (unless (eq? class-value 'a) - (error "local applicability Profile requires class a; no NASA authority asserted")) - (def context-request (nasa-context-request project class-value context)) - (def packet-text - (json->string - (hash - ("schema" "aitia.backpressure-review-packet/v1") - ("criterion" "SWE-061/p1") - ("policy" "backpressure-coding-method/v1") - ("subject" (.ref project 'subject)) - ("revision" (.ref project 'revision)) - ("scope" (.ref project 'scope)) - ("classification" "local-declared-class-a/no-institutional-attestation") - ("selection" (symbol->string selected-target)) - ("outcome" (symbol->string (.ref audit 'outcome))) - ("report" (.ref audit 'report)) - ("reportSha256" (.ref audit 'report-digest)) - ("consumerSources" sources-path) - ("consumerSourcesSha256" source-manifest-digest) - ("dependencies" audited-files)))) - (def packet-digest (hex-encode (sha256 (string->utf8 packet-text)))) - (def evidence - (nasa-verifiable-evidence - (nasa-criterion-evidence - "BP061-content" - project - "SWE-061" - "SWE-061/p1" - "backpressure-independent-content-audit/v1" - (.ref audit 'outcome)) - packet-digest)) - ;; An explicit rebase carries unresolved failures; this consumer implements no disposition authority. - (def carried - (if previous - (begin - (unless (and - (equal? (.ref (.ref previous 'project) 'subject) (.ref project 'subject)) - (not (equal? (.ref (.ref previous 'project) 'revision) (.ref project 'revision)))) - (error "rebase requires same subject and a new revision")) - (map - (lambda (old) - (nasa-verifiable-evidence - (nasa-criterion-evidence - (string-append "carried/" (.ref old 'identity)) - project - "SWE-061" - "SWE-061/p1" - (.ref old 'producer) - 'fail) - (.ref old 'artifact-digest))) - (filter (lambda (e) (eq? (.ref e 'outcome) 'fail)) (.ref previous 'evidence)))) - '())) - (def records (cons evidence carried)) - (def expected-request (nasa-evidence-request evidence)) - (def (check-declaration-current!) - (require-equal - (review-file-digest sources-path) - source-manifest-digest - "consumer source manifest changed") - (current-files (hash-ref source-manifest "files")) - (require-equal (profile-snapshot) captured-profile "review Profile changed")) - (def (check-current!) - (check-declaration-current!) - (require-equal - (review-file-digest acceptance-path) - acceptance-digest - "host-selected acceptance changed") - (current-files audited-files) - audit) - (def (check-content-current!) - (check-current!) - (require-equal (.ref audit 'outcome) (.ref evidence 'outcome) "content outcome changed")) - ;; Identity-bound native requests select existing checks; equal-looking - ;; submitted data is never a request capability. - (def request-checks - (list - (cons context-request check-declaration-current!) - (cons expected-request check-content-current!))) - (def (verify-operation request now until) - (def selected (assq request request-checks)) - (and selected (begin ((cdr selected)) #t))) - (def adapter (nasa-verification-adapter "backpressure-content-audit/v1" verify-operation)) - (let ((selected-project project) - (selected-context context) - (selected-adapter adapter) - (selected-audit audit) - (selected-context-request context-request) - (selected-packet-digest packet-digest)) - (.o - project: selected-project - context: selected-context - class: class-value - policy: (nasa-stage-policy "backpressure-coding-method" '("SWE-061")) - evidence: records - adapter: selected-adapter - context-request: selected-context-request - content-request: expected-request - current!: check-current! - audit: selected-audit - packet: (string-copy packet-text) - packet-digest: (string-copy selected-packet-digest)))) -(def (verify-review-context review now until) - (yuanxu-verify (.ref review 'adapter) (.ref review 'context-request) now until)) -(def (verify-review-content review now until) - (yuanxu-verify (.ref review 'adapter) (.ref review 'content-request) now until)) -(def (backpressure-stage review receipts now) - ((.ref review 'current!)) - (def result - (nasa-stage-gate - (.ref review 'policy) - (.ref review 'project) - (.ref review 'class) - (.ref review 'context) - (.ref review 'evidence) - (.ref review 'adapter) - receipts - now)) - ((.ref review 'current!)) - result) diff --git a/scenarios/resource-lifecycle/review/interface.ss b/scenarios/resource-lifecycle/review/interface.ss deleted file mode 100644 index 5402c8e..0000000 --- a/scenarios/resource-lifecycle/review/interface.ss +++ /dev/null @@ -1,34 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - "./profile.ss" - "./func.ss") -(export - BackpressureReviewProfile - audit-backpressure-content - make-backpressure-review - verify-review-context - verify-review-content - backpressure-stage - review-file-digest) -(import - "./reassessment.ss") -(export - open-backpressure-history - make-backpressure-reassessment - reassessment-stage - reassessment-verify-context - reassessment-verify-content - reassessment-verify-disposition) - -(import - "./cross-intake.ss" - "./signatures.ss") -(export - cross-intake-history - open-cross-intake-group - open-cross-intake-approval - review-signature-tools) diff --git a/scenarios/resource-lifecycle/review/profile.ss b/scenarios/resource-lifecycle/review/profile.ss deleted file mode 100644 index 3a8f86e..0000000 --- a/scenarios/resource-lifecycle/review/profile.ss +++ /dev/null @@ -1,23 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import - :clan/poo/object) -(export - BackpressureReviewProfile) -;; Local, bounded coding-method review; class a exercises the NASA matrix. -;; This declaration is not an institutional NASA classification attestation. -(.def BackpressureReviewProfile - identity: 'backpressure-coding-method/v1 - subject: "rust.backpressure-lifecycle" - revision: "accepted-owner-slice/r1" - scope: "bounded-permit-method/M01-M05" - software-class: 'a - target: 'worker-owned - context: (.o - safety-critical?: #f - health-medical?: #f - reaching-kdp-a?: #f - category-1?: #f)) diff --git a/scenarios/resource-lifecycle/review/reassessment.ss b/scenarios/resource-lifecycle/review/reassessment.ss deleted file mode 100644 index 5c40406..0000000 --- a/scenarios/resource-lifecycle/review/reassessment.ss +++ /dev/null @@ -1,660 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Existing ASCENT intake -> native Aitia content and disposition requests. -;;; Completeness is bounded to the host-selected exchange, never global discovery. -(import - :clan/poo/object - :std/list/list - :std/encoding/json - (only-in :std/misc/ports read-all-as-u8vector) - (only-in :std/crypto/digest sha256) - (only-in :std/encoding/hex hex-encode) - :yuanxu/contribution/verification - :agentic-ai-lab/modules/ai-agentic-context/clue-exchange - :agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger - :agentic-ai-lab/lambda-aitia/modules/sdlc/objects - :agentic-ai-lab/lambda-aitia/modules/sdlc/standards/nasa-review - :agentic-ai-lab/lambda-aitia/modules/sdlc/standards/nasa-lifecycle - :deterministic-engineering/library/drivers/rust-resources/reassessment-oracle - "./func.ss") -(export - open-backpressure-history - open-backpressure-histories - make-backpressure-reassessment - reassessment-stage - reassessment-verify-context - reassessment-verify-content - reassessment-verify-disposition) -(def claim "SWE-061/p1/permit-lifecycle-history") -(def (load-json path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (clone value) - (call-with-input-string (json->string value) (cut read-json <> object-as-hash: #t))) -(def (load-bound-json path expected) - (def bytes (call-with-input-file path read-all-as-u8vector)) - (def actual (hex-encode (sha256 bytes))) - (when (and expected (not (equal? actual expected))) (error "bound metadata changed" path)) - (list (call-with-input-string (utf8->string bytes) (cut read-json <> object-as-hash: #t)) actual)) -(def (dependency-map pairs) - (def result (make-hash-table)) - (for-each - (lambda (pair) - (def prior (hash-ref result (car pair) #f)) - (when (and prior (not (equal? prior (cadr pair)))) (error "conflicting dependency binding")) - (hash-put! result (car pair) (cadr pair))) - pairs) - result) -(def (bound-source-bundle path checked) - (map - (lambda (p) - (or (hash-ref checked p #f) (hash-ref checked (path-normalize p)))) - (list - path - (path-expand "../Cargo.toml" (path-directory path)) - (path-expand "../Cargo.lock" (path-directory path))))) -(def (digest-text text) (hex-encode (sha256 (string->utf8 text)))) -(def (source-bundle path) - (map - review-file-digest - (list - path - (path-expand "../Cargo.toml" (path-directory path)) - (path-expand "../Cargo.lock" (path-directory path))))) -(def (same-set? a b) - (and - (= (length a) (length b)) - (= (length a) (length (delete-duplicates/hash a))) - (every (lambda (x) (and (member x b) #t)) a))) -(def (assert-files pairs) - (def buffer (make-u8vector 65536)) - (def unique (make-hash-table)) - (for-each - (lambda (p) - (def prior (hash-ref unique (car p) #f)) - (when (and prior (not (equal? prior (cadr p)))) (error "conflicting reassessment input")) - (hash-put! unique (car p) (cadr p))) - pairs) - (hash-for-each - (lambda (path digest) - (unless (equal? (review-file-digest (review-reference-path path digest) buffer: buffer) digest) - (error "reassessment input changed" path))) - unique) - unique) -;; One producer-private pure baseline derivation, never intake or authority state. -;; Every caller first completes audit-backpressure-content's full byte check. -(def completed-baseline-entries #f) -(def (derive-baseline-entries baseline checked) - (def report (car (load-bound-json (.ref baseline 'report) (.ref baseline 'report-digest)))) - (def original - (map - (lambda (row) - (def observation (hash-ref row "observation")) - (def record-path (hash-ref row "recordPath")) - (def review - (car (load-bound-json (hash-ref row "reviewPath") (hash-ref checked (hash-ref row "reviewPath"))))) - (def oracle (hash-ref review "oracle")) - (def method (hash-ref observation "method")) - (def native? (equal? method "native")) - (def raw - (and - native? - (find - (lambda (p) (string-contains (car p) "/observations.json")) - (hash-ref observation "artifacts")))) - (hash - ("id" (hash-ref row "id")) - ("recordPath" record-path) - ("recordSha256" (hash-ref checked record-path)) - ("outcome" (hash-ref observation "outcome")) - ("case" (if native? (hash-ref oracle "case") method)) - ("payloadBytes" (if raw (hash-ref (car (load-bound-json (car raw) (hash-ref checked (car raw)))) "payloadBytes") 0)) - ("sourceSha256" (if native? - (cadr - (or - (find (lambda (p) (string-contains (car p) "/src/main.rs")) (hash-ref observation "inputs")) - (error "historical source binding absent"))) - "non-native")) - ("sourceBundle" (if native? - (bound-source-bundle - (car (find (lambda (p) (string-contains (car p) "/src/main.rs")) (hash-ref observation "inputs"))) - checked) - '())) - ("diagnostic" (and (equal? method "quint") (equal? (hash-ref observation "outcome") "fail"))) - ("dependencies" (append (hash-ref observation "inputs") (hash-ref observation "artifacts"))))) - (hash-ref report "results"))) - original) -(def (baseline-entry-record baseline checked) - (def prior completed-baseline-entries) - (def dependencies (.ref baseline 'dependencies)) - (if (and - prior - (equal? (.ref baseline 'report) (vector-ref prior 0)) - (equal? (.ref baseline 'report-digest) (vector-ref prior 1)) - (equal? dependencies (vector-ref prior 2))) - prior - (let* ((entries (derive-baseline-entries baseline checked)) - (keys - (map - (lambda (entry) - (cons - entry - (digest-text (json->string (hash-ref entry "dependencies"))))) - entries)) - (record - (vector - (string-copy (.ref baseline 'report)) - (string-copy (.ref baseline 'report-digest)) - dependencies - entries - keys))) - (set! completed-baseline-entries record) - record))) -(def (open-backpressure-history acceptance sources) - (history-from-baseline (audit-backpressure-content acceptance 'caller-owned) sources)) -;; A single input epoch constructs independent native state owners. The baseline -;; presentation stays private; no currentness verdict or caller-supplied proof is -;; accepted, and every actual use still validates the complete current closure. -(def (open-backpressure-histories acceptance sources count) - (unless (and (integer? count) (exact? count) (> count 0)) (error "positive history count required")) - (def baseline (audit-backpressure-content acceptance 'caller-owned)) - (def histories - (let loop - ((remaining count) (result '())) - (if (= remaining 0) - (reverse result) - (loop (- remaining 1) (cons (history-from-baseline baseline sources) result))))) - (assert-files (.ref baseline 'dependencies)) - histories) -(def (history-from-baseline baseline sources) - (def selected-sources (load-json sources)) - (def source-seal (review-file-digest sources)) - (def captured (make-hash-table)) - ;; Dependencies are privately owned per exact run closure, not cloned once per - ;; case. Callers still receive deep copies through entry; no path/stat cache. - (def dependency-sets (make-hash-table)) - (def (own-entry entry (prepared-key #f)) - (def dependencies (hash-ref entry "dependencies")) - (def key (or prepared-key (digest-text (json->string dependencies)))) - (def owned (hash-ref dependency-sets key #f)) - (when (and owned (not (equal? owned dependencies))) - (error "history dependency identity collision")) - (unless owned - (set! owned (clone dependencies)) - (hash-put! dependency-sets key owned)) - (def result (make-hash-table)) - (hash-for-each - (lambda (name value) - (unless (equal? name "dependencies") (hash-put! result name (clone value)))) - entry) - (hash-put! result "dependencies" owned) - result) - (def trajectory - (hash-ref - (ascent-trajectory - (hash - ("action" "open") - ("task" "backpressure-history-reassessment") - ("sourceIdentity" (.ref baseline 'report-digest)))) - "trajectory")) - (def (check-host!) - (unless (equal? source-seal (review-file-digest sources)) (error "history source manifest changed")) - (assert-files (hash-ref selected-sources "files"))) - (def history-exchange - (open-trajectory-clue-exchange - trajectory - (lambda (id digest source context) - (def entry (hash-get captured id)) - (and - entry - (equal? source (hash-ref entry "recordPath")) - (equal? (review-file-digest source) (hash-ref entry "recordSha256")) - (string-append "sha256:" (hash-ref entry "recordSha256")))) - source-seal)) - (def (register! entries checked (dependency-keys '())) - (check-host!) - ;; This private set comes only from the completed byte audit in this same - ;; registration operation. Check coverage; do not repeat the full file scan. - (for-each - (lambda (entry) - (for-each - (lambda (pair) - (unless (equal? (hash-ref checked (car pair) #f) (cadr pair)) - (error "entry dependency was not checked" (car pair)))) - (hash-ref entry "dependencies"))) - entries) - (def checked-records (make-hash-table)) - (def pending-ids (make-hash-table)) - ;; Reject every duplicate and changed record before provisioning any row. - ;; ASCENT still owns attestation and generation-bound publication. - (for-each - (lambda (entry) - (def id (hash-ref entry "id")) - (when (or (hash-key? captured id) (hash-key? pending-ids id)) - (error "history id already registered" id)) - (hash-put! pending-ids id #t) - (def path (hash-ref entry "recordPath")) - (def expected (hash-ref entry "recordSha256")) - (def prior (hash-ref checked-records path #f)) - (unless (equal? (or prior (review-file-digest path)) expected) - (error "history record differs")) - (hash-put! checked-records path expected)) - entries) - (def rows - (map - (lambda (entry) - (def id (hash-ref entry "id")) - (def prepared (assq entry dependency-keys)) - (hash-put! captured (string-copy id) (own-entry entry (and prepared (cdr prepared)))) - (hash - ("id" (string-copy id)) - ("claim" (string-copy claim)) - ("role" "observation") - ("polarity" (if (equal? (hash-ref entry "outcome") "fail") "counter" "support")) - ("source" (string-copy (hash-ref entry "recordPath"))) - ("factors" '()) - ("links" '()))) - entries)) - (history-exchange 'submit rows (hash-ref (history-exchange 'snapshot) "generation"))) - (def baseline-checked (dependency-map (.ref baseline 'dependencies))) - (def baseline-record (baseline-entry-record baseline baseline-checked)) - (def original (vector-ref baseline-record 3)) - (register! original baseline-checked (vector-ref baseline-record 4)) - (def registration-batches 0) - (def logical-dependency-references 0) - (def checked-dependency-paths 0) - (def (prepare-run path bound-run checked) - (def run (car bound-run)) - (def record-sha (cadr bound-run)) - (unless (and - (equal? (hash-ref run "schema") "rust.backpressure-source-reassessment/v1") - (= (hash-ref run "exit") 0) - (equal? (hash-ref checked (hash-ref run "source") #f) (hash-ref run "sourceSha256")) - (assoc (hash-ref run "source") (hash-ref run "dependencies")) - (assoc (hash-ref run "observations") (hash-ref run "dependencies"))) - (error "unbound native reassessment run")) - (def gold - (backpressure-reassessment-oracle - (car - (load-bound-json (hash-ref run "observations") (hash-ref checked (hash-ref run "observations")))))) - (def bundle (bound-source-bundle (hash-ref run "source") checked)) - (def entries - (map - (lambda (g) - (hash - ("id" (string-append record-sha "/" (hash-ref g "case"))) - ("recordPath" path) - ("recordSha256" record-sha) - ("outcome" (hash-ref g "outcome")) - ("case" (hash-ref g "case")) - ("payloadBytes" (hash-ref g "payloadBytes")) - ("diagnostic" #f) - ("sourceSha256" (hash-ref run "sourceSha256")) - ("sourceBundle" bundle) - ("dependencies" (hash-ref run "dependencies")))) - gold)) - (def dependency-key (digest-text (json->string (hash-ref run "dependencies")))) - (list entries (map (lambda (entry) (cons entry dependency-key)) entries))) - (def (add-history-runs! paths) - (unless (and - (pair? paths) - (every string? paths) - (= (length paths) (length (delete-duplicates/hash paths)))) - (error "registration batch requires distinct run paths")) - (def bound-runs (map (lambda (path) (load-bound-json path #f)) paths)) - (def references (append-map (lambda (bound) (hash-ref (car bound) "dependencies")) bound-runs)) - ;; The private map is created by this complete byte check, never supplied by - ;; the caller or retained as a currentness verdict across operations. - (def checked (assert-files references)) - (def prepared (map (lambda (path bound) (prepare-run path bound checked)) paths bound-runs)) - (def groups (map car prepared)) - (register! (append-map identity groups) checked (append-map cadr prepared)) - (check-host!) - (set! registration-batches (+ registration-batches 1)) - (set! logical-dependency-references (+ logical-dependency-references (length references))) - (set! checked-dependency-paths (+ checked-dependency-paths (hash-length checked))) - groups) - (def (add-history-run! path) (car (add-history-runs! (list path)))) - (def (history-registration-stats) - (let ((selected-batches registration-batches) - (selected-logical logical-dependency-references) - (selected-checked checked-dependency-paths)) - (.o - batches: selected-batches - logical-dependency-references: selected-logical - checked-dependency-paths: selected-checked))) - ;; ASCENT owns query evaluation. Only union registration is reused by the - ;; cross-intake consumer; every capture obtains an actual native query. - (def queries 0) - (def (capture-value) - (def snapshot (history-exchange 'snapshot)) - (def view (history-exchange 'query claim)) - (def failures - (filter (lambda (row) (equal? (hash-ref row "polarity") "counter")) (hash-ref snapshot "clues"))) - (unless (and - (null? (hash-ref view "unavailable")) - (same-set? - (map (cut hash-ref <> "id") failures) - (map cadr (hash-ref view "counterevidence")))) - (error "history unavailable or incomplete attestation")) - (set! queries (+ queries 1)) - (clone (list snapshot view))) - (def (capture-history) (check-host!) (capture-value)) - (def (capture-current-history!) (current-files!) (capture-value)) - (def (history-capture-stats) - (let ((selected-queries queries) - (selected-entries (hash-length captured)) - (sets (hash-length dependency-sets)) - (owned-items (apply + (map length (hash-values dependency-sets)))) - (logical-items - (apply + (map (lambda (e) (length (hash-ref e "dependencies"))) (hash-values captured))))) - (.o - queries: selected-queries - entries: selected-entries - dependency-sets: sets - owned-dependency-items: owned-items - logical-dependency-items: logical-items))) - (def (entry-reference id) - (def entry (or (hash-get captured id) (error "unknown history evidence" id))) - (let ((selected-id (string-copy id)) - (selected-path (string-copy (hash-ref entry "recordPath"))) - (selected-digest (string-copy (hash-ref entry "recordSha256"))) - (selected-case (string-copy (hash-ref entry "case"))) - (selected-outcome (string-copy (hash-ref entry "outcome"))) - (selected-bundle (map string-copy (hash-ref entry "sourceBundle"))) - (selected-diagnostic (hash-ref entry "diagnostic"))) - (.o - identity: selected-id - path: selected-path - digest: selected-digest - case: selected-case - outcome: selected-outcome - source-bundle: selected-bundle - diagnostic?: selected-diagnostic))) - (def (find-entry id) (clone (or (hash-get captured id) (error "unknown history evidence" id)))) - (def (current-files!) - (check-host!) - (def paths (make-hash-table)) - (for-each (lambda (pair) (hash-put! paths (car pair) (cadr pair))) (.ref baseline 'dependencies)) - (for-each - (lambda (entry) - (for-each - (lambda (pair) - (def prior (hash-ref paths (car pair) #f)) - (when (and prior (not (equal? prior (cadr pair)))) (error "conflicting history dependency")) - (hash-put! paths (car pair) (cadr pair))) - (hash-ref entry "dependencies"))) - (hash-values captured)) - (assert-files (map (lambda (p) (list p (hash-ref paths p))) (hash-keys paths)))) - (def observation-sequence 0) - (def last-observation #f) - (def (observe-history! digest) - (unless (equal? digest last-observation) - (set! observation-sequence (+ observation-sequence 1)) - (ascent-trajectory - (hash - ("action" "append") - ("trajectory" trajectory) - ("event" (hash - ("id" (string-append "discovery/" (number->string observation-sequence))) - ("kind" "evidence") - ("sourceIdentity" (.ref baseline 'report-digest)) - ("resultReference" (string-append "sha256:" digest)) - ("pathIdentity" "cross-intake-discovery"))))) - (set! last-observation (string-copy digest)))) - (def source-path (string-copy sources)) - (def captured-source-seal (string-copy source-seal)) - (.o - current-capture!: capture-current-history! - reference: entry-reference - capture-stats: history-capture-stats - observe!: observe-history! - exchange: history-exchange - capture: capture-history - add-run!: add-history-run! - add-runs!: add-history-runs! - registration-stats: history-registration-stats - entry: find-entry - current!: current-files! - source-current!: check-host! - sources: source-path - source-seal: captured-source-seal)) - -(def (failure-ids history-cut) - (map - (cut hash-ref <> "id") - (filter - (lambda (row) (equal? (hash-ref row "polarity") "counter")) - (hash-ref (car history-cut) "clues")))) -(def (make-backpressure-reassessment - history - profile - source-path - failures: - (declared #f) - dispositions: - (dispositions '())) - (unless (and - (eq? (.ref profile 'identity) 'backpressure-coding-method/v1) - (equal? (.ref profile 'subject) "rust.backpressure-lifecycle") - (eq? (.ref profile 'software-class) 'a) - (member (.ref profile 'scope) '("bounded-permit-method/M04-M06" "bounded-permit-method/M04"))) - (error "unsupported reassessment policy or scope")) - (def history-cut ((.ref history 'capture))) - (def expected (failure-ids history-cut)) - (def complete? (same-set? (or declared expected) expected)) - ;; Construction binds a descriptive native capture. It is not content - ;; issuance or current-use authority; those retain their separate checks. - (def selected-bundle (source-bundle source-path)) - (def source-digest (car selected-bundle)) - (def selected-scope (.ref profile 'scope)) - (def revision (.ref profile 'revision)) - (def subject (.ref profile 'subject)) - (def project (sdlc-project subject revision selected-scope #t)) - (def context-request (nasa-context-request project 'a (.ref profile 'context))) - (def packet - (json->string - (hash - ("schema" "aitia.backpressure-reassessment/v1") - ("policy" "backpressure-coding-method/v1") - ("subject" subject) - ("revision" revision) - ("scope" selected-scope) - ("source" source-path) - ("sourceSha256" source-digest) - ("sourceBundle" selected-bundle) - ("history" (car history-cut)) - ("viewIdentity" (hash-ref (cadr history-cut) "viewIdentity")) - ("view" (cadr history-cut)) - ("consumerSources" (.ref history 'sources)) - ("consumerSourcesSha256" (.ref history 'source-seal)) - ("failures" (or declared expected)) - ("dispositions" (map (lambda (d) (list (.ref d 'failure) (.ref d 'repair))) dispositions))))) - (def evidence - (nasa-verifiable-evidence - (nasa-criterion-evidence - "BP061-reassessment" - project - "SWE-061" - "SWE-061/p1" - "independent-ownership-cut-oracle/v1" - 'pass) - (digest-text packet))) - (def content-request (nasa-evidence-request evidence)) - (def (bound-current? captured-cut) - (and - (equal? selected-bundle (source-bundle source-path)) - (equal? - (list subject revision selected-scope) - (map (cut .ref profile <>) '(subject revision scope))) - (equal? - (hash-ref (cadr captured-cut) "viewIdentity") - (hash-ref (cadr history-cut) "viewIdentity")))) - (def (current? (full? #t)) - (with-catch - (lambda (_) #f) - (lambda () - (bound-current? ((.ref history (if full? 'current-capture! 'capture))))))) - (def (covers? failure repair) - (and - (not (hash-ref failure "diagnostic")) - (equal? (hash-ref failure "outcome") "fail") - (equal? (hash-ref repair "outcome") "pass") - (equal? (hash-ref failure "case") (hash-ref repair "case")) - (= (hash-ref failure "payloadBytes") (hash-ref repair "payloadBytes")) - (not (equal? selected-bundle (hash-ref failure "sourceBundle"))) - (equal? selected-bundle (hash-ref repair "sourceBundle")))) - (def disposition-requests - (map - (lambda (d) - (def f ((.ref history 'entry) (.ref d 'failure))) - (def r ((.ref history 'entry) (.ref d 'repair))) - (unless (member (.ref d 'failure) expected) (error "disposition names no captured failure")) - (list - (.ref d 'failure) - (covers? f r) - (nasa-evidence-request - (nasa-verifiable-evidence - (nasa-criterion-evidence - (string-append "BP061-disposition/" (.ref d 'failure)) - project - "SWE-061" - "SWE-061/p1" - "independent-ownership-cut-oracle/v1" - 'pass) - (digest-text (string-append packet (hash-ref f "recordSha256") (hash-ref r "recordSha256"))))) - (append (hash-ref f "dependencies") (hash-ref r "dependencies")))) - dispositions)) - (unless (= - (length dispositions) - (length (delete-duplicates/hash (map (lambda (d) (.ref d 'failure)) dispositions)))) - (error "duplicate failure disposition")) - (def (current-support?) - (every - (lambda (case) - (any - (lambda (clue) - (def entry ((.ref history 'reference) (hash-ref clue "id"))) - (and - (equal? (.ref entry 'case) case) - (equal? (.ref entry 'outcome) "pass") - (equal? selected-bundle (.ref entry 'source-bundle)))) - (hash-ref (car history-cut) "clues"))) - (if (equal? selected-scope "bounded-permit-method/M04") '("M04") '("M04" "M06")))) - (def adapter - (nasa-verification-adapter - "backpressure-history-content/v1" - (lambda (request now until) - (with-catch - (lambda (_) #f) - (lambda () - (if (eq? request context-request) - (begin ((.ref history 'source-current!)) #t) - (and - complete? - (or - (and (eq? request content-request) (current-support?) (current?)) - (any - (lambda (row) - (and - (cadr row) - (eq? request (caddr row)) - (current? #f) - (begin (assert-files (cadddr row)) #t))) - disposition-requests))))))))) - (def (gate receipts now) - ;; One checked native read per use, never a cached verdict or receipt. - (def inspected-cut - (with-catch (lambda (_) #f) (lambda () ((.ref history 'current-capture!))))) - (def present-cut - (or - inspected-cut - (with-catch (lambda (_) history-cut) (lambda () ((.ref history 'capture)))))) - (def still-current - (and - inspected-cut - (with-catch (lambda (_) #f) (lambda () (bound-current? inspected-cut))))) - (def present-failures (failure-ids present-cut)) - (def open-failures - (filter - (lambda (id) - (def entry ((.ref history 'reference) id)) - (and - (not (.ref entry 'diagnostic?)) - (not - (and - still-current - complete? - (any - (lambda (row) - (and - (equal? (car row) id) - (cadr row) - (any (lambda (receipt) (yuanxu-verification-valid? adapter receipt (caddr row) now)) receipts))) - disposition-requests))))) - present-failures)) - (def blockers - (map - (lambda (id) - (nasa-verifiable-evidence - (nasa-criterion-evidence - (string-append "unresolved/" id) - project - "SWE-061" - "SWE-061/p1" - "retained-native-failure" - 'fail) - (.ref ((.ref history 'reference) id) 'digest))) - open-failures)) - (def selected-receipts - (if (and still-current complete?) - receipts - (filter - (lambda (receipt) (yuanxu-verification-valid? adapter receipt context-request now)) - receipts))) - (def result - (nasa-stage-gate - (nasa-stage-policy "backpressure-reassessment" '("SWE-061")) - project - 'a - (.ref profile 'context) - (cons evidence blockers) - adapter - selected-receipts - now)) - (let ((selected-result result) - (selected-open open-failures) - (selected-current still-current) - (selected-complete complete?)) - (.o (:: @ selected-result) - history-complete?: selected-complete - current?: selected-current - failure-ids: present-failures - unresolved: selected-open))) - (let ((selected-adapter adapter) - (selected-content content-request) - (selected-context context-request) - (selected-gate gate) - (selected-dispositions disposition-requests) - (selected-packet packet) - (selected-expected expected)) - (.o - adapter: selected-adapter - content-request: selected-content - context-request: selected-context - gate: selected-gate - disposition-requests: selected-dispositions - packet: selected-packet - failure-ids: selected-expected))) -(def (reassessment-stage review receipts now) ((.ref review 'gate) receipts now)) -(def (reassessment-verify-context review now until) - (yuanxu-verify (.ref review 'adapter) (.ref review 'context-request) now until)) -(def (reassessment-verify-content review now until) - (yuanxu-verify (.ref review 'adapter) (.ref review 'content-request) now until)) -(def (reassessment-verify-disposition review id now until) - (def row - (or - (find (lambda (r) (equal? (car r) id)) (.ref review 'disposition-requests)) - (error "unknown disposition request"))) - (yuanxu-verify (.ref review 'adapter) (caddr row) now until)) diff --git a/scenarios/resource-lifecycle/review/signatures.ss b/scenarios/resource-lifecycle/review/signatures.ss deleted file mode 100644 index adb3450..0000000 --- a/scenarios/resource-lifecycle/review/signatures.ss +++ /dev/null @@ -1,78 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Real OpenSSL handoff through Core Ops. Keys belong to a configured test authority. -(import - :clan/poo/object - :std/encoding/json - (only-in :yuanxu/ops/process-script ProcessScript.) - (only-in :yuanxu/ops/func run-script) - "./func.ss") -(export - review-signature-tools) -(def (review-signature-tools executable-value output) - (def executable (string-copy executable-value)) - (unless (file-exists? output) (create-directory output)) - (def expected (review-file-digest executable)) - (def (current!) - (unless (equal? expected (review-file-digest executable)) (error "signature tool changed")) - #t) - ;; Reuse the native immutable declaration; the public Ops arguments API - ;; supplies each real command. Ops still validates and executes every call. - (def script - (.cc ProcessScript. 'command (list executable) 'directory output - 'timeout 10 'log #f 'check-status #f)) - (def sequence 0) - (def (run args) - (current!) - (set! sequence (+ sequence 1)) - (def log (path-expand (string-append "crypto-" (number->string sequence) ".log") output)) - (def arguments (map string-copy args)) - (def operation (path-expand (string-append "crypto-" (number->string sequence) ".json") output)) - (def (observe phase receipt) - (def stats (##process-statistics)) - (call-with-output-file - operation - (lambda (port) - (write-json - port - (hash - ("schema" "aitia.crypto-ops-observation/v1") - ("phase" phase) - ("argv" (cons executable arguments)) - ("lastGcHeapBytes" (inexact->exact (f64vector-ref stats 15))) - ("lastGcLiveBytes" (inexact->exact (f64vector-ref stats 17))) - ("status" (and receipt (.ref receipt 'status))) - ("seconds" (and receipt (.ref receipt 'seconds)))))))) - (observe "started" #f) - (def receipt (run-script script arguments)) - (call-with-output-file log (lambda (port) (display (.ref receipt 'output) port))) - (observe "completed" receipt) - (unless (equal? expected (review-file-digest executable)) - (error "signature tool changed during verification")) - (= (.ref receipt 'status) 0)) - (def (generate private public) - (unless (and - (run (list "genpkey" "-algorithm" "ED25519" "-out" private)) - (run (list "pkey" "-in" private "-pubout" "-out" public))) - (error "test-only key generation failed"))) - (def (sign private document signature) - (unless (run (list "pkeyutl" "-sign" "-rawin" "-inkey" private "-in" document "-out" signature)) - (error "authority signing failed"))) - (def (verify public document signature) - (and - (file-exists? document) - (file-exists? signature) - (run - (list "pkeyutl" "-verify" "-pubin" "-inkey" public "-rawin" "-in" document "-sigfile" signature)))) - (let ((selected-current current!) - (selected-generate generate) - (selected-sign sign) - (selected-verify verify)) - (.o - current!: selected-current - generate: selected-generate - sign: selected-sign - verify: selected-verify))) diff --git a/scenarios/resource-lifecycle/types.ss b/scenarios/resource-lifecycle/types.ss deleted file mode 100644 index f4105c9..0000000 --- a/scenarios/resource-lifecycle/types.ss +++ /dev/null @@ -1,151 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -;;; Native method admission preserves the selected owners and captured handles. -(import - (only-in :clan/poo/object .get .ref .cc .all-slots object? .slot?) - (only-in - :clan/poo/mop - Type. - Object - Function - define-type - element? - raise-type-error - map-object-values) - (only-in :clan/poo/type Record Symbol Enum) - (only-in :clan/poo/recursive-validation close-validation closed? closed-ref closed-names) - (only-in :yuanxu/object-types/contracts YuanxuContract. yuanxu-predicate-type) - (only-in :gerbil-ascent/program/types GerbilAscentSessionContract) - (only-in "../../types.ss" LibraryNonemptyString) - (only-in - "../../library/drivers/rust-resources/types.ss" - RustResourcesScopeContract) - (only-in "../../library/drivers/evidence/types.ss" ResourceEvidenceScopeContract)) - -(export - RustResourcesScopeContract - ResourceEvidenceScopeContract - ResourceLifecycleScopeContract) - -;; The header admits only owner objects. The dependent Record checks all fields. -(define-type - LifecycleScopeHeader - (Record - domain: [Object] - evidence: [Object] - contracts: [Object] - entry: [Object] - integration-entry: [Object] - methods: [Object])) - -;; A generic closed graph proves its own descriptor, not this Scenario's signature. -;; Keep its issuer ownership opaque; the native graph still owns all validation. -(defstruct lifecycle-normalization (graph) final: #t) -(define-type (LifecycleValidationProof @ Type.) .element?: lifecycle-normalization?) - -(def (same-owner identity-value expected) - (yuanxu-predicate-type identity-value (lambda (value) (eq? value expected)))) - -(def (lifecycle-scope-shape value) - (and - (element? LifecycleScopeHeader value) - (element? RustResourcesScopeContract (.get value domain)) - (element? ResourceEvidenceScopeContract (.get value evidence)) - (let* ((selected-domain (.get value domain)) - (selected-evidence (.get value evidence)) - ;; Recognition keeps the existing owner's handles. It is not a cast: - ;; full membership is checked, and current! remains at actual use. - (context - (yuanxu-predicate-type - 'resource-lifecycle/owned-context - (cut element? (.get selected-domain context-contract) <>))) - (profile - (yuanxu-predicate-type - 'resource-lifecycle/owned-profile - (cut element? (.get selected-domain native-profile-contract) <>))) - (capture-signature - (Function - (list context) - (list - LibraryNonemptyString - profile - LibraryNonemptyString - LibraryNonemptyString - LibraryNonemptyString - Symbol) - optional: - (list (Enum normal early-release)))) - (review-signature (Function (list GerbilAscentSessionContract) (list context)))) - (.cc - (Record - domain: [(same-owner 'resource-lifecycle/domain selected-domain)] - evidence: [(same-owner 'resource-lifecycle/evidence selected-evidence)] - contracts: - [(.cc - (Record - scope: [(same-owner 'resource-lifecycle/contract ResourceLifecycleScopeContract)]) - 'sealed #t)] - entry: [(same-owner 'resource-lifecycle/entry (.get selected-domain entry))] - integration-entry: - [(same-owner 'resource-lifecycle/integration (.get selected-domain integration-entry))] - methods: [(same-owner 'resource-lifecycle/methods (.get selected-domain methods))] - capture: [capture-signature] - open-review: [review-signature]) - 'sealed #t)))) - -(def (closed-lifecycle-scope? value) - (and - (object? value) - (.slot? value 'validation) - (lifecycle-normalization? (.get value validation)) - (closed? (lifecycle-normalization-graph (.get value validation))) - (equal? (closed-names (lifecycle-normalization-graph (.get value validation))) '(scope)) - (let* ((canonical (closed-ref (lifecycle-normalization-graph (.get value validation)) 'scope)) - (shape (lifecycle-scope-shape canonical))) - (and - shape - ;; The declared closed shape permits one additional owner-issued handle. - (element? - (.cc (Record (list shape) validation: (list LifecycleValidationProof)) 'sealed #t) - value) - ;; Membership of Function is callable recognition. The graph additionally - ;; binds the exact wrappers installed by the original normalization. - (andmap - (lambda (name) (eq? (.ref value name) (.ref canonical name))) - (.all-slots canonical)))))) - -(define-type - (ResourceLifecycleScopeType @ Type.) - .element?: - (lambda (value) - (if (and (object? value) (.slot? value 'validation)) - (closed-lifecycle-scope? value) - (let (shape (lifecycle-scope-shape value)) - (and shape (element? shape value))))) - .validate: - (lambda (value) - (if (and (object? value) (.slot? value 'validation)) - (begin - (unless (closed-lifecycle-scope? value) (raise-type-error @ value)) - value) - (let (shape (lifecycle-scope-shape value)) - (unless (and shape (element? shape value)) (raise-type-error @ value)) - (def graph - (close-validation - (lambda (_reference) (list (list 'scope shape value))) - 1)) - ;; A Record's inherited getters normalize for each receiver. Materialize - ;; their admitted values before adding metadata, so functions are not - ;; wrapped again merely because the public receiver acquired a graph. - (.cc (map-object-values identity (closed-ref graph 'scope)) - 'validation (make-lifecycle-normalization graph)))))) - -(define-type - (ResourceLifecycleScopeContract @ YuanxuContract.) - identity: - 'resource-lifecycle/scope - value-contract: - ResourceLifecycleScopeType) diff --git a/t/aitia-projection-test.ss b/t/aitia-projection-test.ss index ea2ebcc..ef4ca4d 100644 --- a/t/aitia-projection-test.ss +++ b/t/aitia-projection-test.ss @@ -1,11 +1,11 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :std/encoding/json - "../scenarios/resource-lifecycle/review/func.ss" - "../scenarios/resource-lifecycle/review/cross-intake.ss") + "../library/backpressure-review/func.ss" + "../library/backpressure-review/cross-intake.ss") (export aitia-projection-test) (def aitia-projection-test (test-suite "Pure Aitia projections preserve content and history identity" diff --git a/t/backpressure-cross-intake-test.ss b/t/backpressure-cross-intake-test.ss deleted file mode 100644 index 55eb2de..0000000 --- a/t/backpressure-cross-intake-test.ss +++ /dev/null @@ -1,352 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import (only-in :gerbil/runtime/loader list-modules) :std/test :std/encoding/json :std/list/list :clan/poo/object - :yuanxu/contribution/verification - :agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority - :deterministic-engineering/scenarios/resource-lifecycle/review/interface) -(export backpressure-cross-intake-test) -(def (load path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (save path value) (call-with-output-file path (cut write-json <> value))) -(def backpressure-cross-intake-test - (test-suite "Real cross-intake discovery and native Aitia authority" - (test-case "intake policy and reviewer changes cannot erase known blockers" - ;; Observe the actual loader, not a fixture or a claimed backend label. - (when (getenv "BACKPRESSURE_REVIEW_LIB" #f) - (let ((files (hash-ref (call-with-input-file (getenv "BACKPRESSURE_REVIEW_SOURCES") - (cut read-json <> object-as-hash: #t)) "files"))) - (for-each (lambda (name) - (def id (string-append "deterministic-engineering/scenarios/resource-lifecycle/review/" name "~0")) - (def found (assoc id (list-modules))) - (def prefix (string-append (getenv "BACKPRESSURE_REVIEW_LIB") "/" id ".o")) - (displayln "NATIVE-OWNER " id " " (and found (cdr found))) (force-output) - (check-equal? (and found (string? (cdr found)) - (>= (string-length (cdr found)) (string-length prefix)) - (equal? prefix (substring (cdr found) 0 (string-length prefix)))) #t) - (def reference (and found (assoc (cdr found) files))) - (check-equal? (and reference (equal? (review-file-digest (car reference)) (cadr reference))) #t)) - '("func" "reassessment" "cross-intake")))) - (let/cc done - (def out (getenv "BACKPRESSURE_CROSS_OUTPUT")) - (when (file-exists? out) (error "cross-intake output must be fresh")) - (create-directory out) - (displayln "OUTPUT " out) (force-output) - (def group (getenv "BACKPRESSURE_CROSS_GROUP" "all")) - (displayln "GROUP " group) (force-output) - (def preflight? (member group '("all" "preflight"))) - (def discovery? (member group '("all" "discovery"))) - (def rejection? (member group '("all" "rejection"))) - (def initial? (or discovery? rejection?)) - (def authority? (member group '("all" "authority"))) - (def rows (load (getenv "BACKPRESSURE_REASSESSMENT_RUNS"))) - (for-each (lambda (row) (check-equal? (review-file-digest (cadr row)) (caddr row))) rows) - (def (run label) (cadr (assoc label rows))) - (def (history) (open-backpressure-history (getenv "BACKPRESSURE_ACCEPTANCE") (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - (def group-owners (open-cross-intake-group '("intake-a" "intake-b") - (getenv "BACKPRESSURE_ACCEPTANCE") (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - (def a (car (.ref group-owners 'histories))) (def b (cadr (.ref group-owners 'histories))) - ;; Reused baseline interpretation cannot share mutable public entry values. - (def baseline-id (cadr (find (lambda (row) - (equal? (.ref ((.ref a 'reference) (cadr row)) 'case) "M06")) - (hash-ref (cadr ((.ref a 'capture))) "counterevidence")))) - (def public-entry ((.ref a 'entry) baseline-id)) - (def original-dependency (caar (hash-ref public-entry "dependencies"))) - (hash-put! public-entry "outcome" "pass") - (set-car! (car (hash-ref public-entry "dependencies")) "/untrusted/cross-intake-cache") - (check-equal? (hash-ref ((.ref b 'entry) baseline-id) "outcome") "fail") - (check-equal? (caar (hash-ref ((.ref b 'entry) baseline-id) "dependencies")) original-dependency) - (set! public-entry #f) - (def repairs - (let (registered ((.ref a 'add-runs!) (map run '("A-original64" "C-repair64" "C-repair128")))) - (append (cadr registered) (caddr registered)))) - (def source (hash-ref (load (run "C-repair64")) "source")) - (def profile (.o (:: @ BackpressureReviewProfile) revision: "cross-intake/r1" scope: "bounded-permit-method/M04-M06")) - (def (with-repairs selected) - (def expected (map cadr (hash-ref (cadr ((.ref selected 'capture))) "counterevidence"))) - (def dispositions (filter-map (lambda (id) - (def failure ((.ref selected 'entry) id)) - (def repair (find (lambda (r) (and (equal? (hash-ref r "case") (hash-ref failure "case")) - (= (hash-ref r "payloadBytes") (hash-ref failure "payloadBytes")))) repairs)) - (and (not (hash-ref failure "diagnostic")) repair - (let ((selected-id id) (selected-repair (hash-ref repair "id"))) (.o failure: selected-id repair: selected-repair)))) expected)) - (make-backpressure-reassessment selected profile source dispositions: dispositions)) - (def (credentials review) - (append (list (reassessment-verify-context review 10 200) (reassessment-verify-content review 10 200)) - (map (lambda (row) (reassessment-verify-disposition review (car row) 10 200)) (.ref review 'disposition-requests)))) - (displayln "PHASE original records and repaired runs registered") (force-output) - (def local #f) (def local-receipts '()) (def local-result #f) - (when preflight? - (set! local (with-repairs a)) (set! local-receipts (credentials local)) - (set! local-result (reassessment-stage local local-receipts 11)) - (check-equal? (.ref local-result 'status) 'stage-admitted)) - ;; B discovers two actual failures absent from A; their original IDs survive the union. - ((.ref b 'add-run!) (run "B-regression64")) - (def federation (.ref group-owners 'federation)) - (def merged ((.ref federation 'capture))) - (check-equal? (length (hash-ref (car merged) "clues")) 46) - (check-equal? (length (hash-ref (cadr merged) "counterevidence")) 7) - (save (path-expand "history-capture.json" out) merged) - (save (path-expand "intake-captures.json" out) ((.ref federation 'discover))) - (def omitted #f) (def omitted-result #f) - (when preflight? - (set! omitted (make-backpressure-reassessment federation profile source failures: (.ref local 'failure-ids))) - (set! omitted-result (reassessment-verify-content omitted 10 100)) - (check-equal? omitted-result #f)) - (displayln "PHASE complete native union queried") (force-output) - (save (path-expand "registration-work.json" out) - (map (lambda (binding) - (def stats ((.ref (cdr binding) 'registration-stats))) - (list (car binding) (.ref stats 'batches) (.ref stats 'logical-dependency-references) - (.ref stats 'checked-dependency-paths))) - (list (cons "intake-a" a) (cons "intake-b" b) (cons "aggregate" federation)))) - (def mechanical (with-repairs federation)) - (def old-receipts-result #f) - (when preflight? - (set! old-receipts-result (reassessment-stage mechanical local-receipts 11)) - (check-equal? (.ref old-receipts-result 'admitted?) #f) - (check-equal? (.ref old-receipts-result 'status) 'context-verification-required) - (check-equal? (.ref old-receipts-result 'current?) #t) - (check-equal? (.ref old-receipts-result 'history-complete?) #t)) - ((.ref federation 'current!)) - (check-equal? (hash-ref (cadr ((.ref federation 'capture))) "viewIdentity") (hash-ref (cadr merged) "viewIdentity")) - (when (equal? group "preflight") - (save (path-expand "preflight.json" out) (hash ("schema" "aitia.cross-intake-preflight/v1") - ("localStatus" (symbol->string (.ref local-result 'status))) - ("omittedVerified" (and omitted-result #t)) - ("oldReceiptsAdmitUnion" (.ref old-receipts-result 'admitted?)) - ("oldReceiptsStatus" (symbol->string (.ref old-receipts-result 'status))) - ("unionCurrent" (.ref old-receipts-result 'current?)) - ("unionComplete" (.ref old-receipts-result 'history-complete?)) - ("localPacket" (.ref local 'packet)) ("omittedPacket" (.ref omitted 'packet)) - ("unionPacket" (.ref mechanical 'packet)) - ("receiptMetadataIsAuthority" #f))) - (displayln "PREFLIGHT-OK actual local admission, omitted inventory refusal and old receipt isolation") (force-output) - (done #t)) - ;; Completed previews are not owners of the current authority worker. - (set! local #f) (set! local-result #f) (set! omitted #f) (set! omitted-result #f) - (set! old-receipts-result #f) (set! local-receipts '()) (set! repairs '()) - (def mechanical-receipts (credentials mechanical)) - (def diagnostic (reassessment-stage mechanical mechanical-receipts 11)) - (save (path-expand "mechanical-diagnostic.json" out) (hash - ("receipts" (map (lambda (r) (and r #t)) mechanical-receipts)) - ("current" (.ref diagnostic 'current?)) ("complete" (.ref diagnostic 'history-complete?)) - ("unresolved" (.ref diagnostic 'unresolved)) - ("covers" (map cadr (.ref mechanical 'disposition-requests))))) - (check-equal? (.ref diagnostic 'status) 'stage-admitted) - (check-equal? (length (.ref mechanical 'failure-ids)) 7) - (call-with-output-file (path-expand "mechanical-packet.json" out) (cut display (.ref mechanical 'packet) <>)) - ;; Completed setup controls retain neither requests nor full dependency copies. - (set! repairs '()) (set! local #f) (set! local-receipts '()) - (set! omitted #f) (set! diagnostic #f) (set! merged #f) - (def tools (review-signature-tools (getenv "BACKPRESSURE_OPENSSL") out)) - (def (p name) (path-expand name out)) - (for-each (lambda (name) ((.ref tools 'generate) (p (string-append name ".key")) (p (string-append name ".pub")))) '("root" "alice" "bob")) - (save (p "directory.json") (hash ("sources" '("intake-a" "intake-b")) ("requiredSigner" "test-reviewer-a") - ("policies" '("approval/v1" "approval/v2")) ("qualificationOnly" #t))) - ((.ref tools 'sign) (p "root.key") (p "directory.json") (p "directory.sig")) - (def changed-body (load (p "mechanical-packet.json"))) - (hash-put! changed-body "scope" "bounded-permit-method/M04") - (def changed-mechanical (.o (:: @ mechanical) packet: (json->string changed-body))) - (check-exception (open-cross-intake-approval federation changed-mechanical tools - (p "directory.json") (p "directory.sig") (p "root.pub") (p "alice.pub") (p "bob.pub")) (lambda (_) #t)) - (set! changed-body #f) (set! changed-mechanical #f) - (def authority (open-cross-intake-approval federation mechanical tools (p "directory.json") (p "directory.sig") - (p "root.pub") (p "alice.pub") (p "bob.pub"))) - (def original-target ((.ref authority 'target) "approval/v1")) - (string-set! (.ref authority 'technical-digest) 0 #\X) - (check-equal? ((.ref authority 'target) "approval/v1") original-target) - (def frame (.ref authority 'frame)) (def submit! (.ref authority 'submit!)) - (def (verified selected (until 100)) - (filter identity (cons (yuanxu-verify (.ref selected 'adapter) (.ref selected 'discovery-request) 10 until) - (map (lambda (row) (yuanxu-verify (.ref selected 'adapter) (cadr row) 10 until)) (.ref selected 'approval-requests))))) - (def steps '()) - (def (finish!) - (save (p "steps.json") steps) - (def sync-work ((.ref federation 'sync-stats))) - (save (p "sync-work.json") (hash ("rebuilds" (.ref sync-work 'rebuilds)) ("reuses" (.ref sync-work 'reuses)))) - (save (p "query-work.json") (map (lambda (pair) - (def stats ((.ref (cadr pair) 'capture-stats))) - (list (car pair) (.ref stats 'queries))) - (list (list "intake-a" a) (list "intake-b" b) (list "aggregate" federation))))) - - (def (record-step label selected receipts expected (now 11)) - (def gate ((.ref selected 'gate) mechanical-receipts receipts now)) - (check-equal? (.ref gate 'current-use-checked?) #t) - (check-equal? (.ref gate 'status) expected) - (check-equal? (.ref gate 'release-authorized?) #f) - (def input-path (p (string-append label "-input.json"))) - (def presented-path (p (string-append label "-presentation.json"))) - (call-with-output-file input-path (cut display (.ref selected 'packet) <>)) - (def input (load input-path)) - (def current-decisions ((.ref authority 'accepted-decisions))) - (def authority-files (delete-duplicates/hash (append (hash-ref input "rootReferences") - (append-map caddr current-decisions)))) - (save presented-path (hash ("receiptMetadataIsAuthority" #f) - ("nativeRequests" (map sdlc-review-authority-snapshot - (cons (.ref selected 'discovery-request) (map cadr (.ref selected 'approval-requests))))) - ("acceptedNow" current-decisions) ("intakesNow" ((.ref federation 'discover))) - ("authorityFilesNow" (map (lambda (pair) (list (car pair) - (with-catch (lambda (_) #f) (lambda () (review-file-digest (car pair)))))) authority-files)) - ("checker" (list (getenv "BACKPRESSURE_OPENSSL") (review-file-digest (getenv "BACKPRESSURE_OPENSSL")))) - ("receipts" (map (lambda (receipt) (list (.ref receipt 'identity) (.ref receipt 'issuer) - (.ref receipt 'issued-at) (.ref receipt 'expires-at))) receipts)))) - (set! steps (append steps (list (hash ("step" label) ("status" (symbol->string (.ref gate 'status))) ("goldStatus" (symbol->string expected)) - ("allFailures" (.ref (.ref gate 'technical) 'failure-ids)) - ("unresolved" (.ref (.ref gate 'technical) 'unresolved)) ("receiptCount" (length receipts)) ("boundary" "current-use-check") - ("inputPacket" input-path) ("inputPacketSha256" (review-file-digest input-path)) - ("presentationPacket" presented-path) ("presentationPacketSha256" (review-file-digest presented-path)) - ("authorityRecords" (map (lambda (row) (caar row)) (.ref selected 'approval-requests))))))) - (displayln "GOLD " label " " expected) (force-output)) - (def (step label selected receipt-thunk expected (now 11)) - (def n (string->number (substring label 2 4))) - (when (or (equal? group "all") - (and (equal? group "discovery") (or (<= n 6) (= n 27))) - (and (equal? group "rejection") (<= 7 n 10)) - (and (equal? group "authority") (<= 11 n 19)) - (and (equal? group "reuse") (or (<= 20 n 26) (= n 28)))) - (record-step label selected (receipt-thunk) expected now))) - (def (decision name signer key policy outcome supersedes) - (save (p (string-append name ".json")) (hash ("signer" signer) ("policy" policy) ("decision" outcome) - ("supersedes" supersedes) ("target" ((.ref authority 'target) policy)))) - ((.ref tools 'sign) (p key) (p (string-append name ".json")) (p (string-append name ".sig"))) - (list (p (string-append name ".json")) (p (string-append name ".sig")))) - (def initial (and initial? (frame "approval/v1"))) - (def initial-receipts (if initial? (verified initial) '())) - (when discovery? (let () - (step "CI01-no-discovery" initial (lambda () '()) 'history-discovery-required) - (def altered (frame "approval/v1")) - (set-cdr! (.ref (.ref altered 'discovery) 'required) '()) - (set-cdr! (.ref (.ref altered 'discovery) 'sources) '()) - (check-equal? (yuanxu-verify (.ref altered 'adapter) (.ref altered 'discovery-request) 10 100) #f) - (step "CI27-edited-discovery-cannot-weaken-mandate" altered (lambda () '()) 'history-discovery-required) - (def incomplete (frame "approval/v1" '("intake-a"))) - (check-equal? (yuanxu-verify (.ref incomplete 'adapter) (.ref incomplete 'discovery-request) 10 100) #f) - (step "CI02-switch-to-a" incomplete (lambda () (verified incomplete)) 'history-discovery-required) - (def only-b (frame "approval/v1" '("intake-b"))) - (step "CI03-switch-to-b" only-b (lambda () (verified only-b)) 'history-discovery-required) - (step "CI04-complete-history-no-approval" initial (lambda () initial-receipts) 'approval-verification-required) - (set! altered #f) (set! incomplete #f) (set! only-b #f) - (def ungranted (decision "ungranted" "test-reviewer-b" "bob.key" "approval/v1" "approved" '())) - (check-equal? (apply submit! ungranted) #f) - (step "CI05-ungranted-reviewer" initial (lambda () initial-receipts) 'approval-verification-required) - (def forged (decision "wrong-key" "test-reviewer-a" "bob.key" "approval/v1" "approved" '())) - (check-equal? (apply submit! forged) #f) - (step "CI06-renamed-reviewer" initial (lambda () initial-receipts) 'approval-verification-required) - )) - (when (equal? group "discovery") (finish!) (done #t)) - (def rejected (decision "rejected" "test-reviewer-a" "alice.key" "approval/v1" "rejected" '())) - (def rejection-id (apply submit! rejected)) (check-equal? (string? rejection-id) #t) - (step "CI07-old-frame-after-rejection" initial (lambda () initial-receipts) 'history-discovery-required) - (set! initial #f) (set! initial-receipts '()) - (when rejection? (let () - (def denied (frame "approval/v1")) - (step "CI08-authenticated-rejection" denied (lambda () (verified denied)) 'approval-rejected) - ;; Public native values own their strings; a bad proposal cannot mutate - ;; the private project, directory digest or accepted decision identity. - (def malformed (frame "approval/v1")) - (def malformed-discovery (.ref malformed 'discovery)) - (def malformed-approval (.ref (.ref (cadar (.ref malformed 'approval-requests)) 'facts) 'approval)) - (string-set! (.ref malformed-discovery 'subject) 0 #\X) - (string-set! (.ref malformed-discovery 'directory) 0 #\X) - (string-set! (.ref malformed-approval 'identity) 0 #\X) - (check-exception (yuanxu-verify (.ref malformed 'adapter) (.ref malformed 'discovery-request) 10 100) (lambda (_) #t)) - (def isolated (frame "approval/v1")) - (check-equal? (.ref (.ref isolated 'discovery) 'subject) "rust.backpressure-lifecycle") - (check-equal? (.ref (.ref isolated 'discovery) 'directory) (review-file-digest (p "directory.json"))) - (check-equal? (.ref (.ref (.ref (cadar (.ref isolated 'approval-requests)) 'facts) 'approval) 'identity) rejection-id) - (check-equal? (.ref ((.ref isolated 'gate) mechanical-receipts (verified isolated) 11) 'status) 'approval-rejected) - (save (p "native-value-isolation.json") (hash ("malformedProposalRefused" #t) - ("freshSubject" (.ref (.ref isolated 'discovery) 'subject)) - ("freshDirectory" (.ref (.ref isolated 'discovery) 'directory)) ("retainedRejection" rejection-id))) - (set! denied #f) (set! malformed #f) (set! malformed-discovery #f) - (set! malformed-approval #f) (set! isolated #f) - (def policy2 (frame "approval/v2")) - (step "CI09-policy-cannot-hide-rejection" policy2 (lambda () (verified policy2)) 'approval-rejected) - )) - (def unclosed (decision "unclosed" "test-reviewer-a" "alice.key" "approval/v2" "approved" '())) - (check-equal? (string? (apply submit! unclosed)) #t) - (def still-denied (and rejection? (frame "approval/v2"))) - (step "CI10-approval-without-disposition" still-denied (lambda () (verified still-denied)) 'approval-rejected) - (set! still-denied #f) - (when (equal? group "rejection") (finish!) (done #t)) - (def resolution (decision "resolved" "test-reviewer-a" "alice.key" "approval/v2" "approved" (list rejection-id))) - (check-equal? (string? (apply submit! resolution)) #t) - (def resolved (and authority? (frame "approval/v2"))) (def resolved-receipts (if authority? (verified resolved) '())) - (step "CI11-explicit-signed-disposition" resolved (lambda () resolved-receipts) 'review-admitted) - (step "CI12-same-cut-reuse" resolved (lambda () resolved-receipts) 'review-admitted 12) - (def cloned (map (lambda (receipt) (.o (:: @ receipt))) resolved-receipts)) - (step "CI13-cloned-receipts" resolved (lambda () cloned) 'history-discovery-required) - (step "CI14-expired-receipts" resolved (lambda () resolved-receipts) 'history-discovery-required 100) - (when authority? (let () - (def resolution-row (find (lambda (row) (equal? (caar row) (review-file-digest (car resolution)))) (.ref resolved 'approval-requests))) - (def resolution-receipt (find (lambda (receipt) (yuanxu-verification-valid? (.ref resolved 'adapter) receipt (cadr resolution-row) 11)) resolved-receipts)) - (yuanxu-revoke-verification! (.ref resolved 'adapter) resolution-receipt) - (step "CI15-revoked-resolution-reopens" resolved (lambda () resolved-receipts) 'approval-rejected) - (def old-policy (frame "approval/v1")) - (step "CI16-new-policy-approval-not-portable" old-policy (lambda () (verified old-policy)) 'approval-rejected) - )) - (set! resolved #f) (set! resolved-receipts '()) (set! cloned '()) - ;; A real signed target-bound delegation is the only alternative reviewer route. - (def delegated (decision "delegated" "test-reviewer-b" "bob.key" "approval/v2" "approved" (list rejection-id))) - (save (p "delegation.json") (hash ("delegate" "test-reviewer-b") ("publicKey" (review-file-digest (p "bob.pub"))) - ("target" ((.ref authority 'target) "approval/v1")) ("supersedes" (list rejection-id)))) - ((.ref tools 'sign) (p "alice.key") (p "delegation.json") (p "delegation.sig")) - (check-equal? (submit! (car delegated) (cadr delegated) (p "delegation.json") (p "delegation.sig")) #f) - (save (p "delegation.json") (hash ("delegate" "test-reviewer-b") ("publicKey" (review-file-digest (p "bob.pub"))) - ("target" ((.ref authority 'target) "approval/v2")) ("supersedes" (list rejection-id)))) - ((.ref tools 'sign) (p "alice.key") (p "delegation.json") (p "delegation.sig")) - (check-equal? (string? (submit! (car delegated) (cadr delegated) (p "delegation.json") (p "delegation.sig"))) #t) - (def handoff (frame "approval/v2")) (def handoff-receipts (verified handoff)) - (dynamic-wind (lambda () (rename-file (p "delegation.sig") (p "delegation.unavailable"))) - (lambda () (step "CI17-unneeded-positive-unavailable" handoff (lambda () handoff-receipts) 'review-admitted)) - (lambda () (rename-file (p "delegation.unavailable") (p "delegation.sig")))) - (def handoff-alice-row (find (lambda (row) (equal? (caar row) (review-file-digest (car resolution)))) (.ref handoff 'approval-requests))) - (def handoff-alice-receipt (find (lambda (receipt) (yuanxu-verification-valid? (.ref handoff 'adapter) receipt (cadr handoff-alice-row) 11)) handoff-receipts)) - (yuanxu-revoke-verification! (.ref handoff 'adapter) handoff-alice-receipt) - (step "CI18-authorized-handoff" handoff (lambda () handoff-receipts) 'review-admitted) - (dynamic-wind (lambda () (rename-file (p "directory.sig") (p "directory.unavailable"))) - (lambda () (step "CI19-authority-unavailable" handoff (lambda () handoff-receipts) 'history-discovery-required)) - (lambda () (rename-file (p "directory.unavailable") (p "directory.sig")))) - (when (equal? group "authority") (finish!) (done #t)) - (step "CI20-identical-authority-restored" handoff (lambda () handoff-receipts) 'review-admitted) - (dynamic-wind (lambda () (rename-file (p "delegation.sig") (p "delegation.unavailable"))) - (lambda () (step "CI21-delegation-unavailable" handoff (lambda () handoff-receipts) 'approval-rejected)) - (lambda () (rename-file (p "delegation.unavailable") (p "delegation.sig")))) - (step "CI22-identical-delegation-restored" handoff (lambda () handoff-receipts) 'review-admitted) - (def unknown-policy (decision "unknown-policy" "test-reviewer-a" "alice.key" "approval/unknown" "approved" '())) - (check-equal? (apply submit! unknown-policy) #f) - ;; Rewriting a source record cannot relabel a previously accepted rejection. - (def preserved-rejection (p "rejection-preserved.json")) - (def preserved-signature (p "rejection-preserved.sig")) - (dynamic-wind (lambda () (rename-file (car rejected) preserved-rejection) (rename-file (cadr rejected) preserved-signature)) - (lambda () - (decision "rejected" "test-reviewer-a" "alice.key" "approval/v2" "approved" '()) - (def tampered (frame "approval/v2")) - (def original-row (find (lambda (row) (equal? (caar row) rejection-id)) (.ref tampered 'approval-requests))) - (check-equal? (.ref (.ref (.ref (cadr original-row) 'facts) 'approval) 'decision) 'rejected) - (step "CI23-rewritten-negative-retained" tampered (lambda () (verified tampered)) 'approval-verification-required) - (rename-file (car rejected) (p "rewritten-rejection.json")) - (rename-file (cadr rejected) (p "rewritten-rejection.sig"))) - (lambda () - (when (file-exists? (car rejected)) (delete-file (car rejected))) - (rename-file preserved-rejection (car rejected)) - (when (file-exists? (cadr rejected)) (delete-file (cadr rejected))) - (rename-file preserved-signature (cadr rejected)))) - ;; New accepted denial invalidates every old frame, including an admitted one. - (def late (decision "late-rejection" "test-reviewer-a" "alice.key" "approval/v2" "rejected" '())) - (check-equal? (string? (apply submit! late)) #t) - (step "CI24-late-denial-invalidates-old-frame" handoff (lambda () handoff-receipts) 'history-discovery-required) - (set! handoff #f) (set! handoff-receipts '()) - (set! handoff-alice-row #f) (set! handoff-alice-receipt #f) - (def late-frame (frame "approval/v2")) - (step "CI25-late-denial-retained" late-frame (lambda () (verified late-frame)) 'approval-rejected) - ;; Same members with a new native source cut invalidate the technical capture too. - ((.ref b 'observe!) (review-file-digest (run "B-regression64"))) - (step "CI26-source-cut-invalidates" late-frame (lambda () (verified late-frame)) 'requirements-blocked) - (set! late-frame #f) - (def changed-frame (frame "approval/v2")) - (check-equal? (yuanxu-verify (.ref changed-frame 'adapter) (.ref changed-frame 'discovery-request) 10 100) #f) - (step "CI28-fresh-frame-cannot-promote-old-technical-cut" changed-frame (lambda () (verified changed-frame)) 'requirements-blocked) - (finish!))))) diff --git a/t/backpressure-owner-handover-test.ss b/t/backpressure-owner-handover-test.ss deleted file mode 100644 index 0fe2fc0..0000000 --- a/t/backpressure-owner-handover-test.ss +++ /dev/null @@ -1,246 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import (only-in :gerbil/runtime/loader list-modules) :std/test :std/encoding/json :std/list/list :clan/poo/object (only-in :std/os/pid getpid) - :yuanxu/contribution/verification - :agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority - :deterministic-engineering/scenarios/resource-lifecycle/review/interface) -(export backpressure-owner-handover-test) -(def (load path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (save path value) (call-with-output-file path (cut write-json <> value))) -(def backpressure-owner-handover-test - (test-suite "Real cross-owner handover through native Aitia discovery" - (test-case "owner handover retains the complete historical rejection inventory" - (when (getenv "BACKPRESSURE_NATIVE_TEST_LIB" #f) - (let* ((id "deterministic-engineering/t/backpressure-owner-handover-test~0") - (loaded (assoc id (list-modules))) - (prefix (string-append (getenv "BACKPRESSURE_NATIVE_TEST_LIB") "/" id ".o"))) - (displayln "NATIVE-TEST " id " " (and loaded (cdr loaded))) (force-output) - (check-equal? (and loaded (string? (cdr loaded)) - (>= (string-length (cdr loaded)) (string-length prefix)) - (equal? prefix (substring (cdr loaded) 0 (string-length prefix)))) #t) - (def captured (assoc (cdr loaded) (hash-ref (load (getenv "BACKPRESSURE_REVIEW_SOURCES")) "files"))) - (check-equal? (and captured (equal? (review-file-digest (car captured)) (cadr captured))) #t))) - (def out (getenv "BACKPRESSURE_CROSS_OUTPUT")) - (when (file-exists? out) (error "cross-intake output must be fresh")) - (create-directory out) - (displayln "OUTPUT " out) (displayln "PROCESS " (getpid)) (force-output) - (def group (getenv "BACKPRESSURE_HANDOVER_GROUP" "all")) - (displayln "GROUP " group) (force-output) - (def rows (load (getenv "BACKPRESSURE_REASSESSMENT_RUNS"))) - (for-each (lambda (row) (check-equal? (review-file-digest (cadr row)) (caddr row))) rows) - (def (run label) (cadr (assoc label rows))) - (def (history) (open-backpressure-history (getenv "BACKPRESSURE_ACCEPTANCE") (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - (def group-owners (open-cross-intake-group '("intake-a" "intake-b") - (getenv "BACKPRESSURE_ACCEPTANCE") (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - (def a (car (.ref group-owners 'histories))) (def b (cadr (.ref group-owners 'histories))) - (def repairs - (let (registered ((.ref a 'add-runs!) (map run '("A-original64" "C-repair64" "C-repair128")))) - (append (cadr registered) (caddr registered)))) - (def source (hash-ref (load (run "C-repair64")) "source")) - (def profile (.o (:: @ BackpressureReviewProfile) revision: "cross-intake/r1" scope: "bounded-permit-method/M04-M06")) - (def (with-repairs selected) - (def expected (map cadr (hash-ref (cadr ((.ref selected 'capture))) "counterevidence"))) - (def dispositions (filter-map (lambda (id) - (def failure ((.ref selected 'entry) id)) - (def repair (find (lambda (r) (and (equal? (hash-ref r "case") (hash-ref failure "case")) - (= (hash-ref r "payloadBytes") (hash-ref failure "payloadBytes")))) repairs)) - (and (not (hash-ref failure "diagnostic")) repair - (let ((selected-id id) (selected-repair (hash-ref repair "id"))) (.o failure: selected-id repair: selected-repair)))) expected)) - (make-backpressure-reassessment selected profile source dispositions: dispositions)) - (def (credentials review) - (append (list (reassessment-verify-context review 10 200) (reassessment-verify-content review 10 200)) - (map (lambda (row) (reassessment-verify-disposition review (car row) 10 200)) (.ref review 'disposition-requests)))) - (displayln "PHASE original records and repaired runs registered") (force-output) - (def local (with-repairs a)) (def local-receipts (credentials local)) - (check-equal? (.ref (reassessment-stage local local-receipts 11) 'status) 'stage-admitted) - ;; B discovers two actual failures absent from A; their original IDs survive the union. - ((.ref b 'add-run!) (run "B-regression64")) - (def federation (.ref group-owners 'federation)) - (def merged ((.ref federation 'capture))) - (check-equal? (length (hash-ref (car merged) "clues")) 46) - (check-equal? (length (hash-ref (cadr merged) "counterevidence")) 7) - (save (path-expand "history-capture.json" out) merged) - (save (path-expand "intake-captures.json" out) ((.ref federation 'discover))) - (def omitted (make-backpressure-reassessment federation profile source failures: (.ref local 'failure-ids))) - (check-equal? (reassessment-verify-content omitted 10 100) #f) - (displayln "PHASE complete native union queried") (force-output) - (save (path-expand "registration-work.json" out) - (map (lambda (binding) - (def stats ((.ref (cdr binding) 'registration-stats))) - (list (car binding) (.ref stats 'batches) (.ref stats 'logical-dependency-references) - (.ref stats 'checked-dependency-paths))) - (list (cons "intake-a" a) (cons "intake-b" b) (cons "aggregate" federation)))) - (def mechanical (with-repairs federation)) - (check-equal? (.ref (reassessment-stage mechanical local-receipts 11) 'admitted?) #f) - ((.ref federation 'current!)) - (check-equal? (hash-ref (cadr ((.ref federation 'capture))) "viewIdentity") (hash-ref (cadr merged) "viewIdentity")) - (def mechanical-receipts (credentials mechanical)) - (def diagnostic (reassessment-stage mechanical mechanical-receipts 11)) - (save (path-expand "mechanical-diagnostic.json" out) (hash - ("receipts" (map (lambda (r) (and r #t)) mechanical-receipts)) - ("current" (.ref diagnostic 'current?)) ("complete" (.ref diagnostic 'history-complete?)) - ("unresolved" (.ref diagnostic 'unresolved)) - ("covers" (map cadr (.ref mechanical 'disposition-requests))))) - (check-equal? (.ref (reassessment-stage mechanical mechanical-receipts 11) 'status) 'stage-admitted) - (check-equal? (length (.ref mechanical 'failure-ids)) 7) - (call-with-output-file (path-expand "mechanical-packet.json" out) (cut display (.ref mechanical 'packet) <>)) - ;; Setup-only counterexamples retain no authority after their assertions. - ;; Keep the live histories, current requests, and current receipts intact. - (set! repairs '()) (set! local #f) (set! local-receipts '()) - (set! omitted #f) (set! diagnostic #f) (set! merged #f) - (def tools (review-signature-tools (getenv "BACKPRESSURE_OPENSSL") out)) - (def (p name) (path-expand name out)) - (for-each (lambda (name) ((.ref tools 'generate) (p (string-append name ".key")) (p (string-append name ".pub")))) '("root" "alice" "bob")) - (save (p "directory.json") (hash ("sources" '("intake-a" "intake-b")) ("requiredSigner" "test-reviewer-a") - ("policies" '("approval/v1" "approval/v2")) ("qualificationOnly" #t))) - ((.ref tools 'sign) (p "root.key") (p "directory.json") (p "directory.sig")) - (def changed-body (load (p "mechanical-packet.json"))) - (hash-put! changed-body "scope" "bounded-permit-method/M04") - (def changed-mechanical (.o (:: @ mechanical) packet: (json->string changed-body))) - (check-exception (open-cross-intake-approval federation changed-mechanical tools - (p "directory.json") (p "directory.sig") (p "root.pub") (p "alice.pub") (p "bob.pub")) (lambda (_) #t)) - (def authority (open-cross-intake-approval federation mechanical tools (p "directory.json") (p "directory.sig") - (p "root.pub") (p "alice.pub") (p "bob.pub"))) - (def (open-owner previous) - (open-cross-intake-approval federation mechanical tools (p "directory.json") (p "directory.sig") - (p "root.pub") (p "alice.pub") (p "bob.pub") predecessor: previous)) - (def (verified selected) - (filter identity (cons (yuanxu-verify (.ref selected 'adapter) (.ref selected 'discovery-request) 10 100) - (map (lambda (row) (yuanxu-verify (.ref selected 'adapter) (cadr row) 10 100)) (.ref selected 'approval-requests))))) - (def (decision selected name outcome supersedes) - (save (p (string-append name ".json")) (hash ("signer" "test-reviewer-a") ("policy" "approval/v1") - ("decision" outcome) ("reason" name) ("supersedes" supersedes) ("target" ((.ref selected 'target) "approval/v1")))) - ((.ref tools 'sign) (p "alice.key") (p (string-append name ".json")) (p (string-append name ".sig"))) - (def submitted-path (p (string-append name ".json"))) - (def submitted-signature (p (string-append name ".sig"))) - (def identity ((.ref selected 'submit!) submitted-path submitted-signature)) - ;; Caller-owned text must not mutate privately accepted reference paths. - (string-set! submitted-path 0 #\X) (string-set! submitted-signature 0 #\X) - identity) - (def (grant previous next name (omit? #f)) - (def capture ((.ref previous 'handover-capture))) - (save (p (string-append name "-capture.json")) (hash ("owner" (.ref capture 'owner)) - ("cut" (.ref capture 'cut)) ("native" (.ref capture 'native)) ("records" (.ref capture 'records)))) - (save (p (string-append name ".json")) (hash ("schema" "aitia.owner-handover/v1") - ("from" (.ref previous 'owner)) ("to" (.ref next 'owner)) - ("technicalDigest" (.ref next 'technical-digest)) ("cut" (.ref capture 'cut)) - ("records" (if omit? '() (map car (.ref capture 'records)))))) - ((.ref tools 'sign) (p "root.key") (p (string-append name ".json")) (p (string-append name ".sig"))) - (list (p (string-append name ".json")) (p (string-append name ".sig")))) - (def steps '()) - (def (step label owner selected receipts expected) - (def n (string->number (substring label 2 4))) - (when (or (equal? group "all") (and (equal? group "transfer") (<= n 9)) - (and (equal? group "reuse") (> n 9))) - (let () - (def result ((.ref selected 'gate) mechanical-receipts receipts 11)) - (save (p (string-append label "-guard.json")) (hash - ("actual" (symbol->string (.ref result 'status))) ("expected" (symbol->string expected)) - ("currentCheck" ((.ref selected 'current-check))) ("receiptCount" (length receipts)) - ("parentCut" (let (capture ((.ref authority 'handover-capture))) (and capture (.ref capture 'cut)))) - ("packet" (.ref selected 'packet)) - ("receiptValidity" (map (lambda (request) - (map (lambda (receipt) (and (yuanxu-verification-valid? (.ref selected 'adapter) receipt request 11) #t)) receipts)) - (cons (.ref selected 'discovery-request) (map cadr (.ref selected 'approval-requests))))))) - (check-equal? (.ref result 'status) expected) - (check-equal? (.ref result 'current-use-checked?) #t) - (check-equal? (.ref result 'release-authorized?) #f) - (def input (p (string-append label "-input.json"))) - (call-with-output-file input (cut display (.ref selected 'packet) <>)) - (def presentation (p (string-append label "-presentation.json"))) - (def prescribed (load input)) - (save presentation (hash - ("handoverFilesNow" (map (lambda (pair) (list (car pair) - (with-catch (lambda (_) #f) (lambda () (review-file-digest (car pair)))))) - (hash-ref prescribed "handoverReferences"))) - ("acceptedNow" ((.ref owner 'accepted-decisions))) - ("nativeRequests" (map sdlc-review-authority-snapshot - (cons (.ref selected 'discovery-request) (map cadr (.ref selected 'approval-requests))))) - ("predecessorNow" (let (capture ((.ref authority 'handover-capture))) - (and capture (list (.ref capture 'owner) (.ref capture 'cut) (.ref capture 'native))))) - ("receiptMetadataIsAuthority" #f))) - (set! steps (append steps (list (hash ("step" label) ("status" (symbol->string (.ref result 'status))) - ("goldStatus" (symbol->string expected)) ("failures" (.ref (.ref result 'technical) 'failure-ids)) - ("input" (list input (review-file-digest input))) - ("presentation" (list presentation (review-file-digest presentation))))))) - (displayln "GOLD " label " " expected) (force-output)))) - (def rejection (decision authority "old-rejected" "rejected" '())) - (check-equal? (string? rejection) #t) - (def old-frame ((.ref authority 'frame) "approval/v1")) - (def old-receipts (verified old-frame)) - (step "OH01-old-rejection" authority old-frame old-receipts 'approval-rejected) - (def successor (open-owner authority)) - (def blank ((.ref successor 'frame) "approval/v1")) - (step "OH02-reopen-before-handover" successor blank (verified blank) 'history-discovery-required) - ;; An incomplete owner cannot become a complete predecessor for a third owner. - (check-equal? ((.ref successor 'handover-capture)) #f) - (def incomplete (grant authority successor "incomplete" #t)) - (check-equal? (apply (.ref successor 'accept-handover!) incomplete) 'handover-refused) - (step "OH03-incomplete-inventory" successor blank (verified blank) 'history-discovery-required) - (def complete (grant authority successor "complete")) - (def supplied-complete (map string-copy complete)) - (check-equal? (apply (.ref successor 'accept-handover!) supplied-complete) 'handover-accepted) - (string-set! (car supplied-complete) 0 #\X) (string-set! (cadr supplied-complete) 0 #\X) - (def transferred ((.ref successor 'frame) "approval/v1")) - (step "OH04-old-receipts-not-transferred" successor transferred old-receipts 'history-discovery-required) - (def transferred-receipts (verified transferred)) - (step "OH05-reverified-old-rejection" successor transferred transferred-receipts 'approval-rejected) - (def policy2 ((.ref successor 'frame) "approval/v2")) - (step "OH06-policy-change" successor policy2 (verified policy2) 'approval-rejected) - (def other (open-owner authority)) - (check-equal? (apply (.ref other 'accept-handover!) complete) 'handover-refused) - (def other-frame ((.ref other 'frame) "approval/v1")) - (step "OH07-wrong-recipient" other other-frame (verified other-frame) 'history-discovery-required) - (check-equal? (string? (decision successor "generic-approval" "approved" '())) #t) - (def generic ((.ref successor 'frame) "approval/v1")) - (step "OH08-generic-new-owner-approval" successor generic (verified generic) 'approval-rejected) - (check-equal? (string? (decision successor "explicit-resolution" "approved" (list rejection))) #t) - (def resolved ((.ref successor 'frame) "approval/v1")) - (def resolved-receipts (verified resolved)) - (step "OH09-explicit-resolution" successor resolved resolved-receipts 'review-admitted) - (step "OH10-same-cut-evidence-reuse" successor resolved resolved-receipts 'review-admitted) - (dynamic-wind (lambda () (rename-file (car complete) (p "handover.unavailable"))) - (lambda () (step "OH11-missing-handover-document" successor resolved resolved-receipts 'history-discovery-required)) - (lambda () (rename-file (p "handover.unavailable") (car complete)))) - (step "OH12-identical-document-restored" successor resolved resolved-receipts 'review-admitted) - ;; Same members and parent cut, but a different active grant reference. - (def before-rebind ((.ref successor 'handover-capture))) - (def rebound-grant (grant authority successor "same-cut-new-grant")) - (check-equal? (apply (.ref successor 'accept-handover!) rebound-grant) 'handover-accepted) - (def after-rebind ((.ref successor 'handover-capture))) - (check-equal? (map car (.ref before-rebind 'records)) (map car (.ref after-rebind 'records))) - (check-equal? (equal? (.ref before-rebind 'cut) (.ref after-rebind 'cut)) #f) - (def stale-rebind ((.ref resolved 'gate) mechanical-receipts resolved-receipts 11)) - (check-equal? (.ref stale-rebind 'status) 'history-discovery-required) - (save (p "lineage-rebind.json") (hash ("before" (.ref before-rebind 'native)) - ("after" (.ref after-rebind 'native)) ("beforeCut" (.ref before-rebind 'cut)) - ("afterCut" (.ref after-rebind 'cut)) ("oldFrameStatus" (symbol->string (.ref stale-rebind 'status))))) - (set! resolved ((.ref successor 'frame) "approval/v1")) - (set! resolved-receipts (verified resolved)) - (def late (decision authority "late-old-counter" "rejected" '())) - (check-equal? (string? late) #t) - (step "OH13-predecessor-advanced" successor resolved resolved-receipts 'history-discovery-required) - (check-equal? (apply (.ref successor 'accept-handover!) complete) 'handover-refused) - (def renewed (grant authority successor "renewed")) - (check-equal? (apply (.ref successor 'accept-handover!) renewed) 'handover-accepted) - (def reopened ((.ref successor 'frame) "approval/v1")) - (def reopened-receipts (verified reopened)) - (step "OH14-new-counter-retained" successor reopened reopened-receipts 'approval-rejected) - ;; The old positive remains in the new owner's inventory, but cannot close the new counter. - (check-equal? (length ((.ref successor 'accepted-decisions))) 4) - (def history-before ((.ref successor 'handover-capture))) - (check-equal? (string? (.ref history-before 'cut)) #t) - ((.ref authority 'close!)) - (check-equal? ((.ref authority 'handover-capture)) #f) - (step "OH15-old-owner-unavailable" successor reopened reopened-receipts 'history-discovery-required) - (check-equal? (apply (.ref successor 'accept-handover!) renewed) 'history-discovery-required) - (def again (open-owner authority)) - (def again-frame ((.ref again 'frame) "approval/v1")) - (step "OH16-reopen-unavailable-owner" again again-frame (verified again-frame) 'history-discovery-required) - (check-equal? ((.ref successor 'handover-capture)) #f) - (save (p "steps.json") steps) - (def work ((.ref federation 'sync-stats))) - (save (p "sync-work.json") (hash ("rebuilds" (.ref work 'rebuilds)) ("reuses" (.ref work 'reuses))))))) diff --git a/t/backpressure-owner-recovery-test.ss b/t/backpressure-owner-recovery-test.ss deleted file mode 100644 index 9c91b92..0000000 --- a/t/backpressure-owner-recovery-test.ss +++ /dev/null @@ -1,603 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import (only-in :gerbil/runtime/loader list-modules) :std/test :std/encoding/json :std/list/list :clan/poo/object (only-in :std/os/pid getpid) (only-in :std/os/signal kill SIGKILL) - (only-in :std/crypto/digest sha256) (only-in :std/encoding/hex hex-encode) - :yuanxu/contribution/verification - :agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority - :deterministic-engineering/scenarios/resource-lifecycle/review/interface - :deterministic-engineering/scenarios/resource-lifecycle/review/archive) -(export backpressure-owner-recovery-test) -(def (load path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) -(def (save path value) (call-with-output-file path (cut write-json <> value))) -(def backpressure-owner-recovery-test - (test-suite "Actual process restart and native Aitia archive recovery" - (test-case "closed checkpoints preserve failures across actual process exits" - (when (getenv "BACKPRESSURE_NATIVE_TEST_LIB" #f) - (let* ((id "deterministic-engineering/t/backpressure-owner-recovery-test~0") - (loaded (assoc id (list-modules))) - (prefix (string-append (getenv "BACKPRESSURE_NATIVE_TEST_LIB") "/" id ".o"))) - (displayln "NATIVE-TEST " id " " (and loaded (cdr loaded))) (force-output) - (check-equal? (and loaded (string? (cdr loaded)) - (>= (string-length (cdr loaded)) (string-length prefix)) - (equal? prefix (substring (cdr loaded) 0 (string-length prefix)))) #t) - (def captured (assoc (cdr loaded) (hash-ref (load (getenv "BACKPRESSURE_REVIEW_SOURCES")) "files"))) - (check-equal? (and captured (equal? (review-file-digest (car captured)) (cadr captured))) #t))) - (def root (getenv "BACKPRESSURE_RECOVERY_ROOT")) - (def phase (getenv "BACKPRESSURE_RECOVERY_PHASE")) - (def out (path-expand phase root)) - (create-directory out) - (displayln "OUTPUT " out) (displayln "PHASE-ID " phase) (displayln "PROCESS " (getpid)) (force-output) - (def reader (recovery-reader-identity)) - (def rows (load (getenv "BACKPRESSURE_REASSESSMENT_RUNS"))) - (for-each (lambda (row) (check-equal? (review-file-digest (cadr row)) (caddr row))) rows) - (def (run label) (cadr (assoc label rows))) - (def (history) (open-backpressure-history (getenv "BACKPRESSURE_ACCEPTANCE") (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - (def started (##current-time-point)) - (def (timed label thunk) - (def begin (##current-time-point)) - (displayln "BEGIN " label " elapsed=" (- begin started)) (force-output) - (def result (thunk)) - (displayln "COST " label " " (- (##current-time-point) begin)) (force-output) result) - (def group-owners (timed "history-group" (lambda () (open-cross-intake-group '("intake-a" "intake-b") - (getenv "BACKPRESSURE_ACCEPTANCE") (getenv "BACKPRESSURE_REVIEW_SOURCES"))))) - (def a (car (.ref group-owners 'histories))) (def b (cadr (.ref group-owners 'histories))) - ;; Force a different native prefix after every real process restart. - ((.ref a 'observe!) (review-file-digest (getenv "BACKPRESSURE_REVIEW_SOURCES"))) - ((.ref a 'observe!) (hex-encode (sha256 (string->utf8 reader)))) - (def repairs - (let (registered ((.ref a 'add-runs!) (map run '("A-original64" "C-repair64" "C-repair128")))) - (append (cadr registered) (caddr registered)))) - (def source (hash-ref (load (run "C-repair64")) "source")) - (def profile (.o (:: @ BackpressureReviewProfile) revision: "cross-intake/r1" scope: "bounded-permit-method/M04-M06")) - (def (with-repairs selected) - (def expected (map cadr (hash-ref (cadr ((.ref selected 'capture))) "counterevidence"))) - (def dispositions (filter-map (lambda (id) - (def failure ((.ref selected 'entry) id)) - (def repair (find (lambda (r) (and (equal? (hash-ref r "case") (hash-ref failure "case")) - (= (hash-ref r "payloadBytes") (hash-ref failure "payloadBytes")))) repairs)) - (and (not (hash-ref failure "diagnostic")) repair - (let ((selected-id id) (selected-repair (hash-ref repair "id"))) (.o failure: selected-id repair: selected-repair)))) expected)) - (make-backpressure-reassessment selected profile source dispositions: dispositions)) - (def (credentials review) - (append (list (reassessment-verify-context review 10 200) (reassessment-verify-content review 10 200)) - (map (lambda (row) (reassessment-verify-disposition review (car row) 10 200)) (.ref review 'disposition-requests)))) - (displayln "PHASE original records and repaired runs registered") (force-output) - ;; The owner-recovery producer owns the A-only/omitted-history controls. - ;; Durable intake and repair roles reconstruct and admit the complete real - ;; union, but do not repeat those independent preflight controls. The - ;; assertions below still execute in phase "producer"; no receipt or - ;; constructed history is transferred between native processes. - (def terminal-only? (member phase '("intake-producer" "intake-recover" "intake-partial" - "intake-pending" "repair-checks" "repair-replay" "restart-one" "restart-two" "restart-three"))) - (def local #f) (def local-receipts '()) - (unless terminal-only? - (set! local (timed "local-build" (lambda () (with-repairs a)))) (set! local-receipts (timed "local-credentials" (lambda () (credentials local)))) - (check-equal? (.ref (timed "local-stage" (lambda () (reassessment-stage local local-receipts 11))) 'status) 'stage-admitted)) - ;; B discovers two actual failures absent from A; their original IDs survive the union. - ((.ref b 'add-run!) (run "B-regression64")) - (def federation (.ref group-owners 'federation)) - (def merged ((.ref federation 'capture))) - (check-equal? (length (hash-ref (car merged) "clues")) 46) - (check-equal? (length (hash-ref (cadr merged) "counterevidence")) 7) - (save (path-expand "history-capture.json" out) merged) - (save (path-expand "intake-captures.json" out) ((.ref federation 'discover))) - (def omitted #f) - (when local - (set! omitted (make-backpressure-reassessment federation profile source failures: (.ref local 'failure-ids))) - (check-equal? (reassessment-verify-content omitted 10 100) #f)) - (displayln "PHASE complete native union queried") (force-output) - (save (path-expand "registration-work.json" out) - (map (lambda (binding) - (def stats ((.ref (cdr binding) 'registration-stats))) - (list (car binding) (.ref stats 'batches) (.ref stats 'logical-dependency-references) - (.ref stats 'checked-dependency-paths))) - (list (cons "intake-a" a) (cons "intake-b" b) (cons "aggregate" federation)))) - (def mechanical (timed "mechanical-build" (lambda () (with-repairs federation)))) - (unless terminal-only? (check-equal? (.ref (timed "old-receipt-stage" (lambda () (reassessment-stage mechanical local-receipts 11))) 'admitted?) #f)) - (check-equal? (hash-ref (cadr ((.ref federation 'capture))) "viewIdentity") (hash-ref (cadr merged) "viewIdentity")) - (def mechanical-receipts (timed "mechanical-credentials" (lambda () (credentials mechanical)))) - (def diagnostic (timed "mechanical-stage" (lambda () (reassessment-stage mechanical mechanical-receipts 11)))) - (save (path-expand "mechanical-diagnostic.json" out) (hash - ("receipts" (map (lambda (r) (and r #t)) mechanical-receipts)) - ("current" (.ref diagnostic 'current?)) ("complete" (.ref diagnostic 'history-complete?)) - ("unresolved" (.ref diagnostic 'unresolved)) - ("covers" (map cadr (.ref mechanical 'disposition-requests))))) - (check-equal? (.ref diagnostic 'status) 'stage-admitted) - (check-equal? (length (.ref mechanical 'failure-ids)) 7) - (call-with-output-file (path-expand "mechanical-packet.json" out) (cut display (.ref mechanical 'packet) <>)) - (def (p name) (path-expand name out)) - (def (g name) (path-expand name root)) - ;; Setup-only counterexamples retain no authority after their assertions. - ;; Keep the live histories, current requests, and current receipts intact. - (set! repairs '()) (set! local #f) (set! local-receipts '()) - (set! omitted #f) (set! diagnostic #f) (set! merged #f) - (def tools (review-signature-tools (getenv "BACKPRESSURE_OPENSSL") out)) - (def selection #f) - (def (host-head) - (let ((selected-path (hash-ref selection "headPath")) (selected-digest (hash-ref selection "headDigest")) - (selected-signature (hash-ref selection "signature"))) - (.o path: selected-path digest: selected-digest signature: selected-signature))) - (def sequence 0) - (def (publish! state descriptor reader-value (invalid-test-input? #f)) - (when (and (equal? state "active") (not invalid-test-input?)) - (check-equal? (review-recovery-activation? (host-head) (g "root.pub") tools descriptor) #t)) - (set! sequence (+ sequence 1)) - (def name (string-append "head-" phase "-" (number->string sequence))) - (def repair-refs (if (and selection (equal? state "active")) - (hash-ref (load (hash-ref selection "headPath")) "repairReferences" '()) '())) - (save (g (string-append name ".json")) (hash ("repairReferences" repair-refs) ("schema" "aitia.recovery-head/v1") - ("state" state) ("owner" (list-ref descriptor 2)) ("cut" (list-ref descriptor 3)) - ("archive" (car descriptor)) ("archiveSha256" (cadr descriptor)) ("reader" reader-value))) - ((.ref tools 'sign) (g "root.key") (g (string-append name ".json")) (g (string-append name ".sig"))) - (set! selection (hash ("owner" (list-ref descriptor 2)) ("cut" (list-ref descriptor 3)) - ("archive" (car descriptor)) ("archiveSha256" (cadr descriptor)) - ("headPath" (g (string-append name ".json"))) - ("headDigest" (review-file-digest (g (string-append name ".json")))) ("signature" (g (string-append name ".sig"))))) - (save (g "host-selection.json") selection)) - (def (descriptor) (list (hash-ref selection "archive") (hash-ref selection "archiveSha256") - (hash-ref selection "owner") (hash-ref selection "cut"))) - (def (open-owner previous persistence: (persistence #f) incarnation: (owner-reader reader)) - (open-cross-intake-approval federation mechanical tools (g "directory.json") (g "directory.sig") - (g "root.pub") (g "alice.pub") (g "bob.pub") predecessor: previous incarnation: owner-reader persistence: persistence)) - (def (verified selected) - (filter identity (cons (yuanxu-verify (.ref selected 'adapter) (.ref selected 'discovery-request) 10 100) - (map (lambda (row) (yuanxu-verify (.ref selected 'adapter) (cadr row) 10 100)) (.ref selected 'approval-requests))))) - (def (decision owner name outcome supersedes) - (save (p (string-append name ".json")) (hash ("signer" "test-reviewer-a") ("policy" "approval/v1") - ("decision" outcome) ("reason" name) ("supersedes" supersedes) ("target" ((.ref owner 'target) "approval/v1")))) - ((.ref tools 'sign) (g "alice.key") (p (string-append name ".json")) (p (string-append name ".sig"))) - ((.ref owner 'submit!) (p (string-append name ".json")) (p (string-append name ".sig")))) - (def (grant source owner) - (def capture (or ((.ref source 'handover-capture)) (error "missing complete archive capture"))) - (save (p "handover.json") (hash ("schema" "aitia.owner-handover/v1") ("from" (.ref source 'owner)) - ("to" (.ref owner 'owner)) ("technicalDigest" (.ref owner 'technical-digest)) - ("cut" (.ref capture 'cut)) ("records" (map car (.ref capture 'records))))) - ((.ref tools 'sign) (g "root.key") (p "handover.json") (p "handover.sig")) - (check-equal? ((.ref owner 'accept-handover!) (p "handover.json") (p "handover.sig")) 'handover-accepted)) - (def (save-receipts receipts) - (save (p "receipt-presentation.json") (map (lambda (r) - (list (.ref r 'identity) (.ref r 'issuer) (.ref r 'issued-at) (.ref r 'expires-at))) receipts))) - (def (restore-presentations path) - (map (lambda (row) - (let ((selected-id (car row)) (selected-issuer (cadr row)) (selected-start (caddr row)) (selected-end (cadddr row))) - (.o identity: selected-id issuer: selected-issuer issued-at: selected-start expires-at: selected-end))) (load path))) - (def steps '()) - (def source-provider #f) - (def (step label owner frame receipts expected) - (when (member (substring label 0 4) '("DR04" "DR10")) - (for-each (lambda (receipt) - (for-each (lambda (request) - (check-equal? (yuanxu-verification-valid? (.ref frame 'adapter) receipt request 11) #f)) - (cons (.ref frame 'discovery-request) (map cadr (.ref frame 'approval-requests))))) receipts)) - (def result ((.ref frame 'gate) mechanical-receipts receipts 11)) - (check-equal? (.ref result 'status) expected) - (check-equal? (.ref result 'current-use-checked?) #t) - (check-equal? (.ref result 'release-authorized?) #f) - (def input (p (string-append label "-input.json"))) - (call-with-output-file input (cut display (.ref frame 'packet) <>)) - (def proof (p (string-append label "-proof.json"))) - (save proof (hash ("selection" selection) - ("headWire" (and selection (call-with-input-file (hash-ref selection "headPath") read-line))) - ("headObservedSha256" (and selection (review-file-digest (hash-ref selection "headPath")))) - ("archiveObservedSha256" (and selection (file-exists? (hash-ref selection "archive")) - (review-file-digest (hash-ref selection "archive")))) - ("methodRunNow" (with-catch (lambda (_) #f) (lambda () (review-file-digest (run "B-regression64"))))) - ("recordFilesNow" (map (lambda (pair) (list (car pair) - (with-catch (lambda (_) #f) (lambda () (review-file-digest (car pair)))))) - (append-map caddr ((.ref owner 'accepted-decisions))))) - ("handoverFilesNow" (map (lambda (pair) (list (car pair) - (with-catch (lambda (_) #f) (lambda () (review-file-digest (car pair)))))) - (hash-ref (call-with-input-string (.ref frame 'packet) (cut read-json <> object-as-hash: #t)) "handoverReferences"))) - ("archiveWire" (and selection (file-exists? (hash-ref selection "archive")) - (call-with-input-file (hash-ref selection "archive") read-line))) - ("providerStatus" (and source-provider (symbol->string ((.ref source-provider 'status))))) - ("acceptedNow" ((.ref owner 'accepted-decisions))) - ("nativeRequests" (map sdlc-review-authority-snapshot - (cons (.ref frame 'discovery-request) (map cadr (.ref frame 'approval-requests))))) - ("pid" (getpid)) ("reader" reader) ("receiptMetadataIsAuthority" #f))) - (set! steps (append steps (list (hash ("step" label) ("status" (symbol->string (.ref result 'status))) - ("goldStatus" (symbol->string expected)) ("pid" (getpid)) - ("failures" (.ref (.ref result 'technical) 'failure-ids)) - ("input" (list input (review-file-digest input))) ("proof" (list proof (review-file-digest proof))))))) - (displayln "GOLD " label " " expected) (force-output)) - (def (producer) - (for-each (lambda (name) ((.ref tools 'generate) (g (string-append name ".key")) (g (string-append name ".pub")))) '("root" "alice" "bob")) - (save (g "directory.json") (hash ("sources" '("intake-a" "intake-b")) ("requiredSigner" "test-reviewer-a") - ("policies" '("approval/v1" "approval/v2")) ("qualificationOnly" #t))) - ((.ref tools 'sign) (g "root.key") (g "directory.json") (g "directory.sig")) - (def origin (open-cross-intake-approval federation mechanical tools (g "directory.json") (g "directory.sig") - (g "root.pub") (g "alice.pub") (g "bob.pub") incarnation: (string-append reader "/origin"))) - (def rejection (decision origin "A-rejection" "rejected" '())) - (check-equal? (string? rejection) #t) - (check-equal? (string? (decision origin "A-resolution" "approved" (list rejection))) #t) - (def owner (open-owner origin)) - (grant origin owner) - (def frame ((.ref owner 'frame) "approval/v1")) (def receipts (verified frame)) - (step "DR01-original-admission" owner frame receipts 'review-admitted) - (save-receipts receipts) - (def sealed ((.ref owner 'seal-history!) (p "archive.json") retire-predecessor?: #t)) - (check-equal? ((.ref origin 'handover-capture)) #f) - (check-equal? (decision origin "A-after-seal" "rejected" '()) #f) - (check-equal? ((.ref owner 'handover-capture)) #f) - (publish! "sealed" sealed #f) - (save (g "first-selection.json") selection) - (step "DR02-sealed-owner-terminal" owner frame receipts 'history-discovery-required)) - (def (recover) - (check-equal? (review-file-digest (g "host-selection.json")) (getenv "BACKPRESSURE_RECOVERY_SELECTION_SHA")) - (set! selection (load (g "host-selection.json"))) - (def selected-archive (load (hash-ref selection "archive"))) - (check-equal? (= (getpid) (hash-ref selected-archive "producerPid")) #f) - (def selected-reader reader) - (def selected-owner (hash-ref selection "owner")) (def selected-cut (hash-ref selection "cut")) - (def selected-path (hash-ref selection "archive")) (def selected-root (g "root.pub")) - (def mandate (.o owner: selected-owner cut: selected-cut archive: selected-path root-public: selected-root - reader: selected-reader head: host-head)) - (set! source-provider (open-archived-review-source mandate tools)) - (def owner (open-owner source-provider)) - (def before ((.ref owner 'frame) "approval/v1")) - (cond - ((equal? phase "restart-one") - (let () - (check-equal? (decision owner "B-before-activation" "rejected" '()) #f) - (check-equal? ((.ref owner 'accepted-decisions)) '()) - (step "DR03-before-activation" owner before (verified before) 'history-discovery-required) - (publish! "active" (descriptor) reader) - (grant source-provider owner) - (check-exception (open-owner source-provider) (lambda (_) #t)) - (check-exception (open-archived-review-source mandate tools) (lambda (_) #t)) - (def restored ((.ref owner 'frame) "approval/v1")) - (step "DR04-old-receipts-are-data" owner restored (restore-presentations (g "producer/receipt-presentation.json")) 'history-discovery-required) - (def receipts (verified restored)) - (step "DR05-reverified-archive-reuse" owner restored receipts 'review-admitted) - (save-receipts receipts) - (check-equal? (string? (decision owner "B-new-counter" "rejected" '())) #t) - (def denied ((.ref owner 'frame) "approval/v1")) - (step "DR06-new-counter-before-seal" owner denied (verified denied) 'approval-rejected) - (def sealed ((.ref owner 'seal-history!) (p "archive.json"))) - (publish! "sealed" sealed #f) - (save (g "second-selection.json") selection))) - ((equal? phase "restart-two") - (let () - (step "DR07-next-owner-before-activation" owner before (verified before) 'history-discovery-required) - (publish! "active" (descriptor) reader) - (def active-selection selection) - (def source-path (hash-ref selection "archive")) - (def original-wire (call-with-input-file source-path read-line)) - (dynamic-wind (lambda () (rename-file source-path (p "archive.unavailable"))) - (lambda () (step "DR08-archive-unavailable" owner before (verified before) 'history-discovery-required)) - (lambda () (rename-file (p "archive.unavailable") source-path))) - (def incomplete (load source-path)) - (hash-put! incomplete "records" (take (hash-ref incomplete "records") 2)) - (dynamic-wind (lambda () - (save source-path incomplete) - (publish! "active" (list source-path (review-file-digest source-path) selected-owner selected-cut) reader #t)) - (lambda () - (step "DR09-signed-incomplete-inventory" owner before (verified before) 'history-discovery-required) - (check-equal? ((.ref source-provider 'status)) 'archive-refused)) - (lambda () (call-with-output-file source-path (cut display original-wire <>)) (set! selection active-selection))) - (grant source-provider owner) - (def restored ((.ref owner 'frame) "approval/v1")) - (step "DR10-second-receipts-cannot-rehydrate" owner restored (restore-presentations (g "restart-one/receipt-presentation.json")) 'history-discovery-required) - (step "DR11-inherited-counter-remains" owner restored (verified restored) 'approval-rejected) - (def counter (find (lambda (row) (equal? (hash-ref (cadr row) "reason") "B-new-counter")) ((.ref owner 'accepted-decisions)))) - (check-equal? (string? (decision owner "C-resolution" "approved" (list (car counter)))) #t) - (def resolved ((.ref owner 'frame) "approval/v1")) (def receipts (verified resolved)) - (step "DR12-explicit-current-resolution" owner resolved receipts 'review-admitted) - (step "DR13-current-owner-reuses-evidence" owner resolved receipts 'review-admitted) - (def old-record (caar (caddr (car ((.ref owner 'accepted-decisions)))))) - (dynamic-wind (lambda () (rename-file old-record (p "old-record.unavailable"))) - (lambda () (step "DR14-required-record-unavailable" owner resolved receipts 'history-discovery-required)) - (lambda () (rename-file (p "old-record.unavailable") old-record))) - (step "DR15-exact-record-restoration" owner resolved receipts 'review-admitted) - (def run-path (run "B-regression64")) - (dynamic-wind (lambda () (rename-file run-path (p "run.unavailable"))) - (lambda () (step "DR16-method-source-unavailable" owner resolved receipts 'requirements-blocked)) - (lambda () (rename-file (p "run.unavailable") run-path))) - (step "DR17-method-source-restored" owner resolved receipts 'review-admitted) - (save-receipts receipts) - (check-equal? (string? (decision owner "C-unsealed-counter" "rejected" '())) #t) - (def denied ((.ref owner 'frame) "approval/v1")) - (step "DR18-unsealed-counter-blocks" owner denied (verified denied) 'approval-rejected) - ;; Exit without seal. The durable head remains active for this incarnation. - (save (g "host-selection.json") selection))) - ((equal? phase "restart-three") - (let () - (def old-reader (hash-ref (load (hash-ref selection "headPath")) "reader")) - (check-equal? (equal? old-reader reader) #f) - (check-exception (open-archived-review-source (.o (:: @ mandate) reader: old-reader) tools) (lambda (_) #t)) - (check-equal? (review-recovery-activation? (host-head) (g "root.pub") tools (descriptor)) #f) - (step "DR19-unsealed-old-process-unavailable" owner before (restore-presentations (g "restart-two/receipt-presentation.json")) 'history-discovery-required) - (def active selection) - (def old (load (g "first-selection.json"))) - (def current-path (hash-ref selection "headPath")) - (def original (call-with-input-file current-path read-line)) - (dynamic-wind (lambda () (call-with-output-file current-path - (cut display (call-with-input-file (hash-ref old "headPath") read-line) <>))) - (lambda () - (step "DR20-signed-old-head-rollback" owner before (verified before) 'history-discovery-required) - (check-equal? ((.ref source-provider 'status)) 'archive-refused)) - (lambda () (call-with-output-file current-path (cut display original <>)))) - (step "DR21-active-head-is-not-a-seal" owner before (verified before) 'history-discovery-required))) - (else (error "unknown recovery phase")))) - ;; Same actual setup, native sources, signatures and Aitia gate as DR01-21. - ;; Only the trusted host publication capability changes for this profile. - (def (save-process!) - (save (p "steps.json") steps) - (save (p "process.json") (hash ("pid" (getpid)) ("phase" phase) ("reader" reader) - ("technicalDigest" (.ref mechanical 'packet)) ("selection" selection)))) - (def (interrupt! boundary) - (save-process!) - (save (p "interrupt.json") (hash ("boundary" boundary) ("pid" (getpid)) ("selection" selection))) - (displayln "EXPECTED-SIGKILL " boundary " " (getpid)) (force-output) - (kill (getpid) SIGKILL) - (error "SIGKILL returned")) - (def crash-at #f) - (def (durable-host) - (def (commit! wire previous) - (check-equal? (hash-ref selection "headDigest") previous) - (def body (call-with-input-string wire (cut read-json <> object-as-hash: #t))) - (def file (p (string-append "prefix-" (number->string (hash-ref body "acceptedCount")) ".json"))) - (def checkpoint (list file (hex-encode (sha256 (string->utf8 wire))) (hash-ref body "owner") (hash-ref body "cut"))) - ;; Intent becomes selected before writing. A crash cannot select an - ;; earlier positive checkpoint as if the later intake did not exist. - (def previous-reference (list (.ref (host-head) 'path) previous (.ref (host-head) 'signature))) - (publish! "writing" checkpoint reader #t) - (save (p "pending-input.json") (hash ("prior" previous-reference) ("wire" wire) ("previousHead" previous) ("intent" selection))) - (call-with-output-file (string-append file ".pending") (lambda (port) - (display (if (eq? crash-at 'partial) (substring wire 0 (quotient (string-length wire) 2)) wire) port))) - (when (eq? crash-at 'partial) (interrupt! "partial-write-no-ack")) - (rename-file (string-append file ".pending") file) - (set! sequence (+ sequence 1)) - (def head-name (string-append "checkpoint-" phase "-" (number->string sequence))) - (save (g (string-append head-name ".json")) (hash ("schema" "aitia.recovery-head/v1") - ("state" "checkpoint") ("reader" #f) ("owner" (hash-ref body "owner")) ("cut" (hash-ref body "cut")) - ("archive" file) ("archiveSha256" (list-ref checkpoint 1)) ("previousHead" previous) - ("acceptedCount" (hash-ref body "acceptedCount")))) - ((.ref tools 'sign) (g "root.key") (g (string-append head-name ".json")) (g (string-append head-name ".sig"))) - (set! selection (hash ("owner" (hash-ref body "owner")) ("cut" (hash-ref body "cut")) - ("archive" file) ("archiveSha256" (list-ref checkpoint 1)) - ("headPath" (g (string-append head-name ".json"))) - ("headDigest" (review-file-digest (g (string-append head-name ".json")))) - ("signature" (g (string-append head-name ".sig"))))) - (save (g "host-selection.json") selection) - (when (eq? crash-at 'published) (interrupt! "published-before-ack")) - (host-head)) - (let (selected-commit commit!) (.o selected: host-head commit!: selected-commit))) - (def (acknowledged owner name outcome supersedes) - (def id (timed name (lambda () (decision owner name outcome supersedes)))) - (check-equal? (string? id) #t) - ;; This witness is written only after the public call returned its ID. - (save (p (string-append name "-ack.json")) (hash ("id" id) ("selection" selection) ("pid" (getpid)))) - id) - (def (intake-recover-owner) - (check-equal? (review-file-digest (g "host-selection.json")) (getenv "BACKPRESSURE_RECOVERY_SELECTION_SHA")) - (set! selection (load (g "host-selection.json"))) - (def archive (load (hash-ref selection "archive"))) - (check-equal? (= (getpid) (hash-ref archive "producerPid")) #f) - (def selected-reader (string-copy reader)) - (def mandate (.o owner: (hash-ref selection "owner") cut: (hash-ref selection "cut") - archive: (hash-ref selection "archive") root-public: (g "root.pub") reader: selected-reader head: host-head)) - (set! source-provider (open-archived-review-source mandate tools)) - ;; Activation happens before owner construction so its initial selected - ;; custody is the actual active reference, not the older checkpoint. - (publish! "active" (descriptor) reader) - (def owner (open-owner source-provider persistence: (durable-host))) - (grant source-provider owner) - owner) - (def (intake-producer) - (for-each (lambda (name) ((.ref tools 'generate) (g (string-append name ".key")) (g (string-append name ".pub")))) '("root" "alice" "bob")) - (save (g "directory.json") (hash ("sources" '("intake-a" "intake-b")) ("requiredSigner" "test-reviewer-a") - ("policies" '("approval/v1" "approval/v2")) ("qualificationOnly" #t))) - ((.ref tools 'sign) (g "root.key") (g "directory.json") (g "directory.sig")) - (publish! "writing" (list (p "uninitialized") "none" reader "none") reader #t) - (def live (timed "live-owner" (lambda () (open-owner #f)))) - (check-exception (open-owner live persistence: (durable-host)) (lambda (_) #t)) - ((.ref live 'close!)) - (save (p "live-predecessor-refusal.json") (hash ("refused" #t) ("owner" (.ref live 'owner)))) - (set! live #f) - (def owner (timed "durable-owner" (lambda () (open-owner #f persistence: (durable-host))))) - (def original (acknowledged owner "P-old-blocker" "rejected" '())) - (acknowledged owner "P-resolution" "approved" (list original)) - (def positive ((.ref owner 'frame) "approval/v1")) - (save-receipts (verified positive)) - (def counter (acknowledged owner "P-new-counter" "rejected" '())) - (def denied ((.ref owner 'frame) "approval/v1")) - (step "DP01-confirmed-prefix-counter" owner denied (verified denied) 'approval-rejected) - (def previous (hash-ref selection "headDigest")) - (check-equal? ((.ref owner 'submit!) (p "P-new-counter.json") (p "P-new-counter.sig")) counter) - (check-equal? (hash-ref selection "headDigest") previous) - (check-equal? (length ((.ref owner 'accepted-decisions))) 3) - (step "DP02-identical-retry-no-duplicate" owner denied (verified denied) 'approval-rejected) - (interrupt! "confirmed-counter-before-owner-seal")) - (def (intake-recover) - (def owner (intake-recover-owner)) - (def denied ((.ref owner 'frame) "approval/v1")) - (def old (restore-presentations (g "intake-producer/receipt-presentation.json"))) - (for-each (lambda (receipt) (for-each (lambda (request) - (check-equal? (yuanxu-verification-valid? (.ref denied 'adapter) receipt request 11) #f)) - (cons (.ref denied 'discovery-request) (map cadr (.ref denied 'approval-requests))))) old) - (step "DP03-old-receipts-have-no-authority" owner denied old 'history-discovery-required) - (step "DP04-confirmed-counter-survives-SIGKILL" owner denied (verified denied) 'approval-rejected) - (def counter (hash-ref (load (g "intake-producer/P-new-counter-ack.json")) "id")) - (acknowledged owner "R-resolution" "approved" (list counter)) - (def positive ((.ref owner 'frame) "approval/v1")) (def receipts (verified positive)) - (step "DP05-current-disposition-persisted" owner positive receipts 'review-admitted) - (step "DP06-current-evidence-reuse" owner positive receipts 'review-admitted) - (def archive-path (hash-ref selection "archive")) - (dynamic-wind (lambda () (rename-file archive-path (string-append archive-path ".missing"))) - (lambda () (step "DP12-current-prefix-unavailable" owner positive receipts 'history-discovery-required)) - (lambda () (rename-file (string-append archive-path ".missing") archive-path))) - (step "DP13-identical-prefix-restored" owner positive receipts 'review-admitted) - (save-receipts receipts) - (set! crash-at 'published) - (acknowledged owner "R-published-counter" "rejected" '()) - (error "publication interruption must prevent acknowledgment")) - (def (intake-partial) - (def owner (intake-recover-owner)) - (check-equal? (file-exists? (g "intake-recover/R-published-counter-ack.json")) #f) - (def denied ((.ref owner 'frame) "approval/v1")) - (step "DP07-published-unacknowledged-counter-retained" owner denied (verified denied) 'approval-rejected) - (check-equal? (length ((.ref owner 'accepted-decisions))) 5) - ;; Replaying an old signed proposal cannot retarget it to this revision. - (check-equal? ((.ref owner 'submit!) (g "intake-recover/R-published-counter.json") (g "intake-recover/R-published-counter.sig")) #f) - (step "DP08-old-target-replay-refused" owner denied (verified denied) 'approval-rejected) - (set! crash-at 'partial) - (acknowledged owner "I-partial-counter" "rejected" '()) - (error "partial write must prevent acknowledgment")) - (def (intake-pending) - (check-equal? (review-file-digest (g "host-selection.json")) (getenv "BACKPRESSURE_RECOVERY_SELECTION_SHA")) - (set! selection (load (g "host-selection.json"))) - (check-equal? (file-exists? (g "intake-partial/I-partial-counter-ack.json")) #f) - (check-equal? (hash-ref (load (hash-ref selection "headPath")) "state") "writing") - (def partial (string-append (hash-ref selection "archive") ".pending")) - (check-equal? (file-exists? partial) #t) - (check-exception (load partial) (lambda (_) #t)) - (check-equal? (review-recovery-activation? (host-head) (g "root.pub") tools (descriptor)) #f) - (def selected-reader (string-copy reader)) - (def mandate (.o owner: (hash-ref selection "owner") cut: (hash-ref selection "cut") - archive: (hash-ref selection "archive") root-public: (g "root.pub") reader: selected-reader head: host-head)) - (set! source-provider (open-archived-review-source mandate tools)) - (def owner (open-owner source-provider)) - (def before ((.ref owner 'frame) "approval/v1")) - (step "DP09-incomplete-write-pending" owner before (verified before) 'history-discovery-required) - (def current selection) - (def old-selection (hash-ref (load (g "intake-producer/P-resolution-ack.json")) "selection")) - (def old-path (hash-ref old-selection "headPath")) - (def old-wire (call-with-input-file old-path read-line)) - (def current-path (hash-ref selection "headPath")) - (def current-wire (call-with-input-file current-path read-line)) - (dynamic-wind (lambda () (call-with-output-file current-path (cut display old-wire <>))) - (lambda () (step "DP10-old-positive-head-cannot-hide-intent" owner before (verified before) 'history-discovery-required) - (check-equal? ((.ref source-provider 'status)) 'archive-refused)) - (lambda () (call-with-output-file current-path (cut display current-wire <>)))) - ;; The last committed full prefix remains intact and still contains the - ;; unresolved counter. Pending writing is not authority to drop it. - (def committed (hash-ref (load (g "intake-recover/pending-input.json")) "intent")) - (def old-archive (load (hash-ref committed "archive"))) - (check-equal? (length (hash-ref old-archive "records")) 5) - (step "DP11-restored-intent-still-pending" owner before (verified before) 'history-discovery-required)) - - (def (repair-host) - (def (publish-repair! wire path expected) - ;; Serial host CAS; a signed document alone cannot select a head. - (check-equal? (hash-ref selection "headDigest") expected) - (call-with-output-file path (cut display wire <>)) - ((.ref tools 'sign) (g "root.key") path (string-append path ".sig")) - (def head (load path)) - (set! selection (hash ("owner" (hash-ref head "owner")) ("cut" (hash-ref head "cut")) - ("archive" (hash-ref head "archive")) ("archiveSha256" (hash-ref head "archiveSha256")) - ("headPath" path) ("headDigest" (review-file-digest path)) ("signature" (string-append path ".sig")))) - (save (g "host-selection.json") selection)) - (let (publisher publish-repair!) (.o selected: host-head publish-repair!: publisher))) - (def repair-steps '()) - (def (repair-operation id auth sig expected) - (def before (clone-selection)) - (def actual (review-repair-prefix! (repair-host) tools (g "root.pub") auth sig)) - (check-equal? actual expected) - (set! repair-steps (append repair-steps (list (hash ("id" id) ("expected" (symbol->string expected)) - ("actual" (symbol->string actual)) ("authorization" auth) ("signature" sig) - ("authorizationSha256" (and (file-exists? auth) (review-file-digest auth))) - ("candidateObservedSha256" (let (path (hash-ref (load auth) "candidate")) - (and (file-exists? path) (review-file-digest path)))) - ("before" before) ("after" (clone-selection)) ("pid" (getpid)))))) - (save (p "repair-steps.json") repair-steps)) - (def (clone-selection) (call-with-input-string (json->string selection) (cut read-json <> object-as-hash: #t))) - (def (repair-checks) - ;; Existing actual pending and signed rollback controls, not a fixture. - (intake-pending) - (def input (load (g "intake-partial/pending-input.json"))) - (def candidate (p "complete-candidate.json")) - (def authorization (p "repair-authorization.json")) - (def signature (p "repair-authorization.sig")) - (def body (hash ("schema" "aitia.prefix-repair/v1") ("action" "complete-exact-prefix") - ("writing" (list (.ref (host-head) 'path) (.ref (host-head) 'digest) (.ref (host-head) 'signature))) - ("prior" (hash-ref input "prior")) ("candidate" candidate) - ("outputArchive" (p "repaired-prefix.json")) ("outputHead" (p "repaired-head.json")))) - (save authorization body) - ((.ref tools 'sign) (g "root.key") authorization signature) - (repair-operation "PR01-missing-complete-input" authorization signature 'repair-pending) - (call-with-output-file candidate (cut display (hash-ref input "wire") <>)) - (check-equal? (review-file-digest candidate) (hash-ref selection "archiveSha256")) - ((.ref tools 'sign) (g "bob.key") authorization (p "unauthorized.sig")) - (repair-operation "PR02-untrusted-repair-signer" authorization (p "unauthorized.sig") 'repair-refused) - (def original (hash-ref input "wire")) - (dynamic-wind (lambda () (call-with-output-file candidate (cut display (substring original 0 (quotient (string-length original) 2)) <>))) - (lambda () (repair-operation "PR03-truncated-candidate" authorization signature 'repair-refused)) - (lambda () (call-with-output-file candidate (cut display original <>)))) - (def writing (hash-ref body "writing")) - (hash-put! body "writing" (hash-ref input "prior")) - (save (p "wrong-writing.json") body) - ((.ref tools 'sign) (g "root.key") (p "wrong-writing.json") (p "wrong-writing.sig")) - (repair-operation "PR04-old-active-is-not-writing" (p "wrong-writing.json") (p "wrong-writing.sig") 'repair-refused) - (hash-put! body "writing" writing) - (def prior (hash-ref body "prior")) - (def earlier (hash-ref (load (g "intake-producer/P-resolution-ack.json")) "selection")) - (hash-put! body "prior" (list (hash-ref earlier "headPath") (hash-ref earlier "headDigest") (hash-ref earlier "signature"))) - (save (p "wrong-prior.json") body) - ((.ref tools 'sign) (g "root.key") (p "wrong-prior.json") (p "wrong-prior.sig")) - (repair-operation "PR05-old-positive-prefix-refused" (p "wrong-prior.json") (p "wrong-prior.sig") 'repair-refused) - (hash-put! body "prior" prior) - (def partial (string-append (hash-ref selection "archive") ".pending")) - (def partial-sha (review-file-digest partial)) - (repair-operation "PR06-exact-authorized-completion" authorization signature 'repair-completed) - (check-equal? (review-file-digest partial) partial-sha) - (def repaired (hash-ref selection "headDigest")) - (repair-operation "PR07-identical-request-reuses-checkpoint" authorization signature 'repair-reused) - (check-equal? (hash-ref selection "headDigest") repaired) - (check-equal? (length (hash-ref (load (hash-ref selection "archive")) "records")) 6) - ;; Checkpoint is not activated and carries no current approval authority. - (def selected-reader (recovery-reader-identity)) - (set! source-provider (open-archived-review-source - (.o owner: (hash-ref selection "owner") cut: (hash-ref selection "cut") - archive: (hash-ref selection "archive") root-public: (g "root.pub") reader: selected-reader head: host-head) tools)) - (def owner (open-owner source-provider incarnation: selected-reader)) - (def frame ((.ref owner 'frame) "approval/v1")) - (step "PR08-repaired-checkpoint-still-pending" owner frame (verified frame) 'history-discovery-required)) - (def (repair-replay) - (def owner (intake-recover-owner)) - (check-equal? (length ((.ref owner 'accepted-decisions))) 6) - (def denied ((.ref owner 'frame) "approval/v1")) - (def old (restore-presentations (g "intake-recover/receipt-presentation.json"))) - (for-each (lambda (receipt) (for-each (lambda (request) - (check-equal? (yuanxu-verification-valid? (.ref denied 'adapter) receipt request 11) #f)) - (cons (.ref denied 'discovery-request) (map cadr (.ref denied 'approval-requests))))) old) - (step "PR09-repair-cannot-rehydrate-receipts" owner denied old 'history-discovery-required) - (step "PR10-both-unacknowledged-counters-retained" owner denied (verified denied) 'approval-rejected) - (def counters (filter-map (lambda (row) - (and (member (hash-ref (cadr row) "reason") '("R-published-counter" "I-partial-counter")) (car row))) - ((.ref owner 'accepted-decisions)))) - (check-equal? (length counters) 2) - (def auth (g "repair-checks/repair-authorization.json")) - (def sig (g "repair-checks/repair-authorization.sig")) - (repair-operation "PR11-active-reader-refuses-old-repair" auth sig 'repair-refused) - (def candidate (g "repair-checks/complete-candidate.json")) - (dynamic-wind (lambda () (rename-file candidate (p "candidate.missing"))) - (lambda () (repair-operation "PR17-known-stale-repair-refuses-before-missing-input" auth sig 'repair-refused)) - (lambda () (rename-file (p "candidate.missing") candidate))) - (def resolution (acknowledged owner "N-current-resolution" "approved" counters)) - (def positive ((.ref owner 'frame) "approval/v1")) (def receipts (verified positive)) - (step "PR12-only-current-explicit-disposition-admits" owner positive receipts 'review-admitted) - (def current (hash-ref selection "headDigest")) - (check-equal? ((.ref owner 'submit!) (p "N-current-resolution.json") (p "N-current-resolution.sig")) resolution) - (check-equal? (hash-ref selection "headDigest") current) - (check-equal? (length ((.ref owner 'accepted-decisions))) 7) - (repair-operation "PR13-new-prefix-refuses-old-repair" auth sig 'repair-refused) - (step "PR14-current-receipts-and-records-reused" owner positive receipts 'review-admitted) - (dynamic-wind (lambda () (rename-file auth (p "authorization.missing"))) - (lambda () (step "PR15-repair-closure-missing-after-new-prefix" owner positive receipts 'history-discovery-required)) - (lambda () (rename-file (p "authorization.missing") auth))) - (step "PR16-exact-repair-closure-restored" owner positive receipts 'review-admitted)) - - (cond ((equal? phase "intake-producer") (intake-producer)) - ((equal? phase "intake-recover") (intake-recover)) - ((equal? phase "intake-partial") (intake-partial)) - ((equal? phase "intake-pending") (intake-pending)) - ((equal? phase "repair-checks") (repair-checks)) - ((equal? phase "repair-replay") (repair-replay)) - ((equal? phase "producer") (producer)) (else (recover))) - (save (p "steps.json") steps) - (save (p "process.json") (hash ("pid" (getpid)) ("phase" phase) ("reader" reader) - ("technicalDigest" (.ref mechanical 'packet)) ("selection" selection)))))) diff --git a/t/backpressure-review-test.ss b/t/backpressure-review-test.ss deleted file mode 100644 index e51314d..0000000 --- a/t/backpressure-review-test.ss +++ /dev/null @@ -1,155 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -;;; -*- Gerbil -*- -(import (only-in :std/os/pid getpid) (only-in :gerbil/runtime/loader list-modules) :std/test :std/encoding/json - (only-in :std/misc/ports read-all-as-u8vector) :clan/poo/object - (only-in :deterministic-engineering/library/drivers/rust-resources/oracle resource-native-oracle) - :yuanxu/contribution/verification - :agentic-ai-lab/lambda-aitia/modules/sdlc/standards/nasa-review - :agentic-ai-lab/lambda-aitia/modules/sdlc/standards/nasa-lifecycle - :deterministic-engineering/scenarios/resource-lifecycle/review/profile - :deterministic-engineering/scenarios/resource-lifecycle/review/func) -(export backpressure-review-applicability-test backpressure-review-reuse-test backpressure-review-counter-test backpressure-review-corruption-test) -(def acceptance (getenv "BACKPRESSURE_ACCEPTANCE")) -(def (status review receipts now) (.ref (backpressure-stage review receipts now) 'status)) -(def backpressure-review-applicability-test - (test-suite "Actual backpressure native applicability" - (test-case "applicability and genuine content receipts have separate boundaries" - ;; Observe the actual loader, not a fixture or a claimed backend label. - (when (getenv "BACKPRESSURE_REVIEW_LIB" #f) - (let ((files (hash-ref (call-with-input-file (getenv "BACKPRESSURE_REVIEW_SOURCES") - (cut read-json <> object-as-hash: #t)) "files"))) - (for-each (lambda (name) - (def id (string-append "deterministic-engineering/scenarios/resource-lifecycle/review/" name "~0")) - (def found (assoc id (list-modules))) - (def prefix (string-append (getenv "BACKPRESSURE_REVIEW_LIB") "/" id ".o")) - (displayln "NATIVE-OWNER " id " " (and found (cdr found))) (force-output) - (check-equal? (and found (string? (cdr found)) - (>= (string-length (cdr found)) (string-length prefix)) - (equal? prefix (substring (cdr found) 0 (string-length prefix)))) #t) - (def reference (and found (assoc (cdr found) files))) - (check-equal? (and reference (equal? (review-file-digest (car reference)) (cadr reference))) #t)) - '("func")))) - (def review (make-backpressure-review BackpressureReviewProfile acceptance)) - (check-equal? (.ref (.ref review 'audit) 'records) 22) - (check-equal? (.ref (.ref review 'audit) 'expected-counters) 4) - ;; A genuine completed content audit may be reused, never its public edits. - (def caller-audit (audit-backpressure-content acceptance 'caller-owned)) - (check-equal? (.ref caller-audit 'reused-content?) #t) - (check-equal? (.ref caller-audit 'outcome) 'fail) - (.put! caller-audit 'outcome 'pass) - (set-car! (car (.ref caller-audit 'dependencies)) "/untrusted/cache-path") - (check-equal? (.ref (audit-backpressure-content acceptance 'caller-owned) 'outcome) 'fail) - ;; Change real raw bytes early in this process; restore the exact captured - ;; bytes on unwind. A cache hit still reads every dependency and refuses. - (def raw-path (car (find (lambda (pair) (string-contains (car pair) "/observations.json")) - (.ref (.ref review 'audit) 'dependencies)))) - (def raw-bytes (call-with-input-file raw-path read-all-as-u8vector)) - (def raw-sha (review-file-digest raw-path)) - (def raw-backup (path-expand (string-append "raw-cache-backup-" (number->string (getpid)) ".bin") - (path-directory (getenv "BACKPRESSURE_REVIEW_SOURCES")))) - (call-with-output-file raw-backup (cut write-u8vector raw-bytes <>)) - (check-equal? (review-file-digest raw-backup) raw-sha) - (displayln "CACHE-RAW-BACKUP " raw-backup " " raw-sha " " raw-path) (force-output) - (def raw (call-with-input-string (utf8->string raw-bytes) (cut read-json <> object-as-hash: #t))) - (def held (find (lambda (event) (equal? (hash-ref event "event") "held")) - (hash-ref (car (hash-ref raw "cases")) "events"))) - (hash-put! held "live" 0) - (dynamic-wind - (lambda () (call-with-output-file (list path: raw-path truncate: #t) (cut write-json <> raw))) - (lambda () - (check-exception (audit-backpressure-content acceptance 'worker-owned) (lambda (_) #t)) - (check-equal? (and (verify-review-context review 10 20) #t) #t) - (check-exception (verify-review-content review 10 20) (lambda (_) #t))) - (lambda () (call-with-output-file (list path: raw-path truncate: #t) (cut write-u8vector raw-bytes <>)))) - (check-equal? (review-file-digest raw-path) raw-sha) - (check-equal? (.ref (audit-backpressure-content acceptance 'worker-owned) 'outcome) 'pass) - - (check-equal? (status review '() 11) 'context-verification-required) - (def cr (verify-review-context review 10 20)) - (check-equal? (status review (list cr) 11) 'content-verification-required) - (def er (verify-review-content review 10 20)) - (def gate (backpressure-stage review (list cr er) 11)) - (check-equal? (.ref gate 'status) 'stage-admitted) - (check-equal? (.ref gate 'release-authorized?) #f) - (check-equal? (status review (list cr er) 20) 'context-verification-required) - (check-equal? (status review (list cr (.o (:: @ er))) 11) 'content-verification-required) - (yuanxu-revoke-verification! (.ref review 'adapter) er) - (check-equal? (status review (list cr er) 11) 'content-verification-required) - ;; Native applicability is checked separately, not inferred from a pass label. - (def report (nasa-assess-project 'e (.ref review 'project) (.ref review 'context) (.ref review 'evidence))) - (def row (find (lambda (r) (equal? (.ref r 'requirement) "SWE-061")) (.ref report 'requirements))) - (check-equal? (.ref row 'status) 'not-invoked) - ;; The complete catalog remains the independent reference for scoped work. - (for-each (lambda (class-value) - (def full (nasa-assess-project class-value (.ref review 'project) (.ref review 'context) (.ref review 'evidence))) - (def scoped (nasa-assess-project class-value (.ref review 'project) (.ref review 'context) (.ref review 'evidence) - requirements: '("SWE-061"))) - (def expected (find (lambda (r) (equal? (.ref r 'requirement) "SWE-061")) (.ref full 'requirements))) - (check-equal? (length (.ref scoped 'requirements)) 1) - (for-each (lambda (key) - (check-equal? (.ref (car (.ref scoped 'requirements)) key) (.ref expected key))) - '(requirement status evidence-identities excluded-evidence missing-criteria activity authority compliance))) '(a e)) - (check-exception (nasa-assess-project 'a (.ref review 'project) (.ref review 'context) (.ref review 'evidence) - requirements: '("SWE-061" "SWE-061")) (lambda (_) #t)) - (check-exception (nasa-assess-project 'a (.ref review 'project) (.ref review 'context) (.ref review 'evidence) - requirements: '("SWE-unknown")) (lambda (_) #t))))) - -(def backpressure-review-reuse-test - (test-suite "Actual backpressure native reuse" - (test-case "content reuse needs the same basis and fresh revision-bound receipts" - (def first (make-backpressure-review BackpressureReviewProfile acceptance)) - (def cr (verify-review-context first 10 20)) - (def er (verify-review-content first 10 20)) - (check-equal? (status first (list cr er) 12) 'stage-admitted) - (def next-profile (.o (:: @ BackpressureReviewProfile) revision: (string-copy "accepted-owner-slice/r2"))) - (def next (make-backpressure-review next-profile acceptance previous: first)) - (check-equal? (.ref (.ref first 'audit) 'report-digest) (.ref (.ref next 'audit) 'report-digest)) - (check-equal? (status next (list cr er) 12) 'context-verification-required) - (def nc (verify-review-context next 11 21)) - (check-equal? (status next (list nc er) 12) 'content-verification-required) - (def ne (verify-review-content next 11 21)) - (check-equal? (status next (list nc ne) 12) 'stage-admitted) - ;; A caller cannot get a genuine receipt merely by supplying a real digest. - (def clone (.o (:: @ (car (.ref next 'evidence))) identity: "relabeled")) - (check-equal? (yuanxu-verify (.ref next 'adapter) (nasa-evidence-request clone) 12 22) #f) - (string-set! (.ref next-profile 'revision) 0 #\X) - (check-exception (backpressure-stage next (list nc ne) 12) (lambda (_) #t))))) - -(def backpressure-review-counter-test - (test-suite "Actual backpressure native counter" - (test-case "actual caller-owned counter blocks and survives revision and scope narrowing" - (def unsafe-profile (.o (:: @ BackpressureReviewProfile) target: 'caller-owned scope: "bounded-permit-method/M06")) - (def unsafe-review (make-backpressure-review unsafe-profile acceptance)) - (check-equal? (.ref (car (.ref unsafe-review 'evidence)) 'outcome) 'fail) - (def c (verify-review-context unsafe-review 10 20)) - (def e (verify-review-content unsafe-review 10 20)) - (check-equal? (status unsafe-review (list c e) 11) 'requirements-blocked) - (def next-profile (.o (:: @ BackpressureReviewProfile) revision: "counter-disposition-pending/r2")) - (def next (make-backpressure-review next-profile acceptance previous: unsafe-review)) - (def nc (verify-review-context next 10 20)) - (def ne (verify-review-content next 10 20)) - (def gate (backpressure-stage next (list nc ne) 11)) - (check-equal? (.ref (car (.ref next 'evidence)) 'outcome) 'pass) - (check-equal? (.ref gate 'status) 'requirements-blocked) - (check-equal? (length (.ref gate 'reported-failures)) 1) - (check-equal? (.ref gate 'release-authorized?) #f)))) - -(def backpressure-review-corruption-test - (test-suite "Actual backpressure native corruption" - (test-case "raw event corruption and changed acceptance are independently refused" - (def (load path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) - (def a (load acceptance)) - (def report (load (hash-ref a "report"))) - (def native-row (find (lambda (r) (equal? (hash-ref (hash-ref r "observation") "method") "native")) (hash-ref report "results"))) - (def raw-path (car (find (lambda (p) (string-contains (car p) "/observations.json")) (hash-ref (hash-ref native-row "observation") "artifacts")))) - (def raw (load raw-path)) - (def held (find (lambda (event) (equal? (hash-ref event "event") "held")) (hash-ref (car (hash-ref raw "cases")) "events"))) - (hash-put! held "live" 0) - (check-exception (resource-native-oracle raw) (lambda (_) #t)) - (hash-put! a "reportSha256" (make-string 64 #\0)) - (def altered (path-expand ".data/aitia-backpressure-20261019/rejected-acceptance-fixed.json" (current-directory))) - (call-with-output-file (list path: altered truncate: #t) (cut write-json <> a)) - (check-exception (audit-backpressure-content altered 'worker-owned) (lambda (_) #t))))) diff --git a/t/codex-capture-test.ss b/t/codex-capture-test.ss deleted file mode 100644 index 6b8540f..0000000 --- a/t/codex-capture-test.ss +++ /dev/null @@ -1,26 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import :std/test :clan/poo/object - (only-in :std/source this-source-file) - "../projects/library-formation/init.ss" "../profiles/library-formation.ss") -(export codex-capture-test) -(def codex-capture-test - (test-suite "Same-owner local authority enters actual capture preparation" - (test-case "original limited role authority discharges only its own obligation" - (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules library-project-formation scope)) - (def root (path-expand ".." (path-directory (this-source-file)))) - (def original ((.get scene acquire-codex) (getenv "CODEX_THREAD_ID") (getenv "CODEX_SOURCE_TURN") - (string-split (getenv "CODEX_SOURCE_MESSAGES") #\,) root 120)) - (def authority ((.get scene authorize-codex) original)) - (def request (.o purpose: 'repository-design root: (path-expand ".." (path-directory (this-source-file))) profile: LibraryFormationProfile)) - (def prepared ((.get scene prepare-capture) request authority)) - (check-equal? (.get prepared status) 'capture-blocked) - (check-equal? (.get prepared capture) #f) - (check-equal? (.get prepared local-authority roles) '(project-owner implementation-owner)) - (check-equal? (map (cut .get <> role) - (filter (lambda (f) (eq? (.get f kind) 'missing-original-source-capability)) (.get prepared findings))) - '(user-confirmation proposal-occurrence)) - (check-equal? (length (filter (lambda (f) (eq? (.get f kind) 'unacquired-method-footprint)) (.get prepared findings))) 4) - (check-exception ((.get scene prepare-capture) request (.get prepared local-authority)) error?)))) diff --git a/t/codex-source-test.ss b/t/codex-source-test.ss deleted file mode 100644 index e9086ab..0000000 --- a/t/codex-source-test.ss +++ /dev/null @@ -1,45 +0,0 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - -(import :std/test :clan/poo/object :std/encoding/json - (only-in :std/source this-source-file) - "../scenarios/project-formation/codex.ss") -(export codex-source-test) -(def codex-source-test - (test-suite "Actual Codex account and original-message observations" - (test-case "bounded requests and documentary replays refuse before host work" - (check-exception (formation-acquire-codex "" "turn" '("id") "/" 60) error?) - (check-exception (formation-acquire-codex "thread" "turn" '("id" "id") "/" 60) error?) - (check-exception (formation-acquire-codex "thread" "turn" '("id") "/" 0) error?) - (check-exception (formation-codex-current! (.o status: 'codex-account-and-message-observation)) error?)) - (test-case "actual source, limited operational authority and verification revoke" - (def ids (string-split (getenv "CODEX_SOURCE_MESSAGES") #\,)) - (def root (path-expand ".." (path-directory (this-source-file)))) - (def original (formation-acquire-codex (getenv "CODEX_THREAD_ID") (getenv "CODEX_SOURCE_TURN") ids root 120)) - (def observed (formation-codex-observation original)) - (check-equal? (.get observed status) 'codex-account-and-message-observation) - (check-equal? (.get observed historical-actor-binding) 'unavailable) - (check-equal? (.get observed authority) 'observation-only) - (check-equal? (hash-ref (hash-ref (.get observed basis) "accountBefore") "type") "chatgpt") - (check-equal? (map (lambda (row) (hash-ref (hash-ref row "item") "id")) (hash-ref (.get observed basis) "messages")) ids) - (check-exception (formation-codex-current! observed) error?) - ;; Outward mutation cannot rewrite the private original basis. - (hash-put! (.get observed basis) "threadId" "forged") - (check-equal? (eq? (formation-codex-current! original) original) #t) - (check-equal? (hash-ref (.get (formation-codex-observation original) basis) "threadId") (getenv "CODEX_THREAD_ID")) - (def authority (formation-authorize-codex original)) - (def grant (formation-codex-authority-observation authority)) - (check-equal? (.get grant roles) '(project-owner implementation-owner)) - (check-equal? (.get grant trust-boundary) 'trusted-local-codex) - (check-equal? (eq? (formation-codex-authorized! authority 'implementation root) authority) #t) - (for-each (lambda (purpose) (check-exception (formation-codex-authorized! authority purpose root) error?)) - '(independent-review delivery recipient-adoption)) - (check-exception (formation-codex-authorized! authority 'verification "/private/tmp") error?) - (check-exception (formation-codex-authorized! grant 'verification root) error?) - (check-exception (formation-authorize-codex observed) error?) - (def verification (formation-verify-codex original)) - (check-equal? (eq? (formation-codex-verification-current! verification) verification) #t) - (check-exception (formation-codex-verification-current! observed) error?) - (formation-revoke-codex! verification) - (check-exception (formation-codex-verification-current! verification) error?)))) diff --git a/t/dependency-compatibility-test.ss b/t/dependency-compatibility-test.ss index 0eaf980..10bc713 100644 --- a/t/dependency-compatibility-test.ss +++ b/t/dependency-compatibility-test.ss @@ -5,7 +5,7 @@ ;;; -*- Gerbil -*- ;;; A small native ASCENT evaluation checks the shared POO object ABI. ;;; The literal answers are an independent finite oracle, not gateway gold. -(import :std/test :gerbil-ascent/rules/interface +(import :std/test :gerbil-ascent/rules/func (only-in :gerbil-ascent/rules/declaration rule-module-program) (only-in :clan/poo/object .o .ref)) diff --git a/t/engineering-ownership-test.ss b/t/engineering-ownership-test.ss index 5f69d8f..5b80c13 100644 --- a/t/engineering-ownership-test.ss +++ b/t/engineering-ownership-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test (only-in :clan/poo/object .get .slot? .cc) @@ -17,12 +17,12 @@ (check-equal? (file-exists? "modules") #f) (check-equal? (.get deterministic-engineering.init.exports Library evidence identity) 'evidence)) (test-case "Rust consumes the actual generic parent without a copied model" - (def parent (.get deterministic-engineering.init.exports Library backpressure-memory scope entry)) - (def rust (.get deterministic-engineering.init.exports Library rust-resources scope)) + (def parent (.get deterministic-engineering.init.exports Library backpressure-memory entry)) + (def rust (.get deterministic-engineering.init.exports Library rust-resources)) (check-equal? (eq? (.get rust entry parent) parent) #t) (check-equal? (eq? (.get rust model-library) - (.get deterministic-engineering.init.exports Library backpressure-tokio-rayon scope)) #t) + (.get deterministic-engineering.init.exports Library backpressure-tokio-rayon)) #t) (check-equal? (eq? (.get rust model-library parent entry) parent) #t) (def model-library (.get rust model-library)) (check-equal? (eq? (.get rust config coding-policy) @@ -52,5 +52,5 @@ (check-equal? (scheme-free? crate) #t) (check-equal? (file-exists? (path-expand "src/main.rs" crate)) #t) (check-equal? (file-exists? (path-expand "Cargo.toml" crate)) #t) - (check-equal? (file-exists? "library/drivers/rust-resources/interface.ss") #t) - (check-equal? (file-exists? "library/concurrency/resource-control/backpressure-memory/tokio-rayon/ownership.sysml") #t)))) + (check-equal? (file-exists? "library/rust-resources/interface.ss") #t) + (check-equal? (file-exists? "library/backpressure-tokio-rayon/ownership.sysml") #t)))) diff --git a/t/evidence-catalog-test.ss b/t/evidence-catalog-test.ss index a45cc5d..61b97f1 100644 --- a/t/evidence-catalog-test.ss +++ b/t/evidence-catalog-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; Catalog control inputs exercise the real native engine; no method receipt is fabricated. (import :std/test @@ -11,9 +11,9 @@ (only-in :clan/poo/mop TypeError?)) (export evidence-catalog-test) -(def evidence (.get deterministic-engineering.init.exports Library evidence scope)) -(def generic (.get deterministic-engineering.init.exports Library backpressure-memory scope entry)) -(def rust (.get deterministic-engineering.init.exports Library rust-resources scope entry)) +(def evidence (.get deterministic-engineering.init.exports Library evidence)) +(def generic (.get deterministic-engineering.init.exports Library backpressure-memory entry)) +(def rust (.get deterministic-engineering.init.exports Library rust-resources entry)) (def (rows result relation) ((.get result rows-of) relation)) (def (same-rows? actual expected) (and (= (length actual) (length expected)) diff --git a/t/evidence-declarative-live-test.ss b/t/evidence-declarative-live-test.ss index 4b88637..897075b 100644 --- a/t/evidence-declarative-live-test.ss +++ b/t/evidence-declarative-live-test.ss @@ -1,18 +1,22 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- ;;; Real QNT/TLC outputs, independent BFS/trace oracles and native exchanges. (import :std/test :std/encoding/json :clan/poo/object :gerbil-ascent/program/session (only-in :std/misc/ports read-all-as-string) (only-in :agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger ascent-trajectory) - "../profiles/resource-lifecycle.ss" "../profiles/gateway.ss" - "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "../library/drivers/rust-resources/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "../library/drivers/rust-resources/methods.ss" - "../library/drivers/evidence/func.ss") + + "../library/backpressure-memory/objects.ss" + "../library/rust-resources/objects.ss" + "../library/backpressure-tokio-rayon/objects.ss" + "../library/rust-resources/methods.ss" + "../library/evidence/func.ss") +(import :deterministic-engineering/init) +(def Cap2Profile (.get deterministic-engineering.init.exports Library gateway-profiles profiles Cap2Profile)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) +(def LargerPayloadProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LargerPayloadProfile)) (export evidence-declarative-live-test) (def selected-method-references (map (lambda (key) (method-ref (.ref RustMethodDefinitions key))) '(native quint lean))) @@ -31,8 +35,8 @@ (test-case "real pass and counter retain frozen cuts, reuse and currentness boundaries" (def root (getenv "LIBRARY_METHOD_ROOT")) (def tool (getenv "LIBRARY_QUINT")) - (def source (path-expand "library/concurrency/resource-control/backpressure-memory/model.qnt" root)) - (def rule-source (path-expand "library/drivers/evidence/func.ss" root)) + (def source (path-expand "library/backpressure-memory/model.qnt" root)) + (def rule-source (path-expand "library/evidence/func.ss" root)) (def model (specialize-backpressure BackpressureModel selected-method-references)) (def pass (resource-run-qnt root LifecycleProfile tool (path-expand "pass" root))) (def counter (resource-run-qnt root LifecycleProfile tool (path-expand "counter" root) 'early-release)) @@ -92,7 +96,7 @@ ;; Repeated registration retains history without duplicate rows. (resource-register-results! session (list pass counter) trajectory rule-source) (check-equal? (length (rows (gerbil-ascent-session-run session) 'witness)) 2) - (def declaration (path-expand "library/drivers/rust-resources/objects.ss" root)) + (def declaration (path-expand "library/rust-resources/objects.ss" root)) (def before (call-with-input-file declaration read-all-as-string)) (try (write-text declaration (string-append before "\n;; changed declaration bytes\n")) diff --git a/t/gateway-library-test.ss b/t/gateway-library-test.ss index f54cd5a..88b99cf 100644 --- a/t/gateway-library-test.ss +++ b/t/gateway-library-test.ss @@ -4,11 +4,15 @@ ;;; -*- Gerbil -*- (import :std/test :deterministic-engineering/init :clan/poo/object - :deterministic-engineering/profiles/gateway - :gerbil-ascent/rules/interface) + + :gerbil-ascent/rules/func) +(def LocalProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles LocalProfile)) +(def Cap2Profile (.get deterministic-engineering.init.exports Library gateway-profiles profiles Cap2Profile)) +(def CacheProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles CacheProfile)) +(def RetryProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles RetryProfile)) (export gateway-initial-test gateway-method-test gateway-capacity-test gateway-cache-retry-test gateway-source-test gateway-boundaries-test gateway-counter-test) -(def scene (.get (.get deterministic-engineering.init.exports Scenarios) gateway-review scope)) +(def scene (.get (.get deterministic-engineering.init.exports Library) gateway-review)) (def entry (.ref scene 'entry)) (def expected-obligations '((u1 BP-O01 review) (u1 BP-O02 quint) (u1 BP-O03 lean) (u1 BP-O04 review) @@ -142,4 +146,3 @@ (check-equal? (length (rows r 'support)) 1) (check-equal? (rows r 'counter) '((u1 BP-O03 wcounter "V/counter-fixture" "A/counter")))))) - diff --git a/t/gateway-real-results-test.ss b/t/gateway-real-results-test.ss index 7db4c63..d4340c3 100644 --- a/t/gateway-real-results-test.ss +++ b/t/gateway-real-results-test.ss @@ -10,10 +10,10 @@ (def gateway-real-results-test (test-suite "Real gateway method evidence, provenance and scoped reuse" (test-case "actual method outputs and independent native queries match review gold" - (def scope (.get (.get deterministic-engineering.init.exports Scenarios) gateway-review scope)) + (def scope (.get (.get deterministic-engineering.init.exports Library) gateway-review)) (def digest (.get scope methods file-digest)) (def report-path (getenv "GATEWAY_REAL_REPORT" #f)) - (unless report-path (error "run examples/gateway-evidence.ss and set GATEWAY_REAL_REPORT")) + (unless report-path (error "run t/support/gateway-evidence.ss and set GATEWAY_REAL_REPORT")) (def (load-json path) (call-with-input-file path (cut read-json <> object-as-hash: #t))) (def report (load-json report-path)) (check-equal? (hash-ref report "schema") "gateway.real-investigation.v1") diff --git a/t/layer-declarative-alignment-test.ss b/t/layer-declarative-alignment-test.ss index 8765086..046df75 100644 --- a/t/layer-declarative-alignment-test.ss +++ b/t/layer-declarative-alignment-test.ss @@ -1,18 +1,24 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- -(import :std/test :clan/poo/object :gerbil-ascent/rules/interface +(import :std/test :clan/poo/object :gerbil-ascent/rules/func (only-in :clan/poo/mop validate) "../library/project-organization/objects.ss" "../library/project-organization/types.ss" - "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "../library/drivers/rust-resources/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "../library/drivers/rust-resources/types.ss" - "../profiles/resource-lifecycle.ss" "../profiles/gateway.ss" "../profiles/library-formation.ss" - "../scenarios/project-formation/func.ss" "../scenarios/gateway-review/func.ss" - "../library/drivers/project-formation/func.ss" "../library/drivers/evidence/func.ss") + "../library/backpressure-memory/objects.ss" + "../library/rust-resources/objects.ss" + "../library/backpressure-tokio-rayon/objects.ss" + "../library/rust-resources/types.ss" + + "../library/project-intake/func.ss" "../library/gateway-review/func.ss" + "../library/project-formation/func.ss" "../library/evidence/func.ss") +(import :deterministic-engineering/init) +(def LocalProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles LocalProfile)) +(def CacheProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles CacheProfile)) +(def RetryProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles RetryProfile)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) +(def LibraryFormationProfile (.get deterministic-engineering.init.exports Library library-formation-profiles profiles LibraryFormationProfile)) (export layer-declarative-alignment-test) (def selected-method-references (map (lambda (key) (method-ref (.ref RustMethodDefinitions key))) '(native quint lean))) diff --git a/t/library-declaration-test.ss b/t/library-declaration-test.ss index 9b73251..20aae8d 100644 --- a/t/library-declaration-test.ss +++ b/t/library-declaration-test.ss @@ -5,8 +5,8 @@ (import :std/test :clan/poo/object (only-in :clan/poo/mop validate) "../types.ss" - "../library/concurrency/resource-control/backpressure-memory/abstract/types.ss" - "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss") + "../library/backpressure-memory/types.ss" + "../library/backpressure-memory/objects.ss") (export library-declaration-test) (def library-declaration-test (test-suite "Library-owned declaration metadata and Generic model" diff --git a/t/library-declarative-model-test.ss b/t/library-declarative-model-test.ss index cc67324..827238e 100644 --- a/t/library-declarative-model-test.ss +++ b/t/library-declarative-model-test.ss @@ -1,16 +1,18 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- -(import :std/test :clan/poo/object :gerbil-ascent/rules/interface +(import :std/test :clan/poo/object :gerbil-ascent/rules/func (only-in :clan/poo/mop validate) - "../library/drivers/rust-resources/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "../library/drivers/rust-resources/types.ss" - (only-in "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" BackpressureModel) - (only-in "../library/drivers/evidence/func.ss" open-resource-review) - "../profiles/resource-lifecycle.ss") + "../library/rust-resources/objects.ss" + "../library/backpressure-tokio-rayon/objects.ss" + "../library/rust-resources/types.ss" + (only-in "../library/backpressure-memory/objects.ss" BackpressureModel) + (only-in "../library/evidence/func.ss" open-resource-review) + ) +(import :deterministic-engineering/init) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export library-declarative-model-test) (def selected-method-references diff --git a/t/library-mapping-test.ss b/t/library-mapping-test.ss index 2ffca54..55bbd22 100644 --- a/t/library-mapping-test.ss +++ b/t/library-mapping-test.ss @@ -1,15 +1,15 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; Authored meaning versus historical observation: no execution receipt is issued. (import :std/test :std/encoding/json :clan/poo/object (only-in :clan/poo/mop validate) - "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "../library/drivers/rust-resources/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "../library/drivers/rust-resources/types.ss" - "../library/drivers/rust-resources/correspondence.ss") + "../library/backpressure-memory/objects.ss" + "../library/rust-resources/objects.ss" + "../library/backpressure-tokio-rayon/objects.ss" + "../library/rust-resources/types.ss" + "../library/rust-resources/correspondence.ss") (export library-mapping-test) (def selected-method-references (map (lambda (key) (method-ref (.ref RustMethodDefinitions key))) '(native quint lean))) diff --git a/t/library-method-binding-test.ss b/t/library-method-binding-test.ss index c33ee04..67990f2 100644 --- a/t/library-method-binding-test.ss +++ b/t/library-method-binding-test.ss @@ -1,13 +1,15 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :std/test :clan/poo/object (only-in :clan/poo/mop validate) - "../library/drivers/rust-resources/types.ss" - "../library/drivers/rust-resources/objects.ss" - "../library/drivers/rust-resources/func.ss" - "../profiles/resource-lifecycle.ss") + "../library/rust-resources/types.ss" + "../library/rust-resources/objects.ss" + "../library/rust-resources/func.ss" + ) +(import :deterministic-engineering/init) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export library-method-binding-test) (def library-method-binding-test (test-suite "Actual method definition to Function/provider binding" diff --git a/t/library-method-boundary-test.ss b/t/library-method-boundary-test.ss index 3af37e4..bfc2a28 100644 --- a/t/library-method-boundary-test.ss +++ b/t/library-method-boundary-test.ss @@ -1,17 +1,18 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; Real Ops and QNT; altered interpretation bytes invalidate an issued result. (import :std/test :clan/poo/object (only-in :gerbil/expander core-resolve-library-module-path datum->syntax) (only-in :gerbil/runtime/loader __find-library-module) (only-in :std/misc/ports read-all-as-string) (only-in :std/io/tempfile call-with-temporary-directory) - "../profiles/resource-lifecycle.ss" + :deterministic-engineering/init) (def ResourceMethods - (.get deterministic-engineering.init.exports Library rust-resources scope methods)) + (.get deterministic-engineering.init.exports Library rust-resources methods)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export library-method-boundary-test) (def library-method-boundary-test (test-suite "Selected method Function and interpretation footprint boundaries" @@ -46,7 +47,7 @@ (def out (path-expand "observation" directory)) (def result ((.get ResourceMethods quint) root LifecycleProfile tool out)) ((.get ResourceMethods current!) result) - (def path (path-expand "library/drivers/rust-resources/objects.ss" root)) + (def path (path-expand "library/rust-resources/objects.ss" root)) (def before (call-with-input-file path read-all-as-string)) (try (call-with-output-file (list path: path truncate: #t) diff --git a/t/library-model-chain-test.ss b/t/library-model-chain-test.ss index 8fdb764..283a0d3 100644 --- a/t/library-model-chain-test.ss +++ b/t/library-model-chain-test.ss @@ -1,14 +1,16 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :std/test :clan/poo/object (only-in :clan/poo/mop validate) - "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "../library/drivers/rust-resources/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "../library/drivers/rust-resources/types.ss" - "../profiles/resource-lifecycle.ss") + "../library/backpressure-memory/objects.ss" + "../library/rust-resources/objects.ss" + "../library/backpressure-tokio-rayon/objects.ss" + "../library/rust-resources/types.ss" + ) +(import :deterministic-engineering/init) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export library-model-chain-test) (def selected-method-references (map (lambda (key) (method-ref (.ref RustMethodDefinitions key))) '(native quint lean))) diff --git a/t/library-owner-test.ss b/t/library-owner-test.ss index d2fd9b9..84e730f 100644 --- a/t/library-owner-test.ss +++ b/t/library-owner-test.ss @@ -1,24 +1,28 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :clan/poo/object :deterministic-engineering/init - :deterministic-engineering/profiles/gateway - :deterministic-engineering/profiles/resource-lifecycle + + (only-in :clan/poo/mop validate) (only-in :std/io/tempfile call-with-temporary-directory) - (only-in "../library/drivers/rust-resources/types.ss" + (only-in "../library/rust-resources/types.ss" ResourceProfileContract ResourceNativeProfileContract) - (only-in "../library/drivers/evidence/types.ss" ResourceEvidenceScopeContract)) + (only-in "../library/evidence/types.ss" ResourceEvidenceScopeContract)) +(def LocalProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles LocalProfile)) +(def Cap2Profile (.get deterministic-engineering.init.exports Library gateway-profiles profiles Cap2Profile)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) +(def LargerPayloadProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LargerPayloadProfile)) (export library-owner-test) (def (unsupported-scope? e) (and (string-contains (call-with-output-string (cut display-exception e <>)) "unsupported QNT Profile/mode") #t)) (def library-owner-test (test-suite "Parent Library ownership and bounded native admission" (test-case "POO specialization preserves parent rules and dependency obligations" - (def parent (.get (.get deterministic-engineering.init.exports Library) backpressure-memory scope entry)) - (def domain (.get (.get deterministic-engineering.init.exports Library) rust-resources scope)) + (def parent (.get (.get deterministic-engineering.init.exports Library) backpressure-memory entry)) + (def domain (.get (.get deterministic-engineering.init.exports Library) rust-resources)) (def child (.ref domain 'entry)) (def scope-contract (.get domain contracts scope)) (check-equal? (eq? (.ref child 'parent) parent) #t) @@ -30,7 +34,7 @@ (check-exception (validate scope-contract (.cc domain 'methods (.o))) (lambda (_) #t)) (check-exception (validate ResourceEvidenceScopeContract (.o make-evidence: void)) (lambda (_) #t))) (test-case "unsupported model scopes fail before a basis can alias another Profile" - (def methods (.get (.get deterministic-engineering.init.exports Library) rust-resources scope methods)) + (def methods (.get (.get deterministic-engineering.init.exports Library) rust-resources methods)) (for-each (lambda (p) (validate ResourceProfileContract p)) (list LocalProfile Cap2Profile LifecycleProfile)) (def unsupported (.cc LifecycleProfile 'queue 2)) (check-exception (validate ResourceProfileContract unsupported) (lambda (_) #t)) @@ -48,7 +52,7 @@ (check-exception (validate ResourceNativeProfileContract LocalProfile) (lambda (_) #t)) (check-exception (validate ResourceNativeProfileContract (.cc LifecycleProfile 'rayon-workers 2)) (lambda (_) #t))) (test-case "an extra Cargo ancestor configuration refuses execution before tools run" - (def methods (.get (.get deterministic-engineering.init.exports Library) rust-resources scope methods)) + (def methods (.get (.get deterministic-engineering.init.exports Library) rust-resources methods)) (def root (current-directory)) (call-with-temporary-directory "native-cargo-config" (lambda (directory) @@ -60,7 +64,7 @@ (lambda (e) (and (string-contains (call-with-output-string (cut display-exception e <>)) "native output has an unbound Cargo configuration") #t)))))) (test-case "native Scenario accepts one capture and refuses the removed split-input API" - (def scene (.get (.get deterministic-engineering.init.exports Scenarios) resource-lifecycle scope)) + (def scene (.get (.get deterministic-engineering.init.exports Library) resource-lifecycle)) (check-equal? (procedure? (.ref scene 'capture)) #t) (check-exception ((.ref scene 'open-review) LifecycleProfile 'usage "old-snapshot" "ignored-source" '()) (lambda (_) #t)) (check-exception ((.ref scene 'open-review) (.o)) (lambda (_) #t))))) diff --git a/t/library-record-types-test.ss b/t/library-record-types-test.ss index 2223b44..ba42fc7 100644 --- a/t/library-record-types-test.ss +++ b/t/library-record-types-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test diff --git a/t/library-relation-types-test.ss b/t/library-relation-types-test.ss index 481a5b8..45f8eea 100644 --- a/t/library-relation-types-test.ss +++ b/t/library-relation-types-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test diff --git a/t/library-scope-normalization-test.ss b/t/library-scope-normalization-test.ss index d1854a6..b45de49 100644 --- a/t/library-scope-normalization-test.ss +++ b/t/library-scope-normalization-test.ss @@ -1,14 +1,14 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :clan/poo/object (only-in :clan/poo/mop validate) (only-in :clan/poo/recursive-validation closed-names) - (only-in "../library/concurrency/resource-control/backpressure-memory/abstract/types.ss" + (only-in "../library/backpressure-memory/types.ss" BackpressureScopeContract BackpressureModelContract BackpressureDeclarationContract BackpressureConfigContract) - (only-in "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" + (only-in "../library/backpressure-memory/objects.ss" BackpressureModel BackpressureDeclaration) (only-in "../library/project-organization/types.ss" OrganizationScopeContract OrganizationModelContract OrganizationDeclarationContract OrganizationConfigContract) diff --git a/t/library-selection-test.ss b/t/library-selection-test.ss index 7470df9..ef4f624 100644 --- a/t/library-selection-test.ss +++ b/t/library-selection-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :clan/poo/object (only-in :std/source this-source-file) @@ -9,14 +9,14 @@ (only-in :yuanxu/module-system/interface yuanxu-load-modules)) (export library-selection-test) (import (only-in :clan/poo/mop validate) - (only-in "../library/drivers/rust-resources/types.ss" RustResourcesScopeContract RustResourceModelContract)) + (only-in "../library/rust-resources/types.ss" RustResourcesScopeContract RustResourceModelContract)) (def repo-root (path-expand ".." (path-directory (this-source-file)))) (def (write-source path text) (call-with-output-file (list path: path truncate: #t) (cut display text <>))) (def library-selection-test (test-suite "Core selection confines domain Library admission" (test-case "a parent-only selection leaves an invalid unrelated owner cold" - (def parent (path-expand "library/concurrency/resource-control/backpressure-memory/abstract" repo-root)) + (def parent (path-expand "library/backpressure-memory" repo-root)) (call-with-temporary-directory "library-selection" (lambda (root) (write-source (path-expand "gerbil.pkg" root) "(package: library-selection-canary)") @@ -49,7 +49,7 @@ (write-source path (string-append "(yuanxu! source: " (object->string (path-expand "library" repo-root)) " mode: explicit (backpressure-memory @ " (object->string (path-expand "abstract" base)) ") (backpressure-tokio-rayon @ " (object->string (path-expand "tokio-rayon" base)) ") (rust-resources @ " - (object->string (path-expand "library/drivers/rust-resources" repo-root)) "))")) + (object->string (path-expand "library/rust-resources" repo-root)) "))")) (def view (yuanxu-load-modules path)) (def parent (.get view modules backpressure-memory)) (def scope (.get view modules rust-resources)) diff --git a/t/module-design-test.ss b/t/module-design-test.ss index 625244b..7d08539 100644 --- a/t/module-design-test.ss +++ b/t/module-design-test.ss @@ -1,19 +1,23 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :deterministic-engineering/init :clan/poo/object - :deterministic-engineering/profiles/gateway + (only-in :clan/poo/mop validate) (only-in :gerbil-ascent/rules/declaration rule-module-program)) +(def LocalProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles LocalProfile)) +(def Cap2Profile (.get deterministic-engineering.init.exports Library gateway-profiles profiles Cap2Profile)) +(def CacheProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles CacheProfile)) +(def RetryProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles RetryProfile)) (export module-design-test) (def module-design-test (test-suite "Gateway publications have distinct engineering responsibilities" (test-case "independent Profiles bind the Library and one Scenario" - (def domain (.get (.get deterministic-engineering.init.exports Library) rust-resources scope)) - (def evidence (.get (.get deterministic-engineering.init.exports Library) evidence scope)) - (def scene (.get (.get deterministic-engineering.init.exports Scenarios) gateway-review scope)) + (def domain (.get (.get deterministic-engineering.init.exports Library) rust-resources)) + (def evidence (.get (.get deterministic-engineering.init.exports Library) evidence)) + (def scene (.get (.get deterministic-engineering.init.exports Library) gateway-review)) (for-each (lambda (p) (validate (.ref domain 'profile-contract) p)) (list LocalProfile Cap2Profile CacheProfile RetryProfile)) (check-equal? (.ref LocalProfile 'capacity) 2) diff --git a/t/native-concurrency-test.ss b/t/native-concurrency-test.ss index 2693816..49d8d37 100644 --- a/t/native-concurrency-test.ss +++ b/t/native-concurrency-test.ss @@ -1,5 +1,5 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 tao3k team and Contributors +;;; SPDX-License-Identifier: Apache-2.0 AND LGPL-2.1-or-later (import :std/test (only-in :std/source this-source-file) (only-in :std/misc/process run-process)) diff --git a/t/native-context-test.ss b/t/native-context-test.ss index 59a4573..ba7fa95 100644 --- a/t/native-context-test.ss +++ b/t/native-context-test.ss @@ -1,18 +1,20 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :clan/poo/object :deterministic-engineering/init - :deterministic-engineering/profiles/resource-lifecycle + (only-in :std/io/tempfile call-with-temporary-directory) (only-in :std/misc/ports read-all-as-string) (only-in :clan/poo/mop validate TypeError?) (only-in :gerbil-ascent/program/session gerbil-ascent-session-run) - (only-in "../scenarios/resource-lifecycle/func.ss" resource-lifecycle-scope)) + (only-in "../library/resource-lifecycle/func.ss" resource-lifecycle-scope)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) +(def LargerPayloadProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LargerPayloadProfile)) (export native-context-test) (def (scope-basis context kind) @@ -28,7 +30,7 @@ (test-suite "One source-bound native capture at Scenario admission" (test-case "source/Profile mutation and split scope forgery cannot reuse the captured snapshot" (def root (current-directory)) - (def scene (.get (.get deterministic-engineering.init.exports Scenarios) resource-lifecycle scope)) + (def scene (.get (.get deterministic-engineering.init.exports Library) resource-lifecycle)) (def methods (.ref scene 'methods)) (def original (path-expand "languages-engineering/rust/concurrency/resource-control/backpressure-memory" root)) diff --git a/t/organization-library-test.ss b/t/organization-library-test.ss index edd3f1e..69bd4d0 100644 --- a/t/organization-library-test.ss +++ b/t/organization-library-test.ss @@ -1,14 +1,14 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :std/test :clan/poo/object (only-in :clan/poo/mop validate) "../types.ss" "../library/project-organization/types.ss" "../library/project-organization/objects.ss" - "../library/drivers/project-formation/types.ss" - "../library/drivers/project-formation/objects.ss") + "../library/project-formation/types.ss" + "../library/project-formation/objects.ss") (export organization-library-test) (def organization-library-test (test-suite "Organization declarations, independent demand and Module policy" diff --git a/t/package-metadata-test.ss b/t/package-metadata-test.ss index 68f6cb2..8e15ab8 100644 --- a/t/package-metadata-test.ss +++ b/t/package-metadata-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- ;;; Validate native package metadata against the registered local Git sources. (import :std/test (only-in :gerbil/tools/gxpkg pkg-root-dir pkg-plist pkg-list) @@ -55,28 +55,42 @@ (unless (equal? matches expected) (error "root manifest has missing, duplicate, conflicting or unrelated dependency" entry matches)))) versions)) (def (check-direct-pins direct) - (unless (and (= (length direct) 3) - (andmap (lambda (prefix) (= (length (filter (cut string-prefix? prefix <>) direct)) 1)) - '("github.com/tao3k/agentic-ai-lab@" "github.com/tao3k/gebril-yuanxu@" "github.com/tao3k/lambda-aitia@"))) - (error "Root must directly pin its product, Yuanxu and Aitia dependencies" direct))) + (unless (and (= (length direct) 1) + (string-prefix? "github.com/tao3k/agentic-ai-lab@" (car direct))) + (error "Root must select one Parent dependency; leaf dependencies belong to Parent" direct))) (def (main . _args) (def direct (pgetq depend: root-metadata '())) (check-direct-pins direct) (check-exception (check-direct-pins (cdr direct)) (lambda (_) #t)) (check-exception (check-direct-pins (cons (car direct) direct)) (lambda (_) #t)) + (for-each + (lambda (name) + (check-exception + (check-direct-pins (cons (string-append "github.com/tao3k/" name "@foreign") direct)) + (lambda (_) #t))) + '("gebril-yuanxu" "gerbil-ascent" "lambda-aitia")) (for-each (lambda (path) (when (file-exists? path) (error "Nested metadata must not override the root package" path))) '("modules/gerbil.pkg" "library/gerbil.pkg" "profiles/gerbil.pkg" - "scenarios/gerbil.pkg" "scenarios/resource-lifecycle/review/gerbil.pkg")) + "scenarios/gerbil.pkg" "library/backpressure-review/gerbil.pkg")) (check-dependency-pins root-metadata) - ;; This published product cohort selects the same actual Core source. + ;; Native package identity and optional Parent source-gitlink identity are + ;; independent. The selected published closure, checked below, owns native + ;; pins; an unselected source checkout must not replace those dependencies. (def core-head (git-value "github.com/tao3k/gebril-yuanxu" "rev-parse" "HEAD")) - (unless (and (equal? core-head - (git-value "github.com/tao3k/agentic-ai-lab" "rev-parse" "HEAD:core")) - (equal? core-head - (git-value "github.com/tao3k/agentic-ai-lab" "-C" "core" "rev-parse" "HEAD"))) - (error "published product Core gitlink and native Yuanxu source disagree")) + (def core-source-entry + (git-value "github.com/tao3k/agentic-ai-lab" "ls-tree" "HEAD" "core")) + (unless (and (string? core-source-entry) + (string-prefix? "160000 commit " core-source-entry)) + (error "Parent source Core must retain its own declared gitlink identity")) + (displayln "PARENT-CORE-IDENTITIES native=" core-head " source=" core-source-entry) + (def selected (declared-packages root-metadata)) + (for-each + (lambda (package) + (unless (member package packages) + (error "declared dependency is absent from the native registry" package))) + selected) (def versions (map (lambda (package) (def manifest (call-with-input-file @@ -85,13 +99,12 @@ (unless (and version (equal? (cdr version) (git-value package "describe" "--tags" "--always"))) (error "native manifest differs from registered source" package version)) - (cons package (cdr version))) packages)) - (for-each (lambda (package) (check-dependency-pins (pkg-plist package))) packages) + (cons package (cdr version))) selected)) + (for-each (lambda (package) (check-dependency-pins (pkg-plist package))) selected) (def form (call-with-input-file "manifest.ss" read)) (unless (and (pair? form) (eq? (car form) 'def) (eq? (cadr form) 'version-manifest)) (error "root manifest is not a native version declaration")) (def closure (cadr (caddr form))) - (def selected (declared-packages root-metadata)) (check-root-closure closure versions selected) ;; Negative controls mutate the actual native-generated data; no fixture ;; manifest can substitute for the real source/tag/artifact/import gate. @@ -103,9 +116,13 @@ (check-exception (check-root-closure (cons required closure) versions selected) (lambda (_) #t)) (check-exception (check-root-closure (cons (cons (car required) "wrong-revision") closure) versions selected) (lambda (_) #t)) - (for-each (lambda (entry) - (unless (member (car entry) selected) - (check-exception (check-root-closure (cons entry closure) versions selected) (lambda (_) #t)))) versions) + (for-each + (lambda (package) + (unless (member package selected) + (check-exception + (check-root-closure (cons (cons package (cdr required)) closure) versions selected) + (lambda (_) #t)))) + packages) (displayln "NATIVE-COHORT-CLOSURE-OK registered=" (length versions) " declared=" (length selected)) (for-each (lambda (namespace) @@ -121,40 +138,36 @@ (error "compiled import artifact is not a regular file" artifact))) '(".ssi" ".o1"))) '("clan/poo/object" "yuanxu/module-system/selection/init-syntax" - "yuanxu/modules/funflow/control-plane/api" - "yuanxu/modules/funflow/control-plane/runtime-command-descriptor" - "agentic-ai-lab/services" - "agentic-ai-lab/modules/workflow/contracts/runtime-v0-abi-schema" - "agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger" - "gerbil-ascent/rules/interface" - "agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority" - "deterministic-engineering/scenarios/resource-lifecycle/review/interface" - "deterministic-engineering/scenarios/resource-lifecycle/review/archive" + "gerbil-ascent/program/session" "gerbil-ascent/rules/interface" "deterministic-engineering/init" - "deterministic-engineering/library/concurrency/resource-control/backpressure-memory/tokio-rayon/interface" - "deterministic-engineering/library/drivers/rust-resources/interface" - "deterministic-engineering/library/drivers/evidence/interface" - "deterministic-engineering/scenarios/gateway-review/interface" - "deterministic-engineering/profiles/gateway")) - ;; Reuse the producer's phase-family check, including generated macro objects. + "deterministic-engineering/config")) + ;; The current root projection owns Module products. Platform Services, + ;; operational review/recovery and deleted forwarding paths are not roots. (require-build-products! - '(deterministic-engineering/library/drivers/evidence/interface - deterministic-engineering/scenarios/resource-lifecycle/review/archive - agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority) + '(deterministic-engineering/init) (path-expand "lib" (gerbil-path))) ;; Check products before importing: a missing object must not be hidden by ;; the loader's Scheme fallback. This runs in each fresh bounded test process. (eval '(begin - (import (only-in :clan/poo/object object?) + (import (only-in :clan/poo/object object? .get) (only-in :clan/poo/mop Type element?) - (only-in :agentic-ai-lab/services Services) - (only-in :agentic-ai-lab/lambda-aitia/modules/sdlc/review-authority - sdlc-review-authority-snapshot) + (only-in :gerbil-ascent/program/session gerbil-ascent-open-session) + (only-in :deterministic-engineering/config Config) (only-in :deterministic-engineering/init deterministic-engineering.init.exports)) (unless (and (object? deterministic-engineering.init.exports) - (element? Type Services) (procedure? sdlc-review-authority-snapshot)) - (error "installed package and Type ABI failed to load")) + (procedure? gerbil-ascent-open-session) + (element? + (.get deterministic-engineering.init.exports Library + source-contract-profiles config-type) + Config) + (not (.get Config programs deterministic-engineering languages c enable)) + (not (.get Config programs deterministic-engineering languages cpp enable)) + (element? Type + (.get deterministic-engineering.init.exports Library + source-contracts contracts profile))) + (error "compiled root, ASCENT and source-contract Type ABI failed to load")) + (displayln "COMPILED-CONFIG-ASSIGNMENT-OK") (displayln "COMPILED-PACKAGE-LOAD-OK"))) (displayln "NATIVE-PACKAGE-METADATA-OK")) diff --git a/t/project-formation-entry-test.ss b/t/project-formation-entry-test.ss index 74e94d8..f855590 100644 --- a/t/project-formation-entry-test.ss +++ b/t/project-formation-entry-test.ss @@ -1,13 +1,15 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :std/test :clan/poo/object (only-in :clan/poo/mop validate) (only-in :std/source this-source-file) - (only-in "../library/drivers/project-formation/inputs.ss" formation-input-observation) + (only-in "../library/project-formation/inputs.ss" formation-input-observation) (only-in :yuanxu/module-system/source/admission current-module-source-observer) "../projects/library-formation/init.ss" - "../profiles/library-formation.ss") + ) +(import :deterministic-engineering/init) +(def LibraryFormationProfile (.get deterministic-engineering.init.exports Library library-formation-profiles profiles LibraryFormationProfile)) (export project-formation-entry-test) (def project-formation-entry-test (test-suite "Declared Project entry" @@ -16,12 +18,12 @@ (lambda (kind amount) (when (and (pair? kind) (memq (car kind) '(link-stage-start link-stage-end))) (displayln "FORMATION-SOURCE-STAGE " kind " " amount) (force-output))))) - (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules library-project-formation scope)) + (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules project-intake)) (def r ((.ref scene 'run) LibraryFormationProfile)) (check-equal? ((.ref r 'rows-of) 'structurally_covered) '(("LIB-C01"))) (check-equal? (string? ((.ref scene 'render) r)) #t))) (test-case "declared Project acquires its actual selected repository files" - (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules library-project-formation scope)) + (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules project-intake)) (def root (path-expand ".." (path-directory (this-source-file)))) (def acquired ((.get scene acquire) root LibraryFormationProfile)) (check-exception (formation-input-observation acquired) error?) @@ -31,7 +33,7 @@ (check-equal? (length (.get observed inputs)) (length (.get LibraryFormationProfile project-inputs))) (check-equal? (.get observed missing-origins) '(user-confirmation proposal-occurrence role-mandate))) (test-case "Profile selects actual normalized definitions and missing origins block C" - (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules library-project-formation scope)) + (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules project-intake)) (def selected ((.get scene select) LibraryFormationProfile)) (check-equal? (.get selected resources integration-entry parent identity) (.get selected resources entry identity)) (check-equal? (length (.get selected methods)) 4) diff --git a/t/project-formation-test.ss b/t/project-formation-test.ss index 1a9d114..719cd56 100644 --- a/t/project-formation-test.ss +++ b/t/project-formation-test.ss @@ -1,14 +1,16 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :std/test :clan/poo/object - "../library/drivers/project-formation/func.ss" - "../scenarios/project-formation/func.ss" + "../library/project-formation/func.ss" + "../library/project-intake/func.ss" "../library/project-organization/objects.ss" - "../profiles/library-formation.ss") + ) +(import :deterministic-engineering/init) +(def LibraryFormationProfile (.get deterministic-engineering.init.exports Library library-formation-profiles profiles LibraryFormationProfile)) (export project-formation-test) (def project-formation-test diff --git a/t/project-inputs-test.ss b/t/project-inputs-test.ss index 502900c..3bf69fc 100644 --- a/t/project-inputs-test.ss +++ b/t/project-inputs-test.ss @@ -1,10 +1,10 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors (import :std/test :clan/poo/object (only-in :std/io/tempfile call-with-temporary-directory) - "../library/drivers/project-formation/inputs.ss") + "../library/project-formation/inputs.ss") (export project-inputs-test) (def (put path text) (call-with-output-file (list path: path truncate: #t) (cut display text <>))) diff --git a/t/repository-input-schema-test.ss b/t/repository-input-schema-test.ss index d978e36..05cd851 100644 --- a/t/repository-input-schema-test.ss +++ b/t/repository-input-schema-test.ss @@ -1,13 +1,13 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test (only-in :clan/poo/object .get) (only-in :clan/poo/mop TypeError?) - (only-in "../library/drivers/project-formation/inputs.ss" + (only-in "../library/project-formation/inputs.ss" formation-acquire-inputs formation-input-observation formation-inputs-current!)) (export repository-input-schema-test) diff --git a/t/resource-evidence-contract-test.ss b/t/resource-evidence-contract-test.ss index b38e3ea..8730c1c 100644 --- a/t/resource-evidence-contract-test.ss +++ b/t/resource-evidence-contract-test.ss @@ -1,20 +1,21 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test (only-in :clan/poo/object .o .cc .get) (only-in :clan/poo/mop validate TypeError?) :deterministic-engineering/init - (only-in :deterministic-engineering/profiles/gateway LocalProfile) + (only-in :gerbil-ascent/program/session gerbil-ascent-session-run gerbil-ascent-session-replace-sources!) (only-in :gerbil-ascent/rules/declaration ascent-rule-module rule-module?) - (only-in "../library/drivers/evidence/types.ss" + (only-in "../library/evidence/types.ss" ResourceEvidenceScopeContract ResourceOpenReviewSignature ResourceMakeEvidenceSignature)) +(def LocalProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles LocalProfile)) (export resource-evidence-contract-test) @@ -32,8 +33,8 @@ (def resource-evidence-contract-test (test-suite "Native Evidence Module method boundaries" (test-case "actual publication constructs a checked Program and runs native inference" - (def scope (.get deterministic-engineering.init.exports Library evidence scope)) - (def entry (.get deterministic-engineering.init.exports Library rust-resources scope entry)) + (def scope (.get deterministic-engineering.init.exports Library evidence)) + (def entry (.get deterministic-engineering.init.exports Library rust-resources entry)) ;; Exercise the published boundary too, rather than only a test-local wrapper. (check-exception ((.get scope open-review) entry LocalProfile "invalid-usage" "source/A" '()) @@ -51,12 +52,12 @@ (check-equal? ((.get result rows-of) 'support) '()) (check-equal? (.get checked policy result-kind) 'recorded-only) (check-equal? - (eq? scope (.get deterministic-engineering.init.exports Library evidence scope)) + (eq? scope (.get deterministic-engineering.init.exports Library evidence)) #t)) (test-case "invalid arguments and arity are rejected before the real operation runs" - (def scope (.get deterministic-engineering.init.exports Library evidence scope)) - (def entry (.get deterministic-engineering.init.exports Library rust-resources scope entry)) + (def scope (.get deterministic-engineering.init.exports Library evidence)) + (def entry (.get deterministic-engineering.init.exports Library rust-resources entry)) (def calls 0) (def operation (validate ResourceOpenReviewSignature @@ -86,13 +87,13 @@ (test-case "a callable with the wrong result cannot satisfy a method signature" (def make-invalid (validate ResourceMakeEvidenceSignature (lambda () (ascent-rule-module (.o))))) (check-exception (make-invalid) TypeError?) - (def scope (.get deterministic-engineering.init.exports Library evidence scope)) - (def entry (.get deterministic-engineering.init.exports Library rust-resources scope entry)) + (def scope (.get deterministic-engineering.init.exports Library evidence)) + (def entry (.get deterministic-engineering.init.exports Library rust-resources entry)) (def open-invalid (validate ResourceOpenReviewSignature (lambda args 'not-a-session))) (check-exception (open-invalid entry LocalProfile 'u "source/A" '()) TypeError?)) (test-case "policy changes and undeclared permission fields cannot grant authority" - (def scope (.get deterministic-engineering.init.exports Library evidence scope)) + (def scope (.get deterministic-engineering.init.exports Library evidence)) (check-exception (validate ResourceEvidenceScopeContract (.cc scope 'policy (.cc (.get scope policy) 'result-kind 'authorized))) @@ -106,8 +107,8 @@ TypeError?)) (test-case "typed normalization preserves immutable old results across a real source update" - (def scope (.get deterministic-engineering.init.exports Library evidence scope)) - (def entry (.get deterministic-engineering.init.exports Library rust-resources scope entry)) + (def scope (.get deterministic-engineering.init.exports Library evidence)) + (def entry (.get deterministic-engineering.init.exports Library rust-resources entry)) (def session ((.get scope open-review) entry LocalProfile 'typed-before "source/A" '())) (def before (gerbil-ascent-session-run session)) (gerbil-ascent-session-replace-sources! diff --git a/t/resource-integration-test.ss b/t/resource-integration-test.ss index dc251a7..c923b82 100644 --- a/t/resource-integration-test.ss +++ b/t/resource-integration-test.ss @@ -1,15 +1,15 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :clan/poo/object :std/test :std/encoding/json (only-in :std/crypto/digest sha256) (only-in :std/encoding/hex hex-encode) (only-in :std/misc/ports read-all-as-u8vector) - "../library/drivers/rust-resources/correspondence.ss" - "../library/drivers/rust-resources/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "../library/concurrency/resource-control/backpressure-memory/abstract/objects.ss") + "../library/rust-resources/correspondence.ss" + "../library/rust-resources/objects.ss" + "../library/backpressure-tokio-rayon/objects.ss" + "../library/backpressure-memory/objects.ss") (def selected-method-references (map (lambda (key) (method-ref (.ref RustMethodDefinitions key))) '(native quint lean))) (def selected-integration-reference diff --git a/t/resource-lifecycle-test.ss b/t/resource-lifecycle-test.ss index 11cbab0..d23d6c5 100644 --- a/t/resource-lifecycle-test.ss +++ b/t/resource-lifecycle-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test :std/encoding/json :clan/poo/object :deterministic-engineering/init) (export resource-lifecycle-test) @@ -10,13 +10,13 @@ (test-case "direct migration publishes one Library to independent applications" (check-equal? (.slot? (.get deterministic-engineering.init.exports Library) 'gateway-domain) #f) (check-equal? (.slot? (.get deterministic-engineering.init.exports Library) 'gateway-evidence) #f) - (check-equal? (.get (.get deterministic-engineering.init.exports Library) rust-resources scope entry identity) 'rust.resources.backpressure-memory) - (check-equal? (.get (.get deterministic-engineering.init.exports Scenarios) resource-lifecycle scope entry identity) - (.get (.get deterministic-engineering.init.exports Scenarios) gateway-review scope entry identity))) + (check-equal? (.get (.get deterministic-engineering.init.exports Library) rust-resources entry identity) 'rust.resources.backpressure-memory) + (check-equal? (.get (.get deterministic-engineering.init.exports Library) resource-lifecycle entry identity) + (.get (.get deterministic-engineering.init.exports Library) gateway-review entry identity))) (test-case "actual native/QNT/Lean receipts and change queries match independent gold" (def path (getenv "RESOURCE_REAL_REPORT" #f)) - (unless path (error "run examples/resource-lifecycle-evidence.ss and set RESOURCE_REAL_REPORT")) - (def methods (.get (.get deterministic-engineering.init.exports Library) rust-resources scope methods)) + (unless path (error "run t/support/resource-lifecycle-evidence.ss and set RESOURCE_REAL_REPORT")) + (def methods (.get (.get deterministic-engineering.init.exports Library) rust-resources methods)) (def digest (.ref methods 'file-digest)) (def (load p) (call-with-input-file p (cut read-json <> object-as-hash: #t))) (def report (load path)) diff --git a/t/resource-scenario-contract-test.ss b/t/resource-scenario-contract-test.ss index a6287dc..b86a531 100644 --- a/t/resource-scenario-contract-test.ss +++ b/t/resource-scenario-contract-test.ss @@ -1,7 +1,7 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- (import :std/test @@ -10,16 +10,17 @@ (only-in :clan/poo/type Record) (only-in :clan/poo/recursive-validation close-validation closed-ref) :deterministic-engineering/init - (only-in :deterministic-engineering/profiles/resource-lifecycle LifecycleProfile) - (only-in "../scenarios/resource-lifecycle/func.ss" resource-lifecycle-scope)) + (only-in "../library/resource-lifecycle/func.ss" resource-lifecycle-scope)) + +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export resource-scenario-contract-test) (def resource-scenario-contract-test (test-suite "Owner-bound native Scenario method contracts" (test-case "revalidation retains the published Scope, owner handles and installed functions" - (def scope (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def scope (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get scope contracts scope)) (def capture (.get scope capture)) (def review (.get scope open-review)) @@ -30,7 +31,7 @@ (check-equal? (eq? (.get scope entry) (.get scope domain entry)) #t) (check-equal? (eq? (.get scope methods) (.get scope domain methods)) #t)) (test-case "a fresh producer uses the actual selected owner Contract" - (def selected (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def selected (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get selected contracts scope)) (def raw (resource-lifecycle-scope (.get selected domain) (.get selected evidence) contract)) @@ -50,7 +51,7 @@ (.get selected domain contracts scope))) TypeError?)) (test-case "a child owner override is read after the parent fields were cached" - (def selected (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def selected (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get selected contracts scope)) (def original-domain (.get selected domain)) (def child-domain (.cc original-domain)) @@ -70,7 +71,7 @@ (check-equal? (eq? (.get parent entry) cached-entry) #t) (check-equal? (eq? (.get parent capture) cached-capture) #t)) (test-case "closed validation cannot mask substituted associations or methods" - (def selected (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def selected (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get selected contracts scope)) (for-each (lambda (changed) (check-exception (validate contract changed) TypeError?)) @@ -81,7 +82,7 @@ (.cc selected 'authorization #t) (.cc selected 'validation (.get selected domain validation))))) (test-case "a generic native closure cannot masquerade as Scenario normalization" - (def selected (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def selected (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get selected contracts scope)) (def raw (.cc @@ -95,7 +96,7 @@ 'validation foreign-graph)) (check-exception (validate contract forged) TypeError?)) (test-case "capture inputs refuse before the body and result checks occur after the body" - (def selected (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def selected (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get selected contracts scope)) (def calls 0) (def raw @@ -117,7 +118,7 @@ TypeError?) (check-equal? calls 1)) (test-case "review recognizes the selected owner's Context before calling its body" - (def selected (.get deterministic-engineering.init.exports Scenarios resource-lifecycle scope)) + (def selected (.get deterministic-engineering.init.exports Library resource-lifecycle)) (def contract (.get selected contracts scope)) (def calls 0) (def checked diff --git a/t/rust-project-native-test.ss b/t/rust-project-native-test.ss index ad7b3c9..ec64d38 100644 --- a/t/rust-project-native-test.ss +++ b/t/rust-project-native-test.ss @@ -1,17 +1,18 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; Rust inputs are executed by the admitted Scheme driver, not loaded as Modules. (import :std/test :clan/poo/object :deterministic-engineering/init - :deterministic-engineering/profiles/resource-lifecycle + :gerbil-ascent/program/session (only-in :agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger ascent-trajectory) (only-in :std/io/tempfile call-with-temporary-directory) (only-in :std/misc/ports read-all-as-string)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export rust-project-native-test) (def rust-project-native-test @@ -23,7 +24,7 @@ "languages-engineering/rust/concurrency/resource-control/backpressure-memory" root)) (def methods - (.get deterministic-engineering.init.exports Library rust-resources scope methods)) + (.get deterministic-engineering.init.exports Library rust-resources methods)) (call-with-temporary-directory "rust-only-native" (lambda (directory) @@ -45,9 +46,9 @@ root crate (getenv "RESOURCE_CARGO") (getenv "RESOURCE_RUSTC") 64 usage)) (def snapshot ((.get methods value-digest) scopes)) (def entry - (.get deterministic-engineering.init.exports Library rust-resources scope entry)) + (.get deterministic-engineering.init.exports Library rust-resources entry)) (def evidence - (.get deterministic-engineering.init.exports Library evidence scope)) + (.get deterministic-engineering.init.exports Library evidence)) (def session ((.get evidence open-review) entry LifecycleProfile usage snapshot scopes)) (def trajectory @@ -69,7 +70,7 @@ ("pathIdentity" ((.get methods claim) result))))))) results) ((.get methods register) session results trajectory - (path-expand "library/drivers/evidence/func.ss" root)) + (path-expand "library/evidence/func.ss" root)) (def frozen (gerbil-ascent-session-run session)) (def (rows result relation) ((.get result rows-of) relation)) (check-equal? (length (rows frozen 'support)) 5) @@ -90,7 +91,7 @@ ;; Authored meaning belongs to the actual result interpretation closure. (def model-source (path-expand - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" + "library/backpressure-tokio-rayon/objects.ss" root)) (def model-before (call-with-input-file model-source read-all-as-string)) (try @@ -101,7 +102,7 @@ (check-exception ((.get methods current!) (car results)) error?) (check-exception ((.get methods register) session results trajectory - (path-expand "library/drivers/evidence/func.ss" root)) error?) + (path-expand "library/evidence/func.ss" root)) error?) (check-equal? (length (rows (gerbil-ascent-session-run session) 'witness)) 6) (finally (call-with-output-file (list path: model-source truncate: #t) diff --git a/t/source-contract-owner-config-test.ss b/t/source-contract-owner-config-test.ss new file mode 100644 index 0000000..af6d79e --- /dev/null +++ b/t/source-contract-owner-config-test.ss @@ -0,0 +1,199 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :std/test + :clan/poo/object + :gerbil-ascent/program/session + "support/source-contracts.ss" + (only-in :std/error Error? Error-message) + (only-in :std/source this-source-file) + (only-in :std/io/tempfile call-with-temporary-directory) + (only-in :std/misc/ports read-all-as-string) + (only-in :yuanxu/module-system/interface yuanxu-load-modules)) +(export source-contract-owner-config-test) + +(def root (path-expand ".." (path-directory (this-source-file)))) +(def (read-text path) (call-with-input-file path read-all-as-string)) +(def (write-text path text) + (call-with-output-file (list path: path truncate: #t) (cut display text <>))) + +;; Copy the actual maintained roles, not replacement publications or relation rows. +(def (copy-directory-source source destination) + (create-directory destination) + (for-each + (lambda (name) + (when (equal? (path-extension name) ".ss") + (copy-file (path-expand name source) (path-expand name destination)))) + (directory-files source))) + +(def source-contract-owner-config-test + (test-suite "Unified program Config through actual native owners" + (test-case "C and C++ settings drive real evidence; disabling C retains history and C++ settings" + (call-with-temporary-directory "source-contract-owner-config" + (lambda (directory) + (for-each + (lambda (name) + (copy-file (path-expand name root) (path-expand name directory))) + '("types.ss" "config.ss" "gerbil.pkg")) + (def library (path-expand "library" directory)) + (create-directory library) + (for-each + (lambda (name) + (copy-directory-source + (path-expand (string-append "library/" name) root) + (path-expand name library))) + '("source-contracts" "source-contract-profiles" "bounded-capacity" + "resource-lifetime" "evidence")) + (def examples (path-expand "examples" directory)) + (create-directory examples) + (copy-file (path-expand "examples/programs.ss" root) + (path-expand "programs.ss" examples)) + (def configuration (path-expand "source-contract-profiles/config.ss" library)) + (def (write-configuration disabled?) + (write-text configuration + (string-append + "(import :clan/poo/object (only-in :yuanxu/configuration/json config-defaults) (prefix-in \"../../config.ss\" defaults-) (prefix-in \"../../examples/programs.ss\" user-))\n(export Config)\n" + "(.def (Config @ (config-defaults defaults-Config " + (if disabled? + "(config-defaults user-Config (.o programs: (.o deterministic-engineering: (.o languages: (.o c: (.o enable: #f))))))" + "user-Config") + ")))\n"))) + (write-configuration #f) + (def entry (path-expand "init.ss" directory)) + (write-text entry + "(import :yuanxu/module-system/selection/init-syntax)\n(yuanxu! :load-modules \"./library\" mode: auto rename: Library (source-contract-profiles))\n") + (def owner (yuanxu-load-modules entry)) + (def selected (.get owner modules Library)) + (def profile-module (.get selected source-contract-profiles)) + (def generic-method (.get profile-module plan-library)) + (def c (.get profile-module languages c)) + (def cpp (.get profile-module languages cpp)) + (def method (.get c plan-library)) + (check-equal? (.get method config enable) + (.get profile-module config programs deterministic-engineering languages c enable)) + (check-equal? (.get method config settings timeout) 30) + (check-equal? (.get cpp plan-library config settings timeout) 20) + (check-equal? (.get method config settings safety-flags) + (.get generic-method config settings safety-flags)) + (def profile (.get profile-module profiles capacity-body)) + (def frozen-plan + (.call generic-method plan (.get generic-method strategies cbmc) profile)) + (.call owner admit-current) + ;; A downstream POO contribution is selected without a second registry. + (def contributed + (.o (:: @ profile-module) + config: + (.call profile-module configure + (.o programs: (.o deterministic-engineering: + (.o languages: (.o c: (.o settings: (.o profile: 'project-capacity))))))) + profiles: =>.+ + (.o project-capacity: + (.o (:: @ (.get profile-module profiles capacity-native)) + identity: 'project-capacity)))) + (check-equal? (.get contributed languages c profile identity) 'project-capacity) + (def wrong-language + (.cc profile-module 'config + (.call profile-module configure + (.o programs: (.o deterministic-engineering: + (.o languages: (.o c: (.o settings: (.o profile: 'lifetime-native))))))))) + (check-exception + (.get wrong-language languages c) + (lambda (failure) + (and (Error? failure) + (equal? (Error-message failure) + "engineering Profile belongs to another language")))) + (def compiler-tools + (.o cbmc: (getenv "SOURCE_CONTRACT_CBMC") + goto-cc: (getenv "SOURCE_CONTRACT_GOTO_CC") + goto-instrument: (getenv "SOURCE_CONTRACT_GOTO_INSTRUMENT") + cc: (getenv "SOURCE_CONTRACT_CC") + cxx: (getenv "SOURCE_CONTRACT_CXX"))) + (def implementation-root root) + (def (run-language language catalog usage output) + (def scoped-method (.get language plan-library)) + (def selected-profile (.get language profile)) + (def observer + (source-contract-test-support scoped-method (.get selected evidence))) + (def input + (.o (:: @ (.get observer input)) + scenario: + (.o (:: @ (.get scoped-method scenario)) + root: implementation-root entry: catalog profile: selected-profile) + tools: compiler-tools module-owner: owner driver: observer)) + (def review + ((.get observer evidence open-review) + catalog (.o factors: (list (.get selected-profile factor))) usage + ((.get observer snapshot) input) ((.get observer scopes) input usage))) + (def result (.call input .verify output)) + (check-equal? (hash-ref ((.get observer record) result) "outcome") "pass") + ((.get observer register!) review (list result)) + (.o runner: observer subject: input evidence: review observation: result + query: (gerbil-ascent-session-run review))) + (def captured + (run-language c (.get selected bounded-capacity entry) 'configured-c + (path-expand "actual-c" directory))) + (def captured-cpp + (run-language cpp (.get selected resource-lifetime entry) 'configured-cpp + (path-expand "actual-cpp" directory))) + (check-equal? (length ((.get captured query rows-of) 'support)) 1) + (check-equal? (length ((.get captured-cpp query rows-of) 'support)) 1) + ;; An actual result from a 30-second context is not a 25-second receipt. + (def budget-scope + (.cc profile-module 'config + (.call profile-module configure + (.o programs: (.o deterministic-engineering: + (.o languages: (.o c: (.o settings: (.o timeout: 25))))))))) + (def budget-method (.get budget-scope languages c plan-library)) + (def budget-observer + (source-contract-test-support budget-method (.get selected evidence))) + (def budget-subject (.cc (.get captured subject) 'driver budget-observer)) + (def old-basis ((.get captured runner basis) (.get captured subject))) + (def new-basis ((.get budget-observer basis) budget-subject)) + (check-equal? (cdr (assoc 'source old-basis)) (cdr (assoc 'source new-basis))) + (check-equal? (equal? (cdr (assoc 'method old-basis)) (cdr (assoc 'method new-basis))) #f) + (def budget-profile (.get budget-scope languages c profile)) + (def budget-review + ((.get budget-observer evidence open-review) + (.get selected bounded-capacity entry) + (.o factors: (list (.get budget-profile factor))) 'budget-25 + ((.get budget-observer snapshot) budget-subject) + ((.get budget-observer scopes) budget-subject 'budget-25))) + ((.get budget-observer register!) budget-review (list (.get captured observation))) + (def budget-query (gerbil-ascent-session-run budget-review)) + (check-equal? ((.get budget-query rows-of) 'support) '()) + (check-equal? (pair? ((.get budget-query rows-of) 'mismatch)) #t) + (check-equal? (length ((.get budget-query rows-of) 'witness)) 1) + (write-configuration #t) + (check-exception (.call owner admit-current) error?) + (check-exception ((.get captured runner current!) (.get captured observation)) error?) + (check-exception + ((.get captured runner register!) (.get captured evidence) + (list (.get captured observation))) error?) + (check-equal? (length ((.get captured query rows-of) 'support)) 1) + (check-equal? + (length ((.get (gerbil-ascent-session-run (.get captured evidence)) rows-of) 'witness)) 1) + (def next-owner (yuanxu-load-modules entry)) + (def next-profile (.get next-owner modules Library source-contract-profiles)) + (def disabled (.get next-profile languages c plan-library)) + (check-equal? (.get disabled config enable) #f) + (check-equal? (.get disabled config settings timeout) 30) + (check-equal? (.get disabled config settings safety-flags) + (.get method config settings safety-flags)) + (check-equal? (.get next-profile languages cpp config enable) #t) + (check-equal? (.get next-profile languages cpp plan-library config settings timeout) 20) + (check-equal? (length ((.get captured-cpp query rows-of) 'support)) 1) + (check-equal? + (.get (.call (.get next-profile languages cpp plan-library) plan + (.get next-profile languages cpp profile executor) + (.get next-profile languages cpp profile)) timeout) + 20) + (check-equal? (.get frozen-plan timeout) 45) + (.call next-owner admit-current) + (check-exception + (.call disabled plan (.get disabled strategies cbmc) (.get next-profile languages c profile)) + (lambda (failure) + (and (Error? failure) + (equal? (Error-message failure) + "source-contract capability is disabled; no plan issued")))) + (check-equal? (.get frozen-plan method) 'cbmc) + (check-equal? (pair? (.get frozen-plan steps)) #t)))))) diff --git a/t/source-contracts-test.ss b/t/source-contracts-test.ss new file mode 100644 index 0000000..0fd5895 --- /dev/null +++ b/t/source-contracts-test.ss @@ -0,0 +1,456 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import + :std/test + (only-in :std/error Error? Error-message) + "support/source-contracts.ss" + :clan/poo/object + (prefix-in "../library/source-contracts/config.ss" declared-) + :gerbil-ascent/program/session + (only-in :std/source this-source-file) + (only-in :std/io/tempfile call-with-temporary-directory) + (only-in :std/misc/ports read-all-as-string) + (only-in :std/string/misc string-subst) + (only-in :clan/poo/mop validate TypeError?) + (only-in :yuanxu/poo-clos/objects poo-clos-failure?) + (only-in :yuanxu/module-system/interface yuanxu-load-modules)) +(export source-contract-positive-test source-contract-change-test + source-contract-refusal-test source-contract-cross-project-test + source-contract-scenario-test source-contract-tool-closure-test) + +(def (stage label) + (displayln "SOURCE-CONTRACT-STAGE " label) + (force-output)) + +(stage 'imports-ready) +(def root (path-expand ".." (path-directory (this-source-file)))) +(stage 'prepare-module-view) +(def module-view (yuanxu-load-modules (path-expand "t/support/source-contract-modules.ss" root))) +(stage 'prepare-selected) +(def selected (.get module-view modules Library)) +(stage 'prepare-plan-library) +(def profile-library (.get selected source-contract-profiles)) +(def plan-library (.get profile-library plan-library)) +(stage 'prepare-evidence-library) +(def evidence-library (.get selected evidence)) +(stage 'prepare-driver) +(def driver (source-contract-test-support plan-library evidence-library)) +(stage 'prepare-evidence) +(def evidence (.get driver evidence)) +(stage 'prepare-profiles) +(def profiles (.get profile-library profiles)) +(stage 'prepare-capacity) +(def capacity (.get selected bounded-capacity entry)) +(stage 'prepare-lifetime) +(def lifetime (.get selected resource-lifetime entry)) +(stage 'selected-domains-ready) +(def tool-paths + (.o cbmc: (getenv "SOURCE_CONTRACT_CBMC") + goto-cc: (getenv "SOURCE_CONTRACT_GOTO_CC") + goto-instrument: (getenv "SOURCE_CONTRACT_GOTO_INSTRUMENT") + cc: (getenv "SOURCE_CONTRACT_CC") + cxx: (getenv "SOURCE_CONTRACT_CXX"))) +(def (rows result relation) ((.get result rows-of) relation)) +(def (subject base catalog selected-profile) + (def selected-runner driver) + (def leaf + (.o (:: @ (.get selected-runner input)) + scenario: + (.o (:: @ (.get selected-runner plan-library scenario)) + root: base entry: catalog profile: selected-profile) + tools: tool-paths + module-owner: module-view + driver: selected-runner)) + ((.get driver basis) leaf) + leaf) +(def (run base entry profile out) + (.call (subject base entry profile) .verify out)) +(def (session entry profile basis usage) + ((.get evidence open-review) entry (.o factors: (list (.get profile factor))) + usage ((.get driver snapshot) basis) ((.get driver scopes) basis usage))) +(def (write-text path text) + (call-with-output-file (list path: path truncate: #t) (cut display text <>))) +(def (read-text path) (call-with-input-file path read-all-as-string)) +(def (flat-profile profile) + (.cc profile + 'units (map path-strip-directory (.get profile units)) + 'inputs (map path-strip-directory (.get profile inputs)))) +(def (copy-project base profile) + (for-each + (lambda (path) + (write-text (path-expand (path-strip-directory path) base) + (read-text (path-expand path root)))) + (.get profile inputs))) +(def (supported? session) + (pair? (rows (gerbil-ascent-session-run session) 'support))) + +(def source-contract-positive-test + (test-suite "Actual C/C++ source contracts through native owners" + (test-case "contract body, independent callers, C++ lifetime and native artifact" + (call-with-temporary-directory "source-contract-positive" + (lambda (out) + ;; Existing native selection publishes the actual domain and driver. + (check-equal? (.get capacity family) 'numeric.bounded-capacity) + (check-equal? (.get lifetime family) 'memory.resource-lifetime) + (check-equal? (.get profiles capacity-body method) 'cbmc) + (check-equal? (.get profiles capacity-native method) 'native) + (for-each + (lambda (row) + (def entry (car row)) + (def profile (cadr row)) + (displayln "VERIFY-PROFILE " (.get profile identity)) + (def basis (subject root entry profile)) + (def review (session entry profile basis (.get profile identity))) + (check-equal? (rows (gerbil-ascent-session-run review) 'support) '()) + (def result + (with-catch + (lambda (cause) + (when (poo-clos-failure? cause) + (displayln "GENERIC-FAILURE " (.get cause code))) + (raise cause)) + (lambda () + (run root entry profile + (path-expand (symbol->string (.get profile identity)) out))))) + (check-equal? (hash-ref ((.get driver record) result) "outcome") "pass") + ((.get driver register!) review (list result)) + (check-equal? (length (rows (gerbil-ascent-session-run review) 'support)) 1) + (check-equal? (rows (gerbil-ascent-session-run review) 'pending) '())) + (list (list capacity (.get profiles capacity-contract)) + (list capacity (.get profiles capacity-body)) + (list capacity (.get profiles capacity-callers)) + (list capacity (.get profiles capacity-native)) + (list lifetime (.get profiles lifetime-body)) + (list lifetime (.get profiles lifetime-native)) + ;; A descendant uses the inherited generic method, without a + ;; method-name switch or a second driver implementation. + (list capacity + (.cc (.get profiles capacity-body) 'identity 'derived-cbmc + 'executor (.o (:: @ (.get driver strategies cbmc)) + identity: 'derived-cbmc)))))))))) + +(def source-contract-change-test + (test-suite "Cross-usage reuse and source mutation" + (test-case "shared witness, new source capture, late registration and frozen query" + (call-with-temporary-directory "source-contract-change" + (lambda (base) + (copy-project base (.get profiles capacity-body)) + (def profile (flat-profile (.get profiles capacity-body))) + (def basis (subject base capacity profile)) + (def first (session capacity profile basis 'parser-project)) + (def second (session capacity profile basis 'pool-project)) + (def result (run base capacity profile (path-expand "initial" base))) + ((.get driver register!) first (list result)) + ((.get driver register!) second (list result)) + (check-equal? (and (supported? first) (supported? second)) #t) + (def frozen (gerbil-ascent-session-run first)) + (def source (path-expand "capacity.c" base)) + (def original (read-text source)) + (write-text source (string-append original "\n/* Comment-only new revision. */\n")) + (check-exception ((.get driver current!) result) error?) + (check-exception ((.get driver register!) first (list result)) error?) + (def changed (subject base capacity profile)) + (gerbil-ascent-session-replace-source! first 'scope + ((.get driver scopes) changed 'parser-project)) + (def stale (gerbil-ascent-session-run first)) + (check-equal? (rows stale 'support) '()) + (check-equal? (pair? (rows stale 'mismatch)) #t) + (check-equal? (length (rows stale 'witness)) 1) + (check-equal? (length (rows frozen 'support)) 1) + ;; New implementation evidence is actually rerun, not relabeled. + (def refreshed (run base capacity profile (path-expand "refreshed" base))) + ((.get driver register!) first (list refreshed)) + (check-equal? (supported? first) #t) + (check-equal? (length (rows (gerbil-ascent-session-run first) 'witness)) 2) + (check-equal? (length (rows frozen 'support)) 1)))))) + +(def source-contract-refusal-test + (test-suite "Independent negative controls preserve opposing evidence" + (test-case "real source mutant yields a counter; shape and missing-property forgery refuse" + (call-with-temporary-directory "source-contract-refusal" + (lambda (base) + (copy-project base (.get profiles capacity-body)) + (def profile (flat-profile (.get profiles capacity-body))) + (def source (path-expand "capacity.c" base)) + (write-text source + (string-subst (read-text source) + "payload > UINT32_MAX - overhead" "0")) + (def basis (subject base capacity profile)) + (def review (session capacity profile basis 'mutant)) + (def failed (run base capacity profile (path-expand "counter" base))) + (check-equal? (hash-ref ((.get driver record) failed) "outcome") "fail") + ((.get driver register!) review (list failed)) + (def queried (gerbil-ascent-session-run review)) + (check-equal? (length (rows queried 'counter)) 1) + (check-equal? (rows queried 'support) '()) + (check-equal? (rows queried 'pending) '((mutant CAP-BODY cbmc))) + ;; Plain serialized output cannot acquire private issuer authority. + (check-exception ((.get driver register!) review + (list ((.get driver record) failed))) error?) + (check-exception (subject base capacity (.cc profile 'language 'rust)) TypeError?) + (check-exception (subject #f capacity profile) TypeError?) + (check-exception (subject base capacity (.cc profile 'obligation 'FOREIGN)) error?) + (check-exception (subject base capacity (.cc profile 'inputs '())) error?) + (check-exception + (run base capacity + (.cc profile 'executor + (.o identity: 'unregistered method: 'cbmc requires-properties?: #t)) + (path-expand "unknown-executor" base)) + poo-clos-failure?) + (check-exception (run base capacity + (.cc profile 'expected-properties '("absent.oracle")) + (path-expand "missing-property" base)) error?) + ;; Changing a result log after issuance prevents registration. + (write-text (path-expand "counter/cbmc.log" base) "[]") + (check-exception ((.get driver register!) review (list failed)) error?) + (check-equal? (length (rows queried 'counter)) 1)))) + (test-case "occupied C++ transfer cannot drop a live source on refusal" + (call-with-temporary-directory "source-contract-lifetime-counter" + (lambda (base) + (copy-project base (.get profiles lifetime-body)) + (def profile (flat-profile (.get profiles lifetime-body))) + (def source (path-expand "slot.hpp" base)) + (def original (read-text source)) + (def mutant + (string-subst original + "if (destination.owns())\n return false;" + "if (destination.owns()) {\n live_ = nullptr;\n return false;\n }")) + (check-equal? (equal? original mutant) #f) + (write-text source mutant) + (def basis (subject base lifetime profile)) + (def review (session lifetime profile basis 'occupied-lifetime-mutant)) + (def failed (run base lifetime profile (path-expand "counter" base))) + (check-equal? (hash-ref ((.get driver record) failed) "outcome") "fail") + ((.get driver register!) review (list failed)) + (def queried (gerbil-ascent-session-run review)) + (check-equal? (length (rows queried 'counter)) 1) + (check-equal? (rows queried 'support) '()) + (check-equal? (rows queried 'pending) + '((occupied-lifetime-mutant LIFE-BODY cbmc)))))))) + +;; These are independent native consumer declarations over the same actual +;; Library and verified implementation, not two labels on one prepared view. +(def (consumer-context directory) + (create-directory directory) + (write-text (path-expand "gerbil.pkg" directory) + (object->string (list package: (string->symbol (path-strip-directory directory))))) + (def example (read-text (path-expand "t/support/source-contract-modules.ss" root))) + (def declaration + (string-subst example "\"../../library\"" + (object->string (path-expand "library" root)))) + (write-text (path-expand "init.ss" directory) declaration) + (def selected-owner (yuanxu-load-modules (path-expand "init.ss" directory))) + (def modules (.get selected-owner modules Library)) + (def profile-module (.get modules source-contract-profiles)) + (def runner + (source-contract-test-support (.get profile-module plan-library) (.get modules evidence))) + (.o owner: selected-owner + driver: runner + entry: (.get modules bounded-capacity entry) + profile: (flat-profile (.get profile-module profiles capacity-body)))) + +(def (consumer-subject context source-root) + (def runner (.get context driver)) + (.o (:: @ (.get runner input)) + scenario: + (.o (:: @ (.get runner plan-library scenario)) + root: source-root + entry: (.get context entry) + profile: (.get context profile)) + tools: tool-paths + module-owner: (.get context owner) + driver: runner)) + +(def (consumer-review context basis usage) + (def runner (.get context driver)) + ((.get runner evidence open-review) + (.get context entry) (.o factors: (list (.get context profile factor))) + usage ((.get runner snapshot) basis) ((.get runner scopes) basis usage))) + +(def source-contract-cross-project-test + (test-suite "Real independent consumer contexts share one verified subject" + (test-case "two user declarations reuse one witness and retain separate source guards" + (call-with-temporary-directory "source-contract-projects" + (lambda (workspace) + (def source-root (path-expand "shared-subject" workspace)) + (create-directory source-root) + (copy-project source-root (.get profiles capacity-body)) + (def parser (consumer-context (path-expand "parser" workspace))) + (def pool (consumer-context (path-expand "pool" workspace))) + (check-equal? (eq? (.get parser owner) (.get pool owner)) #f) + (def parser-basis (consumer-subject parser source-root)) + (def pool-basis (consumer-subject pool source-root)) + (check-equal? ((.get parser driver snapshot) parser-basis) + ((.get pool driver snapshot) pool-basis)) + (def parser-review (consumer-review parser parser-basis 'parser-project)) + (def pool-review (consumer-review pool pool-basis 'pool-project)) + (def result (.call parser-basis .verify (path-expand "verified" workspace))) + ((.get parser driver register!) parser-review (list result)) + ((.get pool driver register!) pool-review (list result)) + (check-equal? (and (supported? parser-review) (supported? pool-review)) #t) + (def frozen (gerbil-ascent-session-run pool-review)) + (check-equal? (length (rows frozen 'witness)) 1) + ;; A changed consumer selection is not a current target context. + (def pool-init (path-expand "pool/init.ss" workspace)) + (write-text pool-init (string-append (read-text pool-init) "\n; New consumer revision.\n")) + (check-exception (.call (.get pool owner) admit-current) error?) + (check-equal? (length (rows frozen 'support)) 1) + ;; Its sibling remains current; a shared subject mutation then + ;; invalidates the actual issued result for every new registration. + (.call (.get parser owner) admit-current) + (def implementation (path-expand "capacity.c" source-root)) + (write-text implementation + (string-append (read-text implementation) "\n/* New subject revision. */\n")) + (check-exception ((.get parser driver current!) result) error?) + (check-exception ((.get pool driver register!) pool-review (list result)) error?) + (check-equal? (length (rows frozen 'support)) 1)))))) + +(def source-contract-scenario-test + (test-suite "Declarative Library Scenario boundary" + (test-case "imported Config and plain assignment drive the native plan" + (def direct-value declared-Config) + (def assigned-value + (.o enable: #t settings: (.get direct-value settings))) + (validate (.get plan-library config-type) direct-value) + (validate (.get plan-library config-type) assigned-value) + (def partial (.call plan-library configure (.o settings: (.o timeout: 30)))) + (check-equal? (.get partial enable) #t) + (check-equal? (.get partial settings timeout) 30) + (check-equal? (.get partial settings safety-flags) (.get direct-value settings safety-flags)) + (check-equal? (.get (.call plan-library configure (.o)) settings timeout) 45) + (def partial-scope (.cc plan-library 'config partial)) + (check-equal? + (.get (.call partial-scope plan (.get plan-library strategies cbmc) + (.get profiles capacity-body)) timeout) + 30) + (for-each + (lambda (invalid) + (check-exception (.call plan-library configure invalid) TypeError?)) + (list (.o settings: (.o timeout: 46)) + (.o settings: (.o timeout: 0)) + (.o settings: (.o safety-flags: '())) + (.o settings: (.o timout: 30)) + (.o enabled: #f))) + (def assigned-scope (.cc plan-library 'config assigned-value)) + (def plan + ((.get assigned-scope plan) + (.get plan-library strategies cbmc) (.get profiles capacity-body))) + (check-equal? (.get plan method) 'cbmc) + (check-equal? (and (member "--bounds-check" (.get (car (.get plan steps)) arguments)) #t) #t) + (for-each + (lambda (invalid) + (check-exception (validate (.get plan-library config-type) invalid) TypeError?)) + (list (.o enable: 'yes settings: (.get direct-value settings)) + (.o enable: #t settings: (.o timeout: 180 safety-flags: '())) + (.cc direct-value 'enabled #t) + (.o enable: #t) + (.o enable: #t + settings: (.cc (.get direct-value settings) 'timeout-seconds 45)))) + (check-exception + (validate (.get profile-library config-type) + (.cc (.get profile-library config) + 'verfication (.get profile-library config programs))) + TypeError?) + (call-with-temporary-directory "source-contract-disabled" + (lambda (directory) + (def disabled-scope + (.cc plan-library 'config + (.o enable: #f settings: (.get direct-value settings)))) + (def disabled-driver (.cc driver 'plan-library disabled-scope)) + (def implementation-root root) + (def input + (.o (:: @ (.get disabled-driver input)) + scenario: + (.o (:: @ (.get disabled-scope scenario)) + root: implementation-root entry: capacity profile: (.get profiles capacity-body)) + tools: tool-paths + module-owner: module-view + driver: disabled-driver)) + (def output (path-expand "must-not-exist" directory)) + (check-exception + (.call input .verify output) + (lambda (failure) + (and (Error? failure) + (equal? (Error-message failure) + "source-contract capability is disabled; no plan issued")))) + (check-equal? (file-exists? output) #f)))) + (test-case "Scenario validation does not capture source or run a tool" + (call-with-temporary-directory "source-contract-declaration" + (lambda (directory) + (def absent (path-expand "not-created" directory)) + (def declaration + (.o (:: @ (.get plan-library scenario)) + root: absent + entry: capacity + profile: (.get profiles capacity-body))) + (def admitted (validate (.get plan-library contracts scenario) declaration)) + (check-equal? (.get admitted root) absent) + (check-equal? (file-exists? absent) #f) + (check-equal? (.slot? declaration 'tools) #f) + (check-equal? (.slot? declaration '.verify) #f) + ;; A derived scope must use its final Config, never a captured policy. + (def invalid-policy-scope + (.o (:: @ plan-library) + config: (.o enable: #t settings: (.o timeout: 45 safety-flags: '())))) + (check-exception + ((.get invalid-policy-scope plan) + (.get plan-library strategies cbmc) + (.get profiles capacity-body)) + TypeError?) + (for-each + (lambda (profile) + (check-exception + (validate (.get plan-library contracts scenario) + (.cc declaration 'profile profile)) + TypeError?)) + (list (.cc (.get profiles capacity-body) 'method 'native) + (.cc (.get profiles capacity-body) 'enforce "foreign_function") + (.cc (.get profiles capacity-body) 'obligation 'FOREIGN) + (.cc (.get profiles capacity-body) 'inputs '()) + (.cc (.get profiles capacity-body) 'inputs '("omitted-unit.c")) + (.cc (.get profiles capacity-body) 'expected-properties '()))) + (check-exception + (validate (.get plan-library contracts scenario) + (.cc declaration 'entry (.o identity: 'unadmitted))) + TypeError?)))))) + + +(def source-contract-tool-closure-test + (test-suite "Actual tool dependency closure" + (test-case "unused tool changes preserve a native witness; compiler changes refuse reuse" + (for-each + (lambda (row) + (def profile (.ref profiles (car row))) + (check-equal? + (.get (.call plan-library plan (.get profile executor) profile) external-tools) + (cadr row))) + '((capacity-body (cbmc)) + (capacity-contract (goto-cc goto-instrument cbmc)) + (capacity-callers (goto-cc goto-instrument cbmc)) + (capacity-native (cc)) + (lifetime-body (cbmc)) + (lifetime-native (cxx)))) + (call-with-temporary-directory "source-contract-tool-closure" + (lambda (directory) + (def compiler (path-expand "compiler" directory)) + (copy-file (.get tool-paths cc) compiler) + (def unused (path-expand "unused-cbmc" directory)) + (def selected-tools (.cc tool-paths 'cc compiler 'cbmc unused)) + (def profile (.get profiles capacity-native)) + (def input (.cc (subject root capacity profile) 'tools selected-tools)) + (def review (session capacity profile input 'native-tool-closure)) + (def result (.call input .verify (path-expand "actual-native" directory))) + ((.get driver register!) review (list result)) + (check-equal? (supported? review) #t) + (def frozen (gerbil-ascent-session-run review)) + ;; There was no CBMC executable here, and the native plan did not need it. + (check-equal? (file-exists? unused) #f) + (write-text unused "unused tool changed; this plan never invokes it\n") + ((.get driver current!) result) + ((.get driver register!) review (list result)) + (check-equal? (supported? review) #t) + ;; The actually executed compiler is retained and checked by the issuer. + (write-text compiler "replaced compiler bytes; no new result may be issued\n") + (check-exception ((.get driver current!) result) error?) + (check-exception ((.get driver register!) review (list result)) error?) + (check-equal? (length (rows frozen 'support)) 1)))))) diff --git a/examples/backpressure-aitia-review.ss b/t/support/backpressure-aitia-review.ss similarity index 100% rename from examples/backpressure-aitia-review.ss rename to t/support/backpressure-aitia-review.ss index c492347..6f5a140 100644 --- a/examples/backpressure-aitia-review.ss +++ b/t/support/backpressure-aitia-review.ss @@ -1,8 +1,8 @@ +#!/usr/bin/env gxi ;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; ;;; SPDX-License-Identifier: LGPL-2.1-or-later -#!/usr/bin/env gxi ;;; -*- Gerbil -*- (import :clan/poo/object :std/encoding/json diff --git a/examples/backpressure-reassessment-evidence.ss b/t/support/backpressure-reassessment-evidence.ss similarity index 95% rename from examples/backpressure-reassessment-evidence.ss rename to t/support/backpressure-reassessment-evidence.ss index 9613279..d34f109 100644 --- a/examples/backpressure-reassessment-evidence.ss +++ b/t/support/backpressure-reassessment-evidence.ss @@ -1,8 +1,8 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later - #!/usr/bin/env gxi +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- ;;; Actual source-changing native experiment, handed off through Core Ops. (import :clan/poo/object :std/encoding/json :std/misc/ports :std/list/list @@ -52,8 +52,8 @@ (def raw (path-expand "observations.json" out)) (def log (path-expand "cargo-run.log" out)) (def before (append dependencies (pairs (list source (path-expand "Cargo.toml" crate) (path-expand "Cargo.lock" crate) cargo rustc - (path-expand "examples/backpressure-reassessment-evidence.ss" root) - (path-expand "library/drivers/rust-resources/reassessment-oracle.ss" root))))) + (path-expand "t/support/backpressure-reassessment-evidence.ss" root) + (path-expand "library/rust-resources/reassessment-oracle.ss" root))))) (current! before) (def argv (list cargo "--config" (string-append "build.rustc=\"" rustc "\"") "run" "--offline" "--locked" "--manifest-path" (path-expand "Cargo.toml" crate) "--target-dir" (path-expand "target" out) "--" raw (number->string size))) diff --git a/examples/gateway-evidence.ss b/t/support/gateway-evidence.ss similarity index 87% rename from examples/gateway-evidence.ss rename to t/support/gateway-evidence.ss index 307d983..5a6b591 100644 --- a/examples/gateway-evidence.ss +++ b/t/support/gateway-evidence.ss @@ -1,15 +1,16 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- ;;; A replayable engineering investigation selected by the LLM-based AI agent. ;;; This is one example, not an Agent scheduler or a mandatory implementation plan. -(import :deterministic-engineering/init :deterministic-engineering/profiles/gateway +(import :deterministic-engineering/init :clan/poo/object :std/encoding/json (only-in :std/misc/ports read-all-as-string) :gerbil-ascent/program/session (only-in :agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger ascent-trajectory)) +(def LocalProfile (.get deterministic-engineering.init.exports Library gateway-profiles profiles LocalProfile)) (export main run-gateway-investigation) (def (read-text path) (call-with-input-file path read-all-as-string)) (def (write-text path value) @@ -20,9 +21,8 @@ (def (rejects? thunk) (with-catch (lambda (_) #t) (lambda () (thunk) #f))) (def (run-gateway-investigation root output quint lean) (create-directory output) - ((.get deterministic-engineering.init.exports std-make-spec) '("init" "examples/gateway-evidence")) (.call deterministic-engineering.init.exports admit-current) - (def scene (.get (.get deterministic-engineering.init.exports Scenarios) gateway-review scope)) + (def scene (.get (.get deterministic-engineering.init.exports Library) gateway-review)) (def entry (.ref scene 'entry)) (def methods (.ref scene 'methods)) ;; Issuer-owned observations must use this SAME Scenario scope's operations. @@ -35,7 +35,7 @@ (def gateway-result-claim (.ref methods 'claim)) (def gateway-result-current! (.ref methods 'current!)) (def application-source (path-expand "application-source.ss" output)) - (write-text application-source (read-text (path-expand "profiles/gateway.ss" root))) + (write-text application-source (read-text (path-expand "library/gateway-profiles/objects.ss" root))) ;; Actual design inputs; no invented Cargo.lock, measurements or Rust source. (def baseline (.cc LocalProfile 'lock "unresolved/no-Rust-implementation" 'runtime "declared/Tokio-Rayon-topology" 'workload "bounded-five-job-review" @@ -43,7 +43,7 @@ (def cap2 (.cc baseline 'identity 'C2 'capacity 4)) (def cache (.cc cap2 'identity 'C2-cache 'cache-bytes 128 'factors '(bounded-retention tokio rayon cache))) - (def rules (path-expand "library/drivers/evidence/func.ss" root)) + (def rules (path-expand "library/evidence/func.ss" root)) (def queries '()) (def exchanges '()) (def records '()) (def events '()) (def session #f) (def trajectory #f) (def scopes #f) (def current-profile #f) (def current-usage #f) (def frozen #f) (def late-proof #f) @@ -200,21 +200,21 @@ ("results" (map gateway-result-record records)) ("sourceInputs" (map (lambda (relative) (def f (path-expand relative root)) (list f (gateway-digest-file f))) - '("init.ss" "build.ss" "gerbil.pkg" "examples/gateway-evidence.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/types.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/interface.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/config.ss" - "profiles/gateway.ss" "library/drivers/rust-resources/objects.ss" - "library/drivers/rust-resources/types.ss" "library/drivers/rust-resources/interface.ss" - "library/drivers/rust-resources/config.ss" "library/drivers/evidence/func.ss" - "library/drivers/evidence/types.ss" "library/drivers/evidence/interface.ss" - "library/drivers/evidence/objects.ss" "library/drivers/evidence/config.ss" - "scenarios/gateway-review/interface.ss" "scenarios/gateway-review/types.ss" - "scenarios/gateway-review/objects.ss" "scenarios/gateway-review/config.ss" - "scenarios/gateway-review/func.ss" "library/drivers/rust-resources/methods.ss" - "library/drivers/rust-resources/oracle.ss" "library/concurrency/resource-control/backpressure-memory/model.qnt" - "library/concurrency/resource-control/backpressure-memory/budget.lean"))) + '("init.ss" "build.ss" "gerbil.pkg" "t/support/gateway-evidence.ss" + "library/backpressure-memory/objects.ss" + "library/backpressure-memory/types.ss" + "library/backpressure-memory/interface.ss" + "library/backpressure-memory/config.ss" + "library/gateway-profiles/objects.ss" "library/rust-resources/objects.ss" + "library/rust-resources/types.ss" "library/rust-resources/interface.ss" + "library/rust-resources/config.ss" "library/evidence/func.ss" + "library/evidence/types.ss" "library/evidence/interface.ss" + "library/evidence/objects.ss" "library/evidence/config.ss" + "library/gateway-review/interface.ss" "library/gateway-review/types.ss" + "library/gateway-review/objects.ss" "library/gateway-review/config.ss" + "library/gateway-review/func.ss" "library/rust-resources/methods.ss" + "library/rust-resources/oracle.ss" "library/backpressure-memory/model.qnt" + "library/backpressure-memory/budget.lean"))) ("rejections" '("changed-artifact" "plain-JSON-is-not-an-issuer")) ("methodEvidence" "real-Core-Ops-QNT-TLC-Lean-native-ASCENT") ("rustImplementationVerified" #f) ("nativePerformanceMeasured" #f))) diff --git a/examples/library-formation-consequences.ss b/t/support/library-formation-consequences.ss similarity index 58% rename from examples/library-formation-consequences.ss rename to t/support/library-formation-consequences.ss index 39068a6..3eb3729 100644 --- a/examples/library-formation-consequences.ss +++ b/t/support/library-formation-consequences.ss @@ -1,13 +1,15 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;; Algorithm probe: does not acquire or qualify the declared Project Scope. -(import "../library/drivers/project-formation/func.ss" - "../scenarios/project-formation/func.ss" +(import "../library/project-formation/func.ss" + "../library/project-intake/func.ss" "../library/project-organization/config.ss" - "../profiles/library-formation.ss" + "library-formation-output.ss") +(import :deterministic-engineering/init) +(def LibraryFormationProfile (.get deterministic-engineering.init.exports Library library-formation-profiles profiles LibraryFormationProfile)) (export main) (def (main output) (when (file-exists? output) (error "formation output must be fresh" output)) diff --git a/examples/library-formation-output.ss b/t/support/library-formation-output.ss similarity index 100% rename from examples/library-formation-output.ss rename to t/support/library-formation-output.ss diff --git a/examples/library-formation.ss b/t/support/library-formation.ss similarity index 68% rename from examples/library-formation.ss rename to t/support/library-formation.ss index e1d48bd..375a958 100644 --- a/examples/library-formation.ss +++ b/t/support/library-formation.ss @@ -1,10 +1,12 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later -(import "../projects/library-formation/init.ss" "../profiles/library-formation.ss" +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +(import "../../projects/library-formation/init.ss" "library-formation-output.ss" :clan/poo/object (only-in :yuanxu/module-system/source/admission current-module-source-observer)) +(import :deterministic-engineering/init) +(def LibraryFormationProfile (.get deterministic-engineering.init.exports Library library-formation-profiles profiles LibraryFormationProfile)) (export main) (def (main output) (when (file-exists? output) (error "formation output must be fresh" output)) @@ -12,7 +14,7 @@ (lambda (kind amount) (when (and (pair? kind) (memq (car kind) '(link-stage-start link-stage-end))) (displayln "FORMATION-SOURCE-STAGE " kind " " amount) (force-output))))) - (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules library-project-formation scope)) + (def scene (.get deterministic-engineering/projects/library-formation.init.exports modules project-intake)) (def input ((.ref scene 'inputs) LibraryFormationProfile)) (def result ((.ref scene 'run) LibraryFormationProfile)) (write-formation-investigation output input result (.ref scene 'render) "declared-project-scope-observed"))) diff --git a/examples/resource-integration-evidence.ss b/t/support/resource-integration-evidence.ss similarity index 93% rename from examples/resource-integration-evidence.ss rename to t/support/resource-integration-evidence.ss index 2141465..5119396 100644 --- a/examples/resource-integration-evidence.ss +++ b/t/support/resource-integration-evidence.ss @@ -1,11 +1,12 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- -(import :deterministic-engineering/init :deterministic-engineering/profiles/resource-lifecycle +(import :deterministic-engineering/init :clan/poo/object :std/encoding/json :gerbil-ascent/program/session (only-in :agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger ascent-trajectory)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) (export main) (def (wire rows) (map (lambda (row) (map (lambda (v) (if (symbol? v) (symbol->string v) v)) row)) rows)) (def (need label ok) (unless ok (error "integration acceptance failed" label))) @@ -13,9 +14,8 @@ (def root (current-directory)) (set! output (path-expand output root)) (when (file-exists? output) (error "fresh integration output required" output)) (create-directory output) - ((.get deterministic-engineering.init.exports std-make-spec) '("init" "profiles/resource-lifecycle" "examples/resource-integration-evidence")) (.call deterministic-engineering.init.exports admit-current) - (def scene (.get (.get deterministic-engineering.init.exports Scenarios) resource-lifecycle scope)) + (def scene (.get (.get deterministic-engineering.init.exports Library) resource-lifecycle)) (def methods (.ref scene 'methods)) (def entry (.ref scene 'integration-entry)) (def crate (path-expand "languages-engineering/rust/concurrency/resource-control/backpressure-memory" root)) @@ -24,7 +24,7 @@ (def scopes (append (.ref context 'scopes) extra)) (def digest (.ref methods 'value-digest)) (def save (.ref methods 'write-json)) (def snapshot (digest (list (.ref context 'snapshot) scopes))) - (def session ((.get (.get deterministic-engineering.init.exports Library) evidence scope open-review) + (def session ((.get (.get deterministic-engineering.init.exports Library) evidence open-review) entry LifecycleProfile 'integration snapshot scopes)) (displayln "INTEGRATION-PHASE native") (force-output) (def native ((.ref methods 'native) root crate cargo rustc 64 (path-expand "native" output))) @@ -44,7 +44,7 @@ ("event" (hash ("id" ((.ref methods 'id) r)) ("kind" "evidence") ("sourceIdentity" snapshot) ("resultReference" ((.ref methods 'reference) r)) ("pathIdentity" ((.ref methods 'claim) r))))))) results) - (def rules (path-expand "library/drivers/evidence/func.ss" root)) + (def rules (path-expand "library/evidence/func.ss" root)) (def exchange ((.ref methods 'register) session results trajectory rules)) (def (query) (def result (gerbil-ascent-session-run session)) diff --git a/examples/resource-lifecycle-evidence.ss b/t/support/resource-lifecycle-evidence.ss similarity index 79% rename from examples/resource-lifecycle-evidence.ss rename to t/support/resource-lifecycle-evidence.ss index ed1f697..bb7d95b 100644 --- a/examples/resource-lifecycle-evidence.ss +++ b/t/support/resource-lifecycle-evidence.ss @@ -1,12 +1,14 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; -*- Gerbil -*- -(import :deterministic-engineering/init :deterministic-engineering/profiles/resource-lifecycle +(import :deterministic-engineering/init :clan/poo/object :std/encoding/json :gerbil-ascent/program/session (only-in :agentic-ai-lab/modules/temporal-causality/trajectory/ascent-ledger ascent-trajectory) (only-in :std/misc/ports read-all-as-string)) +(def LifecycleProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LifecycleProfile)) +(def LargerPayloadProfile (.get deterministic-engineering.init.exports Library resource-lifecycle-profiles profiles LargerPayloadProfile)) (export main) (def (read-text p) (call-with-input-file p read-all-as-string)) (def (write-text p s) (call-with-output-file (list path: p truncate: #t) (cut display s <>))) @@ -16,13 +18,12 @@ (def (main output cargo rustc quint lean) (def root (current-directory)) (set! output (path-expand output root)) (create-directory output) - ((.get deterministic-engineering.init.exports std-make-spec) '("init" "profiles/resource-lifecycle" "examples/resource-lifecycle-evidence")) (.call deterministic-engineering.init.exports admit-current) - (def scene (.get (.get deterministic-engineering.init.exports Scenarios) resource-lifecycle scope)) + (def scene (.get (.get deterministic-engineering.init.exports Library) resource-lifecycle)) (def entry (.ref scene 'entry)) (def m (.ref scene 'methods)) (def digest (.ref m 'file-digest)) (def value-digest (.ref m 'value-digest)) (def save (.ref m 'write-json)) (def record (.ref m 'record)) - (def rules (path-expand "library/drivers/evidence/func.ss" root)) + (def rules (path-expand "library/evidence/func.ss" root)) (def crate (path-expand "languages-engineering/rust/concurrency/resource-control/backpressure-memory" root)) (def records '()) (def queries '()) (def exchanges '()) (def session #f) (def trajectory #f) (def usage #f) (def scopes #f) @@ -121,23 +122,23 @@ ("nativeCases" 6) ("nativeRuns" 3) ("nativePerformanceMeasured" #f) ("correspondence" "bounded cut-to-owner mapping reviewed; no whole-program refinement proof") ("sourceInputs" (map (lambda (p) (def full (path-expand p root)) (list full (digest full))) - '("init.ss" "build.ss" "gerbil.pkg" "profiles/resource-lifecycle.ss" "examples/resource-lifecycle-evidence.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/objects.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/types.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/interface.ss" - "library/concurrency/resource-control/backpressure-memory/abstract/config.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/types.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/objects.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/config.ss" - "library/concurrency/resource-control/backpressure-memory/tokio-rayon/interface.ss" - "library/drivers/rust-resources/interface.ss" "library/drivers/rust-resources/types.ss" "library/drivers/rust-resources/config.ss" - "library/drivers/rust-resources/objects.ss" "library/drivers/rust-resources/func.ss" - "library/drivers/rust-resources/methods.ss" "library/drivers/rust-resources/oracle.ss" - "library/drivers/evidence/func.ss" "library/drivers/evidence/interface.ss" - "library/drivers/evidence/types.ss" "library/drivers/evidence/config.ss" "library/drivers/evidence/objects.ss" - "scenarios/resource-lifecycle/func.ss" "scenarios/resource-lifecycle/interface.ss" - "scenarios/resource-lifecycle/types.ss" "scenarios/resource-lifecycle/objects.ss" "scenarios/resource-lifecycle/config.ss" - "library/concurrency/resource-control/backpressure-memory/model.qnt" "library/concurrency/resource-control/backpressure-memory/budget.lean"))) + '("init.ss" "build.ss" "gerbil.pkg" "library/resource-lifecycle-profiles/objects.ss" "t/support/resource-lifecycle-evidence.ss" + "library/backpressure-memory/objects.ss" + "library/backpressure-memory/types.ss" + "library/backpressure-memory/interface.ss" + "library/backpressure-memory/config.ss" + "library/backpressure-tokio-rayon/types.ss" + "library/backpressure-tokio-rayon/objects.ss" + "library/backpressure-tokio-rayon/config.ss" + "library/backpressure-tokio-rayon/interface.ss" + "library/rust-resources/interface.ss" "library/rust-resources/types.ss" "library/rust-resources/config.ss" + "library/rust-resources/objects.ss" "library/rust-resources/func.ss" + "library/rust-resources/methods.ss" "library/rust-resources/oracle.ss" + "library/evidence/func.ss" "library/evidence/interface.ss" + "library/evidence/types.ss" "library/evidence/config.ss" "library/evidence/objects.ss" + "library/resource-lifecycle/func.ss" "library/resource-lifecycle/interface.ss" + "library/resource-lifecycle/types.ss" "library/resource-lifecycle/objects.ss" "library/resource-lifecycle/config.ss" + "library/backpressure-memory/model.qnt" "library/backpressure-memory/budget.lean"))) ("rejections" '("changed-lock" "changed-owned-source" "JSON-is-not-issuer")))) (save (path-expand "report.json" output) report) (displayln "RESOURCE-REAL-EVIDENCE-OK " (path-expand "report.json" output))) diff --git a/t/support/rust-backpressure-modules.ss b/t/support/rust-backpressure-modules.ss new file mode 100644 index 0000000..79d7e08 --- /dev/null +++ b/t/support/rust-backpressure-modules.ss @@ -0,0 +1,10 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :yuanxu/module-system/selection/init-syntax) + +(yuanxu! + :load-modules "../../library" mode: auto profile: rust rename: Library + (backpressure-tokio-rayon disable: #f) + (source-contract-profiles disable: #t) + (gateway-profiles disable: #t)) diff --git a/t/support/source-contract-evidence.ss b/t/support/source-contract-evidence.ss new file mode 100644 index 0000000..49c744d --- /dev/null +++ b/t/support/source-contract-evidence.ss @@ -0,0 +1,74 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Retained real-tool evidence, using the same selected owners as the tests. +(import "source-contracts.ss" :clan/poo/object :std/encoding/json :gerbil-ascent/program/session + (only-in :std/source this-source-file) + (only-in :yuanxu/module-system/interface yuanxu-load-modules)) +(export main) + +(def (wire rows) + (map (lambda (row) (map (lambda (value) + (if (symbol? value) (symbol->string value) value)) row)) rows)) +(def (main output cbmc-path goto-cc-path instrument-path cc-path cxx-path) + (def project-directory (path-expand "../.." (path-directory (this-source-file)))) + (set! output (path-expand output project-directory)) + (when (file-exists? output) (error "fresh evidence output required" output)) + (create-directory output) + (def module-view + (yuanxu-load-modules (path-expand "t/support/source-contract-modules.ss" project-directory))) + (def selected (.get module-view modules Library)) + (def profile-library (.get selected source-contract-profiles)) + (def driver + (source-contract-test-support (.get profile-library plan-library) (.get selected evidence))) + (def evidence (.get driver evidence)) + (def profiles (.get profile-library profiles)) + (def tool-paths (.o cbmc: cbmc-path goto-cc: goto-cc-path goto-instrument: instrument-path + cc: cc-path cxx: cxx-path)) + (def selected-runner driver) + (def queries '()) + (for-each + (lambda (choice) + (def selected-entry (.get (.ref selected (car choice)) entry)) + (def selected-profile (.ref profiles (cadr choice))) + (def usage-id (.get selected-profile identity)) + (def leaf + (.o (:: @ (.get driver input)) + scenario: + (.o (:: @ (.get driver plan-library scenario)) + root: project-directory entry: selected-entry profile: selected-profile) + tools: tool-paths + module-owner: module-view + driver: selected-runner)) + (def session + ((.get evidence open-review) selected-entry + (.o factors: (list (.get selected-profile factor))) usage-id + ((.get driver snapshot) leaf) ((.get driver scopes) leaf usage-id))) + (def result + (.call leaf .verify (path-expand (symbol->string usage-id) output))) + ((.get driver register!) session (list result)) + (def answer (gerbil-ascent-session-run session)) + (def (rows relation) ((.get answer rows-of) relation)) + (unless (and (= (length (rows 'unopposed_support)) 1) + (null? (rows 'pending)) (null? (rows 'counter))) + (error "source-contract acceptance query disagrees with independent gold" usage-id)) + (set! queries + (cons (hash ("usage" (symbol->string usage-id)) + ("support" (wire (rows 'support))) + ("unopposedSupport" (wire (rows 'unopposed_support))) + ("pending" (wire (rows 'pending))) + ("counter" (wire (rows 'counter))) + ("observation" ((.get driver record) result))) queries))) + '((bounded-capacity capacity-contract) (bounded-capacity capacity-body) + (bounded-capacity capacity-callers) (bounded-capacity capacity-native) + (resource-lifetime lifetime-body) (resource-lifetime lifetime-native))) + (def path (path-expand "report.json" output)) + (call-with-output-file path + (lambda (port) + (write-json + port + (hash ("schema" "source-contract.acceptance.v1") + ("queries" (reverse queries)) + ("boundary" "Selected local native dependencies; no whole-project proof or execution permission"))) + (newline port))) + (displayln "SOURCE-CONTRACT-EVIDENCE-OK " path)) diff --git a/t/support/source-contract-input.ss b/t/support/source-contract-input.ss new file mode 100644 index 0000000..0ed070b --- /dev/null +++ b/t/support/source-contract-input.ss @@ -0,0 +1,32 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Development input for real compiler/solver controls; not a product Runtime. +(import :clan/poo/object + (only-in :yuanxu/module-system/source/observations + module-source-read module-source-admit-current! + module-source-object-policy)) +(export SourceContractInput.) + +;;; A language-input value delegates guards to its selected native Module owner. +(.def (SourceContractInput. subject []) + scenario: (error "Select a declarative Library Scenario") + tools: (error "Select tool paths") + module-owner: (error "Select the native init owner") + driver: (error "Select the native source-contract driver leaf") + verification-plan: + (.call (.get driver plan-library) plan + (.get scenario profile executor) (.get scenario profile)) + source-inputs: + (map (lambda (relative) + (def path (path-expand relative (.get scenario root))) + (cons path (module-source-read path))) + (.get scenario profile inputs)) + translation-units: (map (cut path-expand <> (.get scenario root)) (.get scenario profile units)) + value-current?: (module-source-object-policy (list subject scenario (.get scenario profile) (.get scenario entry) tools)) + admit-current: + (lambda () + (.call module-owner admit-current) + (unless (value-current?) (error "selected source-contract leaf changed")) + (module-source-admit-current! source-inputs "selected C/C++ source changed")) + .verify: (lambda (output) ((.get driver run) subject output))) diff --git a/t/support/source-contract-modules.ss b/t/support/source-contract-modules.ss new file mode 100644 index 0000000..a0bc5f3 --- /dev/null +++ b/t/support/source-contract-modules.ss @@ -0,0 +1,10 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :yuanxu/module-system/selection/init-syntax) + +(yuanxu! + :load-modules "../../library" mode: auto profile: source-contract rename: Library + (source-contract-profiles disable: #f) + (backpressure-tokio-rayon disable: #t) + (gateway-profiles disable: #t)) diff --git a/t/support/source-contracts.ss b/t/support/source-contracts.ss new file mode 100644 index 0000000..4a26f06 --- /dev/null +++ b/t/support/source-contracts.ss @@ -0,0 +1,252 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +;;; Real source observations through Core Ops. No project-specific rule engine. +(import + :clan/poo/object + :std/encoding/json + :gerbil-ascent/program/session + (only-in :gerbil-ascent/rules/declaration rule-module-program) + (only-in :clan/poo/mop validate) + (only-in :yuanxu/ops/process-script ProcessScript.) + (only-in :std/crypto/digest sha256) + (only-in :std/encoding/hex hex-encode) + (only-in :std/misc/ports read-all-as-u8vector) + (only-in :yuanxu/module-system/source/observations call-with-collected-module-sources) + "source-contract-input.ss") +(export source-contract-test-support) + +;; The constructor is private. A saved JSON report is not an issued observation. +(defstruct observation (record scopes files admit-current) final: #t) +(def (digest-file path) + (unless (eq? (file-info-type (file-info path #f)) 'regular) + (error "source-contract input must be an ordinary file" path)) + (hex-encode (sha256 (call-with-input-file path read-all-as-u8vector)))) +(def (digest-value value) + (hex-encode (sha256 (string->utf8 (json->string value))))) +(def (file-pairs paths) + (map (lambda (path) (cons path (digest-file path))) paths)) +(def (current-files! files) + (for-each + (lambda (pair) + (unless (equal? (cdr pair) (digest-file (car pair))) + (error "source-contract dependency changed" (car pair)))) + files)) +(def (write-json-file path value) + (call-with-output-file (list path: path truncate: #t) + (lambda (port) (write-json port value) (newline port)))) +(def (profile-value profile) + (map (lambda (key) (list (symbol->string key) (.ref profile key))) + '(identity language executor obligation factor method function enforce instrumentation units inputs expected-properties))) +(def (json-value value) + ;; Stable JSON-compatible symbols in authored POO projections. + (cond ((symbol? value) (symbol->string value)) + ((pair? value) (map json-value value)) + ((object? value) + (map (lambda (key) (list (symbol->string key) (json-value (.ref value key)))) + (.all-slots value))) + (else value))) +(def (contract-basis subject) + ;; A projection of the selected leaf, not a source resolver or graph walker. + ;; Module/currentness authority stays with Yuanxu's admitted owner. + (def scenario + (validate (.get subject driver plan-library contracts scenario) (.get subject scenario))) + (def profile (.get scenario profile)) + (def tools (validate (.get subject driver plan-library contracts tools) (.get subject tools))) + (def entry (.get scenario entry)) + (def plan (.get subject verification-plan)) + (list + (cons 'source (digest-value + (map (lambda (input) (list (car input) (cdr input))) (.get subject source-inputs)))) + (cons 'profile + (digest-value (json-value + (list (profile-value profile) (.get entry identity) + (.get entry rules) (.get entry dependencies))))) + (cons 'method + (digest-value + (list (map cdr (file-pairs (map (cut .ref tools <>) (.get plan external-tools)))) + (json-value plan)))))) + +(def (contract-scopes subject usage) + (map (lambda (pair) (list usage (car pair) (cdr pair))) (contract-basis subject))) +(def (contract-snapshot subject) + (digest-value (map (lambda (pair) (list (symbol->string (car pair)) (cdr pair))) + (contract-basis subject)))) +(def (command! out name arguments deadline) + (def log-path (path-expand (string-append name ".log") out)) + (def receipt + (.call (.cc ProcessScript. 'command arguments 'directory out + 'timeout deadline 'log log-path 'check-status #f) .run)) + (.o status: (.get receipt status) log: log-path argv: arguments)) +(def (require-success! command) + (unless (equal? (.get command status) 0) + (error "source-contract preparation/native command failed" (.get command log)))) + +(def (cbmc-outcome path status expected) + (def messages (call-with-input-file path (cut read-json <> object-as-hash: #t))) + (def results (apply append (map (lambda (row) (hash-ref row "result" '())) messages))) + (def statuses (filter-map (lambda (row) (hash-get row "cProverStatus")) messages)) + (unless (and (pair? results) (= (length statuses) 1) + (not (find (lambda (row) (equal? (hash-ref row "messageType" "") "ERROR")) messages))) + (error "CBMC result is incomplete or unsupported" path)) + (unless (andmap (lambda (row) (member (hash-ref row "status") '("SUCCESS" "FAILURE"))) results) + (error "CBMC has unknown properties; no witness issued" path)) + (when (find (lambda (row) + (and (equal? (hash-ref row "status") "FAILURE") + (string-contains (hash-ref row "description" "") "unwind"))) results) + (error "insufficient unwinding; no safety counter issued" path)) + (for-each + (lambda (name) + (unless (find (lambda (row) (equal? name (hash-ref row "description" ""))) results) + (error "required independent property missing from CBMC result" name))) + expected) + (cond + ((and (equal? status 0) (equal? statuses '("success")) + (andmap (lambda (row) (equal? (hash-ref row "status") "SUCCESS")) results)) 'pass) + ((and (equal? status 10) (equal? statuses '("failure")) + (find (lambda (row) (equal? (hash-ref row "status") "FAILURE")) results)) 'fail) + (else (error "unknown CBMC outcome; no witness issued" path)))) + +(def (contract-run subject out) + (call-with-collected-module-sources + (lambda (sources-current!) + ;; This closure is issued by the existing native observation collector. + ;; It observes the selected leaf and retains no hand-written Module list. + (validate (.get subject driver plan-library contracts scenario) (.get subject scenario)) + (def profile (validate (.get subject driver plan-library contracts profile) (.get subject scenario profile))) + (def tools (validate (.get subject driver plan-library contracts tools) (.get subject tools))) + (def plan-library (.get subject driver plan-library)) + (def plan (.get subject verification-plan)) + (.call subject admit-current) + (def basis (contract-basis subject)) + (when (file-exists? out) (error "fresh output directory required" out)) + (create-directory out) + (def commands '()) + (def artifacts '()) + (def tool-inputs + (file-pairs (map (cut .ref tools <>) (.get plan external-tools)))) + (def (run name argv) + (def result (command! out name argv (.get plan timeout))) + (set! commands (cons result commands)) + (set! artifacts (cons (.get result log) artifacts)) + result) + (def absolute-units (.get subject translation-units)) + (def native-path (path-expand "subject" out)) + (def symbols + (.o sources: absolute-units + raw-module: (path-expand "subject.goto" out) + checked-module: (path-expand "checked.goto" out) + native-binary: native-path)) + (def tool-paths (.o (:: @ tools) native-binary: native-path)) + (def outcome 'pass) + (for-each + (lambda (step) + (def arguments + (apply append + (map (lambda (argument) + (if (symbol? argument) + (let (bound (.ref symbols argument)) + (if (list? bound) bound (list bound))) + (list argument))) + (.get step arguments)))) + (def command + (run (symbol->string (.get step tool)) + (cons (.ref tool-paths (.get step tool)) arguments))) + (if (eq? (.get step expected) 'solver) + (let (checked (cbmc-outcome (.get command log) (.get command status) + (.get plan expected-properties))) + (when (eq? checked 'fail) (set! outcome 'fail))) + (require-success! command)) + (set! artifacts + (append (map (cut .ref symbols <>) (.get step artifacts)) artifacts))) + (.get plan steps)) + (sources-current!) + (.call subject admit-current) + (unless (equal? basis (contract-basis subject)) + (error "selected source-contract leaf changed during execution")) + (def report + (hash ("schema" "source-contract.observation.v1") + ("profile" (json-value (profile-value profile))) + ("obligation" (symbol->string (.get profile obligation))) + ("method" (symbol->string (.get profile method))) + ("outcome" (symbol->string outcome)) + ("scopes" (map (lambda (pair) (list (symbol->string (car pair)) (cdr pair))) basis)) + ("commands" (map (lambda (row) + (hash ("argv" (.get row argv)) ("status" (.get row status)) + ("log" (.get row log)))) (reverse commands))) + ("boundary" "Native selected leaf; local issued result; no approval or whole-project claim"))) + (def path (path-expand "record.json" out)) + (write-json-file path report) + (make-observation report basis + (append tool-inputs (file-pairs (cons path artifacts))) + (lambda () + (sources-current!) + (.call subject admit-current) + (unless (equal? basis (contract-basis subject)) + (error "issued result no longer matches the selected leaf"))))))) + +(def (contract-current! result) + (unless (observation? result) (error "private issued source-contract result required")) + ((observation-admit-current result)) + (current-files! (observation-files result))) +(def (contract-result-record result) + (unless (observation? result) (error "issued source-contract result required")) + (call-with-input-string (json->string (observation-record result)) + (cut read-json <> object-as-hash: #t))) + +(def (contract-register! session results) + ;; No rehydration or approval is inferred. Currentness precedes the one native + ;; Session mutation. Old witnesses remain; changed usage scopes reject reuse. + (for-each contract-current! results) + (def old (gerbil-ascent-session-run session)) + (def (rows relation) ((.get old rows-of) relation)) + (def witnesses '()) + (def inputs '()) + (def checked '()) + (for-each + (lambda (result) + (def record (observation-record result)) + (def reference (digest-value record)) + (def id (string->symbol (string-append "source-contract-" reference))) + (set! witnesses + (cons (list id (string->symbol (hash-ref record "obligation")) + (string->symbol (hash-ref record "method")) reference + (string->symbol (hash-ref record "outcome"))) witnesses)) + (set! inputs + (append (map (lambda (pair) (list id (car pair) (cdr pair))) + (observation-scopes result)) inputs)) + ;; Attestation is the local, private issuer plus current artifact checks. + ;; It is not a signature or external independent review approval. + (set! checked (cons (list id reference reference) checked))) + results) + (def (union relation additions) + (foldl (lambda (row rest) (if (member row rest) rest (cons row rest))) + (rows relation) additions)) + (gerbil-ascent-session-replace-sources! session + (list (cons 'witness (union 'witness witnesses)) + (cons 'witness_input (union 'witness_input inputs)) + (cons 'checked (union 'checked checked))))) + +;; A development consumer interprets the selected declarative plan with Core Ops. +;; ASCENT remains the existing SDK engine; no runtime/store is implemented here. +(def (source-contract-test-support selected-plan-library evidence-library) + (.o + input: SourceContractInput. + plan-library: selected-plan-library + strategies: (.get selected-plan-library strategies) + run: contract-run + basis: contract-basis + scopes: contract-scopes + snapshot: contract-snapshot + current!: contract-current! + register!: contract-register! + record: contract-result-record + evidence: + (.o open-review: + (lambda (entry profile usage snapshot scopes) + (def session + (gerbil-ascent-open-session + (rule-module-program ((.get evidence-library make-evidence))))) + (gerbil-ascent-session-replace-sources! session + ((.get evidence-library sources) entry profile usage snapshot scopes)) + session)))) diff --git a/t/user-configuration-test.ss b/t/user-configuration-test.ss new file mode 100644 index 0000000..4622a21 --- /dev/null +++ b/t/user-configuration-test.ss @@ -0,0 +1,70 @@ +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later + +(import :std/test + :clan/poo/object + (only-in :clan/poo/mop validate TypeError?) + (only-in :yuanxu/configuration/json config-defaults) + (only-in "../library/source-contract-profiles/types.ss" ConfigType) + (prefix-in "../config.ss" defaults-) + (prefix-in "../examples/programs.ss" user-) + (only-in :std/source this-source-file) + (only-in :yuanxu/module-system/source/init module-init-intent)) +(export user-configuration-test) + +(def root (path-expand ".." (path-directory (this-source-file)))) +(def (example-intent name) + (def path (path-expand (string-append "t/support/" name "-modules.ss") root)) + (module-init-intent (call-with-input-file path read-all) path)) +(def (decisions intent disabled?) + (map (cut .get <> identity) + (filter (lambda (row) (eq? (.get row disabled?) disabled?)) + (.get intent decisions)))) + +(def user-configuration-test + (test-suite "Actual user declarations through native Yuanxu" + (test-case "maintained unified Config leaves both languages inactive" + (def configuration (validate ConfigType defaults-Config)) + (check-equal? (.get configuration programs deterministic-engineering languages c enable) #f) + (check-equal? (.get configuration programs deterministic-engineering languages cpp enable) #f)) + (test-case "actual Example recursively overrides language settings" + (def configuration (validate ConfigType (config-defaults defaults-Config user-Config))) + (check-equal? (.get configuration programs deterministic-engineering languages c enable) #t) + (check-equal? (.get configuration programs deterministic-engineering languages c settings timeout) 30) + (check-equal? (.get configuration programs deterministic-engineering languages cpp settings profile) 'lifetime-native) + (check-equal? (.get configuration programs deterministic-engineering languages cpp settings timeout) 20)) + (test-case "omitted siblings inherit and explicit false remains false" + (def supplied + (.o programs: (.o deterministic-engineering: + (.o languages: (.o c: (.o enable: #t settings: (.o timeout: 25))))))) + (def merged (validate ConfigType (config-defaults defaults-Config supplied))) + (check-equal? (.get merged programs deterministic-engineering languages c settings profile) 'capacity-body) + (check-equal? (.get merged programs deterministic-engineering languages c settings timeout) 25) + (check-equal? (.get merged programs deterministic-engineering languages cpp enable) #f) + (check-exception + (validate ConfigType + (config-defaults defaults-Config + (.o programs: (.o deterministic-engineering: + (.o languages: (.o c: (.o settings: (.o timout: 25)))))))) + TypeError?)) + (test-case "C/C++ internal selection selects assurance declarations and excludes application cases" + (def intent (example-intent "source-contract")) + (check-equal? (decisions intent #f) + '(source-contract-profiles)) + (check-equal? (decisions intent #t) + '(backpressure-tokio-rayon gateway-profiles)) + (check-equal? (map (cut .get <> mount) (.get intent windows)) '(Library)) + (check-equal? (.get (car (.get intent windows)) mode) 'auto) + (check-equal? (.get (car (.get intent windows)) profile) 'source-contract) + (check-equal? (andmap (cut .get <> disable-specified?) (.get intent decisions)) #t)) + (test-case "Rust internal selection has a different explicit selection over the same Library" + (def intent (example-intent "rust-backpressure")) + (check-equal? (decisions intent #f) '(backpressure-tokio-rayon)) + (check-equal? (decisions intent #t) '(source-contract-profiles gateway-profiles))) + (test-case "computed enable decisions are refused instead of evaluated" + (check-exception + (module-init-intent + '((yuanxu! mode: explicit + (source-contracts disable: (error "must not execute")))) + "init.ss") + error?)))) diff --git a/types.ss b/types.ss index eda9d52..a0eac22 100644 --- a/types.ss +++ b/types.ss @@ -1,11 +1,11 @@ -;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors -;;; -;;; SPDX-License-Identifier: LGPL-2.1-or-later +;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors +;; SPDX-License-Identifier: LGPL-2.1-or-later +;;; SPDX-FileCopyrightText: 2026 hardenedlinux Linux Team and Contributors ;;; Shared Library declaration vocabulary. Types only: no objects, IO or Engine. (import :clan/poo/object - (only-in :clan/poo/mop Type Type. define-type element? raise-type-error) + (only-in :clan/poo/mop Type Type. Object define-type element? raise-type-error) (only-in :clan/poo/type Symbol String List Record Pair Exactly) (only-in :clan/poo/recursive-validation close-validation closed? closed-ref) (only-in :clan/poo/object-contract ObjectContract. refine) @@ -27,6 +27,9 @@ LibrarySymbolPair LibrarySymbolTriple LibraryScopeBinding + LibraryRuleCatalogShape + LibraryCatalogConfigContract + library-catalog-scope-contract library-definition-contract LibraryScopeType.) (define-type @@ -44,6 +47,30 @@ (define-type LibraryScopeBinding (Pair Symbol (Pair Symbol (Pair LibraryNonemptyString (Exactly '()))))) +;; Shared domain Catalog publication; language drivers do not own domain meaning. +(def LibraryRuleCatalogShape + (.cc ObjectContract. 'identity 'library/rule-catalog + 'extra-fields 'delegate 'constraints (list Object) + 'responsibilities + (.o identity: Symbol + rules: (List LibrarySymbolTriple) + factor-implications: (List LibrarySymbolTriple) + dependencies: (List LibrarySymbolPair)))) +(def LibraryCatalogConfigContract + (.cc YuanxuContract. 'identity 'library/catalog-config + 'value-contract + (.cc ObjectContract. 'responsibilities (.o entry: LibraryRuleCatalogShape)))) +(def (library-catalog-scope-contract identity) + (.cc YuanxuContract. 'identity identity + 'value-contract + (refine + (.cc ObjectContract. 'extra-fields 'delegate 'constraints (list Object) 'responsibilities + (.o entry: LibraryRuleCatalogShape + config: (.get LibraryCatalogConfigContract value-contract))) + (lambda (value location) + (if (eq? (.get value entry) (.get value config entry)) '() + (list (.o kind: 'library/catalog-owner-mismatch path: location))))))) + (def (finite-type identity-values choices) (yuanxu-predicate-type identity-values (lambda (value) (and (memq value choices) #t)))) (def LibraryDefinitionRole