Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .sinapsi/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
63 changes: 33 additions & 30 deletions .sinapsi/handoff.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
4 changes: 4 additions & 0 deletions .sinapsi/known-issues.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 22 additions & 0 deletions .sinapsi/session.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
9 changes: 5 additions & 4 deletions .sinapsi/summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
6 changes: 6 additions & 0 deletions .sinapsi/verification.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion NOTICE
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Sistemista
Copyright 2026 Ignoryx contributors
Copyright 2026 Sistemista contributors

This product is licensed under the Apache License, Version 2.0.

Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [
Expand Down Expand Up @@ -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"
Expand Down
6 changes: 4 additions & 2 deletions workspace/src/world.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

from __future__ import annotations

import os
import time
from dataclasses import dataclass, field
from enum import Enum
Expand Down Expand Up @@ -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("-", "_")

Expand Down
5 changes: 4 additions & 1 deletion workspace/tests/test_step_already_satisfied.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 7 additions & 1 deletion workspace/tests/test_workspace_paths.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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():
Expand Down
Loading