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).
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.
Status (4 June 2026): All letters sent. Andy Balding responded to technical letter — did not refuse reinstatement conditions. Meeting agreed in principle with 6 conditions (date after 21 June, Saturday, reinstatement in writing, assessment only, disconnection threat withdrawn, prior letter provided). OCU SAR chased. TPO enquiry sent to Wakefield Council; emergency provisional TPO request to follow 5 June. Key Andy admission: NPG books works first, informs later. All files reorganised to _output\NPG-dispute\.
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.
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.
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, stagingSTG, procsLOAD
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
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 tocompass.disseminate.co.ukvia Cloudflare Pages, triggered on push tomain. 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.
Claude Compass is styled after awwwards.com/jobs — bold, near-monochromatic editorial aesthetic with an amber accent.
- Sidebar:
#111111near-black - Accent:
#D4920Aamber/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.
~/.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.
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.
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.
- 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
- Data retention: 2 years of transactional GL data only — do not load
bi.gl_groupedhistorical 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\
- 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
- 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
- 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
- Check
git remote -vbefore assuming platform tooling - Azure DevOps equivalent of
ghisaz 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>
- 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
- 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
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.- Discovered 4 Aug 2026: PRD initial load failed with "Schema does not exist or not authorized" — naming difference, not grants
- Fix: update
SchemaNamein the PRDCONFIG.Processesfrom SAU to SAV (PRD only — other environments keep SAU) - Fabric Lakehouse schema is
LANDINGin all environments — unaffected - PP schema naming in PRD is unverified — check before the PP PRD load
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
ALTERvia a Warehouse connection or Fabric UI — the mechanics differ