Copilot Spaces e Memory: Knowledge Persistente per il Team
Tra settembre e dicembre 2025, GitHub trasforma radicalmente il modo in cui gestiamo il contesto in Copilot. Il lancio di Copilot Spaces in General Availability (24 settembre) introduce i curated context bundles per i team. La migrazione obbligatoria delle Knowledge Bases dal 17 ottobre al 1 novembre 2025 segna la fine di un'era. E infine, Copilot Memory in public preview il 19 dicembre 2025 aggiunge persistenza del contesto personale che attraversa chat, code review e CLI.
In questo ventunesimo articolo della serie GitHub Copilot, esploreremo in dettaglio come questi tre pilastri ridefiniscono la gestione della conoscenza: Spaces per i team, Memory per gli individui, e come prepararsi alla sunset delle Knowledge Bases che per anni hanno fornito contesto persistente ai progetti.
Cosa Imparerai
- Che cosa sono i Copilot Spaces e come funzionano i curated context bundles
- Componenti di uno Space: repository, code, pull requests, issues, note, file
- Come creare, configurare, condividere e pinare file in uno Space
- Timeline della sunset di Knowledge Bases e strategia di migrazione
- Public Spaces per OSS maintainer e individual sharing a dicembre
- Copilot Memory: user scope vs. repository scope e come persiste
- Quando usare Memory vs. Spaces nella tua pratica quotidiana
- Setup ottimale per monorepo Angular+Spring Boot con Memory e Spaces
- Privacy considerations e residenza dati GitHub-hosted (aprile 2026)
Panoramica della Serie Completa
| # | Articolo | Focus |
|---|---|---|
| 1 | Introduzione a GitHub Copilot | Cos'è e come funziona |
| 2 | Prompt Engineering per Copilot | Tecniche avanzate |
| 3 | Code Generation Patterns | Pattern di generazione codice |
| 4 | Testing con Copilot | Test generation e debugging |
| 5 | Code Review Automation | Review e suggestions |
| 6 | Security e Best Practices | Sicurezza del codice generato |
| 7 | Documentazione Automatica | Generazione docstring |
| 8 | Refactoring Assistito | Miglioramento codice |
| 9 | Copilot CLI | Riga di comando |
| 10 | GitHub Copilot in VS Code | Integrazione editor |
| 11 | GitHub Copilot in JetBrains | IDE JetBrains |
| 12 | GitHub Copilot in Visual Studio | Visual Studio |
| 13 | Copilot Chat | Chat conversazionale |
| 14 | Knowledge Bases v1 | Contesto persistente (legacy) |
| 15 | Copilot Workspaces (Beta) | Ambienti di sviluppo |
| 16 | Copilot Extensions (Beta) | Plugin e estensioni |
| 17 | Model Selection & Fine-Tuning | Scelta e personalizzazione |
| 18 | Enterprise Features | SAML, seat management |
| 19 | Performance & Cost Optimization | Ottimizzazione economica |
| 20 | GitHub Universe 2025 Recap | Novità principali |
| 21 | Copilot Spaces e Memory (sei qui) | Knowledge persistente team+user |
1. Il Problema del Contesto Ripetuto
Per anni, la sfida principale di Copilot è stata la perdita di contesto fra conversazioni. Se condivissi l'architettura del tuo progetto Spring Boot in una chat, quella conoscenza svaniva alla prossima sessione. Se volessi che Copilot comprendesse la strategia di testing del tuo team, dovresti ripeterla ogni volta.
Le Knowledge Bases (lanciate a febbraio 2024) hanno risolto parzialmente il problema, permettendo di caricare documenti in un knowledge base persistente. Ma avevano limitazioni: erano scarsamente indicizzate, non supportavano aggiornamenti in tempo reale dei repository, e gestivano male repository grandi.
La Progressione: Knowledge Bases → Spaces → Memory
| Soluzione | Lancio | Scope | Persistenza | Aggiornamento |
|---|---|---|---|---|
| Knowledge Bases | Feb 2024 | Team/Progetto | Manuale (file upload) | Semi-auto (requires refresh) |
| Copilot Spaces | Sep 24, 2025 (GA) | Team/Progetto | Automatica (repo link) | Real-time (live binding) |
| Copilot Memory | Dec 19, 2025 (Preview) | User/Preferenze | Cloud GitHub-hosted | Istantanea (AI model memory) |
2. Copilot Spaces in General Availability (24 Settembre 2025)
Copilot Spaces sono curated context bundles - raccolte di risorse di repository organizzate per il team. A differenza delle Knowledge Bases (che richiedevano upload manuali), gli Spaces sono vivi e sempre aggiornati perchè collegati direttamente ai tuoi repository GitHub.
Che cosa è uno Space?
Uno Space è una raccolta strutturata di contesto per un progetto o un'area di codice. Puoi curarla manualmente, ma GitHub indicizza automaticamente il contenuto dai tuoi repository nel momento in cui lo pinni.
┌─ Spring Boot Backend Auth Space (Esempio reale) ────────────────┐
│ │
├─ Repository Sources │
│ ├─ src/main/java/dev/federicocalo/portfolio/domain/ (pinned)│
│ ├─ src/main/java/dev/federicocalo/portfolio/application/ │
│ ├─ src/main/resources/db/migration/ (Flyway DDL) │
│ └─ docs/06_compliance/04_refactoring_architetturale/ │
│ │
├─ Pull Requests (auto-indexed) │
│ ├─ #247: "feat: JWT proprietaria con refresh token" │
│ ├─ #251: "fix: SSRF guard per External API" │
│ └─ #245: "test: AuthControllerTest @Testcontainers" │
│ │
├─ Issues (reference automatica) │
│ ├─ #198: "Security: Implement SUPER_ADMIN role" │
│ └─ #204: "Feature: API Key management for dataset queries" │
│ │
├─ Free-text Notes │
│ ├─ "JWT Strategy: HS256 via JwtService, refresh hash-in-DB" │
│ ├─ "Roles hierarchy: GUEST
Componenti di uno Space (settembre 2025)
Tipi di Contesto Supportati
Tipo Descrizione Auto-Aggiornamento Uso Tipico
Repositories
Link a repo Github (interi o specifiche directory)
✓ Real-time
Codice sorgente, architettura
Code Snippets
File o funzioni specifiche da repo GitHub
✓ Live binding
Pattern, configurazioni, helper
Pull Requests
Riferimenti a PR per contesto di discussione
✓ Auto
Decisioni architetturali, trade-off
Issues
Issue GitHub per requisiti e tracking
✓ Auto
Requisiti, bug report, decisioni
Free-Text Notes
Testo libero scritto direttamente nello Space
✗ Manuale
Principi progettuali, preferenze team
File Uploads
PDF, immagini, diagrammi caricati
✗ Manuale
Diagrammi architetturali, decision records
3. Creare, Configurare e Gestire uno Space
La creazione di uno Space è semplice tramite l'interfaccia GitHub.com. In questa sezione
vediamo il flusso passo-passo per lo scenario reale: un team che vuole documentare
l'architettura di autenticazione di Spring Boot.
Step 1: Navigare a Spaces
Flusso UI per creare uno Space
1. Vai a github.com/settings/copilot/spaces
(oppure clicca "Copilot" nel menu principale)
2. Clicca "New Space" (pulsante blu in alto a destra)
3. Compila il form:
Nome Space: "Spring Boot Backend Auth"
Descrizione: "Architecture, JWT strategy, role hierarchy, security"
Privacy: "Private" (default, cambiabile a dicembre con Public Spaces)
Repository (optional): seleziona il repo principale (es. portfolio-backend)
4. Clicca "Create Space"
Step 2: Aggiungere Risorse
Una volta creato, lo Space ha una pagina di configurazione dove aggiungi il contesto.
Ecco il workflow per il nostro scenario:
Aggiungere repository e file a uno Space
Nella pagina dello Space:
1. AGGIUNGI REPOSITORY
- Clicca "Add Repository" → seleziona portfolio-backend
- GitHub auto-indexes il contenuto
- Indicizzazione: real-time su push
2. PINNA FILE SPECIFICI (per focus)
- Naviga: src/main/java/dev/federicocalo/portfolio/...
- Clicca ⭐ "Pin" accanto ai file chiave:
✓ presentation/controller/AuthController.java
✓ application/auth/usecase/LoginUseCase.java
✓ domain/auth/JwtTokenProvider.java
✓ infrastructure/security/JwtService.java
✓ src/main/resources/db/migration/V011__auth_tables.sql
- I file pinnati appaiono come "High Priority" in Copilot
3. AGGIUNGI PULL REQUESTS
- Sezione "Pull Requests" → "Add PR"
- Seleziona PR importanti:
#247: feat(security): JWT proprietaria con refresh token
#251: fix(security): SSRF guard per external API
- Copilot indexa titolo, descrizione, commenti, diff
4. AGGIUNGI NOTE LIBERE
- Sezione "Notes" → "New Note"
- Titolo: "JWT Architecture & Refresh Token Flow"
- Contenuto: (copia-incolla)
"""
## JWT Strategy
- Algoritmo: HS256
- Issuer: federicocalo.dev
- Expire: 15 minuti (access), 30 giorni (refresh)
- Refresh token: hash-in-DB, validazione su ogni refresh
- Scopo: Autenticazione stateless con sessione backend opzionale
## Roles Hierarchy
GUEST < USER < PRO < MODERATOR < ADMIN < SUPER_ADMIN
- GUEST: No auth, public content only
- USER: Basic user, newsletter, comments
- PRO: Premium features, dataset marketplace
- MODERATOR: Content moderation, user reports
- ADMIN: Full admin except SUPER_ADMIN operations
- SUPER_ADMIN: System administration, user role assignment
## Security Constraints
- SSRF guard blocca IP privati, loopback, link-local
- Rate limiting Bucket4j: 120 req/min API, 6 req/min AI
- CORS whitelist: federicocalo.dev, localhost dev
"""
5. AGGIUNGI DIAGRAMMI (file upload)
- Sezione "Attachments" → "Upload"
- Carica:
auth-flow-diagram.png (sequence diagram JWT flow)
role-hierarchy.svg (grafo gerarchico ruoli)
database-schema.png (auth tables ER diagram)
- Copilot li analizza via vision quando rilevante
Step 3: Condividere lo Space
Condivisione Team e Permessi
Nella pagina dello Space → Settings:
1. AGGIUNGI TEAM MEMBERS
- Clicca "Share Space" → "Add People"
- Seleziona: @frontend-team, @backend-team, @qa-team
- Permessi: "Read" (default, loro non possono editare)
- Oppure assegna "Edit" se trusted maintainer
2. GENERA LINK PUBBLICO (dicembre 2025)
- After dicembre 9: attiva "Public Spaces"
- Genera link non-discoverable (e.g., /spaces/uuid-xxx)
- Condividi con OSS community, contractor, auditor
3. VISIBILITÀ
- Private (default): Solo invitati
- Public (dicembre): Visibile via link, non su GitHub Spaces directory
- Future: Discovery directory (roadmap GitHub)
4. Knowledge Bases Sunset (1 Novembre 2025) - Hard Deadline
Le Knowledge Bases, lanciate a febbraio 2024, vengono deprecate
il 1 novembre 2025. Dopo quella data, non è più possibile crearne di nuove, e tutti
i Knowledge Bases esistenti saranno eliminati. I team che ancora le usano devono migrare
a Copilot Spaces entro il 31 ottobre 2025.
Timeline Knowledge Bases Sunset
Data Evento Azione Richiesta
Aug 20, 2025
Annuncio sunset notice
Informa il team della deprecazione
Oct 17, 2025
"Convert to Space" button appare
Inizia migrazione dei Knowledge Bases
Oct 31, 2025
Deadline migrazione
Ultimi giorni per convertire
Nov 1, 2025
Eliminazione Knowledge Bases
Tutti i Knowledge Bases sono CANCELLATI, no recovery
Perché le Knowledge Bases sono state sostituite?
Le Knowledge Bases avevano tre grandi problemi:
- Separazione dal codice: I file caricati non riflettevano i cambiamenti
in tempo reale nei repository. Se aggiornavi un file, dovevi re-uploadarlo.
- Scalabilità limitata: Grandi repository (es. >100 MB) causavano timeout
durante l'indexing.
- Gestione tediosissima: Aggiornamenti manuali, versionamento parziale,
nessun support per branch diversi.
Gli Spaces risolvono tutto collegando direttamente i repository GitHub, sincronizzando
in tempo reale e permettendo di pinnare file specifici senza caricare gigabyte di dati.
Come Migrare da Knowledge Base a Space
Procedura di migrazione automatica
## Passo 1: Individua i tuoi Knowledge Bases
Vai a github.com/settings/copilot/knowledge-bases
Lista tutti i KB che hai creato
## Passo 2: Clicca "Convert to Space" (dal 17 ottobre)
Per ogni Knowledge Base:
1. Apri il KB
2. Clicca "Convert to Space" (nuova UI button)
3. Seleziona il repository principale
4. Rivedi i file pinned (GitHub proverà a mappare i file caricati)
5. Clicca "Create Space"
## Passo 3: Verifica il Space
1. Nuovo Space appare in Copilot Spaces
2. Controlla che tutti i file key siano pinned
3. Aggiungi note aggiuntive se necessario
4. Verifica che PR/Issues siano correttamente indexate
## Passo 4: Decommissiona il Knowledge Base
1. Torna al KB originale
2. Clicca "Delete" (non più usato)
3. Dichiara il nuovo Space come canonical reference
## Timeline (Consigliato)
- Oct 17-24: Converti il 50% dei KB (test veloce)
- Oct 25-31: Converti il 50% rimanente + verifica finale
- Nov 1: Knowledge Bases scompaiono, Spaces sono la nuova norma
Checklist di Migrazione
- [ ] Inventario completo di tutti i Knowledge Bases in uso
- [ ] Identifica i file chiave dentro ogni KB
- [ ] Crea Spaces con repository + pinned file equivalenti
- [ ] Testa Copilot con il nuovo Space (prompt di verifica)
- [ ] Aggiungi note e PR/issues al Space
- [ ] Comunica il nuovo Space al team
- [ ] Elimina il Knowledge Base
- [ ] Documenta nell'ADR la nuova strategia di contesto
5. Public Spaces e Individual Sharing (9 Dicembre 2025)
Il 9 dicembre 2025, GitHub abilita Public Spaces e individual sharing,
trasformando gli Spaces da strumento team-only a tool di collaborazione allargata.
Public Spaces
Un Public Space è accessibile tramite link diretto ma NON è indicizzato
nel directory di GitHub Spaces (privacy-by-design). Puoi condividere il link con
OSS community, auditor, contractor, o chiunque altro, ma la scoperta è esplicita (link sharing).
Abilitare uno Space come Public (dicembre 2025)
Nella pagina dello Space → Settings:
1. Visibilità: Cambia da "Private" a "Public"
- GitHub genera un UUID link: /spaces/abc123def456
- Non appare su https://github.com/spaces (no directory listing)
- Chiunque abbia il link può visualizzare (view-only by default)
2. Condividi il link
- Con community: posta su Twitter/Reddit/Dev.to
- Con contractor: email the link per onboarding
- Con auditor: per review architetturale
3. Permessi di View-Only
- I visitatori possono leggere il contesto
- NON possono modificare, pinare, o aggiungere file
- Il team che possiede lo Space rimane gestore esclusivo
Esempio link: https://github.com/spaces/abc123-portfolio-backend-auth
Individual Sharing (dicembre 2025)
Prima di dicembre, uno Space è tutto-o-nulla: o è privato (solo team invitati) oppure
sarà pubblico (chiunque con link). Dal 9 dicembre, puoi invitare utenti specifici
senza renderlo pubblico.
Invitare utenti specifici (dicembre 2025)
Nella pagina dello Space → Share → "Invite People":
1. Digita username GitHub (e.g., @john-doe)
2. Seleziona permessi: "View" (default) oppure "Edit"
3. Clicca "Send Invite"
4. L'utente riceve notifica + link privato allo Space
5. Lui è l'unico che può accedere (no link pubblico)
Scenari di utilizzo:
- Contractor che lavora su una feature: invite con "Edit" + repo specifico pinnato
- Client esterno che rivede l'architettura: invite con "View"
- Auditor di sicurezza: invite con "View" + access a decision records & security notes
Add Files from github.com Viewer (dicembre 2025)
Finora, per aggiungere un file a uno Space, dovevi navigare alla pagina dello Space
e pinnare. Dal 9 dicembre, puoi pinnare direttamente dal file viewer su github.com:
Workflow streamlined: pinnare da github.com (dicembre 2025)
1. Naviga a github.com/portfolio-backend/blob/main/src/main/java/...JwtService.java
2. Nel file viewer, clicca il menu "..." (three dots)
3. Seleziona "Add to Space"
4. Scegli quale Space (dropdown)
5. Clicca "Add"
6. Il file è ora pinnato; Copilot lo vede istantaneamente
Vantaggi:
- Non serve uscire dal file viewer
- Workflow naturale mentre navigate il codebase
- Gli altri team member vedono subito il file pinnato
6. Copilot Memory: Public Preview (19 Dicembre 2025)
Copilot Memory è il nuovo sistema di persistenza personale del contesto.
A differenza degli Spaces (che sono curati dal team e condivisi), Memory è individuale
e cross-tool: una volta che lo dici a Copilot qualcosa su di te o sul tuo workflow,
Copilot se lo ricorda in chat, code review, CLI, ovunque.
Che cosa Copilot Memory Memorizza
Tipi di Preferenze Persistenti
Categoria Esempio Scope Persistenza
Stile Codice
"Preferisco records Java per DTOs (immutabilità)"
User-global
Tutti gli use case da user
Architettura
"Usiamo Clean Architecture 4-layer, no circular deps"
Repository-scoped
Solo nei comandi di questo repo
Testing Preferences
"Unit test con JUnit 5 + Mockito, 80% coverage target"
Repository-scoped
Applica quando genero test
Naming Conventions
"Use case classes: *UseCase suffix (LoginUseCase.java)"
Repository-scoped
Generation + refactoring
Tech Stack
"Spring Boot 3.4, Java 21, PostgreSQL 16, Redis 7"
Repository-scoped
Configuration suggestions
Performance Targets
"APIs <100ms p99, FCP <1.5s, LCP <2.5s"
Repository-scoped
Code review suggestions
Memory Scope: User vs. Repository
Copilot Memory ha due scope:
- User-Level Memory: Applica a TUTTI i tuoi progetti.
Esempi: "Preferisco TypeScript strict mode", "Voglio output JSON ogni volta", "Mi piacciono i test scritti per primi".
- Repository-Level Memory: Applica SOLO a questo repo.
Esempi: "Questo progetto usa Clean Architecture", "Target 80% coverage", "JUnit 5 + Mockito per i test".
Settare Memory in Copilot Chat (dicembre 2025)
Scenario 1: USER-LEVEL MEMORY
In Copilot Chat (qualsiasi progetto), scrivi:
> Remember: I prefer immutability. Always create new objects, never mutate.
> Remember: I want TypeScript strict mode enabled.
> Remember: Test-driven development. Write tests first.
Copilot risponde:
"✓ Remembered: immutability preference
✓ Remembered: TypeScript strict mode
✓ Remembered: TDD approach"
Ora, in ogni progetto futuro, Copilot appliche questi principi.
---
Scenario 2: REPOSITORY-LEVEL MEMORY
In Copilot Chat (questo repo), scrivi:
> For this repository, remember:
> - Clean Architecture: 4-layer (domain > application > infrastructure > presentation)
> - No circular dependencies allowed
> - Use case classes end with "UseCase" (LoginUseCase.java)
> - Target 80% test coverage
> - Rate limiting via Bucket4j
> - JWT: HS256 via JwtService, refresh token hash-in-DB
Copilot risponde:
"✓ Remembered for portfolio-backend:
- Architecture: Clean 4-layer
- No cycles
- UseCase naming
- 80% coverage
- Bucket4j rate limiting
- JWT strategy"
Solo quando lavori in portfolio-backend, questi constraint si applicano.
Su altri repo, il memory è indipendente.
---
Scenario 3: QUERY CHE ATTIVA MEMORY
Adesso chiedi:
> Implementa il controller per la autenticazione
> Scrivi i test prima
Copilot ricorda:
1. TDD approach (da user memory) → write tests first
2. Clean Architecture (da repo memory) → controller in presentation layer
3. UseCase suffix (da repo memory) → LoginUseCase in application layer
4. 80% coverage target (da repo memory) → comprehensive test cases
5. JWT strategy (da repo memory) → JWT handling specifico
La risposta è personalizzata su TUTTI questi preferenze memorizzate.
Cross-Tool Persistenza (Chat, Review, CLI)
La vera potenza di Memory è la sincronizzazione cross-tool.
Se dici a Copilot Chat qualcosa, Copilot Code Review lo sa. Se lo dici in CLI, Chat lo sa.
Tutto è GitHub-hosted e sincronizzato.
Memory persiste su chat, review, CLI (dicembre 2025+)
Giorno 1: Pomeriggio - Copilot Chat VS Code
> @copilot, remember: For portfolio-backend, use Clean Architecture strictly
Giorno 2: Mattina - Copilot Code Review GitHub
Apri una PR: "#252: Add UserController"
Copilot automaticamente commenta:
"✓ I see Clean Architecture is in effect.
Suggestion: UserController should be in 'presentation/controller'.
I also remember: 80% test coverage target. This PR has 45 tests for X changes - on track."
Giorno 3: Sera - Copilot CLI (se lanciato)
$ copilot explain src/main/java/.../UserController.java
Copilot automaticamente applica le Clean Architecture rules e commenta.
=> Memory è sincronizzato ovunque tu sia in GitHub ecosystem.
7. Memory vs. Spaces: Quando Usare Quale?
Ora che abbiamo visto sia Memory che Spaces, è naturale chiedersi: quale usare?
La risposta dipende dallo scope e dalla natura delle preferenze.
Confronto Memory vs. Spaces
Aspetto Copilot Memory Copilot Spaces
Scope
Personale (user) + repository
Team/Progetto (condiviso)
Chi le crea
Singolo sviluppatore
Chiunque nel team (moderato da owner)
Visibilità
Solo tu (GitHub-hosted, privata)
Team (private) oppure chiunque con link (public)
Aggiornamento
Automatico (Copilot impara dal tuo uso)
Manuale (pinning) o auto (repo binding)
Best For
Preferenze personali, stile di coding
Contesto condiviso, reference architecture
Persistenza
Cloud GitHub (US/EU dall'apr 2026)
Lato repo GitHub (storage pubblico)
Cross-Tool
✓ Chat + Review + CLI
✓ Chat + Review (in scope repo)
Matrice Decisionale
Quando usare Memory vs. Spaces
┌─ MEMORIA PERSONALE (Memory) ─────────────────┐
│ Domanda: "Voglio che Copilot ricordi sempre…?" │
│ Risposta: SÌ (memoria personale) │
│ Esempi: │
│ - "Preferisco records Java per DTOs" │
│ - "TypeScript strict mode sempre" │
│ - "TDD: test first, implementation secondo" │
│ - "Niente mutation, immutabilità sempre" │
│ - "Usa English per i commenti nel codice" │
│ → Usare: Memory (user-level) │
└──────────────────────────────────────────────┘
┌─ MEMORIA TEAM/PROGETTO (Spaces) ──────────────┐
│ Domanda: "Vuoi che il team lo conosca…?" │
│ Risposta: SÌ (contesto condiviso) │
│ Esempi: │
│ - "Usiamo Clean Architecture 4-layer" │
│ - "Spring Boot 3.4, Java 21, PostgreSQL" │
│ - "Rate limiting Bucket4j, JWT HS256" │
│ - "Decision records in docs/" │
│ - "PR template: #issue, description, test plan" │
│ → Usare: Spaces (team-level) │
└──────────────────────────────────────────────┘
┌─ CONTESTO REPOSITORY-SPECIFICO ─────────────┐
│ Domanda: "Vale solo per questo repo…?" │
│ Risposta: SÌ │
│ Esempi: │
│ - "Questo repo: Clean Arch 4-layer" │
│ - "Questo repo: 80% test coverage" │
│ - "Questo repo: UI TypeScript strict" │
│ → Usare: Memory (repository-scoped) │
│ + Spaces (per contesto vivo: PR, issues) │
└──────────────────────────────────────────────┘
8. Setup Ottimale per Monorepo Angular+Spring Boot
Applichiamo tutto quello che abbiamo imparato a un scenario reale: un monorepo con
Angular 21 frontend SSR e Spring Boot 3.4 backend, come il portfolio di Federico Calò.
Strategia Memory (Personale)
Memory user-level per Federico Calò (developer)
# Copilot Chat → set user-level memory
> Remember:
> - Immutability first: create new objects, never mutate
> - TypeScript strict mode always
> - Java: prefer records for DTOs (immutable)
> - TDD: write tests first
> - No deep nesting: max 4 levels
> - Functions <50 lines, files <800 lines
> - Explicit error handling everywhere
> - No hardcoded values: use constants or config
> - Code review before commit: readability, naming, structure
> - Performance: think caching, lazy loading, bundling
Copilot risponde:
"✓ User memory set for Federico Calò
- Immutability enforcement
- TypeScript strict
- Java records for DTOs
- TDD approach
- Code size limits (4 nesting, 50 line functions, 800 line files)
- Error handling
- Constants not hardcoding
- Pre-commit review
- Performance mindset"
Da qui in poi, TUTTI i comandi di Copilot (chat, code generation, refactoring, test generation)
useranno questi principi.
Strategia Memory (Repository-Level)
Memory repository-scoped per portfolio-backend
# In Copilot Chat, con la directory backend/ aperta
> For this repository (portfolio-backend), remember:
>
> ## Architecture
> - Clean Architecture 4-layer (domain > application > infrastructure > presentation)
> - Zero circular dependencies
> - Domain layer: business rules, entities, ports (no framework)
> - Application layer: use cases, DTOs, orchestration
> - Infrastructure layer: persistence, external integrations
> - Presentation layer: controllers, REST API, request/response marshaling
>
> ## Code Standards
> - Use case classes: *UseCase suffix (LoginUseCase, PublishArticleUseCase)
> - DTOs: records (immutable)
> - Repositories: interface in domain, impl in infrastructure
> - No service layer (use cases replace it)
> - DTOs use @Builder or records
>
> ## Testing
> - Target: 80%+ coverage
> - JUnit 5 + Mockito
> - Testcontainers for integration (PostgreSQL, Redis)
> - Test naming: testXxxWithYyyExpectZzz
>
> ## Dependencies
> - Spring Boot 3.4.1
> - Java 21
> - PostgreSQL 16 (database)
> - Redis Stack 7 (cache)
> - Bucket4j (rate limiting)
> - Resilience4j (circuit breaker, retry)
> - Spring Security + JWT (HS256)
> - Spring Data JPA + Flyway
>
> ## Security
> - JWT: HS256 via JwtService
> - Refresh token: hash-in-DB (not in JWT)
> - Roles: GUEST - SSRF guard: block private IPs, loopback, link-local
> - Rate limit: 120 req/min API, 6 req/min AI
> - CORS whitelist: federicocalo.dev + localhost
>
> ## Performance Targets
> - API response: <100ms p99
> - Database queries: indexed on common lookups
> - Caching: Spring Cache @Cacheable (1h TTL typical)
> - No N+1 queries
>
> ## Database
> - PostgreSQL 16
> - Flyway migrations (src/main/resources/db/migration/)
> - Migration naming: V###__description.sql
> - No data mutation migration (data fixtures only)
>
> ## External Integrations
> - Stripe SDK: checkout sessions, webhooks (5 event types)
> - Email: self-hosted Postfix+Resend (EmailService)
> - Python ML: fallback provider chain (Cloudflare → Ollama)
Copilot risponde:
"✓ Repository memory set for portfolio-backend:
- Clean Architecture enforced
- UseCase naming standard
- 80% coverage target
- JUnit 5 + Mockito
- Spring Boot 3.4.1 with Security/JWT
- PostgreSQL + Redis
- Bucket4j rate limiting
- API <100ms p99 target"
D'ora in poi, quando lavori su portfolio-backend, Copilot applica questi constraint.
Se generi un controller, lo metterà in presentation/. Se scrivi test, userà JUnit 5.
Strategia Memory per Frontend
Memory repository-scoped per portfolio-frontend
# In Copilot Chat, con la directory frontend/ aperta
> For this repository (portfolio-frontend), remember:
>
> ## Framework & Stack
> - Angular 21 with @angular/ssr (Server-Side Rendering)
> - TypeScript 5.9 (strict mode)
> - Standalone components (no modules)
> - OnPush change detection everywhere
> - Signals for state management (no RxJS except HTTP)
> - CSS scoped to component (no global styles)
>
> ## Component Structure
> - One component per file
> - File naming: kebab-case (user-profile.component.ts)
> - Component class: PascalCase (UserProfileComponent)
> - Selector: app-user-profile (app- prefix)
> - Template: inline (unless >100 lines, then separate .html)
> - Styles: inline (unless >50 lines, then separate .css)
>
> ## Routing
> - Lazy-loaded routes (RenderMode.Server for SSR)
> - Route guards for auth (canActivate)
> - 1014 prerendered routes for SEO
>
> ## Testing
> - Jasmine + Karma
> - Target: 80% coverage (currently 2.7%, improving)
> - Test naming: should...when...
> - Mock services with jasmine.createSpyObj
>
> ## I18n
> - XLF translation format
> - 18 languages: IT, EN (compiled), 16 (fallback)
> - i18n keys on every new component (mandatory)
> - Extract with ng extract-i18n
>
> ## Performance Targets
> - FCP <1.5s, LCP <2.5s, TTI <3.5s
> - Bundle <3 MB (initial), <40 kB per lazy route
> - Lighthouse score 90+ (all categories)
> - Image lazy loading + WebP format
>
> ## Accessibility
> - WCAG 2.1 AA compliance
> - Semantic HTML5
> - ARIA labels where needed
> - Keyboard navigation support
> - Focus indicators visible
>
> ## SEO
> - Meta tags (title, description, og:*)
> - JSON-LD structured data
> - Sitemap with 18 language versions
> - Canonical URLs
Copilot risponde:
"✓ Repository memory set for portfolio-frontend:
- Angular 21 SSR + TypeScript strict
- Standalone components + OnPush
- Signals for state
- Lazy routing
- 18-language i18n
- 80% test coverage target
- Lighthouse 90+
- WCAG 2.1 AA"
Copilot Spaces Strategy
Space Name: "Portfolio Backend - Authentication & Security"
Privacy: Private (team-only, no public for security reasons)
Contents:
1. Repository Links
✓ portfolio-backend (full)
✓ Pinned: src/main/java/dev/.../auth/
✓ Pinned: src/main/resources/db/migration/V0{11-20}*auth*
2. Pull Requests
✓ #247: feat(security): JWT proprietaria con refresh token
✓ #251: fix(security): SSRF guard per external API
✓ #245: test(auth): AuthControllerTest @Testcontainers
3. Issues
✓ #198: Security: Implement SUPER_ADMIN role
✓ #204: Feature: API Key management
✓ #156: Security audit: rate limiting
4. Free-Text Notes
### JWT Architecture
- Algoritmo: HS256
- Issuer: federicocalo.dev
- Access token: 15 minuti
- Refresh token: 30 giorni (hash-in-DB)
### Roles Hierarchy
GUEST
Workflow Quotidiano Integrato
Day-in-the-life: Memory + Spaces in azione
Mattina (9:00): Standup backend
- Copilot Chat aperto
- User memory attivo: immutability, TDD, clean architecture
- Repo memory (portfolio-backend) attivo: Clean Architecture 4-layer, JWT, 80% coverage
- Copilot Spaces "Portfolio Auth" in sidebar
=> Federico chiede: "Implementa il controller per user registration"
Copilot automaticamente:
- Mette il controller in presentation/
- Crea la use case in application/ (RegisterUserUseCase)
- Scaffolda il domain entity e port
- Scrive i test prima (TDD)
- Applica Clean Arch (no circular deps)
- Implementa error handling esplicito
- Applica rate limiting Bucket4j
- Usa records per RegistrationRequest/Response DTOs
Pomeriggio (14:00): Code review
- Apre una PR #256
- Copilot Code Review (powered by Memory)
- Commento automatico:
"✓ Clean Architecture respected (controller → usecase → domain)
✓ Tests present (TDD observed)
✓ 87 tests (+5 new) = 80.2% coverage target on track
✓ Rate limiting applied (Bucket4j)
✓ Error handling comprehensive
🔍 Suggestion: Consider caching password check failures (rate limit brute-force)"
Sera (18:00): Onboarding contractor
- Condividi lo Space "Portfolio Auth" con contractor (individual share, dicembre)
- Contractor può leggere tutta l'architettura
- Copilot sa che contractor ha accesso: limitato a specifico file pinnato
- Team rimane proprietario dello Space
9. Privacy Considerations: Dove Vivono Memory e Spaces?
Una domanda importante: dove GitHub salva il Memory? E i Spaces?
La risposta è importante per la compliance (GDPR, diritto UE, etc.).
Residenza Dati GitHub Copilot (Aprile 2026)
Componente Storage Residenza Default Opzioni
Copilot Memory
GitHub-hosted
USA (region us-east-1)
EU residency opt-in (apr 2026)
Copilot Spaces (private)
GitHub repo metadata
Dove il repo è
Repo location (can be EU)
Copilot Spaces (public)
GitHub public storage
CDN globale
N/A (public)
Chat History
GitHub (Enterprise/Pro)
USA
EU opt-in (apr 2026)
GDPR Compliance
GitHub ha dichiarato (articolo 27 GDPR, aprile 2026) che:
- Residenza dati EU: Se dichiari l'organizzazione/utente come EU,
Memory e chat history possono essere hosted in regione EU (ireland-1) instead of USA.
- Dati di training: GitHub non usa i tuoi Copilot prompts per il training
del modello (opt-out by default, no training on user data).
- Retention: Memory viene mantenuto indefinitamente fino a deletion manuale.
Chat history può essere deleted manually o dopo 30 giorni (configurable).
- Data Subject Rights: Puoi richiedere accesso, rettificazione, cancellazione
(diritti GDPR articoli 15-17) tramite https://support.github.com/request/gdpr.
Come Richiedere EU Residency (Aprile 2026)
Setup EU data residency per Copilot (aprile 2026+)
# Procedure (expected aprile 2026)
1. Vai a GitHub Settings → Copilot → Data Residency
2. Seleziona: "European Union (Ireland)"
3. Conferma che sei una persona/organizzazione EU
4. GitHub migra Memory + Chat history (potrebbe richiedere 24-48 ore)
## Verifica
- Impostazione è salvata in Settings
- Nuovi Copilot prompts sono stored in ireland-1
- Precedente data rimane in us-east-1 (migrazione in corso)
## Note
- Se cambi regione, Memory non viene cancellato
- Solo il NEW data storage location cambia
- Performance could differ slightly (latency ireland vs usa)
10. Prospettive Future: Copilot CLI con Memory Support
Mentre Memory è in public preview il 19 dicembre 2025, GitHub annuncia anche
il Copilot CLI pubblico per early 2026, con Memory support
da terminale. Questo significa che potrai fare:
Copilot CLI con Memory (early 2026)
$ copilot explain ./src/main/java/auth/JwtService.java
# Copilot legge il file e applica Memory:
# - User memory: immutability, TDD, clean arch
# - Repo memory (portfolio-backend): Clean Architecture 4-layer, JWT specifics
# - Genera spiegazione che rispetta tutti questi constraint
Output:
"JwtService: Provides HS256 JWT generation and validation.
Key methods:
- generateAccessToken(): Creates 15-min JWT
- generateRefreshToken(): Creates 30-day refresh (hash-in-DB, not JWT)
- validateToken(): Validates signature and expiry
Architecture: Application layer service, injected into AuthController.
Immutability: Token claims are final/immutable.
Testing: Full coverage in JwtServiceTest with Mockito.
Note: Remember your memory says 'no circular dependencies' - this class
is imported by AuthController (presentation) correctly."
---
$ copilot generate-code --context "portfolio-backend" --type "usecase"
Enter description: "User password reset with email confirmation"
# Genera un UseCase seguendo Memory:
---
$ copilot review my-branch
# Analizza commit su my-branch applicando Memory:
# - Clean Architecture rules
# - Test coverage target
# - Security constraints
# - Performance targets
11. Checklist: Come Implementare Memory e Spaces nel Tuo Team
Ecco una checklist pratica per migrare e implementare Memory e Spaces
nel tuo team entro dicembre 2025.
Checklist di Implementazione (Trimestre Q4 2025)
- [ ] Settembre (lancio Spaces GA)
- [ ] Inventario di tutti i Knowledge Bases in uso
- [ ] Pianifica migrazione: quali KB → quali Spaces
- [ ] Crea il primo Space come pilot (e.g., Auth Space per backend)
- [ ] Testa Copilot Chat con lo Space: prompt di verifica
- [ ] Documenta il flusso nel team (wiki, ADR)
- [ ] Ottobre (migrazione Knowledge Bases)
- [ ] Dal 17 ott: clicca "Convert to Space" sui KB
- [ ] Rivedi ogni Space convertito (file, PR, issues)
- [ ] Crea Spaces aggiuntivi per aree non coperte (QA, DevOps, etc.)
- [ ] Invita team members a ogni Space
- [ ] Verifica cross-tool (Chat, Review, CLI)
- [ ] Elimina Knowledge Bases deprecati (deadline 1 nov)
- [ ] Dicembre (Memory + Public Spaces)
- [ ] Memory public preview (19 dic): setup user-level memory per ogni dev
- [ ] Setup repository-level memory per portfolio-backend e portfolio-frontend
- [ ] Public Spaces (9 dic): valuta se rendere OSS Spaces pubblici
- [ ] Individual sharing (9 dic): invita contractor/auditor se necessario
- [ ] Test cross-tool: Chat, Code Review, CLI con Memory attivo
- [ ] Docume nta best practices Memory nel team (what to remember, what not)
- [ ] Privacy check: verificare EU residency se applicabile (apr 2026)
- [ ] Q1 2026+ (stabilization)
- [ ] Monitora usage: quali Spaces sono più usati?
- [ ] Aggiorna Memory sulla base di feedback del team
- [ ] Copilot CLI pubblico (early 2026): integra nel workflow CI/CD
- [ ] Reportistica: misurate impact su productivity, code quality
Conclusione: Una Nuova Era di Knowledge Persistente
L'evoluzione da Knowledge Bases → Copilot Spaces → Copilot Memory rappresenta
un salto qualitativo nella gestione della conoscenza per team di sviluppo.
Non è più sufficiente spiegare l'architettura una volta: ora il contesto vive nel tuo
ecosistema GitHub, sempre aggiornato, sempre sincronizzato, sempre disponibile.
Copilot Spaces risolvono il problema del contesto condiviso
collegando direttamente i repository e indicizzandoli in tempo reale.
Copilot Memory aggiunge una dimensione personale: i tuoi preferimenti
di coding persistono, cross-tool, senza ripetizione.
3 Azioni Immediate (Prima di Dicembre 2025)
- Migra Knowledge Bases a Spaces: Dal 17 ottobre, usa il "Convert to Space"
button. Deadline 1 novembre - dopo quella data, tutto è perduto.
- Configura Memory User-Level: Dic 19, quando Memory esce in preview,
settalo per le tue preferenze personali (immutability, TDD, linguaggio, etc.).
- Crea Repository Memory: Stesso giorno, configura preferenze specifiche
per ogni repo (Clean Architecture per backend, TypeScript strict per frontend).
Nel prossimo articolo (serie #22), esploreremo le Copilot Extensions:
come creare plugin personalizzati che estendono Copilot con capacità custom per il tuo dominio,
sia come mantainer di librerie open-source sia come azienda con processi proprietari.

Commenti
Caricamento commenti...
Accedi per commentare