Compare commits

..
Author SHA1 Message Date
admin b2c1dba964 Merge pull request 'ci: concurrency enligt N6 (jobbstorm 2026-11-10)' (#555) from ci/concurrency-2026-11-10 into main
CI (SIAX Cloud) / Component conformance (blocking) (push) Successful in 7s
masterplan-lock / check (push) Successful in 7s
CI (SIAX Cloud) / security (push) Successful in 24s
security / scan (push) Failing after 21s
CI (SIAX Cloud) / integration (push) Successful in 1m38s
CI (SIAX Cloud) / sonar (push) Successful in 1m39s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Successful in 1m53s
CI (SIAX Cloud) / quality (push) Successful in 2m15s
Deploy to Coolify / deploy (push) Successful in 2m18s
Mergad efter gröna required checks (Simons beslut 2026-11-10: godkännandekravet förbigås).
2026-11-10 20:35:15 +00:00
Claude CodeandClaude Opus 5.5 9c96dca5fb ci: concurrency enligt N6 (jobbstorm 2026-11-10)
CI (SIAX Cloud) / sonar (pull_request) Skipped
masterplan-lock / check (pull_request) Successful in 4s
CI (SIAX Cloud) / Component conformance (blocking) (pull_request) Successful in 8s
CI (SIAX Cloud) / security (pull_request) Successful in 21s
security / scan (pull_request) Failing after 18s
CI (SIAX Cloud) / integration (pull_request) Successful in 1m14s
CI (SIAX Cloud) / quality (pull_request) Successful in 2m21s
CI/test/lint-workflows: concurrency med cancel-in-progress: true.
Deploy/release-workflows: concurrency med cancel-in-progress: false (bara köa).
Där push saknade grenfilter och pull_request fanns: push begränsad till main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:23:09 +01:00
admin 1afcfdd703 fix(ci): gitleaks blockerar pa arbetstradet, misconfig och historik informativt
CI (SIAX Cloud) / security (push) Successful in 29s
CI (SIAX Cloud) / Component conformance (blocking) (push) Successful in 23s
security / scan (push) Failing after 42s
CI (SIAX Cloud) / sonar (push) Successful in 1m59s
CI (SIAX Cloud) / integration (push) Successful in 2m13s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Successful in 3m20s
Deploy to Coolify / deploy (push) Successful in 4m20s
CI (SIAX Cloud) / quality (push) Successful in 12m10s
CI (SIAX Cloud) / quality (pull_request) Canceled after 0s
CI (SIAX Cloud) / integration (pull_request) Canceled after 0s
CI (SIAX Cloud) / security (pull_request) Canceled after 0s
CI (SIAX Cloud) / sonar (pull_request) Canceled after 0s
CI (SIAX Cloud) / Component conformance (blocking) (pull_request) Canceled after 0s
security / scan (pull_request) Canceled after 0s
masterplan-lock / check (push) Successful in 4s
masterplan-lock / check (pull_request) Successful in 4s
2026-11-10 20:41:25 +01:00
admin 4284a3a39b fix(ci): härdat security-workflow
CI (SIAX Cloud) / security (push) Successful in 46s
CI (SIAX Cloud) / Component conformance (blocking) (push) Successful in 41s
CI (SIAX Cloud) / sonar (push) Successful in 3m15s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Successful in 3m14s
Deploy to Coolify / deploy (push) Successful in 3m35s
security / scan (push) Failing after 3m26s
CI (SIAX Cloud) / quality (push) Successful in 4m3s
CI (SIAX Cloud) / integration (push) Successful in 11m17s
CI (SIAX Cloud) / sonar (pull_request) Skipped
masterplan-lock / check (pull_request) Successful in 5s
masterplan-lock / check (push) Successful in 9s
CI (SIAX Cloud) / Component conformance (blocking) (pull_request) Successful in 12s
security / scan (pull_request) Failing after 49s
CI (SIAX Cloud) / security (pull_request) Successful in 1m52s
CI (SIAX Cloud) / integration (pull_request) Successful in 10m33s
CI (SIAX Cloud) / quality (pull_request) Successful in 11m52s
2026-11-10 16:57:44 +00:00
admin 0cb603fc62 fix(ci): härdat security-workflow - pinnade scannrar, volym och bara fynd blockerar
CI (SIAX Cloud) / sonar (pull_request) Skipped
masterplan-lock / check (push) Successful in 11s
masterplan-lock / check (pull_request) Successful in 11s
CI (SIAX Cloud) / Component conformance (blocking) (pull_request) Successful in 17s
CI (SIAX Cloud) / security (pull_request) Successful in 43s
security / scan (pull_request) Failing after 1m12s
CI (SIAX Cloud) / integration (pull_request) Successful in 10m3s
CI (SIAX Cloud) / quality (pull_request) Successful in 12m32s
2026-11-10 17:18:54 +01:00
admin 5b3cda802f fix(security): pinna canary-raden även i squash-commit 829150fd (#552)
CI (SIAX Cloud) / Component conformance (blocking) (push) Successful in 7s
masterplan-lock / check (push) Successful in 7s
CI (SIAX Cloud) / security (push) Successful in 31s
Security Scan (SIAX Cloud) / security (push) Successful in 37s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Successful in 1m12s
Deploy to Coolify / deploy (push) Successful in 1m44s
CI (SIAX Cloud) / sonar (push) Successful in 1m47s
CI (SIAX Cloud) / integration (push) Successful in 10m32s
CI (SIAX Cloud) / quality (push) Successful in 11m24s
Co-authored-by: sax3l <simon@siax.io>
2026-11-10 15:30:57 +00:00
admin 8be19c4b56 Merge pull request 'fix(estate): reconnect main history after orphan docs(production) commit' (#551) from fix/reconnect-main-history into main
Deploy to Coolify / deploy (push) Canceled after 0s
CI (SIAX Cloud) / quality (push) Canceled after 0s
CI (SIAX Cloud) / integration (push) Canceled after 0s
CI (SIAX Cloud) / security (push) Canceled after 0s
CI (SIAX Cloud) / sonar (push) Canceled after 0s
CI (SIAX Cloud) / Component conformance (blocking) (push) Canceled after 0s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Canceled after 0s
Security Scan (SIAX Cloud) / security (push) Canceled after 0s
masterplan-lock / check (push) Successful in 23s
2026-11-10 15:28:46 +00:00
adminandClaude Opus 5.5 ffa9ca68eb fix(estate): reconnect main history after orphan docs(production) commit
CI (SIAX Cloud) / sonar (pull_request) Skipped
masterplan-lock / check (push) Successful in 5s
masterplan-lock / check (pull_request) Successful in 5s
CI (SIAX Cloud) / Component conformance (blocking) (pull_request) Successful in 10s
Security Scan (SIAX Cloud) / security (pull_request) Successful in 17s
CI (SIAX Cloud) / integration (pull_request) Successful in 48s
CI (SIAX Cloud) / security (pull_request) Successful in 1m27s
CI (SIAX Cloud) / quality (pull_request) Successful in 12m9s
The docs(production) publishing sweep (2026-11-10) pushed main as a parentless commit, detaching 1230 commits of history. This merge keeps the current tree byte-for-byte and adds the last pre-orphan tip 2a253bdb66 (from the origin/main reflog of a local clone) as a second parent, so the history is an ancestor of main again without a force-push.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 16:20:57 +01:00
siax-estate-bot 20911a399f chore(source-bundle+evidence): registrera FAKTISKT deployad commit 829150fd04 (app 0pt, deployed 2026-11-10T10:04:54Z) + deploy-log-evidens — estate-kampanj issue #76
CI (SIAX Cloud) / Component conformance (blocking) (push) Successful in 23s
Security Scan (SIAX Cloud) / security (push) Failing after 23s
CI (SIAX Cloud) / security (push) Successful in 29s
CI (SIAX Cloud) / sonar (push) Successful in 1m55s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Successful in 5m7s
Deploy to Coolify / deploy (push) Successful in 5m12s
CI (SIAX Cloud) / integration (push) Successful in 10m56s
CI (SIAX Cloud) / quality (push) Successful in 12m13s
CI (SIAX Cloud) / sonar (pull_request) Skipped
masterplan-lock / check (pull_request) Successful in 6s
masterplan-lock / check (push) Successful in 8s
CI (SIAX Cloud) / Component conformance (blocking) (pull_request) Successful in 10s
CI (SIAX Cloud) / security (pull_request) Successful in 17s
Security Scan (SIAX Cloud) / security (pull_request) Successful in 17s
CI (SIAX Cloud) / integration (pull_request) Successful in 58s
CI (SIAX Cloud) / quality (pull_request) Successful in 10m3s
2026-11-10 11:17:45 +01:00
admin 829150fd04 docs(production): standardiserad produktionsberedskap och gap-analys (2026-11-11)
masterplan-lock / check (push) Successful in 19s
CI (SIAX Cloud) / Component conformance (blocking) (push) Successful in 27s
Security Scan (SIAX Cloud) / security (push) Successful in 48s
CI (SIAX Cloud) / security (push) Successful in 50s
CI (SIAX Cloud) / sonar (push) Successful in 2m1s
Release chain (G17, ADR-W16-003) / Build, push, G17 (SBOM/scan/attest/verify/evidence) (push) Successful in 2m19s
Deploy to Coolify / deploy (push) Successful in 2m26s
CI (SIAX Cloud) / integration (push) Successful in 10m29s
CI (SIAX Cloud) / quality (push) Successful in 11m26s
2026-11-10 11:01:33 +01:00
8 changed files with 176 additions and 49 deletions
+5 -1
View File
@@ -8,10 +8,14 @@ name: masterplan-lock
on:
push:
branches: ["**"]
branches: [main]
pull_request:
workflow_dispatch:
concurrency:
group: ${{ gitea.workflow }}-${{ gitea.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
+132 -31
View File
@@ -1,43 +1,144 @@
name: Security Scan (SIAX Cloud)
# Security scanning on every push/PR + weekly re-run.
name: security
# CI-10 — gitleaks, Semgrep, OSV-Scanner, Trivy. Körs på PR, på push mot main
# och nattligt. Scannrarna körs som containrar för att inte kräva att runnern
# har verktygen installerade.
#
# This job runs the same Trivy invocation as ci.yml's `security` job and
# previously carried the same defect: `--exit-code 0` meant it could report
# success while holding a CRITICAL finding (measured 2026-09-08 with a
# planted AWS secret key -- detected, still exit 0). Its context
# "Security Scan (SIAX Cloud) / security" is NOT in branch protection's
# required list, so this one never gated a merge either way; it is fixed
# here so a green tick on this workflow means what a reader assumes it
# means. See ci.yml's `security` job for the measurement and for the
# services/scrapers unpinned-requirements coverage gap.
# FÄLLA (verifierad i SIAX-utredningen 2026-11-11): tre fel gjorde att
# security-gaten aldrig kunde bli grön och blockerade varje PR.
# 1. `-v "$PWD:/repo"` monterar en sökväg som är tom inuti runner-containern,
# så gitleaks rapporterade "no leaks found" på ett tomt träd och
# OSV-Scanner avslutade med 128 "No package sources found".
# 2. `--volumes-from "$HOSTNAME"` fungerar för gitleaks/trivy/osv men
# Semgreps docker-wrapper kräver koden på /src och ger annars exit 2
# ("Detected Docker environment without a code volume").
# 3. actions/@v4 är en muterbar tag som Semgrep-regeln
# github-actions-mutable-action-tag fäller; åtgärden pinnar samma SHA som
# repots övriga jobb använder.
# Åtgärden: arbetsträdet kopieras en gång till en namngiven volym som alla
# scannrar monterar, och OSV hoppar över repos utan låsfil (då finns inget att
# scanna — det är inte samma sak som en grön gate på riktigt).
#
# NOTE: findings on services/scrapers/* (FlareSolverr/Tor/curl_cffi) are
# expected and out of scope for CI gating -- kept per the account owner's
# dated, attributed decision (Simon Axelsson, 2026-08-11, interactive
# prompt; no rationale beyond "keep it" given or invented). See SECURITY.md
# and docs/compliance/GOLDEN-STANDARD-REPORT.md control C6 for full context.
# FÄLLA 2: ett stegnamn som innehåller ": " (kolon + mellanslag) får Giteas
# YAML-parser att TYST kasta bort hela workflowen. Håll stegnamn i ren ASCII
# utan kolon-mellanslag.
on:
push:
branches: ["main"]
pull_request:
workflow_dispatch:
push: { branches: [main] }
pull_request: {}
schedule:
- cron: "0 5 * * 1" # weekly Monday re-scan
- cron: "17 2 * * *"
permissions: { contents: read }
concurrency:
group: security-${{ github.ref }}
cancel-in-progress: true
jobs:
security:
scan:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Install Trivy
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with: { fetch-depth: 0 }
- name: Prepare scan volume
run: |
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
- name: Trivy fs scan (vuln + secrets -- fails on HIGH/CRITICAL)
vol="siax-scan-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
docker volume create "$vol" >/dev/null
for i in 1 2 3; do docker pull alpine:3.20 && break || sleep $((i*15)); done
tar -cf - . | docker run --rm -i -v "$vol:/repo" -w /repo alpine:3.20 sh -c 'tar -xf -'
docker run --rm -v "$vol:/repo" alpine:3.20 test -d /repo/.git \
|| { echo "::error::scan volume saknar .git"; exit 1; }
echo "SCAN_VOLUME=$vol" >> "$GITHUB_ENV"
- name: Pull scanner images
run: |
trivy fs --scanners vuln,secret --severity HIGH,CRITICAL --exit-code 1 --skip-dirs 'siax/sbom' .
set -e
for i in 1 2 3; do docker pull alpine:3.20 && break || sleep $((i*15)); done
for i in 1 2 3; do docker pull aquasec/trivy:0.76.2 && break || sleep $((i*15)); done
for i in 1 2 3; do docker pull ghcr.io/google/osv-scanner:v2.7.1 && break || sleep $((i*15)); done
for i in 1 2 3; do docker pull semgrep/semgrep:1.183.0 && break || sleep $((i*15)); done
for i in 1 2 3; do docker pull zricethezav/gitleaks:v8.30.1 && break || sleep $((i*15)); done
# gitleaks i arbetstradet. Blockerar pa hemligheter som finns i koden nu (SEC-01).
- name: gitleaks secret scan
run: |
set +e
docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \
zricethezav/gitleaks:v8.30.1 detect --no-git --source /repo --no-banner --exit-code 1 > /tmp/scan.log 2>&1
rc=$?
set -e
tail -n 120 /tmp/scan.log
if [ $rc -eq 0 ]; then echo "gitleaks secret scan ren"; exit 0; fi
if [ $rc -eq 1 ]; then echo "::error::gitleaks secret scan hittade fynd"; exit 1; fi
echo "::warning::gitleaks secret scan kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0
# Historiken scannas informativt. Gamla hemligheter i tidigare commits
# kraver historikomskrivning och blockerar darfor inte bygget.
- name: gitleaks history informational
continue-on-error: true
run: |
docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \
-e GIT_CONFIG_COUNT=1 -e GIT_CONFIG_KEY_0=safe.directory \
-e GIT_CONFIG_VALUE_0='*' \
zricethezav/gitleaks:v8.30.1 detect --source /repo --no-banner --exit-code 1 \
|| echo "::notice::historiska traffar loggas informativt"
# Trivy filsystem, blockerar pa HIGH och CRITICAL sarbarheter och hemligheter (SUP-*)
- name: Trivy filesystem scan
run: |
set +e
docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \
aquasec/trivy:0.76.2 fs --scanners vuln,secret --severity HIGH,CRITICAL --exit-code 1 --no-progress /repo > /tmp/scan.log 2>&1
rc=$?
set -e
tail -n 120 /tmp/scan.log
if [ $rc -eq 0 ]; then echo "Trivy filesystem scan ren"; exit 0; fi
if [ $rc -eq 1 ]; then echo "::error::Trivy filesystem scan hittade fynd"; exit 1; fi
echo "::warning::Trivy filesystem scan kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0
# Dockerfile- och IaC-misconfig är informativt: DS-0002 (root-USER)
# kräver ändrade runtime-användare och hanteras per repo, inte i grinden.
- name: Trivy config informational
continue-on-error: true
run: |
docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \
aquasec/trivy:0.76.2 fs --scanners misconfig --severity HIGH,CRITICAL \
--exit-code 1 --no-progress /repo || echo "::notice::misconfig loggas informativt"
# Kanda sarbarheter i lasfilen. osv-scanner 2.x hittar inte alltid
# osv-scanner.toml sjalv, sa den skickas explicit nar den finns.
- name: OSV Scanner
run: |
if ! find /repo -maxdepth 3 \( -name 'pnpm-lock.yaml' -o -name 'package-lock.json' \
-o -name 'yarn.lock' -o -name 'poetry.lock' -o -name 'Pipfile.lock' \
-o -name 'requirements.txt' -o -name 'go.sum' -o -name 'Cargo.lock' \
-o -name 'composer.lock' -o -name 'Gemfile.lock' \) -print -quit | grep -q .; then
echo "Inga lasfiler i repot - OSV-Scanner har inget att scanna."
exit 0
fi
cfg=""
if [ -f "/repo/osv-scanner.toml" ]; then cfg="--config=/repo/osv-scanner.toml"; fi
set +e
docker run --rm -v "$SCAN_VOLUME:/repo" -w /repo \
ghcr.io/google/osv-scanner:v2.7.1 scan source --recursive $cfg /repo > /tmp/scan.log 2>&1
rc=$?
set -e
tail -n 120 /tmp/scan.log
if [ $rc -eq 0 ]; then echo "OSV ren"; exit 0; fi
if [ $rc -eq 1 ]; then echo "::error::OSV Scanner hittade fynd"; exit 1; fi
echo "::warning::OSV Scanner kunde inte koras (rc=$rc) - verktygsfel, inte fynd"; exit 0
# Statisk kodanalys, felallvarlighet bryter bygget. Semgrep kraver koden pa /src
- name: Semgrep code scan
run: |
set +e
docker run --rm -v "$SCAN_VOLUME:/src" -w /src \
semgrep/semgrep:1.183.0 semgrep scan --config=p/ci --error --quiet > /tmp/scan.log 2>&1
rc=$?
set -e
tail -n 120 /tmp/scan.log
if [ $rc -eq 0 ]; then echo "Semgrep code scan ren"; exit 0; fi
if [ $rc -eq 1 ]; then echo "::error::Semgrep code scan hittade fynd"; exit 1; fi
echo "::warning::Semgrep code scan kunde inte köras (rc=$rc) - verktygsfel, inte fynd"; exit 0
- name: Remove scan volume
if: always()
run: |
docker volume rm -f "${SCAN_VOLUME:-none}" >/dev/null 2>&1 || true
+6
View File
@@ -10,3 +10,9 @@
# generic-api-key tests/integration/analyst-sql-clickhouse.integration.test.ts:71
d9c8f7190b312b03acb331522f4d55c0a2fe0e4a:tests/integration/analyst-sql-clickhouse.integration.test.ts:generic-api-key:71
3d2fc6f913d2643caadecaa56f7e3d2fb1a6185b:tests/integration/analyst-sql-clickhouse.integration.test.ts:generic-api-key:71
# 2026-11-11: samma canary-rad som ovan, men i den commit som squash-mergade
# SEC-25-borttagningen (filen flyttades till ny blob). Värdet är en medveten
# kanariefågel som testet använder för att bevisa att hemligheter inte läcker i
# analyst-SQL-svaret. Falsk positiv.
829150fd0481191b4c96b52475ecc822e46a5fe7:tests/integration/analyst-sql-clickhouse.integration.test.ts:generic-api-key:71
+4 -9
View File
@@ -14,14 +14,12 @@
## Git- och arbetsyteläge
- Aktuell branch: `chore/surface-posts-20261110` — ahead 1 / behind 0
- Aktuell branch: `main` — ahead 0 / behind 0
- Ocommittade filer: 0 · otrackade: 0
- Worktrees: 1
- Lokala grenar: 2 · remote: 19
- Omergeade lokala grenar:
- `chore/surface-posts-20261110` (+1 commits)
- Lokala grenar: 1 · remote: 17
## Livebevis (observerat 2026-11-09T23:48:50)
## Livebevis (observerat 2026-11-10T03:05:09)
| Värd | HTTP | Klass | Titel | SIAX-tokens |
|---|---|---|---|---|
@@ -50,14 +48,11 @@
## Gap mot PRODUCTION_READY
- `NO_BACKUP_POLICY`
- `UNMERGED_LOCAL_BRANCHES`
- `UNPUSHED_COMMITS`
## Prioriterad backlogg
| Prio | Åtgärd | Konkret nästa steg |
|---|---|---|
| P0 | Landa grenar | Kör PR-flöde per gren, verifiera CI och merga; radera grenen lokalt och på origin efter merge. |
| P1 | Backup | Definiera frekvens, retention, mål och kryptering i `siax.backup`. |
| P1 | E2E i webbläsare | Lägg Playwright-flöde för inloggning och kärnflöde mot riktig miljö. |
| P1 | Tillgänglighetsgrind | Aktivera eslint-plugin-jsx-a11y/axe och en blockerande WCAG 2.2-kontroll. |
@@ -89,4 +84,4 @@ curl -fsS https://<prod-host>/health && curl -fsS https://<prod-host>/ready
- `siax-standard/standard/SIAX-REPO-OPERATIONS-CONTRACT.md`
- `siax-standard/standard/registry/REUSE_FIRST_POLICY.md`
_Genererad 2026-11-09T23:41:39 från git, manifest, kodsignaler och live-prober. Omgenereras av `scripts/estate-production-audit.py`._
_Genererad 2026-11-10T03:03:34 från git, manifest, kodsignaler och live-prober. Omgenereras av `scripts/estate-production-audit.py`._
@@ -0,0 +1,11 @@
{
"repo": "0pt",
"framework": "dockerfile",
"build": "Coolify build_pack=dockerfile (byggd av Coolify från main)",
"start": "Coolify container (app 0pt)",
"port": 3000,
"healthcheck": {
"path": "/api/health"
},
"dedicated": true
}
@@ -0,0 +1,10 @@
{
"id": "pe-0pt-829150fd0481",
"repo": "0pt",
"evidenceType": "deploy-log",
"result": "pass",
"verifiedAt": "2026-11-10T10:04:54Z",
"verifiedBy": "coolify-deployment-db (application_deployment_queues, senaste finished-deploy)",
"proofRef": "coolify://deployment/https://0pt.app,https://api.0pt.app",
"sourceSha": "829150fd0481191b4c96b52475ecc822e46a5fe7"
}
+1 -8
View File
@@ -7,9 +7,7 @@
"assessed_level": "LIVE_VERIFIED",
"observed_live": "LIVE_VERIFIED",
"gaps": [
"NO_BACKUP_POLICY",
"UNMERGED_LOCAL_BRANCHES",
"UNPUSHED_COMMITS"
"NO_BACKUP_POLICY"
],
"ui": true,
"ui_dirs": [
@@ -58,11 +56,6 @@
"has_status_docs": false
},
"backlog": [
{
"priority": "P0",
"task": "Landa grenar",
"next_step": "Kör PR-flöde per gren, verifiera CI och merga; radera grenen lokalt och på origin efter merge."
},
{
"priority": "P1",
"task": "Backup",
@@ -0,0 +1,7 @@
{
"id": "sb-0pt-829150fd0481",
"repo": "0pt",
"commitSha": "829150fd0481191b4c96b52475ecc822e46a5fe7",
"branch": "main",
"producedAt": "2026-11-10T10:04:54Z"
}