diff --git a/README.md b/README.md index c8797da..12d9a0f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ All templates support **multi-language output** via the `{{language}}` placehold | `article` | Single-column academic article with running heads and author affiliations | 0.4.0 | | `audit-report` | Security and usage audit report with a band cover, severity-coded findings, risk matrix, fix roadmap and evidence catalogue | 0.1.0 | | `book` | Long-form book layout with epigraphs and front matter | 0.3.0 | +| `consultation-report` | Written record of a paid consultation session: questions, findings, prioritised recommendations, resources, next steps and raw notes | 0.1.0 | | `contract` | Services agreement layout with parties block, numbered clauses, annexes and signature block; clause text is for you to write | 0.1.0 | | `cv` | Curriculum vitae — clean, ATS-friendly résumé | 0.2.0 | | `general` | Editorial foundation for essays and other documents; serif type and spaced paragraphs | 0.4.0 | diff --git a/consultation-report/assets/pergamino.jpg b/consultation-report/assets/pergamino.jpg new file mode 100644 index 0000000..8832e41 Binary files /dev/null and b/consultation-report/assets/pergamino.jpg differ diff --git a/consultation-report/main.tex b/consultation-report/main.tex new file mode 100644 index 0000000..83b1a3a --- /dev/null +++ b/consultation-report/main.tex @@ -0,0 +1,312 @@ +% Consultation report. +% Text in double braces is filled in when the project is created; the % +% comments say what to replace. Tectonic reads UTF-8 directly. +\documentclass[11pt,a4paper]{article} + +\usepackage[{{language}}]{babel} +\usepackage[T1]{fontenc} +\usepackage[lining]{ebgaramond} +\usepackage[scale=0.92]{sourcesanspro} +\usepackage[scale=0.82]{sourcecodepro} +\usepackage{microtype} +\usepackage[a4paper,left=27mm,right=24mm,top=30mm,bottom=32mm, + headheight=14pt,headsep=14mm,footskip=14mm]{geometry} +\usepackage{xcolor} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{titlesec} +\usepackage{needspace} +\usepackage{etoolbox} +\usepackage{booktabs} +\usepackage{array} +\usepackage{tabularx} +\usepackage{float} +\usepackage{graphicx} +\usepackage{lastpage} +\usepackage{tikz} +\usepackage[most]{tcolorbox} +\usepackage{url} +\usepackage{hyperref} + +% Parchment texture for the cover; it also sits behind every page when the +% paper_texture placeholder is true (for documents read on screen). The image +% is stretched to the page height and cropped by the page edge, so it covers +% the page with no seam. +\usepackage{eso-pic} +\newcommand{\papertexture}{{{paper_texture}}} +\newcommand{\texturebg}{\AtPageLowerLeft{\makebox[\paperwidth][l]{% + \includegraphics[width=\paperheight,height=\paperheight]{assets/pergamino.jpg}}}} +\ifdefstring{\papertexture}{true}{\AddToShipoutPictureBG{\texturebg}}{} +\newcommand{\covertexture}{\ifdefstring{\papertexture}{true}{}{\AddToShipoutPictureBG*{\texturebg}}} + +% Palette, defined once. The accent placeholder (garnet by default) drives +% rules and numbers. Priority tones are garnet, brass and graphite, and each +% badge also differs in form (solid, solid, outlined) so it reads in greyscale. +\definecolor{benchparchment}{HTML}{F4F0EA} +\definecolor{benchlamp}{HTML}{F6ECD2} +\definecolor{benchink}{HTML}{1D1510} +\definecolor{benchsepia}{HTML}{6B5A43} +\definecolor{benchgraphite}{HTML}{5D5852} +\definecolor{benchbrass}{HTML}{8A6A2C} +\definecolor{benchgarnet}{HTML}{87222C} +\colorlet{cronink}{benchink} +\definecolor{cronaccent}{HTML}{{{accent}}} +\colorlet{cronmuted}{benchsepia} +\colorlet{cronrule}{benchsepia!35!white} +\hypersetup{colorlinks=true,linkcolor=cronink,urlcolor=cronaccent, + citecolor=cronaccent,breaklinks=true,pdftitle={{{title}}},pdfauthor={{{consultant}}}} +\urlstyle{sf} + +% Fixed labels. English defaults first, then one override block per language. +\newcommand{\lblClient}{Client} +\newcommand{\lblConsultant}{Consultant} +\newcommand{\lblSessionDate}{Session date} +\newcommand{\lblDuration}{Duration} +\newcommand{\lblSessionType}{Session type} +\newcommand{\lblReference}{Reference} +\newcommand{\lblClassification}{Classification} +\newcommand{\lblPreparedFor}{Prepared for} +\newcommand{\lblPreparedBy}{Prepared by} +\newcommand{\lblPage}{Page} +\newcommand{\lblOf}{of} +\newcommand{\lblDate}{Date} +\newcommand{\lblAttendees}{Attendees} +\newcommand{\lblFormat}{Format} +\newcommand{\lblTopics}{Topics} +\newcommand{\lblContext}{Context} +\newcommand{\lblObservation}{Observation} +\newcommand{\lblInsight}{Key insight} +\newcommand{\lblPriority}{Priority} +\newcommand{\lblEffort}{Effort} +\newcommand{\lblRecommendation}{Recommendation} +\newcommand{\lblprhigh}{High} +\newcommand{\lblprmedium}{Medium} +\newcommand{\lblprlow}{Low} +\newcommand{\lblefsmall}{Small} +\newcommand{\lblefmedium}{Medium} +\newcommand{\lbleflarge}{Large} +\newcommand{\lblResource}{Resource} +\newcommand{\lblLink}{Link} +\newcommand{\lblAction}{Action} +\newcommand{\lblOwner}{Owner} +\newcommand{\lblTarget}{Target date} +\newcommand{\lblowclient}{Client} +\newcommand{\lblowconsultant}{Consultant} +\newcommand{\lblGlance}{Session at a glance} +\newcommand{\lblQuestions}{Questions brought to the session} +\newcommand{\lblFound}{What we found} +\newcommand{\lblRecommendations}{Recommendations} +\newcommand{\lblResources}{Resources shared} +\newcommand{\lblNextSteps}{Next steps} +\newcommand{\lblNotes}{Notes taken during the session} +\newcommand{\lblFollowUp}{Follow-up} +\newcommand{\lblDefTitle}{Consultation report} +\newcommand{\lblDefOrg}{Example Consulting} +\newcommand{\lblDefConsultant}{Example Consultant} +\newcommand{\lblDefClient}{Example Client} +\newcommand{\lblDefDate}{12 November 2026} +\newcommand{\lblDefDuration}{90 minutes} +\newcommand{\lblDefType}{Advisory session} +\newcommand{\lblDefClass}{Confidential} +\newcommand{\lblDefBooking}{To book a follow-up session, write to hello@example.org or use the booking link at example.org/book.} +\addto\captionsspanish{% + \renewcommand{\lblClient}{Cliente} + \renewcommand{\lblConsultant}{Consultor} + \renewcommand{\lblSessionDate}{Fecha de la sesión} + \renewcommand{\lblDuration}{Duración} + \renewcommand{\lblSessionType}{Tipo de sesión} + \renewcommand{\lblReference}{Referencia} + \renewcommand{\lblClassification}{Clasificación} + \renewcommand{\lblPreparedFor}{Preparado para} + \renewcommand{\lblPreparedBy}{Preparado por} + \renewcommand{\lblPage}{Página} + \renewcommand{\lblOf}{de} + \renewcommand{\lblDate}{Fecha} + \renewcommand{\lblAttendees}{Asistentes} + \renewcommand{\lblFormat}{Formato} + \renewcommand{\lblTopics}{Temas} + \renewcommand{\lblContext}{Contexto} + \renewcommand{\lblObservation}{Observación} + \renewcommand{\lblInsight}{Idea clave} + \renewcommand{\lblPriority}{Prioridad} + \renewcommand{\lblEffort}{Esfuerzo} + \renewcommand{\lblRecommendation}{Recomendación} + \renewcommand{\lblprhigh}{Alta} + \renewcommand{\lblprmedium}{Media} + \renewcommand{\lblprlow}{Baja} + \renewcommand{\lblefsmall}{Pequeño} + \renewcommand{\lblefmedium}{Medio} + \renewcommand{\lbleflarge}{Grande} + \renewcommand{\lblResource}{Recurso} + \renewcommand{\lblLink}{Enlace} + \renewcommand{\lblAction}{Acción} + \renewcommand{\lblOwner}{Responsable} + \renewcommand{\lblTarget}{Fecha objetivo} + \renewcommand{\lblowclient}{Cliente} + \renewcommand{\lblowconsultant}{Consultor} + \renewcommand{\lblGlance}{La sesión de un vistazo} + \renewcommand{\lblQuestions}{Preguntas planteadas en la sesión} + \renewcommand{\lblFound}{Lo que encontramos} + \renewcommand{\lblRecommendations}{Recomendaciones} + \renewcommand{\lblResources}{Recursos compartidos} + \renewcommand{\lblNextSteps}{Próximos pasos} + \renewcommand{\lblNotes}{Notas tomadas durante la sesión} + \renewcommand{\lblFollowUp}{Seguimiento} + \renewcommand{\lblDefTitle}{Informe de consultoría} + \renewcommand{\lblDefOrg}{Consultoría de ejemplo} + \renewcommand{\lblDefConsultant}{Consultor de ejemplo} + \renewcommand{\lblDefClient}{Cliente de ejemplo} + \renewcommand{\lblDefDate}{12 de noviembre de 2026} + \renewcommand{\lblDefDuration}{90 minutos} + \renewcommand{\lblDefType}{Sesión de asesoría} + \renewcommand{\lblDefClass}{Confidencial} + \renewcommand{\lblDefBooking}{Para reservar una sesión de seguimiento, usa el enlace example.org/book o escribe a hello@example.org.}} + +% A value left at its English default follows the document language. +\newcommand{\localize}[3]{\ifstrequal{#1}{#2}{#3}{#1}} +% Report metadata, set once and reused by the cover, header and footer. +\newcommand{\RepTitle}{\localize{{{title}}}{Consultation report}{\lblDefTitle}} +\newcommand{\RepOrg}{\localize{{{organisation}}}{Example Consulting}{\lblDefOrg}} +\newcommand{\RepConsultant}{\localize{{{consultant}}}{Example Consultant}{\lblDefConsultant}} +\newcommand{\RepClient}{\localize{{{client}}}{Example Client}{\lblDefClient}} +\newcommand{\RepDate}{\localize{{{session_date}}}{12 November 2026}{\lblDefDate}} +\newcommand{\RepDuration}{\localize{{{duration}}}{90 minutes}{\lblDefDuration}} +\newcommand{\RepType}{\localize{{{session_type}}}{Advisory session}{\lblDefType}} +\newcommand{\RepRef}{{{reference}}} +\newcommand{\RepClass}{\localize{{{classification}}}{Confidential}{\lblDefClass}} +\newcommand{\RepBooking}{\localize{{{booking}}}{To book a follow-up session, write to hello@example.org or use the booking link at example.org/book.}{\lblDefBooking}} +\newcommand{\RepLogo}{{{logo}}} +\let\placelogo\includegraphics + +% Letterspacing does not work with xetex, so small caps carry the emphasis. +\renewcommand{\textls}[2][]{#2} +\newcommand{\caps}[1]{{\sffamily\scshape #1}} +\newcommand{\metalabel}[1]{{\sffamily\scriptsize\scshape\color{cronmuted}#1}} + +% Page style: running head on top, classification and page count below. +\fancypagestyle{cron}{% + \fancyhf{} + \fancyhead[L]{\small\caps{\RepClient}} + \fancyhead[R]{\small\itshape\RepTitle\ \textperiodcentered\ \RepRef} + \fancyfoot[L]{\small\caps{\RepClass}} + \fancyfoot[R]{\small\sffamily\lblPage\ \thepage\ \lblOf\ \pageref{LastPage}} + \renewcommand{\headrulewidth}{0.4pt} + \renewcommand{\footrulewidth}{0.4pt} + \renewcommand{\headrule}{\hbox to\headwidth{\color{cronrule}\leaders\hrule height \headrulewidth\hfill}} + \renewcommand{\footrule}{\hbox to\headwidth{\color{cronrule}\leaders\hrule height \footrulewidth\hfill}}} +\pagestyle{cron} +\fancypagestyle{plain}{\pagestyle{cron}} + +% Headings. +\titleformat{\section}{\normalfont\fontsize{20}{24}\selectfont\color{cronink}} +{\textcolor{cronaccent}{\thesection}}{0.7em}{}[{\vspace{3pt}\color{cronrule}\titlerule}] +\titlespacing*{\section}{0pt}{2.2\baselineskip}{1\baselineskip} +\titleformat{\subsection}{\sffamily\bfseries\normalsize\color{cronink}} +{\textcolor{cronaccent}{\thesubsection}}{0.7em}{} +\titlespacing*{\subsection}{0pt}{1.4\baselineskip}{0.4\baselineskip} + +\frenchspacing +\let\origsection\section +\let\origsubsection\subsection +\renewcommand{\subsection}{\Needspace{6\baselineskip}\origsubsection} +\renewcommand{\section}{\needspace{8\baselineskip}\origsection} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.6\baselineskip} +\setlength{\emergencystretch}{2em} +\renewcommand{\arraystretch}{1.25} +\setlist{leftmargin=1.5em,itemsep=2pt,topsep=3pt,parsep=0pt} +\setlist[itemize]{label={\color{cronaccent}\textbullet}} +\setlist[enumerate]{label={\sffamily\bfseries\color{cronaccent}\arabic*.},leftmargin=1.8em,itemsep=4pt} + +% Cells start flush: no paragraph skip inside tables. +\AtBeginEnvironment{tabularx}{\setlength{\parskip}{0pt}} + +% Priority badges: solid garnet, solid brass, outlined graphite. +\newcommand{\prioritybadge}[1]{\csname prbadge#1\endcsname} +\newcommand{\prbadgehigh}{\tcbox[on line,enhanced,colback=benchgarnet,colframe=benchgarnet, + boxrule=0.6pt,arc=2pt,left=5pt,right=5pt,top=1.5pt,bottom=1.5pt,boxsep=0pt, + fontupper=\sffamily\scriptsize\bfseries\scshape\color{white}]{\lblprhigh}} +\newcommand{\prbadgemedium}{\tcbox[on line,enhanced,colback=benchbrass,colframe=benchbrass, + boxrule=0.6pt,arc=2pt,left=5pt,right=5pt,top=1.5pt,bottom=1.5pt,boxsep=0pt, + fontupper=\sffamily\scriptsize\bfseries\scshape\color{white}]{\lblprmedium}} +\newcommand{\prbadgelow}{\tcbox[on line,enhanced,colback=white,colframe=benchgraphite, + boxrule=0.6pt,arc=2pt,left=5pt,right=5pt,top=1.5pt,bottom=1.5pt,boxsep=0pt, + fontupper=\sffamily\scriptsize\bfseries\scshape\color{benchgraphite}]{\lblprlow}} +\newcommand{\effortlabel}[1]{{\sffamily\small\csname lblef#1\endcsname}} +\newcommand{\ownerlabel}[1]{{\sffamily\small\csname lblow#1\endcsname}} + +% Parts inside a finding: small accent captions. +\newcommand{\findingpart}[1]{\par\needspace{4\baselineskip}\vspace{2pt}{\sffamily\scriptsize\scshape\bfseries + \color{cronaccent}#1}\par\vspace{-3pt}} + +% Key insight callout: a tinted panel with a brass bar. +\tcbset{cronbox/.style={enhanced,breakable,colback=#1!7,colframe=#1!7, + boxrule=0pt,arc=0pt,outer arc=0pt,borderline west={2.4pt}{0pt}{#1}, + left=11pt,right=10pt,top=7pt,bottom=7pt,before skip=9pt,after skip=9pt, + fonttitle=\sffamily\scriptsize\scshape\bfseries,coltitle=#1, + attach boxed title to top left={xshift=-1pt,yshift=-1pt}, + boxed title style={empty,left=0pt,top=0pt,bottom=0pt}}} +\newtcolorbox{insight}{cronbox=benchbrass,title={\lblInsight}} + +% Raw notes: a quiet block, graphite sans type, thin rule on the left. +\newenvironment{rawnotes} +{\begin{tcolorbox}[enhanced,breakable,colback=white,colframe=white,boxrule=0pt, + arc=0pt,borderline west={0.8pt}{0pt}{cronrule},left=12pt,right=4pt,top=2pt,bottom=2pt, + before skip=4pt,after skip=4pt] + \sffamily\small\color{benchgraphite}\setlength{\parskip}{3pt} + \setlist[itemize]{label={\color{benchgraphite}--},leftmargin=1.2em,itemsep=1pt}} + {\end{tcolorbox}} + +% Table helpers. \recrow{n}{title}{rationale}{high|medium|low}{small|medium|large} +\newcommand{\recrow}[5]{{\sffamily\bfseries\color{cronaccent}#1} & + \textbf{#2}\par{\small\color{cronmuted}#3} & \prioritybadge{#4} & \effortlabel{#5} \\[3pt]} +% \actrow{action}{client|consultant}{target date} +\newcommand{\actrow}[3]{#1 & \ownerlabel{#2} & {\sffamily\small #3} \\} +% \resrow{resource}{url} +\newcommand{\resrow}[2]{#1 & {\small\url{#2}} \\} + +\begin{document} + + % Cover: title block framed by garnet rules on the parchment. + \begingroup + \thispagestyle{empty} + \covertexture + \noindent\begin{minipage}[t][\dimexpr\textheight-2\baselineskip\relax][t]{\textwidth} + \begin{tikzpicture}[remember picture,overlay] + \node[anchor=north west,inner sep=0pt,fill=benchgarnet,minimum width=\paperwidth, + minimum height=2.4mm] at ([yshift=-22mm]current page.north west) {}; + \node[anchor=north west,inner sep=0pt,fill=benchgarnet,minimum width=\paperwidth, + minimum height=0.9mm] at ([yshift=-132mm]current page.north west) {}; + \node[anchor=north west,inner sep=0pt,fill=benchgarnet,minimum width=\paperwidth, + minimum height=0.35mm] at ([yshift=-134mm]current page.north west) {}; + \end{tikzpicture}\par\nointerlineskip + \raggedright\color{cronink} + \vspace*{2mm} + \IfFileExists{\RepLogo}{\placelogo[height=12mm]{\RepLogo}\par\vspace{5mm}}{} + {\large\color{cronmuted}\caps{\RepOrg}\par} + \vspace{18mm} + {\sffamily\small\scshape\color{cronaccent}\RepType\par} + \vspace{4mm} + {\fontsize{38}{42}\selectfont\RepTitle\par} + \vspace{6mm} + {\fontsize{16}{20}\selectfont\itshape\color{cronmuted}\lblPreparedFor\ \RepClient\par} + \vspace{40mm}\color{cronink} + \begin{tabular}{@{}p{5.6cm}p{5.6cm}@{}} + \metalabel{\lblClient} & \metalabel{\lblConsultant} \\[2pt] + \RepClient & \RepConsultant \\[18pt] + \metalabel{\lblSessionDate} & \metalabel{\lblDuration} \\[2pt] + \RepDate & \RepDuration \\[18pt] + \metalabel{\lblSessionType} & \metalabel{\lblReference} \\[2pt] + \RepType & \RepRef \\[18pt] + \metalabel{\lblClassification} & \\[2pt] + {\sffamily\small\scshape\bfseries\color{benchgarnet}\RepClass} & \\ + \end{tabular} + \vfill + {\color{cronmuted}\small\lblPreparedBy\ \RepConsultant, \RepOrg\par} + \end{minipage} + \endgroup + \clearpage + + \input{sections/{{language}}} + +\end{document} diff --git a/consultation-report/sections/english.tex b/consultation-report/sections/english.tex new file mode 100644 index 0000000..5f08ebb --- /dev/null +++ b/consultation-report/sections/english.tex @@ -0,0 +1,127 @@ +% Replace the sample content below with the record of your own session. +\section{\lblGlance} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}l@{\hspace{1.2cm}}X@{}} + \toprule + \metalabel{\lblDate} & \RepDate \\ + \metalabel{\lblDuration} & \RepDuration \\ + \metalabel{\lblAttendees} & Two members of the support team and the operations lead \\ + \metalabel{\lblFormat} & Video call with a shared screen \\ + \metalabel{\lblTopics} & AI agents in customer support, review of replies, handling of customer data \\ + \bottomrule + \end{tabularx} +\end{table} + +\begin{itemize} + \item Agents can draft replies for the support team now, but should not send them alone. + \item Customer data needs a clear boundary before any agent reads a ticket. + \item A small pilot with measured results is a better start than a full rollout. +\end{itemize} + +\section{\lblQuestions} +\begin{enumerate} + \item Which support tasks can an AI agent do safely today? + \item How do we stop an agent from sharing customer data it should not see? + \item Who checks the agent's work, and how much time does that take? + \item How will we know the agent is helping and not just fast? +\end{enumerate} + +\section{\lblFound} +\subsection{Tickets mix routine and sensitive requests} +\findingpart{\lblContext} +The team handles about 300 tickets a week. Most are order status and password +questions; a few involve refunds, complaints or personal data. + +\findingpart{\lblObservation} +Routine tickets are a good fit for an agent. Sensitive ones are mixed into the +same queue with no label, so an agent cannot tell them apart. + +\subsection{Replies are not reviewed in a consistent way} +\findingpart{\lblContext} +Today each team member checks replies in their own way, and there is no written +standard for tone or accuracy. + +\findingpart{\lblObservation} +Without a shared standard, a reviewer cannot say whether a draft is good, and +the team cannot measure the agent against anything. + +\begin{insight} + The safe limit for an agent is set by what it can see and what it can send, + not by how clever it is. Fix those two limits first. +\end{insight} + +\begin{mermaid}[style=editorial,width=0.9\linewidth, + caption={Proposed handling of a ticket},pos=H] + flowchart LR + A[Ticket] --> B[Agent drafts] --> C[Person reviews] --> D[Send] +\end{mermaid} + +\section{\lblRecommendations} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}lXll@{}} + \toprule + & \sffamily\small\bfseries\lblRecommendation & \sffamily\small\bfseries\lblPriority & + \sffamily\small\bfseries\lblEffort \\ + \midrule + \recrow{1}{Keep a person between the agent and the customer}{Drafts only; a person sends every reply.}{high}{small} + \recrow{2}{Hide personal data from the agent}{Mask names, emails and payment details before the ticket is read.}{high}{medium} + \recrow{3}{Write a one-page reply standard}{Gives reviewers and the pilot a shared measure of quality.}{medium}{small} + \recrow{4}{Run a four-week pilot on routine tickets}{Measure time saved and errors found before widening the scope.}{medium}{medium} + \recrow{5}{Add a monthly review of agent mistakes}{Keeps the rules current as the tickets change.}{low}{small} + \bottomrule + \end{tabularx} +\end{table} + +\section{\lblResources} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}Xl@{}} + \toprule + \sffamily\small\bfseries\lblResource & \sffamily\small\bfseries\lblLink \\ + \midrule + \resrow{Checklist for reviewing an agent's replies}{https://example.org/checklist} + \resrow{Template for a one-page reply standard}{https://example.org/reply-standard} + \resrow{Guide to masking personal data in tickets}{https://example.org/masking} + \resrow{Pilot plan worksheet}{https://example.org/pilot-plan} + \bottomrule + \end{tabularx} +\end{table} + +\section{\lblNextSteps} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}Xlr@{}} + \toprule + \sffamily\small\bfseries\lblAction & \sffamily\small\bfseries\lblOwner & + \sffamily\small\bfseries\lblTarget \\ + \midrule + \actrow{Label sensitive tickets in the queue}{client}{20 November 2026} + \actrow{Send the masking guide and an example setup}{consultant}{23 November 2026} + \actrow{Draft the one-page reply standard}{client}{27 November 2026} + \actrow{Review the draft standard and the pilot plan}{consultant}{2 December 2026} + \actrow{Start the four-week pilot}{client}{7 December 2026} + \bottomrule + \end{tabularx} +\end{table} + +\section{\lblNotes} +\begin{rawnotes} + \begin{itemize} + \item Team worried about wrong refund promises; agent must never state a refund. + \item Current tool keeps full ticket history, including card digits in free text. + \item Operations lead wants a weekly number: tickets answered, edits per draft. + \item Idea: start with order status only, add password help later. + \end{itemize} + Rule sketch agreed in the call: + \begin{code}[lang=yaml] +agent: + can_read: [order_status, shipping] + can_send: false + blocked: [refund, complaint, payment] + \end{code} +\end{rawnotes} + +\section{\lblFollowUp} +{\raggedright\hyphenpenalty=10000\exhyphenpenalty=10000 \RepBooking\par} diff --git a/consultation-report/sections/french.tex b/consultation-report/sections/french.tex new file mode 100644 index 0000000..d404698 --- /dev/null +++ b/consultation-report/sections/french.tex @@ -0,0 +1,2 @@ +% Sample content is written in English and Spanish; this language uses the English text. +\input{sections/english} diff --git a/consultation-report/sections/german.tex b/consultation-report/sections/german.tex new file mode 100644 index 0000000..d404698 --- /dev/null +++ b/consultation-report/sections/german.tex @@ -0,0 +1,2 @@ +% Sample content is written in English and Spanish; this language uses the English text. +\input{sections/english} diff --git a/consultation-report/sections/italian.tex b/consultation-report/sections/italian.tex new file mode 100644 index 0000000..d404698 --- /dev/null +++ b/consultation-report/sections/italian.tex @@ -0,0 +1,2 @@ +% Sample content is written in English and Spanish; this language uses the English text. +\input{sections/english} diff --git a/consultation-report/sections/portuguese.tex b/consultation-report/sections/portuguese.tex new file mode 100644 index 0000000..d404698 --- /dev/null +++ b/consultation-report/sections/portuguese.tex @@ -0,0 +1,2 @@ +% Sample content is written in English and Spanish; this language uses the English text. +\input{sections/english} diff --git a/consultation-report/sections/spanish.tex b/consultation-report/sections/spanish.tex new file mode 100644 index 0000000..ae03d75 --- /dev/null +++ b/consultation-report/sections/spanish.tex @@ -0,0 +1,127 @@ +% Sustituye el contenido de ejemplo por el registro de tu propia sesión. +\section{\lblGlance} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}l@{\hspace{1.2cm}}X@{}} + \toprule + \metalabel{\lblDate} & \RepDate \\ + \metalabel{\lblDuration} & \RepDuration \\ + \metalabel{\lblAttendees} & Dos miembros del equipo de soporte y la responsable de operaciones \\ + \metalabel{\lblFormat} & Videollamada con pantalla compartida \\ + \metalabel{\lblTopics} & Agentes de IA en atención al cliente, revisión de respuestas, manejo de datos de clientes \\ + \bottomrule + \end{tabularx} +\end{table} + +\begin{itemize} + \item Los agentes ya pueden redactar respuestas para el equipo de soporte, pero no deben enviarlas solos. + \item Los datos de clientes necesitan un límite claro antes de que un agente lea cualquier ticket. + \item Un piloto pequeño con resultados medidos es mejor punto de partida que un despliegue completo. +\end{itemize} + +\section{\lblQuestions} +\begin{enumerate} + \item ¿Qué tareas de soporte puede hacer hoy un agente de IA de forma segura? + \item ¿Cómo evitamos que un agente comparta datos de clientes que no debería ver? + \item ¿Quién revisa el trabajo del agente y cuánto tiempo lleva? + \item ¿Cómo sabremos que el agente ayuda y no solo que es rápido? +\end{enumerate} + +\section{\lblFound} +\subsection{Los tickets mezclan solicitudes rutinarias y sensibles} +\findingpart{\lblContext} +El equipo atiende unos 300 tickets por semana. La mayoría son consultas sobre +pedidos y contraseñas; unos pocos tratan reembolsos, quejas o datos personales. + +\findingpart{\lblObservation} +Los tickets rutinarios encajan bien con un agente. Los sensibles están en la +misma cola sin etiqueta, así que un agente no puede distinguirlos. + +\subsection{Las respuestas no se revisan de forma consistente} +\findingpart{\lblContext} +Hoy cada persona del equipo revisa las respuestas a su manera, y no hay un +estándar escrito de tono ni de exactitud. + +\findingpart{\lblObservation} +Sin un estándar compartido, quien revisa no puede decir si un borrador es +bueno, y el equipo no puede medir al agente contra nada. + +\begin{insight} + El límite seguro de un agente lo fija lo que puede ver y lo que puede enviar, + no lo inteligente que sea. Conviene fijar primero esos dos límites. +\end{insight} + +\begin{mermaid}[style=editorial,width=0.9\linewidth, + caption={Manejo propuesto de un ticket},pos=H] + flowchart LR + A[Ticket] --> B[El agente redacta] --> C[Una persona revisa] --> D[Envío] +\end{mermaid} + +\section{\lblRecommendations} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}lXll@{}} + \toprule + & \sffamily\small\bfseries\lblRecommendation & \sffamily\small\bfseries\lblPriority & + \sffamily\small\bfseries\lblEffort \\ + \midrule + \recrow{1}{Mantener a una persona entre el agente y el cliente}{Solo borradores; una persona envía cada respuesta.}{high}{small} + \recrow{2}{Ocultar los datos personales al agente}{Enmascarar nombres, correos y datos de pago antes de que lea el ticket.}{high}{medium} + \recrow{3}{Escribir un estándar de respuestas de una página}{Da a quienes revisan y al piloto una medida común de calidad.}{medium}{small} + \recrow{4}{Hacer un piloto de cuatro semanas con tickets rutinarios}{Medir el tiempo ahorrado y los errores antes de ampliar el alcance.}{medium}{medium} + \recrow{5}{Añadir una revisión mensual de los errores del agente}{Mantiene las reglas al día cuando cambian los tickets.}{low}{small} + \bottomrule + \end{tabularx} +\end{table} + +\section{\lblResources} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}Xl@{}} + \toprule + \sffamily\small\bfseries\lblResource & \sffamily\small\bfseries\lblLink \\ + \midrule + \resrow{Lista de control para revisar las respuestas de un agente}{https://example.org/checklist} + \resrow{Plantilla de estándar de respuestas de una página}{https://example.org/reply-standard} + \resrow{Guía para enmascarar datos personales en tickets}{https://example.org/masking} + \resrow{Hoja de trabajo del plan piloto}{https://example.org/pilot-plan} + \bottomrule + \end{tabularx} +\end{table} + +\section{\lblNextSteps} +\begin{table}[H] + \centering + \begin{tabularx}{\linewidth}{@{}Xlr@{}} + \toprule + \sffamily\small\bfseries\lblAction & \sffamily\small\bfseries\lblOwner & + \sffamily\small\bfseries\lblTarget \\ + \midrule + \actrow{Etiquetar los tickets sensibles en la cola}{client}{20 de noviembre de 2026} + \actrow{Enviar la guía de enmascarado y un ejemplo de configuración}{consultant}{23 de noviembre de 2026} + \actrow{Redactar el estándar de respuestas de una página}{client}{27 de noviembre de 2026} + \actrow{Revisar el borrador del estándar y el plan piloto}{consultant}{2 de diciembre de 2026} + \actrow{Iniciar el piloto de cuatro semanas}{client}{7 de diciembre de 2026} + \bottomrule + \end{tabularx} +\end{table} + +\section{\lblNotes} +\begin{rawnotes} + \begin{itemize} + \item Al equipo le preocupan las promesas de reembolso erróneas; el agente nunca debe afirmar un reembolso. + \item La herramienta actual guarda el historial completo, incluidos dígitos de tarjeta en texto libre. + \item La responsable de operaciones quiere un número semanal: tickets respondidos, ediciones por borrador. + \item Idea: empezar solo con estado de pedidos y añadir ayuda con contraseñas después. + \end{itemize} + Esquema de reglas acordado en la llamada: + \begin{code}[lang=yaml] +agent: + can_read: [order_status, shipping] + can_send: false + blocked: [refund, complaint, payment] + \end{code} +\end{rawnotes} + +\section{\lblFollowUp} +{\raggedright\hyphenpenalty=10000\exhyphenpenalty=10000 \RepBooking\par} diff --git a/consultation-report/spell-whitelist.txt b/consultation-report/spell-whitelist.txt new file mode 100644 index 0000000..533fc30 --- /dev/null +++ b/consultation-report/spell-whitelist.txt @@ -0,0 +1,11 @@ +# Words the spell checker accepts in this template. One word per line. +flowchart +lr +mermaid +yaml +chatbot +chatbots +guardrails +escalations +triage +yshift diff --git a/consultation-report/template.toml b/consultation-report/template.toml new file mode 100644 index 0000000..0087662 --- /dev/null +++ b/consultation-report/template.toml @@ -0,0 +1,113 @@ +id = "consultation-report" +version = "0.1.0" +display_name = "Consultation Report" +description = "Written record of a paid consultation session: questions, findings, prioritised recommendations, resources, next steps and raw notes" + +[files] +include = ["**/*.tex", "**/*.txt", "assets/**"] +exclude = [] + +[[placeholders]] +name = "title" +type = "string" +description = "Report title" +required = true +default = "Consultation report" + +[[placeholders]] +name = "organisation" +type = "string" +description = "Consulting practice or organisation shown at the top of the cover" +required = false +default = "Example Consulting" + +[[placeholders]] +name = "consultant" +type = "string" +description = "Name of the consultant who ran the session" +required = false +default = "Example Consultant" + +[[placeholders]] +name = "client" +type = "string" +description = "Client who booked the session" +required = false +default = "Example Client" + +[[placeholders]] +name = "session_date" +type = "string" +description = "Date of the session" +required = false +default = "12 November 2026" + +[[placeholders]] +name = "duration" +type = "string" +description = "Length of the session" +required = false +default = "90 minutes" + +[[placeholders]] +name = "session_type" +type = "string" +description = "Kind of session, for example a first consultation or a review" +required = false +default = "Advisory session" + +[[placeholders]] +name = "reference" +type = "string" +description = "Reference number of the report" +required = false +default = "CR-2026-014" + +[[placeholders]] +name = "classification" +type = "string" +description = "Classification label shown on the cover and in every footer" +required = false +default = "Confidential" + +[[placeholders]] +name = "booking" +type = "string" +description = "Closing line that tells the client how to book a follow-up session" +required = false +default = "To book a follow-up session, write to hello@example.org or use the booking link at example.org/book." + +[[placeholders]] +name = "accent" +type = "string" +description = "Accent colour as a six-digit HTML hex value, without the hash" +required = false +default = "87222C" + +[[placeholders]] +name = "logo" +type = "string" +description = "Path to an optional logo image, shown on the cover when the file exists" +required = false +default = "assets/logo.png" + +[[placeholders]] +name = "paper_texture" +type = "boolean" +description = "Put a parchment texture behind every page, for documents read on screen (the cover always has it)" +required = false +default = false + +[[placeholders]] +name = "language" +type = "enum" +description = "Document language for babel; fixed labels and sample text are translated for English and Spanish" +required = true +choices = ["english", "spanish", "french", "german", "italian", "portuguese"] +default = "english" + +[[post_generate]] +name = "build" +description = "Compile the document to PDF" +command = "texforge build" +optional = true diff --git a/registry.toml b/registry.toml index ae58d61..98bd29a 100644 --- a/registry.toml +++ b/registry.toml @@ -28,6 +28,11 @@ nombre = "book" descripcion = "Long-form book layout with epigraphs and front matter" version = "0.3.0" +[[templates]] +nombre = "consultation-report" +descripcion = "Written record of a paid consultation session: questions, findings, prioritised recommendations, resources, next steps and raw notes" +version = "0.1.0" + [[templates]] nombre = "contract" descripcion = "Services agreement layout with parties block, numbered clauses, annexes and signature block; clause text is for you to write"