OUTSOFTWARE BBS — CANDIDATA WEB V4, 25 OTTOBRE 2026

STATO
Candidata locale con broker Guest e tastiera mobile integrati. Non installata,
non avviata e non pubblicata da questo lavoro. La V3 congelata rimane intatta.
Guest è DISABILITATO finché la configurazione privata non è verificata. Il
fallback site/guest-capability.json contiene ready:false; i modelli privati
hanno enabled/prompts_verified/account_permissions_verified:false.
Non sono incluse password reali, account creati o un profilo di prompt inventato.
La selezione nativa dei permessi e il collaudo Python3.5 reale restano al
responsabile operativo. GUEST_BACKEND.txt documenta schema, limiti e condizioni.

BASELINE E DESTINAZIONE
  Baseline V3 manifest:
  0d175dd5450447cf21112b2fa67744756a1dc4a35949ad19ff4b4e3492f8c915
  Destinazione prevista: /home/outsoft/outsoftware-web-bbs
  Configurazione privata: /home/outsoft/outsoftware-web-bbs-private
Nessuna procedura contenuta qui aggiorna Mystic, ne modifica l'avvio o cambia
DNS, NAT, SSH, Telnet o posta. L'installazione amministrativa è un passaggio
separato; non si deve riusare un installer con il manifest della V3.

PAGINA E ACCESSO
La pagina mantiene sfondo nero, terminale centrato in alto fino a960px,
ANSI/CP43780x24, senza fullscreen automatico. Client, tastiera, CSS e150font
bitmap ufficiali sono serviti localmente, senza CDN o proxy pubblico.

Con la configurazione attuale è disponibile soltanto “Accedi con account”.
La pagina non apre alcuna connessione BBS quando Guest non è pronto.
Quando il backend sarà verificato e la risposta dinamica di disponibilità
avrà ready:true con il percorso esatto /ws/guest, il primo caricamento entrerà AUTOMATICAMENTE come
ospite; il pulsante “Entra come ospite” permetterà di tornarvi successivamente.
Un account scelto prima della risposta di disponibilità impedisce l'avvio
ospite tardivo. Nessun tentativo automatico viene ripetuto dopo errore/uscita.

“Accedi con account” resta selezionabile durante Guest. Il client chiude prima
il WebSocket attuale e ne attende CLOSED; soltanto dopo apre quello della nuova
modalità. Si riusa un solo terminale. Il cambio modalità cancella lo schermo,
lo scrollback e i tasti rimasti nel terminale locale. Doppio clic e Connect
interni non aprono sessioni concorrenti. Un pool Guest occupato mostra un
messaggio semplice, senza tentativi aggiuntivi o divulgazione di dettagli interni.

La disponibilità pubblica è il solo GET esatto /guest-capability.json, con
Cache-Control:no-store. Il broker verifica configurazione privata, flag dei
prompt/permessi, validità del pool e directory lease, senza prendere lock,
scrivere file o sondare la BBS. La risposta contiene soltanto schema, ready e
path: nessun nome, password, numero di account o dettaglio di errore. File
mancante, malformato, disabilitato o troppo grande lascia la scelta account.
Se il proxy è indisponibile, Caddy serve il fallback statico ready:false;
questa eccezione non modifica gli errori delle due route WebSocket.
Attivazione e disattivazione richiedono SOLO la configurazione privata
verificata: nessuna modifica a runtime, manifest, certificati o unità. Il
broker rilegge quei file a ogni richiesta, senza riavvio.
Non ci sono password, username tecnici o comandi di login nel frontend.

TASTIERA SMARTPHONE E TABLET
“Mostra tastiera”/“Nascondi tastiera” usa l'API nativa VirtualKeyboardVisible.
La tastiera si apre sui dispositivi touch/coarse al caricamento del client;
una scelta esplicita di nasconderla viene mantenuta durante rotazioni e cambio
accesso. Gli asset locali320/360/480/560/640/720/800/960px vengono scelti in base
alla larghezza disponibile. Lo schermo80x24 viene scalato separatamente dai
tasti; sotto320px si adatta anche la tastiera, riservando la sua altezza.
Le etichette e aria-expanded seguono lo stato. Invio, Backspace, Canc, Spazio
e punto sono stati verificati con i veri metodi del client, in un DOM simulato.
Non è stato eseguito un collaudo su telefono/tablet fisico o browser grafico.

BROKER E PERCORSI FISSI
  Browser HTTPS/WSS -> Caddy :443 -> 127.0.0.1:6080 -> 127.0.0.1:23
  /ws        conserva l'autenticazione normale degli account registrati.
  /ws/guest  prende una lease esclusiva, esegue il login a prompt e mostra il
             menu Guest solo dopo la conferma configurata del menu pronto.
Il proxy non ha parametri target, host/porta da URL, token plugin, traffico
registrato o file server. Accetta una sola Origin, esattamente una delle due:
  https://bbs.outsoftware.it
  https://retrobbs.sinclair.homepc.it
Dati e credenziali pre-login restano nel broker; i caratteri inviati dal browser
prima del menu pronto vengono consumati senza inviarli alla BBS. Prompt non
riconosciuto, rifiuto, timeout o output non sicuro chiudono la sessione.
Non vengono usati sleep per digitare le credenziali. Il menu viene rilasciato
soltanto dopo il confine ANSI esplicitamente osservato nella sessione reale.
Dopo l'handoff è il menu/ACS Mystic a imporre tutti i permessi Guest.

Ogni connessione Guest usa un account tecnico distinto, bloccato atomicamente
con flock fino alla chiusura del backend. Il kernel rilascia il lock anche se
il processo muore. Pool esaurito: nessun TCP aggiuntivo, close1013. I limiti
Mystic esistenti restano invariati, inclusi MultiLogin e limiti per IP; il
traffico web arriva dal proxy loopback. Una sessione tecnica aperta manualmente
non viene aggirata dalle lease del broker.

CONFIGURAZIONE PRIVATA E A31
  /home/outsoft/outsoftware-web-bbs-private       owner outsoft,0700
    guest-settings.json                         owner outsoft,0600
    guest-pool.json                             owner outsoft,0600
    leases/                                    owner outsoft,0700
Il pool è fuori dal webroot e non viene incluso nell'archivio sorgenti.
I modelli in config/ sono disabilitati e contengono solo segnaposto.
Password A31: rispettare il limite nativo String[15]; il broker non tronca.
Sono previste due identità tecniche WebGuest01/WebGuest02 con Security1 e
StartMenu webguest, da verificare nell'editor nativo. Nessuna API A48 usata.

Il menu Guest deve permettere notizie/RAI e tutte le chat richieste, escludendo
server-side posta, dati personali, impostazioni, filebase/list/archive viewer,
upload/download e funzioni amministrative. Su A31 escludere anche la lettura
delle liste/archive viewer, non affidarsi al solo comando Download o al browser.
Nickname IRC scelto/univoco e autojoin nel canale reale appartengono alla door;
il broker non li inventa, non invia messaggi e non promette un canale #forum.

FILE
  site/                       frontend, client, font e tastiera locali
  site/access-policy.js       scelte consentite nell'interfaccia
  site/guest-capability.json  fallback statico di disponibilità false
  bbs_proxy.py                endpoint/target fissi, Guest e readiness dinamica
  guest_pool.py               file privati e lease esclusiva
  guest_login.py              profilo e macchina a stati dei prompt
  guest_transport.py         Telnet non bloccante, login e handoff
  GUEST_BACKEND.txt           specifica completa del broker
  config/Caddyfile            entrambi gli hostname, /ws e /ws/guest
  config/*.service           due servizi separati da Mystic
  certificates/              CA dedicata a Caddy, senza modifiche al sistema
  versions.json              provenienza e versioni
  runtime-manifest.json      SHA256 del payload della candidata
  tests/ e evidence/         fixture locali, rapporti e limiti della verifica
  baseline-v3-runtime-manifest.json  manifest precedente invariato

UNITÀ E PREREQUISITI
Proxy:
  /usr/bin/python3 -S -u /home/outsoft/outsoftware-web-bbs/bbs_proxy.py
Web:
  /home/outsoft/outsoftware-web-bbs/bin/caddy run
    --config /home/outsoft/outsoftware-web-bbs/config/Caddyfile --adapter caddyfile
Le due unità eseguono come outsoft e mantengono /mystic in sola lettura.
La sola nuova directory scrivibile del proxy è quella delle lease; DEVE
ESISTERE prima di avviare il servizio, anche se Guest resta disabilitato.
Pool/settings sono in sola lettura nel namespace del servizio. L'unità web
scrive solo in state/ e usa CAP_NET_BIND_SERVICE per80/443.

La sola unità Caddy imposta:
  SSL_CERT_FILE=/home/outsoft/outsoftware-web-bbs/certificates/ca-bundle.pem
SHA256 bundle:
  eeb64ecd7310d0b6aded5b50ead23e265c05e8a71b3d8ad6eef4725bbf7f2e06
Sono17root pubbliche del bundle certifi2026.10.19, incluse ISRG RootX1 assente
nel truststore del vecchio server. TLS/hostname rimangono verificati; nessuna
modifica al truststore OS, al proxy o a Mystic. Provenienza e licenze incluse.

CADDY SEPARATO, INVARIATO DALLA V3
  Versione2.11.7, binario statico x86_64, GOAMD64v1/CGO0.
  https://github.com/caddyserver/caddy/releases/download/v2.11.7/caddy_2.11.7_linux_amd64.tar.gz
  SHA256 archivio:
  727b91701a392de6ebc5027509f548bf39979e5216340d0faed8fa5e69c84f8b
  SHA256 bin/caddy:
  678ade3bfc088749c81a681adc603333ee0bb023b6a6cfe3c0f58bef8ff854e9
Il binario non è incluso nella candidata; può essere riusato dalla V3 soltanto
dopo verifica SHA. Le licenze originali sono incluse. Avviabilità sul kernel
reale4.8 è stata verificata durante lo staging precedente, non dedotta dal PC.

HOST E RETE
Entrambi i nomi servono la stessa pagina e mantengono il proprio hostname:
  bbs.outsoftware.it
  retrobbs.sinclair.homepc.it
Nessun redirect canonico tra nomi; HTTP passa a HTTPS sullo stesso nome.
Caddy richiede TLS per entrambi solo quando il servizio viene realmente avviato.
80/443 devono essere raggiungibili secondo NAT/firewall;6080/2019 sono loopback.
Client WebSocket usa window.location. Nuovo alias Telnet principale e vecchio
nome restano entrambi nella pagina. Nessun cambiamento a DNS/MX/NS/DDNS da qui.

VERIFICHE E LIMITI
  Broker Guest:21/21 fixture locali; trasporto/login/pool restano invariati.
  Readiness dinamica:8/8 controlli mirati; nessun TCP backend o lease.
  I due metodi WebSocket conservano il sorgente verificato della review.
  Registrati /ws:34/34, rapporti della review broker; target reale mai contattato.
  Frontend V4:27/27 controlli mirati (13 mobile +14 modalità/readiness).
  Caddy readiness:21/21 prove mirate su loopback effimero, ACME disabilitato;
  fallback solo sul GET esatto, policy/errori WebSocket conservati. Nessun
  servizio persistente o porta di produzione utilizzata.
  Grammatica Python3.5 verificata sui moduli; esecuzione server3.5 del nuovo
  Guest e autenticazione sui prompt reali ancora da completare.
I rapporti V3 presenti in evidence sono storici e non costituiscono una prova
live della V4. Il rapporto frontend usa DOM/socket finti e metodi originali
Connect/Disconnect/tastiera/CRT: non dimostra focus o resa grafica su hardware.
Il refuso upstream del font C128 resta documentato; il profilo CP437 è completo.

Comandi di fixture, senza BBS o chat:
  python3 -B -S tests/test_guest_broker.py
  BBS_WEB_REPORT_DIR=/percorso/report python3 -B -S tests/test_capability.py
  BBS_WEB_REPORT_DIR=/percorso/report python3 -B -S tests/test_proxy.py
  BBS_WEB_REVIEW_DIR=/percorso/report node tests/test_frontend.js
  bin/caddy adapt --config config/Caddyfile --adapter caddyfile
Le suite usano account sintetici e porte effimere, mai23 o6080 di produzione.

LICENZE E FONTI
fTelnet, commit5eb2c5183ab7c7768269a7d3fc8a66a634570289, AGPLv3+:
  https://github.com/rickparrish/fTelnet/tree/5eb2c5183ab7c7768269a7d3fc8a66a634570289
websockify0.12, commit99f83ca08390dc876b1b3580c210abea5b9f4edd, LGPLv3:
  https://github.com/novnc/websockify/releases/tag/v0.12.0
Caddy2.11.7, Apache2.0:
  https://github.com/caddyserver/caddy/releases/tag/v2.11.7
La pagina locale sources.html offre sorgenti completi fTelnet e il sorgente
pagina/proxy/broker/configurazione. Nessuna attribuzione upstream rimossa.
