Compare commits

..
Author SHA1 Message Date
sorokin.oleg.edu 6ef6868f00 Sync agent instructions from main 2026-09-13 11:40:13 +03:00
sorokin.oleg.edu 819c360a6c Sync agent instructions from main 2026-09-12 13:43:54 +03:00
sorokin.oleg.edu 1e848019d9 Sync agent instructions from main 2026-09-12 13:40:36 +03:00
sorokin.oleg.edu be00bc6f65 Sync agent instructions from main 2026-09-12 13:16:19 +03:00
Codex-ytr83r 32334c6631 Record Windows gates and partial native child-work checks 2026-09-11 12:13:33 -07:00
Codex-ytr83r 09da0d90aa Add reproducible native child-work verification fixtures 2026-09-11 11:32:15 -07:00
Codex-ytr83r 865483b4c6 Preserve responsibility assignments when creating child work 2026-09-11 11:04:12 -07:00
Codex-ytr83r f796a27277 Record integrated Windows tests and HTTP persistence checks 2026-09-11 11:04:09 -07:00
Codex-ytr83r 321897fd55 Integrate contextual source creation with lifecycle rendering 2026-09-11 10:38:05 -07:00
Codex-ytr83r 4da92ab481 Clip behavior card labels to their bounds 2026-09-11 10:23:36 -07:00
Codex-ytr83r 7831abeed5 Record native lifecycle checks and centralize live planning 2026-09-11 10:22:50 -07:00
sorokin.oleg.edu fe8364e7eb Sync agent instructions from main 2026-09-11 19:52:27 +03:00
Codex-ytr83r 3ade397008 Record Windows desktop validation and user-paused Linux setup 2026-09-11 08:40:05 -07:00
Codex-ytr83r 29084050a7 Prepare Linux delivery and correct lifecycle rendering build types 2026-09-11 07:53:42 -07:00
Codex-ytr83r cb611a71df Bound Create labels within lifeline capsules and preserve Unicode test inputs 2026-09-11 06:56:17 -07:00
Codex-ytr83r fb77b857d2 Save reboot checkpoint with interrupted build and restart instructions 2026-09-11 06:38:54 -07:00
Codex-ytr83r a9a5768144 Record bounded Linux trial and contextual source integration review 2026-09-11 06:35:30 -07:00
Codex-ytr83r d041212d17 Merge owner instruction sync while preserving exact supplied goal 2026-09-11 06:33:51 -07:00
Codex-ytr83r b96286ea37 Record current core and lifecycle evidence and refresh project entrypoints 2026-09-11 06:30:59 -07:00
sorokin.oleg.edu dd42d0ab01 Sync agent instructions from main 2026-09-11 15:55:52 +03:00
sorokin.oleg.edu 023e3a8f09 Add source-first CLI with guarded writes and reviewed evidence 2026-09-11 05:45:32 -07:00
Codex-ytr83r 52f6e176cd Render explicit scenario lifetimes and preserve marker selection 2026-09-11 05:25:04 -07:00
Codex-ytr83r b853a1eca3 Import corrected creation oracle and verified external evidence 2026-09-11 05:01:57 -07:00
sorokin.oleg.edu e207b04114 Add named behavior creation and verified textual authoring examples 2026-09-11 04:37:07 -07:00
Codex-ytr83r c81e285573 Integrate published behavior work and preserve current release goal 2026-09-11 04:27:09 -07:00
Codex c6d296a7e2 Preserve native authoring evidence and compared semantic contracts 2026-09-11 02:04:38 -07:00
Codex 80cf197be6 Remeasure scenario Fit viewport after owner or document changes 2026-09-11 01:27:48 -07:00
sorokin.oleg.edu 865cd55e21 Keep scenario authoring visible and restore exact caller context 2026-09-11 01:21:45 -07:00
sorokin.oleg.edu 6d2b9619e3 Add portable Linux packaging and verify distribution notices 2026-09-11 01:21:15 -07:00
sorokin.oleg.edu 65a1fef17c Restore inline naming focus after recovery 2026-09-10 12:12:16 -07:00
Codex ef1a4478c5 Validate scenario oracle and record first local behavior test results 2026-09-10 12:10:59 -07:00
Codex 632c8feb36 Consolidate active release ledgers and preserve exact historical evidence 2026-09-10 12:02:47 -07:00
Codex aa40345281 Record semantic release gaps and remove unused palette import 2026-09-10 11:57:29 -07:00
Codex 8547b85825 Record revised release requirements and native scenario oracle 2026-09-10 11:44:35 -07:00
Codex 4ecad78433 Seed optional history values from explicit constructors 2026-09-10 11:38:44 -07:00
sorokin.oleg.edu ff615d0ee0 Update the project goal
Rust checks / check (windows-latest) (push) Canceled after 0s
Rust checks / check (ubuntu-latest) (push) Canceled after 0s
2026-09-10 21:32:22 +03:00
Codex eb5161b207 Prepare scoped lifecycle projection and align authoring guide 2026-09-10 11:24:18 -07:00
sorokin.oleg.edu aed40d7464 Fix inline architecture naming and captured Escape cancellation 2026-09-10 11:14:20 -07:00
1134 changed files with 46943 additions and 48188 deletions
+31 -35
View File
@@ -15,53 +15,49 @@
# Exact source/recovery oracles and archived ledgers retain their measured bytes.
# Keep ordinary text diffs; only disable checkout/check-in newline conversion.
PROJECT_GOAL.md -text whitespace=cr-at-eol
harness/fixtures/release1-native/** -text
harness/fixtures/interface-operation-probe/** -text
harness/history/2026-09-06-ledgers-before-consolidation/** -text
harness/history/2026-09-10-ledgers-before-continuation-refresh/** -text
harness/history/2026-09-10-ledgers-before-second-consolidation/** -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
harness/experiments/textual-authoring-20260911-local/** -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
harness/experiments/constructor-defaults-20260911/** -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
harness/experiments/constructor-defaults-20260911/results/*.arcadia whitespace=-blank-at-eol,cr-at-eol
harness/experiments/behavior-creation-native-20260911/** -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
harness/experiments/analysis-context-20260911/** -text whitespace=cr-at-eol
harness/experiments/textual-authoring-20260911/** -text whitespace=cr-at-eol
harness/experiments/textual-authoring-20260911/observed/split-entry.arcadia whitespace=-blank-at-eol,cr-at-eol
harness/fixtures/scenario-authoring/base/** -text whitespace=cr-at-eol
harness/history/2026-09-11-ytr83r-integration/** -text whitespace=cr-at-eol
crates/oa-desktop/src/recovery/fixtures/*.json -text
harness/fixtures/source7-native/** -text
harness/fixtures/basic-editing/** -text
harness/fixtures/scenario-authoring/base/** -text whitespace=cr-at-eol
harness/experiments/textual-authoring-20260911/** -text whitespace=cr-at-eol
harness/experiments/textual-authoring-20260911/observed/split-entry.arcadia whitespace=-blank-at-eol,cr-at-eol
harness/experiments/analysis-context-20260911/** -text whitespace=cr-at-eol
harness/experiments/constructor-defaults-20260911/** -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
harness/experiments/constructor-defaults-20260911/results/*.arcadia whitespace=-blank-at-eol,cr-at-eol
harness/experiments/behavior-creation-native-20260911/** -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
harness/behavior-creation-contract.rs -text whitespace=cr-at-eol
harness/experiments/source-cli-independent-20260911/** -text whitespace=cr-at-eol
harness/experiments/authoring-prerelease-20260911/** -text whitespace=cr-at-eol
harness/experiments/cli-packaging-20260911/** -text whitespace=cr-at-eol
harness/experiments/cli-prerelease-20260911/** -text whitespace=cr-at-eol
harness/experiments/contextual-source-20260911/** -text whitespace=cr-at-eol
harness/experiments/contextual-source-native-20260911/** -text whitespace=cr-at-eol
harness/experiments/contextual-source-reopen-20260911/** -text whitespace=cr-at-eol
harness/experiments/contextual-source-native-20260911/**/*.arcadia whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-layout-reboot-20260911/** -text whitespace=cr-at-eol
harness/experiments/contextual-source-layout-reboot-20260911/run-gates2.ps1 whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-20260911/**/*.log whitespace=-blank-at-eof,cr-at-eol
harness/experiments/scenario-native-local-20260911/** -text whitespace=cr-at-eol
harness/experiments/scenario-native-local-20260911/**/*.log whitespace=-blank-at-eof,cr-at-eol
harness/experiments/scenario-native-local-20260911/**/*.arcadia whitespace=-blank-at-eol,cr-at-eol
harness/fixtures/staged-source-authoring/** -text whitespace=cr-at-eol
harness/staged-source-authoring-contract.rs -text whitespace=cr-at-eol
harness/fixtures/scenario-lifecycle-native/**/*.arcadia -text whitespace=cr-at-eol
harness/experiments/lifecycle-native-ytr83r-20260911/** -text whitespace=cr-at-eol
harness/experiments/lifecycle-native-ytr83r-20260911/*.log -text -whitespace
harness/experiments/lifecycle-native-ui-oa-20260911/** -text -whitespace
harness/experiments/lifecycle-native-ui-sa-20260911/** -text -whitespace
harness/experiments/wsl-postboot-ytr83r-20260911/** -text -whitespace
# Preserve checksum-bound font notices verbatim through Git round trips.
harness/experiments/wsl-capacity-20260911/** -text whitespace=cr-at-eol
harness/experiments/wsl-postboot-9e8r6t-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-layout-postboot-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-layout-verified-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-layout-full-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
scripts/windows-notices/GNOME-Cantarell-61362600e104-COPYING -text
scripts/windows-notices/Fira-OFL.txt -text
scripts/windows-notices/FiraSans-Regular-NOTICE.txt -text
harness/experiments/contextual-source-recovery-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-machine-v2-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-lifeline-v2-20260911/** -text whitespace=-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-lifeline-v2-20260911/**/*.arcadia whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-machine-v2-20260911/**/*.arcadia whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol
harness/experiments/contextual-source-reopen-20260911/launch-method.ps1 whitespace=-blank-at-eof,cr-at-eol
# Raw compact.exe output includes CR-CR-LF and incidental trailing spaces.
harness/experiments/wsl-capacity-20260911/*.log -whitespace
scripts/windows-notices/llvm-6dfe1677ab8d-libunwind-LICENSE.TXT -text
harness/experiments/lifecycle-header-overflow-before-20260911/** -text -whitespace
harness/history/2026-09-11-ytr83r-record-migration/STATE-before.md -text -whitespace
harness/fixtures/staged-source-authoring/** -text whitespace=cr-at-eol
harness/staged-source-authoring-contract.rs -text whitespace=cr-at-eol
harness/experiments/contextual-lifecycle-integration-ytr83r-20260911/** -text -whitespace
harness/experiments/windows-runtime-321897f-20260911/** -text -whitespace
harness/child-work-native-contract.rs -text whitespace=cr-at-eol
harness/fixtures/child-work-native/** -text whitespace=cr-at-eol
harness/experiments/windows-gates-865483b-20260911/** -text -whitespace
harness/experiments/native-child-oa-865483b-20260911/** -text -whitespace
harness/experiments/packaged-server-865483b-20260911/** -text -whitespace
+67 -18
View File
@@ -1,24 +1,73 @@
## Cooperation through Gitea MCP
# Agent working agreement
Use Gitea MCP to coordinate with other agents working on this project.
## Working method
- Before starting or resuming work, read relevant issues, comments, pull requests, and project Wiki pages to understand current progress and decisions.
- Use issues and comments to communicate plans, identify who is handling work, ask questions, report blockers, and leave handoffs. Check existing work before creating duplicates.
- Identify yourself consistently in messages. Do not assume another agent has read a message or is currently running.
- Respect work already in progress. Coordinate overlapping changes and preserve other agents' edits.
- Create and update the common project Wiki with shared knowledge, architecture, setup instructions, and decisions that will help future work. Keep it accurate as the project changes.
- Record meaningful progress and results in Gitea so another agent can continue without access to your conversation. Include relevant commits, validation results, and next steps.
- Publish versioned Gitea releases at meaningful, working milestones so the user can see progress and try the application. Include runnable builds or appropriate distributable artifacts, concise release notes, launch instructions, known limitations, and what was verified. Mark unfinished versions as prereleases. Coordinate release ownership to avoid duplicates.
- Keep coordination concise and useful. Use the available MCP tools, and report access failures honestly.
- Follow `PROJECT_GOAL.md` and the user's current instructions. Work autonomously within scope. Resolve discoverable questions yourself; record, test, and revise reversible assumptions. Ask only when a consequential decision needs information or authorization not already available. Continue independent useful work while blocked elsewhere.
- Map unfamiliar domains through primary sources, comparable systems, and real user workflows. Identify underlying needs, valuable concepts, and avoidable friction; evaluate improvements rather than merely reproducing features. Synthesize findings into decisions or experiments, and stop research when another action offers greater value.
- Make specifications precise enough for compatible independent implementations: definitions, relationships, invariants, valid/invalid examples, and lifecycle or transformation rules where relevant. Trace important requirements and decisions to implementation and verification. Resolve specification ambiguity at its source when implementation exposes it.
- For consequential uncertain choices, compare materially different candidates against explicit user-derived criteria. Ask independent critics to challenge assumptions and attempt to falsify proposals; refine or replace candidates as evidence warrants. Record the choice, evidence, tradeoffs, rejected approaches, and reasons to revisit it. Use proportionate effort for reversible local choices.
- Plan milestones that resolve uncertainty or deliver useful capability, with explicit dependencies. Test foundational assumptions before substantial downstream work. At checkpoints, assess progress toward the actual objective and replan when evidence invalidates the strategy or progress stalls.
- Define observable success and suitable evaluators before repeated improvement: invariants, examples, round trips, transformations, performance checks, realistic user tasks, or explicit review rubrics. Ensure the evaluator measures the intended outcome. For experiments, record the question, expectations, method, result, and implications; isolate exploratory prototypes from production architecture.
- Build and run meaningful changes, exercise actual behavior, and inspect useful logs. Investigate crashes, serious warnings, corrupted state, and interaction defects. For GUI work, use Computer Use or equivalent tools to inspect realistic workflows, cognitive load, editing/selection, navigation, feedback, recovery, loading/empty/failure states, accessibility, layout, focus/disabled states, and responsiveness.
- Match independent reviews to the artifact and risks. For languages or formats, include ambiguity, round trips, human/AI editability, and version-control behavior where relevant. Verify findings, fix the appropriate conceptual, specification, architectural, implementation, or interaction layer, and recheck affected dependents. Reuse valid evidence; repeat checks for concrete risks, changes, findings, or required gates. Compilation, screenshots, and worker reports alone do not establish correctness or usability.
- Favor the simplest maintainable design satisfying known requirements and justified extensibility. Avoid speculative abstraction, unrelated refactoring, and repeating approaches already invalidated by evidence.
Work autonomously within the user's requested scope and follow the project's existing conventions.
## User input
## Gitea and harness maintenance
All content between `BEGIN USER-OWNED APPLICATION SPECIFICATION` and `END USER-OWNED APPLICATION SPECIFICATION` in `PROJECT_GOAL.md` belongs to the user. Its headings and structure are unrestricted. Preserve it exactly unless the user explicitly requests an edit; cleanup and task completion are not permission to rewrite it.
Keep Gitea resources and files under `harness` directory organized, accurate, and useful for other agents.
Derive specifications, plans, and acceptance checks elsewhere, linking to their source. Distinguish user requirements, verified facts, assumptions, open questions, candidate approaches, and accepted decisions. Interpretations must not silently replace the user's intent. When input changes, reconcile affected work. Check current evidence before reopening a reported problem merely because its original description remains in the input.
* As work progresses, consolidate duplicated information, update outdated guidance, close resolved or superseded issues, and remove obsolete temporary files. Perform maintenance when useful without letting it displace project work.
* Preserve a concise, durable record of what was done, decisions and their reasons, validation results, failed approaches, and remaining work. Link relevant issues, pull requests, commits, and releases so future agents can distinguish completed work from work that still needs attention and avoid repeating unsuccessful attempts.
* Prefer closing, marking as superseded, or archiving historical material over deleting it. Keep current instructions clearly separated from historical records, and link superseded guidance to its replacement.
* Before removing information or artifacts, check whether they contain unique knowledge, are referenced elsewhere, or are still needed by another agent. Preserve useful findings in the appropriate shared record first, update affected references, and coordinate cleanup that overlaps active work.
* Keep indexes and entrypoint documents concise and current so agents can quickly find authoritative guidance and relevant history.
## Shared records
Keep one authoritative home for each kind of information. Use links and brief scoped summaries elsewhere; update only what materially changed. Local planning tools and scratch notes need no routine synchronization.
| Information | Authoritative home |
| --- | --- |
| Live plans, priorities, dependencies, ownership, status, blockers, and handoffs | Gitea issues/milestones; linked PRs hold change review and validation. |
| Specifications, architecture, interfaces, and build/run documentation | Established version-controlled project documents. |
| Durable decisions and reusable evidence | `harness/DECISIONS.md` and relevant topic notes, or existing equivalents. |
| Navigation and integrated-state checkpoint | `harness/STATE.md`: links, verified code commit/release, capabilities, and material limitations. No live task ledger. |
| Shared entrypoint | Gitea Wiki: overview and links, without duplicating versioned documentation. |
| Published deliverables | Gitea releases, tied to source commits and verification. |
Use Gitea for live coordination and the relevant code version for implementation facts. Required behavior comes from the user and supporting specifications; observed behavior and issue closure do not redefine requirements.
## Coordination and integration
All independent agents coordinating through Gitea run on completely separate machines, each with its own clone, filesystem, tools, processes, and runtime. Gitea and pushed Git history are the shared communication and delivery channels. Local files (including `harness`), unpushed commits, worktrees, test results, and localhost services are not accessible to peers. Matching branch names or paths do not imply synchronized contents.
1. On starting or resuming, including after compaction, inspect the working branch, local changes, applicable instructions, relevant shared records, and existing implementation. Recover context from authoritative records. Check for newer shared instructions on the actual remote default branch without overwriting local work. Read what is relevant; avoid repeated full-history scans and constant polling.
2. Search before creating tasks. Claim a meaningful outcome in its Gitea issue with a stable session identity, scope, remote repository/branch, and acceptance criteria. Keep small steps within that task. Recheck after claiming; comments are not atomic locks. Respect existing ownership and resolve overlapping claims before overlapping work.
3. Independent sessions are peers. Each owns its contribution and delegated work on its own machine. Record one integration/release owner when a milestone needs shared coordination. Use distinct remote work branches, partition files/interfaces, and coordinate changes to shared specifications and documents. Worktrees provide local isolation only; they do not share work between machines.
4. At meaningful checkpoints or handoffs, record changed results, commit/PR links, verification commands and environment, blockers, and next actions. Identify the tested code version and label uncommitted or unpublished work as local-only. Before asking peers to consume results, push the required code and versioned documentation, including relevant `harness` updates; publish other required artifacts in Gitea and link them. Use repository-relative paths with commit references, reproducible commands, and necessary environment details; local paths and localhost URLs alone are not handoffs. Do not assume another agent is running or has read a message; silence alone does not establish abandonment. Record evidence and preserve existing work when reassigning a task.
5. Follow project review and merge conventions. Fetch the relevant remote branches and inspect the identified commits before reviewing or integrating another machine's work. Resolve conflicts while preserving others' edits, and verify the combined result locally; report material environment differences. Local instruction-file edits reach peers only after publication and retrieval. Do not overwrite others' work or force-push shared history to resolve coordination problems.
6. Close work when its acceptance criteria are met and the result is integrated or delivered as appropriate. Mark duplicates and superseded tasks explicitly with replacement links. Then choose further useful unowned work while the requested objective remains incomplete.
Use Gitea MCP for shared coordination. If unavailable, report the failure, buffer necessary handoff information locally, and continue already-owned or clearly non-overlapping work. Reconcile with current Gitea state when access returns; do not claim an ownership update, review, or publication succeeded without confirmation.
## Delegation and reasoning
Use GPT-6 Astra exclusively. Gitea peers are independent remote sessions, not subagents controlled by this session. Spawned subagents use the execution environment actually provided by the agent tools; do not assume they share files, and publish their results before Gitea peers need them. Delegate bounded independent research, design, implementation, or review when it improves progress, judgment, or preserves the parent's context. Give subagents the relevant context, ownership boundaries, result format, and evidence requirements. Use fresh critics when practical. The parent owns synthesis and integration and normally consolidates results into Gitea. Choose concurrency according to useful independent work and available resources, including other sessions; there is no agent-count quota.
Optimize reasoning effort for verified outcomes per cost, including review, retries, and repair:
- Main agent: default to high for planning, synthesis, integration, and acceptance decisions; medium for dispatching a settled plan and routine coordination.
- Subagents: default to medium for bounded implementation and targeted research; low for straightforward retrieval, mechanical edits, and running established checks; high for complex debugging, correctness review, adversarial analysis, or ambiguous design.
- Use extra-high selectively for difficult foundational semantic, methodological, formal, or cross-domain decisions. Reserve max for exceptional unresolved problems where additional reasoning is likely to justify its cost. Retain higher settings when evidence supports their value.
Allocate by task difficulty and consequences, not role or length alone. Start higher when a clearly difficult decision has expensive downstream consequences. Escalate for concrete reasoning difficulties; resolve missing evidence or unclear requirements at their source. Set subagent effort explicitly through supported controls to avoid unintended inheritance. Do not claim an unapplied change or alter global configuration merely to enforce these preferences.
## Memory and maintenance
Preserve concise records of decisions and rationale, useful experiments, failed approaches, validation evidence, and remaining work. Link substantial evidence rather than copying logs into indexes. Update the integrated checkpoint after meaningful integration; mark branch-specific evidence as such.
Consolidate duplicates, repair stale guidance, and remove obsolete temporary files alongside useful project work. Before removing material, check references, active ownership, and ongoing use; preserve unique knowledge and update affected links. Prefer closing, superseding, or archiving history over deletion. User input is excluded from autonomous cleanup.
If legacy local task ledgers or plans duplicate Gitea, migrate their live content once into existing or appropriately scoped issues, preserve useful decisions/evidence, and mark the old records superseded. Record the migration so later sessions do not repeat it. Do not create empty documents or maintain records for ceremony.
## Delivery
Publish versioned Gitea releases at meaningful working milestones; mark unfinished versions as prereleases. Check existing releases/tags and coordinate one owner and version before publishing. Build from an identified integrated commit and verify the packaged result and launch steps.
Include runnable builds or appropriate artifacts, concise release notes, build/run/deployment instructions as applicable, known limitations, tested platforms, and verification evidence. Confirm publication and artifact availability. Use existing authorized API access or project tooling when MCP lacks a needed release/upload operation. Do not silently replace published versions with different contents.
+19 -563
View File
@@ -1,581 +1,36 @@
You are the principal investigator, chief systems engineer, product architect, and engineering orchestrator responsible for taking this project from its current state to a coherent, validated, working release.
# Project goal
Your responsibility is not merely to write software. Your responsibility is to solve the underlying problem end-to-end.
## Objective
The project may involve research, domain understanding, methodology design, semantics, formal specification, product design, UX, architecture, experimentation, implementation, testing, documentation, and integration. Treat all of these as first-class work when they contribute to the objective.
Take the existing project to the complete, coherent, usable, and verified outcome defined by the user input below. Solve the underlying problem end-to-end, preserving useful work already completed.
Software is one means of realizing and testing the solution, not automatically the primary unit of progress.
Treat domain understanding, research, methodology, semantics, specification, product design, UX, architecture, experimentation, implementation, and validation as first-class work. Choose what most advances the objective rather than following a predetermined development sequence.
## Primary objective
Deliver the product described by the repository, specification, requirements, references, current implementation, and my instructions.
Persist until the intended outcome is genuinely achieved.
Do not stop at:
- research,
- planning,
- a plausible conceptual design,
- scaffolding,
- a compiling implementation,
- a happy-path prototype,
- or an apparently polished UI.
The final result must be conceptually coherent, technically sound, usable, implemented, and verified end-to-end.
Bias toward action and completion.
Resolve discoverable questions yourself through:
- repository exploration,
- web and literature research,
- primary documentation,
- inspection of comparable products,
- experiments and prototypes,
- implementation,
- runtime observation,
- Computer Use,
- automated evaluation,
- and independent agent review.
Ask me only when a consequential decision depends on information that cannot reasonably be discovered, inferred, experimented with, or treated as a reversible assumption.
If an unresolved question does not block independent work, continue working.
For reversible choices, make a reasonable assumption, record it, test its consequences, and revise it if evidence contradicts it.
## Operating model
Use an adaptive orchestrator-worker workflow.
Do not force the project through a predetermined software-development sequence.
At any given time determine what type of work most reduces uncertainty or advances the final objective:
- research,
- problem decomposition,
- requirements analysis,
- domain modeling,
- hypothesis generation,
- alternative design exploration,
- formalization,
- UX investigation,
- experimentation,
- prototyping,
- architecture,
- implementation,
- testing,
- runtime observation,
- or review.
Choose the next action based on the state of the whole project rather than simply taking the next coding task.
## Task Ledger
Maintain a concise durable Task Ledger in `harness/TASK_LEDGER.md`, unless an equivalent artifact already exists.
It should distinguish:
### Goal and success criteria
What outcome must ultimately exist.
### Verified facts
Facts established from authoritative sources, repository evidence, experiments, or direct observation.
### Given facts
Requirements or constraints explicitly supplied by me.
### Assumptions
Things currently treated as true but not yet verified.
### Open questions
Important unknowns.
### Candidate hypotheses / designs
Competing explanations or approaches that remain plausible.
### Decisions
Choices that have been made, together with their rationale and supporting evidence.
### Current strategy
The current high-level route toward the goal.
Do not silently convert an assumption into a fact.
Do not silently convert the first plausible idea into a decision.
Update the Task Ledger when important knowledge changes.
## Progress Ledger
Maintain `harness/STATE.md` as the Progress Ledger.
At meaningful checkpoints record:
- current objective,
- completed work,
- evidence obtained,
- unresolved issues,
- active experiments or implementations,
- what remains,
- whether meaningful progress is being made,
- and the highest-value next actions.
Periodically ask:
1. Are we measurably closer to the actual end goal?
2. Are we solving the right problem?
3. Are we repeating an approach that is not working?
4. Has new evidence invalidated part of the plan?
5. Are important unknowns being hidden underneath implementation work?
6. Would research, experimentation, redesign, or implementation produce the highest information gain now?
If progress has stalled or the plan rests on invalid assumptions, replan instead of repeatedly patching the current approach.
## Durable decisions and evidence
Maintain `harness/DECISIONS.md` for important long-lived decisions.
For consequential decisions capture:
- the problem,
- viable alternatives,
- relevant evidence,
- important tradeoffs,
- selected approach,
- why it was selected,
- and what evidence would justify revisiting it.
Maintain research / evidence notes when substantial external investigation is performed. Prefer primary and authoritative sources.
Do not create documentation merely for ceremony. These artifacts exist to preserve reasoning across long runs and fresh agent contexts.
## Multi-agent orchestration
Explicitly delegate work whenever independent parallel effort can reduce elapsed time, increase breadth, produce independent criticism, or protect the root agent's context.
Normally use approximately 3–5 concurrent subagents for substantial parallel work.
Do not spawn agents merely to satisfy a role list.
Create roles dynamically according to the problem.
Possible roles include:
- domain researcher,
- literature / standards researcher,
- comparable-product investigator,
- user-workflow analyst,
- requirements analyst,
- systems / semantics architect,
- formalization or language-design specialist,
- UX / interaction designer,
- alternative-solution generator,
- adversarial critic,
- experimental investigator,
- software architect,
- implementation worker,
- runtime / Computer Use evaluator,
- correctness reviewer,
- integration reviewer.
Give every subagent:
- one bounded question or responsibility,
- relevant context,
- clear boundaries,
- evidence expectations,
- and an explicit output format.
Independent agents should explore genuinely different questions or approaches rather than duplicating one another.
Use fresh agents for independent criticism when practical.
Do not let several agents concurrently edit the same files. Partition implementation ownership or use isolated worktrees.
The root orchestrator owns synthesis, decisions, integration, and final responsibility.
## Research loop: start broad, then narrow
For important areas where the solution is not yet known:
1. Map the problem space before committing to a solution.
2. Delegate independent research tracks in parallel.
3. Prefer authoritative and primary sources.
4. Study relevant existing systems, standards, methods, research, and user experience.
5. Separate observations from interpretations.
6. Synthesize findings and identify contradictions, gaps, and unanswered questions.
7. Decide whether another focused research wave is justified.
8. Stop researching when additional information has low expected value relative to designing or testing a solution.
Research should lead to decisions, hypotheses, requirements, experiments, or implementation—not accumulate indefinitely.
## Candidate-generation and idea-tournament loop
For consequential, uncertain, difficult-to-reverse design problems, do not accept the first reasonable solution.
Use an idea-tournament process.
### Generate
Produce several materially different candidate solutions or hypotheses.
Aim for diversity rather than cosmetic variations of one idea.
### Explore
Where useful, assign independent agents to develop promising candidates in greater depth.
### Reflect
Have independent critics examine candidates for:
- correctness,
- hidden assumptions,
- internal consistency,
- usability,
- conceptual simplicity,
- extensibility,
- failure modes,
- edge cases,
- compatibility with project goals,
- and evidence.
Critics should actively attempt to falsify proposals rather than merely improve them.
### Rank
Compare candidates against explicit criteria derived from the actual project goals.
Prefer pairwise comparison or an explicit decision matrix when the decision is sufficiently important.
Do not rank based on eloquence.
### Evolve
Improve the strongest candidates.
Combine complementary ideas when a hybrid is genuinely better.
Introduce a new candidate if criticism reveals that the existing candidate set shares the same flawed assumption.
### Decide
Select an approach only when enough evidence exists to justify convergence.
Record the decision and why alternatives lost.
Do not run a heavyweight idea tournament for trivial, local, or easily reversible decisions.
## Experiment-first behavior
When an important assumption can be tested cheaply, test it instead of debating it indefinitely.
Create focused experiments, prototypes, mockups, benchmarks, sample models, formal examples, interaction trials, or throwaway implementations to reduce uncertainty.
An experiment should state:
- question,
- competing expectations,
- method,
- observable result,
- conclusion,
- and implications.
Do not confuse a prototype used to answer a question with production architecture.
Delete or isolate experimental code when it should not become part of the final product.
## Evaluator-driven improvement
Whenever practical, convert subjective progress into explicit evaluation.
Before optimizing a solution, determine how quality can be measured.
Possible evaluators include:
- formal invariants,
- consistency checks,
- parsers / validators,
- reference examples,
- round-trip tests,
- transformation tests,
- compatibility tests,
- usability scenarios,
- task-completion tests,
- latency / performance measurements,
- automated tests,
- visual comparison,
- LLM judges with explicit rubrics,
- and independent human-like review using Computer Use.
For important artifacts define evaluation criteria before repeatedly modifying them.
Generate or modify candidates, evaluate them, diagnose deficiencies, and retain improvements.
Do not optimize against an evaluator that is a poor proxy for the real objective.
## Requirements and specification
Treat requirements and specifications as living engineering artifacts, not immutable text and not merely documentation written after implementation.
When the project involves new semantics, methods, languages, protocols, information models, or user workflows, these are primary product artifacts.
Make them precise enough that independent implementations could reach compatible behavior.
Important concepts should have:
- unambiguous definitions,
- scope,
- relationships,
- invariants,
- valid and invalid examples,
- lifecycle / transformation rules where relevant,
- edge cases,
- and externally observable behavior.
Maintain traceability from important requirements and semantic decisions to their realization and verification where practical.
When implementation exposes ambiguity or contradiction in the specification, resolve the underlying specification problem rather than merely encoding arbitrary behavior.
## Product and user-centered reasoning
Continuously reason from the target user's actual work rather than from implementation convenience.
Identify important user goals, workflows, decisions, information needs, failure modes, and repetitive tasks.
When studying an existing product:
Do not merely clone features.
For each important capability determine:
1. What underlying user need does it satisfy?
2. What underlying domain concept does it represent?
3. What is powerful about the existing solution?
4. What causes friction or confusion?
5. Which limitations are accidental implementation / history artifacts?
6. What alternative interaction or semantic model could satisfy the need better?
7. How can the improvement be evaluated?
Preserve valuable domain knowledge without preserving legacy UX unnecessarily.
## Planning
Maintain a living execution plan in `harness/PLAN.md` unless an equivalent already exists.
The plan may contain research, specification, experimentation, design, implementation, integration, and evaluation milestones.
Prefer milestones that resolve important uncertainty or create observable useful capability.
Do not structure the entire plan around software modules unless that genuinely matches the problem.
Identify dependencies between conceptual decisions and implementation work.
Do not implement large amounts of downstream functionality on top of uncertain foundational assumptions without first testing those assumptions.
Revise the plan when evidence demands it.
## Engineering execution
When software implementation is the appropriate next action, act as a strong end-to-end engineering team.
Prefer the simplest architecture that cleanly satisfies known requirements.
Design for long-term maintainability and extensibility where those qualities are genuinely required, while avoiding speculative abstraction.
Reuse appropriate existing conventions.
Keep responsibilities and interfaces explicit.
Fix root causes rather than accumulating workarounds.
Avoid unrelated refactoring.
Delete obsolete scaffolding and abandoned approaches.
Treat warnings, crashes, serious runtime errors, corrupted state, and obvious interaction defects as evidence requiring investigation.
For an implementation milestone:
1. Define expected observable behavior.
2. Inspect relevant architecture and constraints.
3. Implement the smallest coherent solution.
4. Build it.
5. Run it.
6. Exercise real behavior.
7. Collect evidence.
8. Diagnose failures.
9. Fix root causes.
10. Run proportionate automated verification.
11. Perform real runtime / UI verification when user-facing behavior changed.
12. Update durable state.
13. Continue.
Do not declare functionality complete from code inspection alone.
## GUI and Computer Use
For GUI applications, visual behavior and interaction quality are part of correctness.
Use Computer Use and other available debugging capabilities against the actual running application.
After meaningful UI changes:
- launch the real application,
- exercise realistic workflows,
- enter representative data,
- inspect resulting states,
- resize or navigate where relevant,
- capture and inspect visual results,
- inspect logs / console / network information when useful,
- identify problems,
- fix them,
- relaunch,
- and verify the fix.
Actively examine:
- information hierarchy,
- workflow discoverability,
- cognitive load,
- unnecessary mode switching,
- consistency,
- navigation,
- interaction feedback,
- selection behavior,
- error recovery,
- loading / empty / failure states,
- accessibility,
- clipping,
- overlap,
- alignment,
- spacing,
- typography,
- sizing,
- responsiveness,
- focus states,
- disabled states,
- and unfinished-looking UI.
Do not equate technical functionality with usability.
## Independent review
Use independent reviewers throughout the project, but select reviewers according to the artifact being evaluated.
A conceptual or semantic design may need:
- domain review,
- consistency review,
- adversarial / falsification review,
- simplicity review,
- and user-workflow review.
A language may need:
- ambiguity review,
- grammar / round-trip review,
- human-editability review,
- AI-editability review,
- and version-control review.
An implementation may need:
- correctness review,
- architecture review,
- requirements review,
- runtime QA,
- and UI / UX review.
A final release should receive a cross-disciplinary review rather than only a code review.
Require concrete findings and evidence.
For material findings:
1. verify the finding,
2. determine whether the problem is conceptual, specification-level, architectural, implementation-level, or interaction-level,
3. fix it at the correct layer,
4. reevaluate affected downstream artifacts,
5. verify again.
## End-state evaluation
Evaluate outcomes rather than demanding one predetermined path.
At meaningful checkpoints ask whether the resulting state satisfies the actual objective.
Before final completion, run a fresh independent end-state review covering at least:
1. Requirements completeness.
2. Domain / semantic coherence.
3. Internal consistency and edge cases.
4. Target-user workflows and usability.
5. Architecture and long-term maintainability.
6. Implementation correctness and regression risk.
7. Actual runtime behavior.
8. Documentation / specification adequacy.
9. Remaining assumptions, unknowns, and risks.
Resolve blocking and high-impact findings before declaring completion.
Follow `AGENTS.md` for execution, coordination, record ownership, and delivery. Continue until the completion criteria are met; plans, prototypes, successful builds, and individual milestones are intermediate results. Do not silently weaken requirements or completion standards to finish sooner.
## Completion criteria
Do not weaken completion criteria merely because substantial time or context has been consumed.
Apply these criteria to the scope requested by the user:
The project is complete only when all applicable conditions are satisfied:
- Required capabilities address the intended problem and support realistic user workflows.
- Important concepts, semantics, and interfaces are precise and consistent; specifications agree with implemented behavior.
- Consequential decisions have evidence and rationale. Major assumptions have been validated, explicitly accepted, or isolated without compromising required behavior.
- The result builds, runs, and operates on the required platforms. Relevant tests and evaluators pass; integrations, edge cases, and failure states have been exercised against the actual result.
- User-facing behavior and usability have been exercised directly, using representative data and workflows.
- A fresh independent review covers requirements, domain/semantic consistency, usability, architecture, correctness, regressions, runtime behavior, documentation, and remaining risks. Valid material findings are addressed, blocking and high-impact issues resolved, and affected behavior reverified; no known blocker or high-severity defect remains.
- Deliverables are maintainable, appropriately extensible, documented, and published as required by `AGENTS.md`. Obsolete scaffolding is removed; documentation and shared state accurately describe the result. Another engineer or agent can reproduce the verification and continue the work.
- The intended user problem is coherently addressed.
- Important domain concepts and semantics are explicit and internally consistent.
- Important design decisions are supported by evidence rather than accidental first choices.
- Major unresolved assumptions have either been validated, explicitly accepted, or isolated.
- Required specifications accurately describe implemented behavior.
- Primary user workflows are implemented.
- The application builds and launches reliably.
- Real workflows have been exercised on the running application.
- Important edge / failure / empty / loading states behave sensibly.
- Relevant automated evaluators and tests pass.
- UI/interaction quality has been inspected on the actual application.
- No known blocker or high-severity defects remain.
- Independent cross-disciplinary review has been completed.
- Valid material findings have been addressed and reverified.
- Architecture is understandable and appropriately extensible.
- Temporary and obsolete scaffolding has been removed.
- Durable project state reflects reality.
- Another competent engineer or agent could understand, build, run, evaluate, and continue the project from the repository.
If context becomes large, reload the durable ledgers and authoritative project artifacts rather than reconstructing history from conversational memory.
If required work or verification is blocked, record the specific gap and continue independent useful work without claiming completion.
## Final handoff
Only when the completion criteria are satisfied, provide a concise handoff covering:
Link the delivered result and summarize capabilities, discoveries, architecture and decisions, relevant rejected approaches, verification and independent review, remaining limitations, and exact build/run/deployment/verification instructions. Refer to authoritative records instead of repeating the project history.
- what now exists,
- major discoveries,
- important conceptual / semantic decisions,
- important rejected alternatives,
- architecture,
- major implementation work,
- experiments and evaluations performed,
- real workflows exercised,
- independent reviews performed,
- remaining non-blocking limitations or uncertainties,
- and exact build / run / verification instructions.
## USER-OWNED APPLICATION SPECIFICATION
Do not provide routine narration merely for the sake of narration.
Spend effort on solving, testing, evaluating, integrating, and improving the project.
## Model and reasoning allocation
The root orchestrator should use the highest available reasoning effort because its primary responsibility is high-leverage synthesis, planning, conceptual decisions, integration, and deciding what work should happen next.
Do not automatically use maximum reasoning for every delegated task.
Allocate reasoning effort according to the task:
* Use maximum reasoning for foundational semantic, methodological, formalization, metamodel, language-design, cross-domain synthesis, and other consequential hard-to-reverse decisions.
* Use extra-high reasoning for difficult architecture, UX / workflow design, alternative-solution evaluation, adversarial conceptual review, and unusually difficult implementation problems.
* Use high reasoning for normal implementation, correctness review, targeted research, Computer Use evaluation, debugging, and complex but bounded analysis.
* Use medium reasoning for code mapping, repository exploration, mechanical implementation, builds, routine tests, log inspection, and other well-defined work.
* Use lower effort only for genuinely trivial mechanical tasks.
Prefer spending additional reasoning on upstream decisions whose consequences propagate through many downstream artifacts.
Do not spend maximum reasoning merely because a task is long. Distinguish computational volume from conceptual difficulty.
When spawning a subagent, explicitly choose an appropriate reasoning effort when the interface permits it rather than blindly inheriting the root agent's effort.
Use GPT-6 Astra model exclusively.
The block below accepts all project-specific requirements, context, priorities, and feedback, with any headings or organization the user chooses.
<!-- BEGIN USER-OWNED APPLICATION SPECIFICATION -->
## Application specification
### General description
@@ -653,3 +108,4 @@ Right now, the behavior & scenarios UI is hard to use. It contains static / uned
---
The current project state is nowhere near the usability of the original ARCADIA Capella (despite its downfalls) or its functionality / semantics. You should focus on that by studying original ARCADIA Capella very closely and implementing its features in a modern, ergonomic and easy to use way
<!-- END USER-OWNED APPLICATION SPECIFICATION -->
+52 -12
View File
@@ -3290,6 +3290,52 @@ impl App {
id,
));
}
// Refining a leaf moves its explicit responsibilities to the new leaf.
// Later children inherit only the existing unambiguous performer summary.
if self.create_kind.is_work()
&& let Some(owner) = parent
&& self
.project()
.elements
.get(&owner)
.is_some_and(|e| e.layer() == self.layer && e.kind() == self.create_kind)
{
let performer = oa_core::validation::allocation_summary(self.project(), owner);
let leaf = !self
.project()
.children(owner)
.any(|e| e.kind() == self.create_kind);
let responsibilities: Vec<_> = self
.project()
.relations
.values()
.filter(|r| {
r.target() == owner
&& matches!(
r.kind(),
RelationKind::Allocation | RelationKind::RoleAssignment
)
})
.collect();
if leaf && !responsibilities.is_empty() {
for original in responsibilities {
let mut responsibility = original.clone();
match &mut responsibility.body {
RelationBody::Allocation { target, .. }
| RelationBody::RoleAssignment { target, .. } => *target = id,
_ => unreachable!(),
}
commands.push(Command::EditRelation(original.id, responsibility));
}
} else if let Some(performer) = performer {
commands.push(Command::Connect(
RelationKind::Allocation,
"Performs".into(),
performer,
id,
));
}
}
if self.create_kind == Kind::Occurrence
&& let Some(owner) = parent.and_then(|id| self.project().elements.get(&id))
&& let Some(steps) = owner.steps()
@@ -3307,19 +3353,13 @@ impl App {
.get(&diagram)
.is_none_or(|d| d.projection.includes(self.create_kind))
{
let mut p = self.project().clone();
for command in &commands {
if let Command::CreateDiagram(d) = command {
p.diagrams.insert(d.id, d.clone());
let mut p = match execute_batch(self.project(), &commands) {
Ok(candidate) => candidate,
Err(error) => {
self.status = error.to_string();
return;
}
}
p.elements.insert(
id,
match &commands[0] {
Command::CreateElement(e) => e.clone(),
_ => unreachable!(),
},
);
};
let owner = if allocated {
Some(self.selected)
} else {
+178 -55
View File
@@ -18,6 +18,7 @@ use std::collections::BTreeMap;
mod contextual_source_tests;
pub(crate) mod creation;
pub(crate) mod scenario;
mod scenario_lifecycle;
pub(crate) mod source_draft;
pub(crate) mod state_canvas;
pub(crate) mod state_edit;
@@ -1140,6 +1141,17 @@ struct BoxItem {
detail: String,
marker: Option<Kind>,
}
fn box_text_clip(rect: Rectangle, scale: f32, viewport: Size) -> Option<Rectangle> {
if !scale.is_finite() || scale <= 0. || rect.width <= 20. || rect.height <= 16. {
return None;
}
Rectangle::new(
Point::new((rect.x + 10.) * scale, (rect.y + 8.) * scale),
Size::new((rect.width - 20.) * scale, (rect.height - 16.) * scale),
)
.intersection(&Rectangle::new(Point::ORIGIN, viewport))
}
struct Line {
id: Id,
points: Vec<Point>,
@@ -1161,6 +1173,7 @@ struct Scene {
rows: BTreeMap<Id, (Id, f32)>,
open_calls: Vec<Point>,
sequence_bounds: BTreeMap<Id, (f32, f32)>,
lifecycle: scenario_lifecycle::render::Rendering,
}
struct SequenceSlot {
slot: scenario::Slot,
@@ -1219,6 +1232,7 @@ impl Scene {
rows: BTreeMap::new(),
open_calls: vec![],
sequence_bounds: BTreeMap::new(),
lifecycle: scenario_lifecycle::render::Rendering::default(),
};
let mut lanes = p
.children(owner)
@@ -1305,7 +1319,17 @@ impl Scene {
}
let mut y = if scenario { 148. } else { 120. };
scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0);
scene.size.height = (y + 45.).max(210.);
if scenario {
scene.lifecycle = scenario_lifecycle::render::Rendering::new(
p,
owner,
&lane_x,
&scene.rows,
&scene.sequence_bounds,
scene.size.height,
);
scene.lifecycle.align_messages(&mut scene.lines);
let calls: Vec<_> = scene
.rows
.keys()
@@ -1330,23 +1354,28 @@ impl Scene {
scene.activation_sequence(p, p.elements[&call].parent.unwrap(), call, x, None);
}
}
scene.size.height = (y + 45.).max(210.);
for (id, name, detail) in lanes {
let x = lane_x[&id];
scene.lines.insert(
0,
Line {
id,
points: vec![Point::new(x, 85.), Point::new(x, scene.size.height - 20.)],
label: String::new(),
label_at: Point::ORIGIN,
dashed: false,
},
);
if !scenario {
scene.lines.insert(
0,
Line {
id,
points: vec![Point::new(x, 85.), Point::new(x, scene.size.height - 20.)],
label: String::new(),
label_at: Point::ORIGIN,
dashed: false,
},
);
}
scene.boxes.push(BoxItem {
id,
rect: Rectangle::new(Point::new(x - 102., 15.), Size::new(204., 70.)),
title: name,
title: if scenario {
format!("Lane · {name}")
} else {
name
},
detail,
marker: None,
});
@@ -1388,6 +1417,16 @@ impl Scene {
let Some(SharedBody::Occurrence { body, .. }) = e.shared() else {
continue;
};
if scenario
&& matches!(body, OccurrenceBody::Exchange {
sender: Some(sender), receiver: Some(receiver),
message_kind: MessageKind::Create | MessageKind::Delete, ..
} if sender == receiver)
{
// Self lifecycle elbows and their caption need clearance from
// the preceding action/state/reference box, before recording rows.
*y += 16.;
}
if ordered {
let slot = scenario::Slot {
parent: owner,
@@ -1607,17 +1646,27 @@ impl Scene {
});
}
}
fn activation_segment(&mut self, call: Id, x: f32, top: f32, bottom: f32) {
if bottom <= top {
return;
fn activation_segment(
&mut self,
call: Id,
scope: Id,
receiver: Id,
x: f32,
top: f32,
bottom: f32,
) {
for span in self.lifecycle.alive_spans(receiver, scope, top, bottom) {
self.boxes.push(BoxItem {
id: call,
rect: Rectangle::new(
Point::new(x - 4., span.start),
Size::new(8., span.end - span.start),
),
title: String::new(),
detail: String::new(),
marker: None,
});
}
self.boxes.push(BoxItem {
id: call,
rect: Rectangle::new(Point::new(x - 4., top), Size::new(8., bottom - top)),
title: String::new(),
detail: String::new(),
marker: None,
});
}
/// Follow a single correlation through the ordered tree. Branches are drawn
/// as independent segments, never as one chronological stretch through ALT
@@ -1630,6 +1679,18 @@ impl Scene {
x: f32,
mut start: Option<f32>,
) -> bool {
let Some(SharedBody::Occurrence {
body:
OccurrenceBody::Exchange {
receiver: Some(receiver),
..
},
..
}) = p.elements[&call].shared()
else {
return false;
};
let receiver = *receiver;
let entered_open = start.is_some();
let mut split = false;
for id in p.elements[&owner].steps().into_iter().flatten() {
@@ -1643,6 +1704,21 @@ impl Scene {
continue;
};
match p.elements[id].shared() {
Some(SharedBody::Occurrence {
body:
OccurrenceBody::Exchange {
message_kind: MessageKind::Delete,
receiver: Some(deleted),
..
},
..
}) if *deleted == receiver => {
// This path cannot show activation beyond its local death.
// Keep the unresolved-call cue; a Delete is not a Reply.
self.activation_segment(call, owner, receiver, x, top, y);
self.open_calls.push(Point::new(x + 12., y - 16.));
start = None;
}
Some(SharedBody::Occurrence {
body:
OccurrenceBody::Exchange {
@@ -1652,14 +1728,19 @@ impl Scene {
},
..
}) if *correlation == call => {
self.activation_segment(call, x, top, y);
self.boxes.push(BoxItem {
id: call,
rect: Rectangle::new(Point::new(x - 7., y - 1.), Size::new(14., 2.)),
title: String::new(),
detail: String::new(),
marker: None,
});
self.activation_segment(call, owner, receiver, x, top, y);
for span in self.lifecycle.alive_spans(receiver, owner, y - 1., y + 1.) {
self.boxes.push(BoxItem {
id: call,
rect: Rectangle::new(
Point::new(x - 7., span.start),
Size::new(14., span.end - span.start),
),
title: String::new(),
detail: String::new(),
marker: None,
});
}
start = None;
}
Some(SharedBody::Occurrence {
@@ -1667,7 +1748,7 @@ impl Scene {
..
}) => {
split = true;
self.activation_segment(call, x, top, y);
self.activation_segment(call, owner, receiver, x, top, y);
let bottom = self
.boxes
.iter()
@@ -1702,7 +1783,7 @@ impl Scene {
} else {
top + 26.
};
self.activation_segment(call, x, top, bottom);
self.activation_segment(call, owner, receiver, x, top, bottom);
self.open_calls.push(Point::new(x + 8., bottom - 7.));
}
start.is_some()
@@ -1735,6 +1816,12 @@ impl Scene {
))
}
fn hit(&self, point: Point) -> Option<Id> {
if !point.x.is_finite() || !point.y.is_finite() {
return None;
}
if let Some(id) = self.lifecycle.marker_at(point) {
return Some(id);
}
self.boxes
.iter()
.rev()
@@ -1749,7 +1836,7 @@ impl Scene {
.iter()
.find(|line| {
!line.label.is_empty()
&& (Rectangle::new(
&& Rectangle::new(
line.label_at,
Size::new(
(line.label.chars().count() as f32 * 6.8 + 8.).min(225.),
@@ -1757,13 +1844,10 @@ impl Scene {
),
)
.contains(point)
|| line.points.windows(2).any(|p| {
crate::diagram::distance_to_segment(point, p[0], p[1])
< 8. / self.scale
}))
})
.map(|line| line.id)
})
.or_else(|| self.near_sequence_item(point))
.or_else(|| {
self.boxes
.iter()
@@ -1771,6 +1855,7 @@ impl Scene {
.find(|b| b.rect.contains(point) && b.title.is_empty())
.map(|b| b.id)
})
.or_else(|| self.lifecycle.lane_at(point, self.scale))
.or_else(|| self.lane_at(point))
.or_else(|| {
self.lines
@@ -1785,6 +1870,34 @@ impl Scene {
.map(|line| line.id)
})
}
fn near_sequence_item(&self, point: Point) -> Option<Id> {
if !self.scale.is_finite() || self.scale <= 0. {
return None;
}
let messages = self
.lines
.iter()
.filter(|line| !line.label.is_empty())
.map(|line| {
let distance = line
.points
.windows(2)
.map(|p| crate::diagram::distance_to_segment(point, p[0], p[1]))
.fold(f32::INFINITY, f32::min);
(line.id, distance)
});
// One distance comparison for both kinds of screen-sized hit tolerance.
// Dense minimum-Fit rows must not give the first message or last marker
// a larger hit priority than the visibly nearer item. UUID breaks ties.
self.lifecycle
.nearest_marker(point)
.into_iter()
.chain(messages)
.filter(|(_, distance)| *distance <= 8. / self.scale)
.min_by(|a, b| a.1.total_cmp(&b.1).then_with(|| a.0.cmp(&b.0)))
.map(|(id, _)| id)
}
}
impl canvas::Program<Message> for Scene {
type State = SequenceInput;
@@ -2025,6 +2138,7 @@ impl canvas::Program<Message> for Scene {
let mut f = Frame::new(renderer, bounds.size());
f.fill_rectangle(Point::ORIGIN, bounds.size(), Color::WHITE);
f.scale(self.scale);
self.lifecycle.draw_lanes(&mut f, self.selected);
for b in &self.boxes {
let outline = matches!(
b.marker,
@@ -2103,24 +2217,31 @@ impl canvas::Program<Message> for Scene {
}
}
for b in &self.boxes {
f.fill_text(Text {
content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 12.),
size: 13.into(),
color: if b.id == self.selected {
style::TEAL
} else {
style::INK
},
..Default::default()
});
if !b.detail.is_empty() {
f.fill_text(Text {
content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 39.),
size: 11.into(),
color: style::MUTED,
..Default::default()
if let Some(clip) = box_text_clip(b.rect, self.scale, f.size()) {
// Clipped child frames start with an identity transform. Match
// the card's scale explicitly, as for lifecycle Create labels.
f.with_clip(clip, |label| {
label.scale(self.scale);
label.fill_text(Text {
content: short(&b.title, ((b.rect.width - 25.) / 7.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 12.),
size: 13.into(),
color: if b.id == self.selected {
style::TEAL
} else {
style::INK
},
..Default::default()
});
if !b.detail.is_empty() {
label.fill_text(Text {
content: short(&b.detail, ((b.rect.width - 25.) / 6.) as usize),
position: Point::new(b.rect.x + 12., b.rect.y + 39.),
size: 11.into(),
color: style::MUTED,
..Default::default()
});
}
});
}
}
@@ -2133,6 +2254,8 @@ impl canvas::Program<Message> for Scene {
..Default::default()
});
}
self.lifecycle
.draw_markers(&mut f, self.selected, self.scale);
if let Some((context, tool, editable)) = self.interaction {
let active = editable && state.context == Some(context) && state.tool == tool;
let point = cursor
@@ -709,7 +709,6 @@ fn canvas_pane<'a, R: iced::advanced::text::Renderer + 'a>(
.width(Fill)
.height(Fill),
))
// A new owner/document needs its first measurement even at the same size.
.key((context.document, context.scenario))
.on_show(move |size| Message::ScenarioCanvas(CanvasEvent::Viewport(context, size)))
.on_resize(move |size| Message::ScenarioCanvas(CanvasEvent::Viewport(context, size))),
@@ -342,7 +342,7 @@ fn scenario_workspace_fit_uses_measured_inner_viewport_and_rejects_nonfinite_inp
}
#[test]
fn scenario_workspace_fit_reobserves_same_sized_owner_and_document_changes() {
fn scenario_workspace_same_size_owner_and_document_changes_remeasure_fit_viewport() {
use super::super::direct_tests::{navigation_event, navigation_fixture};
let (project, [a, b, _], [reference, _, _]) = navigation_fixture();
let mut app = App::with_project(project.clone());
@@ -358,14 +358,13 @@ fn scenario_workspace_fit_reobserves_same_sized_owner_and_document_changes() {
);
let mut tree = widget::Tree::new(view.as_widget());
redraw(&mut view, &mut tree, size, &mut app);
let (_, first) = geometry(&mut view, &mut tree, size);
let measured = first.scrolls["scenario-canvas"].0.size();
assert_eq!(app.behavior.scenario.presentation.viewport, Some(measured));
let first_viewport = app.behavior.scenario.presentation.viewport.unwrap();
navigation_event(&mut app, |ctx| CanvasEvent::Zoom(ctx, None));
assert!(app.behavior.scenario.presentation.scale(graph) < 1.);
let accepted = app.document.snapshot();
navigation_event(&mut app, |ctx| CanvasEvent::OpenUse(ctx, reference));
assert_eq!(app.scenario_context().unwrap().scenario, b);
assert_eq!(app.behavior.scenario.presentation.viewport, None);
assert!(app.behavior.scenario.presentation.viewport.is_none());
view = fixture_view(
&app.behavior.scenario,
app.scenario_context().unwrap(),
@@ -374,50 +373,38 @@ fn scenario_workspace_fit_reobserves_same_sized_owner_and_document_changes() {
);
tree.diff(view.as_widget());
redraw(&mut view, &mut tree, size, &mut app);
let (_, second) = geometry(&mut view, &mut tree, size);
assert_eq!(second.scrolls["scenario-canvas"].0.size(), measured);
assert_eq!(app.behavior.scenario.presentation.viewport, Some(measured));
assert_eq!(
app.behavior.scenario.presentation.viewport,
Some(first_viewport)
);
navigation_event(&mut app, |ctx| CanvasEvent::Zoom(ctx, None));
let fitted = app.behavior.scenario.presentation.scale(graph);
assert!(
fitted < 1.
&& graph.width * fitted <= measured.width - 16.
&& graph.height * fitted <= measured.height - 16.
assert!(graph.width * fitted <= first_viewport.width - 16.);
assert!(graph.height * fitted <= first_viewport.height - 16.);
let prior_document = app.scenario_context().unwrap().document;
app = App::with_project(project);
let _ = app.update(Message::Select(b));
let _ = app.update(Message::Page(crate::app::Page::Behavior));
let context = app.scenario_context().unwrap();
assert_ne!(context.document, prior_document);
assert_eq!(
context.scenario, b,
"semantic UUID is retained across documents"
);
assert!(app.behavior.scenario.presentation.viewport.is_none());
let accepted = app.document.snapshot();
view = fixture_view(&app.behavior.scenario, context, false, 68.);
tree.diff(view.as_widget());
redraw(&mut view, &mut tree, size, &mut app);
assert_eq!(
app.behavior.scenario.presentation.viewport,
Some(first_viewport)
);
navigation_event(&mut app, |ctx| CanvasEvent::Zoom(ctx, None));
assert_eq!(app.behavior.scenario.presentation.scale(graph), fitted);
assert!(std::sync::Arc::ptr_eq(&accepted, &app.document.snapshot()));
assert!(!app.document.can_undo());
let document = app.scenario_context().unwrap().document;
let mut replacement = App::with_project(project);
let _ = replacement.update(Message::Select(b));
let _ = replacement.update(Message::Page(crate::app::Page::Behavior));
assert_ne!(replacement.scenario_context().unwrap().document, document);
assert_eq!(replacement.behavior.scenario.presentation.viewport, None);
let accepted = replacement.document.snapshot();
view = fixture_view(
&replacement.behavior.scenario,
replacement.scenario_context().unwrap(),
false,
68.,
);
tree.diff(view.as_widget());
redraw(&mut view, &mut tree, size, &mut replacement);
let (_, replaced) = geometry(&mut view, &mut tree, size);
assert_eq!(replaced.scrolls["scenario-canvas"].0.size(), measured);
assert_eq!(
replacement.behavior.scenario.presentation.viewport,
Some(measured)
);
navigation_event(&mut replacement, |ctx| CanvasEvent::Zoom(ctx, None));
assert_eq!(
replacement.behavior.scenario.presentation.scale(graph),
fitted
);
assert!(std::sync::Arc::ptr_eq(
&accepted,
&replacement.document.snapshot()
));
assert!(!replacement.document.can_undo());
}
#[test]
@@ -0,0 +1,285 @@
//! Read-only lifecycle geometry. Operand screen order is never execution order.
use oa_core::{FragmentOperator, Id, Kind, MessageKind, OccurrenceBody, Project, SharedBody};
use std::collections::{BTreeMap, BTreeSet};
pub(super) mod render;
/// Maps already recorded by the sequence renderer. Rows carry their owning sequence.
pub(crate) struct Geometry<'a> {
pub rows: &'a BTreeMap<Id, (Id, f32)>,
pub scopes: &'a BTreeMap<Id, (f32, f32)>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct Span {
pub start: f32,
pub end: f32,
}
impl Span {
fn valid(self) -> bool {
self.start.is_finite() && self.end.is_finite() && self.start <= self.end
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Life {
Alive,
Absent,
Unresolved,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct Interval {
pub scope: Id,
pub span: Span,
pub life: Life,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum MarkerKind {
Birth,
Death,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct Marker {
pub occurrence: Id,
pub scope: Id,
pub y: f32,
pub kind: MarkerKind,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum UncertaintyReason {
Conditional,
Repeated,
Parallel,
MissingGeometry,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct Uncertainty {
pub scope: Id,
pub reason: UncertaintyReason,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct LaneLifetime {
pub lifeline: Id,
pub intervals: Vec<Interval>,
pub markers: Vec<Marker>,
pub uncertainties: Vec<Uncertainty>,
}
/// Stable lane-ID order; source/model/history and caller-owned geometry are untouched.
/// An opaque ScenarioUse is a local use, not a caller birth/death contract.
pub(crate) fn project_lifetimes(
project: &Project,
scenario: Id,
geometry: &Geometry<'_>,
) -> Vec<LaneLifetime> {
if project
.elements
.get(&scenario)
.is_none_or(|e| e.kind() != Kind::Scenario)
{
return vec![];
}
project
.elements
.values()
.filter(|e| e.kind() == Kind::Lifeline && e.parent == Some(scenario))
.map(|e| {
let mut projection = Projection {
project,
geometry,
lane: e.id,
visiting: BTreeSet::new(),
result: LaneLifetime {
lifeline: e.id,
intervals: vec![],
markers: vec![],
uncertainties: vec![],
},
};
let initial = if projection.contains(scenario, Some(MarkerKind::Birth)) {
Life::Unresolved
} else {
Life::Alive
};
projection.sequence(scenario, initial);
projection.result
})
.collect()
}
struct Projection<'a, 'g> {
project: &'a Project,
geometry: &'a Geometry<'g>,
lane: Id,
visiting: BTreeSet<Id>,
result: LaneLifetime,
}
impl Projection<'_, '_> {
fn body(&self, id: Id) -> Option<&OccurrenceBody> {
match self.project.elements.get(&id)?.shared()? {
SharedBody::Occurrence { body, .. } => Some(body),
_ => None,
}
}
fn event(&self, id: Id) -> Option<MarkerKind> {
match self.body(id)? {
OccurrenceBody::Exchange {
receiver: Some(line),
message_kind,
..
} if *line == self.lane => match message_kind {
MessageKind::Create => Some(MarkerKind::Birth),
MessageKind::Delete => Some(MarkerKind::Death),
_ => None,
},
_ => None,
}
}
fn contains(&self, scope: Id, kind: Option<MarkerKind>) -> bool {
// Local structural walk only: no guards, iteration simulation or reuse expansion.
let mut pending = vec![scope];
let mut seen = BTreeSet::new();
while let Some(id) = pending.pop() {
if !seen.insert(id) {
continue;
}
if self
.event(id)
.is_some_and(|event| kind.is_none_or(|k| event == k))
{
return true;
}
if let Some(steps) = self.project.elements.get(&id).and_then(|e| e.steps()) {
pending.extend(steps);
}
if let Some(OccurrenceBody::Fragment { branches, .. }) = self.body(id) {
pending.extend(branches);
}
}
false
}
fn span(&self, scope: Id) -> Option<Span> {
let &(start, end) = self.geometry.scopes.get(&scope)?;
let span = Span { start, end };
span.valid().then_some(span)
}
fn uncertain(&mut self, scope: Id, reason: UncertaintyReason) {
let value = Uncertainty { scope, reason };
if !self.result.uncertainties.contains(&value) {
self.result.uncertainties.push(value);
}
}
fn interval(&mut self, scope: Id, start: f32, end: f32, life: Life) {
if start < end && start.is_finite() && end.is_finite() {
self.result.intervals.push(Interval {
scope,
span: Span { start, end },
life,
});
}
}
fn sequence(&mut self, scope: Id, entry: Life) -> Life {
let Some(span) = self.span(scope) else {
self.uncertain(scope, UncertaintyReason::MissingGeometry);
return Life::Unresolved;
};
if !self.visiting.insert(scope) {
self.uncertain(scope, UncertaintyReason::MissingGeometry);
return Life::Unresolved;
}
let steps = self
.project
.elements
.get(&scope)
.and_then(|e| e.steps())
.cloned()
.unwrap_or_default();
// A creation directly in this sequence fixes its local birth boundary.
// A creation only in a nested operand cannot fix its ancestor's entry.
let mut life = if steps
.iter()
.any(|&id| self.event(id) == Some(MarkerKind::Birth))
{
Life::Absent
} else {
entry
};
let mut cursor = span.start;
for id in steps {
let event = self.event(id);
let fragment = match self.body(id) {
Some(OccurrenceBody::Fragment { operator, branches }) => {
Some((*operator, branches.clone()))
}
_ => None,
};
if event.is_none() && fragment.is_none() {
continue;
}
let y = self
.geometry
.rows
.get(&id)
.filter(|(owner, y)| {
*owner == scope && y.is_finite() && *y >= cursor && *y <= span.end
})
.map(|(_, y)| *y);
let Some(y) = y else {
self.uncertain(id, UncertaintyReason::MissingGeometry);
life = Life::Unresolved;
continue;
};
self.interval(scope, cursor, y, life);
cursor = y;
if let Some(kind) = event {
self.result.markers.push(Marker {
occurrence: id,
scope,
y,
kind,
});
life = match kind {
MarkerKind::Birth => Life::Alive,
MarkerKind::Death => Life::Absent,
};
}
if let Some((operator, branches)) = fragment {
let entry = life;
let mut missing = false;
for branch in branches {
let bounds = self
.span(branch)
.filter(|s| s.start >= cursor && s.end <= span.end);
if let Some(bounds) = bounds {
// Every sibling inherits the same entry, never its displayed predecessor's exit.
self.sequence(branch, entry);
cursor = bounds.end;
} else {
self.uncertain(branch, UncertaintyReason::MissingGeometry);
missing = true;
}
}
if self.contains(id, None) {
let reason = match operator {
FragmentOperator::Alternative | FragmentOperator::Optional => {
UncertaintyReason::Conditional
}
FragmentOperator::Loop => UncertaintyReason::Repeated,
FragmentOperator::Parallel => UncertaintyReason::Parallel,
};
self.uncertain(id, reason);
life = Life::Unresolved;
} else if missing {
life = Life::Unresolved;
}
}
}
self.interval(scope, cursor, span.end, life);
self.visiting.remove(&scope);
life
}
}
#[cfg(test)]
#[path = "scenario_lifecycle/tests.rs"]
mod tests;
@@ -0,0 +1,377 @@
//! Scene bridge for local lifetime geometry; no authoring or model mutations.
use super::{Geometry, LaneLifetime, Life, Marker, MarkerKind, Span, project_lifetimes};
use crate::{behavior::Line, style, views::short};
use iced::{
Color, Point, Rectangle, Size,
widget::canvas::{self, Frame, Path, Stroke, Text},
};
use oa_core::{Id, OccurrenceBody, Project, SharedBody};
use std::collections::BTreeMap;
#[derive(Debug, Clone, PartialEq)]
struct EventMarker {
event: Marker,
lifeline: Id,
center: Point,
capsule: Rectangle,
name: String,
sender_x: Option<f32>,
}
#[derive(Debug, Default, Clone, PartialEq)]
pub(in crate::behavior) struct Rendering {
// Complete rendering positions, including warning-admitted unassigned lanes.
// Scene.lanes independently retains the existing authoring eligibility rule.
lanes: BTreeMap<Id, f32>,
span: Option<Span>,
lifetimes: Vec<LaneLifetime>,
markers: Vec<EventMarker>,
}
impl Rendering {
pub(in crate::behavior) fn new(
project: &Project,
owner: Id,
lanes: &BTreeMap<Id, f32>,
rows: &BTreeMap<Id, (Id, f32)>,
insertion_scopes: &BTreeMap<Id, (f32, f32)>,
height: f32,
) -> Self {
let span = Span {
start: 85.,
end: height - 20.,
};
if !span.valid() {
return Self::default();
}
// Insertion scopes deliberately start later and end earlier. Empty and
// Create-only scenarios still have the full visible lifetime extent.
let mut scopes = insertion_scopes.clone();
for (scope, (start, end)) in &mut scopes {
if *scope != owner && *start == *end && start.is_finite() {
// An empty operand has 42 px between its insertion axis and
// frame end. Match the existing 26 px open-activation allowance.
*end = *start + 26.;
}
}
scopes.insert(owner, (span.start, span.end));
let lifetimes = project_lifetimes(
project,
owner,
&Geometry {
rows,
scopes: &scopes,
},
);
let lanes: BTreeMap<_, _> = lanes
.iter()
.filter(|(_, x)| x.is_finite())
.map(|(id, x)| (*id, *x))
.collect();
let mut markers = Vec::new();
for lane in &lifetimes {
let Some(&x) = lanes.get(&lane.lifeline) else {
continue;
};
for event in &lane.markers {
let sender_x = project
.elements
.get(&event.occurrence)
.and_then(|e| e.shared())
.and_then(|body| match body {
SharedBody::Occurrence {
body:
OccurrenceBody::Exchange {
sender: Some(sender),
..
},
..
} => lanes.get(sender).copied(),
_ => None,
});
markers.push(EventMarker {
event: *event,
lifeline: lane.lifeline,
center: Point::new(x, event.y),
capsule: Rectangle::new(
Point::new(x - 70., event.y - 14.),
Size::new(140., 28.),
),
name: project.named(lane.lifeline).to_owned(),
sender_x,
});
}
}
Self {
lanes,
span: Some(span),
lifetimes,
markers,
}
}
pub(in crate::behavior) fn align_messages(&self, lines: &mut [Line]) {
for marker in &self.markers {
let Some(sender) = marker.sender_x else {
continue;
};
let Some(line) = lines
.iter_mut()
.find(|line| line.id == marker.event.occurrence)
else {
continue;
};
let x = marker.center.x;
let y = marker.center.y;
let self_message = sender == x;
let end_x = match marker.event.kind {
MarkerKind::Birth if sender < x => marker.capsule.x,
MarkerKind::Birth => marker.capsule.x + marker.capsule.width,
MarkerKind::Death => x,
};
line.points = if self_message {
// The receiver is on the recorded occurrence row, including self
// lifecycle events. The elbow stays outside the birth capsule.
let elbow = x + 112.;
line.label_at = Point::new(x + 12., y - 52.);
vec![
Point::new(x, y - 24.),
Point::new(elbow, y - 24.),
Point::new(elbow, y),
Point::new(end_x, y),
]
} else {
if marker.event.kind == MarkerKind::Birth {
// Keep the label above the capsule, including right-to-left
// messages whose existing label starts beside the receiver.
line.label_at.y = y - 40.;
}
vec![Point::new(sender, y), Point::new(end_x, y)]
};
}
}
pub(in crate::behavior) fn alive_spans(
&self,
lifeline: Id,
scope: Id,
top: f32,
bottom: f32,
) -> Vec<Span> {
if !top.is_finite() || !bottom.is_finite() || bottom <= top {
return vec![];
}
self.lifetimes
.iter()
.find(|lane| lane.lifeline == lifeline)
.into_iter()
.flat_map(|lane| &lane.intervals)
.filter(|interval| interval.scope == scope && interval.life == Life::Alive)
.filter_map(|interval| {
let start = top.max(interval.span.start);
let end = bottom.min(interval.span.end);
(start < end).then_some(Span { start, end })
})
.collect()
}
pub(in crate::behavior) fn marker_at(&self, point: Point) -> Option<Id> {
self.markers
.iter()
.rev()
.find(|marker| match marker.event.kind {
MarkerKind::Birth => marker.capsule.contains(point),
MarkerKind::Death => marker_distance(marker, point) <= 1.25,
})
.map(|marker| marker.event.occurrence)
}
pub(in crate::behavior) fn nearest_marker(&self, point: Point) -> Option<(Id, f32)> {
if !point.x.is_finite() || !point.y.is_finite() {
return None;
}
// Exact visible shapes are tested first by Scene. A low-zoom tolerance
// must not outrank another marker's actual capsule, a header, or a label.
self.markers
.iter()
.map(|marker| (marker.event.occurrence, marker_distance(marker, point)))
.min_by(|a, b| a.1.total_cmp(&b.1).then_with(|| a.0.cmp(&b.0)))
}
pub(in crate::behavior) fn lane_at(&self, point: Point, scale: f32) -> Option<Id> {
let span = self.span?;
if !scale.is_finite() || scale <= 0. || point.y < span.start || point.y > span.end {
return None;
}
self.lanes
.iter()
.filter(|(_, x)| (**x - point.x).abs() < 12. / scale)
.min_by(|a, b| (a.1 - point.x).abs().total_cmp(&(b.1 - point.x).abs()))
.map(|(id, _)| *id)
}
pub(in crate::behavior) fn draw_lanes(&self, frame: &mut Frame, selected: Id) {
let Some(span) = self.span else {
return;
};
for (&id, &x) in &self.lanes {
frame.stroke(
&Path::line(Point::new(x, span.start), Point::new(x, span.end)),
Stroke {
line_dash: canvas::LineDash {
segments: &[2., 5.],
offset: 0,
},
..Stroke::default()
.with_width(1.)
.with_color(if id == selected {
Color::from_rgb8(148, 190, 187)
} else {
Color::from_rgb8(214, 222, 222)
})
},
);
}
for lifetime in &self.lifetimes {
let Some(&x) = self.lanes.get(&lifetime.lifeline) else {
continue;
};
for interval in &lifetime.intervals {
match interval.life {
Life::Alive => frame.stroke(
&Path::line(
Point::new(x, interval.span.start),
Point::new(x, interval.span.end),
),
Stroke::default().with_width(2.).with_color(
if lifetime.lifeline == selected {
style::TEAL
} else {
Color::from_rgb8(91, 113, 113)
},
),
),
Life::Unresolved if interval.span.end - interval.span.start >= 16. => {
frame.fill_text(Text {
content: "?".into(),
position: Point::new(x + 9., interval.span.start + 2.),
size: 11.into(),
color: style::MUTED,
..Default::default()
});
}
_ => {}
}
}
}
if !self.lanes.is_empty() {
frame.fill_text(Text {
content:
"Dotted: editing guide · Solid: local lifetime · ?: lifetime depends on path"
.into(),
position: Point::new(28., span.end + 4.),
size: 10.into(),
color: style::MUTED,
..Default::default()
});
}
}
pub(in crate::behavior) fn draw_markers(&self, frame: &mut Frame, selected: Id, scale: f32) {
for marker in &self.markers {
let color = if selected == marker.event.occurrence || selected == marker.lifeline {
style::TEAL
} else {
style::INK
};
match marker.event.kind {
MarkerKind::Birth => {
let path = Path::rounded_rectangle(
marker.capsule.position(),
marker.capsule.size(),
6.into(),
);
frame.fill(&path, Color::from_rgb8(243, 248, 248));
frame.stroke(
&path,
Stroke::default().with_color(color).with_width(
if selected == marker.event.occurrence {
2.5
} else {
1.5
},
),
);
if let Some(clip) = birth_label_clip(marker.capsule, scale, frame.size()) {
// WGPU clipped frames start with an identity transform;
// neither the parent's scale nor its clip is inherited.
frame.with_clip(clip, |label| {
label.scale(scale);
label.fill_text(Text {
content: short(&marker.name, 18),
position: marker.capsule.position() + iced::Vector::new(8., 6.),
size: 12.into(),
color,
..Default::default()
});
});
}
}
MarkerKind::Death => {
for (a, b) in death_strokes(marker.center) {
frame.stroke(
&Path::line(a, b),
Stroke::default().with_color(color).with_width(2.5),
);
}
}
}
}
}
}
fn birth_label_clip(capsule: Rectangle, scale: f32, viewport: Size) -> Option<Rectangle> {
if !scale.is_finite() || scale <= 0. {
return None;
}
Rectangle::new(
Point::new((capsule.x + 8.) * scale, (capsule.y + 4.) * scale),
Size::new((capsule.width - 16.) * scale, (capsule.height - 8.) * scale),
)
.intersection(&Rectangle::new(Point::ORIGIN, viewport))
}
fn marker_distance(marker: &EventMarker, point: Point) -> f32 {
match marker.event.kind {
MarkerKind::Birth => {
let dx = (marker.capsule.x - point.x)
.max(point.x - marker.capsule.x - marker.capsule.width)
.max(0.);
let dy = (marker.capsule.y - point.y)
.max(point.y - marker.capsule.y - marker.capsule.height)
.max(0.);
dx.hypot(dy)
}
MarkerKind::Death => death_strokes(marker.center)
.iter()
.map(|(a, b)| crate::diagram::distance_to_segment(point, *a, *b))
.fold(f32::INFINITY, f32::min),
}
}
fn death_strokes(center: Point) -> [(Point, Point); 2] {
[
(
center + iced::Vector::new(-7., -7.),
center + iced::Vector::new(7., 7.),
),
(
center + iced::Vector::new(-7., 7.),
center + iced::Vector::new(7., -7.),
),
]
}
#[cfg(test)]
#[path = "render_tests.rs"]
mod tests;
@@ -0,0 +1,796 @@
use super::*;
use crate::{behavior::Scene, document::Document};
use iced::Size;
use oa_core::*;
struct Fixture {
project: Project,
owner: Id,
sender: Id,
receiver: Id,
work: Id,
exchange: Id,
}
impl Fixture {
fn new(layer: Layer) -> Self {
let mut project = Project::empty();
let kind = if layer == Layer::Oa {
Kind::Activity
} else {
Kind::Function
};
let a = project.add_element(kind, layer, "Request", None).unwrap();
let work = project.add_element(kind, layer, "Provide", None).unwrap();
let exchange = project.relate(
if layer == Layer::Oa {
RelationKind::Interaction
} else {
RelationKind::FunctionalExchange
},
"Service",
a,
work,
);
let owner = project
.add_element(Kind::Scenario, layer, "Lifecycle", None)
.unwrap();
let mut lane = |name, represented| {
let id = project
.add_element(Kind::Lifeline, layer, name, Some(owner))
.unwrap();
*project.elements.get_mut(&id).unwrap().shared_mut().unwrap() = SharedBody::Lifeline {
represented: Some(represented),
};
id
};
let sender = lane("Requester", a);
let receiver = lane("Provider", work);
Self {
project,
owner,
sender,
receiver,
work,
exchange,
}
}
fn occurrence(&mut self, parent: Id, name: &str, body: OccurrenceBody) -> Id {
let mut element = self
.project
.make_element(
Kind::Occurrence,
self.project.elements[&parent].layer(),
name,
Some(parent),
)
.unwrap();
let id = element.id;
*element.shared_mut().unwrap() = SharedBody::Occurrence {
body,
precondition: String::new(),
postcondition: String::new(),
};
self.project.elements.insert(id, element);
let parent = self.project.elements.get_mut(&parent).unwrap();
if let Some(steps) = parent.steps_mut() {
steps.push(id);
} else if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Fragment { branches, .. },
..
}) = parent.shared_mut()
{
branches.push(id);
} else {
panic!("fixture parent must own ordered occurrences or operands");
}
id
}
fn message(&mut self, parent: Id, kind: MessageKind) -> Id {
self.occurrence(
parent,
"Message",
OccurrenceBody::Exchange {
exchange: Some(self.exchange),
sender: Some(self.sender),
receiver: Some(self.receiver),
message_kind: kind,
operation: None,
reply_to: None,
values: vec![],
},
)
}
fn fragment(&mut self, parent: Id, operator: FragmentOperator) -> Id {
self.occurrence(
parent,
"Paths",
OccurrenceBody::Fragment {
operator,
branches: vec![],
},
)
}
fn branch(&mut self, fragment: Id) -> Id {
self.occurrence(
fragment,
"Operand",
OccurrenceBody::Branch {
guard: "condition".into(),
occurrences: vec![],
},
)
}
fn document(&self) -> Document {
validate_candidate(&self.project).expect("ordinary core admission must succeed");
let mut bundle = source_project::format_bundle(&self.project);
for text in bundle.files.values_mut() {
*text = format!(
"// Retain exact authored CRLF and Unicode Ω\r\n{}",
text.replace('\n', "\r\n")
);
}
let document =
Document::from_bundle(bundle.clone(), source_project::ProjectLimits::default())
.unwrap();
assert_eq!(document.project(), &self.project);
assert_eq!(document.bundle(), &bundle);
document
}
fn scene(&self) -> Scene {
let document = self.document();
let before = document.snapshot();
let scene = Scene::sequence(document.project(), self.owner, self.owner);
assert_eq!(document.project(), &before.decoded.project);
assert_eq!(document.bundle(), &before.bundle);
assert_eq!(document.revision(), 0);
assert!(!document.can_undo() && !document.can_redo() && !document.dirty());
assert_eq!(
scene.lifecycle,
Scene::sequence(document.project(), self.owner, self.owner).lifecycle
);
assert!(
scene
.lines
.iter()
.flat_map(|line| &line.points)
.all(|p| p.x.is_finite() && p.y.is_finite())
);
scene
}
}
fn intervals(scene: &Scene, lifeline: Id, scope: Id) -> Vec<(f32, f32, Life)> {
scene
.lifecycle
.lifetimes
.iter()
.find(|lane| lane.lifeline == lifeline)
.unwrap()
.intervals
.iter()
.filter(|i| i.scope == scope)
.map(|i| (i.span.start, i.span.end, i.life))
.collect()
}
#[test]
fn real_scene_long_header_title_and_detail_keep_names_and_have_bounded_clips() {
for layer in [Layer::Oa, Layer::Sa] {
for name in [
"W".repeat(18),
"界".repeat(24),
"e\u{301}".repeat(24),
"👩\u{200d}🔧".repeat(12),
] {
let mut f = Fixture::new(layer);
f.project.elements.get_mut(&f.receiver).unwrap().name = name.clone();
f.project.elements.get_mut(&f.work).unwrap().name = name.clone();
let scene = f.scene();
let header = scene.boxes.iter().find(|b| b.id == f.receiver).unwrap();
assert_eq!(header.title, format!("Lane · {name}"));
assert_eq!(header.detail, name);
assert_eq!(header.rect.size(), Size::new(204., 70.));
assert_eq!(scene.hit(header.rect.center()), Some(f.receiver));
// Scroll offset is handled by the existing outer canvas/scrollable;
// these are the local drawing frame's coordinates, not screen input.
for scale in [0.05, 0.5, 0.512, 0.64, 0.8, 1., 1.953125, 2.] {
let clip =
crate::behavior::box_text_clip(header.rect, scale, Size::new(2000., 2000.))
.unwrap();
let world = Rectangle::new(
Point::new(clip.x / scale, clip.y / scale),
Size::new(clip.width / scale, clip.height / scale),
);
assert!((world.x - header.rect.x - 10.).abs() < 0.001);
assert!((world.y - header.rect.y - 8.).abs() < 0.001);
assert!((world.width - 184.).abs() < 0.001);
assert!((world.height - 54.).abs() < 0.001);
assert!(header.rect.contains(world.position()));
assert!(
header
.rect
.contains(Point::new(world.x + world.width, world.y + world.height,))
);
}
}
}
}
#[test]
fn box_text_clip_intersects_parent_viewport_and_rejects_empty_interiors() {
use crate::behavior::box_text_clip;
let card = Rectangle::new(Point::new(100., 200.), Size::new(204., 70.));
assert_eq!(
box_text_clip(card, 2., Size::new(300., 500.)),
Some(Rectangle::new(Point::new(220., 416.), Size::new(80., 84.)))
);
assert_eq!(
box_text_clip(
Rectangle::new(Point::new(-20., -10.), card.size()),
2.,
Size::new(300., 500.),
),
Some(Rectangle::new(Point::ORIGIN, Size::new(300., 104.)))
);
for viewport in [Size::new(200., 500.), Size::new(300., 400.), Size::ZERO] {
assert_eq!(box_text_clip(card, 2., viewport), None);
}
for scale in [0., -1., f32::NAN, f32::INFINITY] {
assert_eq!(box_text_clip(card, scale, Size::new(1000., 1000.)), None);
}
for size in [Size::new(20., 70.), Size::new(204., 16.), Size::ZERO] {
assert_eq!(
box_text_clip(Rectangle::new(Point::ORIGIN, size), 1., card.size()),
None
);
}
}
#[test]
fn real_scene_wide_latin_header_exceeds_old_character_budget() {
use iced::advanced::text::{self, Paragraph as _};
let mut f = Fixture::new(Layer::Oa);
f.project.elements.get_mut(&f.receiver).unwrap().name = "W".repeat(18);
f.project.elements.get_mut(&f.work).unwrap().name = "W".repeat(24);
let scene = f.scene();
let header = scene.boxes.iter().find(|b| b.id == f.receiver).unwrap();
for (content, size, divisor) in [(&header.title, 13., 7.), (&header.detail, 11., 6.)] {
let label = iced::widget::canvas::Text {
content: crate::views::short(content, ((header.rect.width - 25.) / divisor) as usize),
size: size.into(),
..Default::default()
};
// Use the same real paragraph/font/shaping defaults as canvas Text.
// The native defect survives short(): glyph width, not scalar count,
// is what exceeds the card. This is a font witness, not a pixel gate.
let paragraph = <iced::Renderer as text::Renderer>::Paragraph::with_text(text::Text {
content: label.content.as_str(),
bounds: Size::INFINITE,
size: label.size,
line_height: label.line_height,
font: label.font,
align_x: label.align_x,
align_y: label.align_y,
shaping: label.shaping,
wrapping: text::Wrapping::default(),
});
let old_available = header.rect.width - 12.;
assert!(
paragraph.min_width() > old_available,
"wide glyph fixture must overflow the old unbounded card: {} <= {old_available}",
paragraph.min_width()
);
}
}
#[test]
fn birth_label_clip_keeps_padded_world_bounds_at_each_scene_scale() {
let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.));
for (scale, expected) in [
(
0.05,
Rectangle::new(Point::new(5.4, 10.2), Size::new(6.2, 1.)),
),
(
0.5,
Rectangle::new(Point::new(54., 102.), Size::new(62., 10.)),
),
(
1.,
Rectangle::new(Point::new(108., 204.), Size::new(124., 20.)),
),
(
2.,
Rectangle::new(Point::new(216., 408.), Size::new(248., 40.)),
),
] {
let clip = birth_label_clip(capsule, scale, Size::new(1000., 1000.)).unwrap();
for (actual, expected) in [
(clip.x, expected.x),
(clip.y, expected.y),
(clip.width, expected.width),
(clip.height, expected.height),
] {
assert!((actual - expected).abs() < 0.0001);
}
assert!(capsule.contains(Point::new(clip.x / scale, clip.y / scale)));
assert!(capsule.contains(Point::new(
(clip.x + clip.width) / scale,
(clip.y + clip.height) / scale,
)));
}
}
#[test]
fn birth_label_clip_preserves_parent_viewport_bounds() {
let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.));
assert_eq!(
birth_label_clip(capsule, 2., Size::new(300., 420.)),
Some(Rectangle::new(Point::new(216., 408.), Size::new(84., 12.)))
);
let crossing_origin = Rectangle::new(Point::new(-20., -10.), Size::new(140., 28.));
assert_eq!(
birth_label_clip(crossing_origin, 2., Size::new(300., 420.)),
Some(Rectangle::new(Point::ORIGIN, Size::new(224., 28.)))
);
for viewport in [Size::new(200., 420.), Size::new(300., 400.), Size::ZERO] {
assert_eq!(birth_label_clip(capsule, 2., viewport), None);
}
for scale in [0., -1., f32::NAN, f32::INFINITY] {
assert_eq!(
birth_label_clip(capsule, scale, Size::new(1000., 1000.)),
None
);
}
}
#[test]
fn real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds() {
for layer in [Layer::Oa, Layer::Sa] {
let mut f = Fixture::new(layer);
let empty = f.scene();
assert_eq!(empty.sequence_bounds[&f.owner], (106., 106.));
assert_eq!(
intervals(&empty, f.receiver, f.owner),
vec![(85., empty.size.height - 20., Life::Alive)]
);
assert!(empty.lines.is_empty(), "lane guides are not message lines");
let create = f.message(f.owner, MessageKind::Create);
let scene = f.scene();
let birth = scene.rows[&create].1;
assert_eq!(birth, 148.);
assert_eq!(scene.sequence_bounds[&f.owner], (106., 198.));
assert_eq!(
intervals(&scene, f.receiver, f.owner),
vec![
(85., birth, Life::Absent),
(birth, scene.size.height - 20., Life::Alive),
]
);
assert_eq!(
intervals(&scene, f.sender, f.owner),
vec![(85., scene.size.height - 20., Life::Alive)]
);
assert_eq!(scene.slots[0].y, 106.);
assert_eq!(
scene.lane_at(Point::new(scene.lanes[&f.receiver], 90.)),
Some(f.receiver)
);
}
}
#[test]
fn real_scene_birth_death_markers_align_endpoints_and_win_selection_without_mutating_source() {
for layer in [Layer::Oa, Layer::Sa] {
let mut f = Fixture::new(layer);
let create = f.message(f.owner, MessageKind::Create);
f.occurrence(
f.owner,
"Work",
OccurrenceBody::Action {
action: Some(f.work),
lifeline: Some(f.receiver),
},
);
let delete = f.message(f.owner, MessageKind::Delete);
let mut scene = f.scene();
let birth = scene.rows[&create].1;
let death = scene.rows[&delete].1;
assert_eq!(
intervals(&scene, f.receiver, f.owner),
vec![
(85., birth, Life::Absent),
(birth, death, Life::Alive),
(death, scene.size.height - 20., Life::Absent),
]
);
let capsule = scene
.lifecycle
.markers
.iter()
.find(|m| m.event.occurrence == create)
.unwrap()
.capsule;
let line = scene.lines.iter().find(|l| l.id == create).unwrap();
let expected_x = if scene.lanes[&f.sender] < scene.lanes[&f.receiver] {
capsule.x
} else {
capsule.x + capsule.width
};
assert_eq!(line.points.last(), Some(&Point::new(expected_x, birth)));
assert!(
line.label_at.y + 22. < capsule.y,
"message caption clears birth capsule"
);
let line = scene.lines.iter().find(|l| l.id == delete).unwrap();
assert_eq!(
line.points.last(),
Some(&Point::new(scene.lanes[&f.receiver], death))
);
for scale in [0.5, 1., 2.] {
scene.scale = scale;
assert_eq!(
scene.hit(Point::new(scene.lanes[&f.receiver], birth)),
Some(create)
);
assert_eq!(
scene.hit(Point::new(scene.lanes[&f.receiver], death)),
Some(delete)
);
assert_eq!(
scene.hit(Point::new(
scene.lanes[&f.receiver],
scene.size.height - 25.
)),
Some(f.receiver)
);
assert_eq!(
scene.hit(Point::new(scene.lanes[&f.receiver], 40.)),
Some(f.receiver)
);
}
}
}
#[test]
fn real_scene_branch_delete_clips_only_its_activation_and_keeps_unanswered_call_visible() {
for layer in [Layer::Oa, Layer::Sa] {
let mut f = Fixture::new(layer);
let call = f.message(f.owner, MessageKind::Call);
let fragment = f.fragment(f.owner, FragmentOperator::Alternative);
let left = f.branch(fragment);
let delete = f.message(left, MessageKind::Delete);
let right = f.branch(fragment);
let scene = f.scene();
let death = scene.rows[&delete].1;
let (left_start, left_end) = scene.sequence_bounds[&left];
let (right_start, _) = scene.sequence_bounds[&right];
let bars: Vec<_> = scene
.boxes
.iter()
.filter(|b| b.id == call && b.rect.width == 8.)
.map(|b| b.rect)
.collect();
assert!(
bars.iter()
.any(|r| r.y == left_start && r.y + r.height == death)
);
assert!(
!bars
.iter()
.any(|r| r.y < left_end && r.y + r.height > death && r.y >= left_start)
);
assert!(
bars.iter().any(|r| r.y == right_start && r.height == 26.),
"empty exclusive sibling retains its own open activation"
);
assert_eq!(
intervals(&scene, f.receiver, right),
vec![(right_start, right_start + 26., Life::Alive)]
);
let frame_end = scene.boxes.iter().find(|b| b.id == fragment).unwrap().rect;
assert!(
!bars.iter().any(|r| r.y >= frame_end.y + frame_end.height),
"uncertain post-fragment lifetime cannot carry a definite activation bar"
);
assert!(
scene
.open_calls
.iter()
.any(|p| p.y < death && p.y > left_start)
);
assert!(scene.open_calls.iter().any(|p| p.y > right_start));
assert_eq!(
intervals(&scene, f.receiver, left),
vec![
(left_start, death, Life::Alive),
(death, left_end, Life::Absent)
]
);
assert_eq!(
intervals(&scene, f.receiver, f.owner).last().unwrap().2,
Life::Unresolved
);
assert!(!f.project.elements.values().any(|e| matches!(
e.shared(),
Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange {
message_kind: MessageKind::Reply,
..
},
..
})
)));
}
}
#[test]
fn real_scene_unassigned_lanes_and_explicit_incomplete_receiver_keep_real_marker_identity() {
for layer in [Layer::Oa, Layer::Sa] {
let mut f = Fixture::new(layer);
*f.project
.elements
.get_mut(&f.receiver)
.unwrap()
.shared_mut()
.unwrap() = SharedBody::Lifeline { represented: None };
let create = f.message(f.owner, MessageKind::Create);
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange { exchange, .. },
..
}) = f.project.elements.get_mut(&create).unwrap().shared_mut()
{
*exchange = None;
}
let scene = f.scene();
assert!(
!scene.lanes.contains_key(&f.receiver),
"authoring eligibility remains separate"
);
let x = scene.lifecycle.lanes[&f.receiver];
assert_eq!(scene.lifecycle.markers[0].lifeline, f.receiver);
assert_eq!(
scene.hit(Point::new(x, scene.rows[&create].1)),
Some(create)
);
assert_eq!(scene.hit(Point::new(x, 40.)), Some(f.receiver));
assert_eq!(
scene.hit(Point::new(x, scene.size.height - 25.)),
Some(f.receiver)
);
assert_eq!(scene.lane_at(Point::new(x, 90.)), None);
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange {
receiver, exchange, ..
},
..
}) = f.project.elements.get_mut(&create).unwrap().shared_mut()
{
*receiver = None;
*exchange = Some(f.exchange);
}
let missing = f.scene();
assert!(
missing.lifecycle.markers.is_empty(),
"do not infer receiver from global exchange"
);
}
}
#[test]
fn real_scene_minimum_zoom_marker_halos_do_not_steal_adjacent_capsule_or_header_hits() {
let mut f = Fixture::new(Layer::Sa);
*f.project
.elements
.get_mut(&f.receiver)
.unwrap()
.shared_mut()
.unwrap() = SharedBody::Lifeline { represented: None };
let create = f.message(f.owner, MessageKind::Create);
let delete = f.message(f.owner, MessageKind::Delete);
for event in [create, delete] {
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange { exchange, .. },
..
}) = f.project.elements.get_mut(&event).unwrap().shared_mut()
{
*exchange = None;
}
}
let mut scene = f.scene();
let x = scene.lifecycle.lanes[&f.receiver];
assert_eq!(scene.rows[&delete].1 - scene.rows[&create].1, 92.);
for scale in [0.05, 0.1, 0.5, 1., 2.] {
scene.scale = scale;
assert_eq!(
scene.hit(Point::new(x, scene.rows[&create].1)),
Some(create)
);
assert_eq!(
scene.hit(Point::new(x, scene.rows[&delete].1)),
Some(delete)
);
assert_eq!(scene.hit(Point::new(x, 40.)), Some(f.receiver));
if scale <= 0.1 {
for offset in [-25., -15., 15., 25.] {
assert_eq!(
scene.hit(Point::new(x, scene.rows[&delete].1 + offset)),
Some(delete),
"a nearby death halo must beat an earlier message's wider tolerance"
);
}
}
}
}
#[test]
fn real_scene_minimum_zoom_near_ordinary_message_wins_over_lifecycle_halos() {
let mut f = Fixture::new(Layer::Sa);
f.message(f.owner, MessageKind::Create);
let ordinary = f.message(f.owner, MessageKind::Asynchronous);
f.message(f.owner, MessageKind::Delete);
let mut scene = f.scene();
let x = (scene.lanes[&f.sender] + scene.lanes[&f.receiver]) / 2.;
for scale in [0.05, 0.1] {
scene.scale = scale;
assert_eq!(
scene.hit(Point::new(x, scene.rows[&ordinary].1 + 2.)),
Some(ordinary)
);
}
}
#[test]
fn real_scene_self_lifecycle_elbows_end_on_recorded_marker_rows() {
for layer in [Layer::Oa, Layer::Sa] {
for kind in [MessageKind::Create, MessageKind::Delete] {
let mut f = Fixture::new(layer);
let event = f.message(f.owner, kind);
if let Some(SharedBody::Occurrence {
body:
OccurrenceBody::Exchange {
exchange, sender, ..
},
..
}) = f.project.elements.get_mut(&event).unwrap().shared_mut()
{
*exchange = None;
*sender = Some(f.receiver);
}
let scene = f.scene();
let marker = &scene.lifecycle.markers[0];
let line = scene.lines.iter().find(|l| l.id == event).unwrap();
assert_eq!(line.points.len(), 4);
assert_eq!(line.points[0].y, marker.center.y - 24.);
assert_eq!(line.points[3].y, marker.center.y);
assert_eq!(
line.points[3].x,
if marker.event.kind == MarkerKind::Birth {
marker.capsule.x + marker.capsule.width
} else {
marker.center.x
}
);
assert!(line.points[1].x > marker.capsule.x + marker.capsule.width);
assert_eq!(scene.hit(marker.center), Some(event));
}
}
}
#[test]
fn real_scene_self_delete_caption_clears_the_preceding_action_box() {
let mut f = Fixture::new(Layer::Sa);
let action = f.occurrence(
f.owner,
"Finish work",
OccurrenceBody::Action {
action: Some(f.work),
lifeline: Some(f.receiver),
},
);
let delete = f.message(f.owner, MessageKind::Delete);
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange {
exchange, sender, ..
},
..
}) = f.project.elements.get_mut(&delete).unwrap().shared_mut()
{
*exchange = None;
*sender = Some(f.receiver);
}
let scene = f.scene();
let action = scene.boxes.iter().find(|b| b.id == action).unwrap();
let line = scene.lines.iter().find(|l| l.id == delete).unwrap();
assert!(line.label_at.y > action.rect.y + action.rect.height);
assert!(line.label_at.y + 22. < line.points[0].y);
assert_eq!(line.points[3].y, scene.rows[&delete].1);
assert_eq!(
scene
.slots
.iter()
.find(|s| s.slot.before == Some(delete))
.unwrap()
.y,
scene.rows[&delete].1 - 42.
);
}
#[test]
fn real_scene_conditional_repeated_and_parallel_scopes_do_not_claim_definite_continuation() {
for operator in [
FragmentOperator::Alternative,
FragmentOperator::Optional,
FragmentOperator::Loop,
FragmentOperator::Parallel,
] {
let mut f = Fixture::new(Layer::Sa);
let fragment = f.fragment(f.owner, operator);
let first = f.branch(fragment);
let create = f.message(first, MessageKind::Create);
let scene = f.scene();
assert_eq!(scene.lifecycle.markers[0].event.occurrence, create);
assert_eq!(
intervals(&scene, f.receiver, f.owner).first().unwrap().2,
Life::Unresolved
);
assert_eq!(
intervals(&scene, f.receiver, f.owner).last().unwrap().2,
Life::Unresolved
);
assert!(
scene
.lifecycle
.lifetimes
.iter()
.find(|l| l.lifeline == f.sender)
.unwrap()
.intervals
.iter()
.all(|i| i.life == Life::Alive)
);
}
}
#[test]
fn real_scene_lifecycle_edit_undo_redo_restores_exact_source_and_changed_geometry() {
for layer in [Layer::Oa, Layer::Sa] {
let mut f = Fixture::new(layer);
let create = f.message(f.owner, MessageKind::Create);
let mut document = f.document();
let before = document.snapshot();
let geometry = Scene::sequence(document.project(), f.owner, create).lifecycle;
let mut edited = document.project().elements[&create].clone();
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange { message_kind, .. },
..
}) = edited.shared_mut()
{
*message_kind = MessageKind::Asynchronous;
}
document
.execute(Command::EditElement(create, edited))
.unwrap();
let after = document.snapshot();
let changed = Scene::sequence(document.project(), f.owner, create).lifecycle;
assert_ne!(geometry, changed);
assert!(changed.markers.is_empty());
assert_ne!(before.bundle, after.bundle);
assert!(document.undo());
assert_eq!(document.project(), &before.decoded.project);
assert_eq!(document.bundle(), &before.bundle);
assert_eq!(
Scene::sequence(document.project(), f.owner, create).lifecycle,
geometry
);
assert!(!document.can_undo() && document.can_redo());
assert!(document.redo());
assert_eq!(document.project(), &after.decoded.project);
assert_eq!(document.bundle(), &after.bundle);
assert_eq!(
Scene::sequence(document.project(), f.owner, create).lifecycle,
changed
);
assert!(!document.can_redo());
}
}
@@ -0,0 +1,470 @@
use super::*;
use oa_core::*;
struct Fixture {
p: Project,
owner: Id,
a: Id,
b: Id,
exchange: Id,
rows: BTreeMap<Id, (Id, f32)>,
scopes: BTreeMap<Id, (f32, f32)>,
}
impl Fixture {
fn new(layer: Layer) -> Self {
let mut p = Project::empty();
let kind = if layer == Layer::Oa {
Kind::Activity
} else {
Kind::Function
};
let a = p.add_element(kind, layer, "Request", None).unwrap();
let b = p.add_element(kind, layer, "Provide", None).unwrap();
let owner = p
.add_element(Kind::Scenario, layer, "Lifecycle", None)
.unwrap();
let exchange = p.relate(
if layer == Layer::Oa {
RelationKind::Interaction
} else {
RelationKind::FunctionalExchange
},
"Service",
a,
b,
);
let line = |p: &mut Project, represented| {
let id = p
.add_element(Kind::Lifeline, layer, "Participant", Some(owner))
.unwrap();
*p.elements.get_mut(&id).unwrap().shared_mut().unwrap() = SharedBody::Lifeline {
represented: Some(represented),
};
id
};
let a = line(&mut p, a);
let b = line(&mut p, b);
Self {
p,
owner,
a,
b,
exchange,
rows: BTreeMap::new(),
scopes: [(owner, (0., 600.))].into(),
}
}
fn occurrence(&mut self, owner: Id, y: f32, body: OccurrenceBody) -> Id {
let mut e = self
.p
.make_element(
Kind::Occurrence,
self.p.elements[&owner].layer(),
"Occurrence",
Some(owner),
)
.unwrap();
let id = e.id;
*e.shared_mut().unwrap() = SharedBody::Occurrence {
body,
precondition: String::new(),
postcondition: String::new(),
};
self.p.elements.insert(id, e);
if let Some(steps) = self.p.elements.get_mut(&owner).unwrap().steps_mut() {
steps.push(id);
} else if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Fragment { branches, .. },
..
}) = self.p.elements.get_mut(&owner).unwrap().shared_mut()
{
branches.push(id);
}
self.rows.insert(id, (owner, y));
id
}
fn message(&mut self, owner: Id, y: f32, kind: MessageKind) -> Id {
self.occurrence(
owner,
y,
OccurrenceBody::Exchange {
exchange: Some(self.exchange),
sender: Some(self.a),
receiver: Some(self.b),
message_kind: kind,
operation: None,
reply_to: None,
values: vec![],
},
)
}
fn fragment(&mut self, owner: Id, y: f32, operator: FragmentOperator) -> Id {
self.occurrence(
owner,
y,
OccurrenceBody::Fragment {
operator,
branches: vec![],
},
)
}
fn branch(&mut self, fragment: Id, start: f32, end: f32) -> Id {
let id = self.occurrence(
fragment,
start,
OccurrenceBody::Branch {
guard: "condition".into(),
occurrences: vec![],
},
);
self.scopes.insert(id, (start, end));
id
}
fn project(&self) -> Vec<LaneLifetime> {
let errors: Vec<_> = validation::validate(&self.p)
.into_iter()
.filter(|i| i.severity == validation::Severity::Error)
.collect();
assert!(
errors.is_empty(),
"fixture must be ordinarily admitted: {errors:?}"
);
let before = self.p.clone();
let source = source_project::format_bundle(&self.p);
let geometry = Geometry {
rows: &self.rows,
scopes: &self.scopes,
};
let result = project_lifetimes(&self.p, self.owner, &geometry);
assert_eq!(result, project_lifetimes(&self.p, self.owner, &geometry));
assert_eq!(self.p, before);
assert_eq!(source_project::format_bundle(&self.p), source);
assert!(
result
.windows(2)
.all(|pair| pair[0].lifeline < pair[1].lifeline)
);
result
}
fn lane(&self) -> LaneLifetime {
self.project()
.into_iter()
.find(|lane| lane.lifeline == self.b)
.unwrap()
}
}
fn intervals(lane: &LaneLifetime, scope: Id) -> Vec<(f32, f32, Life)> {
lane.intervals
.iter()
.filter(|i| i.scope == scope)
.map(|i| (i.span.start, i.span.end, i.life))
.collect()
}
#[test]
fn root_lifetime_has_exact_birth_death_boundaries_without_source_mutation() {
for layer in [Layer::Oa, Layer::Sa] {
let mut f = Fixture::new(layer);
let create = f.message(f.owner, 100., MessageKind::Create);
f.message(f.owner, 200., MessageKind::Asynchronous);
let delete = f.message(f.owner, 300., MessageKind::Delete);
let lane = f.lane();
assert_eq!(
intervals(&lane, f.owner),
vec![
(0., 100., Life::Absent),
(100., 300., Life::Alive),
(300., 600., Life::Absent)
]
);
assert_eq!(
lane.markers,
vec![
Marker {
occurrence: create,
scope: f.owner,
y: 100.,
kind: MarkerKind::Birth
},
Marker {
occurrence: delete,
scope: f.owner,
y: 300.,
kind: MarkerKind::Death
},
]
);
let sender = f
.project()
.into_iter()
.find(|lane| lane.lifeline == f.a)
.unwrap();
assert_eq!(intervals(&sender, f.owner), vec![(0., 600., Life::Alive)]);
}
}
#[test]
fn alternative_death_does_not_kill_its_displayed_sibling() {
let mut f = Fixture::new(Layer::Sa);
let fragment = f.fragment(f.owner, 100., FragmentOperator::Alternative);
let left = f.branch(fragment, 120., 250.);
let right = f.branch(fragment, 300., 450.);
f.message(left, 200., MessageKind::Delete);
f.message(right, 350., MessageKind::Asynchronous);
let lane = f.lane();
assert_eq!(
intervals(&lane, left),
vec![(120., 200., Life::Alive), (200., 250., Life::Absent)]
);
assert_eq!(intervals(&lane, right), vec![(300., 450., Life::Alive)]);
assert_eq!(
intervals(&lane, f.owner),
vec![(0., 100., Life::Alive), (450., 600., Life::Unresolved)]
);
assert_eq!(
lane.uncertainties,
vec![Uncertainty {
scope: fragment,
reason: UncertaintyReason::Conditional
}]
);
}
#[test]
fn conditional_birth_does_not_infer_absence_in_siblings_or_ancestors() {
for operator in [FragmentOperator::Alternative, FragmentOperator::Optional] {
let mut f = Fixture::new(Layer::Oa);
let fragment = f.fragment(f.owner, 100., operator);
let left = f.branch(fragment, 120., 250.);
let right = f.branch(fragment, 300., 450.);
f.message(left, 200., MessageKind::Create);
let lane = f.lane();
assert_eq!(
intervals(&lane, left),
vec![(120., 200., Life::Absent), (200., 250., Life::Alive)]
);
assert_eq!(
intervals(&lane, right),
vec![(300., 450., Life::Unresolved)]
);
assert_eq!(
intervals(&lane, f.owner),
vec![(0., 100., Life::Unresolved), (450., 600., Life::Unresolved)]
);
}
}
#[test]
fn loop_lifetime_is_local_and_warning_bearing_loops_remain_drawable() {
for balanced in [true, false] {
let mut f = Fixture::new(Layer::Sa);
let fragment = f.fragment(f.owner, 100., FragmentOperator::Loop);
let iteration = f.branch(fragment, 120., 450.);
let create = f.message(iteration, 160., MessageKind::Create);
f.message(iteration, 250., MessageKind::Asynchronous);
if balanced {
f.message(iteration, 350., MessageKind::Delete);
}
let lane = f.lane();
assert_eq!(lane.markers.len(), if balanced { 2 } else { 1 });
assert_eq!(lane.markers[0].occurrence, create);
assert!(lane.uncertainties.contains(&Uncertainty {
scope: fragment,
reason: UncertaintyReason::Repeated
}));
assert_eq!(
intervals(&lane, f.owner).last().unwrap().2,
Life::Unresolved
);
assert_eq!(
validation::validate(&f.p)
.iter()
.any(|i| i.code == "lifeline_repetition"),
!balanced
);
}
}
#[test]
fn optional_cleanup_inside_loop_does_not_claim_balanced_or_definite_exit() {
let mut f = Fixture::new(Layer::Sa);
let repeated = f.fragment(f.owner, 100., FragmentOperator::Loop);
let iteration = f.branch(repeated, 120., 500.);
f.message(iteration, 160., MessageKind::Create);
let optional = f.fragment(iteration, 280., FragmentOperator::Optional);
let cleanup = f.branch(optional, 320., 400.);
f.message(cleanup, 350., MessageKind::Delete);
let lane = f.lane();
assert_eq!(
intervals(&lane, cleanup),
vec![(320., 350., Life::Alive), (350., 400., Life::Absent)]
);
assert_eq!(
intervals(&lane, iteration),
vec![
(120., 160., Life::Absent),
(160., 280., Life::Alive),
(400., 500., Life::Unresolved)
]
);
assert!(
validation::validate(&f.p)
.iter()
.any(|i| i.code == "lifeline_repetition")
);
assert!(lane.uncertainties.contains(&Uncertainty {
scope: optional,
reason: UncertaintyReason::Conditional
}));
assert!(lane.uncertainties.contains(&Uncertainty {
scope: repeated,
reason: UncertaintyReason::Repeated
}));
}
#[test]
fn lifecycle_free_fragments_do_not_poison_other_lanes() {
let mut f = Fixture::new(Layer::Oa);
let fragment = f.fragment(f.owner, 100., FragmentOperator::Parallel);
let left = f.branch(fragment, 120., 250.);
let right = f.branch(fragment, 300., 450.);
f.message(left, 200., MessageKind::Delete);
let result = f.project();
let sender = result.iter().find(|lane| lane.lifeline == f.a).unwrap();
assert!(sender.intervals.iter().all(|i| i.life == Life::Alive));
assert!(sender.uncertainties.is_empty());
let target = result.iter().find(|lane| lane.lifeline == f.b).unwrap();
assert!(target.uncertainties.contains(&Uncertainty {
scope: fragment,
reason: UncertaintyReason::Parallel
}));
assert_eq!(intervals(target, right), vec![(300., 450., Life::Alive)]);
}
#[test]
fn explicit_receiver_is_authoritative_even_with_missing_exchange() {
let mut f = Fixture::new(Layer::Oa);
let create = f.message(f.owner, 100., MessageKind::Create);
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange { exchange, .. },
..
}) = f.p.elements.get_mut(&create).unwrap().shared_mut()
{
*exchange = None;
}
assert_eq!(f.lane().markers[0].occurrence, create);
if let Some(SharedBody::Occurrence {
body: OccurrenceBody::Exchange {
receiver, exchange, ..
},
..
}) = f.p.elements.get_mut(&create).unwrap().shared_mut()
{
*receiver = None;
*exchange = Some(f.exchange);
}
assert!(
f.lane().markers.is_empty(),
"exchange endpoints never invent a receiver"
);
}
#[test]
fn missing_geometry_is_reported_without_nonfinite_or_guessed_markers() {
let mut f = Fixture::new(Layer::Oa);
let create = f.message(f.owner, 100., MessageKind::Create);
f.rows.insert(create, (f.owner, f32::NAN));
let lane = f.lane();
assert!(lane.markers.is_empty());
assert_eq!(
lane.uncertainties,
vec![Uncertainty {
scope: create,
reason: UncertaintyReason::MissingGeometry
}]
);
assert_eq!(
intervals(&lane, f.owner),
vec![(0., 600., Life::Unresolved)]
);
f.scopes.remove(&f.owner);
let lane = f.lane();
assert!(lane.intervals.is_empty());
assert_eq!(lane.uncertainties[0].scope, f.owner);
}
#[test]
fn scenario_use_is_opaque_and_never_imports_callee_lifecycle_events() {
let mut f = Fixture::new(Layer::Oa);
let callee =
f.p.add_element(Kind::Scenario, Layer::Oa, "Callee", None)
.unwrap();
let remote_a =
f.p.add_element(Kind::Lifeline, Layer::Oa, "Remote A", Some(callee))
.unwrap();
let remote_b =
f.p.add_element(Kind::Lifeline, Layer::Oa, "Remote B", Some(callee))
.unwrap();
for (remote, local) in [(remote_a, f.a), (remote_b, f.b)] {
let body = f.p.elements[&local].shared().unwrap().clone();
*f.p.elements.get_mut(&remote).unwrap().shared_mut().unwrap() = body;
}
f.occurrence(
callee,
200.,
OccurrenceBody::Exchange {
exchange: Some(f.exchange),
sender: Some(remote_a),
receiver: Some(remote_b),
message_kind: MessageKind::Create,
operation: None,
reply_to: None,
values: vec![],
},
);
f.occurrence(
f.owner,
100.,
OccurrenceBody::ScenarioUse {
scenario: Some(callee),
bindings: vec![
LifelineBinding {
referenced: remote_a,
local: f.a,
},
LifelineBinding {
referenced: remote_b,
local: f.b,
},
],
},
);
let lane = f.lane();
assert_eq!(intervals(&lane, f.owner), vec![(0., 600., Life::Alive)]);
assert!(lane.markers.is_empty());
assert!(lane.uncertainties.is_empty());
}
#[test]
fn projection_retains_exact_authored_source_and_does_not_enter_history() {
use crate::document::Document;
let mut f = Fixture::new(Layer::Oa);
f.message(f.owner, 100., MessageKind::Create);
f.message(f.owner, 300., MessageKind::Delete);
let mut source = source_project::format_bundle(&f.p);
let text = source.files.get_mut(&source.entry).unwrap();
*text = format!("// Retained author note — 雨\r\n{text}\n");
let document =
Document::from_bundle(source.clone(), source_project::ProjectLimits::default()).unwrap();
let accepted = document.project().clone();
let geometry = Geometry {
rows: &f.rows,
scopes: &f.scopes,
};
let result = project_lifetimes(document.project(), f.owner, &geometry);
assert_eq!(result, f.project());
assert_eq!(document.bundle(), &source);
assert_eq!(document.project(), &accepted);
assert!(!document.can_undo());
assert!(!document.can_redo());
}
+19 -7
View File
@@ -484,28 +484,36 @@ fn article(topic: Topic) -> Article {
const {
Article {
summary: "Use a scenario to tell a concrete behavioral story, including repeated messages, actions, state observations and guarded alternatives.",
keywords: "scenario sequence lifeline sender receiver fragment branch alternative loop guard parallel strict optional occurrence exchange action state interface operation allocation call reply unresolved",
keywords: "scenario sequence lifeline lifetime lifecycle birth death capsule sender receiver fragment branch alternative loop guard parallel strict optional occurrence exchange action state interface operation allocation call reply unresolved",
sections: &[
walkthrough(
"Create a scenario",
&[
"Open Behavior & scenarios → New → Scenario and enter its name. Explicitly choose Activities or Participants in OA, or Functions or System boundary in SA. Add optional context only when needed: this is a reference, while the scenario itself belongs at the layer root. Create and open starts the empty scenario.",
"Use Add first lifeline on an empty scenario, or + Lifeline. Choose existing work/participant or Create new source. The explicit viewpoint limits its kinds; choose participant kinds deliberately. Source name and lifeline name are separate, and the source semantic parent is independent of the scenario. No allocation or capability involvement is inferred.",
"Choose + Message and its style. Call + correlated reply creates both occurrences in one edit. Select the exchange and compatible sending/receiving lifelines. Reply to existing call offers valid unanswered calls.",
"Use Action, Observe state or Fragment for other behavior. A local timer has an expression and a lifeline, with no global exchange. Create and delete messages describe participant lifetime; Model checks also flag risks inside repeated loops.",
"Choose a message style and Draw message. Start at a highlighted sequence position on a lifeline, then click or drag to the receiving lifeline. The form retains the chosen position while you select the exchange and details. Escape cancels the gesture.",
"Choose a message style in the tool selector. Start at a highlighted sequence position on a lifeline, then click or drag to the receiving lifeline. Complete the exchange and details in the form, which retains that sequence position. Escape cancels the gesture.",
"Call + correlated reply creates both occurrences in one edit. Reply to existing call offers valid unanswered calls. A local timer has an expression and a lifeline, with no global exchange. Create and delete messages describe participant lifetime; Model checks also flag risks inside repeated loops.",
"Choose Add action, Observe state, Reuse scenario or Add fragment and click the intended sequence position. Clicking an action or observation on a lifeline also selects that lifeline. Complete any remaining choices before Create.",
"In Select / reorder, click an occurrence and drag its ↕ handle to another position within the same sequence. The ordered list's up/down controls provide another way to reorder. Select an occurrence to inspect its particular use of the exchange, including its message values.",
],
),
walkthrough(
"Describe alternatives",
&[
"Choose Fragment and select ALT, PAR, LOOP or OPT. Enter the branch conditions; the tool creates the fragment and its operands together.",
"Use the Destination selector in subsequent message or action forms to choose the intended operand. New occurrences append to that operand's ordered behavior.",
"Use Reuse scenario to refer to existing behavior. Bind every referenced lifeline to a compatible local lifeline explicitly. Open source follows the original scenario without copying its contents.",
"Choose Add fragment, click its sequence position and select ALT, PAR, LOOP or OPT. Enter the branch conditions; the tool creates the fragment and its operands together.",
"Click the highlighted position inside an operand to place the next message, action or reference there. The form shows its destination and insertion position. Append to this sequence instead explicitly moves the pending insertion to that sequence's end.",
"Choose Reuse scenario and click its position, then bind every referenced lifeline to a compatible local lifeline explicitly. Select the resulting use and choose Open definition. Back to caller returns to that exact use and its viewport after you apply or cancel pending edits.",
"Inspect the scenario projection and Model checks. State exactly what each guard means, including units and assumptions where relevant.",
],
),
explain(
"Read lifeline creation and deletion",
"The Lane header and dotted guide identify a lifeline; the guide alone does not establish its lifetime. The stronger solid line shows where the lifeline is known to exist on this scenario path. Create starts that line at a named capsule; Delete ends it at an X. Select the capsule or X to edit that message occurrence. Select the header or guide to inspect the lifeline.",
),
explain(
"Distinguish uncertain lifetime from an unanswered call",
"A ? means lifetime depends on an alternative, optional, repeated or parallel path. Operands have independent lifetimes: Delete in one alternative does not delete a lifeline in another. Beyond such a fragment, the guide can continue without a definite solid line. This uncertainty is not by itself a model error. The … beside an activation marks a Call that remains unanswered on that path. A reused scenario's internal Create/Delete events appear when you choose Open definition; they do not create or delete the caller's lifelines.",
),
walkthrough(
"Invoke an interface operation",
&[
@@ -698,6 +706,10 @@ fn article(topic: Topic) -> Article {
"Map references by meaning",
"Reference mapping connect exact OA and SA identities used by the proposed change. Similar names are not sufficient. Map the records that play the same engineering role, including enclosing fields in qualified message-value paths. Mapping a referenced record does not authorize creating, moving or editing that record. If it needs a counterpart, establish that correspondence first.",
),
explain(
"Edit stored observations deliberately",
"In a trace's Properties, Edit stored history (advanced)… edits the observations retained by that trace. Choose the fact and enter its Operational and System observations explicitly. Not applicable, an observed absent value, and no stored fact have different meanings. Historical references may retain the exact UUID of a deleted record. Apply changes validates the complete history; Undo restores it. These history edits leave both counterpart records unchanged. Use Review counterpart changes… for Keep/Take decisions about their current engineering content.",
),
walkthrough(
"Review one message value or lifeline binding",
&[
+385
View File
@@ -1663,3 +1663,388 @@ fn adding_bend_between_close_ports_stays_outside_owner_clearance() {
}]
);
}
#[test]
fn child_work_preserves_allocated_context_and_atomic_history() {
use oa_core::projection::project_view;
for (layer, performer_kind, work_kind) in [
(Layer::Oa, Kind::Entity, Kind::Activity),
(Layer::Sa, Kind::System, Kind::Function),
] {
for folded in [false, true] {
let mut p = Project::empty();
let performer = p
.add_element(performer_kind, layer, "Performer", None)
.unwrap();
let work = p
.add_element(work_kind, layer, "Parent work", None)
.unwrap();
let allocation = p.relate(
RelationKind::Allocation,
"Engineering assignment",
performer,
work,
);
p.relations.get_mut(&allocation).unwrap().description =
"Retain assignment metadata".into();
let original = p.relations[&allocation].clone();
let diagram = p.ensure_diagram(layer);
p.diagrams.get_mut(&diagram).unwrap().projection = ProjectionKind::Allocation;
let performer_node = p.place(diagram, performer, Position { x: 60., y: 60. });
let work_node = p.place(diagram, work, Position { x: 84., y: 124. });
p = execute_batch(&p, &[Command::Layout(diagram)]).unwrap();
for node in [performer_node, work_node] {
p.diagrams
.get_mut(&diagram)
.unwrap()
.nodes
.get_mut(&node)
.unwrap()
.collapsed = folded;
}
let mut app = App::with_project(p);
send(&mut app, Message::Layer(layer));
send(&mut app, Message::Page(Page::Diagram));
send(
&mut app,
Message::Diagram(crate::app::Choice {
id: diagram,
label: String::new(),
}),
);
let mut first = None;
for step in 0..3 {
let parent = if step == 2 { first.unwrap() } else { work };
send(&mut app, Message::Select(parent));
let before = app.project().clone();
let before_source = app.document.bundle().clone();
send(&mut app, Message::CreateContextElement(work_kind, true));
let created = app.selected;
assert!(
!before.elements.contains_key(&created),
"{layer:?} step {step}: {}",
app.status
);
assert_eq!(app.project().elements.len(), before.elements.len() + 1);
assert_eq!(app.project().elements[&created].parent, Some(parent));
for (id, element) in &before.elements {
assert_eq!(&app.project().elements[id], element);
}
assert!(
!oa_core::validation::validate(app.project())
.iter()
.any(|i| i.severity == oa_core::validation::Severity::Error)
);
assert_eq!(
oa_core::validation::allocation_summary(app.project(), work),
Some(performer)
);
assert_eq!(
oa_core::validation::effective_performer(app.project(), created),
Some(performer)
);
assert!(
!app.project()
.relations
.values()
.any(|r| r.kind() == RelationKind::Allocation && r.target() == parent)
);
if step != 1 {
let mut expected = original.clone();
if let RelationBody::Allocation { target, .. } = &mut expected.body {
*target = created;
}
assert_eq!(app.project().relations[&allocation], expected);
} else {
assert_eq!(
app.project().relations[&allocation],
before.relations[&allocation]
);
}
assert_eq!(
app.project().relations.len(),
before.relations.len() + usize::from(step == 1)
);
let view = project_view(app.project(), diagram);
let parent_node = view.nodes.iter().find(|n| n.element == parent).unwrap();
let child_node = view.nodes.iter().find(|n| n.element == created).unwrap();
let root_node = view.nodes.iter().find(|n| n.element == work).unwrap();
assert_eq!(root_node.visual_parent, Some(performer_node));
assert_eq!(child_node.visual_parent, Some(parent_node.id));
assert!(!app.project().diagrams[&diagram].nodes[&performer_node].collapsed);
assert!(!app.project().diagrams[&diagram].nodes[&parent_node.id].collapsed);
assert!(child_node.position.x >= parent_node.position.x);
assert!(child_node.position.y >= parent_node.position.y + 64.);
assert!(
child_node.position.x + child_node.size.width
<= parent_node.position.x + parent_node.size.width
);
assert!(
child_node.position.y + child_node.size.height
<= parent_node.position.y + parent_node.size.height
);
for sibling in view
.nodes
.iter()
.filter(|n| n.visual_parent == Some(parent_node.id) && n.id != child_node.id)
{
assert!(sibling.position.y + sibling.size.height <= child_node.position.y);
}
let after = app.project().clone();
let after_source = app.document.bundle().clone();
send(&mut app, Message::Undo);
assert_eq!(
app.project(),
&before,
"creation, allocation and reveal/reflow undo together"
);
assert_eq!(app.document.bundle(), &before_source);
send(&mut app, Message::Redo);
assert_eq!(app.project(), &after);
assert_eq!(app.document.bundle(), &after_source);
if step == 0 {
first = Some(created);
}
}
}
}
}
#[test]
fn child_work_does_not_invent_unallocated_or_mixed_performers() {
for (layer, performer_kind, other_kind, work_kind) in [
(Layer::Oa, Kind::Entity, Kind::Entity, Kind::Activity),
(Layer::Sa, Kind::System, Kind::SystemActor, Kind::Function),
] {
// Root leaf, partly unallocated composite, and mixed-performer composite.
for context in 0..3 {
let mut p = Project::empty();
let performer = p
.add_element(performer_kind, layer, "Performer", None)
.unwrap();
let other = p
.add_element(other_kind, layer, "Other performer", None)
.unwrap();
let work = p
.add_element(work_kind, layer, "Parent work", None)
.unwrap();
let mut placed = vec![performer, other, work];
if context != 0 {
let first = p
.add_element(work_kind, layer, "First leaf", Some(work))
.unwrap();
let second = p
.add_element(work_kind, layer, "Second leaf", Some(work))
.unwrap();
p.relate(
RelationKind::Allocation,
"First assignment",
performer,
first,
);
if context == 2 {
p.relate(RelationKind::Allocation, "Other assignment", other, second);
}
placed.extend([first, second]);
}
assert_eq!(oa_core::validation::allocation_summary(&p, work), None);
let diagram = p.ensure_diagram(layer);
p.diagrams.get_mut(&diagram).unwrap().projection = ProjectionKind::Allocation;
for id in placed {
p.place(diagram, id, Position { x: 60., y: 60. });
}
p = execute_batch(&p, &[Command::Layout(diagram)]).unwrap();
let mut app = App::with_project(p);
send(&mut app, Message::Layer(layer));
send(&mut app, Message::Page(Page::Diagram));
send(
&mut app,
Message::Diagram(crate::app::Choice {
id: diagram,
label: String::new(),
}),
);
send(&mut app, Message::Select(work));
let before = app.project().clone();
let before_source = app.document.bundle().clone();
send(&mut app, Message::CreateContextElement(work_kind, true));
let child = app.selected;
assert!(!before.elements.contains_key(&child), "{}", app.status);
assert_eq!(app.project().elements[&child].parent, Some(work));
assert_eq!(app.project().relations, before.relations);
assert_eq!(
oa_core::validation::effective_performer(app.project(), child),
None
);
assert_eq!(
oa_core::validation::allocation_summary(app.project(), work),
None
);
let after = app.project().clone();
let after_source = app.document.bundle().clone();
send(&mut app, Message::Undo);
assert_eq!(app.project(), &before);
assert_eq!(app.document.bundle(), &before_source);
send(&mut app, Message::Redo);
assert_eq!(app.project(), &after);
assert_eq!(app.document.bundle(), &after_source);
}
}
}
#[test]
fn child_work_transfers_leaf_roles_without_fabricating_responsibilities() {
// Direct allocation + matching roles, uniquely realized roles only,
// unresolved roles, and roles realized by different performers.
for context in 0..4 {
let mut p = Project::empty();
let performer = p
.add_element(Kind::Entity, Layer::Oa, "Performer", None)
.unwrap();
let other = p
.add_element(Kind::Entity, Layer::Oa, "Other performer", None)
.unwrap();
let work = p
.add_element(Kind::Activity, Layer::Oa, "Responsible work", None)
.unwrap();
let mut responsibilities = Vec::new();
if context == 0 {
responsibilities.push(p.relate(
RelationKind::Allocation,
"Direct responsibility",
performer,
work,
));
}
for index in 0..2 {
let role = p
.add_element(Kind::Role, Layer::Oa, &format!("Role {index}"), None)
.unwrap();
responsibilities.push(p.relate(
RelationKind::RoleAssignment,
&format!("Assigned role {index}"),
role,
work,
));
if context != 2 {
let source = if context == 3 && index == 1 {
other
} else {
performer
};
p.relate(RelationKind::RoleRealization, "Realizes role", source, role);
}
}
for (index, id) in responsibilities.iter().enumerate() {
let relation = p.relations.get_mut(id).unwrap();
relation.description =
format!("Responsibility {index}: preserve engineering rationale");
let link = Id::new_v4();
p.artifact_links.insert(
link,
ArtifactLink {
id: link,
alias: format!("responsibility_evidence_{index}"),
name: format!("Responsibility evidence {index}"),
description: "Preserve the reference to this exact relation".into(),
owner: *id,
relation: ArtifactRelation::References,
uri: format!("https://example.invalid/responsibility/{index}"),
revision: Some("review-7".into()),
fragment: Some("assignment".into()),
},
);
}
let original_relations = p.relations.clone();
let diagram = p.ensure_diagram(Layer::Oa);
p.diagrams.get_mut(&diagram).unwrap().projection = ProjectionKind::Allocation;
p.place(diagram, performer, Position { x: 60., y: 60. });
p.place(diagram, work, Position { x: 84., y: 124. });
p = execute_batch(&p, &[Command::Layout(diagram)]).unwrap();
let expected_performer = (context < 2).then_some(performer);
assert_eq!(
oa_core::validation::allocation_summary(&p, work),
expected_performer
);
let mut app = App::with_project(p);
send(&mut app, Message::Page(Page::Diagram));
send(
&mut app,
Message::Diagram(crate::app::Choice {
id: diagram,
label: String::new(),
}),
);
let mut first = None;
for step in 0..2 {
send(&mut app, Message::Select(work));
let before = app.project().clone();
let before_source = app.document.bundle().clone();
send(
&mut app,
Message::CreateContextElement(Kind::Activity, true),
);
let child = app.selected;
assert!(
!before.elements.contains_key(&child),
"context {context}, step {step}: {}",
app.status
);
assert_eq!(app.project().elements[&child].parent, Some(work));
if step == 0 {
first = Some(child);
}
for (id, original) in &original_relations {
let mut expected = original.clone();
if responsibilities.contains(id) {
match &mut expected.body {
RelationBody::Allocation { target, .. }
| RelationBody::RoleAssignment { target, .. } => *target = first.unwrap(),
_ => unreachable!(),
}
}
assert_eq!(app.project().relations[id], expected);
}
assert_eq!(app.project().artifact_links, before.artifact_links);
assert!(!app.project().artifact_links.is_empty());
let added = usize::from(step == 1 && expected_performer.is_some());
assert_eq!(
app.project().relations.len(),
before.relations.len() + added
);
assert_eq!(
oa_core::validation::effective_performer(app.project(), child),
expected_performer
);
assert_eq!(
app.project()
.relations
.values()
.filter(|r| r.kind() == RelationKind::RoleAssignment && r.target() == child)
.count(),
if step == 0 { 2 } else { 0 }
);
if context != 0 && step == 0 {
assert!(
!app.project()
.relations
.values()
.any(|r| r.kind() == RelationKind::Allocation)
);
}
assert!(
!oa_core::validation::validate(app.project())
.iter()
.any(|i| i.severity == oa_core::validation::Severity::Error)
);
let after = app.project().clone();
let after_source = app.document.bundle().clone();
send(&mut app, Message::Undo);
assert_eq!(app.project(), &before);
assert_eq!(app.document.bundle(), &before_source);
send(&mut app, Message::Redo);
assert_eq!(app.project(), &after);
assert_eq!(app.document.bundle(), &after_source);
}
}
}
+2 -1
View File
@@ -2,7 +2,8 @@
Run from any directory with Python 3: semantic_schema.py [--check] [--validate].
--validate additionally runs source-7 structural fixtures with jsonschema.
This generates documentation only, never runtime selectors or model mutations.
The desktop stored-history editor reads the checked-in descriptor for field
shapes. Core types and validation remain authoritative for model mutations.
"""
import copy
import json
+49 -5
View File
@@ -1319,16 +1319,25 @@ references a Call occurrence in the same scenario. The call MUST precede the
reply on a guaranteed common sequence/enclosing branch path. Reply lifelines
reverse the call's sender/receiver; it may reuse the call's exchange in reverse
or use an explicit reverse-direction exchange. A second reply to the same call
on that guaranteed path is an error. Missing reply correlation is a draft
that can follow another reply on a shared execution path, including conditional
or parallel operands, is an error. Missing reply correlation is a draft
warning; non-Reply messages MUST NOT have <span class="docutils literal">reply_to</span>.</p>
<p>Create identifies the receiver lifeline's creation. An earlier guaranteed use
of that lifeline is an error. Delete identifies its destruction; a later
guaranteed use is an error. Ordering checks respect branch ownership; they MUST
NOT flatten alternative branches into a false unconditional order. A Timer is
<p>Create identifies the receiver lifeline's creation. Another use that can precede
its creation on a shared execution path is an error. Delete identifies its
destruction; another use that can follow it on a shared execution path is an
error. These checks include conditional and parallel operands but exclude
mutually exclusive alternatives. Ordering checks respect branch ownership; they
MUST NOT flatten alternative branches into a false unconditional order. A Timer is
local to its sender lifeline, has no global exchange or values, and has either
no receiver or the same receiver as sender. Its nonempty expression describes
the delay/deadline; an empty expression warns. Conditions and expressions are
stored engineering annotations, not an executable simulation language.</p>
<p>These ordering checks compare distinct stored occurrences along structural
paths; they do not simulate repeated loop iterations. Repetition risks use
<span class="docutils literal">reply_repetition</span> and <span class="docutils literal">lifeline_repetition</span> warnings separately. For example,
a loop containing one Reply to an outer Call can warn about repetition without
containing two distinct replies; a same-operand Create/use/Delete lifetime can
repeat without its previous iteration being treated as an earlier stored use.</p>
<p>Each MessageValue is <span class="docutils literal">{ path [&#64;parameter]; field &#64;data_field; expression &quot;value expression&quot;; }</span>.
Its identity is the pair (path, field), so two uses of one Record can have
different values for the same terminal field. Path contains enclosing DataField
@@ -2640,6 +2649,41 @@ leaving dangling references. Deleting a sequence does not delete the semantic
exchanges it references. Cross-layer counterparts are not owned descendants.
Text edits describe a complete candidate and must remove or repair dependencies
explicitly before Apply succeeds.</p>
<section id="scenario-lifetime-presentation">
<h3>8.1. Scenario lifetime presentation</h3>
<p>Scenario lifetime geometry is derived from the stored occurrences and their
sequence/operand ownership. It adds no model records, source annotations or
history entries. A lifeline's identity header and neutral editing guide remain
available before creation, after deletion and when its represented element is
unfinished. The guide MUST be visually distinguishable from a live interval;
it is an editing axis, not a statement that the participant exists.</p>
<p>A directly ordered Create starts the receiver's live interval at its occurrence;
Delete ends that receiver's interval at its occurrence. Create uses a named birth
marker and Delete an X, each selectable through the original occurrence identity.
The message's receiving endpoint MUST align with its marker, including self
messages. A pre-existing lifeline without a creation has a live interval from
below its header; without deletion it extends to the visible scenario bottom,
including in an empty scenario. A missing lifecycle receiver MUST NOT be inferred from
the exchange. An explicit local receiver remains meaningful when its exchange
reference is unfinished.</p>
<p>Operands MUST be projected independently from their enclosing entry context.
A lifetime change in an alternative, optional, loop or parallel operand MUST
NOT imply the same change in its displayed sibling or a definite lifetime
after the fragment. When local structure does not establish one lifetime across
the represented paths, the continuation is visually unresolved. A subsequent
explicit Create or Delete in the enclosing sequence can establish a definite interval.
Neither guard text, screen order nor a guessed loop count proves execution.
ScenarioUse remains opaque: opening its definition may show its lifecycle,
but a callee's geometry MUST NOT create or destroy a caller lifeline.</p>
<p>Call activation is distinct from lifetime. A branch-local Delete clips that
branch's visible activation at the death marker without inventing a Reply,
removing an unresolved-call warning or terminating sibling paths.
Solid activation bars are restricted to definite live intervals; an unresolved
continuation retains its uncertainty/call diagnostic rather than depicting
definite survival after a possible deletion. Selection,
insertion slots, source edits and Undo/Redo retain the same semantic identities
and validation boundary regardless of the rendered intervals.</p>
</section>
</section>
<section id="persistence-and-explicit-migration">
<h2>9. Persistence and explicit migration</h2>
+54 -5
View File
@@ -680,18 +680,28 @@ references a Call occurrence in the same scenario. The call MUST precede the
reply on a guaranteed common sequence/enclosing branch path. Reply lifelines
reverse the call's sender/receiver; it may reuse the call's exchange in reverse
or use an explicit reverse-direction exchange. A second reply to the same call
on that guaranteed path is an error. Missing reply correlation is a draft
that can follow another reply on a shared execution path, including conditional
or parallel operands, is an error. Missing reply correlation is a draft
warning; non-Reply messages MUST NOT have ``reply_to``.
Create identifies the receiver lifeline's creation. An earlier guaranteed use
of that lifeline is an error. Delete identifies its destruction; a later
guaranteed use is an error. Ordering checks respect branch ownership; they MUST
NOT flatten alternative branches into a false unconditional order. A Timer is
Create identifies the receiver lifeline's creation. Another use that can precede
its creation on a shared execution path is an error. Delete identifies its
destruction; another use that can follow it on a shared execution path is an
error. These checks include conditional and parallel operands but exclude
mutually exclusive alternatives. Ordering checks respect branch ownership; they
MUST NOT flatten alternative branches into a false unconditional order. A Timer is
local to its sender lifeline, has no global exchange or values, and has either
no receiver or the same receiver as sender. Its nonempty expression describes
the delay/deadline; an empty expression warns. Conditions and expressions are
stored engineering annotations, not an executable simulation language.
These ordering checks compare distinct stored occurrences along structural
paths; they do not simulate repeated loop iterations. Repetition risks use
``reply_repetition`` and ``lifeline_repetition`` warnings separately. For example,
a loop containing one Reply to an outer Call can warn about repetition without
containing two distinct replies; a same-operand Create/use/Delete lifetime can
repeat without its previous iteration being treated as an earlier stored use.
Each MessageValue is ``{ path [@parameter]; field @data_field; expression "value expression"; }``.
Its identity is the pair (path, field), so two uses of one Record can have
different values for the same terminal field. Path contains enclosing DataField
@@ -2062,6 +2072,45 @@ exchanges it references. Cross-layer counterparts are not owned descendants.
Text edits describe a complete candidate and must remove or repair dependencies
explicitly before Apply succeeds.
8.1. Scenario lifetime presentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Scenario lifetime geometry is derived from the stored occurrences and their
sequence/operand ownership. It adds no model records, source annotations or
history entries. A lifeline's identity header and neutral editing guide remain
available before creation, after deletion and when its represented element is
unfinished. The guide MUST be visually distinguishable from a live interval;
it is an editing axis, not a statement that the participant exists.
A directly ordered Create starts the receiver's live interval at its occurrence;
Delete ends that receiver's interval at its occurrence. Create uses a named birth
marker and Delete an X, each selectable through the original occurrence identity.
The message's receiving endpoint MUST align with its marker, including self
messages. A pre-existing lifeline without a creation has a live interval from
below its header; without deletion it extends to the visible scenario bottom,
including in an empty scenario. A missing lifecycle receiver MUST NOT be inferred from
the exchange. An explicit local receiver remains meaningful when its exchange
reference is unfinished.
Operands MUST be projected independently from their enclosing entry context.
A lifetime change in an alternative, optional, loop or parallel operand MUST
NOT imply the same change in its displayed sibling or a definite lifetime
after the fragment. When local structure does not establish one lifetime across
the represented paths, the continuation is visually unresolved. A subsequent
explicit Create or Delete in the enclosing sequence can establish a definite interval.
Neither guard text, screen order nor a guessed loop count proves execution.
ScenarioUse remains opaque: opening its definition may show its lifecycle,
but a callee's geometry MUST NOT create or destroy a caller lifeline.
Call activation is distinct from lifetime. A branch-local Delete clips that
branch's visible activation at the death marker without inventing a Reply,
removing an unresolved-call warning or terminating sibling paths.
Solid activation bars are restricted to definite live intervals; an unresolved
continuation retains its uncertainty/call diagnostic rather than depicting
definite survival after a possible deletion. Selection,
insertion slots, source edits and Undo/Redo retain the same semantic identities
and validation boundary regardless of the rendered intervals.
9. Persistence and explicit migration
-------------------------------------
+10 -8
View File
@@ -1,6 +1,6 @@
# Linux packaging and deployment inputs
The packaging command stages **already-built** desktop/server executables for `x86_64-unknown-linux-gnu`. It runs on Windows PowerShell 5.1 or PowerShell 7 (including Linux) with Python 3.11+ standard library, Git, and the matching Rust/Cargo dependency cache. It does not build, download, install runtime libraries or launch the application. Python creates and reads back the tar archive; end users do not need Python, PowerShell or Rust.
The packaging command stages **already-built** desktop, server and source CLI executables for `x86_64-unknown-linux-gnu`. It runs on Windows PowerShell 5.1 or PowerShell 7 (including Linux) with Python 3.11+ standard library, Git, and the matching Rust/Cargo dependency cache. It does not build, download, install runtime libraries or launch the application. Python creates and reads back the tar archive; end users do not need Python, PowerShell or Rust.
Build and validate first in a source checkout. The current runtime validation baseline is Ubuntu 24.04 x86-64. A glibc symbol inventory is not a claim that every distribution with that glibc version supports the renderer and dialogs.
@@ -9,23 +9,25 @@ Build and validate first in a source checkout. The current runtime validation ba
-Version 0.2.0-rc1 -BinaryDirectory ./target/release -Python python3
```
For an explicit-target build, use `target/x86_64-unknown-linux-gnu/release`. A cross-build may supply another directory containing both `arcadia-studio` and `arcadia-server`. Select the Rust compiler used for the intended build before packaging; its Linux target libraries, copyright reports and locked source/archive cache must be installed. Read-only `cargo metadata --locked --offline --filter-platform x86_64-unknown-linux-gnu` and Rust version/sysroot queries are the only Rust commands run by packaging. When packaging from Windows, `-Python C:/path/to/python.exe` selects Python explicitly.
For an explicit-target build, use `target/x86_64-unknown-linux-gnu/release`. A cross-build may supply another directory containing all three executables: `arcadia-studio`, `arcadia-server` and `arcadia`. Select the Rust compiler used for the intended build before packaging; its Linux target libraries, copyright reports and locked source/archive cache must be installed. Read-only `cargo metadata --locked --offline --filter-platform x86_64-unknown-linux-gnu` and Rust version/sysroot queries are the only Rust commands run by packaging. When packaging from Windows, `-Python C:/path/to/python.exe` selects Python explicitly.
The script refuses existing output/claim names. It creates `dist/ArcadiaStudio-<version>-x86_64-unknown-linux-gnu/`, a `.tar.gz`, and an adjacent `.sha256`. A failed attempt leaves its claim and any partial outputs for diagnosis; choose a fresh version or output root rather than overwriting them. Archives use sorted paths, zero timestamps and uid/gid, 0755 for the two Linux executables and 0644 for other files. Every entry is read back and compared against staging, including permissions. The same unchanged inputs on the same Python/zlib implementation produce the same bytes; this does not promise reproducible compiler output.
The script refuses existing output/claim names. It creates `dist/ArcadiaStudio-<version>-x86_64-unknown-linux-gnu/`, a `.tar.gz`, and an adjacent `.sha256`. A failed attempt leaves its claim and any partial outputs for diagnosis; choose a fresh version or output root rather than overwriting them. Archives use sorted paths, zero timestamps and uid/gid, 0755 for the three Linux executables and 0644 for other files. Every entry is read back and compared against staging, including permissions. The same unchanged inputs on the same Python/zlib implementation produce the same bytes; this does not promise reproducible compiler output.
## Contents and provenance
Both executables, the MIT license, a package-specific README, complete tracked examples (including all water-pressure teaching/evidence files), deployment references and the reachable documentation closure are included. Relative Markdown/reST/HTML file links are checked before archiving; upstream license texts are preserved verbatim and their internal source-tree hyperlinks are outside that documentation check. Untracked private files, caches and unrelated harness history are not included merely because they exist on disk.
All three executables, the MIT license, a package-specific README, complete tracked examples (including all water-pressure teaching/evidence files), deployment references and the reachable documentation closure are included. Relative Markdown/reST/HTML file links are checked before archiving; upstream license texts are preserved verbatim and their internal source-tree hyperlinks are outside that documentation check. Untracked private files, caches and unrelated harness history are not included merely because they exist on disk.
`package.json` records input hashes and static ELF dependencies. `SHA256SUMS.txt` inventories every file except itself; the archive checksum covers that inventory too. `dependency-notices.json`, `THIRD-PARTY-NOTICES.txt` and `licenses/` use the same strict collector as Windows: exact target-filtered normal/build dependency graph, locked crate archives, actual source hashes, checksum-bound supplements and embedded fonts, Rust distribution notices and target-library hashes. Unknown sources, absent notices or changed supplements stop packaging. No Linux system libraries are bundled by this pipeline; their runtime distribution supplies them and its notices.
`package.json` records input hashes and static ELF dependencies. `SHA256SUMS.txt` inventories every file except itself; the archive checksum covers that inventory too. `dependency-notices.json`, `THIRD-PARTY-NOTICES.txt` and `licenses/` use the same strict collector as Windows: exact target-filtered normal/build dependency graph rooted at `oa-desktop`, `oa-server` and `oa-cli`, locked crate archives, actual source hashes, checksum-bound supplements and embedded fonts, Rust distribution notices and target-library hashes. Unknown sources, absent notices or changed supplements stop packaging. No Linux system libraries are bundled by this pipeline; their runtime distribution supplies them and its notices.
ELF preflight requires little-endian x86-64 executables/PIE, the glibc dynamic loader, no RPATH/RUNPATH and a reviewed set of direct libc/compiler-runtime imports. Unknown libraries require an explicit packaging design instead of being silently copied from a developer machine. Graphics/window/portal libraries loaded at runtime are outside that static import list.
Optionally pass `-BuildEvidence <json-file>`, containing nonempty `source_identity`, `profile`, `compiler`, exact `target`, and `binary_sha256` keyed by `arcadia-studio` and `arcadia-server`. Hash strings must be lowercase SHA256. Target and binary hashes are checked; other fields remain explicit caller assertions. Omission records build provenance as unknown. Never label a development binary an optimized release because of its directory or package version.
Optionally pass `-BuildEvidence <json-file>`, containing nonempty `source_identity`, `profile`, `compiler`, exact `target`, and `binary_sha256` keyed by `arcadia-studio`, `arcadia-server` and `arcadia`. Hash strings must be lowercase SHA256. Target and binary hashes are checked; other fields remain explicit caller assertions. Omission records build provenance as unknown. Never label a development binary an optimized release because of its directory or package version.
## Native extracted-bundle checks
Extract into a fresh user-writable Linux directory and run from an unrelated working directory. Verify SHA256SUMS, file permissions, `file`/`ldd` and actual desktop/runtime libraries. A typical Ubuntu runtime needs X11/XKB and Wayland clients, Vulkan loader/Mesa Vulkan drivers, and working session DBus plus an xdg-desktop-portal backend for file dialogs. A successful `ldd` alone is insufficient because these libraries can be loaded dynamically.
The source authoring CLI is `./arcadia`. Run `./arcadia --help` for `check`, `lint`, `stabilize` and `rename-alias`; each takes an explicit `.arcadia` entry file. Mutation commands preview by default and require `--write` to apply their candidate; `--json` produces a machine-readable report. Test writes on a separate project copy. CLI use does not require a display, a server or Rust. Include CLI check, preview, write and unchanged-repeat checks in extracted-bundle acceptance, alongside desktop and server checks.
Extract into a fresh user-writable Linux directory and run from an unrelated working directory. Verify SHA256SUMS, file permissions, `file`/`ldd` and actual desktop/runtime libraries. A typical Ubuntu runtime needs X11/XKB and Wayland clients and Vulkan loader/Mesa Vulkan drivers. Linux Open/Save uses the application's path-entry dialog and does not require an xdg-desktop-portal backend. A successful `ldd` alone is insufficient because graphics/window libraries can be loaded dynamically.
For a software Vulkan trial, first locate the installed lavapipe ICD; only if it exists, use:
@@ -33,7 +35,7 @@ For a software Vulkan trial, first locate the installed lavapipe ICD; only if it
WGPU_BACKEND=vulkan VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json ./arcadia-studio
```
A compatible native GPU may run without these variables. WSLg uses real Linux user space with a particular display environment; record the actual X11/Wayland backend and do not infer support for all Linux sessions from one trial. Exercise Home walkthrough, Help/search, native Open/Save dialogs, a multi-file project, diagram/source edits, Undo/Redo and reopening at normal/minimum window sizes. Compare complete saved model/source and inspect stderr, not merely whether a window appeared.
A compatible native GPU may run without these variables. WSLg uses real Linux user space with a particular display environment; record the actual X11/Wayland backend and do not infer support for all Linux sessions from one trial. Exercise Home walkthrough, Help/search, Linux Open/Save path entry, existing-file handling, SVG export overwrite confirmation, a multi-file project, diagram/source edits, Undo/Redo and reopening at normal/minimum window sizes. Compare complete saved model/source and inspect stderr, not merely whether a window appeared.
Run the server against a separate local data directory and unused loopback port. Follow [server configuration](server.md) for health, authentication, ETags, restart and backup/restore. Test create/import, a changed conditional update, unchanged no-op, stale/invalid rejection, and persistence after a clean restart. Record exact binary/archive/source/compiler hashes and platform. Packaging verification is separate from current-tree release acceptance.
+68
View File
@@ -278,3 +278,71 @@ This is a selected design under implementation, not a native acceptance claim.
Native reverse scenario Apply selected a dependency and inserted five overlapping behavior placements into an unrelated architecture view. Core transition correctness did not make that presentation useful. Select the counterpart of the explicit request root and resolve its nearest scenario/process/chain/state owner. Without an explicit destination diagram, keep the exact core candidate and open Behavior; preserve unrelated architecture views. Retain ordinary architecture transition placement and honor explicit diagram choices.
Automatically creating another architecture view would retain the wrong editing workspace and introduce unrequested model state. Merely navigating to Behavior after adding placements would conceal the presentation damage. Both alternatives are rejected. The selected correction retains one source transaction and Undo operation and guards stale canvas events. Revisit if mixed-root requests or realistic explicit destination workflows require a separate user choice; do not infer such a choice from dependency ordering. Test/build/native acceptance is recorded separately in release-behavior-transition-context-20260906.md.
## Property baselines and explicit alternative cases — 2026-09-11
Problem: complete independent bindings repeat shared engineering assumptions in
every ordinary study case. The user requires practical text-only development and
reduced cognitive load for small and large models. Evaluator implementation
simplicity alone cannot justify that authoring cost.
Select property-owned base values/formulas and one-level case overrides as the next
active-study contract to formalize. Every evaluator caller explicitly requests
ModelBaseline or a particular Case identity; no active UI selection, unnamed
default case or case-to-case inheritance determines meaning. The baseline is the
model's explicit property values, not a mandatory extra record for entering the
first value. Inherited formulas read the requested effective case. An explicit
Unbound override shadows a known base; clearing an override uses the base.
The [executed comparison](release-analysis-context-experiment-20260911.md) passed
218 assertions. Twenty cases with20 fixed/two varying inputs used62 binding rows
under B versus480 under D, with identical results. Updating one shared assumption
required one B binding versus20 D bindings. Reusable predicates eliminated D's
threshold-edit disadvantage, so repeated formulas are not the reason for selection.
Retain an explicit complete independent freeze/export for intentionally separate
assumptions. It must capture effective values/formulas and the full exact definition
environment, including package pins; copying only case rows leaves hidden live
dependencies. Captured revisions and per-input origins must make propagation
visible. Effective dependency/cycle validation and stale result handling must cover
the whole requested context.
Reject compulsory complete cases for ordinary shared-assumption modeling; retain
their useful isolation as an explicit independent snapshot. Reject arbitrary
inheritance and UI-dependent evaluation. Do not import the tiny experiment
interpreter as production architecture. Exact check identity, type/operator
algebra, source syntax, library closure/compatibility, transitions and public
snapshot formats still require the coordinated precise contract. Current source7
does not implement this decision.
Revisit if complete text/native tasks expose unacceptable hidden propagation,
wrong-context edits or inability to preserve reproducible independent studies.
The comparison establishes semantic/text maintenance evidence, not human task
timings or full quantity/library integration acceptance.
## Scenario lifetime rendering integration — 2026-09-11
Codex-ytr83r /root. Adopt the [scoped lifecycle proposal](release-scenario-lifecycle-design-20260910.md)
as derived presentation over existing source-7 semantics. Always retain a neutral
identity header/editing guide; depict definite live intervals separately, with
original-occurrence Create capsules and Delete crosses. Alternative, optional,
loop and parallel operands inherit their enclosing entry independently and leave
an unresolved continuation after a local lifetime change. Reused scenarios remain
opaque. This does not execute guards or add model/source/history records.
Full-height ordinary spines fail to communicate creation/deletion; one global
earliest-birth/latest-death range would falsely order exclusive operands. Both
alternatives lose to the scoped projection. The [independent review](release-scenario-lifecycle-independent-review-20260911.md)
requires true visible root bounds, a complete rendering lane map and local
activation clipping at Delete; insertion bounds/eligible lanes must keep their
separate roles. Receiver endpoints and selectable markers must agree, including
self messages. Those findings determine the integration contract in language
section 8.1 and the real-Scene/native acceptance fixtures.
Core/source semantics are unchanged. In section 4.3, replacing the old
guaranteed-only lifetime/duplicate-reply wording with possible shared-path wording
corrects documentation to `validation.rs` and the existing conditional/parallel
regressions; it does not broaden admission or add a new rule. Compilation and
native acceptance of the renderer are still pending at this decision. Revisit the
visual encoding if actual minimum-size engineering workflows make marker identity,
uncertain continuation or the distinction between guide and existence unclear.
+67 -119
View File
@@ -1,129 +1,77 @@
> Superseded on 2026-09-11. This document is a preserved historical checkpoint.
> Live plans, priorities, ownership and handoffs now reside in [Gitea issue 1](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/1#issuecomment-410) and [issue 2](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/2).
> Do not resume synchronizing this ledger. See [STATE.md](STATE.md) for the integrated checkpoint.
# First release execution plan
Updated 2026-09-11, Codex-9e8r6t `/root`.
[PROJECT_GOAL.md](../PROJECT_GOAL.md) defines the outcome;
[TASK_LEDGER.md](TASK_LEDGER.md) separates evidence from assumptions;
[STATE.md](STATE.md) owns active leases and results.
Updated 2026-09-11 for the published Codex-ytr83r B4 source checkpoint.
[PROJECT_GOAL.md](../PROJECT_GOAL.md) defines the full outcome;
[STATE.md](STATE.md) scopes evidence/ownership and
[TASK_LEDGER.md](TASK_LEDGER.md) separates facts from decisions.
Resumed after the user's virtualization/reboot update. STATE.md supersedes the
historical [RESTART_HANDOFF.md](RESTART_HANDOFF.md) for live status. Postboot
focused3 ran25 passing tests and one failing overflow-fixture assertion; its
test-only correction passed all26 focused4 tests. Strict Clippy, formatting and
matching GUI5657 build also passed; fresh native acceptance continues.
Nondeleting compression completed across282 generated binaries with identical
hashes and11.78GB free; supported Ubuntu26.04 installation passed exit0. Actual
root shell identifies Ubuntu26.04/WSL2. User328 replaces failed mirrored mode
with VirtioProxy; the VPN is immutable. Both new guest startups timed out before
execution, then the distinct WslService restart failed at OS access permissions.
All60 apt archives and five Rust components are downloaded and hash-verified;
guest signature verification/install and Linux Cargo remain pending. No compiler
or WSL client lease is active. The user has now paused Linux builds/checking
until they report WSL networking resolved; do not schedule more Linux setup,
launches, diagnostics or checks before that notice (Gitea comment356).
Lifeline/Chain history and Machine Create/Undo/postboot reopen passed on GUI52;
Fresh GUI5657 cancellation/recovery, Lifeline direct creation/history and Machine
minimum-size owner/Create/Undo/Redo/reopen now pass; full679 desktop tests pass.
## Immediate integration and verification
## Immediate implementation and acceptance
1. Preserve completed integration c81e285/e207b04/b853a1e and reviewed B4 source
52f6e17 on codex/release1-ytr83r. Do not replay equivalent3978/d114 changes.
CLI-only01b76a1 was reviewed and imported as023e3a8 without core/dependency
changes. Preserve the new AGENTS maintenance instruction and exact goal bytes.
2. Core433, independent lifecycle-oracle admission, focused lifecycle22 and full
desktop675 passed on this host. Production freeze2908405 is unchanged by
evidence checkpoint3ade397. GUI build, both-layer history/reopen and corrected
workspace strict Clippy passed. Finish the affected test and Unicode/native
workflows below. Do not repeat the passed suites without a
source change or new finding. Root serializes writers and records exact scope.
3. Use the imported evidence2ec creation-oracle v2 for native Undo comparisons.
Reject unknown/changed detached files while allowing exact files
retained from an explicit pre-Undo origin. Preserve full Project and reachable
SourceBundle equality and original role identities through Redo/reopen.
4. Exercise current Windows UI at minimum/wide sizes: creation name/owner/viewpoint,
one-step history, stale/raw-draft rejection, first Escape/modal priority,
recovery, clicked root/ALT action/observation/reuse, exact caller return,
same-size Fit and natural subsequent scrolling. Use independent semantic
predictions, not only screenshots or serialization of observed outputs.
5. Review current external Gitea handoffs before importing staged prerequisites,
empty-state actions, contextual chooser or source CLI. Validate final combined
workflows and preserve explicit ownership/qualification semantics.
6. After actual B4 test/native acceptance, prepare a distinct runnable Windows
prerelease with current-toolchain notices and exact executable/source hashes.
Existing MCP credentials have now completed a scoped branch push and remote
readback; release attachment upload still needs concrete-artifact verification.
Codex-9e8r6t retains the earlier named-authoring prerelease ownership.
7. Linux setup/downloads/builds/checking are paused by direct user instruction.
Wait for the user to resolve WSL2 networking and explicitly instruct resumption.
Preserve installed Ubuntu, exact VirtioProxy configuration and complete/partial
offline inputs. Networking remains unresolved; preparation is not Linux
acceptance. Follow the current WSL/offline records rather than old reboot plans.
8. Incorporate the owner clarification in issue2: process/scenario interaction
should use consistent direct canvas workflows while preserving domain
constraints. Codex-956atf owns the shared canvas design; B4 rendering and
prerequisite forms support it but do not close this requirement.
1. Preserve and publish the completed native acceptance of GUI `5657BAB5…D3846CE` using
the [v2 plan](release-contextual-source-native-v2-plan-20260911.md). All26
affected tests, strict all-target Clippy, formatting and matching build pass;
the full679 immutable Windows test run also passed. Minimum-size
child visibility, exact recovery/cancel and direct Lifeline Create/Undo/Redo
now pass, along with Machine owner visibility/Create/Undo/Redo/reopen. Preserve
independent first UUID carriers and serialize future compiler/source leases.
Prepare an updated Windows prerelease only with honest per-binary source
identity, package verification and clean packaged runtime checks.
2. Exercise the implemented source subform for Lifeline, process/chain Work and
machine owner, plus semantic first-action prompts. Verify parent-draft
retention, explicit prerequisite and consumer adoption, exact source/history,
cancellation and recovery against the independent staged-source oracle.
Final source guards and guide corrections are complete and reviewed; native
acceptance remains; source/evidence are integrated in `df6f595`. Named creation, nine-file reopen and
SA pending-draft recovery already have their separate native passes.
3. Complete local SA B2 and the saved basic
supplementary move/camera/invalid-draft and minimum-size story; the main basic
model and explicit transition passed full Project+SourceBundle, Undo/Redo and
reopen on candidate 3 at wide size. OA B2 Action, State, bound Reuse and Fragment
now pass complete model/two-source Create, one Undo, one Redo and final OA
reopen/Save with exact original identities. Preserve the existing B3 layer/size
scope; do not infer SA B2 or broader camera/focus coverage from these passes.
4. Integrate standalone B4 scenario lifetimes and the external independent
scenario contract without overwriting local layout work. Resolve source-derived
lifetime versus insertion bounds, activation-after-Delete and lane-map issues.
Close remaining
contextual operand, missing-source and state-naming workflow gaps identified
by the current behavior audit and native study.
## Capability milestones
## Foundational semantic additions
| Outcome | Work and acceptance |
| --- | --- |
| Usable direct behavior/state engineering | Continuous ordered/explicit process authoring, clicked root/nested scenario insertion, exact reuse bindings/caller return, state naming/creation, recovery and source-preserving history. Complete B4 lifetime rendering with actual lifetime bounds, branch-local Delete activation clipping, incomplete lanes and self-arrow endpoints. |
| Precise engineering analysis | Refine property-owned baseline values/formulas plus explicit ModelBaseline/Case one-level overrides. Close quantity kind/unit/value, exact/approximate numerical policy, dependencies/cycles, false/missing/error, complete freeze and definition provenance. Implement coherent validated core/source/REST/GUI/history contracts. An exact-duration slice alone cannot satisfy the full goal. |
| Maintained reusable libraries | Resolve source-only normalization, pinned offline definitions/closure, provenance versus checked same-origin compatibility, source→local instance maps, explicit three-way updates/local divergence, subjectless analysis closure and OA/SA mounted-data transition policy. Demonstrate two projects/two instances, cosmetic and semantic upgrades, conflicts/detach and rollback. |
| Practical complete textual and graphical tasks | Measure small/large text-only creation, cross-file reference navigation, safe alias rename and lossless patch preview. Integrate source CLI and bounded contextual choices; actual keyboard/IME, repeated names, stale events, recovery and minimum geometry must pass. Keep offline guide/examples and normative source documentation aligned. |
| Complete engineering stories | Close OA↔SA transition/reconciliation, typed data/interfaces/state, artifacts, saved views, hosted workflows and tutorial tasks against the full current goal. Confirm parity and precise specification rather than inheriting historical exclusions. |
| Reproducible Windows/Linux release | Current tests/format/strict Clippy, reST/OpenAPI/migration/example gates; real GUI and REST transport/restart/ETag conflict acceptance; matching optimized desktop/server packages, complete notices/archive hashes and clean-runtime launch. Fresh independent requirements/domain/parity/architecture/UX/runtime review resolves material findings before release. |
The updated objective explicitly requires functional constraints/calculations,
quantities/units and maintained model libraries. Current metadata/includes are
insufficient. This work runs independently of useful behavior improvements.
Milestones run adaptively where independent work helps. Analysis and libraries
share definition/identity assumptions and must converge before broad migrations.
Other-host slices remain coordinated through issue #1 and Wiki. Native/Cargo
leases are host-local; source ownership and exact transfer heads are shared.
Peer comment 231 ratifies schema 8/local-definition core steps in an isolated
worktree. Coordinate those actual shared types and ownership before local
integration; the current local core remains descriptive. Source grammar,
evaluation, server/CLI/UI representation and acceptance are separate unfinished
steps. Peer956 now reports focus regression5/5 and isolated numeric26/26 plus
analysis28/28; their codec/lifecycle work remains isolated. Local integration and
coherent union gates remain necessary. Do not replace peer efforts with a
parallel local implementation. Comment338 separately reserves our bounded
syntax-only outline seam for current-text navigation; its private query module
and prepared tests remain uncompiled pending review.
## Evaluator boundaries and replanning
The newest objective also requires complete uncluttered text-only workflows.
Combine the local three-task usability audit with the other host's language/
identity/API design. Two concise current-grammar recipes now pass their bounded
REST identity/source/persistence experiment. The published CLI now covers checked
stabilization and typed alias rename with exact source-preserving preview/write.
Next evaluate cross-file definitions/references and engineering task completion
on repeated-name modular models. Do not equate shorter examples
or parser throughput with task usability, and do not silently change omissions.
Use authoritative source semantics, exact UUID/source preservation and actual
user workflows. Source-only experiments are not accepted new grammar; mounted
widget tests are not native readability; synthetic packaging checks are not
Linux runtime. Preserve old environmental failures as evidence without inventing
current blockers. Continue independent work when platform or transfer work waits.
- Compare real candidate semantics before large changes. Use primary Capella,
SysML and quantity/unit evidence, with explicit compatibility limits.
- Falsify candidates through mass/power/latency budgets, mixed/affine units,
unknown/error/false results, dependency cycles, reference identity and bounded
evaluation. Separate descriptive existing text from executable declarations.
- Probe libraries through two projects/two instances, pinned offline content,
exports/dependency closure, bindings, distinct origin/local identities, updates
with local divergence, detachment and exact transactional rollback.
- Review and test the peer-ratified pure core and its explicit migration/admission
boundaries before local integration. Retain independent falsifiers and current
typed Project, Command and source-writer guarantees across representations.
- Implement the ratified contracts across validation, visitors, deletion,
identity, OA/SA transitions, source/reST, schema/REST, ergonomic graphical
authoring and help. Add real examples and independent parity acceptance.
## Integration and release
- GUI/server release 1, `v0.2.0-preview.authoring.20260911`, and standalone CLI
release 2, `cli-v0.2.0-preview.authoring.20260911`, are published and read back.
Their exact notices, archive, runtime and uploaded-asset evidence is preserved.
CLI packaging is integrated at `27df4a3`; instruction sync `07eb3cd` and
contextual source checkpoint `df6f595` and its raw evidence are integrated.
CLI publication `d95b1ab` and OA native checkpoint `c4bad4b` are also integrated;
then publish later coherent milestones under the assigned owner. Preserve each
artifact's source/profile/native scope and complete final-release gates separately.
- Publish coherent commits and verified bundle transfers through Gitea; keep
concise host-scoped handoffs and Wiki. Do not overwrite another host's branch.
- Refresh relevant source/schema/example/doc gates and run current core,
desktop/server and real REST transport/restart/ETag/draft-conflict workflows.
- Build matching optimized desktop/server packages. Regenerate complete notices
for actual inputs and verify archive contents, hashes and clean-runtime launch.
Historical ELF fixtures and build preparation do not replace execution.
- Follow the external owner's supported Linux guest route and run current
GUI/server workflows when viable. This local host has no usable Linux runtime;
supported WSL2 failed. Preserve failed attempts rather than repeating rejected
workarounds, and continue independent Windows/semantic work.
- After the user reboot, check local Ubuntu registration and launch first. A
version2 default alone is not an installed/running Linux environment.
- Conduct fresh independent requirements, semantic, usability, architecture,
correctness, runtime and documentation reviews. Resolve all material findings,
reverify affected behavior and only then declare release completion.
Historical milestones and evidence remain intact in
[the dated plan archive](history/2026-09-10-ledgers-before-second-consolidation/PLAN.md).
They do not supersede current user scope or imply current-tree acceptance.
[Archived prior plans](history/2026-09-11-ytr83r-integration/README.md) preserve
all previous milestone detail. Update this plan when a counterexample changes
the right next action; do not lower completion criteria after substantial effort.
+41
View File
@@ -0,0 +1,41 @@
# Current engineering work and evidence
Start with the [user goal](../PROJECT_GOAL.md), [current status](STATE.md),
[execution plan](PLAN.md), [task ledger](TASK_LEDGER.md) and
[decisions](DECISIONS.md). Follow [AGENTS.md](../AGENTS.md) and current
[Gitea coordination](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/1)
before changing shared work. Dated reports describe their own source, host and
artifact; they are not current instructions or acceptance of later changes.
## Runnable milestones
- [Windows Studio and REST server authoring preview](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.authoring.20260911)
- [Standalone Windows source CLI preview](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/cli-v0.2.0-preview.authoring.20260911)
These are unfinished development milestones. Their release notes and validation
attachments define exactly what was shipped and tested. Full OA/SA engineering,
analysis, maintained libraries and current Linux acceptance remain unfinished.
## Current local evidence
| Question | Authoritative record |
| --- | --- |
| Which source was integrated? | [Integration audit](release-integration-ytr83r-20260911.md), [CLI import review](release-cli-integration-ytr83r-20260911.md) |
| What does lifetime rendering mean? | [Implementation and corrected review findings](release-lifecycle-render-ytr83r-20260911.md), [language specification](../docs/language.rst) |
| What will native behavior be compared against? | [Independent fixture and procedure](fixtures/scenario-lifecycle-native/README.md), [exact pre-native evidence](experiments/lifecycle-native-ytr83r-20260911/) |
| Which checks ran on this host? | [Host build record](release-host-bootstrap-ytr83r-20260911.md), [current status](STATE.md) |
| What remains for Windows packaging? | [Current runtime/notice preflight](release-b4-package-preflight-ytr83r-20260911.md), [publication path](release-publication-path-ytr83r-20260911.md) |
| Is Linux available? | [WSL outcomes and current user pause](release-wsl-postboot-ytr83r-20260911.md), [preserved offline inputs](release-linux-offline-preparation-ytr83r-20260911.md); setup/build/checking waits for the user's networking-resolution signal |
| What changed for Linux delivery? | [Three-binary CLI packaging and checks](release-linux-cli-packaging-ytr83r-20260911.md), [portable REST restart probe](release-rest-probe-portability-ytr83r-20260911.md); native execution remains pending |
| Which bounded follow-ups are proposals? | [Explicit Action allocation](release-qualified-action-design-ytr83r-20260911.md), [inheritance scaling diagnosis](release-inheritance-scaling-diagnosis-ytr83r-20260911.md) |
External staged-source, chooser and analysis/library owners maintain their current
handoffs in Gitea and the [shared Wiki](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/wiki/Home).
Import exact coherent source checkpoints before transferring conclusions to this checkout.
## History
[Archived integration ledgers](history/2026-09-11-ytr83r-integration/README.md)
preserve source-specific facts and earlier ownership. Existing dated evidence and
Git history remain available. Preserve unique findings and update links before
moving or removing material; active issue #1 remains open for the unfinished goal.
-63
View File
@@ -1,63 +0,0 @@
# Restart handoff — 2026-09-11
Historical reboot checkpoint. User has returned and enabled virtualization;
current STATE.md and the postboot native/layout/WSL reports supersede the pause
and pending-result wording below. Preserve this record for exact resume history.
Codex-9e8r6t /root. User explicitly requested a reboot pause to make WSL2/Ubuntu
available. Full PROJECT_GOAL remains active and incomplete. Resume only after
the user returns; do not schedule automatic work during the reboot.
## Saved state
- Branch `codex/release1-9e8r6t`: contextual source `df6f595`, CLI publication
evidence `d95b1ab` and complete local OA scenario evidence `c4bad4b` were pushed
and read back. The following reboot commit also preserves reviewed WIP below.
- Both Windows Studio/server and standalone CLI prereleases remain published.
This checkpoint does not update either release or establish Linux acceptance.
- Immutable GUI52DE82 native source trial: Lifeline Save-adoption and Chain
direct Create each passed complete model/source, one Undo and one Redo with
original IDs. Machine direct Create/Save passed six exact files; one Undo/Save
passed four reachable/six physical files. Machine Redo/reopen remain pending.
Test GUI closed normally, and its returned window was absent at 13:38 UTC.
`work` contains the saved Machine Undo state. Do not infer persistent history;
use preserved first machine checkpoint for isolated reopen and a fresh trial
for missing history coverage. See release-contextual-source-native-20260911.md
and experiments/contextual-source-native-20260911/README.md.
- Reviewed WIP: source_draft.rs essentials-first layout, explicit wrapped kinds
before unbounded parent text, plus creation.rs staged-owner caption fix.
Three real Paragraph tests are prepared. First compile failed in test helpers
(ambiguous macro and wrong Id constructor); corrected only those helpers.
Corrected focused2 was interrupted for this reboot before any tests ran;
Clippy/fmt/GUI did not launch. There is NO new passing suite or matching GUI.
- Worker release_audit stopped its command with Ctrl+C; all Cargo/rustc/linker
processes were absent. All 238 frozen input hashes were unchanged.
Final source_draft SHA prefix C8D36BD6; creation SHA prefix 0FB19BE3.
Exact freeze inputs3 SHA256
`6B3F3088FF18AF3899C3764B3F3671DA9240A5DE184D871BF08F8012456E556B`.
## Next actions after reboot
1. Read AGENTS, PROJECT_GOAL, STATE, PLAN and latest Gitea issue 1/2 comments and
relevant Wiki. Preserve Codex-956atf canvas/chooser/schema8 and Codex-ytr83r
B4/Linux ownership. User issue2 comment250 allows domain-constrained diagram
manipulation; arbitrary free movement is not required.
2. Recheck `wsl --list --verbose`. Before reboot it reported no installed
distribution despite default version2. Launch/setup Ubuntu as needed with
the user handling any authentication. Verify a real usable Linux environment
before claiming a build. Do not repeat rejected VM workarounds.
3. Validate the frozen input manifest, then resume a new focused3 run. Keep
focused1 failure and focused2 interrupted evidence. On a pass, run strict
desktop all-target Clippy, formatting and matching GUI build; use a distinct
immutable stage. No broad full-suite repeat without a new reason.
4. Root alone performs native Computer Use with @oai/sky. Relaunch the corrected
artifact in a fresh profile and verify initial Name/kind/parent visibility at
1100×700, the owner label, direct Lifeline Create, remaining cancellation/
recovery and machine history/reopen using independent expected contracts.
5. Continue SA B2, basic supplementary workflows, peer integration, complete
semantic/text/REST/library work, Windows/Linux packaging and fresh final
cross-disciplinary acceptance. The full release remains unfinished.
Private runtime and build stages under `.local` are retained; no temporary
binary, token or credential was committed. Raw interruption/native records are
archived separately with exact hashes. All workers are idle for the reboot.
+64
View File
@@ -0,0 +1,64 @@
# Resume after the user-requested reboot — 2026-09-11
Codex-ytr83r /root. The complete first-release goal remains active and unfinished.
Read AGENTS.md, PROJECT_GOAL.md, current Gitea issues1/2 and Wiki before resuming.
This is a pause for the user's reboot, not a completed milestone or failed test.
## Saved source and evidence
Branch: codex/release1-ytr83r. Production source is B4 lifetime rendering52f6e17
plus CLI01b imported as023e3a8. b96286e records exact core/oracle evidence and
current harness index. d041212 preserves owner instruction-sync history and the
byte-exact supplied PROJECT_GOAL. a9a5768 records the Linux trial and contextual
source integration review. Later checkpoint commits add this resumption note.
Core all-targets passed433 tests, one intentionally ignored probe; the optional
probe separately passed. The independent lifecycle oracle and all six frozen
baseline/rename files passed before any native GUI launch. See the harness index.
No current desktop compile/test/native acceptance has been established.
## Interrupted Windows build
Cargo session93786 was interrupted at the user's request while compiling Iced
dependencies (last log entry cc1.4.5). It exited1 from interruption; no final gate
status JSON was emitted. A readback found no cargo.exe/rustc.exe process. Exact
partial log and explicit interruption record are in
experiments/lifecycle-native-ytr83r-20260911/. Preserve cached target outputs.
Use the existing ignored task-local toolchain, one Cargo job, after checking no
other writer is active. From the repository root in PowerShell:
```powershell
& '.local\run-gate.ps1' -GateName 'ytr83r-desktop-lifecycle-resume' -CargoArgs @('test','--locked','--offline','-p','oa-desktop','scenario_lifecycle','--','--test-threads=1')
```
The wrapper loads .local/toolchain/env.ps1. Then run appropriate direct-canvas,
full/strict desktop, server/CLI and GUI build gates serially. Review the new
typography report: wide Unicode Create labels can overflow the fixed capsule.
The proposed clipping correction is not implemented; preserve existing fixtures
and define separate expected Unicode cases before native output. Actual Windows
wide/minimum/Fit/Save/Undo/Redo/reopen acceptance and B4 packaging remain pending.
## Linux after reboot
Recheck wsl --status and wsl --list --verbose. Before reboot, no distribution was
installed; WSL reported virtualization unavailable and Windows had a pending
reboot. Hardware virtualization must be available (firmware or nested VM host).
No host setting was changed and no reboot was performed by the agent.
Prefer a working WSL2 Ubuntu for real Linux build/runtime validation. The verified
Ubuntu image and QEMU cache remain under .local/linux-host-ytr83r. Its bounded
UEFI/TCG pilot ended without guest-ready evidence; all owned pilot processes
stopped. Do not repeat failed delivery or infer Linux acceptance from the image.
## Coordination and next integration
Codex-9e8r6t owns contextual prerequisites; df6f5956 is available locally and has
a reviewed minimal import path, with two B4-preserving merges. Later short-host
layout and Save-procedure corrections are separate; inspect the current remote
handoff before import. Codex-956atf owns chooser, shared constrained canvas design
for issue2, and analysis/library contracts. Local audit agents have stopped their
assigned work. They must recheck coordination before taking new tasks.
The two published Windows authoring/CLI prereleases remain available. No B4
release should be published until actual current tests/native acceptance pass.
+28 -317
View File
@@ -1,338 +1,49 @@
# Progress Ledger — first release
# Integrated checkpoint — 2026-09-11
Updated 2026-09-11, Codex-9e8r6t `/root`, Windows host.
**Release remains unaccepted. Windows/product work continues; Linux is paused by the user.**
The [restart handoff](RESTART_HANDOFF.md) preserves the earlier pause; current
results and capacity constraints below supersede its active-status wording.
Codex-ytr83r, branch `codex/release1-ytr83r`. The full [user goal](../PROJECT_GOAL.md) remains incomplete. Live integration/acceptance work is in [Gitea issue5](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/5); the [project overview](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/1) and [process/scenario requirement](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/2) link other work. This file scopes integrated code and evidence.
## Objective and current source
## Verified code and capabilities
Deliver the complete OA/SA first release in [PROJECT_GOAL.md](../PROJECT_GOAL.md).
The latest authoritative attachment is
`815ff7b9-73c4-41a2-a809-635ecf8389d6/goal-objective.md`, read in full and preserved
in that file. It requires constraints/calculations, quantities/units and reusable
libraries, plus uncluttered human/AI text-only modeling at small and large scale.
Long homogeneous lists and poor behavior editing remain explicit concerns.
Earlier published checkpoint `3ade397008cffe826d5f5a70e7c0233159e3bd42` contains production `29084050a7c020e0fb488be37c6e1ab235769cc0`; push and exact remote readback passed. It combines prior named behavior creation/history integration (`c81e285`, `e207b04`), corrected creation-oracle evidence (`b853a1e`), CLI-only integration (`023e3a8`) and B4 lifecycle rendering.
Local branch: `codex/release1-9e8r6t`, substantive source checkpoint
`df6f59562643b7771ecf0c972f8655f3e3f1c4da`, committed, pushed and read back.
It follows the user's instruction sync `07eb3cd`.
The preceding committed and pushed code/package checkpoint is
`27df4a3945ebc97cd7cbde61f6aeea7a91c680d3`. It includes named behavior creation,
source CLI, the nine CLI packaging changes and reviewed evidence. Source CLI
semantic commit `01b76a1`, packaging assembly `a0a48e8` and release integration
`27df4a3` are distinct. Contextual prerequisite creation, its reports/oracle and
40 raw evidence files are integrated in `df6f595`; native acceptance continues.
All 238 frozen build inputs and 44 exact index artifacts passed before commit.
Gitea issue 1 records the handoff in comment 242. Remote AGENTS.md at blob
`4b8465c8993107062ad2974c15a958d449530e92` adds the maintenance instructions
announced in comment 229: concise current entrypoints, durable history and
coordinated preservation rather than indiscriminate deletion.
B4 renders local lifetimes, branch-local activation termination, neutral incomplete lanes, Create capsules and Delete markers with original occurrence identity. Real Windows OA/SA six-case matrices and separate name-only Save/Undo/Redo/reopen workflows passed complete independent Project, reachable-source and physical-file comparisons. These are bounded fixture checks, not complete product usability acceptance.
## Current acceptance checkpoint — postboot work
- [Native lifecycle observations and limits](release-lifecycle-native-ytr83r-20260911.md).
- [OA evidence archive](lifecycle-native-ui-oa-archive-20260911.md) and [SA evidence archive](lifecycle-native-ui-sa-archive-20260911.md).
- [Lifecycle implementation and independent findings](release-lifecycle-render-ytr83r-20260911.md).
- [Creation and source integration evidence](release-staged-source-integration-ytr83r-20260911.md).
CLI publication evidence `d95b1ab` and complete OA native evidence `c4bad4b` are
also pushed and read back. The reboot checkpoint preserves reviewed layout/owner
caption WIP, native evidence and interrupted compiler records; it is not a new
accepted build. This update follows published reboot checkpoint
`ca53f574e57381a523e946d5277b4081cff74355`; the newer results follow below.
After successive user reboots, the latest observed boot is13:59:33.500 UTC.
Source `321897fd55af9e07afa2c6ebf1e50be49e86f7d9` integrates the published contextual source-creation/minimum-card corrections from b2c3e540 with B4 and the header clipping correction. Its own Windows desktop all-targets gate passed 704 tests. [Exact selective integration, independent union review and Windows results](release-contextual-integration-update-ytr83r-20260911.md).
The postboot focused3 gate reached a real terminal before that reboot:25 passed,
one new long-parent fixture assertion failed; no production visibility assertion
failed. A reviewed test-only stronger fixture is frozen for focused4, preserving
the same215-pixel host and all visibility guarantees. Automatic approval review
blocked both exact proposed incremental-cache removal attempts before execution,
with only `blocked by policy`; no deletion ran. Nondeleting NTFS compression
recovered capacity instead. The incremental-cache pass was partially applied
then intentionally stopped; the generated-binary pass completed exit0 across
282 files with every SHA256 unchanged. C had11,777,519,616 bytes free afterward.
Supported Ubuntu26.04 installation finished exit0 at14:36:46 UTC (session32405),
with10.51GB host space remaining. First actual root shell reports Ubuntu26.04
LTS, x86_64 Linux6.18.33.2-microsoft-standard-WSL2 and a mounted root filesystem.
A systemd root-user-session warning remains recorded. The user316 mirrored/DNS
settings were applied and runtime mirrored mode verified, but the guest had only
loopback, no route and failed DNS/HTTPS. Read-only host IPv6 evidence is a cause
hypothesis only; no global registry/adapter/VPN/firewall change was made. User328
now supersedes that trial with VirtioProxy and explicitly makes AmneziaWG
immutable, including inspection. Its exact VirtioProxy-only config is saved;
both the initial startup and one persistent root-shell retry after compilation
ended with CreateVm/0x800705b4 before guest commands. A distinct WslService-only
restart then failed at Windows service access; it remains Running. No elevation
workaround, extra launch or other service/network change followed. This is a
startup timeout, not a measured VirtioProxy network failure. Root rechecked the
Gitea issue through comment348 after renewed user steering: owner328 remains
the latest posted solution and is already applied. Verified official Rust archives
and all60 exact Ubuntu packages are prepared via Windows HTTPS; Ubuntu
signature verification and installation remain mandatory. Windows
focused4 passed26/26 after11m05 compile and9.54s test execution, retaining every
geometry assertion. Strict all-target Clippy and workspace format also passed.
Matching GUI compilation also passed; session87425 is terminal and no compiler
lease remains live. Immutable GUI SHA256 is
`5657BAB5C841939B66F901EFE6C0FFB2D7CBBE8CC5F111A0CA3DE8073D3846CE`.
All238 actual source inputs were rehashed unchanged. After the26 affected tests,
the immutable complete desktop executable passed all679 tests at15:47:53 UTC,
zero failed/ignored/filtered, exit0, one test thread and ordinary Windows stack.
The user subsequently directed that Linux builds and
checking be skipped until they notify us that WSL networking is resolved. Linux
setup, launches, diagnostics, builds and checks are paused; preserve current
configuration and inputs. This direction is recorded in Gitea comment356 and
supersedes service-access next steps. See
[WSL readiness](release-wsl-readiness-9e8r6t-20260911.md).
Published production `865483b4c66361a01fe0d9e731859220bafb4136` adds the reviewed child-work correction: first refinement transfers existing Allocation and RoleAssignment identities, metadata and artifact references to the child; later siblings inherit only a unique performer. OA/SA regressions cover nested children, roles, folded grouping, unallocated/mixed controls and exact history. The extracted Studio `BF9C2E61…` passed actual OA first-child, sibling and grandchild creation plus Save/Undo/Redo comparisons against original complete model/source checkpoints. Reopening and the SA native counterpart remain unverified. [Child-work fixture and oracle](fixtures/child-work-native/README.md); [native OA evidence](experiments/native-child-oa-865483b-20260911/README.md); [live acceptance boundary](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/4).
Fresh GUI5657 v2 Lifeline baseline opened through the native file picker. At
1100x700 client size with both panels, child Name, Activity, OA root and pinned
Back/Use controls were visible; a maximize/restore retained both raw names.
The completed recovery record passed exact accepted-baseline, raw parent/child,
kind/root and reserved-ID checks before a controlled isolated process stop.
Recovery restored an unsaved local copy with an exactly equal accepted baseline
and authored behavior/identities. Child Escape retained the parent; a new blank
child, temporary Use and parent Cancel left nothing to undo. Save As to a fresh
destination passed the unchanged core oracle with exactly two source files.
The isolated process closed normally. A fresh direct Lifeline trial subsequently
passed actual Create-before-Save, one Undo/Save and one Redo/Save against the
complete independent model/source/original-ID contract. Fresh Machine owner
visibility at minimum size, actual Create and open, one Undo/Save, one Redo/Save
and real-picker reopen/SA/Save also pass the unchanged complete contract. All
new source and consumer identities persist; Undo retains only the two proven
generated files. The final six-file reopen equals Redo exactly, and all isolated
native processes closed normally. See the
[v2 native report](release-contextual-source-native-v2-20260911.md).
## Verification scope
Peer956 comment338 reserves our bounded syntax-only language outline seam;
their codec/lifecycle scope remains separate. The query experiment is private,
uncompiled and not integrated. The current design is
[text navigation](release-text-navigation-design-20260911.md); a discovered
Unicode path-collision mismatch is being corrected in a separate proposal.
Independent outline review additionally requires rejecting noncanonical UUID
spellings as authored navigation anchors and recommends folding paths once.
Root verified the parser mismatch; the author is preparing a separate v2 patch.
On this Windows host, core all-targets passed433 tests with one intentionally ignored scaling probe; that probe separately passed with unoptimized timings. Production29084050 passed focused lifecycle22 and full desktop675 tests (the22 are included in675), and the ordinary GUI build/launch. An equivalent test-helper let-chain correction subsequently passed strict workspace/all-targets Clippy and its focused regression1/1. These results predate the newly identified header-rendering correction.
- CLI `BAD169F8…E3559`: author 12/12, strict all-target Clippy/format/build pass;
independent 183 assertions across 21 fresh processes pass. All four committed
experiment files retain their measured bytes. JSON describes complete changed
files, not a saved whole-candidate plan. See the two source-CLI reports.
- Contextual source first frozen artifact `6E677F58…8CC0`: focused 22/22 and full
desktop 675/675 pass, 448.33 seconds execution. The later inactive-source origin
bypass and guide wording are fixed and independently reviewed. Final source
across 13 desktop files passed 23 focused tests, 3 guide tests, strict all-target Clippy,
matching GUI build and formatting. GUI SHA256 starts `52DE82E4`; its test
inventory is 676. There is no full 676-suite pass. Root verified the frozen
inputs/executable and launched PID 7212 in the isolated
`.local/native-qa/contextual-source-20260911-v1` stage. Lifeline Save-adoption
and Chain direct Create each pass complete model/source and one Undo/Redo.
Machine direct Create/Save and Undo/Save pass; its Redo remains pending.
A fresh-profile postboot Open/SA view/Save now passes complete six-file model,
source and original identities. That GUI closed normally. See
[native results](release-contextual-source-native-20260911.md).
- Native scenario B3: both OA use-return paths pass wide and minimum sizes;
both SA paths pass minimum focused canvas. Pending disabled Open preserves the
draft; explicit Cancel/Save matches exact baseline. B2 OA Action, nested State,
explicitly bound Reuse and Fragment all pass independent complete Project and
two-source Create/Save, one Undo/Save and one Redo/Save predictions, retaining
original exact identities. Final OA reopen/Save also passes. SA B2 remains
pending locally; B3's earlier size/layer scopes are unchanged. See
[local scenario native evidence](release-scenario-native-local-20260911.md).
- Root published GUI/server release **1**, `v0.2.0-preview.authoring.20260911`,
at 12:40:51 UTC, using source `2ec72d4`, D4D9 GUI and EFEE server.
ZIP `664F30B6…` has 559 files and passed
strict notices, independent complete archive/source correspondence, clean GUI
launch/example/Save/help/close and server create/get/restart persistence. All
three release assets passed full downloaded readback. Reports/raw evidence are
committed in `6a61061`; see [GUI/server publication](release-authoring-prerelease-published-20260911.md).
This is a prerelease, not full OA/SA acceptance.
- Root published CLI release **2**, `cli-v0.2.0-preview.authoring.20260911`, at
12:50:39 UTC. Tag and release readback match `27df4a3`, draft false and
prerelease true. ZIP `2B051F8C…` has 114 files, 27 notice packages and exact
BAD169F8/F456 executable/runtime. Independent clean CLI 156 assertions across
10 invocations pass; all three uploaded assets passed downloaded hash readback.
[Publication report](release-cli-prerelease-published-20260911.md) preserves
the exact records and distinguishes local CRLF notes from the public LF body.
- [Exact current-host logs and inputs](experiments/lifecycle-native-ytr83r-20260911/).
- [Test-only Clippy correction](lifecycle-clippy-correction-ytr83r-20260911.md).
- [Current-host toolchain setup](release-host-bootstrap-ytr83r-20260911.md).
- [Independent Windows gap review](release-windows-gap-review-ytr83r-20260911.md).
## Completed work and scoped evidence
The closed 321897f Windows gate passed 704 desktop tests with zero failed/ignored/filtered; all 261 recorded build inputs remained unchanged. Matching server `ABA87A5F…` passed semantic HTTP checks (204 schemas, 19 values, 9 rejected invalid shapes) and the corrected REST probe's 25 requests. [Closed runtime evidence](experiments/windows-runtime-321897f-20260911/README.md) preserves both earlier source-version failures. [Earlier integration checkpoint evidence](experiments/contextual-lifecycle-integration-ytr83r-20260911/README.md) preserves server/CLI 68 across 7 targets, schema 72/204 after the missing-jsonschema correction, and the old GUI's wide-name passive Save comparison.
- Palette inline naming and focused Escape: `7d1df4f`, independently published as
`codex/palette-authoring-20260910`. Candidate 2 focused tests, GUI build and
strict desktop Clippy passed. Its native F2 rename/Save/Undo/Redo matched exact
three-file expectations; Entity creation matched the complete independent
model/source oracle. Candidate 3 completed ordinary Activity, existing placement,
allocation, direct Interaction and F2: complete basic model/four sources PASS.
Explicit SA actor/destination transition passed complete model/six sources;
Undo four-source baseline, Redo six-source result and reopen all passed. Six
physical files are byte-identical across reopen/reuse-preview Cancel/Save.
Immutable checkpoints/logs: `.local/native-qa/palette-20260910-v3/`.
- Recovery naming autofocus: `31b7dc3`, 13 focused checkpoint tests passed after
integrated compilation. The later SA behavior draft's native recovery,
autofocus and Escape evidence is recorded in the creation report below.
- Other-host behavior/topology/scenario/history: original `01bb52a` integrated
as `057eddd`; constructor cache fix `b6b76ef` integrated as `a70de55`; explicit
history seed fix `4ecad78` cherry-picked as `81668f9`.
- Corrected immutable desktop artifact completed **631/631 passed**, 408.18 seconds,
exit 0; all three prior 618-artifact failures are fixed. Exact artifact/logs in
`.local/scenario-workspace-20260910/tests-81668f9/`. It covers `3978bbe` workspace,
Back/OpenUse guards and both history fixes, but not later Sensor/creation work.
- A real same-size owner/document Sensor regression led to `d114a27`; affected
scenario 53/53 passed. Historical native candidate 3 predates that correction.
Mounted workspace tests cover 500×570 and wide geometry; later local native
B2/B3 results have the separate scopes recorded above.
- Named local creation passed final 21/21 and guide 3/3 after ancestry-label
correction. The matching immutable desktop suite passed **653/653**, 362.83 seconds,
zero failures/ignored; exact artifact `864B0F…E86` and logs under
`.local/behavior-creation-20260911/tests-final`. Independent integration review
found no additional correctness blocker. Strict Clippy with all targets and
`-D warnings`, plus workspace formatting, pass after one behavior-equivalent history_fields let-chain
correction; affected history 63/63 and matching GUI rebuild pass. This frozen
creation GUI is `gui-verified` SHA D4D9C2BD…B20C31. At actual 1100×700 client size,
named OA Process, explicit ParticipantInteraction Scenario with capability
context and SA owner-linked State machine plus requested first view passed
complete independent Project/SourceBundle checks at 7/8/9 files. Each single
Undo/Redo preserved exact expected semantics, sources and role identities.
Reopen/Save retained all nine physical source files byte-for-byte. Wide/minimum
draft cancellations retained the initial six files exactly. Detailed report:
[native creation](release-behavior-creation-native-20260911.md).
- Independent creation oracle v2 corrects a harness assumption: Save retains
known detached source files after Undo. Full Project and reachable source
equality remain mandatory; the complete physical inventory must equal the
explicit pre-Undo checkpoint overlaid with expected reachable bytes. Unknown,
changed or missing retained files fail. No product defect was hidden by this
correction; see [oracle review](release-behavior-creation-oracle-20260911.md).
- Fresh source-7 constructor probes passed 54 explicit/omitted comparisons and
12 required-field refusals across OA/SA, with complete typed models, canonical
reparse and exact authored no-op/name-edit retention. Constructor and Scenario
default wording now describes current behavior; strict HTML regeneration
passed. Other constructor families are explicitly outside this evidence.
See [default review](release-constructor-defaults-review-20260911.md).
- Source schema checks passed: 72 fixtures, 204 schemas, 14 families, 90 scalar
leaves. API/language reST rendered with strict docutils without warnings.
- Packaging committed `b98f135`: portable Linux adapter, shared package checks,
Docker input validation and exact upstream notices. Independent review found
and fixed five concrete defects. Python 11/11 and PowerShell contracts pass.
Historical Windows-input ZIP has 557 files; real Linux notices close over
339 packages/681 files. Linux archive adapter used inert ELF fixtures, not
actual current application binaries. Exact Fira/Cantarell notice Git bytes
were independently verified. Later exact GUI/server and CLI packages have
their own regenerated notices and published artifact evidence above.
- Independent native Capella creation study completed, saved and closed cleanly;
report `release-capella-creation-study-20260910.md` is complete. Viewpoint-first
naming and distinct local create/existing selection inform the implementation.
- Textual usability audit completed three static tasks and example counts. The
existing grammar already permits omitted initial IDs/defaults; key gaps are
cross-file reference context, safe alias refactoring and reviewed patches.
Source-7 EBNF/schema documentation and viewpoint omission guidance are corrected;
generated language HTML passed strict docutils. Both concise snippets passed
26 real REST requests: identity-only stabilization, exact no-op/name edit,
stale/invalid nonmutation and restart persistence. All 120 current core/server
files match the preserved source-7 binary's documented snapshot. This closes
the bounded recipe gap, not large-model or native text-editor acceptance. The
verified recipe is now `examples/text-first` and in the language reference.
The later 865483b Windows desktop gate passed **707 tests**, including the three focused child-work regressions, with zero failed/ignored/filtered. All 261 recorded build inputs stayed unchanged. The matching debug GUI build and strict **desktop-only** all-targets Clippy passed; child-work and staged-source checker compilation/admission also passed. [Closed gates and exact inputs](experiments/windows-gates-865483b-20260911/README.md). These checks do not establish the remaining native rendering or packaged acceptance.
Detailed evidence: [integrated gates](release-integrated-gates-20260910.md),
[palette native](release-palette-native-20260910.md),
[scenario workspace](release-scenario-workspace-20260910.md),
[creation design](release-local-behavior-creation-20260910.md),
[packaging implementation](release-packaging-implementation-20260910.md),
[independent packaging review](release-packaging-independent-review-20260910.md).
The extracted package's unchanged server `ABA87A5F…` passed the actual HTTP schema checks (204/19/9) and 25-request REST editing/persistence/restart probe with a restricted process PATH and unrelated working directory. Seven raw response pairs and exact source snapshots matched; all five test-owned server processes stopped. The first REST run's PowerShell-added PATH directory is preserved as historical evidence; the corrected restricted-PATH rerun is authoritative. [Packaged server evidence](experiments/packaged-server-865483b-20260911/README.md). This completes bounded server runtime acceptance, while the new Windows preview remains unpublished pending the separate GUI checks.
## Active ownership and execution
## Material limitations
Root owns integration, native input, commits, publication and Wiki updates.
GUI5657 native trials and the complete679 desktop tests are terminal; no owned
Studio, compiler or test process remains. All Linux actions are user-paused.
Native wide Latin/CJK checks found neutral lifeline header text overflowing its card; Create labels remained contained. The [header correction](lifecycle-header-overflow-correction-ytr83r-20260911.md) is included in the tested 865483b source, but matching corrected pixels and combining/emoji native appearance remain unverified. The old GUI's wide-name passive Save pass establishes identity/model/source/file equality, not corrected rendering. Complete combined native and packaged acceptance remain separate. During the OA reopen check, the Computer helper repeatedly failed with `window capture timed out: timed out waiting on channel`; fresh window selection and one clean helper restart did not recover capture. Native input stopped at the Open dialog with the accepted grandchild result already saved. This is a validation-tool failure, not evidence of a model failure or a successful reopen.
- `release_audit`: full-suite/recovery archives frozen; now audits updated
Windows package inputs and per-binary source provenance without building.
- `behavior_audit`: Lifeline evidence frozen; prepares separately reviewed v2
bounded outline/query proposals. No production application or compiler lease.
- `linux_readiness`: Linux remains paused. Completed independent outline review;
now preserves only the completed Windows Machine evidence.
- Codex-956atf: owns chooser/workspace/focus, shared canvas shell and isolated
schema8/local-definition core. Reported focus5/5, analysis28/28 and numeric26/26
plus core Clippy; codec/lifecycle work remains separate. None of that later
peer source is integrated locally. Our bounded language outline seam is
reserved by comment338; source8/codec ownership remains theirs.
- Codex-ytr83r: owns external B4 Scene/lifetime integration and Linux packaging.
Linux work is paused; peer host results cannot substitute for local execution.
Other chooser/canvas and text-navigation contributions still require their own integration and verification. Calculations, quantities/units, maintained libraries, practical large-model textual workflows, complete OA↔SA engineering parity, documentation and fresh cross-disciplinary review remain full-goal requirements. See the [analysis proposal](release-analysis-semantics-design-20260910.md), [library proposal](release-libraries-semantics-design-20260910.md), [text-authoring design](release-textual-authoring-design-20260911.md) and [decisions](DECISIONS.md) for attributed design evidence, not completed implementation claims.
User issue2/comment250 calls for consistent, domain-constrained interactive
diagrams, not necessarily arbitrary placement. Codex-956atf owns the shared
canvas-shell implementation in an isolated worktree (comment261). Existing
technical Canvas widgets and source cards do not close this requirement.
Local Ubuntu26.04 is installed; the last two startup attempts timed out before
guest execution. Preserve that history and verified inputs while waiting for
the user's explicit notice that WSL networking is resolved.
## Platform and published deliverables
Verified bundles for `eb5161b` and `4ecad78` are retained in
`.local/integration-20260910`. Local refs `codex/behavior-snapshot-eb5161b` and
`codex/history-seed-20260910` preserve exact commits. B4 lifetime projection and
its guide delta are not integrated yet; coordinate shared scene wiring. Review
found insertion versus lifetime bounds, activation after branch-local Delete and
unassigned-lane map differences that must be addressed before acceptance.
**Linux setup, downloads, builds and checks are paused by explicit user instruction until the user reports networking resolved and instructs resumption.** Ubuntu26.04/WSL2 shell execution was observed; guest networking remained unavailable. Offline preparation was a workaround, not a network fix or Linux acceptance. Host VPN settings were not inspected or changed. [WSL evidence](release-wsl-postboot-ytr83r-20260911.md) and [preserved offline inputs](release-linux-offline-preparation-ytr83r-20260911.md) retain exact outcomes.
## Unresolved requirements and gates
Peer Codex-9e8r6t published the separately verified [Windows contextual prerelease](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.contextual.20260911), source `b2c3e540`; [its publication handoff](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/2#issuecomment-406) binds its artifacts and original-host checks. It is not a B4 release from this branch.
1. Finish native basic supplementary move/camera/focus/minimum matrix and current
scenario/process/state tasks. Main basic/transition/history/reopen passed at
wide size. Check raw drafts, recovery, exact source and real task completion.
2. Publish the verified contextual missing-source/source-form milestone with
truthful Windows package inputs. Named and contextual creation/history/reopen
pass; operand-editing and qualified Action allocation remain separate work.
3. Constraints/calculations and quantity compatibility are currently descriptive
metadata; same-project includes are not maintained cross-project libraries.
Peer schema 8/local-definition implementation is now ratified and staged in
its isolated worktree (Gitea comment 231); local integration and all required
representations/acceptance remain pending. See [library review brief](release-library-candidate-review-20260910.md).
Other-host proposals expose cosmetic package revision/type compatibility,
subjectless analysis closure and text-only instance normalization decisions;
full reports and paired criticism are now available from verified `c6d296a`.
Its 218-assertion maintenance experiment supports explicit baseline values
with one-level Case overrides; complete freeze and effective-case evaluation
are required. Refined baseline/library contracts remain active externally.
4. Build on the published standalone CLI and compare language improvements using
both local usability and complete other-host proposals.
Current grammar+tooling, domain syntax, namespaces and portable identity
modules remain distinct candidates. Concise examples/CLI alone do not prove
uncluttered modular engineering authoring or safe large-model changes.
5. Run coherent current desktop/core/server, specification, examples, REST and
optimized packaging gates after integration. Prior passes remain scoped.
6. Obtain current Linux runtime acceptance through the external owner's supported
guest route. Local WSL2 import failed with HCS_E_HYPERV_NOT_INSTALLED and no
distro registered; this host still has no usable Linux runtime. Preserve
recorded route failures and do not repeat a rejected workaround.
7. Fresh independent cross-disciplinary release review remains required after
actual workflow and semantic acceptance, with all material findings resolved.
## Record navigation
## Handoff and publication
Use Gitea issue #1 and current Wiki to coordinate as **Codex-9e8r6t**. Read before
resuming; preserve the other host's work. User issue 1 comment 178 authorizes programmatic
reuse of existing MCP credentials for Git/REST without printing or committing them.
Authenticated non-force push and remote readback now pass; current branch is
available directly. Historical bundle transfers remain reproducible. Integration `3978bbe` was published and
independently fetched/hash-verified as a Git bundle on
`codex/integration-transfer-20260910`; Wiki `Integration3978bbe` and issue #97 own
exact transfer instructions. Other host has integrated it and an equivalent
Sensor fix. Creation `4bb4aaf` was likewise published on
`codex/integration-transfer-20260911`, file
`harness/transfers/creation-4bb4aaf.bundle.b64`: decoded 105022 bytes,
SHA256 `0DEFAE91A56430076C432758F923BC0675911DA9FA7588C9961FF15F47EAEBF6`,
prerequisite `3978bbe`. Anonymous Git readback, strict base64 length/hash check and
`git bundle verify` passed; issue #128 gives selective integration instructions.
Corrected oracle/native/default evidence is published as `2ec72d4` on the same
branch, file `harness/transfers/evidence-2ec72d4.bundle.b64`: decoded 185563 bytes,
SHA256 `F74E14EE394BCC026E24987C8526AA7E769DDE748FE38117532824EC19AE159F`,
prerequisite `4bb4aaf`. Anonymous readback/hash and bundle verification pass (#150).
Preserve the other hosts' B4/reference chooser/design work and avoid duplicates.
Other-host `c6d296a` transfer is verified and imported as local
`codex/behavior-snapshot-c6d296a`: 334830 bytes,
SHA256 `526A80E2D32ED0E57A7B2372B5F02D4652E8751DFEBA81953C4F045225D6AACB`,
prerequisite `1797516`, from `codex/behavior-transfer-20260910` file
`harness/transfers/behavior-c6d296a.bundle.b64`. Selected analysis/library/text
reports, criticism, experiments and independent scenario oracle are restored;
51 evidence files compare byte-for-byte with Git blobs. No source/ledger merge.
Issue comments 136/143 and Wiki `Authoring20260911` record the handoff.
The old ledgers, including all historical platform and native evidence, were
archived byte-for-byte before this consolidation in
[history/2026-09-10-ledgers-before-second-consolidation](history/2026-09-10-ledgers-before-second-consolidation/STATE.md),
with hashes.json. Their historical-current wording does not supersede this file.
The [one-time record migration](history/2026-09-11-ytr83r-record-migration/README.md) preserves the exact prior STATE ledger and marks PLAN/TASK_LEDGER superseded. [Earlier integration history](history/2026-09-11-ytr83r-integration/README.md) preserves source-attributed older results. Historical leases, failed approaches and next-step wording do not override current Gitea coordination or the Linux pause.
+126 -171
View File
@@ -1,190 +1,145 @@
> Superseded on 2026-09-11. This document is a preserved historical checkpoint.
> Live plans, priorities, ownership and handoffs now reside in [Gitea issue 1](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/1#issuecomment-410) and [issue 2](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/2).
> Do not resume synchronizing this ledger. See [STATE.md](STATE.md) for the integrated checkpoint.
# Task Ledger — first release
Updated 2026-09-11 by Codex-9e8r6t `/root`. Full release not accepted.
Updated 2026-09-11 for Codex-ytr83r. The full
[user goal](../PROJECT_GOAL.md) and [current progress](STATE.md) remain authoritative.
[Exact host ledger archives](history/2026-09-11-ytr83r-integration/README.md)
preserve prior facts, dates and reasoning without transferring their acceptance.
User resumed after enabling virtualization and explicitly authorized installing
Ubuntu26.04 in WSL2. [RESTART_HANDOFF.md](RESTART_HANDOFF.md) is the historical
pause; STATE.md owns current capacity, compiler and native status.
User also explicitly permits disk cleanup including caches. Both scoped cache
deletion commands were rejected before execution; nondeleting compression
recovered space with all282 generated-binary hashes unchanged. Ordinary Ubuntu
installation and an initial actual WSL2 root shell passed. Current VirtioProxy
startups fail before guest execution, and a distinct WslService restart was
denied by OS permissions. Owner328 remains the newest WSL solution after the
latest issue check through348; its exact configuration is already applied.
Five Rust components and60 apt packages are downloaded and hash-verified;
guest signature verification/install and application acceptance remain pending.
The user's latest direction pauses Linux work until they notify us that WSL
networking is resolved. Continue Windows/product work; preserve existing Linux
configuration, verified inputs and evidence without further setup/checks.
## Goal and given requirements
## Goal and success criteria
Deliver a complete, usable OA/SA release on Windows and Linux, with one explicit
reST semantic contract and equivalent graphical, textual and REST access. Include
constraints/calculations, quantities/units, maintained libraries, behavior/state,
traceability and navigable offline help. Reduce cognitive load and visual clutter;
small and large models must be practical using text alone. Later Arcadia layers
remain future scope. Compilation or a pleasant happy path is not completion.
Issue2 further requires consistent direct process/scenario canvas interaction;
the owner's clarification allows domain constraints rather than arbitrary movement.
[PROJECT_GOAL.md](../PROJECT_GOAL.md), copied from attachment
`815ff7b9-73c4-41a2-a809-635ecf8389d6/goal-objective.md`, is authoritative.
Deliver a usable, substantially complete OA/SA systems modeling product in
Rust/Iced on Windows and Linux, with equivalent graphical/textual/REST editing,
strict reST semantics/API, arbitrary development-artifact traceability and
navigable offline help. Constraints/calculations, quantities/units and reusable
model libraries and complete uncluttered text-only small/large modeling are
explicit requirements. Later Arcadia layers remain future
releases. Completion requires real engineering tasks, sound semantics, relevant
passing checks and fresh independent cross-disciplinary review.
## Given facts
- User prioritizes Capella's domain capability and useful visual nesting while
rejecting clutter, intrusive creation rows, static behavior diagrams and long
homogeneous option lists. Reduce cognitive load in small and large models.
- Source must be understandable to engineers and AI, work with Git and preserve
full parity. OA/SA transitions in both directions must be clear and reviewed.
- User authorizes autonomous reversible work, research, native Computer Use and
parallel agents. Use GPT-6 Astra exclusively with task-appropriate effort.
- Gitea coordination and shared Wiki updates are required. Identify host and
worker consistently and preserve overlapping work. Explicit project messages
are authorized; unrelated external messages are not.
- Updated AGENTS requires runnable versioned milestone prereleases. User
issue 1 comment 178 authorizes reusing existing MCP credentials programmatically for
Git push and REST asset upload, without printing or committing credentials.
- Remote AGENTS.md, blob `4b8465c8993107062ad2974c15a958d449530e92`, adds concise
harness/Gitea maintenance and preservation of useful historical knowledge
(user comment 229). Root's instruction sync `07eb3cd` is integrated;
contextual source `df6f595`, CLI publication `d95b1ab` and OA native evidence
`c4bad4b` are committed and pushed.
At15:28UTC on2026-09-11, the user explicitly deferred Linux builds and checking
until they resolve WSL2 networking and instruct resumption. Linux setup/downloads
are paused with inputs preserved. Continue independent Windows work; do not treat
offline preparation as a networking fix or Linux acceptance.
## Verified facts
[STATE.md](STATE.md) records exact commits, live leases and scoped verification.
The current model has one typed core, validated atomic commands and coordinated
Project/SourceBundle history shared by desktop and REST. Included files share
one global namespace. Current Constraint expressions are strings; numeric unit
strings do not convert values or establish dimensional compatibility. There is
no locally integrated package/version/instance/update contract for cross-project
libraries; peer implementation is tracked separately below.
- Local start was cleanff615d0. Root decoded/hash-verified/imported published3978,
c6 and4bb bundles; merged c6 as c81e285 and integrated creation4bb at e207b04. There were
no production cherry-pick conflicts; docs/attributes require evidence union.
The current goal is copied from the user's latest file.
- Read-only integration comparison finds equivalent workspace/Sensor code in c6;
replaying3978 or d114 is unnecessary. Core source is unchanged betweenff andc6.
B4 now has a production Scene bridge and independently reviewed source, with
focused lifecycle22/22 and full desktop675/675 passed on source2908405. The
ordinary GUI build and real OA/SA lifecycle matrices now ran; OA full name-only
Save/Undo/Redo/reopen and the corresponding SA workflow passed exact independent
comparisons. Corrected workspace/all-targets strict Clippy also passed0;
Unicode appearance remains open. See the
[native record](release-lifecycle-native-ytr83r-20260911.md) for exact scope.
- Imported source implements named behavior creation, exact prepared-batch
correlation, success-only selection, raw-draft guards, recoverable original
layer and modal-priority Escape. These are source facts; combined local runtime
acceptance is pending.
- Earlier-host desktop642 and653 suites, scoped native scenarios/creation,
packaging25 notices and source experiments retain exact attribution in
[STATE.md](STATE.md). They are not new local passes.
- The original transferred creation oracle incorrectly equates physical disk files
with reachable sources during Undo. Later external v2 corrects the evaluator
with explicit origin/retained-byte rules; exact v2/evidence2ec was imported at
b853a1e after complete path/hash preflight. New host execution is still pending.
- Isolated Rust1.98.1/LLVM23.1.1 and locked dependencies are available. Packaging
11/11 and synthetic Windows notice checks pass. Current core all-targets passed
433 tests; its optional inheritance probe separately passed with slow debug
timings that require controlled optimized interpretation. Focused lifecycle
passed22/22 after two installed-Iced API corrections; full desktop passed675/675.
Strict reST/HTML generation passes with Docutils0.22.2.
- B4 independent criticism found and resolved self-caption overlap and two dense
minimum-Fit hit-selection counterexamples. Shared nearest marker/message-stroke
arbitration preserves exact marker/header/label selection. Ten real-Scene tests
and two clip geometry tests passed in the22-test focused gate. The independent twelve-scenario native oracle passed compile,
admission, self-check and exact baseline/name-only predictions before GUI output.
- The separate baseline-context experiment passed218 assertions; explicit
one-level overrides reduce repeated stable assumptions while complete frozen
definition environments remain necessary. Proposed syntax is not source7.
- After the user's virtualization/reboot change, supported Ubuntu26.04 install
completed exit0 and a real x86_64 WSL2 kernel shell completed. Later VM startups
timed out before apt. Owner328's exact VirtioProxy configuration now supports
a persistent root shell, but requested IP/DNS/HTTPS checks failed. Signed offline
dependency preparation advances without host VPN inspection or changes. This
establishes guest execution, not Linux builds or GUI acceptance; exact outcomes are
in the [WSL record](release-wsl-postboot-ytr83r-20260911.md).
The main basic/transition/history/reopen story passed exact independent model
and four/six-source checks; supplementary native cases remain. Named creation
passed 7/8/9-source oracles, one Undo/Redo and byte-exact reopen at actual minimum
size. Cancellation retained its six-file baseline; SA draft recovery retained
fields/identities, autofocus and Escape/Save As behavior. The D4D9 blank-canvas
finding motivated the newer first-action implementation. Detailed historical
suite and native scopes remain in [STATE.md](STATE.md) and its linked reports.
Mounted geometry and bounded package passes do not establish full release
acceptance. This local host has installed Ubuntu26.04 but lacks a currently
usable guest session, installed build prerequisites or Linux application pass.
## Assumptions and unresolved questions
Current grammar supports omitted initial IDs/defaults, lexical ownership, forward
references and preserved source. The earlier desktop audit found no exposed
project-wide reference navigation/alias refactor; its Find searched the active
buffer. The later CLI supplies typed alias rename. The audited process example
had 128 lines, 14 UUIDs and 31 empty-default lines, while meaningful shorter
source is possible. Two concise snippets passed 26 real REST requests,
including identity-only normalization, exact name-only edits, rejected writes and
restart persistence. Counts and this small trial prove neither improved native
usability nor large-project performance.
- Combining already coherent desktop slices should preserve behavior; fresh build,
automated and native gates must test that assumption.
- The baseline/library designs can fit existing atomic Project/Command/source
boundaries; exact references, deletion, transition, imports, freezing and
numeric rules still need ratified contracts and falsification.
- Pinned package provenance must be distinguished from checked type compatibility;
unchanged quantity kinds cannot become incompatible merely through cosmetic
repackaging without a deliberate policy. Energy and Torque remain distinct.
- Ubuntu26.04/WSL2 is the current supported Linux route; reliable repeat startup,
guest toolchain/dependencies and GUI/service/package execution remain open.
Initial shell success does not erase later startup timeouts. Old QEMU work is
retained as history, not the next route to repeat.
- Large-model human/AI task usability, cross-file refactoring, actual chooser
latency/keyboard/minimum geometry and complete native lifecycle behavior remain
to be measured. Parser admission or a widget experiment is insufficient.
CLI tooling is implemented, integrated and published: semantic source `01b76a1`,
packaging assembly `a0a48e8`, release integration `27df4a3`. Author 12 tests and
independent 183 semantic assertions pass; independent clean-package review adds
156 assertions across 10 processes. This is a bounded source-editing tool, not
proof of complete large-model language ergonomics.
## Candidate designs and selected directions
GUI/server release 1 and standalone CLI release 2 are published with runnable
Windows artifacts, full dependency notices and downloaded asset verification.
Independent archive/source and clean runtime checks pass in their declared scopes.
See [CLI publication evidence](release-cli-prerelease-published-20260911.md).
The newer 13-file contextual-source slice is committed/pushed as `df6f595`,
with its independent oracle and exact raw evidence. It passed focused 23, guide 3, strict
Clippy, matching GUI build and formatting. The full 675 suite covers only its
predecessor; no full 676 suite has run. Root launched the exact 52DE82 GUI in
isolation: Lifeline Save-adoption and Chain direct Create pass complete source,
one Undo and one Redo. Machine direct Create and one Undo pass; Redo/reopen are
pending for Redo. An isolated postboot real Open/SA view/Save passed the complete
machine prediction and exact six-file equality; the app closed normally.
Later layout/caption source was independently reviewed. Postboot focused3 ran25
passing tests and one overflowing-fixture assertion failure. The stronger
test-only fixture is frozen; its execution and new GUI remain pending.
The imported [analysis proposal](release-analysis-semantics-design-20260910.md),
[library proposal](release-libraries-semantics-design-20260910.md),
[paired critique](release-semantic-proposals-review-20260910.md) and
[textual authoring design](release-textual-authoring-design-20260911.md) retain
alternatives and counterexamples. Metadata-only analysis and bare source includes
do not meet evaluated quantities or maintained libraries.
Local OA B2 now passes all four Action/State/explicitly bound Reuse/Fragment
Create, one Undo/Save, one Redo/Save and final OA reopen/Save against independent
complete model/two-source predictions and original exact identities. SA B2 is
pending locally. Existing B3 OA wide/minimum and SA minimum return scopes remain
unchanged; neither these passes nor mounted geometry tests imply broader acceptance.
Codex-956atf root selected property-owned baseline values/formulas with explicit
ModelBaseline/Case evaluation and one-level case overrides for contract refinement.
No hidden default case or UI-dependent evaluation; inherited formulas use the
effective requested case, and complete freeze captures definitions/provenance.
Exact numeric, library normalization/type compatibility and transition details
remain open. This direction is recorded in [DECISIONS.md](DECISIONS.md), not silently
treated as completed production semantics.
## Assumptions
- Contextual named creation, remaining-height canvas and local source insertion
can reduce actual authoring detours. Native engineer tasks must establish this.
- A bounded pure calculation/quantity model and pinned library content may fit
the existing typed core better than a general-purpose metamodel rewrite.
Peer-ratified core staging must still be checked against independent engineering
tasks and integrated across all required representations.
- Existing OA/SA semantics provide a useful foundation; neither their presence
nor old acceptance proves full conformance to the updated release objective.
The external staged prerequisite design reserves source/consumer identities,
keeps the parent context/rawtext/slot, stages locally and creates source+consumer
in one atomic final command. It must not implicitly allocate work, involve
capabilities, retarget an Exchange-fixed endpoint or accept a different editor.
Qualified Action allocation remains a distinct engineering choice.
## Open questions
## Retained implementation decisions
- Which precise calculation, quantity-kind/unit and library contracts satisfy
practical budgets, reuse and update workflows without ambiguous defaults or
implicit execution? How should they migrate and participate in transitions?
- Which behavior workflows still force cancellation/navigation to create missing
context, and which local actions best remove those detours?
- Which text-only assistance best preserves engineering context and identity:
native language services, external-editor services, source recipes or explicit
reviewed patch operations? Which grammar changes are actually necessary?
- Does the new scenario pane remain readable and editable through actual native
window sizes, camera changes, nested fragments and reopened caller contexts?
- Which viable Linux environment can run current GUI/server acceptance? Current
VM limitation does not block remaining Windows, semantics or source work.
- Keep one authoritative typed Project, validated atomic Commands, stable
identities and explicit references. Semantic ownership/allocation/order and
diagram geometry remain distinct; forms are adapters, not a second metamodel.
- Preserve source ownership/comments/includes and exact model/source history.
Writeback succeeds before adoption. Invalid/rejected raw drafts survive and
browsing/tool selection does not silently accept another editor. Recovery
validates/replans rather than trusting serialized commands.
- Semantic reconciliation uses finite typed facets, frozen baselines, explicit
mappings and one atomic candidate. Names alone never establish identity.
- OA↔SA transitions are explicit engineering decisions. New persistent semantics
need validation/reference/deletion/transition/source/API/UI/history parity.
- Exact evidence bytes and host attribution survive integration. No focused
test total is added to a full-suite count; old binary acceptance does not
transfer to newly merged code.
## Candidate designs and decisions
## Current strategy and coordination
- Behavior creation: compact New → three task choices → focused name/owner/
viewpoint card, explicit missing inputs, atomic creation and reserved recovery
IDs. Implemented, reviewed and scoped native creation/history/reopen passed.
- Contextual prerequisite creation: stage an explicit typed source inside the
current parent draft, then validate/adopt source and consumer atomically. This
preserves intent and one-step history; a separate Architecture excursion or
early source commit loses those guarantees. Initial Lifeline/process Work/
machine-owner adapters and semantic first-action prompts are implemented,
reviewed and integrated with focused gates passed; scoped native results are
above, with remaining acceptance still open. See the
[bounded plan](release-contextual-source-creation-plan-20260911.md).
- Scenario workspace: compact header, optional Tools/Selection shelves, actual
remaining-height canvas/form, pinned actions, independent scrolling and
explicit Fit/Focus. Mounted tests support this choice; native proof pending.
- User issue2/comment250 clarifies that diagram manipulation may respect
sequence/domain constraints. Codex-956atf owns a shared canvas-shell redesign;
the existing controls and supporting source-card fixes do not close the issue.
- Quantities/calculations: peer comment 231 records ratified schema 8/local
definitions and actual shared analysis/core types under implementation in
isolated `codex/analysis-core-20260911`. This is not a local schema admission,
evaluator or graphical/source/API parity pass; the local core remains descriptive.
- Libraries: compare copied source, live references, generic definition/usages
and pinned typed packages with explicit mappings and reviewed updates.
[Falsification brief](release-library-candidate-review-20260910.md) records
identity, dependency, offline and conflict requirements. Refined peer baseline,
Case, full-freeze and exact-pin/equivalence contracts are ratified externally;
their local integration and executable lifecycle acceptance remain pending.
- Text authoring: use existing omission/default/identity contracts for concise
experiments; compare source navigation/refactoring/patch assistance before
grammar redesign. No namespace, hidden identity or omission change ratified.
- Reference chooser: peer comment 224's corrected focus ownership, nested-scroll
reveal and mounted regressions are prepared, not executed. Preserve that
ownership and wait for its source/test handoff.
Root owns local integration, serialized builds, native inputs and final synthesis.
The local audit resolves evidence and reviews source; independent server review
has its own report. Codex-9e8r6t owns staged sources/first actions and source CLI;
Codex-956atf owns chooser, semantic contracts and the shared canvas design. Read Gitea issues #1/#2 and Wiki before
resuming, obtain exact coherent transfer heads, and respect their source ownership.
Long-lived decisions remain in [DECISIONS.md](DECISIONS.md). New user scope and
normative contracts supersede older prototype exclusions.
## Current strategy
Finish coherent creation gates and test the rebuilt product against independent
saved-source oracles. Close remaining scenario lifecycle integration boundaries.
Use the native Capella study and independent criticism to address real authoring
friction. In parallel, resolve foundational semantic additions and text-only
authoring through bounded competing designs and executable experiments. Then implement all representations,
verify real REST and Windows/Linux workflows, build actual optimized packages
and conduct fresh end-state review. Do not weaken acceptance to match current
implementation or stop because a narrow technical milestone passed.
Pre-consolidation content is preserved byte-for-byte in
[the dated archive](history/2026-09-10-ledgers-before-second-consolidation/TASK_LEDGER.md).
First finish and verify the integrated current source using the imported corrected
evaluator and newly prepared independent lifetime oracle. Then close remaining modeling/textual,
analysis/library and platform gates with independent criticism and whole-task
acceptance. Update facts, assumptions and decisions as evidence changes them.
+156
View File
@@ -0,0 +1,156 @@
//! Native issue4 fixture/oracle. generate DIR | check oa|sa STAGE ENTRY
//! snapshot ENTRY DIR | compare ENTRY DIR | self-check
use oa_core::{source_project::*, *};
use std::{collections::{BTreeMap, BTreeSet}, fs, path::Path};
fn id(n: u128) -> Id { Id::from_u128(0xc1140000000040008000000000000000 + n) }
fn work(layer: Layer) -> Kind { if layer == Layer::Oa { Kind::Activity } else { Kind::Function } }
fn fixture(layer: Layer) -> Project {
let mut p = Project::empty();
p.id = id(1); p.alias = "child_work_native".into(); p.name = format!("Issue4 {layer:?} child work");
for (n, kind, name) in [(10, if layer == Layer::Oa { Kind::Entity } else { Kind::System }, "Performer"), (11, work(layer), "Parent work")] {
p.elements.insert(id(n), Element { id: id(n), alias: format!("seed_{n}"), name: name.into(), description: format!("Preserve original {name}"), parent: None, body: ElementBody::new(kind, layer).unwrap() });
}
p.relations.insert(id(20), Relation { id:id(20), alias:"original_allocation".into(), name:"Original responsibility".into(), description:"Preserve allocation engineering rationale 雨".into(), body:RelationBody::Allocation { source:id(10), target:id(11) } });
if layer == Layer::Oa {
for n in [12,13] {
p.elements.insert(id(n), Element { id:id(n), alias:format!("role_{n}"), name:format!("Responsibility role {n}"), description:"Preserve role".into(), parent:None, body:ElementBody::new(Kind::Role, layer).unwrap() });
for (r, kind, source, target) in [(n+10,RelationKind::RoleAssignment,id(n),id(11)),(n+20,RelationKind::RoleRealization,id(10),id(n))] {
p.relations.insert(id(r), Relation { id:id(r), alias:format!("responsibility_{r}"), name:format!("Role link {r}"), description:format!("Retain role link metadata {r}"), body:RelationBody::new(kind,source,target) });
}
}
}
for (index, owner) in [id(20),id(22),id(23)].into_iter().filter(|owner| p.relations.contains_key(owner)).enumerate() {
let key=id(50+index as u128);
p.artifact_links.insert(key, ArtifactLink { id:key, alias:format!("evidence_{index}"), name:format!("Responsibility evidence {index}"), description:"Keep owner identity and evidence metadata".into(), owner, relation:ArtifactRelation::References, uri:format!("https://example.invalid/evidence/{index}"), revision:Some("review-7".into()), fragment:Some("assignment".into()) });
}
p.diagrams.insert(id(2), Diagram { id:id(2), alias:"allocation_view".into(), name:format!("{layer:?} allocated work"), description:"Native child-work fixture".into(), layer, projection:ProjectionKind::Allocation, routes:vec![], view_options:Default::default(), nodes:BTreeMap::new() });
for (n,element,x,y,collapsed) in [(40,id(10),60.,60.,false),(41,id(11),84.,124.,true)] {
p.diagrams.get_mut(&id(2)).unwrap().nodes.insert(id(n), NodePlacement { id:id(n), alias:format!("seed_view_{n}"), element, position:Position{x,y}, size:Size{width:224.,height:94.}, collapsed, port_anchors:vec![] });
}
execute_batch(&p,&[]).unwrap()
}
fn bundle(p:&Project)->CompiledSourceProject {
let source=language::format(p).replacen("{\n","{\n include \"rationale.arcadia\";\n",1);
let raw=SourceBundle { entry:"project.arcadia".into(), files:BTreeMap::from([("project.arcadia".into(),source),("rationale.arcadia".into(),"// Preserve included note bytes: responsibility 雨.\r\n".into())]) };
let result=compile_bundle(&raw,ProjectLimits::default()).unwrap();
assert_eq!(result.bundle,raw); assert_eq!(&result.decoded.project,p); result
}
fn load(entry:&Path)->CompiledSourceProject {
let raw=source_files::load_project(entry,ProjectLimits::default()).unwrap().reachable_bundle();
let result=compile_bundle(&raw,ProjectLimits::default()).unwrap();
assert_eq!(result.bundle,raw,"No source normalization permitted");
execute_batch(&result.decoded.project,&[]).unwrap(); result
}
fn advance(base:&mut CompiledSourceProject,commands:Vec<Command>) {
let expected=execute_batch(&base.decoded.project,&commands).unwrap();
*base=update_bundle(base,&expected,ProjectLimits::default()).unwrap();
}
#[derive(Clone, Copy)]
struct Keys { children:[Id;3], nodes:[Id;3], allocation:Id }
fn expected(layer:Layer,stage:usize,k:Keys)->CompiledSourceProject {
assert!(stage<=3);
let mut base=bundle(&fixture(layer));
for step in 0..stage {
let p=&base.decoded.project;
let key=k.children[step];
let name=format!("New {}",work(layer).label().to_lowercase());
let element=Element { id:key, alias:p.fresh_alias(&name,"element",key), name, description:String::new(), parent:Some(if step==2 { k.children[0] } else { id(11) }), body:ElementBody::new(work(layer),layer).unwrap() };
let mut commands=vec![Command::CreateElement(element.clone())];
if step==1 {
commands.push(Command::CreateRelation(Relation { id:k.allocation, alias:p.fresh_alias("Performs","relation",k.allocation), name:"Performs".into(), description:String::new(), body:RelationBody::Allocation { source:id(10),target:key } }));
} else {
for original in p.relations.values().filter(|r| [id(20),id(22),id(23)].contains(&r.id)) {
let mut r=original.clone();
match &mut r.body { RelationBody::Allocation{target,..}|RelationBody::RoleAssignment{target,..}=>*target=key,_=>unreachable!() }
commands.push(Command::EditRelation(r.id,r));
}
}
if step==0 {
let mut node=p.diagrams[&id(2)].nodes[&id(41)].clone(); node.collapsed=false;
commands.push(Command::EditNode{diagram:id(2),original:node.id,node});
}
let mut with_element=p.clone(); with_element.elements.insert(key,element);
let (x,y)=[(108.,188.),(108.,298.),(132.,252.)][step];
commands.push(Command::CreateNode { diagram:id(2), node:NodePlacement { id:k.nodes[step], alias:with_element.fresh_alias(&format!("view_{}",with_element.named(key)),"node",k.nodes[step]), element:key,position:Position{x,y},size:Size{width:224.,height:94.},collapsed:false,port_anchors:vec![] } });
if step==2 {
// Grandchild expands first child to bottom370; sibling follows at394
// (24px reflow gap), independently predicted for this fixed fixture.
let mut sibling=p.diagrams[&id(2)].nodes[&k.nodes[1]].clone(); sibling.position.y=394.;
commands.push(Command::EditNode{diagram:id(2),original:sibling.id,node:sibling});
}
advance(&mut base,commands);
}
base
}
fn only(ids:Vec<Id>,role:&str)->Id { assert_eq!(ids.len(),1,"Exactly one {role}"); ids[0] }
fn admit(actual:&Project,layer:Layer,stage:usize)->Keys {
let mut k=Keys{children:[Id::nil();3],nodes:[Id::nil();3],allocation:Id::nil()};
if stage==0 { return k; }
let target=actual.relations[&id(20)].target();
k.children[0]=if stage==3 { actual.elements[&target].parent.unwrap() } else { target };
if stage>=2 {
k.children[1]=only(actual.elements.values().filter(|e|e.parent==Some(id(11))&&e.id!=k.children[0]&&e.kind()==work(layer)).map(|e|e.id).collect(),"second child");
k.allocation=only(actual.relations.values().filter(|r|r.kind()==RelationKind::Allocation&&r.source()==id(10)&&r.target()==k.children[1]).map(|r|r.id).collect(),"new sibling allocation");
}
if stage==3 { k.children[2]=target; }
for step in 0..stage {
let e=&actual.elements[&k.children[step]];
assert_eq!(e.kind(),work(layer)); assert_eq!(e.layer(),layer);
assert_eq!(e.parent,Some(if step==2{k.children[0]}else{id(11)}));
k.nodes[step]=only(actual.diagrams[&id(2)].nodes.values().filter(|n|n.element==e.id).map(|n|n.id).collect(),"child placement");
}
let seed=fixture(layer); let mut used=BTreeSet::new();
for key in k.children[..stage].iter().chain(&k.nodes[..stage]).copied().chain((stage>=2).then_some(k.allocation)) {
assert_eq!(key.get_version_num(),4,"Native fresh UUIDv4 required");
assert!(!seed.contains(key)&&used.insert(key),"Fresh distinct role identity required");
}
k
}
fn check(actual:&CompiledSourceProject,layer:Layer,stage:usize) {
let prediction=expected(layer,stage,admit(&actual.decoded.project,layer,stage));
assert_eq!(actual.decoded.project,prediction.decoded.project,"Complete typed model mismatch, including placements and references");
assert_eq!(actual.bundle,prediction.bundle,"Exact source mismatch, including included note bytes");
}
fn history(actual:&CompiledSourceProject,layer:Layer,stage:usize,first:&CompiledSourceProject,second:Option<&CompiledSourceProject>) {
check(first,layer,1);
let first_keys=admit(&first.decoded.project,layer,1);
let current_keys=admit(&actual.decoded.project,layer,stage);
assert_eq!(current_keys.children[0],first_keys.children[0],"First child identity must match original first-commit carrier");
assert_eq!(current_keys.nodes[0],first_keys.nodes[0],"First placement identity must match original first-commit carrier");
if stage==3 {
let second=second.expect("Original second-commit carrier required");
check(second,layer,2);
history(second,layer,2,first,None);
let second_keys=admit(&second.decoded.project,layer,2);
assert_eq!(current_keys.children[1],second_keys.children[1],"Sibling identity must persist");
assert_eq!(current_keys.nodes[1],second_keys.nodes[1],"Sibling placement identity must persist");
assert_eq!(current_keys.allocation,second_keys.allocation,"Sibling allocation identity must persist");
}
}
fn write_bundle(dir:&Path,raw:&SourceBundle) {
assert!(!dir.exists(),"Use a new evidence directory"); fs::create_dir_all(dir).unwrap();
for (name,bytes) in &raw.files { let path=dir.join(name); if let Some(parent)=path.parent(){fs::create_dir_all(parent).unwrap();} fs::write(path,bytes).unwrap(); }
}
fn main() {
assert_eq!(SCHEMA_VERSION,7);
let args:Vec<_>=std::env::args().collect();
match args.get(1).map(String::as_str) {
Some("generate")=>{assert_eq!(args.len(),3);let dir=Path::new(&args[2]);assert!(!dir.exists()); for (name,layer) in [("oa",Layer::Oa),("sa",Layer::Sa)] {write_bundle(&dir.join(name),&bundle(&fixture(layer)).bundle);} println!("PASS deterministic OA/SA native fixtures generated");}
Some("check")=>{
let layer=match args[2].as_str(){"oa"=>Layer::Oa,"sa"=>Layer::Sa,_=>panic!("oa|sa")};
let stage=args[3].parse::<usize>().unwrap();assert!(stage<=3);
assert_eq!(args.len(),5+stage.saturating_sub(1),"Stages2/3 require original stage1/stage2 checkpoint directories");
let actual=load(Path::new(&args[4]));check(&actual,layer,stage);
if stage>=2 {
let first=load(&Path::new(&args[5]).join("project.arcadia"));
let second=if stage==3 {Some(load(&Path::new(&args[6]).join("project.arcadia")))} else {None};
history(&actual,layer,stage,&first,second.as_ref());
}
println!("PASS complete model, exact source and pinned history stage {stage}");
}
Some("snapshot")=>{assert_eq!(args.len(),4);let actual=load(Path::new(&args[2]));write_bundle(Path::new(&args[3]),&actual.bundle);println!("PASS immutable source checkpoint");}
Some("compare")=>{assert_eq!(args.len(),4);let actual=load(Path::new(&args[2]));let checkpoint=load(&Path::new(&args[3]).join(&actual.bundle.entry));assert_eq!(actual.bundle,checkpoint.bundle,"Saved reachable source bytes changed");assert_eq!(actual.decoded.project,checkpoint.decoded.project);println!("PASS exact checkpoint bytes and model");}
Some("self-check")=>{for layer in [Layer::Oa,Layer::Sa]{let keys=Keys{children:std::array::from_fn(|_|Id::new_v4()),nodes:std::array::from_fn(|_|Id::new_v4()),allocation:Id::new_v4()};for stage in 0..=3 {let candidate=expected(layer,stage,keys);check(&candidate,layer,stage);if stage>=2 {history(&candidate,layer,stage,&expected(layer,1,keys),(stage==3).then(||expected(layer,2,keys)).as_ref());}let mut altered=candidate.decoded.project.clone();altered.elements.get_mut(&id(11)).unwrap().description="Unrequested mutation".into();assert_ne!(expected(layer,stage,admit(&altered,layer,stage)).decoded.project,altered);}}println!("PASS oracle fixed points and unrelated-mutation discriminator");}
_=>panic!("generate DIR | check oa|sa STAGE ENTRY [STAGE1DIR] [STAGE2DIR] | snapshot ENTRY DIR | compare ENTRY DIR | self-check"),
}
}
@@ -1,18 +0,0 @@
# Authoring prerelease evidence
Exact preserved producer, independent reviewer and root native evidence for
Windows preview `v0.2.0-preview.authoring.20260911`. `hashes.json` records each
copied artifact's original private path, length and SHA256. Git must retain these
measured bytes. The executable ZIP and validation notes are release assets.
The preserved Python files are the original host-specific harnesses. Their
relative paths and source/toolchain prerequisites refer to the recorded original
`.local` layout; they are not portable standalone tests when run from this archive.
To reproduce them, restore that layout in a disposable checkout and use fresh
output directories. They never contain Gitea credentials. The GUI launch script
only launches the application; native actions were performed using Computer Use.
See the three `harness/release-authoring-prerelease-*-20260911.md` reports for
methods, initial GUI harness failure, passed checks, source provenance and limits.
`published-verified.json` records the final release readback; upload records bind
the exact downloaded assets. Publication does not complete the wider OA/SA goal.
@@ -1,9 +0,0 @@
{
"pid": 10800,
"exe": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\authoring-prerelease-gui-20260911-v2\\extracted\\ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm\\arcadia-studio.exe",
"archive_sha256": "664f30b6217689aca1492eb263b3d15777067d732fa890eeb028f435209dadfa",
"files": 559,
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\authoring-prerelease-gui-20260911-v2\\extracted\\ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm;C:\\Windows\\System32;C:\\Windows",
"local_appdata": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\authoring-prerelease-gui-20260911-v2\\profile\\local",
"appdata": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\authoring-prerelease-gui-20260911-v2\\profile\\roaming"
}
@@ -1,37 +0,0 @@
from pathlib import Path
import hashlib
import json
import os
import subprocess
import zipfile
root = Path.cwd()
name = 'ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm'
archive = root / '.local/authoring-prerelease-20260911/packages' / (name + '.zip')
assert hashlib.sha256(archive.read_bytes()).hexdigest() == '664f30b6217689aca1492eb263b3d15777067d732fa890eeb028f435209dadfa'
trial = root / '.local/authoring-prerelease-gui-20260911-v2'
trial.mkdir(exist_ok=False)
extract = trial / 'extracted'
extract.mkdir()
with zipfile.ZipFile(archive) as z:
names = z.namelist()
assert len(names) == len(set(n.casefold() for n in names)) == 559
assert all(n.startswith(name + '/') and '..' not in Path(n).parts for n in names)
z.extractall(extract)
package = extract / name
for line in (package / 'SHA256SUMS.txt').read_text().splitlines():
digest, path = line.split(' ', 1)
assert hashlib.sha256((package / path).read_bytes()).hexdigest() == digest, path
for folder in ['profile/local', 'profile/roaming']:
(trial / folder).mkdir(parents=True)
env = os.environ.copy()
env['LOCALAPPDATA'] = str(trial / 'profile/local')
env['APPDATA'] = str(trial / 'profile/roaming')
env['PATH'] = os.pathsep.join([str(package), str(Path(env['SYSTEMROOT']) / 'System32'), env['SYSTEMROOT']])
exe = package / 'arcadia-studio.exe'
assert hashlib.sha256(exe.read_bytes()).hexdigest() == 'd4d9c2bd937e301ff1009d7cb93a34ee5aa6dfc837ff7e87d468c85371b20c31'
with (trial / 'stdout.log').open('wb') as out, (trial / 'stderr.log').open('wb') as err:
process = subprocess.Popen([str(exe)], cwd=package, env=env, stdout=out, stderr=err)
result = {'pid': process.pid, 'exe': str(exe), 'archive_sha256': hashlib.sha256(archive.read_bytes()).hexdigest(), 'files': len(names), 'path': env['PATH'], 'local_appdata': env['LOCALAPPDATA'], 'appdata': env['APPDATA']}
(trial / 'launch.json').write_text(json.dumps(result, indent=2), encoding='utf-8')
print(json.dumps(result, indent=2))
@@ -1,64 +0,0 @@
[
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\authoring-prerelease-gui-20260911-v2\\extracted\\ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm\\arcadia-studio.exe",
"C:\\Windows\\SYSTEM32\\ntdll.dll",
"C:\\Windows\\System32\\KERNEL32.DLL",
"C:\\Windows\\System32\\KERNELBASE.dll",
"C:\\Windows\\SYSTEM32\\apphelp.dll",
"C:\\Windows\\System32\\user32.dll",
"C:\\Windows\\System32\\win32u.dll",
"C:\\Windows\\System32\\GDI32.dll",
"C:\\Windows\\System32\\gdi32full.dll",
"C:\\Windows\\System32\\msvcp_win.dll",
"C:\\Windows\\System32\\ucrtbase.dll",
"C:\\Windows\\System32\\ole32.dll",
"C:\\Windows\\System32\\combase.dll",
"C:\\Windows\\System32\\RPCRT4.dll",
"C:\\Windows\\System32\\advapi32.dll",
"C:\\Windows\\System32\\msvcrt.dll",
"C:\\Windows\\System32\\sechost.dll",
"C:\\Windows\\System32\\bcryptprimitives.dll",
"C:\\Windows\\System32\\shell32.dll",
"C:\\Windows\\System32\\imm32.dll",
"C:\\Windows\\System32\\ws2_32.dll",
"C:\\Windows\\System32\\oleaut32.dll",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\authoring-prerelease-gui-20260911-v2\\extracted\\ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm\\libunwind.dll",
"C:\\Windows\\SYSTEM32\\bcrypt.dll",
"C:\\Windows\\SYSTEM32\\dwmapi.dll",
"C:\\Windows\\SYSTEM32\\uxtheme.dll",
"C:\\Windows\\SYSTEM32\\opengl32.dll",
"C:\\Windows\\SYSTEM32\\GLU32.dll",
"C:\\Windows\\SYSTEM32\\CRYPTBASE.DLL",
"C:\\Windows\\SYSTEM32\\dxcore.dll",
"C:\\Windows\\System32\\MSCTF.dll",
"C:\\Windows\\SYSTEM32\\kernel.appcore.dll",
"C:\\Windows\\System32\\clbcatq.dll",
"C:\\Windows\\system32\\dataexchange.dll",
"C:\\Windows\\system32\\twinapi.appcore.dll",
"C:\\Windows\\system32\\explorerframe.dll",
"C:\\Windows\\System32\\SHCORE.dll",
"C:\\Windows\\System32\\SHLWAPI.dll",
"C:\\Windows\\System32\\Windows.Storage.dll",
"C:\\Windows\\SYSTEM32\\powrprof.dll",
"C:\\Windows\\SYSTEM32\\UMPDC.dll",
"C:\\Windows\\SYSTEM32\\CFGMGR32.dll",
"C:\\Windows\\system32\\dxgi.dll",
"C:\\Windows\\SYSTEM32\\windows.staterepositorycore.dll",
"C:\\Windows\\SYSTEM32\\directxdatabasehelper.dll",
"C:\\Windows\\SYSTEM32\\d3d12.dll",
"C:\\Windows\\SYSTEM32\\d3dcompiler_47.dll",
"C:\\Windows\\SYSTEM32\\cryptsp.dll",
"C:\\Windows\\System32\\DriverStore\\FileRepository\\vm3d.inf_amd64_39d3dfd189710365\\vm3dgl64.dll",
"C:\\Windows\\System32\\DriverStore\\FileRepository\\vm3d.inf_amd64_39d3dfd189710365\\vm3dglhelper64.dll",
"C:\\Windows\\SYSTEM32\\WINMM.dll",
"C:\\Windows\\SYSTEM32\\D3D12Core.dll",
"C:\\Windows\\SYSTEM32\\d3d10warp.dll",
"C:\\Windows\\SYSTEM32\\D3DSCache.dll",
"C:\\Windows\\SYSTEM32\\USERENV.dll",
"C:\\Windows\\SYSTEM32\\dxilconv.dll",
"C:\\Windows\\SYSTEM32\\dcomp.dll",
"C:\\Windows\\SYSTEM32\\Microsoft.Internal.WarpPal.dll",
"C:\\Windows\\SYSTEM32\\textinputframework.dll",
"C:\\Windows\\SYSTEM32\\uiautomationcore.dll",
"C:\\Windows\\SYSTEM32\\OLEACC.dll",
"C:\\Windows\\System32\\threadpoolwinrt.dll"
]
@@ -1,5 +0,0 @@
{
"matched_files": 558,
"exact_physical_inventory": 559,
"result": "PASS after native packaged walkthrough open and Save"
}
@@ -1,116 +0,0 @@
[
{
"path": "producer-inventory.json",
"original": ".local/authoring-prerelease-20260911/inventory.json",
"bytes": 66465,
"sha256": "3c78dea4e93dae186fd24ab826c6680178a2c7849c270a22deae2ff732f1857b"
},
{
"path": "producer-build-evidence.json",
"original": ".local/authoring-prerelease-20260911/build-evidence.json",
"bytes": 1230,
"sha256": "ccc1ccd087f1de9605ba23a4680e1cb6d37ce5ccf0f8db03c03c4797ae32db25"
},
{
"path": "producer-package-result.json",
"original": ".local/authoring-prerelease-20260911/package-initial-result.json",
"bytes": 216,
"sha256": "45f372960931fa34ca75086df5d346eab9127a7ae70b53aed86751e372c24bae"
},
{
"path": "producer-roundtrip.json",
"original": ".local/authoring-prerelease-20260911/committed-roundtrip.json",
"bytes": 40443,
"sha256": "27e4cd2d6130a9ced76560cee130b5d363478ee0da62925e785691c63fadb098"
},
{
"path": "reviewer-artifact-result.json",
"original": ".local/authoring-prerelease-review-20260911/artifact-result.json",
"bytes": 338784,
"sha256": "8b20e9d294338754ddc9b3320b59f55fc19ab979b8da18819fb47a8036db0bba"
},
{
"path": "reviewer-server-result.json",
"original": ".local/authoring-prerelease-review-20260911/server-result.json",
"bytes": 128779,
"sha256": "086bf21e79f3bc7deddfd3278c8ade9b470b11031f7fb278ca0ead3a75b6cfb1"
},
{
"path": "reviewer.py",
"original": ".local/authoring-prerelease-review-20260911/review.py",
"bytes": 21434,
"sha256": "af9eb20946dfcec78bf8959f1d5dc175e82ebb9fabba9f94cefe590fea516b92"
},
{
"path": "gui-launch.json",
"original": ".local/authoring-prerelease-gui-20260911-v2/launch.json",
"bytes": 827,
"sha256": "ade93cb1abea623f1cc63b8124857cad822e4f75e8d1c389f75fd8a9089b2c39"
},
{
"path": "gui-loaded-modules.json",
"original": ".local/authoring-prerelease-gui-20260911-v2/loaded-modules.json",
"bytes": 3123,
"sha256": "ccae3d91310644e171bf35028f1c0758ef330ebb051983e0524b8cd714652b6b"
},
{
"path": "gui-post-save-exact.json",
"original": ".local/authoring-prerelease-gui-20260911-v2/post-save-package-exact.json",
"bytes": 133,
"sha256": "e340289a2c09058c539e63de33a361326b146fc181a8bd1349a88bfc813f2420"
},
{
"path": "upload-binaries-verified.json",
"original": ".local/authoring-prerelease-20260911/upload-binaries-verified.json",
"bytes": 685,
"sha256": "16799aa759e7287f4c50af1068d311f6f916f97e0cfbd7aaddf7432770d281f3"
},
{
"path": "gui-launch.py",
"original": ".local/authoring-prerelease-gui-20260911.py",
"bytes": 2001,
"sha256": "db256498e44cbb67cd84738a1a37f0e9ab0931d130a3b8c830af2c02cff0924c"
},
{
"path": "home.png",
"original": ".local/authoring-prerelease-gui-20260911-v2/home.png",
"bytes": 97695,
"sha256": "e9c24489e949096347b11234d8d2d343716fd5895903c4978d139107a70e3e5a"
},
{
"path": "oa-walkthrough-save.png",
"original": ".local/authoring-prerelease-gui-20260911-v2/oa-walkthrough-save.png",
"bytes": 131037,
"sha256": "61b2cbdd2dddb6fa176000198ae845554147cbc80abe52fa992211157f6297b5"
},
{
"path": "sa-walkthrough.png",
"original": ".local/authoring-prerelease-gui-20260911-v2/sa-walkthrough.png",
"bytes": 132180,
"sha256": "7f3a2bbed9fa69f9d5d844f9a52f81fbc3928244f49d7a9ff1e475c3f2411dbf"
},
{
"path": "state-workspace.png",
"original": ".local/authoring-prerelease-gui-20260911-v2/state-workspace.png",
"bytes": 135827,
"sha256": "79010527e5e1bb8ccf428788a00dea80e6d8253f3d7c249089218e2df9edd6da"
},
{
"path": "offline-guide.png",
"original": ".local/authoring-prerelease-gui-20260911-v2/offline-guide.png",
"bytes": 185496,
"sha256": "58812d2bd0d6e73daa5187f2dd87564189960387ac4bb1e399af4b8d114c05df"
},
{
"path": "published-verified.json",
"original": ".local/authoring-prerelease-20260911/published-verified.json",
"bytes": 374,
"sha256": "668f28c4d8cf753386085271eb181513b0127940f324f423a2b87614ec8cc85a"
},
{
"path": "upload-validation-verified.json",
"original": ".local/authoring-prerelease-20260911/upload-validation-verified.json",
"bytes": 277,
"sha256": "f39859baea544662fc4bdd1fe14dbcb9bdab5639b173754a34b58b853f0d47a7"
}
]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

@@ -1,10 +0,0 @@
{
"source_identity": "Exact-byte reconstructed input snapshot 234e01e27d6935d213097b345d91d369f808af82, derived from release base 2ec72d4241fa8971fa6fe9f626937de9dfd7c7eb by seven documented LF-to-CRLF restorations and preservation attributes. All 253 GUI manifest inputs and 120 preserved server source files matched. This derived commit is not claimed as the original build commit; GUI and server original build records are retained separately.",
"profile": "Prebuilt Windows debug/development artifacts: GUI cargo build --locked -p oa-desktop --bin arcadia-studio, September 11 2026; preserved server from September 7 workspace bins build. Not a release-profile or reproducible-build claim.",
"compiler": "rustc 1.98.1, commit 48a229ceaefd4985c50990b14116b6d856af0985, x86_64-pc-windows-gnullvm, LLVM 22.1.8. Current rustc -vV, all 58 prior-notice target-library hashes and both embedded compiler paths matched; original recorded build evidence retained.",
"target": "x86_64-pc-windows-gnullvm",
"binary_sha256": {
"arcadia-studio.exe": "d4d9c2bd937e301ff1009d7cb93a34ee5aa6dfc837ff7e87d468c85371b20c31",
"arcadia-server.exe": "efeeb89c0d2e0f93df4472cb3e9f48b2b722a37ae1043c90a5a56f2e845fe665"
}
}
File diff suppressed because it is too large Load Diff
@@ -1,7 +0,0 @@
{
"started": "2026-09-11T12:17:30.7730570Z",
"source_commit": "234e01e27d6935d213097b345d91d369f808af82",
"success": true,
"finished": "2026-09-11T12:21:23.0302800Z",
"elapsed_seconds": 232.2812442
}
@@ -1,10 +0,0 @@
{
"id": 1,
"tag": "v0.2.0-preview.authoring.20260911",
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.authoring.20260911",
"draft": false,
"prerelease": true,
"asset_count": 3,
"notes_sha256": "e48399db78b18c6bd779412f7aeccf13fe78bf8c9bac22a4c418755acfab175c",
"published_at": "2026-09-11T12:40:51Z"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,335 +0,0 @@
"""Independent frozen archive and packaged-server checks; never runs Cargo or GUI."""
from pathlib import Path, PurePosixPath
import hashlib
import json
import os
import re
import socket
import stat
import struct
import subprocess
import sys
import tarfile
import time
import tomllib
import traceback
import urllib.request
import uuid
import zipfile
OUT = Path(__file__).resolve().parent
ROOT = OUT.parents[1]
PREP = ROOT / '.local/authoring-prerelease-20260911'
NAME = 'ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm'
ZIP = PREP / 'packages' / (NAME + '.zip')
EXTRACT = OUT / 'extracted'
PACKAGE = EXTRACT / NAME
SOURCE = PREP / 'source'
SOURCE_COMMIT = '234e01e27d6935d213097b345d91d369f808af82'
BASE_COMMIT = '2ec72d4241fa8971fa6fe9f626937de9dfd7c7eb'
EXPECTED_ZIP = '664f30b6217689aca1492eb263b3d15777067d732fa890eeb028f435209dadfa'
BINARIES = {
'arcadia-studio.exe': 'd4d9c2bd937e301ff1009d7cb93a34ee5aa6dfc837ff7e87d468c85371b20c31',
'arcadia-server.exe': 'efeeb89c0d2e0f93df4472cb3e9f48b2b722a37ae1043c90a5a56f2e845fe665',
'libunwind.dll': 'f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4',
}
RESULT = {'checks': [], 'scope': sys.argv[1], 'started_utc': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())}
def check(condition, label):
if not condition:
raise AssertionError(label)
RESULT['checks'].append(label)
def sha(data):
return hashlib.sha256(data).hexdigest()
def read_json(path):
return json.loads(path.read_text(encoding='utf-8-sig'))
def write_json(path, value):
with path.open('x', encoding='utf-8', newline='\n') as f:
json.dump(value, f, indent=2, ensure_ascii=False)
f.write('\n')
def file_map(directory):
result = {}
for p in directory.rglob('*'):
check(not p.is_symlink() and not (getattr(p.lstat(), 'st_file_attributes', 0) & 0x400), 'ordinary path: ' + p.relative_to(directory).as_posix())
if p.is_file():
result[p.relative_to(directory).as_posix()] = sha(p.read_bytes())
return result
def safe_name(name):
p = PurePosixPath(name)
return not p.is_absolute() and p.as_posix() == name and '\\' not in name and ':' not in name and all(c not in ('', '.', '..') and not c.endswith(('.', ' ')) and not re.match(r'(?i)^(con|nul|prn|aux|com[1-9]|lpt[1-9])(\.|$)', c) for c in p.parts)
def git_blobs(ref, paths):
raw = subprocess.run(['git', 'cat-file', '--batch'], input=''.join(ref + ':' + p + '\n' for p in paths).encode(), cwd=ROOT, capture_output=True, check=True).stdout
result, cursor = {}, 0
for p in paths:
end = raw.index(b'\n', cursor)
header = raw[cursor:end].split()
check(len(header) == 3 and header[1] == b'blob', 'Git blob exists: ' + ref[:7] + ':' + p)
size = int(header[2])
result[p] = raw[end + 1:end + 1 + size]
cursor = end + 2 + size
check(cursor == len(raw), 'Git batch framing complete: ' + ref[:7])
return result
def artifact():
check(not EXTRACT.exists(), 'clean extraction destination absent')
check(ZIP.stat().st_size == 32618262 and sha(ZIP.read_bytes()) == EXPECTED_ZIP, 'frozen ZIP size and SHA256')
with zipfile.ZipFile(ZIP) as archive:
infos = archive.infolist()
names = [i.filename for i in infos]
check(len(infos) == 559, '559 ZIP members')
check(len({n.casefold() for n in names}) == len(names), 'no duplicate or case-colliding ZIP names')
check(all(safe_name(n) and n.startswith(NAME + '/') for n in names), 'one safe ZIP root without traversal or Windows special paths')
check(all(not i.is_dir() and stat.S_IFMT(i.external_attr >> 16) in (0, stat.S_IFREG) for i in infos), 'ordinary file-only ZIP entries')
check(all(i.date_time == (2000, 1, 1, 0, 0, 0) and i.flag_bits & 1 == 0 for i in infos), 'fixed timestamps and no encrypted entries')
check(archive.testzip() is None, 'all ZIP CRCs')
EXTRACT.mkdir()
archive.extractall(EXTRACT)
archive_hashes = {i.filename[len(NAME) + 1:]: sha(archive.read(i)) for i in infos}
actual = file_map(PACKAGE)
check(actual == archive_hashes, 'complete extracted file set and bytes equal ZIP')
sums = {}
for line in (PACKAGE / 'SHA256SUMS.txt').read_text().splitlines():
match = re.fullmatch(r'([0-9a-f]{64}) (.+)', line)
check(match is not None and safe_name(match[2]) and match[2] not in sums, 'well-formed unique checksum row')
sums[match[2]] = match[1]
check(sums == {p: h for p, h in actual.items() if p != 'SHA256SUMS.txt'}, 'checksum inventory covers every other file exactly')
package = read_json(PACKAGE / 'package.json')
inputs = package['input_sha256']
generated = {'SHA256SUMS.txt', 'START-HERE.txt', 'THIRD-PARTY-NOTICES.txt', 'dependency-notices.json', 'documentation-check.json', 'package.json'}
check(set(actual) - set(inputs) == generated and all(actual[p] == h.lower() for p, h in inputs.items()), '553 package input hashes plus exactly six generated files')
check(package['version'] == '0.2.0-preview.authoring.20260911' and package['target'] == 'x86_64-pc-windows-gnullvm', 'version and target')
check(all(actual[p] == h for p, h in BINARIES.items()), 'exact GUI, server and runtime hashes')
for p in BINARIES:
data = (PACKAGE / p).read_bytes()
offset = struct.unpack_from('<I', data, 0x3c)[0]
check(data[:2] == b'MZ' and data[offset:offset + 4] == b'PE\0\0' and struct.unpack_from('<H', data, offset + 4)[0] == 0x8664, 'ordinary PE x86_64: ' + p)
check({p for p in actual if '/' not in p} == {'arcadia-server.exe', 'arcadia-studio.exe', 'libunwind.dll', 'LICENSE', 'README.md'} | generated, 'only declared portable top-level files')
check({p.split('/')[0] for p in actual if '/' in p} == {'deployment', 'docs', 'examples', 'licenses'}, 'no harness, private profile, source checkout or credential-directory payload')
for p in actual:
if p.startswith(('docs/', 'examples/', 'deployment/')) or p == 'LICENSE':
check((SOURCE / p).is_file() and sha((SOURCE / p).read_bytes()) == actual[p], 'public source document/example bytes: ' + p)
RESULT['archive'] = {'path': str(ZIP), 'sha256': EXPECTED_ZIP, 'bytes': ZIP.stat().st_size, 'file_count': len(actual), 'files': actual}
RESULT['package_claims'] = {k: package[k] for k in ('version', 'target', 'acceptance', 'build', 'build_evidence')}
provenance()
notices(actual)
def provenance():
gui_path = ROOT / '.local/behavior-creation-20260911/gui-verified/manifest.json'
gui = read_json(gui_path)
expected = {i['path']: i['sha256'].lower() for i in gui['inputs']}
check(len(expected) == 253, 'original GUI manifest has 253 unique inputs')
derived = git_blobs(SOURCE_COMMIT, list(expected))
base = git_blobs(BASE_COMMIT, list(expected))
differences = []
for p, h in expected.items():
check(sha(derived[p]) == h == sha((SOURCE / p).read_bytes()), 'original GUI input equals derived Git blob and checkout: ' + p)
if sha(base[p]) != h:
check(sha(base[p].replace(b'\r\n', b'\n').replace(b'\n', b'\r\n')) == h, 'exact LF-to-CRLF-only restoration: ' + p)
differences.append(p)
check(set(differences) == {'docs/openapi.json'} | {'crates/oa-desktop/src/semantic_review/' + p + '.rs' for p in ('artifacts_view', 'attachments_view', 'keyed_rows', 'keyed_tests', 'keyed', 'ordered')}, 'exact seven documented CRLF restorations')
delta = subprocess.run(['git', 'diff', '--name-only', '--ignore-space-at-eol', BASE_COMMIT, SOURCE_COMMIT], cwd=ROOT, check=True, capture_output=True).stdout.decode().splitlines()
check(delta == ['.gitattributes'], 'derived commit changes only preservation attributes beyond EOL bytes')
origin = read_json(ROOT / 'harness/experiments/textual-authoring-20260911-local/provenance.json')
tar_path = ROOT / '.local/linux-qa/runtime/source7-20260907T082753190288Z.tar.gz'
check(sha(tar_path.read_bytes()) == 'cbb371a93a562e1e641d7629fe351e016d63e66fc9112499b3fed6d5cd171f78', 'original server source tar identity')
server_expected = {i['path']: i['snapshot_sha256'].lower() for i in origin['source_comparisons']}
check(len(server_expected) == 120, '120 independently recorded server source files')
server_base = git_blobs(BASE_COMMIT, list(server_expected))
tar_manifest = read_json(tar_path.with_suffix('').with_suffix('.tar.manifest.json'))
with tarfile.open(tar_path) as tar:
members = {m.name.removeprefix('./'): m for m in tar.getmembers() if m.isfile()}
for p, h in server_expected.items():
check(sha(tar.extractfile(members[p]).read()) == h == sha(server_base[p]) == sha((SOURCE / p).read_bytes()), 'server recorded tar equals base Git and staged input: ' + p)
shared = [p for p in members if p in ('Cargo.toml', 'Cargo.lock', 'docs/openapi.json') or p.startswith('build/')]
for p in shared:
check(sha(tar.extractfile(members[p]).read()) == expected[p] == tar_manifest['files'][p].lower(), 'original server/GUI shared manifest or build input: ' + p)
evidence = read_json(PACKAGE / 'package.json')['build_evidence']['evidence']
check(evidence['binary_sha256'] == {k: v for k, v in BINARIES.items() if k.endswith('.exe')}, 'packaged build evidence binds both exact executables')
check(SOURCE_COMMIT in evidence['source_identity'] and BASE_COMMIT in evidence['source_identity'], 'evidence identifies auxiliary and base sources distinctly')
check('not claimed as the original build commit' in evidence['source_identity'] and 'Not a release-profile or reproducible-build claim' in evidence['profile'], 'packaged provenance retains explicit limitations')
RESULT['provenance'] = {'gui_manifest_sha256': sha(gui_path.read_bytes()), 'gui_build_record': gui['build'], 'historical_gui_head': gui['head'], 'gui_inputs': 253, 'source_commit': SOURCE_COMMIT, 'base_commit': BASE_COMMIT, 'eol_restorations': differences, 'server_source_files': 120, 'shared_input_files': shared, 'tar_sha256': sha(tar_path.read_bytes())}
def notices(actual):
notice = read_json(PACKAGE / 'dependency-notices.json')
check(notice['root_packages'] == ['oa-desktop', 'oa-server'] and len(notice['packages']) == 266, '266 notice packages and exact desktop/server roots')
check(notice['cargo_lock_sha256'].lower() == sha((SOURCE / 'Cargo.lock').read_bytes()), 'notice lock equals exact historical source lock')
for p, h in notice['workspace_build_inputs_sha256'].items():
check(sha((SOURCE / p).read_bytes()) == h, 'notice common build input: ' + p)
lock = tomllib.loads((SOURCE / 'Cargo.lock').read_text())
locked = {(p['name'], p['version'], p.get('source')): p for p in lock['package']}
referenced = set()
def refs(items):
for i in items:
p = i['path']
check(safe_name(p) and p.startswith('licenses/') and actual.get(p) == i['sha256'].lower(), 'bundled exact notice reference: ' + p)
referenced.add(p)
fonts = []
for p in notice['packages']:
key = (p['name'], p['version'], p['source'])
check(key in locked and p['registry_checksum'] == locked[key].get('checksum'), 'notice identity/checksum occurs in historical lock: ' + p['name'] + '@' + p['version'])
check(len(p['notices']) > 0, 'package has notice text: ' + p['name'])
refs(p['notices'])
for f in p['embedded_fonts']:
check(len(f['notices']) > 0, 'embedded font notice present: ' + p['name'] + '/' + f['path'])
refs(f['notices'])
fonts.append({'package': p['name'], 'path': f['path'], 'sha256': f['sha256'], 'license': f['license']})
if p['source'] is None:
directory = SOURCE / 'crates' / p['name']
files = {f.relative_to(directory).as_posix(): sha(f.read_bytes()) for f in directory.rglob('*') if f.is_file() and 'target' not in f.relative_to(directory).parts and f.name != '.cargo-ok'}
check(files == p['local_source_sha256'], 'complete ordinary local-crate inventory: ' + p['name'])
refs(notice['rust']['notices'])
refs(notice['runtime']['notices'])
check(notice['runtime']['sha256'] == BINARIES['libunwind.dll'], 'runtime notice is bound to shipped DLL')
library_dir = ROOT / '.local/toolchain/rustup/toolchains/stable-x86_64-pc-windows-gnullvm/lib/rustlib/x86_64-pc-windows-gnullvm/lib'
check(len(notice['rust']['target_libraries_sha256']) == 58, '58 compiler target libraries recorded')
for name, h in notice['rust']['target_libraries_sha256'].items():
check(sha((library_dir / name).read_bytes()) == h, 'retained compiler target-library bytes: ' + name)
RESULT['notices'] = {'packages': len(notice['packages']), 'roots': notice['root_packages'], 'lock_sha256': notice['cargo_lock_sha256'], 'notice_reference_files': len(referenced), 'additional_license_files': sorted({p for p in actual if p.startswith('licenses/')} - referenced), 'embedded_fonts': fonts, 'rust_version': notice['rust']['version'], 'runtime_provenance': notice['runtime']['provenance'], 'scope': notice['scope']}
def server():
prior = read_json(OUT / 'artifact-result.json')
check(prior['status'] == 'PASS' and file_map(PACKAGE) == prior['archive']['files'], 'previously verified extracted package is unchanged')
runtime = OUT / 'server-run'
runtime.mkdir()
data_dir = runtime / 'data'
temp = runtime / 'temp'
temp.mkdir()
windows = Path(os.environ['SystemRoot'])
env = {'SystemRoot': str(windows), 'WINDIR': str(windows), 'PATH': str(windows / 'System32') + ';' + str(windows), 'TEMP': str(temp), 'TMP': str(temp)}
exe = PACKAGE / 'arcadia-server.exe'
RESULT['environment'] = env
RESULT['processes'] = []
for arg in ('--version', '--help'):
output = subprocess.run([str(exe), arg], cwd=PACKAGE, env=env, capture_output=True, timeout=15, creationflags=subprocess.CREATE_NO_WINDOW)
(runtime / (arg[2:] + '.stdout')).write_bytes(output.stdout)
(runtime / (arg[2:] + '.stderr')).write_bytes(output.stderr)
check(output.returncode == 0 and not output.stderr, arg + ' succeeds under clean runtime PATH')
if arg == '--version':
check(output.stdout.decode().strip() == 'arcadia-server 0.2.0', 'server reports underlying application version 0.2.0')
check(not data_dir.exists(), 'help/version do not create explicit test data directory')
opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
request_number = 0
def request(port, method, path, payload=None):
nonlocal request_number
request_number += 1
body = None if payload is None else json.dumps(payload, ensure_ascii=False).encode()
req = urllib.request.Request(f'http://127.0.0.1:{port}' + path, data=body, method=method, headers={} if body is None else {'Content-Type': 'application/json'})
with opener.open(req, timeout=10) as response:
raw = response.read()
meta = {'method': method, 'path': path, 'status': response.status, 'headers': dict(response.headers), 'body_sha256': sha(raw)}
prefix = runtime / f'http-{request_number:02d}'
prefix.with_suffix('.body').write_bytes(raw)
write_json(prefix.with_suffix('.json'), meta)
return meta, raw
def start(index):
with socket.socket() as s:
s.bind(('127.0.0.1', 0))
port = s.getsockname()[1]
out = (runtime / f'server-{index}.stdout').open('xb')
err = (runtime / f'server-{index}.stderr').open('xb')
args = [str(exe), '--bind', f'127.0.0.1:{port}', '--data-dir', str(data_dir)]
process = subprocess.Popen(args, cwd=PACKAGE, env=env, stdout=out, stderr=err, creationflags=subprocess.CREATE_NO_WINDOW)
out.close()
err.close()
RESULT['processes'].append({'pid': process.pid, 'port': port, 'arguments': args})
deadline = time.monotonic() + 15
while True:
if process.poll() is not None:
raise AssertionError('packaged server exited before listening')
try:
with socket.create_connection(('127.0.0.1', port), timeout=.2):
break
except OSError:
if time.monotonic() > deadline:
process.terminate()
process.wait(timeout=5)
raise AssertionError('packaged server did not listen within 15s')
time.sleep(.05)
return process, port
def stop(process):
process.terminate()
code = process.wait(timeout=10)
RESULT['processes'][-1]['exit_after_explicit_terminate'] = code
process = None
try:
process, port = start(1)
for path in ('/health', '/health/ready'):
meta, raw = request(port, 'GET', path)
check(meta['status'] == 200 and json.loads(raw) == {'status': 'ok'}, path + ' contract')
meta, raw = request(port, 'GET', '/api/v1/openapi.json')
check(meta['status'] == 200 and raw == (PACKAGE / 'docs/openapi.json').read_bytes(), 'served OpenAPI equals complete packaged source bytes')
name = 'Independent package persistence — 救助 20260911'
meta, raw = request(port, 'POST', '/api/v1/projects', {'name': name})
created = json.loads(raw)
check(meta['status'] == 201, 'one create returns 201')
resource = str(uuid.UUID(created['resource_id']))
model_id = str(uuid.UUID(created['model_id']))
expected_summary = {'resource_id': resource, 'revision': 1, 'model_id': model_id, 'schema_version': 7, 'name': name, 'elements': 0, 'relations': 0, 'migration': None}
check(created == expected_summary and resource != model_id, 'complete create summary with distinct fresh resource/model IDs')
etag = f'"p-{resource}-r1"'
headers = {k.lower(): v for k, v in meta['headers'].items()}
path = '/api/v1/projects/' + resource
check(headers.get('etag') == etag and headers.get('location') == path, 'create ETag and resource Location')
meta, raw = request(port, 'GET', path)
stored = json.loads(raw)
model = {'schema_version': 7, 'id': model_id, 'alias': 'mission', 'name': name, 'description': '', 'elements': {}, 'relations': {}, 'diagrams': {}, 'artifact_links': {}, 'traces': {}}
source = f'arcadia 7;\nproject mission {json.dumps(name, ensure_ascii=False)} id "{model_id}" {{\n description "";\n}}\n'
expected = {'resource_id': resource, 'revision': 1, 'model': model, 'source_project': {'entry': 'project.arcadia', 'files': {'project.arcadia': source}}}
check(meta['status'] == 200 and stored == expected, 'GET equals independently predicted complete Project and SourceBundle')
check({k.lower(): v for k, v in meta['headers'].items()}.get('etag') == etag, 'GET ETag equals created revision')
disk = data_dir / (resource + '.json')
disk_bytes = disk.read_bytes()
check(json.loads(disk_bytes) == expected, 'durable disk envelope equals complete expected GET')
check({p.name for p in data_dir.iterdir()} == {'.arcadia.lock', disk.name}, 'private store contains only one project and lock')
stop(process)
process = None
process, port = start(2)
meta, raw = request(port, 'GET', '/health/ready')
check(meta['status'] == 200 and json.loads(raw) == {'status': 'ok'}, 'restarted packaged server ready')
meta, raw = request(port, 'GET', path)
check(meta['status'] == 200 and json.loads(raw) == expected, 'restart retains exact complete Project and SourceBundle')
check({k.lower(): v for k, v in meta['headers'].items()}.get('etag') == etag and disk.read_bytes() == disk_bytes, 'restart retains revision, ETag and every durable envelope byte')
RESULT['persistence'] = {'resource_id': resource, 'model_id': model_id, 'revision': 1, 'etag': etag, 'disk_sha256': sha(disk_bytes), 'expected': expected, 'stop_kind': 'explicit process termination after acknowledged durable create; not a graceful-drain claim'}
finally:
if process is not None and process.poll() is None:
stop(process)
check(file_map(PACKAGE) == prior['archive']['files'], 'server execution leaves complete extracted package unchanged')
check(sha(ZIP.read_bytes()) == EXPECTED_ZIP, 'frozen ZIP unchanged after independent runtime checks')
if __name__ == '__main__':
result_path = OUT / (sys.argv[1] + '-result.json')
if result_path.exists():
raise SystemExit('Refusing to overwrite prior evidence: ' + str(result_path))
try:
{'artifact': artifact, 'server': server}[sys.argv[1]]()
RESULT['status'] = 'PASS'
except Exception as error:
RESULT['status'] = 'FAIL'
RESULT['error'] = repr(error)
RESULT['traceback'] = traceback.format_exc()
RESULT['finished_utc'] = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
RESULT['script_sha256'] = sha(Path(__file__).read_bytes())
write_json(result_path, RESULT)
print(json.dumps({k: RESULT[k] for k in ('scope', 'status', 'started_utc', 'finished_utc')}, indent=2))
print('checks:', len(RESULT['checks']))
if RESULT['status'] == 'FAIL':
print(RESULT['traceback'])
sys.exit(1)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

@@ -1,18 +0,0 @@
[
{
"id": 1,
"name": "ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm.zip",
"bytes": 32618262,
"sha256": "664f30b6217689aca1492eb263b3d15777067d732fa890eeb028f435209dadfa",
"url": "http://217.177.34.108:3000/attachments/48a283b7-5391-4677-9427-02a772e5e7e4",
"readback": "PASS"
},
{
"id": 2,
"name": "ArcadiaStudio-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm.zip.sha256",
"bytes": 143,
"sha256": "ea553a85f35d2d48f229dd4cd00ac0c3d4a6e9dafa58273004b2c49d1279f856",
"url": "http://217.177.34.108:3000/attachments/08164a39-9292-4b2d-9856-c6ec41d9b8e2",
"readback": "PASS"
}
]
@@ -1,10 +0,0 @@
[
{
"id": 3,
"name": "VALIDATION.md",
"bytes": 29308,
"sha256": "c2a70be735c780d3e468d5f12643fb00be75673434211366739926536bbbe9b9",
"url": "http://217.177.34.108:3000/attachments/9ff53361-eedf-46a0-aa4e-34f11bb0f302",
"readback": "PASS"
}
]
@@ -1,15 +0,0 @@
# Standalone CLI package evidence
Exact frozen author and independent reviewer evidence for the Windows
`ArcadiaCLI-0.2.0-preview.authoring.20260911` artifact. `hashes.json` records
original private paths, lengths and hashes; preserve these bytes through Git.
The original host-specific reviewer script expects its recorded `.local` layout,
source snapshot and fresh disposable outputs. Restore that layout to reproduce
it; running the archived file in this directory is not a portable test command.
The production packaging tests remain under `scripts/`.
The author report records 15 inert checks, 13 Python tests, default-preserving
notice selection and strict package assembly. Independent review verifies source
equivalence/defaults, all 114 archive files and 156 assertions across 10 clean
runtime invocations. Neither completed the wider OA/SA product or Linux acceptance.
@@ -1,5 +0,0 @@
.............
----------------------------------------------------------------------
Ran 13 tests in 1.252s
OK
@@ -1,454 +0,0 @@
{
"assembly_commit": "a0a48e82bd43be181caca1fe2c1514c21f2bc405",
"semantic_commit": "01b76a1e89e93b7992f39e63560aa8b2ca2f69e0",
"packaging_files": [
{
"path": "scripts/package-cli-windows.ps1",
"sha256": "b6ec59bb55ff1e5624c782f492ce1d169131e708f257dcca195957edf7341c1a"
},
{
"path": "scripts/package-common.ps1",
"sha256": "d859453a8230b4f305d822c8742b371a71e35df698109a5d55c948f6dfaf0640"
},
{
"path": "scripts/package-windows.ps1",
"sha256": "28997ff78565619ed9c9b185f66dc922808f1f0be17f522b430c6c415448663d"
},
{
"path": "scripts/windows-notices.ps1",
"sha256": "a5328c05579e1b9ca09142ee99e87c12994d12764f7c69448e392883d718ef01"
},
{
"path": "scripts/package-artifacts.py",
"sha256": "24515fdbf4eebfb47b82383c6b3ccf290261cbd919f7f46a586b6488af769c8d"
},
{
"path": "scripts/package-cli-readme.md",
"sha256": "ea7bc971993e02751f24bc3cb313503a5f5fefd788540974e114398115c7c8e2"
},
{
"path": "scripts/test-package-cli-windows.ps1",
"sha256": "2c18f91149ede5c7b677a165bd0d8b31f3c4691642cc10dd1007a7a77bde912a"
},
{
"path": "scripts/test-package-artifacts.py",
"sha256": "881718181a36fa5f7abfcd2e746bc1339446f9aeed6b2c039b8d2ce230ec202d"
},
{
"path": "scripts/test-windows-notices.ps1",
"sha256": "00a6ad1ed28fdb9044ceb7cc0714ceb7af095db2fb18f4828a053aa872a3147d"
}
],
"exact_cli_inputs": [
{
"path": "Cargo.toml",
"sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62"
},
{
"path": "Cargo.lock",
"sha256": "2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510"
},
{
"path": "crates/oa-cli/Cargo.toml",
"sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde"
},
{
"path": "crates/oa-cli/src/lib.rs",
"sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc"
},
{
"path": "crates/oa-cli/src/main.rs",
"sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb"
},
{
"path": "crates/oa-cli/tests/source_cli.rs",
"sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8"
}
],
"unchanged_core_shared_build_inputs": [
{
"path": "build/windows_manifest.rs",
"sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80"
},
{
"path": "build/windows.manifest",
"sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb"
},
{
"path": "build/windows.rc",
"sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e"
},
{
"path": "crates/oa-core/build.rs",
"sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9"
},
{
"path": "crates/oa-core/Cargo.toml",
"sha256": "64824ec447be777841a972bf06c894ef2624a37e4725583bcfe0389deb9f00a3"
},
{
"path": "crates/oa-core/examples/generate_demo.rs",
"sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661"
},
{
"path": "crates/oa-core/examples/generate_release1.rs",
"sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5"
},
{
"path": "crates/oa-core/examples/release_dense_views.rs",
"sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412"
},
{
"path": "crates/oa-core/examples/routing_workshop.rs",
"sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7"
},
{
"path": "crates/oa-core/src/data.rs",
"sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a"
},
{
"path": "crates/oa-core/src/demo.rs",
"sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c"
},
{
"path": "crates/oa-core/src/language_nesting_tests.rs",
"sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b"
},
{
"path": "crates/oa-core/src/language.rs",
"sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765"
},
{
"path": "crates/oa-core/src/language/semantic_source.rs",
"sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29"
},
{
"path": "crates/oa-core/src/lib.rs",
"sha256": "52cb6ee7a4ffc00711ecf121c1a1b14ca154863f7ca27b0d2a8e239edce8aca7"
},
{
"path": "crates/oa-core/src/migration_v2/adapter.rs",
"sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5"
},
{
"path": "crates/oa-core/src/migration_v2/mod.rs",
"sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9"
},
{
"path": "crates/oa-core/src/migration_v2/model.rs",
"sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb"
},
{
"path": "crates/oa-core/src/migration_v2/references.rs",
"sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20"
},
{
"path": "crates/oa-core/src/migration_v2/source.rs",
"sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6"
},
{
"path": "crates/oa-core/src/migration_v2/state_validation.rs",
"sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0"
},
{
"path": "crates/oa-core/src/migration_v2/transitions.rs",
"sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1"
},
{
"path": "crates/oa-core/src/migration_v2/validation.rs",
"sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780"
},
{
"path": "crates/oa-core/src/migration_v3/mod.rs",
"sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722"
},
{
"path": "crates/oa-core/src/migration_v4.rs",
"sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70"
},
{
"path": "crates/oa-core/src/model.rs",
"sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb"
},
{
"path": "crates/oa-core/src/operations.rs",
"sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41"
},
{
"path": "crates/oa-core/src/persistence.rs",
"sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14"
},
{
"path": "crates/oa-core/src/ports.rs",
"sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80"
},
{
"path": "crates/oa-core/src/projection.rs",
"sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b"
},
{
"path": "crates/oa-core/src/projection/port_layout.rs",
"sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079"
},
{
"path": "crates/oa-core/src/projection/state.rs",
"sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28"
},
{
"path": "crates/oa-core/src/references.rs",
"sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb"
},
{
"path": "crates/oa-core/src/routing.rs",
"sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080"
},
{
"path": "crates/oa-core/src/semantic.rs",
"sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239"
},
{
"path": "crates/oa-core/src/semantic/catalog.rs",
"sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4"
},
{
"path": "crates/oa-core/src/semantic/historical.rs",
"sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb"
},
{
"path": "crates/oa-core/src/semantic/linked.rs",
"sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2"
},
{
"path": "crates/oa-core/src/semantic/mutate.rs",
"sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d"
},
{
"path": "crates/oa-core/src/semantic/review.rs",
"sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e"
},
{
"path": "crates/oa-core/src/semantic/types.rs",
"sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb"
},
{
"path": "crates/oa-core/src/session.rs",
"sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00"
},
{
"path": "crates/oa-core/src/source_files.rs",
"sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683"
},
{
"path": "crates/oa-core/src/source_project.rs",
"sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466"
},
{
"path": "crates/oa-core/src/source_project/source_migration.rs",
"sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95"
},
{
"path": "crates/oa-core/src/source_project/source_structure.rs",
"sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f"
},
{
"path": "crates/oa-core/src/state_validation.rs",
"sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18"
},
{
"path": "crates/oa-core/src/topology_context.rs",
"sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d"
},
{
"path": "crates/oa-core/src/topology_context/analysis_tests.rs",
"sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56"
},
{
"path": "crates/oa-core/src/topology_context/analysis.rs",
"sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65"
},
{
"path": "crates/oa-core/src/transitions.rs",
"sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d"
},
{
"path": "crates/oa-core/src/transitions/communication.rs",
"sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028"
},
{
"path": "crates/oa-core/src/validation.rs",
"sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e"
},
{
"path": "crates/oa-core/src/validation/coverage.rs",
"sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f"
},
{
"path": "crates/oa-core/src/view_options_tests.rs",
"sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208"
},
{
"path": "crates/oa-core/src/view_options.rs",
"sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208"
},
{
"path": "crates/oa-core/tests/communication_boundary_scenarios.rs",
"sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b"
},
{
"path": "crates/oa-core/tests/communication_means.rs",
"sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4"
},
{
"path": "crates/oa-core/tests/coverage_diagnostics.rs",
"sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4"
},
{
"path": "crates/oa-core/tests/language.rs",
"sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e"
},
{
"path": "crates/oa-core/tests/port_anchors.rs",
"sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa"
},
{
"path": "crates/oa-core/tests/port_migration.rs",
"sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7"
},
{
"path": "crates/oa-core/tests/port_source.rs",
"sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12"
},
{
"path": "crates/oa-core/tests/prepared_commands.rs",
"sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b"
},
{
"path": "crates/oa-core/tests/process_diagnostics.rs",
"sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906"
},
{
"path": "crates/oa-core/tests/r3_constructor_ack.rs",
"sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0"
},
{
"path": "crates/oa-core/tests/r3_migration.rs",
"sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd"
},
{
"path": "crates/oa-core/tests/r3_semantic.rs",
"sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32"
},
{
"path": "crates/oa-core/tests/r3_source.rs",
"sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408"
},
{
"path": "crates/oa-core/tests/r6_data.rs",
"sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155"
},
{
"path": "crates/oa-core/tests/r6_migration.rs",
"sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1"
},
{
"path": "crates/oa-core/tests/r6_source.rs",
"sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6"
},
{
"path": "crates/oa-core/tests/release_capabilities.rs",
"sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30"
},
{
"path": "crates/oa-core/tests/release_diagrams.rs",
"sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d"
},
{
"path": "crates/oa-core/tests/release_language_limits.rs",
"sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806"
},
{
"path": "crates/oa-core/tests/release_ports.rs",
"sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1"
},
{
"path": "crates/oa-core/tests/release_routing.rs",
"sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462"
},
{
"path": "crates/oa-core/tests/release_scenarios.rs",
"sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f"
},
{
"path": "crates/oa-core/tests/release_states.rs",
"sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811"
},
{
"path": "crates/oa-core/tests/release_topology.rs",
"sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9"
},
{
"path": "crates/oa-core/tests/release1_teaching.rs",
"sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2"
},
{
"path": "crates/oa-core/tests/review_regressions.rs",
"sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1"
},
{
"path": "crates/oa-core/tests/route_source.rs",
"sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb"
},
{
"path": "crates/oa-core/tests/routing_geometry.rs",
"sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3"
},
{
"path": "crates/oa-core/tests/routing_labels.rs",
"sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6"
},
{
"path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs",
"sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a"
},
{
"path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs",
"sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970"
},
{
"path": "crates/oa-core/tests/source_files.rs",
"sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9"
},
{
"path": "crates/oa-core/tests/source_identity_updates.rs",
"sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c"
},
{
"path": "crates/oa-core/tests/source_nested_updates.rs",
"sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855"
},
{
"path": "crates/oa-core/tests/source_project.rs",
"sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942"
},
{
"path": "crates/oa-core/tests/source6_view_contract.rs",
"sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb"
},
{
"path": "crates/oa-core/tests/source7_contract.rs",
"sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f"
},
{
"path": "crates/oa-core/tests/state_diagrams.rs",
"sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5"
},
{
"path": "crates/oa-core/tests/workflows.rs",
"sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b"
}
],
"binary_sha256": {
"arcadia.exe": "bad169f8be78dcfa74b32714569c886dd2132727080684fc2ba618d5822e3559",
"libunwind.dll": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4"
}
}
@@ -1,9 +0,0 @@
{
"source_identity": "CLI semantic/build-input basis 01b76a1e89e93b7992f39e63560aa8b2ca2f69e0. Six original CLI manifest/workspace/lock/source/test hashes and 95 unchanged core/shared build inputs independently matched. Packaging assembly basis a0a48e82bd43be181caca1fe2c1514c21f2bc405 changes packaging only and is not claimed as the original compiler input commit.",
"profile": "Preserved Windows debug/development artifact from cargo build --locked --offline -p oa-cli --bin arcadia, successful September11 2026 11:45:43.6035381Z,9.7336637seconds. No release-profile or reproducible-build claim.",
"compiler": "rustc1.98.1 commit48a229ceaefd4985c50990b14116b6d856af0985,x86_64-pc-windows-gnullvm,LLVM22.1.8. Frozen executable embeds that compiler path; current toolchain target-library hashes match preserved inventory. Original compile/test/lint and independent frozen-binary review records retained separately.",
"target": "x86_64-pc-windows-gnullvm",
"binary_sha256": {
"arcadia.exe": "bad169f8be78dcfa74b32714569c886dd2132727080684fc2ba618d5822e3559"
}
}
@@ -1,56 +0,0 @@
[
{
"path": "assembly.json",
"original": ".local/cli-packaging-20260911/assembly.json",
"bytes": 17452,
"sha256": "284ecc5e3caaf9e2201785619f81ad200166e7d489c2a65276857f71df7f0dc0"
},
{
"path": "preparation.json",
"original": ".local/cli-packaging-20260911/preparation.json",
"bytes": 17497,
"sha256": "0ec70eef7f487693c4e698cbe54d2b99e6f4d3fc10bb1e7edabc3d236c2a7aff"
},
{
"path": "build-evidence.json",
"original": ".local/cli-packaging-20260911/build-evidence.json",
"bytes": 1086,
"sha256": "b75c6f0b78caf508c046de1dd7e67a1aade15924d50452635da8b6b1eba4a7d5"
},
{
"path": "package-initial-result.json",
"original": ".local/cli-packaging-20260911/package-initial-result.json",
"bytes": 216,
"sha256": "8c474fc7c7ce254fc17c0df9c0e46bb23403bc11be052fda121e49184157dc15"
},
{
"path": "windows-initial.log",
"original": ".local/cli-packaging-20260911/windows-initial.log",
"bytes": 131,
"sha256": "c74a669d68754f45a1649636d70cab82132569ec53810a63c490bfd430e451cf"
},
{
"path": "notices-initial.log",
"original": ".local/cli-packaging-20260911/notices-initial.log",
"bytes": 430,
"sha256": "f37409b4d36959bc03dcb35ec053301da9cf4c6effbb6e9a68fca534133c36b0"
},
{
"path": "artifacts-final.log",
"original": ".local/cli-packaging-20260911/artifacts-final.log",
"bytes": 117,
"sha256": "729fe10826e06b3b0997d6c4879349f388978a5fcb5bea62d55cc4ee6603cc16"
},
{
"path": "reviewer.py",
"original": ".local/cli-packaging-review-20260911/review.py",
"bytes": 18543,
"sha256": "f85d1f34ab75b4067efe09886e447bf9fd54dc232020bcb1a46404ec57b2351e"
},
{
"path": "reviewer-result.json",
"original": ".local/cli-packaging-review-20260911/result.json",
"bytes": 33967,
"sha256": "3b92a816a62de386b5927b208c79c2a7c541e6e2e2e30bde31b4c11bbbc4509e"
}
]
@@ -1,2 +0,0 @@
PASS: normal/build and server-only Linux selection, cross-target runtime refusal, Rust reports, actual source hashes, stale archive refusal, doc-comment font exclusion, production font path/mapping refusals, exact font mapping and changed-byte refusal, unsupported source refusal, traversal refusal, altered supplement refusal.
Synthetic fixture retained for inspection: C:\Temp\arcadia-notices-c72f98e0978c45618416fe3d2cfdd38e
@@ -1,7 +0,0 @@
{
"started": "2026-09-11T12:36:52.6900250Z",
"assembly_commit": "a0a48e82bd43be181caca1fe2c1514c21f2bc405",
"success": true,
"finished": "2026-09-11T12:37:33.7683084Z",
"elapsed_seconds": 41.084165
}
@@ -1,454 +0,0 @@
{
"semantic_source_commit": "01b76a1e89e93b7992f39e63560aa8b2ca2f69e0",
"original_cli_manifest_sha256": "dd73fc2bb2190b23fffe16d6c63d4acddf52338062fac298379ddfd241d82eb8",
"exact_cli_inputs": [
{
"path": "Cargo.toml",
"sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62"
},
{
"path": "Cargo.lock",
"sha256": "2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510"
},
{
"path": "crates/oa-cli/Cargo.toml",
"sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde"
},
{
"path": "crates/oa-cli/src/lib.rs",
"sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc"
},
{
"path": "crates/oa-cli/src/main.rs",
"sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb"
},
{
"path": "crates/oa-cli/tests/source_cli.rs",
"sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8"
}
],
"unchanged_core_shared_build_inputs": [
{
"path": "build/windows_manifest.rs",
"sha256": "168da2c42ecccfebc11ee3e1b455e653a68fe9c6d30a9842a8b9e7441d086c80"
},
{
"path": "build/windows.manifest",
"sha256": "9c19c5a02f858ece84c44839ad2b145d9c1d90442da0b15c87fd045f975974eb"
},
{
"path": "build/windows.rc",
"sha256": "a27385edcae0bcf96f55361056cb7be5f36d76fcddcaefd20647c91959563e1e"
},
{
"path": "crates/oa-core/build.rs",
"sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9"
},
{
"path": "crates/oa-core/Cargo.toml",
"sha256": "64824ec447be777841a972bf06c894ef2624a37e4725583bcfe0389deb9f00a3"
},
{
"path": "crates/oa-core/examples/generate_demo.rs",
"sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661"
},
{
"path": "crates/oa-core/examples/generate_release1.rs",
"sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5"
},
{
"path": "crates/oa-core/examples/release_dense_views.rs",
"sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412"
},
{
"path": "crates/oa-core/examples/routing_workshop.rs",
"sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7"
},
{
"path": "crates/oa-core/src/data.rs",
"sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a"
},
{
"path": "crates/oa-core/src/demo.rs",
"sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c"
},
{
"path": "crates/oa-core/src/language_nesting_tests.rs",
"sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b"
},
{
"path": "crates/oa-core/src/language.rs",
"sha256": "638f08a42e9cf4996b5d07f69b4d6f517a518369f3604d25be1006e40e080765"
},
{
"path": "crates/oa-core/src/language/semantic_source.rs",
"sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29"
},
{
"path": "crates/oa-core/src/lib.rs",
"sha256": "52cb6ee7a4ffc00711ecf121c1a1b14ca154863f7ca27b0d2a8e239edce8aca7"
},
{
"path": "crates/oa-core/src/migration_v2/adapter.rs",
"sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5"
},
{
"path": "crates/oa-core/src/migration_v2/mod.rs",
"sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9"
},
{
"path": "crates/oa-core/src/migration_v2/model.rs",
"sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb"
},
{
"path": "crates/oa-core/src/migration_v2/references.rs",
"sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20"
},
{
"path": "crates/oa-core/src/migration_v2/source.rs",
"sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6"
},
{
"path": "crates/oa-core/src/migration_v2/state_validation.rs",
"sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0"
},
{
"path": "crates/oa-core/src/migration_v2/transitions.rs",
"sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1"
},
{
"path": "crates/oa-core/src/migration_v2/validation.rs",
"sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780"
},
{
"path": "crates/oa-core/src/migration_v3/mod.rs",
"sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722"
},
{
"path": "crates/oa-core/src/migration_v4.rs",
"sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70"
},
{
"path": "crates/oa-core/src/model.rs",
"sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb"
},
{
"path": "crates/oa-core/src/operations.rs",
"sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41"
},
{
"path": "crates/oa-core/src/persistence.rs",
"sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14"
},
{
"path": "crates/oa-core/src/ports.rs",
"sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80"
},
{
"path": "crates/oa-core/src/projection.rs",
"sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b"
},
{
"path": "crates/oa-core/src/projection/port_layout.rs",
"sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079"
},
{
"path": "crates/oa-core/src/projection/state.rs",
"sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28"
},
{
"path": "crates/oa-core/src/references.rs",
"sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb"
},
{
"path": "crates/oa-core/src/routing.rs",
"sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080"
},
{
"path": "crates/oa-core/src/semantic.rs",
"sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239"
},
{
"path": "crates/oa-core/src/semantic/catalog.rs",
"sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4"
},
{
"path": "crates/oa-core/src/semantic/historical.rs",
"sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb"
},
{
"path": "crates/oa-core/src/semantic/linked.rs",
"sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2"
},
{
"path": "crates/oa-core/src/semantic/mutate.rs",
"sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d"
},
{
"path": "crates/oa-core/src/semantic/review.rs",
"sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e"
},
{
"path": "crates/oa-core/src/semantic/types.rs",
"sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb"
},
{
"path": "crates/oa-core/src/session.rs",
"sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00"
},
{
"path": "crates/oa-core/src/source_files.rs",
"sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683"
},
{
"path": "crates/oa-core/src/source_project.rs",
"sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466"
},
{
"path": "crates/oa-core/src/source_project/source_migration.rs",
"sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95"
},
{
"path": "crates/oa-core/src/source_project/source_structure.rs",
"sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f"
},
{
"path": "crates/oa-core/src/state_validation.rs",
"sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18"
},
{
"path": "crates/oa-core/src/topology_context.rs",
"sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d"
},
{
"path": "crates/oa-core/src/topology_context/analysis_tests.rs",
"sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56"
},
{
"path": "crates/oa-core/src/topology_context/analysis.rs",
"sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65"
},
{
"path": "crates/oa-core/src/transitions.rs",
"sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d"
},
{
"path": "crates/oa-core/src/transitions/communication.rs",
"sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028"
},
{
"path": "crates/oa-core/src/validation.rs",
"sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e"
},
{
"path": "crates/oa-core/src/validation/coverage.rs",
"sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f"
},
{
"path": "crates/oa-core/src/view_options_tests.rs",
"sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208"
},
{
"path": "crates/oa-core/src/view_options.rs",
"sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208"
},
{
"path": "crates/oa-core/tests/communication_boundary_scenarios.rs",
"sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b"
},
{
"path": "crates/oa-core/tests/communication_means.rs",
"sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4"
},
{
"path": "crates/oa-core/tests/coverage_diagnostics.rs",
"sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4"
},
{
"path": "crates/oa-core/tests/language.rs",
"sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e"
},
{
"path": "crates/oa-core/tests/port_anchors.rs",
"sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa"
},
{
"path": "crates/oa-core/tests/port_migration.rs",
"sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7"
},
{
"path": "crates/oa-core/tests/port_source.rs",
"sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12"
},
{
"path": "crates/oa-core/tests/prepared_commands.rs",
"sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b"
},
{
"path": "crates/oa-core/tests/process_diagnostics.rs",
"sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906"
},
{
"path": "crates/oa-core/tests/r3_constructor_ack.rs",
"sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0"
},
{
"path": "crates/oa-core/tests/r3_migration.rs",
"sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd"
},
{
"path": "crates/oa-core/tests/r3_semantic.rs",
"sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32"
},
{
"path": "crates/oa-core/tests/r3_source.rs",
"sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408"
},
{
"path": "crates/oa-core/tests/r6_data.rs",
"sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155"
},
{
"path": "crates/oa-core/tests/r6_migration.rs",
"sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1"
},
{
"path": "crates/oa-core/tests/r6_source.rs",
"sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6"
},
{
"path": "crates/oa-core/tests/release_capabilities.rs",
"sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30"
},
{
"path": "crates/oa-core/tests/release_diagrams.rs",
"sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d"
},
{
"path": "crates/oa-core/tests/release_language_limits.rs",
"sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806"
},
{
"path": "crates/oa-core/tests/release_ports.rs",
"sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1"
},
{
"path": "crates/oa-core/tests/release_routing.rs",
"sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462"
},
{
"path": "crates/oa-core/tests/release_scenarios.rs",
"sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f"
},
{
"path": "crates/oa-core/tests/release_states.rs",
"sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811"
},
{
"path": "crates/oa-core/tests/release_topology.rs",
"sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9"
},
{
"path": "crates/oa-core/tests/release1_teaching.rs",
"sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2"
},
{
"path": "crates/oa-core/tests/review_regressions.rs",
"sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1"
},
{
"path": "crates/oa-core/tests/route_source.rs",
"sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb"
},
{
"path": "crates/oa-core/tests/routing_geometry.rs",
"sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3"
},
{
"path": "crates/oa-core/tests/routing_labels.rs",
"sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6"
},
{
"path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs",
"sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a"
},
{
"path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs",
"sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970"
},
{
"path": "crates/oa-core/tests/source_files.rs",
"sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9"
},
{
"path": "crates/oa-core/tests/source_identity_updates.rs",
"sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c"
},
{
"path": "crates/oa-core/tests/source_nested_updates.rs",
"sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855"
},
{
"path": "crates/oa-core/tests/source_project.rs",
"sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942"
},
{
"path": "crates/oa-core/tests/source6_view_contract.rs",
"sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb"
},
{
"path": "crates/oa-core/tests/source7_contract.rs",
"sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f"
},
{
"path": "crates/oa-core/tests/state_diagrams.rs",
"sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5"
},
{
"path": "crates/oa-core/tests/workflows.rs",
"sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b"
}
],
"packaging_files": [
{
"path": "scripts/package-cli-windows.ps1",
"sha256": "b6ec59bb55ff1e5624c782f492ce1d169131e708f257dcca195957edf7341c1a"
},
{
"path": "scripts/package-common.ps1",
"sha256": "d859453a8230b4f305d822c8742b371a71e35df698109a5d55c948f6dfaf0640"
},
{
"path": "scripts/package-windows.ps1",
"sha256": "28997ff78565619ed9c9b185f66dc922808f1f0be17f522b430c6c415448663d"
},
{
"path": "scripts/windows-notices.ps1",
"sha256": "a5328c05579e1b9ca09142ee99e87c12994d12764f7c69448e392883d718ef01"
},
{
"path": "scripts/package-artifacts.py",
"sha256": "24515fdbf4eebfb47b82383c6b3ccf290261cbd919f7f46a586b6488af769c8d"
},
{
"path": "scripts/package-cli-readme.md",
"sha256": "39171afa7dab4be10a8566153d7384aa439f1494851ce2ca1da989c6f370ef2b"
},
{
"path": "scripts/test-package-cli-windows.ps1",
"sha256": "2c18f91149ede5c7b677a165bd0d8b31f3c4691642cc10dd1007a7a77bde912a"
},
{
"path": "scripts/test-package-artifacts.py",
"sha256": "881718181a36fa5f7abfcd2e746bc1339446f9aeed6b2c039b8d2ce230ec202d"
},
{
"path": "scripts/test-windows-notices.ps1",
"sha256": "00a6ad1ed28fdb9044ceb7cc0714ceb7af095db2fb18f4828a053aa872a3147d"
}
],
"binary_sha256": {
"arcadia.exe": "bad169f8be78dcfa74b32714569c886dd2132727080684fc2ba618d5822e3559",
"libunwind.dll": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4"
}
}
@@ -1,458 +0,0 @@
{
"started_utc": "2026-09-11T12:42:56Z",
"checks": [
"preserve earlier evidence; no overwrite",
"all original ELF/tar/document/notice helpers unchanged outside product selection",
"windows actual full Studio document closure unchanged",
"linux actual full Studio document closure unchanged",
"only notice source delta is oa-cli allowed-root check; default/body unchanged",
"Linux entry/deployment unchanged: scripts/package-linux.ps1",
"Linux entry/deployment unchanged: deployment/Dockerfile",
"Linux entry/deployment unchanged: deployment/Dockerfile.dockerignore",
"PE reader extraction is byte-equivalent after function rename/EOL normalization",
"Windows system DLL allowlist unchanged",
"Studio explicitly retains both original binary inputs",
"Studio post-inspection packaging pipeline unchanged",
"assembly delta exactly nine packaging/script paths",
"reviewed main packaging sources equal frozen assembly bytes",
"fresh extraction directory",
"frozen ZIP size and hash",
"114 unique ZIP files",
"single safe normalized Windows ZIP root",
"ordinary fixed-time ZIP members and CRCs",
"complete clean extraction equals ZIP bytes",
"complete checksum inventory equals every other extracted file",
"all package inputs plus exactly six generated records",
"frozen CLI and runtime hashes",
"no unrelated executable payload",
"exact public document/example: LICENSE",
"exact public document/example: docs/api.rst",
"exact public document/example: docs/language.html",
"exact public document/example: docs/language.rst",
"exact public document/example: docs/source-cli.md",
"exact public document/example: examples/release1/expected-diagnostics.json",
"exact public document/example: examples/release1/model.json",
"exact public document/example: examples/release1/model.rs",
"exact public document/example: examples/release1/project.arcadia",
"exact public document/example: examples/release1/README.md",
"exact public document/example: examples/release1/traceability.arcadia",
"exact public document/example: examples/release1/transition-before.json",
"exact public document/example: examples/release1/transition-request.json",
"exact public document/example: examples/text-first/project.arcadia",
"exact public document/example: examples/text-first/README.md",
"exact public document/example: examples/release1/evidence/repair-check.md",
"exact public document/example: examples/release1/oa/capabilities.arcadia",
"exact public document/example: examples/release1/oa/model.arcadia",
"exact public document/example: examples/release1/oa/participants.arcadia",
"exact public document/example: examples/release1/oa/types.arcadia",
"exact public document/example: examples/release1/sa/capabilities.arcadia",
"exact public document/example: examples/release1/sa/model.arcadia",
"exact public document/example: examples/release1/sa/participants.arcadia",
"exact public document/example: examples/release1/sa/types.arcadia",
"exact public document/example: examples/release1/views/diagram_oa_allocation_view.arcadia",
"exact public document/example: examples/release1/views/diagram_sa_allocation_view.arcadia",
"exact public document/example: examples/release1/views/diagram_sa_capability_view.arcadia",
"exact public document/example: examples/release1/views/diagram_sa_service_view.arcadia",
"exact public document/example: examples/release1/views/diagram_sa_state_view.arcadia",
"exact public document/example: examples/release1/oa/activities/activity_oa_restore_work.arcadia",
"exact public document/example: examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia",
"exact public document/example: examples/release1/oa/behavior/process_oa_field_procedure.arcadia",
"exact public document/example: examples/release1/oa/behavior/process_oa_response.arcadia",
"exact public document/example: examples/release1/oa/behavior/scenario_oa_conversation.arcadia",
"exact public document/example: examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia",
"exact public document/example: examples/release1/oa/behavior/state_machine_oa_monitor.arcadia",
"exact public document/example: examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia",
"exact public document/example: examples/release1/sa/behavior/process_sa_field_procedure.arcadia",
"exact public document/example: examples/release1/sa/behavior/process_sa_response.arcadia",
"exact public document/example: examples/release1/sa/behavior/scenario_sa_conversation.arcadia",
"exact public document/example: examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia",
"exact public document/example: examples/release1/sa/behavior/state_machine_sa_monitor.arcadia",
"exact public document/example: examples/release1/sa/functions/function_sa_audit_thresholds.arcadia",
"exact public document/example: examples/release1/sa/functions/function_sa_restore_work.arcadia",
"CLI-specific README",
"27 dependency packages; only CLI root",
"original CLI Cargo lock identity",
"locked dependency: oa-cli",
"complete local crate inputs: oa-cli",
"locked dependency: oa-core",
"complete local crate inputs: oa-core",
"locked dependency: cfg-if",
"locked dependency: fastrand",
"locked dependency: getrandom",
"locked dependency: itoa",
"locked dependency: memchr",
"locked dependency: once_cell",
"locked dependency: proc-macro2",
"locked dependency: quote",
"locked dependency: rand_core",
"locked dependency: same-file",
"locked dependency: serde_core",
"locked dependency: serde_derive",
"locked dependency: serde_json",
"locked dependency: serde",
"locked dependency: sha1_smol",
"locked dependency: syn",
"locked dependency: tempfile",
"locked dependency: thiserror-impl",
"locked dependency: thiserror",
"locked dependency: unicode-ident",
"locked dependency: uuid",
"locked dependency: winapi-util",
"locked dependency: windows-link",
"locked dependency: windows-sys",
"locked dependency: zmij",
"all package/compiler/runtime notice references and bytes",
"runtime notice binds packaged DLL",
"all shared build input hashes",
"six original CLI manifest inputs",
"95 original core/shared build inputs",
"CLI expected exit: ['--version']",
"underlying CLI version",
"CLI expected exit: ['--help']",
"packaged help has command/preview contract",
"CLI expected exit: ['check', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/examples/text-first/project.arcadia'), '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"packaged example check: text-first/project.arcadia",
"CLI expected exit: ['check', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/examples/release1/project.arcadia'), '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"packaged example check: release1/project.arcadia",
"checks preserve complete copied examples byte-for-byte",
"CLI expected exit: ['stabilize', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/exact-source/project.arcadia'), '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"stabilization is preview by default",
"only missing-ID source changes; exact captured raw bytes",
"fresh ID is attached to literal intended activity",
"allocated identity differs from every preexisting identity",
"stabilization preserves every other character, CRLF, comment, name and reference",
"preview preserves all physical source bytes including detached file",
"CLI expected exit: ['stabilize', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/exact-source/project.arcadia'), '--write', '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"explicit stabilization writes",
"only missing-ID source changes; exact captured raw bytes",
"fresh ID is attached to literal intended activity",
"allocated identity differs from every preexisting identity",
"stabilization preserves every other character, CRLF, comment, name and reference",
"stabilized complete physical file inventory and bytes",
"CLI expected exit: ['rename-alias', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/exact-source/project.arcadia'), 'crew', 'rescue_team', '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"alias preview changes exact declaration and typed reference only",
"rename preview retains exact source bytes and identities",
"CLI expected exit: ['rename-alias', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/exact-source/project.arcadia'), 'crew', 'rescue_team', '--write', '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"explicit alias write matches full independent raw expected files",
"all four identities remain ordered and exact through rename",
"CLI expected exit: ['stabilize', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/exact-source/project.arcadia'), '--write', '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"explicit no-op reports unchanged",
"no-op preserves all file bytes and mtimes",
"CLI expected exit: ['stabilize', WindowsPath('C:/Users/User/Documents/Git/ARCADIA-Studio/.local/cli-packaging-review-20260911/runtime/invalid.arcadia'), '--write', '--json']",
"JSON invocation keeps diagnostic envelope on stdout",
"versioned JSON report agrees with process exit",
"invalid source write refuses with exact raw retention",
"all packaged files and frozen ZIP unchanged after runtime checks"
],
"source_review": {
"semantic_source": "01b76a1e89e93b7992f39e63560aa8b2ca2f69e0",
"assembly_source": "a0a48e82bd43be181caca1fe2c1514c21f2bc405",
"packaging_paths": {
"scripts/package-artifacts.py": "24515fdbf4eebfb47b82383c6b3ccf290261cbd919f7f46a586b6488af769c8d",
"scripts/package-cli-readme.md": "ea7bc971993e02751f24bc3cb313503a5f5fefd788540974e114398115c7c8e2",
"scripts/package-cli-windows.ps1": "b6ec59bb55ff1e5624c782f492ce1d169131e708f257dcca195957edf7341c1a",
"scripts/package-common.ps1": "d859453a8230b4f305d822c8742b371a71e35df698109a5d55c948f6dfaf0640",
"scripts/package-windows.ps1": "28997ff78565619ed9c9b185f66dc922808f1f0be17f522b430c6c415448663d",
"scripts/test-package-artifacts.py": "881718181a36fa5f7abfcd2e746bc1339446f9aeed6b2c039b8d2ce230ec202d",
"scripts/test-package-cli-windows.ps1": "2c18f91149ede5c7b677a165bd0d8b31f3c4691642cc10dd1007a7a77bde912a",
"scripts/test-windows-notices.ps1": "00a6ad1ed28fdb9044ceb7cc0714ceb7af095db2fb18f4828a053aa872a3147d",
"scripts/windows-notices.ps1": "a5328c05579e1b9ca09142ee99e87c12994d12764f7c69448e392883d718ef01"
},
"studio_document_counts": {
"windows": 65,
"linux": 64
}
},
"artifact": {
"zip_sha256": "2b051f8ce1ea4f59ee7e233e1fbd516d423aadbfbca5d549755cbe78fcde1af6",
"zip_bytes": 5091267,
"file_count": 114,
"files": {
"arcadia.exe": "bad169f8be78dcfa74b32714569c886dd2132727080684fc2ba618d5822e3559",
"dependency-notices.json": "d42920dc9958536d2d617bca17f453fc44b5e35f869b544c91abceb334cd51c1",
"documentation-check.json": "c660725a9b9076f51c4e735c077ec149e84d9ec2db1748a129209a36b5542130",
"libunwind.dll": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4",
"LICENSE": "51009f2cb07e5d19645858b2fbc037a672a25f8cbf7999522942b86807ecf365",
"package.json": "efe3e2227477a0f0db49ddb3a8d4ed3f48c65f9d060dd911bb3dd82e569fc446",
"README.md": "ea7bc971993e02751f24bc3cb313503a5f5fefd788540974e114398115c7c8e2",
"SHA256SUMS.txt": "b0b3d1c32dce6a0d5b1551e5b1c1cc9aa67d50ab2143a8645cde1dffdff6a4f9",
"START-HERE.txt": "58e0cb3c20dcb0e94d9acf7d47f390c32e47ed55f41e2d7be775e969be4a2626",
"THIRD-PARTY-NOTICES.txt": "8d1ffe4a7841bd8220cae95b1625e4c715d799c5dee1ba54274e9c95a3d8fb44",
"docs/api.rst": "ca7d310138c3b4d429d80a1d03d1ac8d4a9296069e205da573034256d10438a7",
"docs/language.html": "67dcfa3477b48a0b07298ec81741840cc3ccff12c7d58164873d746d41d611c8",
"docs/language.rst": "ac6b1d982c55f246de2f3c844b24b874599a3c20cfbd7ed22efe4561ac622b83",
"docs/source-cli.md": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051",
"licenses/llvm-mingw-LICENSE.TXT": "8d85c1057d742e597985c7d4e6320b015a9139385cff4cbae06ffc0ebe89afee",
"examples/release1/expected-diagnostics.json": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e",
"examples/release1/model.json": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727",
"examples/release1/model.rs": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5",
"examples/release1/project.arcadia": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda",
"examples/release1/README.md": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5",
"examples/release1/traceability.arcadia": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f",
"examples/release1/transition-before.json": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d",
"examples/release1/transition-request.json": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a",
"examples/text-first/project.arcadia": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a",
"examples/text-first/README.md": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e",
"examples/release1/evidence/repair-check.md": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5",
"examples/release1/oa/capabilities.arcadia": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936",
"examples/release1/oa/model.arcadia": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15",
"examples/release1/oa/participants.arcadia": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3",
"examples/release1/oa/types.arcadia": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49",
"examples/release1/sa/capabilities.arcadia": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f",
"examples/release1/sa/model.arcadia": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4",
"examples/release1/sa/participants.arcadia": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8",
"examples/release1/sa/types.arcadia": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660",
"examples/release1/views/diagram_oa_allocation_view.arcadia": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7",
"examples/release1/views/diagram_sa_allocation_view.arcadia": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389",
"examples/release1/views/diagram_sa_capability_view.arcadia": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649",
"examples/release1/views/diagram_sa_service_view.arcadia": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b",
"examples/release1/views/diagram_sa_state_view.arcadia": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869",
"examples/release1/oa/activities/activity_oa_restore_work.arcadia": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4",
"examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d",
"examples/release1/oa/behavior/process_oa_field_procedure.arcadia": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324",
"examples/release1/oa/behavior/process_oa_response.arcadia": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc",
"examples/release1/oa/behavior/scenario_oa_conversation.arcadia": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6",
"examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c",
"examples/release1/oa/behavior/state_machine_oa_monitor.arcadia": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5",
"examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088",
"examples/release1/sa/behavior/process_sa_field_procedure.arcadia": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768",
"examples/release1/sa/behavior/process_sa_response.arcadia": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a",
"examples/release1/sa/behavior/scenario_sa_conversation.arcadia": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85",
"examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74",
"examples/release1/sa/behavior/state_machine_sa_monitor.arcadia": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736",
"examples/release1/sa/functions/function_sa_audit_thresholds.arcadia": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f",
"examples/release1/sa/functions/function_sa_restore_work.arcadia": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6",
"licenses/llvm-libunwind/llvm-ea7d852a70e8-libunwind-LICENSE.TXT": "b5efebcaca80879234098e52d1725e6d9eb8fb96a19fce625d39184b705f7b6d",
"licenses/rust/COPYING.RUNTIME": "28e85c5aa4af9b4f1dfe6b4817aa3eefb3eaaee7fd735045016f29ccf50276a1",
"licenses/rust/COPYING3": "8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903",
"licenses/rust/COPYRIGHT-library.html": "68129500b616d5838629e68f55ff3aed5e096dacf60ce9eb41bbe599a563afa6",
"licenses/rust/COPYRIGHT.html": "5b0c93fc4e6d4b072eaa521b1762d1e746f4c368f65e81a0e5308e2772dac85e",
"licenses/dependencies/cfg-if-1.0.4/LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2",
"licenses/dependencies/cfg-if-1.0.4/LICENSE-MIT": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397",
"licenses/dependencies/fastrand-2.5.0/LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2",
"licenses/dependencies/fastrand-2.5.0/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/getrandom-0.4.3/LICENSE-APACHE": "aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf",
"licenses/dependencies/getrandom-0.4.3/LICENSE-MIT": "523a42c25d245dde9c015f882cec7f4555aad883382a6cf19b4b7d9b2cd5419b",
"licenses/dependencies/itoa-1.0.18/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/itoa-1.0.18/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/memchr-2.8.3/COPYING": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f",
"licenses/dependencies/memchr-2.8.3/LICENSE-MIT": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f",
"licenses/dependencies/memchr-2.8.3/UNLICENSE": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c",
"licenses/dependencies/oa-cli-0.2.0/workspace-LICENSE": "51009f2cb07e5d19645858b2fbc037a672a25f8cbf7999522942b86807ecf365",
"licenses/dependencies/oa-core-0.2.0/workspace-LICENSE": "51009f2cb07e5d19645858b2fbc037a672a25f8cbf7999522942b86807ecf365",
"licenses/dependencies/once_cell-1.21.4/LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2",
"licenses/dependencies/once_cell-1.21.4/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/proc-macro2-1.0.107/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/proc-macro2-1.0.107/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/quote-1.0.47/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/quote-1.0.47/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/rand_core-0.10.1/COPYRIGHT": "92b81db30f7ab6d693e0af5661a40d273ca1947e891123ed823924192c10cbc7",
"licenses/dependencies/rand_core-0.10.1/LICENSE-APACHE": "6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51",
"licenses/dependencies/rand_core-0.10.1/LICENSE-MIT": "8b6e9feec03e7c9a5facb26855cecd31662bf989b636bcfe79521bdf8ac863f0",
"licenses/dependencies/same-file-1.0.6/COPYING": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f",
"licenses/dependencies/same-file-1.0.6/LICENSE-MIT": "cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14",
"licenses/dependencies/same-file-1.0.6/UNLICENSE": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c",
"licenses/dependencies/serde-1.0.229/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/serde-1.0.229/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/serde_core-1.0.229/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/serde_core-1.0.229/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/serde_derive-1.0.229/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/serde_derive-1.0.229/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/serde_json-1.0.151/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/serde_json-1.0.151/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/sha1_smol-1.0.1/LICENSE": "282a21b0710441c364025461a447362daf18f5798a7b72ae2f801a2aa536da51",
"licenses/dependencies/syn-3.0.5/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/syn-3.0.5/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/tempfile-3.27.0/LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2",
"licenses/dependencies/tempfile-3.27.0/LICENSE-MIT": "8b427f5bc501764575e52ba4f9d95673cf8f6d80a86d0d06599852e1a9a20a36",
"licenses/dependencies/thiserror-2.0.20/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/thiserror-2.0.20/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/thiserror-impl-2.0.20/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/thiserror-impl-2.0.20/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/unicode-ident-1.0.24/LICENSE-APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
"licenses/dependencies/unicode-ident-1.0.24/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
"licenses/dependencies/unicode-ident-1.0.24/LICENSE-UNICODE": "f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1",
"licenses/dependencies/uuid-1.26.0/LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2",
"licenses/dependencies/uuid-1.26.0/LICENSE-MIT": "436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d",
"licenses/dependencies/winapi-util-0.1.11/COPYING": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f",
"licenses/dependencies/winapi-util-0.1.11/LICENSE-MIT": "cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14",
"licenses/dependencies/winapi-util-0.1.11/UNLICENSE": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c",
"licenses/dependencies/windows-link-0.2.1/license-apache-2.0": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b",
"licenses/dependencies/windows-link-0.2.1/license-mit": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383",
"licenses/dependencies/windows-sys-0.61.2/license-apache-2.0": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b",
"licenses/dependencies/windows-sys-0.61.2/license-mit": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383",
"licenses/dependencies/zmij-1.0.23/LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3"
},
"notice_packages": 27,
"notice_reference_files": 60,
"package_claims": {
"product": "Arcadia CLI",
"version": "0.2.0-preview.authoring.20260911",
"target": "x86_64-pc-windows-gnullvm",
"acceptance": "Packaging integrity only; clean-environment CLI verification required.",
"build": "Prebuilt input; source/compiler/profile assertions are recorded, not inferred.",
"build_evidence": {
"assertion": "Caller-supplied build evidence; target and binary hashes checked, source/compiler/profile statements not inferred or independently proven by packaging.",
"evidence": {
"source_identity": "CLI semantic/build-input basis 01b76a1e89e93b7992f39e63560aa8b2ca2f69e0. Six original CLI manifest/workspace/lock/source/test hashes and 95 unchanged core/shared build inputs independently matched. Packaging assembly basis a0a48e82bd43be181caca1fe2c1514c21f2bc405 changes packaging only and is not claimed as the original compiler input commit.",
"profile": "Preserved Windows debug/development artifact from cargo build --locked --offline -p oa-cli --bin arcadia, successful September11 2026 11:45:43.6035381Z,9.7336637seconds. No release-profile or reproducible-build claim.",
"compiler": "rustc1.98.1 commit48a229ceaefd4985c50990b14116b6d856af0985,x86_64-pc-windows-gnullvm,LLVM22.1.8. Frozen executable embeds that compiler path; current toolchain target-library hashes match preserved inventory. Original compile/test/lint and independent frozen-binary review records retained separately.",
"target": "x86_64-pc-windows-gnullvm",
"binary_sha256": {
"arcadia.exe": "bad169f8be78dcfa74b32714569c886dd2132727080684fc2ba618d5822e3559"
}
}
}
}
},
"environment": {
"SystemRoot": "C:\\Windows",
"WINDIR": "C:\\Windows",
"PATH": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\extracted\\ArcadiaCLI-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm;C:\\Windows\\System32;C:\\Windows",
"TEMP": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\temp",
"TMP": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\temp"
},
"invocations": [
{
"arguments": [
"--version"
],
"exit": 0,
"stdout_sha256": "0ebfaa91da207b98ef56f307b64a3f083359812b2655870f4a61459733d8590c",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"--help"
],
"exit": 0,
"stdout_sha256": "e41dd6452098023fd333c52cc210e5c2a7e08d20c377e0622deadb90d274f28f",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"check",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\examples\\text-first\\project.arcadia",
"--json"
],
"exit": 0,
"stdout_sha256": "64e6c3cb866801ec441a040406ce5111747fcb0c04a0cbfae3ab4fe0acac6fca",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"check",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\examples\\release1\\project.arcadia",
"--json"
],
"exit": 0,
"stdout_sha256": "0c29e2b2d297cfb06f0359ea1c6565997b1f396f442fc5684f12dbff8eca84bf",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"stabilize",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\exact-source\\project.arcadia",
"--json"
],
"exit": 0,
"stdout_sha256": "849cff20bd541febf6133a4206fd4dddab396857b361add78093cf01f55aeff4",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"stabilize",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\exact-source\\project.arcadia",
"--write",
"--json"
],
"exit": 0,
"stdout_sha256": "beec44418f383d205522b6784b0aba096466e41da3b0728eb8798991149e2143",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"rename-alias",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\exact-source\\project.arcadia",
"crew",
"rescue_team",
"--json"
],
"exit": 0,
"stdout_sha256": "1267c7a17e2701a2dd6b91cbaacdd0e52fdb8b031660d1f788542921aa5948bb",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"rename-alias",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\exact-source\\project.arcadia",
"crew",
"rescue_team",
"--write",
"--json"
],
"exit": 0,
"stdout_sha256": "0967d3dff03ebf5c5bfcfe716af8e369e23e0289885c02b83beeb4f92d5e008d",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"stabilize",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\exact-source\\project.arcadia",
"--write",
"--json"
],
"exit": 0,
"stdout_sha256": "b95dfd2d8effc49df2a7fe893cd414a5edad9c4686c5dada4faca72ef40360b7",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"arguments": [
"stabilize",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\cli-packaging-review-20260911\\runtime\\invalid.arcadia",
"--write",
"--json"
],
"exit": 1,
"stdout_sha256": "546ab1d5bb19dd8fa22dd6f017cc0e58b91602ccc24a048c41602b0dae45c70b",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
],
"runtime": {
"fixed_source_ids": [
"c073d2cf-83e5-4c98-8eaf-4a465ff0cf71",
"1987c990-e3cb-4f0e-9be9-fe61f007b997",
"9ba9e3cd-96f5-4f9a-865e-6b31ba94b4e6",
"ffcf7e41-f94b-4f7c-99c1-1a30a0b46959"
],
"allocated_activity_id": "9ba9e3cd-96f5-4f9a-865e-6b31ba94b4e6",
"final_source_sha256": {
"detached.arcadia": "ae79cfc57c5e227c281f1ad8493c1cdb483700fe0fe78ec8e448135afc98d239",
"project.arcadia": "1352c29a8cce5b5dbd7563b086680f889bdf35198f010d0083e99dd25e1007be",
"modules/oa.arcadia": "a781e165aaddeecb05fc9110873dd1e00e7a30687cef9cded11107ee2846c162"
},
"source_exact_expected": {
"detached.arcadia": "// known detached bytes remain\r\n",
"project.arcadia": "arcadia 7;\r\nproject review \"CLI package 救助\" id \"c073d2cf-83e5-4c98-8eaf-4a465ff0cf71\" {\r\n description \"Literal @crew remains\";\r\n include \"modules/oa.arcadia\";\r\n}\r\n",
"modules/oa.arcadia": "// @crew stays in this comment; Ω\r\noa_actor rescue_team \"Crew literal @crew\" id \"1987c990-e3cb-4f0e-9be9-fe61f007b997\" {}\r\noa_activity observe \"Observe Ω\" id \"9ba9e3cd-96f5-4f9a-865e-6b31ba94b4e6\" {}\r\nallocation responsibility \"Assigned @crew\" id \"ffcf7e41-f94b-4f7c-99c1-1a30a0b46959\" { source @rescue_team; target @observe; }\r\n"
},
"stabilization_note": "Separate preview UUID remains provisional; each result is checked by literal declaration role, not assumed equal across invocations."
},
"status": "PASS",
"finished_utc": "2026-09-11T12:43:12Z",
"script_sha256": "f85d1f34ab75b4067efe09886e447bf9fd54dc232020bcb1a46404ec57b2351e"
}
@@ -1,256 +0,0 @@
"""Independent CLI packaging review: read-only source checks and isolated CLI runs."""
from pathlib import Path, PurePosixPath
import ast
import hashlib
import json
import os
import re
import shutil
import stat
import subprocess
import sys
import time
import tomllib
import traceback
import uuid
import zipfile
OUT = Path(__file__).resolve().parent
ROOT = OUT.parents[1]
SOURCE = ROOT / '.local/cli-packaging-20260911/source'
NAME = 'ArcadiaCLI-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm'
ZIP = SOURCE.parent / 'packages' / (NAME + '.zip')
PACKAGE = OUT / 'extracted' / NAME
BASE = '01b76a1e89e93b7992f39e63560aa8b2ca2f69e0'
ASSEMBLY = 'a0a48e82bd43be181caca1fe2c1514c21f2bc405'
ZIP_SHA = '2b051f8ce1ea4f59ee7e233e1fbd516d423aadbfbca5d549755cbe78fcde1af6'
EXE_SHA = 'bad169f8be78dcfa74b32714569c886dd2132727080684fc2ba618d5822e3559'
DLL_SHA = 'f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4'
RESULT = {'started_utc': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()), 'checks': []}
def check(ok, label):
if not ok:
raise AssertionError(label)
RESULT['checks'].append(label)
def sha(b):
return hashlib.sha256(b).hexdigest()
def read_json(p):
return json.loads(p.read_text(encoding='utf-8-sig'))
def record(path, obj):
with path.open('x', encoding='utf-8', newline='\n') as f:
json.dump(obj, f, indent=2, ensure_ascii=False)
f.write('\n')
def snapshot(directory):
files = {}
for p in directory.rglob('*'):
if p.is_symlink() or getattr(p.lstat(), 'st_file_attributes', 0) & 0x400:
raise AssertionError('unexpected reparse path ' + str(p))
if p.is_file():
files[p.relative_to(directory).as_posix()] = p.read_bytes()
return files
def git(path, ref=BASE):
return subprocess.run(['git', 'show', ref + ':' + path], cwd=ROOT, check=True, capture_output=True).stdout
def source_checks():
old = git('scripts/package-artifacts.py').decode()
new = (ROOT / 'scripts/package-artifacts.py').read_text()
original_functions = {f.name: ast.dump(f, include_attributes=False) for f in ast.parse(old).body if isinstance(f, ast.FunctionDef)}
new_functions = {f.name: ast.dump(f, include_attributes=False) for f in ast.parse(new).body if isinstance(f, ast.FunctionDef)}
check(all(new_functions[k] == v for k, v in original_functions.items() if k not in ('document_inputs', 'main')), 'all original ELF/tar/document/notice helpers unchanged outside product selection')
before, after = {'__name__': 'review_baseline'}, {'__name__': 'review_current'}
exec(compile(old, '<baseline packaging>', 'exec'), before)
exec(compile(new, '<current packaging>', 'exec'), after)
counts = {}
for platform in ('windows', 'linux'):
expected = before['document_inputs'](SOURCE, platform)
default = after['document_inputs'](SOURCE, platform)
explicit = after['document_inputs'](SOURCE, platform, 'studio')
check(default == explicit == expected, platform + ' actual full Studio document closure unchanged')
counts[platform] = len(default['files'])
old_notice = git('scripts/windows-notices.ps1').decode().splitlines()
new_notice = (ROOT / 'scripts/windows-notices.ps1').read_text().splitlines()
check(len(old_notice) == len(new_notice) and [i for i, pair in enumerate(zip(old_notice, new_notice)) if pair[0] != pair[1]] == [3], 'only notice source delta is oa-cli allowed-root check; default/body unchanged')
for p in ('scripts/package-linux.ps1', 'deployment/Dockerfile', 'deployment/Dockerfile.dockerignore'):
check(git(p).decode().splitlines() == (ROOT / p).read_text().splitlines(), 'Linux entry/deployment unchanged: ' + p)
old_windows = git('scripts/package-windows.ps1').decode().replace('\r\n', '\n')
common = (ROOT / 'scripts/package-common.ps1').read_text()
reader_old = old_windows.split('function Read-PeImports', 1)[1].split('\n# Windows system components', 1)[0].strip()
reader_new = common.split('function Read-PackagePeImports', 1)[1].split('\nfunction Get-PackageWindowsInputs', 1)[0].strip()
check(reader_old == reader_new, 'PE reader extraction is byte-equivalent after function rename/EOL normalization')
old_allowlist = re.search(r'\$systemDlls = @\((.*?)\n\)', old_windows, re.S)[1]
new_allowlist = re.search(r'\$systemDlls = @\((.*?)\n \)', common, re.S)[1]
check(re.findall(r"'([^']+)'", old_allowlist) == re.findall(r"'([^']+)'", new_allowlist), 'Windows system DLL allowlist unchanged')
new_windows = (ROOT / 'scripts/package-windows.ps1').read_text()
check("Get-PackageWindowsInputs $BinaryDirectory $Target $LlvmMinGWRoot @('arcadia-studio.exe', 'arcadia-server.exe')" in new_windows, 'Studio explicitly retains both original binary inputs')
check(old_windows.split('$evidence = Read-PackageBuildEvidence', 1)[1].splitlines() == new_windows.split('$evidence = Read-PackageBuildEvidence', 1)[1].splitlines(), 'Studio post-inspection packaging pipeline unchanged')
delta = subprocess.run(['git', 'diff', '--name-only', BASE, ASSEMBLY], cwd=ROOT, capture_output=True, check=True).stdout.decode().splitlines()
check(len(delta) == 9 and all(p.startswith('scripts/') for p in delta), 'assembly delta exactly nine packaging/script paths')
check(all((ROOT / p).read_bytes() == (SOURCE / p).read_bytes() for p in delta), 'reviewed main packaging sources equal frozen assembly bytes')
RESULT['source_review'] = {'semantic_source': BASE, 'assembly_source': ASSEMBLY, 'packaging_paths': {p: sha((ROOT / p).read_bytes()) for p in delta}, 'studio_document_counts': counts}
def artifact():
check(not PACKAGE.parent.exists(), 'fresh extraction directory')
check(ZIP.stat().st_size == 5091267 and sha(ZIP.read_bytes()) == ZIP_SHA, 'frozen ZIP size and hash')
with zipfile.ZipFile(ZIP) as z:
names = z.namelist()
check(len(names) == 114 and len({n.casefold() for n in names}) == 114, '114 unique ZIP files')
check(all(n.startswith(NAME + '/') and PurePosixPath(n).as_posix() == n and '..' not in PurePosixPath(n).parts and '\\' not in n and ':' not in n and all(not p.endswith((' ', '.')) for p in PurePosixPath(n).parts) for n in names), 'single safe normalized Windows ZIP root')
check(all(not i.is_dir() and stat.S_IFMT(i.external_attr >> 16) in (0, stat.S_IFREG) and i.date_time == (2000, 1, 1, 0, 0, 0) for i in z.infolist()) and z.testzip() is None, 'ordinary fixed-time ZIP members and CRCs')
PACKAGE.parent.mkdir()
z.extractall(PACKAGE.parent)
archived = {n[len(NAME) + 1:]: z.read(n) for n in names}
actual = snapshot(PACKAGE)
check(actual == archived, 'complete clean extraction equals ZIP bytes')
hashes = {p: sha(b) for p, b in actual.items()}
lines = actual['SHA256SUMS.txt'].decode().splitlines()
sums = dict((line[66:], line[:64]) for line in lines)
check(len(sums) == len(lines) and sums == {p: h for p, h in hashes.items() if p != 'SHA256SUMS.txt'}, 'complete checksum inventory equals every other extracted file')
package = read_json(PACKAGE / 'package.json')
generated = {'SHA256SUMS.txt', 'START-HERE.txt', 'THIRD-PARTY-NOTICES.txt', 'dependency-notices.json', 'documentation-check.json', 'package.json'}
check(set(actual) - set(package['input_sha256']) == generated and all(hashes[p] == h for p, h in package['input_sha256'].items()), 'all package inputs plus exactly six generated records')
check(hashes['arcadia.exe'] == EXE_SHA and hashes['libunwind.dll'] == DLL_SHA, 'frozen CLI and runtime hashes')
check(not {'arcadia-studio.exe', 'arcadia-server.exe'} & set(actual), 'no unrelated executable payload')
for p in actual:
if p.startswith(('docs/', 'examples/')) or p == 'LICENSE':
check((SOURCE / p).read_bytes() == actual[p], 'exact public document/example: ' + p)
check(actual['README.md'] == (SOURCE / 'scripts/package-cli-readme.md').read_bytes(), 'CLI-specific README')
notice = read_json(PACKAGE / 'dependency-notices.json')
check(notice['root_packages'] == ['oa-cli'] and len(notice['packages']) == 27, '27 dependency packages; only CLI root')
check(notice['cargo_lock_sha256'] == sha((SOURCE / 'Cargo.lock').read_bytes()) == '2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510', 'original CLI Cargo lock identity')
lock = {(p['name'], p['version'], p.get('source')): p for p in tomllib.loads((SOURCE / 'Cargo.lock').read_text())['package']}
references = []
for p in notice['packages']:
check(lock[p['name'], p['version'], p['source']].get('checksum') == p['registry_checksum'], 'locked dependency: ' + p['name'])
references.extend(p['notices'])
for f in p['embedded_fonts']:
references.extend(f['notices'])
if p['source'] is None:
local = snapshot(SOURCE / 'crates' / p['name'])
local = {k: sha(v) for k, v in local.items() if 'target' not in PurePosixPath(k).parts and PurePosixPath(k).name != '.cargo-ok'}
check(local == p['local_source_sha256'], 'complete local crate inputs: ' + p['name'])
references += notice['rust']['notices'] + notice['runtime']['notices']
check(all(hashes[i['path']] == i['sha256'] for i in references), 'all package/compiler/runtime notice references and bytes')
check(notice['runtime']['sha256'] == DLL_SHA, 'runtime notice binds packaged DLL')
check(all(sha((SOURCE / p).read_bytes()) == h for p, h in notice['workspace_build_inputs_sha256'].items()), 'all shared build input hashes')
original = read_json(ROOT / '.local/source-cli-20260911/verified/manifest.json')
cli_inputs = [i for i in original['Artifacts'] if not i['Path'].startswith('.local/')]
check(len(cli_inputs) == 6 and all(sha((SOURCE / i['Path']).read_bytes()) == i['SHA256'].lower() for i in cli_inputs), 'six original CLI manifest inputs')
core_inputs = [i for i in read_json(ROOT / '.local/behavior-creation-20260911/gui-verified/manifest.json')['inputs'] if i['path'].startswith(('crates/oa-core/', 'build/'))]
check(len(core_inputs) == 95 and all(sha((SOURCE / i['path']).read_bytes()) == i['sha256'].lower() for i in core_inputs), '95 original core/shared build inputs')
RESULT['artifact'] = {'zip_sha256': ZIP_SHA, 'zip_bytes': ZIP.stat().st_size, 'file_count': len(actual), 'files': hashes, 'notice_packages': 27, 'notice_reference_files': len({i['path'] for i in references}), 'package_claims': {k: package[k] for k in ('product', 'version', 'target', 'acceptance', 'build', 'build_evidence')}}
return actual
def runtime(original_package):
run = OUT / 'runtime'
run.mkdir()
temp = run / 'temp'
temp.mkdir()
windows = Path(os.environ['SystemRoot'])
env = {'SystemRoot': str(windows), 'WINDIR': str(windows), 'PATH': ';'.join(map(str, (PACKAGE, windows / 'System32', windows))), 'TEMP': str(temp), 'TMP': str(temp)}
RESULT['environment'] = env
RESULT['invocations'] = []
def invoke(args, expect=0, report=True):
index = len(RESULT['invocations']) + 1
r = subprocess.run([str(PACKAGE / 'arcadia.exe'), *map(str, args)], cwd=run, env=env, capture_output=True, timeout=30, creationflags=subprocess.CREATE_NO_WINDOW)
(run / f'{index:02d}.stdout').write_bytes(r.stdout)
(run / f'{index:02d}.stderr').write_bytes(r.stderr)
RESULT['invocations'].append({'arguments': list(map(str, args)), 'exit': r.returncode, 'stdout_sha256': sha(r.stdout), 'stderr_sha256': sha(r.stderr)})
check(r.returncode == expect, 'CLI expected exit: ' + str(args))
if not report:
return r.stdout
check(not r.stderr, 'JSON invocation keeps diagnostic envelope on stdout')
value = json.loads(r.stdout)
check(value['format_version'] == 1 and value['exit_code'] == expect, 'versioned JSON report agrees with process exit')
return value
check(invoke(['--version'], report=False).decode().strip() == 'arcadia 0.2.0', 'underlying CLI version')
help_text = invoke(['--help'], report=False).decode()
check(all(word in help_text for word in ('check ROOT', 'stabilize ROOT', 'rename-alias ROOT OLD NEW', '--write', 'provisional')), 'packaged help has command/preview contract')
examples = run / 'examples'
shutil.copytree(PACKAGE / 'examples', examples)
before_examples = snapshot(examples)
for relative in ('text-first/project.arcadia', 'release1/project.arcadia'):
r = invoke(['check', examples / relative, '--json'])
check(r['status'] == 'checked' and not r['written'] and not r['changes'], 'packaged example check: ' + relative)
check(snapshot(examples) == before_examples, 'checks preserve complete copied examples byte-for-byte')
fixture = run / 'exact-source'
(fixture / 'modules').mkdir(parents=True)
entry = 'arcadia 7;\r\nproject review "CLI package 救助" id "c073d2cf-83e5-4c98-8eaf-4a465ff0cf71" {\r\n description "Literal @crew remains";\r\n include "modules/oa.arcadia";\r\n}\r\n'
module = '// @crew stays in this comment; Ω\r\noa_actor crew "Crew literal @crew" id "1987c990-e3cb-4f0e-9be9-fe61f007b997" {}\r\noa_activity observe "Observe Ω" {}\r\nallocation responsibility "Assigned @crew" id "ffcf7e41-f94b-4f7c-99c1-1a30a0b46959" { source @crew; target @observe; }\r\n'
(fixture / 'project.arcadia').write_bytes(entry.encode())
(fixture / 'modules/oa.arcadia').write_bytes(module.encode())
(fixture / 'detached.arcadia').write_bytes(b'// known detached bytes remain\r\n')
before = snapshot(fixture)
root = fixture / 'project.arcadia'
def stabilized(report):
check(len(report['changes']) == 1 and report['changes'][0]['path'] == 'modules/oa.arcadia' and report['changes'][0]['before'] == module, 'only missing-ID source changes; exact captured raw bytes')
text = report['changes'][0]['after']
match = re.search(r'oa_activity observe "Observe Ω" id "([0-9a-f-]{36})"', text)
check(match is not None, 'fresh ID is attached to literal intended activity')
identity = str(uuid.UUID(match[1]))
check(identity not in (entry + module), 'allocated identity differs from every preexisting identity')
expected = module.replace('oa_activity observe "Observe Ω" {}', f'oa_activity observe "Observe Ω" id "{identity}" {{}}')
check(text == expected, 'stabilization preserves every other character, CRLF, comment, name and reference')
return text, identity
preview = invoke(['stabilize', root, '--json'])
check(preview['status'] == 'preview' and not preview['written'] and preview['identities_to_stabilize'] == 1, 'stabilization is preview by default')
stabilized(preview)
check(snapshot(fixture) == before, 'preview preserves all physical source bytes including detached file')
written = invoke(['stabilize', root, '--write', '--json'])
check(written['status'] == 'written' and written['written'], 'explicit stabilization writes')
text, identity = stabilized(written)
stable_expected = dict(before, **{'modules/oa.arcadia': text.encode()})
check(snapshot(fixture) == stable_expected, 'stabilized complete physical file inventory and bytes')
renamed = text.replace('oa_actor crew ', 'oa_actor rescue_team ').replace('source @crew;', 'source @rescue_team;')
preview = invoke(['rename-alias', root, 'crew', 'rescue_team', '--json'])
check(not preview['written'] and preview['status'] == 'preview' and [(c['path'], c['before'], c['after']) for c in preview['changes']] == [('modules/oa.arcadia', text, renamed)], 'alias preview changes exact declaration and typed reference only')
check(snapshot(fixture) == stable_expected, 'rename preview retains exact source bytes and identities')
saved = invoke(['rename-alias', root, 'crew', 'rescue_team', '--write', '--json'])
renamed_expected = dict(before, **{'modules/oa.arcadia': renamed.encode()})
check(saved['written'] and snapshot(fixture) == renamed_expected, 'explicit alias write matches full independent raw expected files')
expected_ids = re.findall(r'\bid "([0-9a-f-]{36})"', entry + text)
check(re.findall(r'\bid "([0-9a-f-]{36})"', entry + renamed) == expected_ids and len(expected_ids) == 4, 'all four identities remain ordered and exact through rename')
timestamps = {p: (fixture / p).stat().st_mtime_ns for p in renamed_expected}
noop = invoke(['stabilize', root, '--write', '--json'])
check(noop['status'] == 'unchanged' and not noop['written'] and not noop['changes'] and noop['identities_to_stabilize'] == 0, 'explicit no-op reports unchanged')
check(snapshot(fixture) == renamed_expected and timestamps == {p: (fixture / p).stat().st_mtime_ns for p in renamed_expected}, 'no-op preserves all file bytes and mtimes')
invalid = run / 'invalid.arcadia'
invalid.write_bytes(b'arcadia 7;\r\nproject broken "Unclosed" {\r\n')
invalid_before = invalid.read_bytes()
refusal = invoke(['stabilize', invalid, '--write', '--json'], expect=1)
check(not refusal['written'] and invalid.read_bytes() == invalid_before, 'invalid source write refuses with exact raw retention')
check(snapshot(PACKAGE) == original_package and sha(ZIP.read_bytes()) == ZIP_SHA, 'all packaged files and frozen ZIP unchanged after runtime checks')
RESULT['runtime'] = {'fixed_source_ids': expected_ids, 'allocated_activity_id': identity, 'final_source_sha256': {p: sha(b) for p, b in renamed_expected.items()}, 'source_exact_expected': {p: b.decode() for p, b in renamed_expected.items()}, 'stabilization_note': 'Separate preview UUID remains provisional; each result is checked by literal declaration role, not assumed equal across invocations.'}
try:
check(not (OUT / 'result.json').exists(), 'preserve earlier evidence; no overwrite')
source_checks()
frozen = artifact()
runtime(frozen)
RESULT['status'] = 'PASS'
except Exception as error:
RESULT['status'] = 'FAIL'
RESULT['error'] = repr(error)
RESULT['traceback'] = traceback.format_exc()
RESULT['finished_utc'] = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
RESULT['script_sha256'] = sha(Path(__file__).read_bytes())
record(OUT / 'result.json', RESULT)
print(json.dumps({k: RESULT[k] for k in ('status', 'started_utc', 'finished_utc')}, indent=2))
print('checks:', len(RESULT['checks']), 'invocations:', len(RESULT.get('invocations', [])))
if RESULT['status'] == 'FAIL':
print(RESULT['traceback'])
sys.exit(1)
@@ -1 +0,0 @@
PASS: 15 CLI/Windows packaging assertions; inert fixture retained at C:\Temp\arcadia-cli-package-2a5110e4fc074b6f9db9bfa623db315c
@@ -1,47 +0,0 @@
# CLI prerelease publication records — 2026-09-11
These four files are exact byte copies from `.local/cli-packaging-20260911/`.
They contain sanitized publication results and release prose only. No credential,
configuration, authentication helper or upload script is included.
| File | Bytes | SHA256 |
| --- | ---: | --- |
| `upload-binaries-verified.json` | 678 | `e945e2724020c48bfe15be7b4258861bd6c01291b98eae036eca786bb022ebde` |
| `upload-validation-verified.json` | 277 | `73581acbb5b5fe4aca1fda1b626f80a28bcb3d6c036f7ce793c62bf5a8ef4a72` |
| `published-verified.json` | 382 | `b5fe8a38579fb8399c78bca9db9fd91b64e8b7b7de7c664049cf5e615a671100` |
| `RELEASE-NOTES.md` | 2010 | `86a1b5b0744c8f63f6ed640e14b23bdbcb34b63a25320d67eb1fa7da4128a0a5` |
All four originals use CRLF. `preserve.py` rereads source and destination bytes,
refuses any unequal existing destination, and records the inventory in
`manifest.json`. It does not upload or execute application binaries. Running it
again requires the original private source records and preserved MCP readbacks.
`mcp-release-readback.json` and `mcp-tag-readback.json` are locally serialized
parsed responses from fresh read-only Gitea MCP calls. They are observations,
not original HTTP wire bytes. Release 2 is published as a prerelease at
`cli-v0.2.0-preview.authoring.20260911`, pointing to integration commit
`27df4a3945ebc97cd7cbde61f6aeea7a91c680d3`.
The publisher's `notes_sha256` is
`1b83b9c904a79ff7acbde421851c9da9b520f3fa0aea920bf55fb71bea392a9d`.
It binds the **1988-byte UTF-8 LF public body**, not the raw CRLF Markdown file
above. Converting only CRLF to LF makes the preserved prose exactly equal to
the MCP public body, including its final newline. `preservation.log` records
the corrected successful check. `preservation-initial-failure.txt` discloses
the initial checker assumption and its correction; no publication changed.
The asset readback PASS fields are the original publisher's downloaded-asset
verification, preserved without re-downloading or repeating runtime checks.
The semantic source (`01b76a1`), packaging assembly (`a0a48e8`) and release
integration (`27df4a3`) remain distinct in `manifest.json` and the report.
Proposed repository attribute rule for root integration:
```gitattributes
harness/experiments/cli-prerelease-20260911/** -text
```
The preserving worker did not edit `.gitattributes` or Git state. Root must
apply the rule before adding these exact evidence bytes and verify index or
checkout hashes. The standalone report is
`harness/release-cli-prerelease-published-20260911.md`.
@@ -1,22 +0,0 @@
Standalone Windows x64 tools for `.arcadia` projects: `check`/`lint`, missing-ID stabilization and semantic alias rename. Editing commands preview by default; `--write` saves through the shared source conflict/recovery guards. Studio and a server are not required.
Extract the complete ArcadiaCLI ZIP, keep `libunwind.dll` beside `arcadia.exe`, and open a terminal in that folder:
```powershell
.\arcadia.exe --help
.\arcadia.exe check examples/text-first/project.arcadia
```
Copy a complete example folder before editing. Read `docs/source-cli.md` for command, diagnostic and exit-code contracts. Preview IDs remain provisional until saved; a later invocation can generate different missing IDs.
Verified: 12 source CLI tests, strict lint/format/build, independent 183 semantic assertions across 21 processes, all 114 packaged files and 27 dependency packages, plus independent source/default compatibility and 156 assertions across 10 clean extracted CLI invocations. Preview, exact stabilization/rename, preserved identities/comments/Unicode/CRLF, no-op timestamps and invalid-source refusal passed. ZIP, checksum and validation asset were downloaded and hash-verified after upload.
This is a development-profile Windows preview. It does not provide a saved-plan/digest protocol, complete large-model text ergonomics or current Linux runtime acceptance. It is separate from the [Studio preview](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.authoring.20260911). The full OA/SA release remains under development.
Release checkpoint: [27df4a3](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/commit/27df4a3945ebc97cd7cbde61f6aeea7a91c680d3). Preserved semantic build source is `01b76a1`; packaging-only assembly is `a0a48e8`. Attached `VALIDATION.md` records exact evidence and the distinct source/build roles.
ZIP size: **5,091,267 bytes**. SHA256:
```text
2B051F8CE1EA4F59EE7E233E1FBD516D423AADBFBCA5D549755CBE78FCDE1AF6
```
@@ -1,96 +0,0 @@
{
"scope": "Publication evidence preservation and read-only MCP release/tag comparison; no runtime tests or asset re-download.",
"release_id": 2,
"tag": "cli-v0.2.0-preview.authoring.20260911",
"publication_url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/cli-v0.2.0-preview.authoring.20260911",
"published_at": "2026-09-11T12:50:39Z",
"source_roles": {
"semantic_source": "01b76a1e89e93b7992f39e63560aa8b2ca2f69e0",
"packaging_assembly": "a0a48e82bd43be181caca1fe2c1514c21f2bc405",
"release_integration": "27df4a3945ebc97cd7cbde61f6aeea7a91c680d3"
},
"assets": [
{
"id": 4,
"name": "ArcadiaCLI-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm.zip",
"bytes": 5091267,
"sha256": "2b051f8ce1ea4f59ee7e233e1fbd516d423aadbfbca5d549755cbe78fcde1af6",
"url": "http://217.177.34.108:3000/attachments/024ac74c-8806-4da2-9ca4-726c01a7735f",
"readback": "PASS"
},
{
"id": 5,
"name": "ArcadiaCLI-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm.zip.sha256",
"bytes": 140,
"sha256": "0dc3f12d2f79edfb735e311298d1528cbdb828b775ec885b3badde24e66bceef",
"url": "http://217.177.34.108:3000/attachments/24af1b92-ce23-41e3-bc25-60fed95a6270",
"readback": "PASS"
},
{
"id": 6,
"name": "VALIDATION.md",
"bytes": 50297,
"sha256": "5a0206b493bf1ca98fe931243452a9092cdf2acf10f4e3fd0a7ee9a7d8f56ec8",
"url": "http://217.177.34.108:3000/attachments/628863de-e4ff-4fc7-afdb-45b071705d7b",
"readback": "PASS"
}
],
"files": [
{
"path": "upload-binaries-verified.json",
"source": ".local/cli-packaging-20260911/upload-binaries-verified.json",
"bytes": 678,
"sha256": "e945e2724020c48bfe15be7b4258861bd6c01291b98eae036eca786bb022ebde",
"crlf_sequences": 17,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "upload-validation-verified.json",
"source": ".local/cli-packaging-20260911/upload-validation-verified.json",
"bytes": 277,
"sha256": "73581acbb5b5fe4aca1fda1b626f80a28bcb3d6c036f7ce793c62bf5a8ef4a72",
"crlf_sequences": 9,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "published-verified.json",
"source": ".local/cli-packaging-20260911/published-verified.json",
"bytes": 382,
"sha256": "b5fe8a38579fb8399c78bca9db9fd91b64e8b7b7de7c664049cf5e615a671100",
"crlf_sequences": 9,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "RELEASE-NOTES.md",
"source": ".local/cli-packaging-20260911/RELEASE-NOTES.md",
"bytes": 2010,
"sha256": "86a1b5b0744c8f63f6ed640e14b23bdbcb34b63a25320d67eb1fa7da4128a0a5",
"crlf_sequences": 22,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "mcp-release-readback.json",
"bytes": 2495,
"sha256": "e0a1d9324cd7a115e22c87c7905489aec81d30277a17b4480866380cbec8edb1",
"method": "MCP read-only parsed response, locally serialized as UTF-8 JSON; not original HTTP wire bytes"
},
{
"path": "mcp-tag-readback.json",
"bytes": 196,
"sha256": "bb770f30f292b65ca4af28d688f0f1dc1d04fb918b10f527a56ba847d44e9b2e",
"method": "MCP read-only parsed response, locally serialized as UTF-8 JSON; not original HTTP wire bytes"
}
],
"checks": {
"four_exact_copies": true,
"release_and_tag_match": true,
"published_flags_and_time_match": true,
"normalized_notes_hash_matches_publisher_record": true,
"notes_match_public_body_after_CRLF_to_LF_only": true,
"asset_records_are_original_publisher_readbacks": true
}
}
@@ -1,13 +0,0 @@
{
"author": "Codex-9e8r6t",
"body": "Standalone Windows x64 tools for `.arcadia` projects: `check`/`lint`, missing-ID stabilization and semantic alias rename. Editing commands preview by default; `--write` saves through the shared source conflict/recovery guards. Studio and a server are not required.\n\nExtract the complete ArcadiaCLI ZIP, keep `libunwind.dll` beside `arcadia.exe`, and open a terminal in that folder:\n\n```powershell\n.\\arcadia.exe --help\n.\\arcadia.exe check examples/text-first/project.arcadia\n```\n\nCopy a complete example folder before editing. Read `docs/source-cli.md` for command, diagnostic and exit-code contracts. Preview IDs remain provisional until saved; a later invocation can generate different missing IDs.\n\nVerified: 12 source CLI tests, strict lint/format/build, independent 183 semantic assertions across 21 processes, all 114 packaged files and 27 dependency packages, plus independent source/default compatibility and 156 assertions across 10 clean extracted CLI invocations. Preview, exact stabilization/rename, preserved identities/comments/Unicode/CRLF, no-op timestamps and invalid-source refusal passed. ZIP, checksum and validation asset were downloaded and hash-verified after upload.\n\nThis is a development-profile Windows preview. It does not provide a saved-plan/digest protocol, complete large-model text ergonomics or current Linux runtime acceptance. It is separate from the [Studio preview](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.authoring.20260911). The full OA/SA release remains under development.\n\nRelease checkpoint: [27df4a3](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/commit/27df4a3945ebc97cd7cbde61f6aeea7a91c680d3). Preserved semantic build source is `01b76a1`; packaging-only assembly is `a0a48e8`. Attached `VALIDATION.md` records exact evidence and the distinct source/build roles.\n\nZIP size: **5,091,267 bytes**. SHA256:\n\n```text\n2B051F8CE1EA4F59EE7E233E1FBD516D423AADBFBCA5D549755CBE78FCDE1AF6\n```\n",
"created_at": "2026-09-11T12:50:39Z",
"draft": false,
"html_url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/cli-v0.2.0-preview.authoring.20260911",
"id": 2,
"prerelease": true,
"published_at": "2026-09-11T12:50:39Z",
"tag_name": "cli-v0.2.0-preview.authoring.20260911",
"target": "27df4a3945ebc97cd7cbde61f6aeea7a91c680d3",
"title": "Arcadia CLI — standalone Windows authoring preview"
}
@@ -1,5 +0,0 @@
{
"commit_sha": "27df4a3945ebc97cd7cbde61f6aeea7a91c680d3",
"message": "Package standalone source CLI with verified runtime and notices\n",
"name": "cli-v0.2.0-preview.authoring.20260911"
}
@@ -1,16 +0,0 @@
Initial preservation checker stopped after copying the four files unchanged:
Traceback (most recent call last):
File "C:\Users\User\Documents\Git\ARCADIA-Studio\harness\experiments\cli-prerelease-20260911\preserve.py", line 35, in <module>
assert hashlib.sha256(notes).hexdigest() == publication['notes_sha256']
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
The checker incorrectly assumed notes_sha256 meant local raw Markdown bytes.
Read-only comparison established that it instead exactly matches the LF public
release body. Local CRLF bytes remain preserved unchanged; CRLF-to-LF conversion
alone yields the public body and the publisher's recorded hash. The corrected
checker records both identities, without changing any publication asset or the
four source records. A subsequent temporary PowerShell comparison command had
an empty-pipeline parse error and was corrected before producing the comparison;
it made no file changes.
@@ -1,42 +0,0 @@
{
"result": "PASS",
"copied_files": [
{
"path": "upload-binaries-verified.json",
"source": ".local/cli-packaging-20260911/upload-binaries-verified.json",
"bytes": 678,
"sha256": "e945e2724020c48bfe15be7b4258861bd6c01291b98eae036eca786bb022ebde",
"crlf_sequences": 17,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "upload-validation-verified.json",
"source": ".local/cli-packaging-20260911/upload-validation-verified.json",
"bytes": 277,
"sha256": "73581acbb5b5fe4aca1fda1b626f80a28bcb3d6c036f7ce793c62bf5a8ef4a72",
"crlf_sequences": 9,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "published-verified.json",
"source": ".local/cli-packaging-20260911/published-verified.json",
"bytes": 382,
"sha256": "b5fe8a38579fb8399c78bca9db9fd91b64e8b7b7de7c664049cf5e615a671100",
"crlf_sequences": 9,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
},
{
"path": "RELEASE-NOTES.md",
"source": ".local/cli-packaging-20260911/RELEASE-NOTES.md",
"bytes": 2010,
"sha256": "86a1b5b0744c8f63f6ed640e14b23bdbcb34b63a25320d67eb1fa7da4128a0a5",
"crlf_sequences": 22,
"bare_lf_sequences": 0,
"method": "exact byte copy; source and destination reread equal"
}
],
"release_target": "27df4a3945ebc97cd7cbde61f6aeea7a91c680d3"
}
@@ -1,62 +0,0 @@
"""Preserve four sanitized publication records; never read credentials or upload."""
import hashlib
import json
from pathlib import Path
destination = Path(__file__).resolve().parent
repository = destination.parents[2]
source = repository / '.local/cli-packaging-20260911'
names = ['upload-binaries-verified.json', 'upload-validation-verified.json',
'published-verified.json', 'RELEASE-NOTES.md']
records = []
for name in names:
data = (source / name).read_bytes()
target = destination / name
if not target.exists():
with target.open('xb') as output:
output.write(data)
assert target.read_bytes() == data
records.append({'path': name, 'source': '.local/cli-packaging-20260911/' + name,
'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest(),
'crlf_sequences': data.count(b'\r\n'),
'bare_lf_sequences': data.count(b'\n') - data.count(b'\r\n'),
'method': 'exact byte copy; source and destination reread equal'})
def read(name):
return json.loads((destination / name).read_text(encoding='utf-8-sig'))
publication = read('published-verified.json')
release = read('mcp-release-readback.json')
tag = read('mcp-tag-readback.json')
assert publication['id'] == release['id'] == 2
assert publication['tag'] == release['tag_name'] == tag['name'] == 'cli-v0.2.0-preview.authoring.20260911'
assert publication['draft'] is release['draft'] is False
assert publication['prerelease'] is release['prerelease'] is True
assert release['target'] == tag['commit_sha'] == '27df4a3945ebc97cd7cbde61f6aeea7a91c680d3'
assert publication['published_at'] == release['published_at'] == '2026-09-11T12:50:39Z'
notes = (destination / 'RELEASE-NOTES.md').read_bytes()
# The publisher's recorded hash binds the LF public body, not the local CRLF
# file. Keep both exact identities and prove the sole normalization explicitly.
normalized_notes = notes.decode('utf-8-sig').replace('\r\n', '\n')
assert hashlib.sha256(normalized_notes.encode('utf-8')).hexdigest() == publication['notes_sha256']
assert normalized_notes == release['body']
assets = read('upload-binaries-verified.json') + read('upload-validation-verified.json')
assert len(assets) == publication['asset_count'] == 3
assert all(item['readback'] == 'PASS' for item in assets)
assert assets[0]['sha256'] == '2b051f8ce1ea4f59ee7e233e1fbd516d423aadbfbca5d549755cbe78fcde1af6'
assert assets[0]['bytes'] == 5091267
for name in ['mcp-release-readback.json', 'mcp-tag-readback.json']:
data = (destination / name).read_bytes()
records.append({'path': name, 'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest(),
'method': 'MCP read-only parsed response, locally serialized as UTF-8 JSON; not original HTTP wire bytes'})
result = {'scope': 'Publication evidence preservation and read-only MCP release/tag comparison; no runtime tests or asset re-download.',
'release_id': 2, 'tag': tag['name'], 'publication_url': release['html_url'],
'published_at': release['published_at'], 'source_roles': {
'semantic_source': '01b76a1e89e93b7992f39e63560aa8b2ca2f69e0',
'packaging_assembly': 'a0a48e82bd43be181caca1fe2c1514c21f2bc405',
'release_integration': release['target']},
'assets': assets, 'files': records,
'checks': {'four_exact_copies': True, 'release_and_tag_match': True,
'published_flags_and_time_match': True, 'normalized_notes_hash_matches_publisher_record': True,
'notes_match_public_body_after_CRLF_to_LF_only': True,
'asset_records_are_original_publisher_readbacks': True}}
(destination / 'manifest.json').write_text(json.dumps(result, indent=2) + '\n', encoding='utf-8', newline='\n')
print(json.dumps({'result': 'PASS', 'copied_files': records[:4], 'release_target': release['target']}, indent=2))
@@ -1,10 +0,0 @@
{
"id": 2,
"tag": "cli-v0.2.0-preview.authoring.20260911",
"url": "http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/cli-v0.2.0-preview.authoring.20260911",
"draft": false,
"prerelease": true,
"asset_count": 3,
"notes_sha256": "1b83b9c904a79ff7acbde421851c9da9b520f3fa0aea920bf55fb71bea392a9d",
"published_at": "2026-09-11T12:50:39Z"
}
@@ -1,18 +0,0 @@
[
{
"id": 4,
"name": "ArcadiaCLI-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm.zip",
"bytes": 5091267,
"sha256": "2b051f8ce1ea4f59ee7e233e1fbd516d423aadbfbca5d549755cbe78fcde1af6",
"url": "http://217.177.34.108:3000/attachments/024ac74c-8806-4da2-9ca4-726c01a7735f",
"readback": "PASS"
},
{
"id": 5,
"name": "ArcadiaCLI-0.2.0-preview.authoring.20260911-x86_64-pc-windows-gnullvm.zip.sha256",
"bytes": 140,
"sha256": "0dc3f12d2f79edfb735e311298d1528cbdb828b775ec885b3badde24e66bceef",
"url": "http://217.177.34.108:3000/attachments/24af1b92-ce23-41e3-bc25-60fed95a6270",
"readback": "PASS"
}
]
@@ -1,10 +0,0 @@
[
{
"id": 6,
"name": "VALIDATION.md",
"bytes": 50297,
"sha256": "5a0206b493bf1ca98fe931243452a9092cdf2acf10f4e3fd0a7ee9a7d8f56ec8",
"url": "http://217.177.34.108:3000/attachments/628863de-e4ff-4fc7-afdb-45b071705d7b",
"readback": "PASS"
}
]
@@ -0,0 +1,9 @@
# Contextual/lifecycle integration checkpoint evidence — 2026-09-11
Codex-ytr83r /root/wsl_startup_review. Closed archival readback only: **11 payloads, 137778 bytes**, frozen at 2026-09-11T17:38:52.1137417Z. Original names/extensions and file bytes are preserved under their paths relative to .local. manifest.json records the exact inventory, original/copy SHA256, sizes and original modification times; readback.json records an independent second read of every original and destination. No discrepancy was found.
The seven gate payloads preserve the server/CLI all-targets exit 0 at 17:28:56.5857591 UTC (68 passed across seven targets), the initial semantic-schema exit 1 caused by missing jsonschema, its task-local installation log, and the successful repeated semantic-schema exit 0 at 17:28:34.201 UTC (72 fixtures; all 204 component schemas well formed). The failed attempt remains explicit evidence. The schema status records identify source 4da92ab481a2f5f9fcd88f29c90fa4785ac17c3a; the server/CLI record retains its own actual command/timestamps without inventing an absent commit field.
The other four payloads are the two-file wide-after-passive-save checkpoint (project.arcadia and rationale.arcadia), its same-oracle log, and wide-cjk-sa-resumed-min-125-saved.jpg. Root reports recovering the intended Studio, clicking Save all, and completing the snapshot/oracle comparison; the archived log says all identities, fields, reachable source and physical bytes match. This is the **old 47332A6E… / production 29084050 typography-wide passive-save check**, not corrected header pixels or new combined-desktop acceptance. The earlier 12-screenshot pre-correction archive remains separate and untouched.
This worker performed no native/oracle/compiler/schema/install execution, source edit, Git/index operation or WSL action. The installation log records root's already-completed work; archiving it did not install anything. No executable, DLL, private profile, growing log or Linux input is included. Root owns attributes, staging, integrated interpretation and the authoritative [issue 5](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/5) record.
@@ -0,0 +1,692 @@
arcadia 7;
project lifecycle_native "Lifecycle native contract" id "5ceab400-0000-4000-8000-000000000001" {
include "rationale.arcadia";
description "Fixed semantic inputs; lifecycle geometry is derived and never authored.";
oa_activity life_oa_10 "OA Controller work" id "5ceab400-0000-4000-8000-0000000003f2" {
description "";
parent none;
}
oa_activity life_oa_11 "OA Receiver work" id "5ceab400-0000-4000-8000-0000000003f3" {
description "";
parent none;
}
oa_scenario life_oa_100 "OA 01 Root create action delete" id "5ceab400-0000-4000-8000-00000000044c" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_oa_110, @life_oa_111, @life_oa_112];
viewpoint OperationalActivity;
}
oa_lifeline life_oa_101 "OA Controller lane" id "5ceab400-0000-4000-8000-00000000044d" {
description "";
parent @life_oa_100;
represented @life_oa_10;
}
oa_lifeline life_oa_102 "WWWWWWWWWWWWWWWWWW" id "5ceab400-0000-4000-8000-00000000044e" {
description "";
parent @life_oa_100;
represented @life_oa_11;
}
oa_occurrence life_oa_110 "OA Create receiver" id "5ceab400-0000-4000-8000-000000000456" {
body {
Exchange {
exchange @life_oa_service;
message_kind Create;
receiver @life_oa_102;
reply_to none;
sender @life_oa_101;
values [];
};
};
description "";
parent @life_oa_100;
postcondition "";
precondition "";
}
oa_occurrence life_oa_111 "OA Receiver action" id "5ceab400-0000-4000-8000-000000000457" {
body {
Action {
action @life_oa_11;
lifeline @life_oa_102;
};
};
description "";
parent @life_oa_100;
postcondition "";
precondition "";
}
oa_occurrence life_oa_112 "OA Delete receiver" id "5ceab400-0000-4000-8000-000000000458" {
body {
Exchange {
exchange @life_oa_service;
message_kind Delete;
receiver @life_oa_102;
reply_to none;
sender @life_oa_101;
values [];
};
};
description "";
parent @life_oa_100;
postcondition "";
precondition "";
}
oa_scenario life_oa_200 "OA 02 Preexisting empty" id "5ceab400-0000-4000-8000-0000000004b0" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [];
viewpoint OperationalActivity;
}
oa_lifeline life_oa_201 "OA Controller lane" id "5ceab400-0000-4000-8000-0000000004b1" {
description "";
parent @life_oa_200;
represented @life_oa_10;
}
oa_lifeline life_oa_202 "OA Receiver lane" id "5ceab400-0000-4000-8000-0000000004b2" {
description "";
parent @life_oa_200;
represented @life_oa_11;
}
oa_scenario life_oa_300 "OA 03 Create only" id "5ceab400-0000-4000-8000-000000000514" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_oa_310];
viewpoint OperationalActivity;
}
oa_lifeline life_oa_301 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000515" {
description "";
parent @life_oa_300;
represented @life_oa_10;
}
oa_lifeline life_oa_302 "OA Receiver lane" id "5ceab400-0000-4000-8000-000000000516" {
description "";
parent @life_oa_300;
represented @life_oa_11;
}
oa_occurrence life_oa_310 "OA Create only receiver" id "5ceab400-0000-4000-8000-00000000051e" {
body {
Exchange {
exchange @life_oa_service;
message_kind Create;
receiver @life_oa_302;
reply_to none;
sender @life_oa_301;
values [];
};
};
description "";
parent @life_oa_300;
postcondition "";
precondition "";
}
oa_scenario life_oa_400 "OA 04 Conditional delete" id "5ceab400-0000-4000-8000-000000000578" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_oa_410, @life_oa_411];
viewpoint OperationalActivity;
}
oa_lifeline life_oa_401 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000579" {
description "";
parent @life_oa_400;
represented @life_oa_10;
}
oa_lifeline life_oa_402 "OA Receiver lane" id "5ceab400-0000-4000-8000-00000000057a" {
description "";
parent @life_oa_400;
represented @life_oa_11;
}
oa_occurrence life_oa_410 "OA Open call" id "5ceab400-0000-4000-8000-000000000582" {
body {
Exchange {
exchange @life_oa_service;
message_kind Call;
receiver @life_oa_402;
reply_to none;
sender @life_oa_401;
values [];
};
};
description "";
parent @life_oa_400;
postcondition "";
precondition "";
}
oa_occurrence life_oa_411 "OA ALT delete or keep" id "5ceab400-0000-4000-8000-000000000583" {
body {
Fragment {
branches [@life_oa_412, @life_oa_413];
operator Alternative;
};
};
description "";
parent @life_oa_400;
postcondition "";
precondition "";
}
oa_occurrence life_oa_412 "OA Left delete operand" id "5ceab400-0000-4000-8000-000000000584" {
body {
Branch {
guard "stop_requested";
occurrences [@life_oa_414];
};
};
description "";
parent @life_oa_411;
postcondition "";
precondition "";
}
oa_occurrence life_oa_413 "OA Right empty operand" id "5ceab400-0000-4000-8000-000000000585" {
body {
Branch {
guard "else";
occurrences [];
};
};
description "";
parent @life_oa_411;
postcondition "";
precondition "";
}
oa_occurrence life_oa_414 "OA Conditional delete receiver" id "5ceab400-0000-4000-8000-000000000586" {
body {
Exchange {
exchange @life_oa_service;
message_kind Delete;
receiver @life_oa_402;
reply_to none;
sender @life_oa_401;
values [];
};
};
description "";
parent @life_oa_412;
postcondition "";
precondition "";
}
oa_scenario life_oa_500 "OA 05 Unassigned receiver" id "5ceab400-0000-4000-8000-0000000005dc" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_oa_510, @life_oa_511];
viewpoint OperationalActivity;
}
oa_lifeline life_oa_501 "OA Controller lane" id "5ceab400-0000-4000-8000-0000000005dd" {
description "";
parent @life_oa_500;
represented @life_oa_10;
}
oa_lifeline life_oa_502 "OA Unassigned receiver lane" id "5ceab400-0000-4000-8000-0000000005de" {
description "";
parent @life_oa_500;
represented none;
}
oa_occurrence life_oa_510 "OA Create unassigned receiver" id "5ceab400-0000-4000-8000-0000000005e6" {
body {
Exchange {
exchange none;
message_kind Create;
receiver @life_oa_502;
reply_to none;
sender @life_oa_501;
values [];
};
};
description "";
parent @life_oa_500;
postcondition "";
precondition "";
}
oa_occurrence life_oa_511 "OA Delete unassigned receiver" id "5ceab400-0000-4000-8000-0000000005e7" {
body {
Exchange {
exchange none;
message_kind Delete;
receiver @life_oa_502;
reply_to none;
sender @life_oa_501;
values [];
};
};
description "";
parent @life_oa_500;
postcondition "";
precondition "";
}
oa_scenario life_oa_600 "OA 06 Self delete" id "5ceab400-0000-4000-8000-000000000640" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_oa_610];
viewpoint OperationalActivity;
}
oa_lifeline life_oa_601 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000641" {
description "";
parent @life_oa_600;
represented @life_oa_10;
}
oa_occurrence life_oa_610 "OA Self delete controller" id "5ceab400-0000-4000-8000-00000000064a" {
body {
Exchange {
exchange none;
message_kind Delete;
receiver @life_oa_601;
reply_to none;
sender @life_oa_601;
values [];
};
};
description "";
parent @life_oa_600;
postcondition "";
precondition "";
}
sa_function life_sa_10 "SA Controller work" id "5ceab400-0000-4000-8000-0000000007da" {
description "";
parent none;
}
sa_function life_sa_11 "SA Receiver work" id "5ceab400-0000-4000-8000-0000000007db" {
description "";
parent none;
}
sa_scenario life_sa_100 "SA 01 Root create action delete" id "5ceab400-0000-4000-8000-000000000834" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_sa_110, @life_sa_111, @life_sa_112];
viewpoint Functional;
}
sa_lifeline life_sa_101 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000835" {
description "";
parent @life_sa_100;
represented @life_sa_10;
}
sa_lifeline life_sa_102 "界界界界界界界界界界界界界界界界界界" id "5ceab400-0000-4000-8000-000000000836" {
description "";
parent @life_sa_100;
represented @life_sa_11;
}
sa_occurrence life_sa_110 "SA Create receiver" id "5ceab400-0000-4000-8000-00000000083e" {
body {
Exchange {
exchange @life_sa_service;
message_kind Create;
receiver @life_sa_102;
reply_to none;
sender @life_sa_101;
values [];
};
};
description "";
parent @life_sa_100;
postcondition "";
precondition "";
}
sa_occurrence life_sa_111 "SA Receiver action" id "5ceab400-0000-4000-8000-00000000083f" {
body {
Action {
action @life_sa_11;
lifeline @life_sa_102;
};
};
description "";
parent @life_sa_100;
postcondition "";
precondition "";
}
sa_occurrence life_sa_112 "SA Delete receiver" id "5ceab400-0000-4000-8000-000000000840" {
body {
Exchange {
exchange @life_sa_service;
message_kind Delete;
receiver @life_sa_102;
reply_to none;
sender @life_sa_101;
values [];
};
};
description "";
parent @life_sa_100;
postcondition "";
precondition "";
}
sa_scenario life_sa_200 "SA 02 Preexisting empty" id "5ceab400-0000-4000-8000-000000000898" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [];
viewpoint Functional;
}
sa_lifeline life_sa_201 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000899" {
description "";
parent @life_sa_200;
represented @life_sa_10;
}
sa_lifeline life_sa_202 "SA Receiver lane" id "5ceab400-0000-4000-8000-00000000089a" {
description "";
parent @life_sa_200;
represented @life_sa_11;
}
sa_scenario life_sa_300 "SA 03 Create only" id "5ceab400-0000-4000-8000-0000000008fc" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_sa_310];
viewpoint Functional;
}
sa_lifeline life_sa_301 "SA Controller lane" id "5ceab400-0000-4000-8000-0000000008fd" {
description "";
parent @life_sa_300;
represented @life_sa_10;
}
sa_lifeline life_sa_302 "SA Receiver lane" id "5ceab400-0000-4000-8000-0000000008fe" {
description "";
parent @life_sa_300;
represented @life_sa_11;
}
sa_occurrence life_sa_310 "SA Create only receiver" id "5ceab400-0000-4000-8000-000000000906" {
body {
Exchange {
exchange @life_sa_service;
message_kind Create;
receiver @life_sa_302;
reply_to none;
sender @life_sa_301;
values [];
};
};
description "";
parent @life_sa_300;
postcondition "";
precondition "";
}
sa_scenario life_sa_400 "SA 04 Conditional delete" id "5ceab400-0000-4000-8000-000000000960" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_sa_410, @life_sa_411];
viewpoint Functional;
}
sa_lifeline life_sa_401 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000961" {
description "";
parent @life_sa_400;
represented @life_sa_10;
}
sa_lifeline life_sa_402 "SA Receiver lane" id "5ceab400-0000-4000-8000-000000000962" {
description "";
parent @life_sa_400;
represented @life_sa_11;
}
sa_occurrence life_sa_410 "SA Open call" id "5ceab400-0000-4000-8000-00000000096a" {
body {
Exchange {
exchange @life_sa_service;
message_kind Call;
receiver @life_sa_402;
reply_to none;
sender @life_sa_401;
values [];
};
};
description "";
parent @life_sa_400;
postcondition "";
precondition "";
}
sa_occurrence life_sa_411 "SA ALT delete or keep" id "5ceab400-0000-4000-8000-00000000096b" {
body {
Fragment {
branches [@life_sa_412, @life_sa_413];
operator Alternative;
};
};
description "";
parent @life_sa_400;
postcondition "";
precondition "";
}
sa_occurrence life_sa_412 "SA Left delete operand" id "5ceab400-0000-4000-8000-00000000096c" {
body {
Branch {
guard "stop_requested";
occurrences [@life_sa_414];
};
};
description "";
parent @life_sa_411;
postcondition "";
precondition "";
}
sa_occurrence life_sa_413 "SA Right empty operand" id "5ceab400-0000-4000-8000-00000000096d" {
body {
Branch {
guard "else";
occurrences [];
};
};
description "";
parent @life_sa_411;
postcondition "";
precondition "";
}
sa_occurrence life_sa_414 "SA Conditional delete receiver" id "5ceab400-0000-4000-8000-00000000096e" {
body {
Exchange {
exchange @life_sa_service;
message_kind Delete;
receiver @life_sa_402;
reply_to none;
sender @life_sa_401;
values [];
};
};
description "";
parent @life_sa_412;
postcondition "";
precondition "";
}
sa_scenario life_sa_500 "SA 05 Unassigned receiver" id "5ceab400-0000-4000-8000-0000000009c4" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_sa_510, @life_sa_511];
viewpoint Functional;
}
sa_lifeline life_sa_501 "SA Controller lane" id "5ceab400-0000-4000-8000-0000000009c5" {
description "";
parent @life_sa_500;
represented @life_sa_10;
}
sa_lifeline life_sa_502 "SA Unassigned receiver lane" id "5ceab400-0000-4000-8000-0000000009c6" {
description "";
parent @life_sa_500;
represented none;
}
sa_occurrence life_sa_510 "SA Create unassigned receiver" id "5ceab400-0000-4000-8000-0000000009ce" {
body {
Exchange {
exchange none;
message_kind Create;
receiver @life_sa_502;
reply_to none;
sender @life_sa_501;
values [];
};
};
description "";
parent @life_sa_500;
postcondition "";
precondition "";
}
sa_occurrence life_sa_511 "SA Delete unassigned receiver" id "5ceab400-0000-4000-8000-0000000009cf" {
body {
Exchange {
exchange none;
message_kind Delete;
receiver @life_sa_502;
reply_to none;
sender @life_sa_501;
values [];
};
};
description "";
parent @life_sa_500;
postcondition "";
precondition "";
}
sa_scenario life_sa_600 "SA 06 Self delete" id "5ceab400-0000-4000-8000-000000000a28" {
context none;
description "";
parent none;
postcondition "";
precondition "";
steps [@life_sa_610];
viewpoint Functional;
}
sa_lifeline life_sa_601 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000a29" {
description "";
parent @life_sa_600;
represented @life_sa_10;
}
sa_occurrence life_sa_610 "SA Self delete controller" id "5ceab400-0000-4000-8000-000000000a32" {
body {
Exchange {
exchange none;
message_kind Delete;
receiver @life_sa_601;
reply_to none;
sender @life_sa_601;
values [];
};
};
description "";
parent @life_sa_600;
postcondition "";
precondition "";
}
sa_port sa_lifecycle_service_input "SA Lifecycle service input" id "a4a6ecc0-3e12-51a5-b08b-199ad743525c" {
contract {
FunctionInput {
incoming_items [];
};
};
description "";
legacy none;
parent @life_sa_11;
}
sa_port sa_lifecycle_service_output "SA Lifecycle service output" id "b1aa66c4-0e8e-5091-beda-2b8d2005b688" {
contract {
FunctionOutput {
outgoing_items [];
};
};
description "";
legacy none;
parent @life_sa_10;
}
interaction life_oa_service "OA Lifecycle service" id "5ceab400-0000-4000-8000-0000000003f4" {
description "";
items [];
source @life_oa_10;
target @life_oa_11;
}
functional_exchange life_sa_service "SA Lifecycle service" id "5ceab400-0000-4000-8000-0000000007dc" {
description "";
items [];
source @life_sa_10;
source_port @sa_lifecycle_service_output;
target @life_sa_11;
target_port @sa_lifecycle_service_input;
}
}
@@ -0,0 +1,2 @@
// Preserve lifecycle note: 雨 · receiver.
// Geometry never changes these bytes.
@@ -0,0 +1 @@
PASS same: all identities, fields, reachable source and physical bytes
@@ -0,0 +1,120 @@
{
"schema": 1,
"identity": "Codex-ytr83r /root/wsl_startup_review",
"scope": "Closed Windows evidence archival; no new execution",
"frozenUtc": "2026-09-11T17:38:52.1137417Z",
"sourceRoot": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio",
"payloadCount": 11,
"payloadBytes": 137778,
"checkpointInventory": [
{
"name": "project.arcadia",
"bytes": 20128
},
{
"name": "rationale.arcadia",
"bytes": 86
}
],
"files": [
{
"source": ".local/ytr83r-server-cli-all-targets-20260911.log",
"destination": "ytr83r-server-cli-all-targets-20260911.log",
"bytes": 8885,
"sourceLastWriteUtc": "2026-09-11T17:28:55.8027952Z",
"sourceSha256": "91DD56837B62BE7AD95249B12A98D2C6C55FD62C91F1274FB90D616A76B4AE2E",
"destinationBytes": 8885,
"destinationSha256": "91DD56837B62BE7AD95249B12A98D2C6C55FD62C91F1274FB90D616A76B4AE2E"
},
{
"source": ".local/ytr83r-server-cli-all-targets-20260911-status.json",
"destination": "ytr83r-server-cli-all-targets-20260911-status.json",
"bytes": 473,
"sourceLastWriteUtc": "2026-09-11T17:28:57.0914904Z",
"sourceSha256": "F3A0AD25C8232E45DF35F0656ED14E754F78A4F53CE3D8CE8EB082EE23860531",
"destinationBytes": 473,
"destinationSha256": "F3A0AD25C8232E45DF35F0656ED14E754F78A4F53CE3D8CE8EB082EE23860531"
},
{
"source": ".local/ytr83r-semantic-schema-4da92ab.log",
"destination": "ytr83r-semantic-schema-4da92ab.log",
"bytes": 269,
"sourceLastWriteUtc": "2026-09-11T17:25:52.2283842Z",
"sourceSha256": "238A17DDBBC0EDBA0A3AA264F19DA3DA735A56B2DB6694B9F723A0F299C04FB8",
"destinationBytes": 269,
"destinationSha256": "238A17DDBBC0EDBA0A3AA264F19DA3DA735A56B2DB6694B9F723A0F299C04FB8"
},
{
"source": ".local/ytr83r-semantic-schema-4da92ab-status.json",
"destination": "ytr83r-semantic-schema-4da92ab-status.json",
"bytes": 279,
"sourceLastWriteUtc": "2026-09-11T17:25:52.31095Z",
"sourceSha256": "96D50DAADC4704C0A397F7B9803CB488B20BEA184D2D2CF4BEF55828B7935648",
"destinationBytes": 279,
"destinationSha256": "96D50DAADC4704C0A397F7B9803CB488B20BEA184D2D2CF4BEF55828B7935648"
},
{
"source": ".local/ytr83r-jsonschema-install.log",
"destination": "ytr83r-jsonschema-install.log",
"bytes": 1527,
"sourceLastWriteUtc": "2026-09-11T17:27:55.5204549Z",
"sourceSha256": "B7DE62BEB8A8AC0DF35516E3914DD57A12ACF556E61CA8E8E6E0CAC3728F4587",
"destinationBytes": 1527,
"destinationSha256": "B7DE62BEB8A8AC0DF35516E3914DD57A12ACF556E61CA8E8E6E0CAC3728F4587"
},
{
"source": ".local/ytr83r-semantic-schema-localdeps-4da92ab.log",
"destination": "ytr83r-semantic-schema-localdeps-4da92ab.log",
"bytes": 136,
"sourceLastWriteUtc": "2026-09-11T17:28:34.1584199Z",
"sourceSha256": "EA459613E299F8686C8D9757288DFB32048D51CE0850A2B2161CFB048F09EAE8",
"destinationBytes": 136,
"destinationSha256": "EA459613E299F8686C8D9757288DFB32048D51CE0850A2B2161CFB048F09EAE8"
},
{
"source": ".local/ytr83r-semantic-schema-localdeps-4da92ab-status.json",
"destination": "ytr83r-semantic-schema-localdeps-4da92ab-status.json",
"bytes": 458,
"sourceLastWriteUtc": "2026-09-11T17:28:34.2213594Z",
"sourceSha256": "D0B4930C412279BE7F06F1F35F3A11D1BFA08DC1FB726ED71E8AD6DE28343A74",
"destinationBytes": 458,
"destinationSha256": "D0B4930C412279BE7F06F1F35F3A11D1BFA08DC1FB726ED71E8AD6DE28343A74"
},
{
"source": ".local/lifecycle-native-ui/checkpoints/wide-after-passive-save/project.arcadia",
"destination": "lifecycle-native-ui/checkpoints/wide-after-passive-save/project.arcadia",
"bytes": 20128,
"sourceLastWriteUtc": "2026-09-11T17:34:01.5548598Z",
"sourceSha256": "6A18EE1F246321BDF8AB0E7E8E5D4EBA134CE486ED5224C4FFD61C7342C3A7D3",
"destinationBytes": 20128,
"destinationSha256": "6A18EE1F246321BDF8AB0E7E8E5D4EBA134CE486ED5224C4FFD61C7342C3A7D3"
},
{
"source": ".local/lifecycle-native-ui/checkpoints/wide-after-passive-save/rationale.arcadia",
"destination": "lifecycle-native-ui/checkpoints/wide-after-passive-save/rationale.arcadia",
"bytes": 86,
"sourceLastWriteUtc": "2026-09-11T17:34:01.5548598Z",
"sourceSha256": "8509F8D8A136D808CF98A1BB0FE50348B8A24409F30DEE4EE65B62BF5CB9E6BF",
"destinationBytes": 86,
"destinationSha256": "8509F8D8A136D808CF98A1BB0FE50348B8A24409F30DEE4EE65B62BF5CB9E6BF"
},
{
"source": ".local/lifecycle-native-ui/logs/wide-after-passive-save-same.log",
"destination": "lifecycle-native-ui/logs/wide-after-passive-save-same.log",
"bytes": 72,
"sourceLastWriteUtc": "2026-09-11T17:34:01.8606723Z",
"sourceSha256": "4B2B8F76684C906EDEDB026A1F661082ABF71033B50F8584EFF5C604D9882DED",
"destinationBytes": 72,
"destinationSha256": "4B2B8F76684C906EDEDB026A1F661082ABF71033B50F8584EFF5C604D9882DED"
},
{
"source": ".local/lifecycle-native-ui/screenshots/wide-cjk-sa-resumed-min-125-saved.jpg",
"destination": "lifecycle-native-ui/screenshots/wide-cjk-sa-resumed-min-125-saved.jpg",
"bytes": 105465,
"sourceLastWriteUtc": "2026-09-11T17:33:38.7318371Z",
"sourceSha256": "1187D88DC5220EA17D8D38B63214E106860DE529C652894C9F3A7770EC2DD900",
"destinationBytes": 105465,
"destinationSha256": "1187D88DC5220EA17D8D38B63214E106860DE529C652894C9F3A7770EC2DD900"
}
]
}
@@ -0,0 +1,120 @@
{
"readbackUtc": "2026-09-11T17:38:52.5047939Z",
"payloadCount": 11,
"payloadBytes": 137778,
"allMatch": true,
"discrepancies": [],
"files": [
{
"source": ".local/ytr83r-server-cli-all-targets-20260911.log",
"destination": "ytr83r-server-cli-all-targets-20260911.log",
"sourceBytes": 8885,
"destinationBytes": 8885,
"sourceSha256": "91DD56837B62BE7AD95249B12A98D2C6C55FD62C91F1274FB90D616A76B4AE2E",
"destinationSha256": "91DD56837B62BE7AD95249B12A98D2C6C55FD62C91F1274FB90D616A76B4AE2E",
"matchesFrozen": true
},
{
"source": ".local/ytr83r-server-cli-all-targets-20260911-status.json",
"destination": "ytr83r-server-cli-all-targets-20260911-status.json",
"sourceBytes": 473,
"destinationBytes": 473,
"sourceSha256": "F3A0AD25C8232E45DF35F0656ED14E754F78A4F53CE3D8CE8EB082EE23860531",
"destinationSha256": "F3A0AD25C8232E45DF35F0656ED14E754F78A4F53CE3D8CE8EB082EE23860531",
"matchesFrozen": true
},
{
"source": ".local/ytr83r-semantic-schema-4da92ab.log",
"destination": "ytr83r-semantic-schema-4da92ab.log",
"sourceBytes": 269,
"destinationBytes": 269,
"sourceSha256": "238A17DDBBC0EDBA0A3AA264F19DA3DA735A56B2DB6694B9F723A0F299C04FB8",
"destinationSha256": "238A17DDBBC0EDBA0A3AA264F19DA3DA735A56B2DB6694B9F723A0F299C04FB8",
"matchesFrozen": true
},
{
"source": ".local/ytr83r-semantic-schema-4da92ab-status.json",
"destination": "ytr83r-semantic-schema-4da92ab-status.json",
"sourceBytes": 279,
"destinationBytes": 279,
"sourceSha256": "96D50DAADC4704C0A397F7B9803CB488B20BEA184D2D2CF4BEF55828B7935648",
"destinationSha256": "96D50DAADC4704C0A397F7B9803CB488B20BEA184D2D2CF4BEF55828B7935648",
"matchesFrozen": true
},
{
"source": ".local/ytr83r-jsonschema-install.log",
"destination": "ytr83r-jsonschema-install.log",
"sourceBytes": 1527,
"destinationBytes": 1527,
"sourceSha256": "B7DE62BEB8A8AC0DF35516E3914DD57A12ACF556E61CA8E8E6E0CAC3728F4587",
"destinationSha256": "B7DE62BEB8A8AC0DF35516E3914DD57A12ACF556E61CA8E8E6E0CAC3728F4587",
"matchesFrozen": true
},
{
"source": ".local/ytr83r-semantic-schema-localdeps-4da92ab.log",
"destination": "ytr83r-semantic-schema-localdeps-4da92ab.log",
"sourceBytes": 136,
"destinationBytes": 136,
"sourceSha256": "EA459613E299F8686C8D9757288DFB32048D51CE0850A2B2161CFB048F09EAE8",
"destinationSha256": "EA459613E299F8686C8D9757288DFB32048D51CE0850A2B2161CFB048F09EAE8",
"matchesFrozen": true
},
{
"source": ".local/ytr83r-semantic-schema-localdeps-4da92ab-status.json",
"destination": "ytr83r-semantic-schema-localdeps-4da92ab-status.json",
"sourceBytes": 458,
"destinationBytes": 458,
"sourceSha256": "D0B4930C412279BE7F06F1F35F3A11D1BFA08DC1FB726ED71E8AD6DE28343A74",
"destinationSha256": "D0B4930C412279BE7F06F1F35F3A11D1BFA08DC1FB726ED71E8AD6DE28343A74",
"matchesFrozen": true
},
{
"source": ".local/lifecycle-native-ui/checkpoints/wide-after-passive-save/project.arcadia",
"destination": "lifecycle-native-ui/checkpoints/wide-after-passive-save/project.arcadia",
"sourceBytes": 20128,
"destinationBytes": 20128,
"sourceSha256": "6A18EE1F246321BDF8AB0E7E8E5D4EBA134CE486ED5224C4FFD61C7342C3A7D3",
"destinationSha256": "6A18EE1F246321BDF8AB0E7E8E5D4EBA134CE486ED5224C4FFD61C7342C3A7D3",
"matchesFrozen": true
},
{
"source": ".local/lifecycle-native-ui/checkpoints/wide-after-passive-save/rationale.arcadia",
"destination": "lifecycle-native-ui/checkpoints/wide-after-passive-save/rationale.arcadia",
"sourceBytes": 86,
"destinationBytes": 86,
"sourceSha256": "8509F8D8A136D808CF98A1BB0FE50348B8A24409F30DEE4EE65B62BF5CB9E6BF",
"destinationSha256": "8509F8D8A136D808CF98A1BB0FE50348B8A24409F30DEE4EE65B62BF5CB9E6BF",
"matchesFrozen": true
},
{
"source": ".local/lifecycle-native-ui/logs/wide-after-passive-save-same.log",
"destination": "lifecycle-native-ui/logs/wide-after-passive-save-same.log",
"sourceBytes": 72,
"destinationBytes": 72,
"sourceSha256": "4B2B8F76684C906EDEDB026A1F661082ABF71033B50F8584EFF5C604D9882DED",
"destinationSha256": "4B2B8F76684C906EDEDB026A1F661082ABF71033B50F8584EFF5C604D9882DED",
"matchesFrozen": true
},
{
"source": ".local/lifecycle-native-ui/screenshots/wide-cjk-sa-resumed-min-125-saved.jpg",
"destination": "lifecycle-native-ui/screenshots/wide-cjk-sa-resumed-min-125-saved.jpg",
"sourceBytes": 105465,
"destinationBytes": 105465,
"sourceSha256": "1187D88DC5220EA17D8D38B63214E106860DE529C652894C9F3A7770EC2DD900",
"destinationSha256": "1187D88DC5220EA17D8D38B63214E106860DE529C652894C9F3A7770EC2DD900",
"matchesFrozen": true
}
],
"metadata": [
{
"path": "README.md",
"bytes": 2186,
"sha256": "F8C96D6CD1C7E796CAA8DF568BB6E1A6CFDEED57BC18F3A81E5BC2955493A0A5"
},
{
"path": "manifest.json",
"bytes": 5694,
"sha256": "D49E618F194868C3C3ABC2893893A8D52F6AD83460DBE6E0F2C94351AFC5F02C"
}
]
}
@@ -0,0 +1,22 @@
Collecting jsonschema
Downloading jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB)
Collecting attrs>=22.2.0 (from jsonschema)
Downloading attrs-26.1.0-py3-none-any.whl.metadata (8.8 kB)
Collecting jsonschema-specifications>=2023.03.6 (from jsonschema)
Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB)
Collecting referencing>=0.28.4 (from jsonschema)
Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB)
Collecting rpds-py>=0.25.0 (from jsonschema)
Downloading rpds_py-2026.6.3-cp312-cp312-win_amd64.whl.metadata (4.2 kB)
Collecting typing-extensions>=4.4.0 (from referencing>=0.28.4->jsonschema)
Downloading typing_extensions-4.16.0-py3-none-any.whl.metadata (3.3 kB)
Downloading jsonschema-4.26.0-py3-none-any.whl (90 kB)
Downloading attrs-26.1.0-py3-none-any.whl (67 kB)
Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB)
Downloading referencing-0.37.0-py3-none-any.whl (26 kB)
Downloading rpds_py-2026.6.3-cp312-cp312-win_amd64.whl (220 kB)
Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB)
Installing collected packages: typing-extensions, rpds-py, attrs, referencing, jsonschema-specifications, jsonschema
Successfully installed attrs-26.1.0 jsonschema-4.26.0 jsonschema-specifications-2025.9.1 referencing-0.37.0 rpds-py-2026.6.3 typing-extensions-4.16.0
WARNING: Target directory C:\Users\User\Documents\Git\ARCADIA-Studio\.local\python-deps\bin already exists. Specify --upgrade to force replacement.
@@ -0,0 +1,12 @@
{
"started_utc": "2026-09-11T17:25:50.971Z",
"completed_utc": "2026-09-11T17:25:52.228Z",
"exit": 1,
"commit": "4da92ab481a2f5f9fcd88f29c90fa4785ac17c3a",
"command": [
"python",
"crates/oa-server/tests/semantic_schema.py",
"--check",
"--validate"
]
}
@@ -0,0 +1,4 @@
Traceback (most recent call last):
File "C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-server\tests\semantic_schema.py", line 266, in <module>
from jsonschema import Draft202012Validator, FormatChecker
ModuleNotFoundError: No module named 'jsonschema'
@@ -0,0 +1,11 @@
{
"started_utc": "2026-09-11T17:28:23.175Z",
"completed_utc": "2026-09-11T17:28:34.201Z",
"exit": 0,
"commit": "4da92ab481a2f5f9fcd88f29c90fa4785ac17c3a",
"command": [
"python",
"-c",
"import sys, runpy; sys.path.insert(0, r'C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\python-deps'); sys.argv = ['crates/oa-server/tests/semantic_schema.py', '--check', '--validate']; runpy.run_path(sys.argv[0], run_name='__main__')"
]
}
@@ -0,0 +1,2 @@
Source-7 schema fixtures: 72 passed; all 204 component schemas well-formed
Closed catalog: 14 families, 90 scalar leaves; 204 schemas
@@ -0,0 +1,19 @@
{
"exit": 0,
"command": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-server",
"-p",
"oa-cli",
"--all-targets"
],
"log": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\ytr83r-server-cli-all-targets-20260911.log",
"completed_utc": "2026-09-11T17:28:56.5857591Z",
"name": "ytr83r-server-cli-all-targets-20260911",
"seconds": 1137.23368,
"started_utc": "2026-09-11T17:09:58.7368301Z"
}
@@ -0,0 +1,144 @@
Compiling syn v2.0.119
Compiling synstructure v0.13.2
Compiling zerofrom-derive v0.1.7
Compiling zerofrom v0.1.8
Compiling yoke-derive v0.8.2
Compiling yoke v0.8.3
Compiling zerovec v0.11.8
Compiling smallvec v1.16.0
Compiling tinystr v0.8.4
Compiling icu_locale_core v2.3.0
Compiling zerotrie v0.2.5
Compiling potential_utf v0.1.6
Compiling icu_collections v2.3.0
Compiling icu_provider v2.3.1
Compiling futures-task v0.3.34
Compiling slab v0.4.12
Compiling futures-util v0.3.34
Compiling icu_normalizer v2.3.0
Compiling icu_properties v2.3.0
Compiling futures-channel v0.3.34
Compiling hyper v1.11.1
Compiling tracing v0.1.44
Compiling idna_adapter v1.2.2
Compiling hyper-util v0.1.20
Compiling idna v1.1.0
Compiling tower v0.5.3
Compiling url v2.5.8
Compiling tower-http v0.6.11
Compiling axum v0.8.9
Compiling hyper-rustls v0.27.9
Compiling reqwest v0.12.28
Compiling oa-server v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-server)
Compiling oa-cli v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-cli)
Finished `test` profile [unoptimized] target(s) in 18m 12s
Running unittests src\lib.rs (target\debug\deps\oa_cli-2381a185bffed18a.exe)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src\main.rs (target\debug\deps\arcadia-9f7631654f61a956.exe)
running 0 tests
Running tests\source_cli.rs (target\debug\deps\source_cli-e1d35ae8856e0c2f.exe)
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 12 tests
test captured_candidate_exact_write_preserves_crlf_comments_and_noop_metadata ... ok
test alias_rename_across_modules_changes_only_live_tokens_and_retains_all_identity ... ok
test captured_dependency_change_refuses_all_writes_even_on_noop ... ok
test entry_is_explicit_and_machine_readable_usage_errors_do_not_write ... ok
test invalid_unicode_raw_edit_is_located_and_never_stabilized_or_written ... ok
test complete_alarm_example_preview_then_write_and_fixed_point ... ok
test missing_id_warning_uses_raw_location_and_never_exposes_ephemeral_lint_id ... ok
test loader_encoding_missing_dependency_and_invalid_old_source_keep_original_bytes ... ok
test non_element_alias_detached_file_and_unchanged_dependency_conflict ... ok
test pending_journal_refuses_read_preview_and_write_without_recovery ... ok
test rename_shows_missing_identity_and_separate_source_migration ... ok
test rejected_alias_and_same_alias_preserve_source ... ok
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.58s
Running unittests src\lib.rs (target\debug\deps\oa_server-ef5ecc53eb3cd700.exe)
running 4 tests
test store::preparation_gate::preparation_gate_drop_cancels_without_installing_candidate ... ok
test store::tests::prepared_candidates_recheck_revision_at_commit_and_failed_loser_is_not_installed ... ok
test preparation_http_tests::prepared_source_http_rechecks_revision_without_holding_catalog ... ok
test store::tests::source_bytes_are_charged_on_legacy_open_update_and_delete ... ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.72s
Running unittests src\main.rs (target\debug\deps\arcadia_server-4822c314ca80ed7f.exe)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests\http.rs (target\debug\deps\http-bb2e0bfd26dc3c6b.exe)
running 50 tests
test auth_origins_media_and_body_limits_are_enforced_over_http ... ok
test batches_dry_run_noop_and_source_share_the_core ... ok
test chunked_upload_limits_and_loopback_host_check_use_the_real_transport ... ok
test communication_limits::ordinary_transition_operation_omission_limit_rejects_201_without_mutation ... ok
test communication_limits::ordinary_transition_endpoint_decision_limit_rejects_201_without_mutation ... ok
test communication_limits::semantic_transition_operation_omission_limit_rejects_201_without_mutation ... ok
test communication_limits::semantic_transition_endpoint_decision_limit_rejects_201_without_mutation ... ok
test conditional_writes_are_atomic_and_survive_restart ... ok
test data_contracts::authored_schema3_bundle_upgrade_reports_data_defaults_and_preserves_files ... ok
test data_contracts::existing_schema3_coupled_envelope_upgrades_in_memory_until_explicit_save ... ok
test data_contracts::published_data_contract_queries_atomic_edits_identity_and_restart ... ok
test current_migration_reports_and_invalid_typed_transaction_preserve_http_state ... ok
test edge_route_transactions_source_and_json_share_defaults_etags_and_atomic_rejection ... ok
test data_contracts::qualified_call_reply_values_reject_invalid_edits_and_survive_identity_source_and_restart ... ok
test failed_atomic_replacement_preserves_the_accepted_model ... ok
test fixed_store_capacity_is_enforced_on_http_and_restart ... ok
test graph_filters_pagination_and_bounded_neighborhoods ... ok
test invalid_candidates_and_bad_headers_leave_snapshot_unchanged ... ok
test legacy_json_import_and_model_reidentification_keep_the_service_address ... ok
test mission_and_contextual_chain_records_round_trip_and_edit_through_http ... ok
test non_loopback_requires_a_token ... ok
test legacy_v2_scenarios_and_typed_message_edits_use_the_same_http_model ... ok
test port_anchors::port_anchor_http_commands_and_source_edits_preserve_per_view_state_after_restart ... ok
test port_anchors::port_anchor_http_rejects_invalid_records_and_stale_owners_atomically ... ok
test port_anchors::port_anchor_served_openapi_matches_serialized_records_and_commands ... ok
test reopening_v2_envelope_reports_migration_without_saving_or_advancing_revision ... ok
test route_openapi_describes_the_serde_command_shapes_and_nested_defaults ... ok
test semantic_transitions::semantic_candidate_constructor_reverse_direction_and_explicit_trace_selection ... ok
test semantic_transitions::semantic_cleanup_impacts_require_exact_acceptance_before_atomic_apply ... ok
test semantic_transitions::semantic_new_mapping_keeps_preview_generated_identifiers ... ok
test semantic_transitions::semantic_partial_review_query_source_and_restart_share_one_revision ... ok
test semantic_transitions::semantic_resets_and_invalid_candidates_preserve_deliberate_review_boundaries ... ok
test semantic_transitions::semantic_strict_rejection_stale_plans_and_source_only_changes_never_write ... ok
test source6_views::source6_http_explicit_communication_ports_preview_apply_and_restart_preserve_decisions ... ok
test source6_views::source6_http_views_categories_and_means_preserve_source_and_reject_invalid_batch_after_restart ... ok
test source7_contracts::source7_http_instance_and_operation_edits_preserve_identity_source_and_restart ... ok
test source_projects::source_projects_command_dry_runs_and_identity_swaps_preserve_lexical_ownership ... ok
test source_projects::source_projects_concurrent_comment_and_semantic_writes_share_one_revision ... ok
test source_projects::source_projects_equal_models_still_apply_changed_identity_provenance ... ok
test source_projects::source_projects_failed_atomic_comment_write_preserves_both_representations ... ok
test source_projects::source_projects_invalid_dependencies_and_duplicate_paths_never_change_the_head ... ok
test source_projects::source_projects_model_interchange_and_transitions_keep_authored_modules ... ok
test source_projects::source_projects_openapi_describes_the_coupled_envelope_and_source_diagnostics ... ok
test source_projects::source_projects_preserve_exact_files_comments_and_comment_only_revisions ... ok
test oversized_source_and_json_are_rejected_without_stalling_the_catalog ... ok
test source_projects::source_projects_upgrade_old_envelopes_without_writes_and_reject_inconsistent_pairs ... ok
test storage_rejects_second_owners_corruption_and_identity_mismatch ... ok
test transition_preview_apply_and_artifact_links_preserve_revision_boundaries ... ok
test typed_state_events_batch_reidentification_and_deletion_use_real_http ... ok
test source_projects::source_projects_stabilize_once_and_enforce_size_after_insertions ... ok
test result: ok. 50 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 34.63s
Running tests\state_representation.rs (target\debug\deps\state_representation-6b7303f63f64aeaf.exe)
running 2 tests
test served_state_projection_schema_preserves_closed_string_and_payload_variants ... ok
test state_view_source_json_transactions_and_restart_share_the_published_contract ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.94s
@@ -1,58 +0,0 @@
# Contextual-source verification evidence, 2026-09-11
Codex-9e8r6t /root/release_audit. Root authorized this preservation-only directory while running separate native checks. No new tests, compilation, GUI actions, source edits, Git staging or publication were performed to create this archive.
## Scope and byte preservation
The 37 original records (201,835 bytes) were copied byte-for-byte from the two private evidence directories. `inventory.json` records their original repository-relative paths, sizes and SHA-256 values, plus the generated README and source readback record. It excludes itself to avoid a recursive hash. The directory contains 40 files total. No executable, DLL, rlib, model output, credential or dependency tree is included.
`desktop/` preserves the original relative layout of `.local/contextual-source-20260911/`. `oracle-preparation/` preserves concise records from `.local/staged-source-oracle-20260911/`. Embedded paths, timestamps, line endings, compiler diagnostics and manifest wording are deliberately unmodified. They describe the original host and run; they do not assert that private executables or dependency paths exist in another checkout.
Root should preserve these bytes through Git using the same narrow attribute convention as neighboring experiments:
```gitattributes
harness/experiments/contextual-source-20260911/** -text whitespace=cr-at-eol
```
This worker did not modify the root attributes or index. The existing global text normalization would otherwise change some CRLF records. Verify every inventory hash again after staging or a checkout with that rule.
## Results and distinct source snapshots
| Evidence | Meaning |
| --- | --- |
| `desktop/focused1*` | Missing private topology Draft Clone; compiler error, Cargo101, no tests. The already-failed compiler was stopped; raw diagnostic retains its process exit code. |
| `desktop/focused2*` | Extra guide `explain` argument; compiler error, Cargo101, no tests, same stopped-failed-compiler policy. |
| `desktop/focused3*` | Test called private App method; compiler error, Cargo101, no tests. Corrected to the actual Message route. |
| `desktop/focused4*` | Successful contextual-source22/22, 2.04s; frozen input manifest and terminal status. |
| `desktop/tests-verified/` | Root's full675/675, 448.33s test duration, plus exact executable identity `6E677F58...BE38CC0`. This is the earlier snapshot. |
| `desktop/clippy1*` | Completed strict-lint failure on three constant-event `then` expressions; later corrected to `then_some`. |
| `desktop/focused5*` | Final contextual-source23/23, 0.98s. The seven-file delta adds the captured document/exact owner recovery regression and narrow guide/lint corrections. Both dated input manifests are retained (about44KB each) because their metadata and hashes bind different executions. |
| `desktop/guide-final*` | Final guide3/3, 0.20s. |
| `desktop/clippy2*` | Final all-target strict Clippy with warnings denied, PASS, 4m29s. |
| `desktop/gui-final*` | Matching final Windows GUI build PASS, 6m20s. |
| `desktop/fmt-final-status.json` | Workspace formatting PASS. The original runner produced no `fmt-final.log` file because there was no output; no substitute log was fabricated. |
| `desktop/tests-final/manifest.json` | Final test executable `405577A3...626F38`, inventory676; affected23 and guide3 were executed. |
| `desktop/gui-verified/manifest.json` | Final GUI `52DE82E4...246ACCE`, with runtime identity. Native acceptance is a separate root task. |
**There is no full final676 pass in this evidence.** The earlier full675 result must not be relabeled as execution of the later binary. Input manifests identify source-file hashes and contemporaneous Git context, not a claim that uncommitted desktop changes were contained in the listed commit or that every external build input was archived.
The original `run-final-gates.ps1` and `stage-final.ps1` are preserved as raw records. They document serialized commands, failure stops, unchanged-input checks and refusal to overwrite frozen artifacts. They assume repository cwd, the task-local Windows toolchain and private output paths; they were not run from this archive. Any future rerun needs an explicitly coordinated compiler slot and fresh output paths, and produces new evidence rather than replacing these records.
## Independent oracle preparation
`oracle-preparation/manifest.json` binds the independently authored evaluator, fixed two-file baseline, designated core rlib and executable. `build-initial.log` is an actual zero-byte successful diagnostics log, accompanied by its exit/time JSON. Self-check and baseline logs/status passed. The small CLI baseline check records admission with expected warnings, without source writes. These records establish evaluator preparation and falsifier execution, not acceptance of GUI-produced staged-source objects. The already-owned oracle source, fixture and report remain at `harness/staged-source-authoring-contract.rs`, `harness/fixtures/staged-source-authoring/` and `harness/release-staged-source-authoring-oracle-20260911.md`; they are not duplicated here.
`source-freeze-readback.json` is a new preservation-time check: all13 desktop source hashes matched the final focused5 snapshot. The implementation and independent-review reports remain outside this directory and were not edited by this task.
To verify this archive without running any application, from this directory:
```powershell
$inventory = Get-Content -LiteralPath inventory.json -Raw | ConvertFrom-Json
foreach ($entry in $inventory.files) {
$file = Get-Item -LiteralPath $entry.path
if ($file.Length -ne $entry.bytes -or
(Get-FileHash -LiteralPath $file.FullName -Algorithm SHA256).Hash -ne $entry.sha256) {
throw "Evidence mismatch: $($entry.path)"
}
}
```
@@ -1,5 +0,0 @@
{
"started": "2026-09-11T12:02:24.4104250Z",
"finished": "2026-09-11T12:06:15.0919494Z",
"exitCode": 101
}
@@ -1,57 +0,0 @@
Checking oa-core v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-core)
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
Compiling oa-server v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-server)
error: unnecessary closure used with `bool::then`
--> crates\oa-desktop\src\behavior\scenario\workspace.rs:199:65
|
199 | button("Add first lifeline").on_press_maybe(clean.then(|| {
| _________________________________________________________________^
200 | | Message::ScenarioCanvas(CanvasEvent::First(context, Tool::Lifeline))
201 | | }))
| |______________________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#unnecessary_lazy_evaluations
= note: `-D clippy::unnecessary-lazy-evaluations` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_lazy_evaluations)]`
help: use `then_some` instead
|
199 ~ button("Add first lifeline").on_press_maybe(clean.then_some({
200 + Message::ScenarioCanvas(CanvasEvent::First(context, Tool::Lifeline))
201 ~ }))
|
error: unnecessary closure used with `bool::then`
--> crates\oa-desktop\src\behavior\scenario\workspace.rs:209:64
|
209 | button("Add first message").on_press_maybe(clean.then(|| {
| ________________________________________________________________^
210 | | Message::ScenarioCanvas(CanvasEvent::First(context, Tool::Message))
211 | | })),
| |______________________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#unnecessary_lazy_evaluations
help: use `then_some` instead
|
209 ~ button("Add first message").on_press_maybe(clean.then_some({
210 + Message::ScenarioCanvas(CanvasEvent::First(context, Tool::Message))
211 ~ })),
|
error: unnecessary closure used with `bool::then`
--> crates\oa-desktop\src\behavior\scenario\workspace.rs:212:63
|
212 | button("Add first action").on_press_maybe(clean.then(|| {
| _______________________________________________________________^
213 | | Message::ScenarioCanvas(CanvasEvent::First(context, Tool::Action))
214 | | }))
| |______________________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#unnecessary_lazy_evaluations
help: use `then_some` instead
|
212 ~ button("Add first action").on_press_maybe(clean.then_some({
213 + Message::ScenarioCanvas(CanvasEvent::First(context, Tool::Action))
214 ~ }))
|
error: could not compile `oa-desktop` (bin "arcadia-studio" test) due to 3 previous errors
@@ -1,15 +0,0 @@
{
"started": "2026-09-11T12:25:20.3859405Z",
"finished": "2026-09-11T12:29:50.4525461Z",
"exitCode": 0,
"args": [
"clippy",
"--locked",
"-p",
"oa-desktop",
"--all-targets",
"--",
"-D",
"warnings"
]
}
@@ -1,2 +0,0 @@
Checking oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
Finished `dev` profile [unoptimized] target(s) in 4m 29s
@@ -1,11 +0,0 @@
{
"started": "2026-09-11T12:36:12.8744967Z",
"finished": "2026-09-11T12:36:41.0827202Z",
"exitCode": 0,
"args": [
"fmt",
"--all",
"--",
"--check"
]
}
@@ -1,5 +0,0 @@
{
"finished": "2026-09-11T11:27:02.1571291Z",
"started": "2026-09-11T11:23:44.5463460Z",
"exitCode": 101
}
@@ -1,33 +0,0 @@
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
error[E0308]: mismatched types
--> crates\oa-desktop\src\behavior\topology.rs:197:31
|
197 | self.draft = Some(next);
| ---- ^^^^ expected `Draft`, found `&Draft`
| |
| arguments to this enum variant are incorrect
|
note: `behavior::topology::Draft` does not implement `Clone`, so `&behavior::topology::Draft` was cloned instead
--> crates\oa-desktop\src\behavior\topology.rs:187:28
|
187 | let mut next = d.clone();
| ^
help: the type constructed contains `&behavior::topology::Draft` due to the type of the argument passed
--> crates\oa-desktop\src\behavior\topology.rs:197:26
|
197 | self.draft = Some(next);
| ^^^^^----^
| |
| this argument influences the type of `Some`
note: tuple variant defined here
--> /rustc/48a229ceaefd4985c50990b14116b6d856af0985/library\core\src\option.rs:606:4
help: consider annotating `behavior::topology::Draft` with `#[derive(Clone)]`
|
102 + #[derive(Clone)]
103 | struct Draft {
|
error: could not compile `oa-desktop` (bin "arcadia-studio" test) due to 1 previous error
Caused by:
process didn't exit successfully: `C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\rustup\toolchains\stable-x86_64-pc-windows-gnullvm\bin\rustc.exe --crate-name arcadia_studio --edition=2024 crates\oa-desktop\src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=e92d7ab29d07ce2a -C extra-filename=-58e30cee1fd51a8b --out-dir C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps -C linker=clang.exe -C incremental=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\incremental -C strip=debuginfo -L dependency=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps --extern axum=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libaxum-ccc7aea466db9258.rlib --extern iced=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced-ee73abd722c72024.rlib --extern iced_runtime=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced_runtime-97354eb606c5cbe8.rlib --extern oa_core=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_core-6c8da57367eec642.rlib --extern oa_server=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_server-69305e51c40cee45.rlib --extern reqwest=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libreqwest-31ac987472fa8038.rlib --extern rfd=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\librfd-17cc7ba2db223d7b.rlib --extern serde=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde-60a32311146a42e4.rlib --extern serde_json=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde_json-da2c4f333fc47818.rlib --extern tempfile=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtempfile-86aac28d6be16d2f.rlib --extern tokio=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtokio-5e0ca96735e3073a.rlib -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\ring-5f8d2d20440f09b4\out -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_gnullvm-0.52.6\lib -C link-arg=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\oa-desktop-664d65ac5124e646\out\normal-user-manifest.o` (exit code: 0xffffffff)
@@ -1,5 +0,0 @@
{
"finished": "2026-09-11T11:39:43.0079347Z",
"started": "2026-09-11T11:37:10.5178164Z",
"exitCode": 101
}
@@ -1,26 +0,0 @@
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
error[E0061]: this function takes 2 arguments but 3 arguments were supplied
--> crates\oa-desktop\src\guide.rs:899:25
|
899 | ... explain(
| ^^^^^^^
...
902 | ... "Behavior → New keeps the exact name, owner ...d raw text, for correction or cancellation.",
| --------------------------------------------...-------------------------------------------- unexpected argument #3 of type `&'static str`
|
note: function defined here
--> crates\oa-desktop\src\guide.rs:150:10
|
150 | const fn explain(title: &'static str, body: &'static str) -> Section {
| ^^^^^^^
help: remove the extra argument
|
901 - "Inside a source subform, Back or the first Escape returns to the unchanged parent. Use this new source stages the prerequisite only. Canceling the parent discards it; choosing an existing reference excludes the staged source from creation. Recovery retains both forms and their reserved identities. An open dialog still receives Escape first.",
902 - "Behavior → New keeps the exact name, owner and viewpoint choices outside the model until Create and open succeeds. Cancel or Escape discards only this draft; if a dialog is open, the first Escape dismisses that dialog. New refuses other unfinished property, source or behavior drafts without applying them. Recovery restores the creation form in its original layer, including rejected raw text, for correction or cancellation.",
901 + "Inside a source subform, Back or the first Escape returns to the unchanged parent. Use this new source stages the prerequisite only. Canceling the parent discards it; choosing an existing reference excludes the staged source from creation. Recovery retains both forms and their reserved identities. An open dialog still receives Escape first.",
|
error: could not compile `oa-desktop` (bin "arcadia-studio" test) due to 1 previous error
Caused by:
process didn't exit successfully: `C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\rustup\toolchains\stable-x86_64-pc-windows-gnullvm\bin\rustc.exe --crate-name arcadia_studio --edition=2024 crates\oa-desktop\src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=e92d7ab29d07ce2a -C extra-filename=-58e30cee1fd51a8b --out-dir C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps -C linker=clang.exe -C incremental=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\incremental -C strip=debuginfo -L dependency=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps --extern axum=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libaxum-ccc7aea466db9258.rlib --extern iced=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced-ee73abd722c72024.rlib --extern iced_runtime=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced_runtime-97354eb606c5cbe8.rlib --extern oa_core=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_core-6c8da57367eec642.rlib --extern oa_server=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_server-69305e51c40cee45.rlib --extern reqwest=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libreqwest-31ac987472fa8038.rlib --extern rfd=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\librfd-17cc7ba2db223d7b.rlib --extern serde=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde-60a32311146a42e4.rlib --extern serde_json=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde_json-da2c4f333fc47818.rlib --extern tempfile=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtempfile-86aac28d6be16d2f.rlib --extern tokio=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtokio-5e0ca96735e3073a.rlib -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\ring-5f8d2d20440f09b4\out -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_gnullvm-0.52.6\lib -C link-arg=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\oa-desktop-664d65ac5124e646\out\normal-user-manifest.o` (exit code: 0xffffffff)
@@ -1,5 +0,0 @@
{
"started": "2026-09-11T11:48:07.8443256Z",
"exitCode": 101,
"finished": "2026-09-11T11:49:20.9876952Z"
}
@@ -1,16 +0,0 @@
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
error[E0624]: method `execute` is private
--> crates\oa-desktop\src\behavior\contextual_source_tests.rs:1112:17
|
1112 | assert!(app.execute(Command::Rename(owner, "Accepted renamed scenario".into())));
| ^^^^^^^ private method
|
::: crates\oa-desktop\src\app.rs:851:5
|
851 | fn execute(&mut self, command: Command) -> bool {
| ----------------------------------------------- private method defined here
error: could not compile `oa-desktop` (bin "arcadia-studio" test) due to 1 previous error
Caused by:
process didn't exit successfully: `C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\rustup\toolchains\stable-x86_64-pc-windows-gnullvm\bin\rustc.exe --crate-name arcadia_studio --edition=2024 crates\oa-desktop\src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=e92d7ab29d07ce2a -C extra-filename=-58e30cee1fd51a8b --out-dir C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps -C linker=clang.exe -C incremental=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\incremental -C strip=debuginfo -L dependency=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps --extern axum=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libaxum-ccc7aea466db9258.rlib --extern iced=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced-ee73abd722c72024.rlib --extern iced_runtime=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced_runtime-97354eb606c5cbe8.rlib --extern oa_core=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_core-6c8da57367eec642.rlib --extern oa_server=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_server-69305e51c40cee45.rlib --extern reqwest=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libreqwest-31ac987472fa8038.rlib --extern rfd=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\librfd-17cc7ba2db223d7b.rlib --extern serde=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde-60a32311146a42e4.rlib --extern serde_json=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde_json-da2c4f333fc47818.rlib --extern tempfile=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtempfile-86aac28d6be16d2f.rlib --extern tokio=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtokio-5e0ca96735e3073a.rlib -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\ring-5f8d2d20440f09b4\out -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_gnullvm-0.52.6\lib -C link-arg=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\oa-desktop-664d65ac5124e646\out\normal-user-manifest.o` (exit code: 0xffffffff)
File diff suppressed because it is too large Load Diff
@@ -1,5 +0,0 @@
{
"exitCode": 0,
"finished": "2026-09-11T11:59:25.8739914Z",
"started": "2026-09-11T11:49:26.5831603Z"
}
@@ -1,30 +0,0 @@
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
Finished `test` profile [unoptimized] target(s) in 9m 56s
Running unittests src\main.rs (.local\target-gnullvm\debug\deps\arcadia_studio-58e30cee1fd51a8b.exe)
running 22 tests
test behavior::contextual_source_tests::contextual_source_app_checkpoint_restores_inner_raw_draft_without_model_adoption ... ok
test behavior::contextual_source_tests::contextual_source_app_empty_actions_and_child_open_refuse_other_raw_editors ... ok
test behavior::contextual_source_tests::contextual_source_app_modal_escape_then_child_back_then_parent_cancel_preserve_accepted_source ... ok
test behavior::contextual_source_tests::contextual_source_back_remains_available_after_owner_deletion_and_with_dirty_editors ... ok
test behavior::contextual_source_tests::contextual_source_back_retains_parent_and_rejects_late_child_event ... ok
test behavior::contextual_source_tests::contextual_source_default_consumer_name_has_stable_alias_and_correlated_selection ... ok
test behavior::contextual_source_tests::contextual_source_deleted_owner_view_retains_draft_instead_of_panicking_or_using_fallback ... ok
test behavior::contextual_source_tests::contextual_source_empty_history_reports_no_change_and_success_requires_a_real_history_step ... ok
test behavior::contextual_source_tests::contextual_source_existing_choice_prunes_staged_dependency ... ok
test behavior::contextual_source_tests::contextual_source_failed_source_budget_preserves_both_drafts_and_accepted_bytes ... ok
test behavior::contextual_source_tests::contextual_source_incomplete_recovered_kind_reports_error_without_panicking ... ok
test behavior::contextual_source_tests::contextual_source_inserts_work_on_the_exact_guarded_link_and_refuses_exchange_identity_conflict ... ok
test behavior::contextual_source_tests::contextual_source_lifelines_stage_exact_separate_records_and_one_history_entry ... ok
test behavior::contextual_source_tests::contextual_source_machine_before_any_owner_creates_optional_view_atomically ... ok
test behavior::contextual_source_tests::contextual_source_mounted_small_editor_keeps_back_and_use_outside_field_scroll ... ok
test behavior::contextual_source_tests::contextual_source_nested_semantic_parent_is_explicit_and_revalidated ... ok
test behavior::contextual_source_tests::contextual_source_new_callee_lifeline_preserves_caller_bindings_as_an_explicit_warning ... ok
test behavior::contextual_source_tests::contextual_source_old_empty_action_cannot_open_a_previous_owner_or_layer ... ok
test behavior::contextual_source_tests::contextual_source_owner_first_can_return_to_an_unnamed_machine_without_losing_source ... ok
test behavior::contextual_source_tests::contextual_source_recovery_keeps_inner_raw_fields_and_refuses_deleted_or_changed_owner ... ok
test behavior::contextual_source_tests::contextual_source_second_system_and_role_machine_owner_refuse_without_fallback ... ok
test behavior::contextual_source_tests::contextual_source_work_uses_reserved_contribution_and_link_ids_and_one_undo ... ok
test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 653 filtered out; finished in 2.04s
@@ -1,37 +0,0 @@
[
{
"path": "crates/oa-desktop\\src\\behavior\\contextual_source_tests.rs",
"before": "42E3E985EBA327B518D731AE0714AD5F9B48AF991E9FD62B2B0666E139E02487",
"after": "5F05318A6533503B9D6FEBF1EC4DD7256F192394BC1B952A7904C8175BD8DDAE"
},
{
"path": "crates/oa-desktop\\src\\behavior\\creation.rs",
"before": "AB851BCBC3EB070D5911F878EE43FE0530FCB67269103B4B56EF73E17F5BC104",
"after": "CA7275B5C0118CBB78F5D16254E50FADDC26DBB53816D01950064C852E296B2E"
},
{
"path": "crates/oa-desktop\\src\\behavior\\scenario.rs",
"before": "5ED3FD63433EF51A6D6315FC4F8251995BBCAA29A0A938FAC0921A4845FAAB2A",
"after": "D12A4B1CAA61C08F69C4D2A64BD15568C4B7158DEA91AAC5A52A58A35ADB863C"
},
{
"path": "crates/oa-desktop\\src\\behavior\\scenario\\workspace.rs",
"before": "6100D1A6CE09CD3C2836EB1559DADF382437DB34DB2BDA76CEB4E479CB15DA41",
"after": "69C7AD32E4BDC39F42D2E6C7764CFE1FA7867CD7DBCF9B904DEC805E6C912666"
},
{
"path": "crates/oa-desktop\\src\\behavior\\source_draft.rs",
"before": "7447D38E178C3B199901E519ABDCA6868CFD52510F7B67A5EA8B849072CDAE2D",
"after": "68F396C420FFF132FF0EAB82CB2C6251477412F6F9F90AD2E76C51A259F8A69A"
},
{
"path": "crates/oa-desktop\\src\\behavior\\topology.rs",
"before": "40139E3714E702E1F331F98EE2579E167D3CA61330864772EC5E40614F118A5A",
"after": "D06B2F0FC39B4814E94200297E148F1D4D97E04CB167766030AC9DF18689E3B0"
},
{
"path": "crates/oa-desktop\\src\\guide.rs",
"before": "C6425F2FBC2D7D04015E15D78F602CA838019B7C15352EF5A380F78A30800C68",
"after": "47EEB3CC0A48D5712720096015A08387CD354FB91559B0BD6FA106B5CAC6292C"
}
]
File diff suppressed because it is too large Load Diff
@@ -1,16 +0,0 @@
{
"started": "2026-09-11T12:20:22.2107248Z",
"finished": "2026-09-11T12:25:14.9560639Z",
"exitCode": 0,
"args": [
"test",
"--locked",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"contextual_source",
"--",
"--test-threads=1"
]
}
@@ -1,31 +0,0 @@
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop)
Finished `test` profile [unoptimized] target(s) in 4m 48s
Running unittests src\main.rs (.local\target-gnullvm\debug\deps\arcadia_studio-58e30cee1fd51a8b.exe)
running 23 tests
test behavior::contextual_source_tests::contextual_source_app_checkpoint_restores_inner_raw_draft_without_model_adoption ... ok
test behavior::contextual_source_tests::contextual_source_app_empty_actions_and_child_open_refuse_other_raw_editors ... ok
test behavior::contextual_source_tests::contextual_source_app_modal_escape_then_child_back_then_parent_cancel_preserve_accepted_source ... ok
test behavior::contextual_source_tests::contextual_source_back_remains_available_after_owner_deletion_and_with_dirty_editors ... ok
test behavior::contextual_source_tests::contextual_source_back_retains_parent_and_rejects_late_child_event ... ok
test behavior::contextual_source_tests::contextual_source_default_consumer_name_has_stable_alias_and_correlated_selection ... ok
test behavior::contextual_source_tests::contextual_source_deleted_owner_view_retains_draft_instead_of_panicking_or_using_fallback ... ok
test behavior::contextual_source_tests::contextual_source_empty_history_reports_no_change_and_success_requires_a_real_history_step ... ok
test behavior::contextual_source_tests::contextual_source_existing_choice_prunes_staged_dependency ... ok
test behavior::contextual_source_tests::contextual_source_failed_source_budget_preserves_both_drafts_and_accepted_bytes ... ok
test behavior::contextual_source_tests::contextual_source_incomplete_recovered_kind_reports_error_without_panicking ... ok
test behavior::contextual_source_tests::contextual_source_inserts_work_on_the_exact_guarded_link_and_refuses_exchange_identity_conflict ... ok
test behavior::contextual_source_tests::contextual_source_lifelines_stage_exact_separate_records_and_one_history_entry ... ok
test behavior::contextual_source_tests::contextual_source_machine_before_any_owner_creates_optional_view_atomically ... ok
test behavior::contextual_source_tests::contextual_source_mounted_small_editor_keeps_back_and_use_outside_field_scroll ... ok
test behavior::contextual_source_tests::contextual_source_nested_semantic_parent_is_explicit_and_revalidated ... ok
test behavior::contextual_source_tests::contextual_source_new_callee_lifeline_preserves_caller_bindings_as_an_explicit_warning ... ok
test behavior::contextual_source_tests::contextual_source_old_empty_action_cannot_open_a_previous_owner_or_layer ... ok
test behavior::contextual_source_tests::contextual_source_original_document_remains_bound_after_back_or_choosing_existing ... ok
test behavior::contextual_source_tests::contextual_source_owner_first_can_return_to_an_unnamed_machine_without_losing_source ... ok
test behavior::contextual_source_tests::contextual_source_recovery_keeps_inner_raw_fields_and_refuses_deleted_or_changed_owner ... ok
test behavior::contextual_source_tests::contextual_source_second_system_and_role_machine_owner_refuse_without_fallback ... ok
test behavior::contextual_source_tests::contextual_source_work_uses_reserved_contribution_and_link_ids_and_one_undo ... ok
test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 653 filtered out; finished in 0.98s

Some files were not shown because too many files have changed in this diff Show More