Claude Compass

Memories

Memory files live at C:\Users\matt_\.claude\projects\C--Users-matt--OneDrive-Claude\memory\ and are indexed in MEMORY.md. Claude writes and updates these automatically. There are four types: project (ongoing work context), reference (where to find things), user (preferences and background), and feedback (how to behave).
Project NPG Dispute — 18 Sandal Avenue Level: Personal
Key contacts, dates, case facts and outstanding items for Northern Powergrid property access dispute (ENQ23250651)
project_npg_dispute.md

Matthew moved in 2012 (earlier sessions had this as 2022 — this is the correct date).

  • Andy Balding — technical lead — andy.balding@northernpowergrid.com
  • Ben Hardy — complaints handler — ben.hardy@northernpowergrid.com
  • Paul McGinlay — Operations Director — paul.mcginlay@northernpowergrid.com
  • Louise Lowes — Director of Customer Service — louise.lowes@northernpowergrid.com (unverified)
  • Garry Dando — Data Governance — garry.dando@northernpowergrid.com

New contacts: Mark Appleyard (Andy's manager) — mark.appleyard@northernpowergrid.com; Dean Hogarth (OCU DPO) — dpo@ocugroup.com; Heather Woodhead — General Manager Domestic Scale Connections, single point of contact since 9 September 2026 — heather.woodhead@northernpowergrid.com.

The crux (must stay central): Matthew could only have known about Job A by being told it on site in November 2024, because Job A appears on no document until NPG's 2026 works plan. He described it before that plan was disclosed, so his consent account is corroborated by NPG's own later document. Consent sequence settled 7 Oct 2026: nothing agreed or refused at the survey visit; the only consent ever given was on the doorstep on 2 November 2024, for the surveyed scope.

Status (17 October 2026): Woodhead sent a second works plan (verge excavation gone, Matthew's own supply now to be cut and rejointed) with works moved a fifth time to 8/9 February 2027. Matthew replied with a single request, produce the October 2024 survey record or confirm in writing it does not exist, with his June written-first position attached. Awaiting the Ombudsman case reference, then the supplementary package goes over.

Status (12 October 2026): Energy Ombudsman referral LODGED by email in two parts (four documents plus 28-exhibit bundle) and acknowledged same day. Key new evidence from SAR: NPG's own March 2026 Works Order answering "Wayleaves required? NO" and citing the 2024 complaint. Woodhead reply finalised and ready to send in-thread now the referral is a fact.

Status (6 October 2026): Complaint formally closed 29 July 2026 by final response signed Paul McGinlay. Energy Ombudsman window open to ~29 July 2027; referral not yet made. Full dispute mailbox harvested (80 emails) to _output\NPG-dispute\emails\. Decisive contradiction on record: McGinlay and Woodhead give conflicting official accounts of why the 2024 excavation stopped, neither evidenced. Woodhead letter 5 October refused any H&S investigation of 2024. Phase 1 works at No 20 scheduled 13 and 16 November 2026. Pre-November priorities: Ombudsman referral, HSE concern, reply to Woodhead, written answer on whether the November works affect No 18's supply. Full analysis in _output\NPG-dispute\notes\.

Feedback No dashes in written text Level: Global
Never use em dashes or hyphens as connectives in written text — they make the writing look AI-generated
feedback_no_dashes_in_text.md

Do not use em dashes or hyphens as connectives in any written text (letters, documents, responses). Use full sentences instead.

Why: It makes writing look AI-generated. Matthew flagged this while reviewing NPG correspondence.

Exception: Hyphens in compound words (e.g. well-established, hand-pointed) are fine.

Feedback Never send emails Level: Global
Claude must never send an email on Matthew's behalf, under any circumstances. Drafts only.
never-send-emails.md

Matthew's instruction (5 October 2026): "Don't you send anything ever." Claude drafts emails; Matthew always sends them himself from his own client. There is no approved-then-send flow at all. No Outlook COM Send, SMTP, Graph, browser automation or any other transmission mechanism.

Why: Sending is outward-facing and irreversible; Matthew keeps that step entirely to himself.

Note: Memory file stored in the WYCA session memory store, but the rule applies everywhere.

Project Category is custom and undefined Level: Project: WYCA Learner Destinations
The pilot Category column is best-effort, not an agreed WYCA definition — must be called out in any client email
category-custom-undefined.md

On the WYCA interface, the Category column (ESOL / English / Maths / Digital / Construction) is custom to the pilot with no agreed WYCA definition. Learning Aim Title, SSA Tier 2 and Notional NVQ Level come straight from LARS and are solid; Category is derived by our own best-effort rules and is not validated.

Why: Chris Maunder worked out category manually from the ILR/DfE spec, not a lookup, and the dummy data assigns categories at random. The definition is WYCA's call.

How to apply: In any email to Chris/Pippa/WYCA about the interface, explicitly flag that Category is custom, undefined and best-effort, and ask them to confirm the definition.

Reference Claude's Agent Gmail — mattnoodling Level: Global
Dedicated Gmail account for Claude to send personal enquiries and quote requests on Matthew's behalf
reference_agent_gmail.md

mattnoodling@gmail.com — used by the Personal Assistant agent for outbound enquiries: quote requests, tradespeople, bookings, and similar personal tasks. Keeps Matthew's personal addresses out of agent correspondence.

Password stored in the global secrets vault as CLAUDES-GMAIL-PASSWORD.

Feedback SQL Stored Proc Standards Level: Global
Matthew's preferred SQL formatting, merge pattern, and surrogate key approach for Fabric Warehouse stored procedures
feedback_sql-standards.md — full reference at C:\Users\matt_\.claude\sql-standards.md
  • Developer in all proc headers: Matthew Denison, Team: D&A
  • UPDATE then INSERT — never use SQL MERGE statement
  • RowHash computed in staging view, stored in target, compared on join
  • Surrogate keys: SK{TableName}ID — generated via @maxid + ROW_NUMBER() (no IDENTITY in Fabric)
  • DELETE commented out for Dims by default; active for Facts
  • Schemas: target dw, staging STG, procs LOAD
Feedback SQL Reserved Word Aliases Level: Global
Always bracket T-SQL column aliases that are reserved words — RowCount, Count, Name, Value, Key, Type, Date, Status — to avoid syntax errors in Fabric Warehouse
feedback_sql_reserved_words.md (Reapit project) — rule also added to C:\Users\matt_\.claude\sql-standards.md
  • Fabric Warehouse throws Incorrect syntax near the keyword '<alias>' for bare reserved word aliases
  • Always write [RowCount], [Name], [Value] etc. — never unbracketed
  • Applies to ad-hoc queries and UNION ALL count scripts as well as stored procedure SQL
Project Disseminate Website Architecture Level: Disseminate
Azure DevOps repos, Cloudflare hosting stack, and separation of Compass vs main site for disseminate.co.uk
project_disseminate_website.md

The disseminate.co.uk website is split into two repos in the diss-tfs Azure DevOps org, project Disseminate Web Site:

  • disseminate-compass — Claude Compass internal guide site. Source: _claude-guide\. Deployed to compass.disseminate.co.uk via Cloudflare Pages, triggered on push to main. Password protected with Cloudflare Access (one-time PIN to matthew@disseminate.co.uk).
  • disseminate-web — Main disseminate.co.uk website (not yet built). Separate Cloudflare Pages project.

Hosting stack: 123-reg DNS → Cloudflare nameservers → Cloudflare Pages (free tier). Auth via Cloudflare Access (Zero Trust, personal plan).

Why separate repos: Each is an independent app — Compass updates should not trigger a main site deployment. The main site will be public; only Compass needs auth.

Reference Claude Compass Design Reference Level: Disseminate
Colour palette, typography, and style guide for the Compass site (awwwards-inspired, amber accent, near-black sidebar)
reference_compass_design.md

Claude Compass is styled after awwwards.com/jobs — bold, near-monochromatic editorial aesthetic with an amber accent.

  • Sidebar: #111111 near-black
  • Accent: #D4920A amber/gold
  • Background: #F2F2F2, cards white
  • Headings: 52px, weight 900, uppercase, tight letter-spacing
  • Logo bars: amber shades #F5D08A → #E8A020 → #D4920A
  • Shadows: minimal/flat. Border-radius: 6px.
Reference Disseminate Company Details Level: Disseminate
Registered details used on quotes and invoices — company number, registered office, VAT number, quote numbering and payment terms
reference_disseminate_company.md
  • Registered name: Disseminate Ltd, company number 07705496
  • Registered office: Suite 3b Kings House, 1 King Street, Leeds, LS1 2HH
  • VAT number: 116365622 (standard 20%)
  • Quote numbering: DIS-{year}-{nnn}, first issued DIS-2026-101 (Freedom CVR quote)
  • Standard payment terms: invoice on completion, 30 days
Reference Global CLAUDE.md Symlink Level: Global
The real path for the global CLAUDE.md — always edit the target, not the symlink
reference_global_claudemd.md

~/.claude/CLAUDE.md is a symlink. The real file is C:\Users\matt_\OneDrive\Claude\_global\CLAUDE.md.

Always edit the real path directly — the Edit tool refuses to write through symlinks. The symlink keeps global rules in OneDrive for backup and portability while making them available in Claude's config folder.

Feedback Silver Layer Column Casing (CRL) Level: Project: CRL
Silver LH views are case-sensitive — use exact source casing when referencing columns from Silver views, alias to DW names in #Staged
feedback_silver-casing.md

When selecting from CRL_Silver_LH views, always use the exact column casing from the original LOAD proc (typically all lowercase, e.g. countryname, iso2). Alias to DW PascalCase in the #Staged SELECT. Everything referencing #Staged afterwards uses DW names.

Why: The Silver Lakehouse is case-sensitive. Using PascalCase like [CountryName] directly in a Silver query causes Msg 207 "Invalid column name" at runtime.

How to apply: Find the original Silver→STG LOAD proc and copy column names from its SELECT list exactly. Never infer casing from the DW or STG DDL.

Project Non-deterministic ROW_NUMBER (CRL) Level: Project: CRL
Fabric breaks ROW_NUMBER ties arbitrarily — two 2026-09-08 bugs; partition must match output grain; one accepted known duplicate
project_nondeterministic-rownumber.md

Two CRL bugs shared one root cause: ROW_NUMBER() dedup with a non-unique ORDER BY. Fabric's engine breaks ties arbitrarily (results flip between runs) where legacy SQL Server happened to be stable, so latent bugs surfaced after migration.

  • 01_load_crm_account notebook: tie on createdon picked a NULL industry row. Final fix (14/09): rank all candidate rows after joining to the account — CRM's own industry pointer first, then completeness, then recency; never dedup before applying the pointer. Check the deployed cell, not the repo copy, when debugging this notebook
  • usp_DimDocumentDescription: partitioned by invoiceid while outputting ledgervoucher as DocumentID — invoice/credit-note pairs randomly dropped, phantom GL rows accumulated in the insert-only dim (~2,667 inflated fact rows). Runbook: CRL\_output\uat-fix-DimDocumentDescription-runbook.md

How to apply: partition by the column that becomes the output identity; make ORDER BY deterministic. Suspect this pattern in any migrated proc with unexplained row differences vs old CRL.

Known accepted issue: one duplicated fact transaction (Dream doc 27206 colliding with a D365 voucher); the Source guard in usp_FactFinanceTransaction is deliberately commented out. Same duplicate expected in PROD.

Feedback No mid-task warnings once plan approved Level: Global
Don't add safety/security commentary mid-execution; one warning at planning stage is enough
feedback_plan_approval.md

Once Matthew has approved a plan and execution is underway, proceed without giving additional warnings about actions covered in the plan.

Why: Rule 6 already covers this — plan approval = permission to execute. Mid-task warnings feel like re-asking for permission and slow things down.

How to apply: Give one-time warnings at the planning stage if something is irreversible or risky. Once Matthew says go, execute cleanly without commentary on each step.

Feedback One step at a time in live guidance Level: Global
Hands-on help: one route, one step, wait for the result; never stack alternative options mid-execution
feedback_one_step_at_a_time.md

When walking Matthew through a hands-on task, especially on a second machine he is operating while chatting (e.g. a client laptop), give exactly one route and one step at a time, then wait for the result before the next step.

Why: During the Savills laptop setup (Oct 2026) multiple alternative routes offered at once became overwhelming.

How to apply: Pick the single most likely route and commit to it. Give only the next action, in plain words, with the exact thing to type or click. Surface an alternative only after the chosen route has failed, and replace the plan rather than stacking options.

Project Jacuzzi J-235 "Huzi" Level: Personal
Purchase details, supplier, and electricity tariff for Matthew's J-235 hot tub
project_jacuzzi.md
  • Model: Jacuzzi J-235 (2021), nickname "Huzi"
  • Purchased from: Outdoor Living — contact for servicing, parts, and warranty
  • Tariff: Intelligent Octopus Go — 6.9p/kWh off-peak (23:30–05:30), 28.5p/kWh peak
  • Setup: Built-in economy/off-peak mode + external timer plug
Project T&T Fabric Medallion — Fee Flash Gold Layer Level: Project: Fabric Medallion
Design decisions and constraints for the Fee Flash Gold layer build in Turner and Townsend's Fabric Medallion project
project_tt_fabric_medallion.md
  • Data retention: 2 years of transactional GL data only — do not load bi.gl_grouped historical rollup (pre-2023 Dufrain-era monthly summaries with degraded dimensionality)
  • Invoiced filter: mainaccountid IN ('600000','600100','603500','619500','600500','601000','600600') AND postingtype <> 14
  • AccDef filter: mainaccountid IN ('602000','602100','602200','602300','602010','602110','600000','600100','600500') AND postingtype = 14
  • Sign convention: All amounts negated (* -1) to match business reporting convention
  • Schema mapping: _output\fee-flash-schema-mapping.xlsx
  • Source model: GL SL PBIP at _context\powerbi\GL SL.SemanticModel\
Feedback Close Fabric notebook after running Level: Project: Fabric Medallion
Matthew closes Fabric notebook tabs after each run so subsequent git syncs land cleanly without being overwritten by Fabric's cached copy of the notebook.
feedback-fabric-git-single-channel.md
  • Symptom: a valid change lands via git sync, then Fabric silently overwrites it with the pre-sync version seconds later (autosave writes the stale in-memory copy back to git)
  • Fix: close the notebook tab after running so Fabric drops its in-memory copy; the next sync then applies cleanly
  • When Claude edits code and pushes: remind Matthew to close the tab in Fabric before "Update from Git", or immediately after his next run
  • Do not suggest avoiding Fabric edits altogether — running notebooks in Fabric is unavoidable in Matthew's workflow
Feedback Gold/Silver config datatype strings Level: Project: Fabric Medallion
Datatype strings in silver_config / gold_config JSON must match the exact keys in nb_0001_functions_gold.getDataType — otherwise createTable throws AssertionError at runtime.
feedback-gold-config-datatypes.md
  • Valid values: string, long, integer (not "int"), float, double, decimal, date, timestamp, boolean
  • Symptom of mismatch: AssertionError "dataType None should be an instance of pyspark.sql.types.DataType"
  • Root cause: getDataType() returns None when the string is not in its switch dict
  • How to avoid: before adding a datatype value, grep nb_0001_functions_gold for getDataType or copy the datatype string from an existing column of the same type
Feedback Project doc back link points to Projects Level: Project: Fabric Medallion
Every project documentation page in _claude-guide\ must have its top back link pointing to projects.html with the relevant customer anchor (e.g. #turner-townsend, #savills), labelled "Back to Projects".
feedback-back-link-to-projects.md
  • Applies to: tt-*.html, reapit-*.html, eufinance-*.html, and any future project docs across all customers
  • Anchor slugs: Savills = #savills, Turner & Townsend = #turner-townsend
  • Why: lands the user on their customer's block instead of the top of the page. projects.html is the canonical hub grouping all project docs
  • Does not apply to: non-project pages (agent pages, home entertainment sub-pages, etc.) which may legitimately link back to their own parent
Feedback Azure DevOps not GitHub (Reapit repo) Level: Project: Reapit
The Reapit repo lives on Azure DevOps (savills-uk.visualstudio.com), not GitHub. Do not use `gh` CLI here.
feedback_azure_devops_not_github.md
  • Check git remote -v before assuming platform tooling
  • Azure DevOps equivalent of gh is az repos, but Matthew prefers UI operations anyway
  • Direct PR URL pattern: savills-uk.visualstudio.com/Savills%20Applications/_git/bi-data-platform-reapit-core/pullrequestcreate?sourceRef=<source>&targetRef=<target>
Feedback No git commands without explicit permission Level: Global
Never run state-changing git operations (commit, push, pull, checkout, merge, rebase, reset, add/stage) without explicit permission from Matthew
feedback_no_git_without_permission.md
  • Read-only commands (git status, git log, git diff, git show) are fine to use freely
  • Exception: git operations directly implied by an agreed task instruction (e.g. "update this folder from branch X")
  • Always ask or confirm before committing, pushing, pulling, or checking out
Feedback PR creation is manual (DevOps UI) Level: Project: Reapit
Matthew creates pull requests himself via the Azure DevOps UI. After pushing a branch, write PR details to a temp file and open in Notepad rather than running a PR-create CLI.
feedback_pr_creation.md
  • Do NOT run gh pr create, az repos pr create, or equivalents
  • Instead: write PR title, description, source/target branches, and a direct DevOps PR-create URL to _temp\cmd-{project}-{timestamp}.txt
  • Open the file in Notepad so Matthew can copy-paste into the DevOps UI
Project PRD Snowflake schema is SAV not SAU Level: Project: Reapit
The Reapit PRD Snowflake account names the SAU source schema AURORA_SAV_RPS_SAV; dev/QA/UAT use AURORA_SAU_RPS_SAU. Any SQL, config, or pipeline parameter targeting PRD must use the SAV name.
project_prd_schema_is_sav.md
  • Discovered 4 Aug 2026: PRD initial load failed with "Schema does not exist or not authorized" — naming difference, not grants
  • Fix: update SchemaName in the PRD CONFIG.Processes from SAU to SAV (PRD only — other environments keep SAU)
  • Fabric Lakehouse schema is LANDING in all environments — unaffected
  • PP schema naming in PRD is unverified — check before the PP PRD load
Project PP deletes not tracked (Reapit) Level: Project: Reapit
The load_bronze_deleted pipeline sources SAU tables only; the six PP (AURORA_PRP_RPS_PRP) tables have no delete tracking. Open item to revisit.
reapit_pp_deletes_not_tracked.md

The load_bronze_deleted pipeline (cd_GetDeleted_Batch1 and cd_GetDeleted_Batch2) sources only from AURORA_SAU_RPS_SAU (49 table refs, 0 PP). The six PP tables in AURORA_PRP_RPS_PRP have no equivalent delete tracking.

  • Confirmed 10 Aug 2026 while making the pipeline environment-aware (SAU→SAV in PRD)
  • Not a blocker — Matthew flagged it as a gap to look at later
  • A fix would mirror the SAU pattern: a PP base-vs-_A FULL OUTER JOIN block set writing to LANDING.DELETED, or a separate PP deleted pipeline
Reference Snowflake account URLs (Reapit) Level: Project: Reapit
The three Reapit Snowflake accounts, all region eu-west-2.aws, database REAPIT_RAW.
reference_snowflake_account_urls.md
  • Reapit SAU UAT — ZL83042.eu-west-2.aws.snowflakecomputing.com (the account in the legacy Bronze notebooks)
  • Reapit SAU PRD — ss94622.eu-west-2.aws.snowflakecomputing.com (carries the SAV-named schema)
  • REAPIT_PP — sx94212.eu-west-2.aws.snowflakecomputing.com (separate property-management account)
  • Live host is held in a Fabric cloud connection, not the Variable Library. Credentials are not recorded here.
Project Silver view deployment (Lakehouse) Level: Project: EU Finance
EU Finance silver views live on a Fabric Lakehouse SQL analytics endpoint — deploy via CREATE OR ALTER scripts in a notebook, not direct Warehouse DDL.
eufinance-silver-view-deployment.md

Silver layer is a Fabric Lakehouse (not a Warehouse). Views on the SQL analytics endpoint (EU_FO_Silver_LH.staging.*, EU_FO_Silver_LH.landing.*) require CREATE OR ALTER deployment scripts run against the Lakehouse endpoint.

  • Update the SQL in the relevant notebook (Create or Alter Staging Views.Notebook, Create or Alter Landing Views.Notebook)
  • Run the notebook against the correct workspace (dev / test / prod) to apply the change
  • Do not try to ALTER via a Warehouse connection or Fabric UI — the mechanics differ
Project Spark notebooks read dbo tables Level: Project: EU Finance
landing.* views and $label enum columns exist only on the SQL analytics endpoint — Spark notebooks read the raw dbo tables and must resolve labels and filters themselves.
eufinance-spark-notebooks-dbo-tables.md

In EU_FO_Silver_LH, the landing.* objects are SQL endpoint views, invisible to Spark. The persisted-table notebooks (cte_*_persisted / usp_staging_*) read raw dbo tables unqualified and write delta tables to the lakehouse landing schema.

  • Enum labels: _$label columns come from joining dbo.GlobalOptionsetMetadata on entity, option set, and option value
  • Filters: landing views apply recid IS NOT NULL; replicate in Spark
  • Placeholder dates: D365 uses 1900-01-01; null out before using in dedupe ordering, not after
  • .platform files: every Fabric item folder needs the hidden .platform file or git integration silently ignores the item
  • Endpoint sync lag: after a Spark write, the SQL endpoint can serve stale data until metadata sync — the Sync SQL Endpoint notebook gates downstream pipelines; validate only after a refresh
Project WIP model KEEPFILTERS fix Level: Project: EU Finance
All 27 measures filtering Net Revenue Type in the WIP Data Model must wrap their CALCULATE predicate in KEEPFILTERS — plain overrides created phantom duplicate rows in visuals.
eufinance-wip-keepfilters-phantom-rows.md

September 2026: forecast payaways appeared twice in WIP reports (once as Payaway, once as Unknown). The warehouse held one clean row per transaction — the duplication was purely DAX: CALCULATE([x], 'Net Revenue Type'[col] = "value") overrides the visual's row filter on that column, so amounts reappear under other type labels.

  • Fix — KEEPFILTERS around every Net Revenue Type predicate in _Measures.tmdl: 6 measures on Is Revenue Or Payaway, 21 breakdown measures on Net Revenue Type
  • Gotcha — the Weighted measures returned 0.00 (zero weighting × amount) rather than blank, which still materialises phantom rows
  • Status — applied manually in Desktop 15 Sep 2026; workspace repo copy to be re-pulled once merged to main
Project PBI 243936 prod pending Level: Project: EU Finance
The PBI 243936 Department/Division changes are deployed in Dev, UAT and Support but pending in prod; the tracker page holds the verified manual prod deployment pack.
eufinance-pbi243936-prod-pending.md

Audited 29 Sep 2026 by scripting every object out of every environment and diffing against main. Prod runs the As-Is versions with uncommitted in-place hotfixes, superseded by current main.

  • Why — prod deployments are manual, and this change flips the Department column from local to central D365 name in reports, so it was held back
  • Apply — check eufinance-pbi243936-deployment.html before prod work on these dims; baseline must precede the master data enrichment; prod's DimDivision still has Title/DivisionTranslated (varchar(200)), DimDepartment still has DepartmentGroup
Feedback Work step by step Level: Customer: Savills
One small change at a time, explained first, with explicit go-ahead before each change. Never bundle extra steps into an agreed step without flagging.
feedback-work-step-by-step.md

During the Master Data Fabric work (Aug 2026) Matthew repeatedly asked to slow down, and after a batch of unannounced edits: "im completely lost what did you just do. can you wait in future".

  • Why — he follows along in the Fabric workspace and tests each change as it lands; batched changes break his mental model
  • Apply — describe the change in plain terms before making it, wait for the go-ahead, confirm briefly after. Keep answers short and don't move on unprompted