1% ------------------------------------------------------------------------------2\section{Dix recettes pour les travaux du cours}3\label{sec:recettes}4% ------------------------------------------------------------------------------56\begin{enbref}7Dix procédures pas à pas, tirées des travaux d'IMM1003 et d'IMM1033, chacune avec la requête à taper, ce que l'agent fait, ce que vous vérifiez, et le niveau du cours qui s'applique. Les huit premières conviennent à tous ; les deux dernières (mode sans interface, sessions parallèles) sont pour les curieux.8\end{enbref}910Chaque recette suit le même patron, celui que recommande la documentation \parencite{cc_bestpractices,cc_workflows} : \textbf{explorer} en mode plan, \textbf{planifier} et valider, \textbf{exécuter} par petites étapes approuvées, \textbf{vérifier} avec une preuve brute, \textbf{déclarer}.1112% ------------------------------------------------------------------ 113\subsection{Dégrossir trente ventes comparables}14\label{rec:ventes}15\nivtrois~\debutant1617Contexte : \texttt{ventes.csv}, exporté d'un portail, 30 ventes de bungalows d'Aylmer (prix, date, superficie habitable, terrain, âge, garage, secteur). Objectif : voir le marché avant de choisir cinq comparables. \texttt{CLAUDE.md} de l'exemple~\ref{ex:ventes}.1819\begin{terminal}[Recette 1 --- exploration de ventes.csv (extrait)]20\begin{Verbatim}[commandchars=§¡¿]21§tu¡$¿ claude --permission-mode plan2223§tu¡> Lis @data/ventes_brutes.csv et décris : colonnes, valeurs manquantes, valeurs¿24§tu¡ suspectes (prix au pi² aberrant, date hors 2025-2026, doublons). Ne modifie rien.¿2526 §hi¡Read¿(data/ventes_brutes.csv)27 30 lignes, 8 colonnes. Aucune valeur manquante. Trois points d'attention :28 - vente 2 : prix 58 900 $ pour 1 390 pi² (42 $/pi²) — probable faute de saisie (589 000 ?)29 - vente 17 : date 2023-11-02, hors période30 - ventes 9 et 23 : même adresse et même date — doublon probable31 §ok¡Rien n'a été modifié.¿3233§tu¡> Plan : script analyse.py qui calcule prix_pi2, médiane et écart interquartile¿34§tu¡ par secteur, et trace prix_pi2 selon la date. Montre le plan, pas le code.¿35 §gris¡[plan en 5 points, dont : les 3 anomalies sont conservées et marquées, pas supprimées]¿36 §gris¡Sortir du mode plan et exécuter ? [y/n]¿37§tu¡> y¿3839 §hi¡Write¿(analyse.py) §gris¡← vous approuvez (le fichier est affiché)¿40 §hi¡Bash¿(python3 analyse.py) §gris¡← vous approuvez¿41 secteur n prix_pi2_median IQR42 Aylmer 18 412 6143 Deschênes 7 388 4444 Lucerne 5 447 7345 figures/prix_pi2_vs_date.png écrit. Anomalies marquées dans data/ventes_propres.csv46 (colonne flag).4748§tu¡> Pour les identifiants 3, 11 et 24, montre prix, superficie et prix_pi2 côte à côte.¿49 id prix sup_hab prix_pi250 3 612 000 1 480 413,551 11 548 500 1 322 414,952 24 689 000 1 655 416,353\end{Verbatim}54\end{terminal}5556\textbf{Vous vérifiez} : trois prix au pied carré recalculés à la main (612\,000 / 1\,480 = 413,5 : oui). \textbf{Vous décidez} : la vente 2 se corrige après vérification à la source, pas par l'agent ; la tendance temporelle justifie-t-elle un ajustement de date ? C'est votre jugement. \textbf{Vous déclarez} : « Claude Code (Sonnet) : script d'exploration des 30 ventes (statistiques par secteur, graphique), vérifié à la main sur 3 ventes ; sélection des comparables et grille faites manuellement. »5758% ------------------------------------------------------------------ 259\subsection{Vérifier un classeur sans casser la chaîne}60\label{rec:excel}61\nivtrois~\debutant6263Contexte : le gabarit chaîné d'un TP (Accueil, Donnees, zone de travail, Dashboard). L'agent ne travaille jamais sur l'original mais sur une copie, et sa contribution est la \emph{vérification}, pas le remplissage.6465\begin{enumerate}[label=\textbf{Étape \arabic*.},leftmargin=2.6em]66 \item \emph{Copie.} \texttt{!cp gabarit.xlsx gabarit\_travail.xlsx} (le préfixe \texttt{!} exécute directement la commande).67 \item \emph{Inventaire.} « Liste, feuille par feuille, les cellules qui contiennent des formules et celles qui contiennent des constantes dans les zones de travail. Ne modifie rien. » L'agent utilise \texttt{openpyxl} \parencite{openpyxl_doc} ; le résultat vous dit où sont les entrées et où sont les calculs.68 \item \emph{Vos formules.} Vous les écrivez dans Excel. Puis : « Vérifie que ma formule en \texttt{Grille!I12} reproduit la règle du total brut de l'énoncé (somme des valeurs absolues des ajustements divisée par le prix du comparable). »69 \item \emph{Le test de la chaîne.} « Recalcule indépendamment la valeur conclue pour $B=2$ et $B=9$ et compare avec \texttt{Grille!H26}. » Si les deux valeurs de $B$ donnent la même valeur conclue, une constante a coupé la chaîne : l'agent vous dit où.70 \item \emph{Preuve.} Demandez le tableau (B, recalculé, affiché) et gardez-le pour la déclaration. La skill \texttt{/verif-chaine} décrite au chapitre~\ref{sec:personnaliser} fait les étapes 2 et 4 en une seule commande.71\end{enumerate}7273\begin{piege}[« Complète la grille » est la requête qui coûte le plus cher]74Un agent à qui l'on demande de remplir la grille remplira la grille : avec des conventions génériques, parfois avec des valeurs collées, et vous ne pourrez rien défendre en entretien. Demandez-lui de \emph{vérifier} ce que vous avez écrit, de \emph{préparer} la mise en forme et les totaux, de \emph{tester} la chaîne. Les ajustements et la réconciliation sont notés parce que ce sont eux qui portent le jugement.75\end{piege}7677% ------------------------------------------------------------------ 378\subsection{Se faire critiquer, pas réécrire}79\label{rec:critique}80\nivtrois~\debutant8182Contexte : votre interprétation de deux phrases après la réconciliation, ou votre bordereau. Vous voulez un correcteur, pas un rédacteur.8384\begin{vous}[requête de critique --- à coller telle quelle, en adaptant le fichier]85\eRole Agis comme un correcteur d'IMM1003. \eCtx Les conventions du cours sont dans \texttt{CLAUDE.md}. \eDonnees Lis \texttt{@interpretation.md} (mes deux phrases d'interprétation après réconciliation) et \texttt{@grille\_resume.md} (mes cinq valeurs ajustées avec leurs pourcentages brut et net). \eTache Relève chaque point où mon interprétation n'est pas soutenue par les chiffres, où une convention du cours est enfreinte, ou où une phrase est générique (elle pourrait s'appliquer à n'importe quel immeuble). \eContr Ne réécris rien ; ne propose pas de pondération ; cite la phrase concernée et la règle. \eFormat Liste numérotée, du plus grave au moins grave, puis une ligne « ce qui est solide ».86\end{vous}8788Ce que vous faites de la réponse : vous corrigez vous-même, vous notez dans \texttt{JOURNAL.md} ce qui a été relevé, et vous le déclarez (« critique de mon interprétation par Claude Code ; corrections apportées par moi »). Si la critique contredit les notes de cours, les notes priment : signalez-le à l'agent et, au besoin, ajoutez la convention dans \texttt{CLAUDE.md} avec \texttt{\#}.8990% ------------------------------------------------------------------ 491\subsection{Préparer un examen à partir de ses notes}92\label{rec:examen}93\nivdeux~\debutant9495Contexte : dossier de révision de l'exemple~\ref{ex:revision}, avec vos notes en Markdown. Rien de ce qui se produit ici n'entre dans une remise.9697\begin{terminal}[Recette 4 --- séance de révision (extrait)]98\begin{Verbatim}[commandchars=§¡¿]99§tu¡$¿ cd ~/Documents/UQO/IMM1003/revision_intra && claude100§tu¡> Lis @notes/S03.md et @notes/S04.md (principes de la valeur, usage optimal). Pose-moi¿101§tu¡ dix questions d'application en contexte de Gatineau, une à la fois, du plus facile au¿102§tu¡ plus difficile. Corrige à partir de mes notes seulement ; si elles ne tranchent pas,¿103§tu¡ dis-le. À la fin, tableau de mes erreurs dans erreurs.md.¿104105 Question 1/10. Un terrain vacant zoné résidentiel unifamilial au boulevard Gréber.106 Un promoteur propose d'y construire un immeuble de bureaux « parce que c'est plus107 rentable ». Lequel des quatre critères de l'usage optimal élimine cette option, et108 pourquoi l'ordre des critères compte-t-il ici ?109110§tu¡> Le critère financier : c'est pas rentable si c'est interdit.¿111112 Presque. Le critère qui élimine est le premier, la légalité (tes notes S04, § 2 :113 « légalement permis » vient avant « financièrement faisable »). Le raisonnement114 financier n'a même pas lieu d'être. Question 2/10. …115\end{Verbatim}116\end{terminal}117118Astuce : demandez ensuite « Rejoue les questions où j'ai échoué, formulées autrement » ; puis, la veille de l'examen, « Lis \texttt{erreurs.md} et interroge-moi seulement sur ces notions ».119120% ------------------------------------------------------------------ 5121\subsection{Nettoyer et fusionner des données publiques}122\label{rec:donnees}123\nivtrois~\intermediaire124125Contexte : TP1, tableau de bord du marché. Vous avez téléchargé un tableau APCIQ (ventes et prix médians par trimestre), un tableau SCHL (taux d'inoccupation par année) et une série de la Banque du Canada (taux directeur par date). Il faut une table unique par trimestre, sans rien inventer.126127\begin{enumerate}[label=\textbf{Étape \arabic*.},leftmargin=2.6em]128 \item \emph{Inventaire en mode plan.} « Pour chaque fichier de \texttt{sources/}, donne : organisme, indicateur, unité, périodicité, première et dernière période, et la ligne d'en-tête exacte. Ne modifie rien. »129 \item \emph{Règles de fusion.} Vous décidez : périodes en fin de trimestre ; le taux directeur du trimestre est celui en vigueur au dernier jour ; le taux d'inoccupation annuel est répété sur les quatre trimestres et marqué comme tel. Notez ces règles dans \texttt{TRANSFORMATIONS.md} (l'agent peut le rédiger à partir de vos décisions).130 \item \emph{Script.} « Écris \texttt{fusion.py} qui applique les règles de \texttt{TRANSFORMATIONS.md} et produit \texttt{indicateurs.csv} avec, pour chaque valeur, les colonnes organisme, URL et date de consultation copiées depuis \texttt{sources/SOURCES.csv}. »131 \item \emph{Preuve.} « Pour 2025-T3, montre chaque valeur de \texttt{indicateurs.csv} et, à côté, la cellule brute du fichier source d'où elle vient. » Vous comparez avec les fichiers ouverts.132 \item \emph{Dans le classeur.} Les valeurs entrent dans la feuille Donnees du gabarit ; l'agent peut les écrire si vous l'approuvez cellule par cellule, ou vous les collez vous-même. Le test de la chaîne (recette~\ref{rec:excel}) conclut.133\end{enumerate}134135% ------------------------------------------------------------------ 6136\subsection{Produire un rapport reproductible}137\label{rec:rapport}138\nivtrois~\intermediaire139140Un rapport « reproductible » se régénère quand une donnée change : le texte est dans un fichier Markdown, les tableaux et les figures sont produits par un script, et une commande assemble le tout en PDF ou en Word. \texttt{CLAUDE.md} de l'exemple~\ref{ex:rapport}.141142\begin{terminal}[Recette 6 --- structure d'un rapport reproductible]143\begin{Verbatim}[commandchars=§¡¿]144rapport_evaluation/145├── CLAUDE.md146├── rapport.md §co¡← votre texte (analyse, interprétation : à vous)¿147├── sources.md §co¡← une entrée par donnée citée : organisme, titre, URL, date¿148├── data/ §co¡← données brutes, lecture seule¿149├── scripts/tableaux.py §co¡← produit tables/*.md et figures/*.png depuis data/¿150├── tables/ figures/151└── Makefile §co¡← `make` = scripts puis pandoc rapport.md -o rapport.docx¿152153§tu¡> Mets en place cette structure. Écris scripts/tableaux.py pour produire le tableau des¿154§tu¡ cinq comparables ajustés depuis data/grille.csv (montants entiers, % à une décimale)¿155§tu¡ et le Makefile. N'écris rien dans rapport.md : je rédige.¿156 §gris¡[Write ×4 approuvés ; Bash(make) approuvé]¿157 §ok¡rapport.docx produit¿ (12 pages) ; tables/comparables.md inséré à la ligne 84 de rapport.md158 via la directive que vous aviez laissée.159160§tu¡> Vérifie que chaque chiffre de rapport.md apparaît dans sources.md ou dans tables/.¿161 Deux chiffres sans source : « 2,25 % » (ligne 41, taux directeur) et « 54 jours »162 (ligne 43, délai de vente). Ajoutez-les à sources.md ou retirez-les.163\end{Verbatim}164\end{terminal}165166% ------------------------------------------------------------------ 7167\subsection{Versionner son travail avec Git}168\label{rec:git}169\nivtrois~\intermediaire170171Git est un système de points de sauvegarde nommés et datés ; Claude Code sait l'utiliser, et c'est le meilleur filet de sécurité avant de laisser un agent écrire dans un dossier \parencite{git_book}. Trois commandes suffisent à un étudiant.172173\begin{terminal}[Recette 7 --- Git en trois gestes, par l'agent ou par vous]174\begin{Verbatim}[commandchars=§¡¿]175§tu¡> Initialise un dépôt Git ici, avec un .gitignore qui exclut les fichiers temporaires¿176§tu¡ d'Excel (~$*.xlsx) et le dossier sauvegardes/. Premier commit : « TP2 : énoncé et gabarit ».¿177 §hi¡Bash¿(git init) §hi¡Write¿(.gitignore) §hi¡Bash¿(git add -A && git commit -m "TP2 : énoncé et gabarit")178 §ok¡[main (root-commit) 3f2a9c1] TP2 : énoncé et gabarit¿ 3 files changed179180§co¡… vous travaillez dans Excel, l'agent écrit les totaux …¿181182§tu¡> Commit : « Grille : totaux brut/net et drapeaux (I12:J16) ».¿183 §ok¡[main 8b41e07]¿ 1 file changed184185§tu¡> !git log --oneline¿ §co¡← vous, directement¿186 8b41e07 Grille : totaux brut/net et drapeaux (I12:J16)187 3f2a9c1 TP2 : énoncé et gabarit188189§tu¡> Reviens à la version du gabarit d'avant les totaux, sans perdre l'actuelle.¿190 §hi¡Bash¿(git stash) ou §hi¡Bash¿(git checkout 3f2a9c1 -- gabarit_travail.xlsx) : je vous191 propose la seconde, qui ne touche que ce fichier. Confirmez ?192\end{Verbatim}193\end{terminal}194195Les points de restauration de Claude Code (\texttt{/rewind}) couvrent les modifications faites par l'agent ; Git couvre aussi celles que vous faites dans Excel. Faites un commit avant chaque session qui écrit.196197% ------------------------------------------------------------------ 8198\subsection{Travailler avec des images et des PDF}199\label{rec:images}200\nivtrois~\debutant201202Claude Code lit les PDF (l'énoncé, un rapport de marché, un extrait de norme) et les images (une capture d'écran de votre classeur, un graphique, un message d'erreur). Collez une image avec \kbd{Ctrl}+\kbd{V} ou glissez le fichier dans la fenêtre.203204\begin{itemize}205 \item « Voici une capture de ma feuille Grille [image]. La cellule H26 affiche \texttt{\#VALEUR!}. Quelle est la cause la plus probable, et quelle cellule dois-je regarder en premier ? » L'agent lit l'image, pas le classeur : il raisonne sur ce qu'il voit.206 \item « Lis \texttt{@sources/schl\_rapport\_locatif\_2025.pdf}, section Gatineau. Quel est le taux d'inoccupation des appartements de deux chambres, à quelle page, et quel est l'univers couvert ? » Vous ouvrez la page indiquée et vérifiez : c'est la donnée que vous citerez, avec la page.207 \item « Ce graphique [image] est-il cohérent avec le tableau que tu as produit ? » pour comparer une figure exportée d'Excel avec les chiffres du script.208\end{itemize}209210Un PDF de deux cents pages occupe beaucoup de contexte : demandez une section ou une plage de pages, et faites \texttt{/clear} après.211212% ------------------------------------------------------------------ 9213\subsection{Mode sans interface : Claude Code dans un script}214\label{rec:headless}215\nivtrois~\avance216217L'option \texttt{-p} (\emph{print}) envoie une requête, affiche la réponse et se termine : pas de conversation. C'est ainsi qu'on intègre Claude Code dans un script ou un flux automatisé \parencite{cc_headless}. Les permissions s'appliquent toujours ; on précise les outils autorisés.218219\begin{terminal}[Recette 9 --- trois usages du mode -p]220\begin{Verbatim}[commandchars=§¡¿]221§co¡# 1. Une question sur un fichier, réponse texte¿222§tu¡$¿ claude -p "Liste les colonnes de data/ventes_brutes.csv et leur type probable" \223 --allowedTools "Read"224225§co¡# 2. Lire depuis l'entrée standard¿226§tu¡$¿ cat JOURNAL.md | claude -p "Résume ce journal en cinq lignes pour ma déclaration d'outils"227228§co¡# 3. Sortie JSON, pour un autre programme ; nombre de tours limité¿229§tu¡$¿ claude -p "Vérifie la chaîne de gabarit_travail.xlsx et réponds OK ou ROMPUE" \230 --allowedTools "Read,Bash(python3 verif_chaine.py)" --max-turns 3 --output-format json231{"type":"result","result":"OK — B=2 → 603 250 ; B=9 → 610 250","total_cost_usd":0.018, …}232\end{Verbatim}233\end{terminal}234235Combiné à un hook \texttt{Stop} ou à une tâche planifiée, cela permet par exemple de relancer la vérification de la chaîne chaque soir sur le classeur du jour. Restez en \emph{allow-list} stricte : un script sans interface ne peut pas vous demander de permission, il refuse ce qui n'est pas autorisé.236237% ------------------------------------------------------------------ 10238\subsection{Deux sessions en parallèle avec des copies de travail Git}239\label{rec:worktree}240\nivtrois~\avance241242Pour comparer deux approches (deux structures de bordereau, deux scripts) sans qu'elles se marchent dessus, Git peut créer une seconde copie de travail du même dépôt dans un autre dossier (\emph{worktree}) ; vous lancez un Claude Code dans chacune \parencite{cc_workflows}.243244\begin{terminal}[Recette 10 --- deux approches en parallèle]245\begin{Verbatim}[commandchars=§¡¿]246§tu¡$¿ git worktree add ../TP2_essai_B essai-B §co¡# branche « essai-B » dans un dossier voisin¿247§tu¡$¿ cd ../TP2_essai_B && claude §co¡# 2e terminal ; le premier reste sur main¿248§co¡… chaque session a son propre contexte et ses propres fichiers …¿249§tu¡$¿ git diff main essai-B -- scripts/ §co¡# comparer les deux résultats¿250§tu¡$¿ git worktree remove ../TP2_essai_B §co¡# quand la comparaison est faite¿251\end{Verbatim}252\end{terminal}253254Une variante plus simple, sans Git : « Rédige les deux versions du script dans \texttt{v1/} et \texttt{v2/}, exécute-les, et présente les résultats côte à côte. » Elle suffit dans la plupart des cas du cours.255256\begin{okbox}[Le patron commun aux dix recettes]257Explorer en mode plan, planifier et valider, exécuter par petites étapes approuvées, exiger une preuve brute, déclarer. Si une recette vous mène à demander « fais le TP », vous avez quitté le patron ; revenez à « vérifie ce que j'ai fait ».258\end{okbox}259