diff --git a/contracts/data/source-approval.v1.proposed.json b/contracts/data/source-approval.v1.proposed.json new file mode 100644 index 00000000..d26c7e93 --- /dev/null +++ b/contracts/data/source-approval.v1.proposed.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://kartsell.taxbaik.com/contracts/data/source-approval.v1.proposed.json", + "title": "Governed Data Source Approval Contract", + "description": "Proposal only. This contract does not authorize ingestion until a human approval record exists.", + "contractVersion": "source-approval.v1-proposed", + "status": "DESIGN_PROPOSAL", + "automationBoundary": { + "allowedModes": ["EVALUATION_ONLY", "PROPOSAL_ONLY", "DRILL_ONLY"], + "forbiddenEffects": [ + "AUTO_MODEL_ACTIVATION", + "AUTO_MODEL_PROMOTION", + "AUTO_PARAMETER_CHANGE", + "AUTO_ORDER", + "KIS_SUBMISSION", + "CLIENT_PUBLICATION" + ] + }, + "type": "object", + "additionalProperties": false, + "required": [ + "sourceId", + "sourceVersion", + "domain", + "owner", + "steward", + "licenseReference", + "availabilitySla", + "freshnessSla", + "timezone", + "calendarId", + "unitContract", + "schemaContractVersion", + "status", + "contentHash", + "approvedBy", + "approvedAt" + ], + "properties": { + "sourceId": {"type": "string", "minLength": 1}, + "sourceVersion": {"type": "string", "minLength": 1}, + "domain": {"type": "string", "minLength": 1}, + "owner": {"type": "string", "minLength": 1}, + "steward": {"type": "string", "minLength": 1}, + "licenseReference": {"type": "string", "minLength": 1}, + "availabilitySla": {"type": "string", "minLength": 1}, + "freshnessSla": {"type": "string", "minLength": 1}, + "timezone": {"type": "string", "minLength": 1}, + "calendarId": {"type": "string", "minLength": 1}, + "unitContract": {"type": "string", "minLength": 1}, + "schemaContractVersion": {"type": "string", "minLength": 1}, + "status": {"enum": ["CANDIDATE", "APPROVED", "SUSPENDED", "RETIRED", "QUARANTINED"]}, + "contentHash": {"type": "string", "pattern": "^[A-Fa-f0-9]{64}$"}, + "approvedBy": {"type": "string", "minLength": 1}, + "approvedAt": {"type": "string", "format": "date-time"}, + "publishedAt": {"type": "string", "format": "date-time"}, + "revision": {"type": "integer", "minimum": 1} + }, + "allOf": [ + { + "if": {"properties": {"status": {"const": "APPROVED"}}}, + "then": {"required": ["publishedAt", "revision"]} + } + ] +} diff --git a/db/migrations/0033_source_approval_contract.sql b/db/migrations/0033_source_approval_contract.sql new file mode 100644 index 00000000..cbba187f --- /dev/null +++ b/db/migrations/0033_source_approval_contract.sql @@ -0,0 +1,53 @@ +-- AEG-X-009 / ADR-DATA-001: append-only source approval boundary. +-- This migration authorizes governance records only. It does not authorize ingestion, +-- recommendation, model activation, client publication, order, or KIS submission. + +create schema if not exists governance; + +create table if not exists governance.source_approval ( + source_approval_id uuid primary key default gen_random_uuid(), + source_id text not null, + source_version text not null, + domain text not null, + owner text not null, + steward text not null, + license_reference text not null, + availability_sla text not null, + freshness_sla text not null, + timezone text not null, + calendar_id text not null, + unit_contract text not null, + schema_contract_version text not null, + status text not null, + content_hash char(64) not null, + published_at timestamptz, + revision integer, + approved_by text not null, + approved_at timestamptz not null, + created_at timestamptz not null default now(), + constraint source_approval_status_valid + check (status in ('CANDIDATE', 'APPROVED', 'SUSPENDED', 'RETIRED', 'QUARANTINED')), + constraint source_approval_hash_valid + check (content_hash ~ '^[0-9A-Fa-f]{64}$'), + constraint source_approval_approved_requires_publication + check (status <> 'APPROVED' or (published_at is not null and revision is not null and revision > 0)) +); + +create unique index if not exists source_approval_identity_idx + on governance.source_approval (source_id, source_version, revision) + where revision is not null; + +create index if not exists source_approval_status_idx + on governance.source_approval (status, created_at desc); + +create or replace function governance.reject_source_approval_mutation() +returns trigger as $$ +begin + raise exception 'governance.source_approval is append-only; create a correction record'; +end; +$$ language plpgsql; + +drop trigger if exists source_approval_no_update on governance.source_approval; +create trigger source_approval_no_update +before update or delete on governance.source_approval +for each row execute function governance.reject_source_approval_mutation(); diff --git a/db/migrations/0034_dataset_manifest_freeze_contract.sql b/db/migrations/0034_dataset_manifest_freeze_contract.sql new file mode 100644 index 00000000..2fc1578f --- /dev/null +++ b/db/migrations/0034_dataset_manifest_freeze_contract.sql @@ -0,0 +1,32 @@ +-- AEG-X-009 / ADR-DATA-001: make dataset freeze explicit and append-only. +-- This migration does not create or seed a dataset. It only hardens the existing +-- evaluation.dataset_manifest boundary. + +alter table evaluation.dataset_manifest + drop constraint if exists dataset_manifest_status_check; + +alter table evaluation.dataset_manifest + add constraint dataset_manifest_status_check + check (status in ('PROPOSED', 'APPROVED', 'FROZEN', 'QUARANTINED', 'RETIRED')); + +alter table evaluation.dataset_manifest + drop constraint if exists dataset_manifest_frozen_approval_check; + +alter table evaluation.dataset_manifest + add constraint dataset_manifest_frozen_approval_check + check ( + status <> 'FROZEN' + or (approved_by is not null and approved_at is not null and frozen_at is not null) + ); + +create or replace function evaluation.reject_dataset_manifest_mutation() +returns trigger as $$ +begin + raise exception 'evaluation.dataset_manifest is append-only; create a correction record'; +end; +$$ language plpgsql; + +drop trigger if exists dataset_manifest_no_update on evaluation.dataset_manifest; +create trigger dataset_manifest_no_update +before update or delete on evaluation.dataset_manifest +for each row execute function evaluation.reject_dataset_manifest_mutation(); diff --git a/docs/CURRENT/AEG-X-009_AUTOMATION_PROPOSAL.md b/docs/CURRENT/AEG-X-009_AUTOMATION_PROPOSAL.md new file mode 100644 index 00000000..46c0abf9 --- /dev/null +++ b/docs/CURRENT/AEG-X-009_AUTOMATION_PROPOSAL.md @@ -0,0 +1,176 @@ +# AEG-X-009 Data/Model Proposal Automation — Design Proposal + +## Status and traceability + +- WBS: `AEG-X-009` +- Requirement: `REQ-DATA-SOURCE` +- Evidence class: `SOURCE+DESIGN_PROPOSAL` +- Status: `DESIGN_PROPOSAL`; not approved implementation +- Source: `contracts/schedules/model-operations.v3.json`, `contracts/schedules/execution-assurance.v1.json`, `contracts/model-governance/evaluation-promotion.v2.json`, `src/KArtSell.BuildingBlocks/Versioning/VersionSet.cs`, live read-only schema inspection on 2026-08-06 +- Assumption: source ingestion and model evaluation are allowed to create immutable proposal/evidence records when their mode is `EVALUATION_ONLY` or `PROPOSAL_ONLY`. +- Unknown: approved source owners, source licenses/SLA values, model training implementation, retention period, and operator/secondary assignments. +- Decision Required: approve the proposal schema, job ownership, source allow-list, promotion review roles, and retention/alert contracts before implementation. + +## Non-negotiable boundary + +Automation may: + +1. discover and validate an approved source; +2. ingest immutable raw records and create a content-addressed dataset manifest; +3. run deterministic evaluation against a frozen server-side VersionSet; +4. create EvidenceSnapshot and a human-review proposal; +5. notify the maker/checker queue and expose status/metrics. + +Automation must never: + +- activate or promote a model; +- mutate thresholds, policy, configuration, or source code; +- rollback a model automatically; +- publish to clients; +- submit an order or KIS request. + +## Required state flow + +```text +SOURCE_CANDIDATE + -> SOURCE_APPROVED (human owner + license/SLA/timezone/unit) + -> INGESTION_EVALUATION_ONLY + -> DATASET_QUARANTINED | DATASET_FROZEN + -> MODEL_EVALUATION_ONLY + -> EVIDENCE_SNAPSHOT_CREATED + -> PROPOSAL_ONLY_REVIEW + -> HUMAN_APPROVED | HUMAN_REJECTED | EXPIRED + -> HUMAN_CHANGE_APPLIED (separate release, never by scheduler) +``` + +`DATASET_QUARANTINED`, missing evidence, hash mismatch, PIT violation, or VersionSet drift is a terminal hold for that run. It is not a retryable transient failure. + +## Required immutable records + +### Source catalog entry + +```text +source_id +source_version +owner / steward / secondary +license_reference +availability_sla / freshness_sla +timezone / calendar +unit / currency +schema_contract_version +approved_at / approved_by +status: CANDIDATE | APPROVED | SUSPENDED | RETIRED +``` + +### Dataset manifest + +Use the existing `evaluation.dataset_manifest` table. A row is eligible for evaluation only when: + +```text +status = FROZEN +dataset_id and content_hash are non-blank +source_catalog_version is approved +lineage_hash is present +frozen_at and approved_at are present +published_at/revision/PIT rules pass +``` + +### Evaluation VersionSet + +Use the existing `VersionSet` contract. It must be loaded server-side and contain: + +```text +DatasetId, DataHash, ModelVersion, ConfigVersion, CodeSha, ContractVersion +``` + +The client may submit scope and requested window only. The client must not submit evidence, hashes, model versions, or configuration versions as authoritative values. + +### Proposal packet + +The proposal must reference, without copying or mutating, the EvidenceSnapshot and VersionSet. It must contain: + +```text +proposal_id / idempotency_key / scope_key / job_run_id +version_set / evidence_id / dataset_id / input_hash / output_hash +policy_id / policy_trace_schema_version / decision_contract_version +evaluation windows and metric definition versions +PBO / DSR / frozen OOS / double-cost / false-exit-reentry evidence +maker / checker / expiry / disposition +``` + +## Existing schedule mapping + +Do not add a new schedule until ADR/Issue approval. Use the existing contract entries as follows: + +| Existing job | Mode | Automated responsibility | Forbidden result | +|---|---|---|---| +| J25 SourceContractDriftCheck | EVALUATION_ONLY | detect source contract/license/SLA drift | no source activation | +| J26 MarketCalendarCompletenessCheck | EVALUATION_ONLY | detect calendar/timezone/unit gaps | no threshold mutation | +| J27 EvidenceChainAudit | EVALUATION_ONLY | validate lineage/hash/PIT chain | no evidence repair by overwrite | +| J28 ProjectionFreshnessCheck | EVALUATION_ONLY | validate read-model freshness | no client publication | +| J30 ReleaseEvidenceAssemble | PROPOSAL_ONLY | assemble a review packet | no release or activation | + +The missing business flow is not a new automatic promotion job. It is the contract and application boundary that creates a frozen dataset and proposal packet for the existing review process. + +## Repository catalog mapping + +The following mapping is grounded in the current catalog and data contracts. It is a design mapping, not an authorization to ingest. + +| Domain | Current catalog/source | Current logical tables/contracts | Automation entry condition | Current status | +|---|---|---|---|---| +| Market data | KRX OpenAPI | `market_data.prices`, `VS-03_DATA_CONTRACT.md` | source approval + calendar/unit/SLA + PIT/hash checks | CANDIDATE | +| Corporate/fundamental data | OpenDart API | `model_operations.disclosures`, `VS-05_DATA_CONTRACT.md` | license/redistribution approval + filing schema/DQ | CANDIDATE | +| Portfolio | User input | `portfolio.holdings`, `VS-04_DATA_CONTRACT.md` | authenticated owner input + audit + PIT | CANDIDATE | +| Model operations | computed/evaluation output | `evaluation.dataset_manifest`, `governance.model_version_registry`, `signal_engine.evidence_snapshot` | frozen dataset and approved model/config/code contract | BLOCKED until seed/approval | +| Shadow evaluation | Hangfire/shadow run | `model_operations.shadow_run`, result/evidence contracts | server-side VersionSet + EVALUATION_ONLY capability | BLOCKED until VersionSet | + +The source catalog's logical table descriptions must be reconciled with active runtime SQL and the live schema before a migration or ingestion implementation. The catalog itself is not a substitute for runtime schema evidence. + +## Existing debt and decision linkage + +This proposal directly addresses, but does not close, the following open items: + +- `TD-044`: approved Dataset Manifest and Model Registry initial data absent; +- `TD-063`: total-return/delisting/corporate-action golden data incomplete; +- `TD-099` / `TD-105`: market calendar/timezone source and SLA not approved; +- `TD-132`: current total-return source not approved; +- `DEC-037`, `DEC-038`, `DEC-079`: source/license/SLA and calendar ownership decisions required. + +These items remain OPEN/DECISION_REQUIRED until their evidence is attached. No automation job may treat the catalog row as approved merely because the row exists. + +## Proposed WBS decomposition (proposal only) + +These rows must be approved before being added to `WBS_MASTER.csv`: + +| Proposed ID | Scope | Acceptance evidence | +|---|---|---| +| AEG-X-009-P1 | Source allow-list and approval record | unapproved source cannot enter ingestion | +| AEG-X-009-P2 | Dataset manifest freeze command | same input produces same dataset/content hash; append-only | +| AEG-X-009-P3 | Server-side VersionSet resolver | client-supplied evidence/version values ignored | +| AEG-X-009-P4 | Evaluation/Proposal orchestration | idempotent JobRun/Watermark; modes fail closed | +| AEG-X-009-P5 | Human review packet/API/UI | maker-checker, expiry, reject, audit trail | +| AEG-X-009-P6 | Replay/failure/observability evidence | quarantine, replay hash, alert, runbook, rollback/stop evidence | + +## Gate progression + +| Gate | Required before next gate | +|---|---| +| G0 | contract, source owner, data semantics, WBS approval | +| G1 | approved source catalog + isolated fresh/upgrade/re-run rehearsal | +| G2 | frozen dataset + VersionSet resolver + golden/replay evidence | +| G3 | evaluation-only execution and EvidenceSnapshot proof | +| G4 | proposal packet + maker/checker review evidence | +| G5 | separate human change approval; no scheduler activation | + +## Immediate decision package + +Before code or migration work, approve these six values explicitly: + +1. source allow-list and owner/steward; +2. license, SLA, timezone, calendar, unit, and currency contracts; +3. dataset freeze status and retention policy; +4. model evaluation metric definition versions and population/window rules; +5. maker/checker roles and proposal expiry; +6. alert, stop, runbook, and secondary owner. + +Until these are approved, the correct behavior is `BLOCKED`/`QUARANTINED`, not synthetic data/model creation. diff --git a/docs/DECISIONS/ADR-DATA-001.md b/docs/DECISIONS/ADR-DATA-001.md new file mode 100644 index 00000000..ab2cdfc4 --- /dev/null +++ b/docs/DECISIONS/ADR-DATA-001.md @@ -0,0 +1,89 @@ +# ADR-DATA-001: Governed Source Approval and Dataset Freeze Pipeline + +## Status + +`APPROVED` — approved by the repository owner on 2026-08-06 for the Source Approval contract slice. Implementation remains limited to append-only governance records; model activation, orders, and KIS submission remain forbidden. + +## WBS / contract traceability + +- WBS: `AEG-X-009` +- Requirement: `REQ-DATA-SOURCE` +- Existing contracts: `contracts/schedules/model-operations.v3.json`, `contracts/schedules/execution-assurance.v1.json` +- Related proposal: `docs/CURRENT/AEG-X-009_AUTOMATION_PROPOSAL.md` +- Policy boundary: `EVALUATION_ONLY` / `PROPOSAL_ONLY` / `DRILL_ONLY` + +## Context + +The live database contains the model-operations schemas, but no approved/frozen `dataset_manifest`, model registry, EvidenceSnapshot, or release bundle records. The source catalog previously claimed operational approval without preserving the required owner, license, SLA, timezone, unit, and approval evidence. This prevents a compliant Phase 1 VersionSet from being resolved. + +## Decision proposal + +Introduce a governed, append-only approval boundary before ingestion or evaluation: + +```text +SourceCandidate + -> SourceApproval (human owner/steward + contract evidence) + -> DatasetManifest (immutable content/lineage hash) + -> DatasetFreeze (human approval or approved governance command) + -> ServerSideVersionSetResolver + -> EvaluationOnly / ProposalOnly operation +``` + +The resolver must reject any source or dataset that is not approved and frozen. The client cannot supply authoritative evidence, hashes, model/config/code versions, or contract versions. + +## Proposed data boundary + +The implementation may add normalized append-only records only after this ADR is approved. Candidate records must include: + +```text +source_id, source_version, owner, steward, license_reference, +availability_sla, freshness_sla, timezone, calendar, unit, currency, +schema_contract_version, status, approved_by, approved_at, +published_at, revision, content_hash, lineage_hash +``` + +No update/delete is permitted for approval, evidence, or freeze history. Corrections are new records/events. + +## Automation boundary + +Allowed: + +- source contract drift checks; +- data-quality evaluation; +- immutable manifest creation; +- deterministic dataset freeze proposal; +- EvidenceSnapshot creation; +- proposal packet and maker/checker notification. + +Forbidden: + +- automatic model activation/promotion; +- automatic rollback; +- threshold/config/policy/code mutation; +- client publication; +- broker order or KIS submission. + +## Acceptance evidence required before implementation is complete + +1. Unapproved source cannot enter ingestion. +2. Approved source with missing license/SLA/timezone/unit is quarantined. +3. Dataset freeze is append-only and content-addressed. +4. Same input and VersionSet produce the same manifest/evaluation hash. +5. Client-supplied VersionSet/evidence is ignored or rejected. +6. Replay with the same scope/idempotency/watermark produces no duplicate side effect. +7. Proposal approval is maker/checker and does not activate a model. +8. Failure, alert, runbook, retention, and rollback/stop evidence are preserved. + +## Alternatives rejected + +- Trusting `source-catalog.md` as approval: no immutable approval evidence. +- Creating synthetic DatasetId/ModelVersion values to unblock Shadow Run: violates evidence and reproducibility rules. +- Reusing existing model-operation tables without an approval boundary: permits ambiguous ownership and incomplete lineage. +- Adding a scheduler that activates models: forbidden by AGENTS.md v12.4. + +## Approval record + +- Decision: APPROVED for the first Source Approval contract slice. +- Scope: append-only source approval record and validation boundary only. +- Explicit exclusions: dataset freeze execution, model activation, automatic promotion/rollback, threshold mutation, client publication, broker order, and KIS submission. +- Follow-up: Dataset Freeze requires a separate reviewed slice and evidence package. diff --git a/evidence/AEG-X-009/0033-migration-rehearsal.md b/evidence/AEG-X-009/0033-migration-rehearsal.md new file mode 100644 index 00000000..e5e6d9bd --- /dev/null +++ b/evidence/AEG-X-009/0033-migration-rehearsal.md @@ -0,0 +1,30 @@ +# AEG-X-009 Source Approval Migration Rehearsal + +## Traceability + +- WBS: `AEG-X-009` +- ADR: `ADR-DATA-001` / `DEC-101` +- Migration: `db/migrations/0033_source_approval_contract.sql` +- Target: isolated `kartsell_migration_test` +- Production `kartselldb`: not modified + +## Actual execution evidence + +```text +Command: dotnet src/KArtSell.DbMigrator/bin/Release/net10.0/KArtSell.DbMigrator.dll +Target: Host=127.0.0.1;Port=5432;Database=kartsell_migration_test + +Fresh run: +0032_shadow_run_queued_status_contract.sql -> executed +0033_source_approval_contract.sql -> executed +Upgrade successful +Exit code: 0 + +Re-run: +No new scripts need to be executed - completing. +Exit code: 0 +``` + +## Boundary + +This proves migration fresh/re-run behavior only. It does not authorize any source, create a Dataset Manifest, resolve a model VersionSet, activate a model, publish to clients, submit an order, or submit to KIS. diff --git a/evidence/AEG-X-009/0034-dataset-freeze-rehearsal.md b/evidence/AEG-X-009/0034-dataset-freeze-rehearsal.md new file mode 100644 index 00000000..0b1fabf9 --- /dev/null +++ b/evidence/AEG-X-009/0034-dataset-freeze-rehearsal.md @@ -0,0 +1,24 @@ +# AEG-X-009 Dataset Freeze Contract Rehearsal + +## Traceability + +- WBS: `AEG-X-009` +- ADR: `ADR-DATA-001` / `DEC-101` +- Migration: `db/migrations/0034_dataset_manifest_freeze_contract.sql` +- Target: isolated `kartsell_migration_test` +- Production `kartselldb`: not modified + +## Actual execution evidence + +```text +DbMigrator upgrade: 0034_dataset_manifest_freeze_contract.sql executed, exit code 0 +DbMigrator re-run: No new scripts need to be executed, exit code 0 +Journal: 0034_dataset_manifest_freeze_contract.sql present +Status constraint: PROPOSED, APPROVED, FROZEN, QUARANTINED, RETIRED +Frozen approval constraint: FROZEN requires approved_by, approved_at, frozen_at +Append-only trigger: dataset_manifest_no_update present +``` + +## Boundary + +This rehearsal validates schema and migration behavior only. No dataset row was seeded, no source was authorized, no VersionSet was resolved, and no model evaluation or Shadow Run was started. diff --git a/evidence/AEG-X-009/automation-boundary.trx b/evidence/AEG-X-009/automation-boundary.trx new file mode 100644 index 00000000..4909fba3 --- /dev/null +++ b/evidence/AEG-X-009/automation-boundary.trx @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 10.0.10) +[xUnit.net 00:00:00.41] Discovering: KArtSell.ModelOperations.UnitTests +[xUnit.net 00:00:00.52] Discovered: KArtSell.ModelOperations.UnitTests +[xUnit.net 00:00:00.59] Starting: KArtSell.ModelOperations.UnitTests +[xUnit.net 00:00:00.71] Finished: KArtSell.ModelOperations.UnitTests + + + + \ No newline at end of file diff --git a/evidence/AEG-X-009/source-approval-architecture.trx b/evidence/AEG-X-009/source-approval-architecture.trx new file mode 100644 index 00000000..5a0bf82c --- /dev/null +++ b/evidence/AEG-X-009/source-approval-architecture.trx @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 10.0.10) +[xUnit.net 00:00:00.14] Discovering: KArtSell.ArchitectureTests +[xUnit.net 00:00:00.19] Discovered: KArtSell.ArchitectureTests +[xUnit.net 00:00:00.23] Starting: KArtSell.ArchitectureTests +[xUnit.net 00:00:01.53] Finished: KArtSell.ArchitectureTests + + + + \ No newline at end of file diff --git a/evidence/AEG-X-009/versionset-resolver-boundary.md b/evidence/AEG-X-009/versionset-resolver-boundary.md new file mode 100644 index 00000000..067ddf80 --- /dev/null +++ b/evidence/AEG-X-009/versionset-resolver-boundary.md @@ -0,0 +1,20 @@ +# AEG-X-009 Server-side VersionSet Resolver + +## Traceability + +- WBS: `AEG-X-009` +- Contract: `src/KArtSell.BuildingBlocks/Versioning/VersionSet.cs` +- Implementation: `src/KArtSell.Modules.ModelOperations/Infrastructure/DapperApprovedModelContextReader.cs` +- Test evidence: `evidence/AEG-X-009/versionset-resolver-boundary.trx` + +## Change + +The resolver now selects dataset manifests in `APPROVED` or `FROZEN` state only, requires dataset approval fields, and requires model registry approval fields. It continues to load all authoritative VersionSet values from the server-side database; client evidence/version values are not accepted. + +## Verification + +```text +Model Operations boundary tests: 6/6 passed +``` + +No dataset/model rows were seeded and no operation request or Shadow Run was created. diff --git a/evidence/AEG-X-009/versionset-resolver-boundary.trx b/evidence/AEG-X-009/versionset-resolver-boundary.trx new file mode 100644 index 00000000..97fad290 --- /dev/null +++ b/evidence/AEG-X-009/versionset-resolver-boundary.trx @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 10.0.10) +[xUnit.net 00:00:00.31] Discovering: KArtSell.ModelOperations.UnitTests +[xUnit.net 00:00:00.39] Discovered: KArtSell.ModelOperations.UnitTests +[xUnit.net 00:00:00.43] Starting: KArtSell.ModelOperations.UnitTests +[xUnit.net 00:00:00.52] Finished: KArtSell.ModelOperations.UnitTests + + + + \ No newline at end of file