Salta al contenuto principale

21 - Copilot Spaces e Memory: Knowledge Persistente per il Team

Copilot Spaces e Memory: Knowledge Persistente per il Team Tra settembre e dicembre 2025, GitHub trasforma radicalmente il modo in cui gestiamo il...

Cosa ne pensi di questo articolo?

21 - Copilot Spaces e Memory: Knowledge Persistente per il Team
GitHub CopilotFoto:Christina MorilloPexels

In Breve

Copilot Spaces e Memory: Knowledge Persistente per il Team Tra settembre e dicembre 2025, GitHub trasforma radicalmente il modo in cui gestiamo il...

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

#ArticoloFocus
1Introduzione a GitHub CopilotCos'è e come funziona
2Prompt Engineering per CopilotTecniche avanzate
3Code Generation PatternsPattern di generazione codice
4Testing con CopilotTest generation e debugging
5Code Review AutomationReview e suggestions
6Security e Best PracticesSicurezza del codice generato
7Documentazione AutomaticaGenerazione docstring
8Refactoring AssistitoMiglioramento codice
9Copilot CLIRiga di comando
10GitHub Copilot in VS CodeIntegrazione editor
11GitHub Copilot in JetBrainsIDE JetBrains
12GitHub Copilot in Visual StudioVisual Studio
13Copilot ChatChat conversazionale
14Knowledge Bases v1Contesto persistente (legacy)
15Copilot Workspaces (Beta)Ambienti di sviluppo
16Copilot Extensions (Beta)Plugin e estensioni
17Model Selection & Fine-TuningScelta e personalizzazione
18Enterprise FeaturesSAML, seat management
19Performance & Cost OptimizationOttimizzazione economica
20GitHub Universe 2025 RecapNovità principali
21Copilot 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

SoluzioneLancioScopePersistenzaAggiornamento
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.

Anatomia di uno Space
┌─ 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

TipoDescrizioneAuto-AggiornamentoUso 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

DataEventoAzione 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

CategoriaEsempioScopePersistenza
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

AspettoCopilot MemoryCopilot 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

Spaces per il team portfolio-backend-auth (shared context)
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)

ComponenteStorageResidenza DefaultOpzioni
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.

Prova Questi Strumenti

Strumenti gratuiti correlati a questo argomento.

Commenti

Caricamento commenti...

Accedi per commentare

Discuti questo articolo nella community

Unisciti al gruppo Telegram per discutere con altri sviluppatori, fare domande e condividere le tue esperienze.

Ti è piaciuto questo articolo?

Esplora altri contenuti sul blog o scopri i miei progetti