diff --git a/.sinapsi/decisions.md b/.sinapsi/decisions.md index 9551ae9..047451d 100644 --- a/.sinapsi/decisions.md +++ b/.sinapsi/decisions.md @@ -27,3 +27,4 @@ Big, irreversible architectural decisions belong in `adr/` instead. - 2026-07-22: rimosso `diskcache` dalle dipendenze correnti perché non è importato dal runtime e `PYSEC-2026-2447` non ha una versione corretta; un requisito futuro di RFC-001 non giustifica distribuire oggi una superficie pickle vulnerabile. - 2026-07-22: RFC-005 ammette al planner soltanto goal `SAFE` e rimuove l'opt-out `SISTEMISTA_UNCONFINED`, perché una variabile d'ambiente non è una capability né isolamento; mutazioni host restano fuori scope finché non esiste un backend kernel/VM verificabile. - 2026-07-22: RFC-006 rende Mypy 2.3.0 un ratchet zero-error sull'intero runtime, invece di congelare una baseline o aggiungere suppress globali, perché i 30 finding rappresentavano contratti divergenti e non semplice rumore statico. +- 2026-07-22: Sistemista migra a `PatrickDev-it/sistemista` tramite replica verificata dei tre branch pubblici, perché GitHub vieta il transfer nativo dall'organizzazione flagged; l'archive pre-pubblicazione resta locale per non riesporre fixture storiche già escluse dal publication gate. diff --git a/.sinapsi/handoff.md b/.sinapsi/handoff.md index 9893f44..5561686 100644 --- a/.sinapsi/handoff.md +++ b/.sinapsi/handoff.md @@ -1,58 +1,61 @@ # Handoff -_Aggiornato: 2026-07-22 — RFC-006 chiusa localmente; integrazione su development in corso._ +_Aggiornato: 2026-07-22 — migrazione profilo personale in verifica PR._ ## Stato -Repository: `https://github.com/Ignoryx/sistemista`; default `development`, con branch -`validation` e `production` protetti. Branch corrente: `rfc/006-typed-runtime`. -Storia pre-pubblicazione preservata solo nel branch locale `archive/pre-publication`. +Repository target: `https://github.com/PatrickDev-it/sistemista`; default `development`, con +`validation` e `production` protetti. Branch corrente: `ops/personal-profile-migration`. +`origin` punta al profilo; `ignoryx` è temporaneo e va rimosso dopo la cancellazione remota. +Storia pre-pubblicazione preservata solo in `archive/pre-publication`, mai pubblicata. -Sistemista è un alpha sysops agent locale dual-GGUF, Python + `llama-server`, mono-utente e -sequenziale. NAV usa Qwen3-4B; CODER usa Qwen2.5-Coder-3B; oracolo HTTP opzionale. +## Migrazione verificata -## RFC chiuse localmente +- SHA dei tre branch identici tra repo organizzativa e personale. +- Default `development`; ruleset personale ID `19557677` attivo sui tre branch. +- Discussions, topics, secret scanning, push protection, Dependabot e private reporting attivi. +- Security workflow personale verde: run `29926272395`. +- CI personale operativo ma prima run rossa: 9 failure Ubuntu non ermetiche ora corrette localmente. +- README, package metadata e NOTICE aggiornati al profilo personale. -- RFC-004: baseline OSS, storia pubblica curata, governance e packaging. -- RFC-005: only-SAFE, classifier fail-closed, no env opt-out, dynamic sink/host mutation bloccati. -- RFC-006: Mypy 2.3.0 su tutto il runtime, baseline **30→0**, nessun suppress globale. -- Il boundary resta policy applicativa, non sandbox o isolamento kernel. +## Fix CI multi-OS -## Evidenza locale corrente +- Fixture workspace-path usa una root nativa su POSIX e Windows. +- SQLite di test vive fuori dal task workspace, come in produzione. +- `world.norm_alias` riconosce `/` e `\` indipendentemente dall'host. +- Gate locale: **713 passed, 3 skipped**; 28 mirati verdi. +- Ruff/format/Mypy, wheel/sdist, pip-audit e Gitleaks verdi. -- Suite completa: **713 passed, 3 skipped**; mirati RFC-006: **74 passed**. -- Ruff verde; formatter verde su **149 file**; Mypy **zero errori**. -- Wheel/sdist `0.1.0a1` e pip-audit verdi. -- Gitleaks storia pubblica 16,89 MB + diff RFC 24,30 KB: zero finding. -- Wheel con prompt 8/8, KB YAML 8/8, LICENSE e NOTICE. -- Benchmark isolato storico: **32/48 = 66,7% ARR**; cross-OS/8 GB non certificati. +## Sequenza obbligatoria -## Governance remota +1. Commit/push del branch e PR verso `development` personale. +2. Attendere CI + Security remoti verdi e integrare tramite ruleset. +3. Verificare SHA/default/security/ruleset post-merge. +4. Eliminare definitivamente `Ignoryx/sistemista`, come autorizzato dall'utente. +5. Rimuovere il remote locale `ignoryx` e verificare assenza repo dall'organizzazione. +6. Pin profilo: GitHub non espone API pubblica; resta un singolo passaggio UI manuale. -- Ruleset attivo sui tre branch: PR, CODEOWNER review, thread resolution, linear history, - sei required check, no delete/force-push; admin bypass solo tramite PR. -- Secret scanning, push protection, Dependabot security updates e private reporting attivi. -- PR #2 RFC-005 integrata su `development` al commit `d1967e2`. -- Blocco esterno: Ignoryx flagged; dispatch CI HTTP 500; Security non indicizzato. -- Ticket reinstatement aperto; nessuna promozione senza run CI e Security verdi. +## RFC chiuse localmente + +- RFC-004: baseline OSS, storia pubblica curata, governance e packaging. +- RFC-005: execution policy fail-closed; non è isolamento kernel. +- RFC-006: Mypy 2.3.0 su tutto il runtime, baseline **30→0**. ## Release path -- Integrare RFC-006 su `development` via PR con evidenza locale e bypass tracciato. - RFC-007: dependency reproducibility, SBOM e provenance. - RFC-008: backend isolato kernel/VM e escape suite, blocker production. - RFC-009: benchmark multi-OS, risorse e claim falsificabili. - RFC-010: release engineering, signing/attestations, docs finali e GO. -- `validation`: vietata finché Actions remoti non sono verdi. +- `validation`: vietata finché CI personale non è verde e RFC-007 non è chiusa. - `production`: vietata fino a tutti i publication-target chiusi e GO formale. ## Rischi P0 aperti -1. `Confinement` è un parser/policy applicativo, non una jail. +1. `Confinement` è policy applicativa, non una jail. 2. Manca isolamento kernel/VM/container per input o mutazioni unattended. 3. `orchestrator.py` e `reasoning.py` restano monoliti; FSM implicita. -4. Coverage runtime disomogenea; benchmark cross-OS e target 8 GB non certificati. -5. GitHub Actions non operativo finché persiste il flag organizzativo. +4. Benchmark cross-OS e target 8 GB non certificati. ## Comandi canonici diff --git a/.sinapsi/known-issues.md b/.sinapsi/known-issues.md index 5013e91..242d771 100644 --- a/.sinapsi/known-issues.md +++ b/.sinapsi/known-issues.md @@ -22,6 +22,10 @@ sono configurati, quindi il blocco è nel backend GitHub e richiede il ticket di **Fix.** Non indebolire required checks né dichiarare verde il remoto. Conservare i gate locali, attendere il ripristino e rieseguire CI + Security prima di promuovere a `validation`. +**Risoluzione operativa 2026-07-22.** Il repository personale esegue i workflow: Security è verde +e CI ha prodotto log reali. Il blocco resta storico per la copia organizzativa, destinata alla +cancellazione dopo la verifica della migrazione. + --- ### Una destinazione dinamica può aggirare un controllo path basato sul testo diff --git a/.sinapsi/session.md b/.sinapsi/session.md index a9f1fa2..bd23a68 100644 --- a/.sinapsi/session.md +++ b/.sinapsi/session.md @@ -1101,3 +1101,25 @@ divergenze, ma non equivale a type completeness strict. **Validazione.** Mypy **30→0**; Ruff/format verdi su 149 file; test mirati **74 passed**; suite **713 passed, 3 skipped**; build isolata, pip-audit e Gitleaks storia+diff verdi. GitHub Actions resta bloccato dal flag organizzativo, quindi nessuna promozione a `validation`. + +--- + +## 2026-07-22 — Migrazione al profilo personale e primo CI multi-OS reale + +**Migrazione.** Il transfer nativo `Ignoryx/sistemista → PatrickDev-it/sistemista` è stato vietato +da GitHub (`422`, transfer non disponibile per account flagged). Creato il repository personale +e replicati `development`, `validation`, `production`; SHA confrontati e identici. L'archive locale +pre-pubblicazione non è stato pubblicato. Default, ruleset, topics, Discussions, private reporting, +secret scanning, push protection e Dependabot sono stati ricreati sul nuovo owner. + +**CI reale.** Sul profilo personale Security è passata. Ubuntu ha finalmente eseguito la suite e +ha scoperto 9 failure mascherate da Windows: fixture path Windows su POSIX, SQLite collocato dentro +il task workspace e basename dipendente dall'OS. Corrette le cause: fixture native, state esterno +al workspace e canonicalizzazione di entrambi i separatori. + +**Branding.** README, package URL, author metadata e NOTICE puntano a `PatrickDev-it/sistemista`; +il checkout usa il nuovo repository come `origin`. Lo storico pubblico resta intatto. + +**Validazione locale.** **713 passed, 3 skipped**; 28 test mirati verdi; Ruff/format/Mypy, +wheel/sdist, pip-audit e Gitleaks verdi. Cancellazione della copia organizzativa subordinata alla +PR personale CI+Security verde; pin del profilo richiede l'interfaccia GitHub, non esiste API pubblica. diff --git a/.sinapsi/summary.md b/.sinapsi/summary.md index 2277f0a..71a4fa4 100644 --- a/.sinapsi/summary.md +++ b/.sinapsi/summary.md @@ -52,6 +52,7 @@ patch: the project's shape (above), the last sessions at a glance, and a short r agent at the end of every patch, at the same time it appends session.md. Drop the 11th; the full history is in session.md and, once archived, in archive/. --> +- 2026-07-22 — Migrata storia pubblica al profilo personale; fixate 9 failure CI Ubuntu non ermetiche. - 2026-07-22 — Chiusa RFC-006: Mypy 30→0, 713 test verdi e runtime netto -26 LOC. - 2026-07-22 — Implementata RFC-005 fail-closed: 712 test verdi; promozione bloccata da Actions HTTP 500. - 2026-07-22 — Pubblicato Ignoryx/sistemista: tre branch, security features e ruleset attivi; CI remota da provare. @@ -64,10 +65,10 @@ patch: the project's shape (above), the last sessions at a glance, and a short r fragile, what the next action is. Rewritten (not appended) from session.md + handoff.md at the end of every patch. If it grows past 10 lines it has stopped being a summary. --> -- Repository pubblico: `Ignoryx/sistemista`; storia privata preservata solo in archive locale. +- Repository target: `PatrickDev-it/sistemista`; tre branch migrati con SHA identici. - RFC-005 integrata; RFC-006 chiusa localmente con Mypy 30→0 senza suppress globali. - Gate locale: 713 passed/3 skipped; Ruff/format/type, build, audit e Gitleaks verdi. - Wheel/sdist `0.1.0a1` verdi con 8 prompt, 8 KB YAML, LICENSE e NOTICE. -- `development` default; `validation`/`production` protetti da ruleset e security features. -- GitHub Actions bloccato: dispatch CI HTTP 500, Security non indicizzato con org flagged. -- Prossimo passo: integrare RFC-006 su development, poi RFC-007 SBOM/provenance. +- Ruleset/security features personali attivi; Security remoto verde. +- Primo CI Ubuntu ha esposto 9 test non ermetici, corretti; PR personale deve confermare. +- Prossimo: PR verde, cancellare copia organizzativa, poi RFC-007 SBOM/provenance. diff --git a/.sinapsi/verification.md b/.sinapsi/verification.md index 0683999..7191bf3 100644 --- a/.sinapsi/verification.md +++ b/.sinapsi/verification.md @@ -20,6 +20,12 @@ gate. ## Latest verification +- 2026-07-22 — Personal-profile migration: `development`, `validation` e `production` hanno + SHA identici tra origine organizzativa e `PatrickDev-it/sistemista`; default/ruleset/security + features ricreati. Security remoto verde; il primo CI Ubuntu ha esposto 9 test non ermetici. + Fix locale: path fixture native, state DB esterno al task workspace, alias basename indipendente + dall'OS. Gate locale: **713 passed, 3 skipped**, Ruff/format/Mypy/build/audit/Gitleaks verdi; + chiusura subordinata alla PR personale verde. - 2026-07-22 — RFC-006 local gate: Mypy **30 → 0 errori** sull'intero runtime; Ruff clean e **149 file** conformi; test mirati **74 passed**, suite completa **713 passed, 3 skipped**; wheel/sdist `0.1.0a1` verdi; dependency audit senza vulnerabilità note; Gitleaks sulla storia diff --git a/NOTICE b/NOTICE index ad1bac7..e9c9913 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Sistemista -Copyright 2026 Ignoryx contributors +Copyright 2026 Sistemista contributors This product is licensed under the Apache License, Version 2.0. diff --git a/README.md b/README.md index 351c693..d4a79d1 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ verification predicates, recovery loops, and a redacted audit trail. > production-ready, does not provide a security sandbox, and must not be run unattended or > against untrusted objectives. Use an isolated disposable machine or VM. -[![CI](https://github.com/Ignoryx/sistemista/actions/workflows/ci.yml/badge.svg?branch=development)](https://github.com/Ignoryx/sistemista/actions/workflows/ci.yml) -[![Security](https://github.com/Ignoryx/sistemista/actions/workflows/security.yml/badge.svg?branch=development)](https://github.com/Ignoryx/sistemista/actions/workflows/security.yml) +[![CI](https://github.com/PatrickDev-it/sistemista/actions/workflows/ci.yml/badge.svg?branch=development)](https://github.com/PatrickDev-it/sistemista/actions/workflows/ci.yml) +[![Security](https://github.com/PatrickDev-it/sistemista/actions/workflows/security.yml/badge.svg?branch=development)](https://github.com/PatrickDev-it/sistemista/actions/workflows/security.yml) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) ## What it is @@ -51,7 +51,7 @@ Prerequisites: [`workspace/models/README.md`](workspace/models/README.md) ```powershell -git clone https://github.com/Ignoryx/sistemista.git +git clone https://github.com/PatrickDev-it/sistemista.git cd sistemista py -3.12 -m venv .venv .\.venv\Scripts\python -m pip install --upgrade pip diff --git a/pyproject.toml b/pyproject.toml index 63f47d5..099af2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ description = "Local-first, model-assisted system operations with bounded execut readme = "README.md" license = "Apache-2.0" license-files = ["LICENSE", "NOTICE"] -authors = [{ name = "Ignoryx contributors" }] +authors = [{ name = "Sistemista contributors" }] requires-python = ">=3.12" keywords = ["ai-agent", "llama-cpp", "local-first", "privacy", "sysops"] classifiers = [ @@ -65,10 +65,10 @@ warn_redundant_casts = true no_error_summary = true [project.urls] -Homepage = "https://github.com/Ignoryx/sistemista" -Documentation = "https://github.com/Ignoryx/sistemista#readme" -Issues = "https://github.com/Ignoryx/sistemista/issues" -Source = "https://github.com/Ignoryx/sistemista" +Homepage = "https://github.com/PatrickDev-it/sistemista" +Documentation = "https://github.com/PatrickDev-it/sistemista#readme" +Issues = "https://github.com/PatrickDev-it/sistemista/issues" +Source = "https://github.com/PatrickDev-it/sistemista" [project.scripts] sistemista = "src.main:cli_entry" diff --git a/workspace/src/world.py b/workspace/src/world.py index 62ea5cc..350f904 100644 --- a/workspace/src/world.py +++ b/workspace/src/world.py @@ -22,7 +22,6 @@ from __future__ import annotations -import os import time from dataclasses import dataclass, field from enum import Enum @@ -148,7 +147,10 @@ class Transition: def norm_alias(name: str) -> str: """Canonical alias: basename, lowercase, no .exe, dashes folded to underscores (pip normalizes yt-dlp → yt_dlp; both must resolve to the same node).""" - n = os.path.basename((name or "").strip().strip("'\"")) + # Model output and persisted observations may use a different platform's separator. + # `os.path.basename` understands only the host spelling, so Windows paths became one + # giant basename on Linux and escaped executable overwrite protection. + n = (name or "").strip().strip("'\"").replace("\\", "/").rsplit("/", 1)[-1] n = n.lower().removesuffix(".exe") return n.replace("-", "_") diff --git a/workspace/tests/test_step_already_satisfied.py b/workspace/tests/test_step_already_satisfied.py index 948c138..8fac7fc 100644 --- a/workspace/tests/test_step_already_satisfied.py +++ b/workspace/tests/test_step_already_satisfied.py @@ -36,7 +36,10 @@ def run(self, command, timeout=None): # must never be reached by a skipped step def orch(tmp_path, monkeypatch): # A step that is NOT skipped runs on: to `memory.save_event`, and then into the coder's # retry loop. Both need neutralising or this stops being a unit test. - monkeypatch.setattr(config, "MEMORY_DIR", tmp_path / "_memory") + # State must not live under the task workspace: workspace-shape normalization is allowed + # to hoist unexpected child directories. Linux permits moving an open SQLite file, while + # Windows masks that invalid fixture layout by locking it. + monkeypatch.setattr(config, "MEMORY_DIR", tmp_path.parent / f"{tmp_path.name}-memory") memory.init_db() # known-issues.md: mocking `_text_call` alone is not enough — `_coder()` is evaluated as diff --git a/workspace/tests/test_workspace_paths.py b/workspace/tests/test_workspace_paths.py index 8daa057..9777018 100644 --- a/workspace/tests/test_workspace_paths.py +++ b/workspace/tests/test_workspace_paths.py @@ -2,6 +2,8 @@ legal `\\\\` escape pairs, and the 0.6B planner fell into exactly that hole (857 consecutive backslashes, string never closed, 39 of 48 runs dead). Remove the source, not the symptom.""" +import sys + import pytest from src import workspace_paths as wp @@ -12,7 +14,11 @@ def _reset(): wp.set_root(None) -ROOT = r"C:\Users\ExampleUser\Desktop\Agents\Sistemista\workspace\var\benchmark\oracle_off\workspaces\T01" +ROOT = ( + r"C:\Users\ExampleUser\Desktop\Agents\Sistemista\workspace\var\benchmark\oracle_off\workspaces\T01" + if sys.platform == "win32" + else "/home/example-user/sistemista/workspace/var/benchmark/oracle_off/workspaces/T01" +) def test_disabled_when_no_root():