Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b78560e326 | ||
|
|
76cd45c8db | ||
|
|
6e71bfd202 | ||
|
|
8e6547659c | ||
|
|
794881e18b | ||
|
|
ac6f696f19 | ||
|
|
84225828bd | ||
|
|
e8ddf82040 | ||
|
|
6a181aa5d7 | ||
|
|
c08ca9c22d | ||
|
|
8015f8a2ef | ||
|
|
15e9b6cd70 | ||
|
|
f3760d2115 | ||
|
|
105cf37d12 |
No files matched your search
@@ -1,3 +1,3 @@
|
||||
# corp-v1-channel-uat
|
||||
# channel-uat-skic
|
||||
|
||||
Govern UAT execution against exact deployed revisions.
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: corp-v1-channel-uat
|
||||
name: channel-uat-skic
|
||||
description: Use when validating a deployed Corp v1 environment through UAT journeys.
|
||||
version: 1.1.0
|
||||
version: 1.4.1
|
||||
author: Hermes Agent
|
||||
license: MIT
|
||||
metadata:
|
||||
@@ -9,7 +9,7 @@ metadata:
|
||||
tags: [corp-v1, discord, channel, uat, e2e, playwright, acceptance]
|
||||
---
|
||||
|
||||
# Corp v1 UAT Channel
|
||||
# SKIC Uat Channel Reference
|
||||
|
||||
|
||||
## Hermes Kanban direct-link contract
|
||||
@@ -42,13 +42,14 @@ If any identity is mutable, missing, or contradictory, record `BLOCKED` rather t
|
||||
|
||||
## Responsibilities
|
||||
|
||||
1. Maintain a dedicated pnpm E2E repository with versioned journeys.
|
||||
2. Execute journeys against the exact deployed environment supplied by Delivery.
|
||||
3. Collect machine-readable and human-reviewable evidence.
|
||||
4. Distinguish product failures, environment failures, and test defects.
|
||||
5. Return product/environment failures to Kanban and Delivery with reproducible evidence.
|
||||
6. Rerun the affected journey set after a verified redeployment.
|
||||
7. Hand a `UAT_PASSED` or `UAT_FAILED` verdict to Releases without implying release approval.
|
||||
1. Maintain a dedicated pnpm E2E repository as the authoritative home for functional non-unit tests and their fixtures, configuration, runner, and evidence contract.
|
||||
2. Keep application image/container/Helm build, rendering, publication, and static artifact validation in Delivery. The E2E repository must not build/publish application images, install Helm, render charts, or validate artifact publication.
|
||||
3. Execute source-coupled functional non-unit suites against an exact application-source checkout and black-box journeys against the exact deployed environment supplied by Delivery.
|
||||
4. Collect machine-readable and human-reviewable evidence.
|
||||
5. Distinguish product failures, environment failures, and test defects.
|
||||
6. Return product/environment failures to Kanban and Delivery with reproducible evidence.
|
||||
7. Rerun the affected journey set after a verified redeployment.
|
||||
8. Hand a `UAT_PASSED` or `UAT_FAILED` verdict to Releases without implying release approval.
|
||||
|
||||
## Required E2E repository pipeline
|
||||
|
||||
@@ -58,17 +59,19 @@ Every project UAT repository uses two Gitea Actions workflows:
|
||||
non-default branch push
|
||||
└── CI / Change Validation
|
||||
├── repository validation for every exact pushed commit
|
||||
└── smoke journeys only when that commit is an open PR head
|
||||
└── smoke journeys for explicit PR events or exact review-associated commits
|
||||
|
||||
merge to the default `test` branch
|
||||
└── UAT / Integrated Regression
|
||||
├── repository validation
|
||||
├── smoke journeys
|
||||
├── complete regression journeys
|
||||
└── immutable deployment-tuple evidence
|
||||
└── structured regression evidence
|
||||
```
|
||||
|
||||
Use one change workflow for both pre-PR branches and PR heads. A PR-open or PR-reopen event adds the first smoke-bearing run. Do not subscribe that workflow to `pull_request.synchronize`; later branch pushes are the single trigger and classify whether the exact commit is an open PR head. Cancel superseded runs for the same branch. Never run full regression on a PR, and never treat smoke as complete UAT. The integrated workflow runs only for the exact commit pushed to `test`, fails closed when its frozen deployment inputs are missing or unhealthy, and does not deploy or publish application artifacts.
|
||||
Use one change workflow for both pre-PR branches and PR heads. A PR-open or PR-reopen event adds the first smoke-bearing run. Do not subscribe that workflow to `pull_request.synchronize`; later branch pushes are the single trigger and compare the exact commit with Gitea pull-request head refs without exposing a broad API token to candidate-controlled code. Gitea retains those refs after closure, so an unchanged closed-PR head may conservatively receive smoke again; a new branch-only commit receives repository validation only. Cancel superseded change runs for the same branch. Never run full regression on a PR, and never treat smoke as complete UAT.
|
||||
|
||||
Integrated regression runs only for exact commits pushed to `test`; they queue rather than cancel one another so every merged commit receives a result. This automatic run proves the integrated journey set against the configured non-production URL but does not issue `UAT_PASSED`. A release-facing UAT verdict requires a separately frozen Delivery handoff plus pre-run and post-run live verification of application commit, image digests, deployable GitOps commit, Argo CD revision/sync/health, environment, and base URL. Neither workflow deploys or publishes application artifacts.
|
||||
|
||||
## UAT verdicts
|
||||
|
||||
@@ -124,7 +127,18 @@ UAT must not modify product requirements, application behavior, deployment desir
|
||||
|
||||
## References
|
||||
|
||||
Review provenance and exclusions: [AeroSim lessons review](references/aerosim-lessons-review.md).
|
||||
|
||||
- [Journey repository contract](references/journey-repository-contract.md)
|
||||
- [Deployment evidence contract](references/deployment-evidence-contract.md)
|
||||
- [Defect and retest workflow](references/defect-and-retest-workflow.md)
|
||||
- [Status and reporting](references/status-and-reporting.md)
|
||||
|
||||
## Canonical naming and compatibility
|
||||
|
||||
- Canonical installed and repository name: `channel-uat-skic`.
|
||||
- Source: `https://gitea.lego-cloud.eu/home-v1-skills-code-agent/channel-uat-skic`.
|
||||
- Previous name: `corp-v1-channel-uat`; retained locally only as a compatibility alias. New guidance and presentations use the canonical name.
|
||||
- Naming-only migration authorized by RootAtSkic in [presentation message 1562523679223578705](https://discord.com/channels/1518726359512387766/1543922127898415154/1562523679223578705). Repository ID, history, support files, project authority and organization ownership are preserved.
|
||||
- This is a reusable central reference, not a new shared Discord channel. Project adoptions use `channel-uat-skic-<code>` and remain separately owned.
|
||||
- Current project channel: `<code>-uat` inside `skic-<code>`.
|
||||
@@ -0,0 +1,34 @@
|
||||
# AeroSim lessons review — UAT
|
||||
|
||||
## Immutable sources
|
||||
|
||||
AeroSim UAT source SHA: `f07f457bf6debeb16cdf79ab10dac193d0f6d69c`. Central baseline: `8e6547659cd7019a445c8b4b061e61a3a7b79b8b`.
|
||||
- [SKILL.md](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent/channel-uat-skic-aerosim/src/commit/f07f457bf6debeb16cdf79ab10dac193d0f6d69c/SKILL.md)
|
||||
- [references/exact-deployment-evidence.md](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent/channel-uat-skic-aerosim/src/commit/f07f457bf6debeb16cdf79ab10dac193d0f6d69c/references/exact-deployment-evidence.md)
|
||||
- [references/journey-repository-and-execution.md](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent/channel-uat-skic-aerosim/src/commit/f07f457bf6debeb16cdf79ab10dac193d0f6d69c/references/journey-repository-and-execution.md)
|
||||
- [references/defect-return-and-retest.md](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent/channel-uat-skic-aerosim/src/commit/f07f457bf6debeb16cdf79ab10dac193d0f6d69c/references/defect-return-and-retest.md)
|
||||
- [references/reporting-and-release-handoff.md](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent/channel-uat-skic-aerosim/src/commit/f07f457bf6debeb16cdf79ab10dac193d0f6d69c/references/reporting-and-release-handoff.md)
|
||||
|
||||
Read the full source skill and all four references against the central skill and its four references. Relevant sections: **Entry gate from Delivery**, **E2E Gitea Actions contract**, **Handoff packet**, **Exact deployment evidence**, and **Defect return and retest**.
|
||||
|
||||
## Promoted lessons
|
||||
|
||||
- A template commit is provenance, not proof of the rendered deployment. Require timestamped pre/post live identity and health; distinguish root/runtime sources and invalidate mixed-deployment results.
|
||||
- Reconcile the complete required journey/browser matrix rather than accepting a partial run; keep E2E revision and verified receipt in reporting.
|
||||
- Accept only ordinary-user-path evidence, with meaningful runtime outcomes. Infrastructure health and bypass-assisted navigation cannot prove product acceptance.
|
||||
- Existing two-workflow, secret-handling, retest, and lifecycle separation contracts already cover the source; preserve rather than duplicate them.
|
||||
|
||||
## Runtime drift reviewed
|
||||
|
||||
Installed UAT `SKILL.md` SHA-256: `0167e17bf5f254c359ea311b21b0b94a8a24db9d33b0635afa3e6a2b0b311d9b`; installed `references/journey-repository-and-execution.md` SHA-256: `0fef75fdd1d6eaa861f40810fbcbe1f0a3e75d16e7c76d1ad91da8f8e556e291`. Runtime board reassignment and standing authority are local overlays, not central defaults. The runtime journey reference omits artifact-validation exclusions present in Git; preserve the newer source boundary.
|
||||
|
||||
Ordinary-interaction acceptance is a cross-channel lesson from installed AeroSim Releases **Post-Approval and Deployment Evidence**, SHA-256 `feac09e2515486abc35a5b127525ec3a13ca97d47f12b32cf68e434c50df9ece`. This supplementary local content is not attributed to the pinned source; the related immutable Releases baseline is:
|
||||
- [SKILL.md](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent/channel-releases-skic-aerosim/src/commit/3c4b4788915bae3d89303959c46a8854c9a141bc/SKILL.md)
|
||||
|
||||
## Exclusions
|
||||
|
||||
No project rollout, runtime overwrite, owner reassignment, branch naming change, Jira mandate, standing merge/deploy delegation, account recovery, board/channel IDs, endpoint, scheduler cadence, or deployment configuration is promoted. Central authority and project overlays remain unchanged. The newer central functional-non-unit versus build-time artifact-validation split is retained; runtime references that send Helm artifact validation to UAT are stale and are not imported.
|
||||
|
||||
## Verification
|
||||
|
||||
Run `python3 -B -m unittest discover -s tests -v` from this repository, plus `git diff --check`. Tests validate the published documentation contract and links offline; they do not prove a deployment or live acceptance run.
|
||||
@@ -12,7 +12,9 @@ cluster_environment
|
||||
base_url
|
||||
```
|
||||
|
||||
Before execution, assert that the Argo CD application is synchronized to the declared GitOps commit and healthy. Where the environment exposes a version endpoint, compare its source/image identity with the handoff.
|
||||
The template commit is provenance, not the deployed revision. Resolve the rendered desired-state repository and environment from the handoff; a production revision cannot substitute for the declared non-production deployment.
|
||||
|
||||
Read live identity and health before and after execution, retaining both timestamped snapshots. For app-of-apps or multi-source deployments, record root and runtime controller identities separately: compare the root to the rendered Git revision and each child/source to its declared chart version or source revision, not blindly to the same Git SHA. Require synchronized, healthy state and compare pod image IDs plus exposed source/chart annotations or version endpoints to the immutable artifacts in the handoff.
|
||||
|
||||
Reject the handoff when:
|
||||
|
||||
@@ -22,4 +24,4 @@ Reject the handoff when:
|
||||
- the base URL resolves to a different environment;
|
||||
- a newer synchronization occurs after the run begins.
|
||||
|
||||
If deployment identity changes during execution, end the run as invalidated and start a new run after the new identity is frozen.
|
||||
If deployment identity changes during execution, end the run as invalidated and start a new run after the new identity is frozen; never combine results across deployment tuples. Missing post-run identity or health evidence blocks a release-facing pass.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Journey repository contract
|
||||
|
||||
The UAT repository is a standalone pnpm/Playwright project. It contains no Kubernetes, Helm, Argo CD, application implementation, image publication, or deployment logic.
|
||||
The UAT repository is a standalone pnpm/Playwright project and the authoritative home for functional non-unit tests. It may contain source-coupled integration, browser, database-backed, performance, acceptance, and deployed-environment suites. It contains no application implementation, image/container publication validation, Helm installation/rendering, deployable Kubernetes/Helm desired state, image publication, Argo CD mutation, or deployment logic.
|
||||
|
||||
## Required baseline
|
||||
|
||||
@@ -23,6 +23,8 @@ A smaller standalone repository may keep `journeys/`, `fixtures/`, `helpers/`, a
|
||||
## Journey rules
|
||||
|
||||
- Stable journey IDs appear in test titles and evidence.
|
||||
- Declare the required journey/browser matrix before execution and reconcile every cell with the final report. Missing, skipped, interrupted, or artifact-less required cells cannot support `UAT_PASSED`.
|
||||
- Use visible controls and ordinary user interactions for acceptance. Forced clicks, hidden controls, direct state/DOM mutation, or API bypasses are diagnosis, not acceptance evidence. Assert the meaningful runtime outcome over a requirement-appropriate observation period, not only route loading or a clean console; a blocking warning or unusable state fails the journey.
|
||||
- `UAT_BASE_URL` is required; no production-looking default is embedded.
|
||||
- Authentication is loaded from runtime secrets and never persisted in committed storage-state files.
|
||||
- Retries are explicit and low; a retry cannot turn a flaky first failure into an undisclosed pass.
|
||||
@@ -36,7 +38,7 @@ A smaller standalone repository may keep `journeys/`, `fixtures/`, `helpers/`, a
|
||||
non-default branch push
|
||||
└── CI / Change Validation
|
||||
├── formatting, linting, type checks, contract tests, journey discovery, build when applicable
|
||||
└── smoke journeys only when the exact commit is an open PR head
|
||||
└── smoke journeys for explicit PR events or exact review-associated commits
|
||||
|
||||
PR opened or reopened
|
||||
└── CI / Change Validation
|
||||
@@ -48,9 +50,9 @@ push to test after merge
|
||||
├── exact integrated-commit validation
|
||||
├── smoke journeys
|
||||
├── complete regression journeys
|
||||
└── deployment-bound evidence validation and upload
|
||||
└── structured regression evidence upload
|
||||
```
|
||||
|
||||
Use one change workflow rather than separate branch and PR workflow files. It subscribes to non-default `push` plus `pull_request` `opened` and `reopened`, but not `synchronize`; later branch pushes are the single trigger. The workflow detects whether the exact pushed commit is an open PR head and conditionally adds smoke. Cancel superseded runs for the same branch and expose one required aggregate result.
|
||||
Use one change workflow rather than separate branch and PR workflow files. It subscribes to non-default `push` plus `pull_request` `opened` and `reopened`, but not `synchronize`; later branch pushes are the single trigger. The classification job compares the exact commit with Gitea pull-request head refs without exposing a broad API token to candidate-controlled code. Because Gitea retains those refs after closure, an unchanged closed-PR head may conservatively receive smoke again; a new branch-only commit receives repository validation only. Cancel superseded change runs for the same branch and expose one required aggregate result.
|
||||
|
||||
The integrated workflow runs only on `push` to `test`. It requires an exact frozen deployment tuple, healthy synchronized Argo CD state, explicit non-production base URL, and runtime-only authentication when the regression set requires it. Missing or contradictory inputs fail closed. Smoke is not complete UAT, and full regression does not run on a PR.
|
||||
The integrated workflow runs only on `push` to `test` and queues instead of cancelling older integrated commits. It requires an explicit non-production base URL and runtime-only authentication when the regression set requires it. Its artifacts are integrated regression evidence, not a release-facing UAT verdict. `UAT_PASSED` additionally requires the project UAT procedure to verify the immutable Delivery deployment tuple live before and after the run. Smoke is not complete UAT, and full regression does not run on a PR.
|
||||
@@ -6,7 +6,7 @@ Recommended update:
|
||||
|
||||
```markdown
|
||||
## UAT result — <VERDICT>
|
||||
- Run: <run ID>
|
||||
- Run: <run ID and exact E2E commit>
|
||||
- Environment: <name and base URL>
|
||||
- Deployment: app <commit>; images <digests>; GitOps <commit>; Argo CD <sync/health>
|
||||
- Journeys: <passed>/<failed>/<skipped>; <browser matrix>
|
||||
@@ -15,4 +15,6 @@ Recommended update:
|
||||
- Next action: <one owner and action>
|
||||
```
|
||||
|
||||
Retain the mapped destination and verified handoff receipt; reuse the existing handoff identity on retry rather than duplicating work. A summary in the source channel alone does not prove receipt.
|
||||
|
||||
Never say “released,” “production-ready,” or “DONE” from a UAT pass alone. Releases owns promotion and final release status.
|
||||
@@ -0,0 +1,60 @@
|
||||
"""Offline regression tests for the channel's published prose contract."""
|
||||
from pathlib import Path
|
||||
import re
|
||||
import unittest
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
class LessonsContract(unittest.TestCase):
|
||||
def test_review_provenance_and_link(self):
|
||||
review = ROOT / "references/aerosim-lessons-review.md"
|
||||
self.assertTrue(review.is_file())
|
||||
text = review.read_text()
|
||||
self.assertRegex(text, r"/src/commit/[0-9a-f]{40}/")
|
||||
self.assertIn("## Exclusions", text)
|
||||
self.assertIn("aerosim-lessons-review.md", (ROOT / "SKILL.md").read_text())
|
||||
|
||||
def test_local_markdown_links_resolve(self):
|
||||
for path in [ROOT / "SKILL.md", *ROOT.glob("references/*.md")]:
|
||||
for target in re.findall(r"\]\(([^)]+)\)", path.read_text()):
|
||||
if "://" not in target and not target.startswith(("#", "<")):
|
||||
self.assertTrue((path.parent / target.split("#")[0]).is_file(), (path, target))
|
||||
|
||||
def test_no_project_authority_transplant(self):
|
||||
for path in [ROOT / "SKILL.md", *ROOT.glob("references/*.md")]:
|
||||
if path.name == "aerosim-lessons-review.md":
|
||||
continue
|
||||
text = path.read_text()
|
||||
for forbidden in ("jarvis-at-skic", "aerosim-dev.apps", "AEROSIM_STANDING", "1537388451501056081"):
|
||||
self.assertNotIn(forbidden, text)
|
||||
|
||||
def test_contract_0(self):
|
||||
text = (ROOT / 'references/deployment-evidence-contract.md').read_text()
|
||||
self.assertIn('template commit is provenance', text)
|
||||
self.assertIn('before and after', text)
|
||||
self.assertIn('root and runtime', text)
|
||||
self.assertIn('never combine results', text)
|
||||
|
||||
def test_contract_1(self):
|
||||
text = (ROOT / 'references/journey-repository-contract.md').read_text()
|
||||
self.assertIn('ordinary user interactions', text)
|
||||
self.assertIn('diagnosis, not acceptance', text)
|
||||
self.assertIn('required journey/browser matrix', text)
|
||||
|
||||
def test_contract_2(self):
|
||||
text = (ROOT / 'SKILL.md').read_text()
|
||||
self.assertIn('version: 1.4.1', text)
|
||||
|
||||
def test_preserved_ownership_and_invalidation(self):
|
||||
repo = (ROOT / "references/journey-repository-contract.md").read_text()
|
||||
evidence = (ROOT / "references/deployment-evidence-contract.md").read_text()
|
||||
reporting = (ROOT / "references/status-and-reporting.md").read_text()
|
||||
self.assertIn("Helm installation/rendering", repo)
|
||||
self.assertIn("cannot support `UAT_PASSED`", repo)
|
||||
self.assertIn("Missing post-run identity or health evidence blocks", evidence)
|
||||
self.assertIn("verified handoff receipt", reporting)
|
||||
self.assertIn("exact E2E commit", reporting)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user