<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Notes from the field. | pH7x Systems</title>
    <link>https://ph7x.com/blog/</link>
    <description>What we learn moving organisations onto the Microsoft cloud. Method, not opinion.</description>
    <language>en</language>
    <atom:link href="https://ph7x.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Farm solution, SharePoint Framework or external service: deciding each customisation on Subscription Edition</title>
      <link>https://ph7x.com/blog/farm-solutions-spfx-or-external-services-on-subscription-edition/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/farm-solutions-spfx-or-external-services-on-subscription-edition/</guid>
      <description>A farm that upgrades to Subscription Edition does not make its custom code compatible, secure or supported. Each component is decided on its own: kept as a farm solution, rebuilt on the SharePoint Framework, moved to an external service, or retired. What Microsoft documents for each, and what decides between them.</description>
      <pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Migrating privileged SharePoint server-side code requires an authorization design</title>
      <link>https://ph7x.com/blog/migrating-sharepoint-server-code-and-elevated-privileges/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/migrating-sharepoint-server-code-and-elevated-privileges/</guid>
      <description>A WSP that deploys on Subscription Edition has not proved its authorization boundary. Review caller intent, elevated object lifetime, external identities and business acceptance before retaining, refactoring, extracting or eliminating server-side code.</description>
      <pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A report can look complete and still be impossible to verify</title>
      <link>https://ph7x.com/blog/a-report-can-look-complete-and-still-be-impossible-to-verify/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/a-report-can-look-complete-and-still-be-impossible-to-verify/</guid>
      <description>494 SOC 2 reports, allegedly 99.8% identical, and nothing in the system existed to notice. The uncomfortable part is not the fraud. It is that no automated check would have caught it.</description>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The green test that measured nothing</title>
      <link>https://ph7x.com/blog/the-green-test-that-measured-nothing/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/the-green-test-that-measured-nothing/</guid>
      <description>A test suite can be green because the system works, or green because the test points at nothing. We collected our own specimens: a suite verifying a build nobody shipped, a read-only gate over a collector that could not load, a published guarantee table that never executed, a pinned assertion that was a fossil of a bug, and a suite that proved every rule and never ran the handler. Each one with the code, and the one-line question that catches all five.</description>
      <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The confident wrong answer is worse than missing evidence</title>
      <link>https://ph7x.com/blog/the-confident-wrong-answer-is-worse-than-missing-evidence/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/the-confident-wrong-answer-is-worse-than-missing-evidence/</guid>
      <description>A governance report told us a site had external sharing disabled. The site permitted anonymous links. Nothing was broken: a correct API returned a default value for a property it had never populated, and the default happened to be the safest word in the enum. Here is the mechanism, the code that reproduces it, Microsoft&#x27;s own documentation of it, and the discipline that catches the whole class.</description>
      <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Why SharePoint Framework stayed on React 17 through SPFx 1.23.2</title>
      <link>https://ph7x.com/blog/why-sharepoint-framework-still-runs-on-react-17/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/why-sharepoint-framework-still-runs-on-react-17/</guid>
      <description>A retrospective on the SPFx 1.16–1.23.2 dependency boundary, updated to distinguish it from SPFx 1.24 and React 18.3.1. Platform compatibility requires more than changing a package version.</description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Migrating SharePoint 2016 and 2019 to Subscription Edition: the scripts</title>
      <link>https://ph7x.com/blog/migrating-sharepoint-2016-and-2019-to-subscription-edition-the-scripts/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/migrating-sharepoint-2016-and-2019-to-subscription-edition-the-scripts/</guid>
      <description>SharePoint 2016 goes straight to Subscription Edition. There is no hop through 2019, the method is database attach and nothing else, and the order of the service applications is not a preference. The sequence in PowerShell, from the inventory you take before touching anything to the checks you run before anyone is let in.</description>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>SharePoint 2016, 2019, Subscription Edition and Online: what actually changes</title>
      <link>https://ph7x.com/blog/sharepoint-2016-2019-subscription-edition-and-online-what-actually-changes/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/sharepoint-2016-2019-subscription-edition-and-online-what-actually-changes/</guid>
      <description>2016 and 2019 both left support on 14 July 2026. Subscription Edition has no end date and cannot be bought outright. Online has features the others do not have, and Subscription Edition has two that are usually listed as impossible. A practical comparison, with the licensing that decides it.</description>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Developing for SharePoint Server Subscription Edition: the practices that hold up</title>
      <link>https://ph7x.com/blog/developing-for-sharepoint-server-subscription-edition-the-practices-that-hold-up/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/developing-for-sharepoint-server-subscription-edition-the-practices-that-hold-up/</guid>
      <description>Subscription Edition is supported until at least 2035 and its SharePoint Framework ceiling has not moved since 2023. That combination is the whole job: a long runway on an older stack. This is how to build on it well, with code that runs on the version your farm actually accepts.</description>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A Copilot agent manifest is a security boundary. Here is the linter for it.</title>
      <link>https://ph7x.com/blog/a-copilot-agent-manifest-is-a-security-boundary-here-is-the-linter-for-it/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/a-copilot-agent-manifest-is-a-security-boundary-here-is-the-linter-for-it/</guid>
      <description>Every scoping property in a Microsoft 365 Copilot agent manifest is optional, and in six places omitting one grants the widest scope instead of the narrowest. A JSON Schema validator approves those manifests, because nothing in them is invalid: something optional is missing. So we wrote the check that does catch it. It finds six problems in a manifest that passes every other test.</description>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>SPFx before version 1.0: our web parts in the official Microsoft samples</title>
      <link>https://ph7x.com/blog/spfx-before-version-1-0-three-of-our-web-parts-in-the-official-microsoft-samples/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/spfx-before-version-1-0-three-of-our-web-parts-in-the-official-microsoft-samples/</guid>
      <description>The SharePoint Framework developer preview came out in August 2016. Version 1.0 arrived in February 2017. Our first contribution to the official Microsoft 365 samples repository is dated October 2016, five months before there was a 1.0 to build against. Four of our web parts are in that repository today, and this is what each of them is for.</description>
      <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>We are still measuring engineers by the part that got automated.</title>
      <link>https://ph7x.com/blog/we-are-still-measuring-engineers-by-the-part-that-got-automated/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/we-are-still-measuring-engineers-by-the-part-that-got-automated/</guid>
      <description>In 2025 DORA threw out its own scoreboard. The low, medium, high and elite tiers that the industry had quoted for a decade were replaced by seven team archetypes across eight measures. That is not a methodology footnote. It is the most used measurement framework in software admitting that the instruments no longer read the thing that decides whether a system survives.</description>
      <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>One agent is an integration. A hundred is a governance problem.</title>
      <link>https://ph7x.com/blog/one-agent-is-an-integration-a-hundred-is-a-governance-problem/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/one-agent-is-an-integration-a-hundred-is-a-governance-problem/</guid>
      <description>Agents got production identities before they got a stable way to record what they did. Microsoft Entra Agent ID is generally available, with sponsors and expiry dates. The OpenTelemetry conventions for agent traces are still experimental. That gap is not a detail: it decides what you can responsibly put into production this year, and it turns an AI question into a governance one.</description>
      <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Agents decide. Code executes. Knowing the line is the job.</title>
      <link>https://ph7x.com/blog/agents-decide-code-executes-knowing-the-line-is-the-job/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/agents-decide-code-executes-knowing-the-line-is-the-job/</guid>
      <description>The promise is that agents replace applications. In the systems we build, they do not. An agent is very good at understanding a request, weighing options and choosing a tool. It is the wrong place for a payment, a tax rule or a permission check. This is where the line falls, and why putting it in the wrong place is expensive.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>AI solved syntax. It did not solve judgement.</title>
      <link>https://ph7x.com/blog/ai-solved-syntax-it-did-not-solve-judgement/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/ai-solved-syntax-it-did-not-solve-judgement/</guid>
      <description>Three independent measurements, taken between 2025 and 2026, all point the same way: AI-generated code passes over 95% on syntax and 55% on security, and that second number has not moved in two years. The part you write got cheap. The part you decide did not.</description>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The state of SharePoint in 2026: what is gone, what is current, and what to build on</title>
      <link>https://ph7x.com/blog/the-state-of-sharepoint-in-2026/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/the-state-of-sharepoint-in-2026/</guid>
      <description>Every year someone declares SharePoint dead. It never was. But in a matter of months, real parts of it reached the end of the line: SharePoint Online Add-ins and Azure ACS for SharePoint Online retired in April, and SharePoint Server 2016 and 2019, InfoPath and SharePoint Designer left support in July. Here is what actually ended, what replaced it, and what to build on now, on-premises and in the cloud.</description>
      <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Windows 10 has ended: Windows 11 is the minimum, not the plan</title>
      <link>https://ph7x.com/blog/windows-10-has-ended-windows-11-is-the-minimum-not-the-plan/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/windows-10-has-ended-windows-11-is-the-minimum-not-the-plan/</guid>
      <description>Support ended in October 2025. Whether a fleet is already on Windows 11, paying for Extended Security Updates, or simply exposed, the decision underneath is the same: swap the PCs, or use the forced move to modernise the workplace behind them. This is the how, with the Intune, Autopilot and Azure commands, and the reason the same Windows 10 is free to keep alive in the cloud.</description>
      <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>SPFx 1.23.2: upgrading is not changing a number</title>
      <link>https://ph7x.com/blog/spfx-1-23-2-upgrading-is-not-changing-a-number/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/spfx-1-23-2-upgrading-is-not-changing-a-number/</guid>
      <description>The previous version was pulled from npm for regressions, and that is the warning: the risk of upgrading the SharePoint Framework is almost never in the SharePoint runtime, it is in the build. What changed in Heft, in Sass and in npm audit, with the code showing how it was, how it is, and how it will be.</description>
      <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Can your AI assistant read documents the user cannot see?</title>
      <link>https://ph7x.com/blog/the-ai-assistant-that-only-reads-what-you-can-read/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/the-ai-assistant-that-only-reads-what-you-can-read/</guid>
      <description>A badly built RAG searches with the application&#x27;s identity, not the asker&#x27;s, and the assistant answers with what the person should not see. The fix is not a filter someone can forget to write: it is passing the user&#x27;s token and letting Azure AI Search enforce permissions inside the engine.</description>
      <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A cookie banner you can prove, with Azure Tables and Functions</title>
      <link>https://ph7x.com/blog/cookie-consent-banner-with-azure-tables-and-functions/</link>
      <guid isPermaLink="true">https://ph7x.com/blog/cookie-consent-banner-with-azure-tables-and-functions/</guid>
      <description>The banner you copy from a vendor can itself be a tracker. Build your own instead, with no third parties, and the hard part turns out not to be the banner: it is keeping the proof that the person consented. Here is all of it, from the browser to the Azure Table, step by step.</description>
      <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
