<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://dev.traceable.digital/changelog</id>
    <title>Traceable Changelog</title>
    <updated>2026-04-16T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://dev.traceable.digital/changelog"/>
    <subtitle>Traceable platform release notes</subtitle>
    <icon>https://dev.traceable.digital/img/favicon.svg</icon>
    <rights>© 2026 Traceable Digital Ltd</rights>
    <entry>
        <title type="html"><![CDATA[v0.99.1 — First Stable Release]]></title>
        <id>https://dev.traceable.digital/changelog/v0-99-1</id>
        <link href="https://dev.traceable.digital/changelog/v0-99-1"/>
        <updated>2026-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first fully stable release of Traceable — production infrastructure verified, staging and production environments in complete structural parity, and all pre-launch security requirements met.]]></summary>
        <content type="html"><![CDATA[<p>The first fully stable release of Traceable — production infrastructure verified, staging and production environments in complete structural parity, and all pre-launch security requirements met.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's new<a href="https://dev.traceable.digital/changelog/v0-99-1#whats-new" class="hash-link" aria-label="Direct link to What's new" title="Direct link to What's new" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="request-deduplication">Request deduplication<a href="https://dev.traceable.digital/changelog/v0-99-1#request-deduplication" class="hash-link" aria-label="Direct link to Request deduplication" title="Direct link to Request deduplication" translate="no">​</a></h3>
<p>Duplicate requests are now handled gracefully across account signup, OTP delivery, and scheduled platform jobs. Submitting the same action more than once returns the correct result without creating duplicate records or triggering duplicate emails — critical for reliability in slow-network scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="strengthened-server-side-auth-checks">Strengthened server-side auth checks<a href="https://dev.traceable.digital/changelog/v0-99-1#strengthened-server-side-auth-checks" class="hash-link" aria-label="Direct link to Strengthened server-side auth checks" title="Direct link to Strengthened server-side auth checks" translate="no">​</a></h3>
<p>Every server action that mutates data now has an automated regression guard verifying that authentication is enforced before any database write. This runs as part of the CI pipeline on every push.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="production-infrastructure-hardened">Production infrastructure hardened<a href="https://dev.traceable.digital/changelog/v0-99-1#production-infrastructure-hardened" class="hash-link" aria-label="Direct link to Production infrastructure hardened" title="Direct link to Production infrastructure hardened" translate="no">​</a></h3>
<p>Three database migrations landed in production as part of this release:</p>
<ul>
<li class=""><strong>Bulk AI document processing</strong> — backend infrastructure for processing multiple compliance documents in a single AI extraction job, improving throughput for operators with large document libraries.</li>
<li class=""><strong>GDPR deletion policies</strong> — enhanced data deletion rules ensuring that all personal data is correctly removed when an account deletion is requested, in line with Article 17 right to erasure.</li>
<li class=""><strong>AI telemetry</strong> — usage tracking for AI features now has a dedicated, authoritative data store, replacing fragmented tracking that existed previously.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://dev.traceable.digital/changelog/v0-99-1#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h3>
<ul>
<li class="">Resolved two third-party dependency security vulnerabilities affecting HTML sanitisation and server-side rendering edge cases. Both are now patched via updated dependencies.</li>
<li class="">Two lower-severity development-tooling alerts are tracked and monitored; they have no impact on production runtime.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-reliability">Platform reliability<a href="https://dev.traceable.digital/changelog/v0-99-1#platform-reliability" class="hash-link" aria-label="Direct link to Platform reliability" title="Direct link to Platform reliability" translate="no">​</a></h3>
<p>The health endpoint now handles gracefully the case where the rate-limiting layer is unavailable, returning a degraded-but-operational status rather than failing the check entirely.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="weekly-automated-invariants">Weekly automated invariants<a href="https://dev.traceable.digital/changelog/v0-99-1#weekly-automated-invariants" class="hash-link" aria-label="Direct link to Weekly automated invariants" title="Direct link to Weekly automated invariants" translate="no">​</a></h3>
<p>Automated weekly checks now verify that the production environment is in the expected state — no demo data in production, no forbidden environment variables configured, correct separation between staging and production credentials.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-items-tracked-for-upcoming-releases">Known items tracked for upcoming releases<a href="https://dev.traceable.digital/changelog/v0-99-1#known-items-tracked-for-upcoming-releases" class="hash-link" aria-label="Direct link to Known items tracked for upcoming releases" title="Direct link to Known items tracked for upcoming releases" translate="no">​</a></h2>
<ul>
<li class=""><strong>Rate limiting infrastructure</strong> — the current rate limiter is on the free tier of its cloud provider. Upgrading to a paid tier before high-volume production traffic is recommended.</li>
<li class="">Multi-factor authentication, account lockout, and GDPR deletion self-service UI are tracked for a future release and are not part of this version.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="platform" term="platform"/>
        <category label="security" term="security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Traceability — Bill of Materials P0 fixes]]></title>
        <id>https://dev.traceable.digital/changelog/traceability-p0-fixes</id>
        <link href="https://dev.traceable.digital/changelog/traceability-p0-fixes"/>
        <updated>2026-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Two critical bugs in the Bill of Materials traceability flow were identified and resolved. Both prevented operators from creating traceability records, and neither surfaced a clear error message — they failed silently with a generic error toast.]]></summary>
        <content type="html"><![CDATA[<p>Two critical bugs in the Bill of Materials traceability flow were identified and resolved. Both prevented operators from creating traceability records, and neither surfaced a clear error message — they failed silently with a generic error toast.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/traceability-p0-fixes#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bill-of-materials--records-were-silently-failing-to-save">Bill of Materials — records were silently failing to save<a href="https://dev.traceable.digital/changelog/traceability-p0-fixes#bill-of-materials--records-were-silently-failing-to-save" class="hash-link" aria-label="Direct link to Bill of Materials — records were silently failing to save" title="Direct link to Bill of Materials — records were silently failing to save" translate="no">​</a></h3>
<p>Adding a material to a product's bill of materials appeared to work but never actually persisted. The root cause was a misconfigured feature gate — the action was checking for a module name that didn't exist on any account, causing every attempt to be blocked before it reached the database. The gate has been corrected to the canonical module name across all traceability entry points.</p>
<p>Fixing this exposed a second issue: the traceability record creation was receiving the product's public URL identifier instead of its internal database identifier. These are intentionally different values (the URL identifier is human-readable; the database identifier is used for internal record linking). The page now supplies the correct identifier for each purpose. A regression test now covers both cases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="regression-tests-added">Regression tests added<a href="https://dev.traceable.digital/changelog/traceability-p0-fixes#regression-tests-added" class="hash-link" aria-label="Direct link to Regression tests added" title="Direct link to Regression tests added" translate="no">​</a></h3>
<p>Three automated regression tests now cover this flow: slug-based identifiers are correctly rejected, database identifiers are correctly accepted, and the supplier reference guard behaves as expected.</p>]]></content>
        <category label="fix" term="fix"/>
        <category label="traceability" term="traceability"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Document AI — hardening, bulk processing, and routing improvements]]></title>
        <id>https://dev.traceable.digital/changelog/document-ai-hardening</id>
        <link href="https://dev.traceable.digital/changelog/document-ai-hardening"/>
        <updated>2026-04-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A major Document AI update covering bulk batch processing, ten functional bug fixes, fifteen security hardening items, and improved document type routing — all validated by an expanded integration and unit test suite against real compliance document formats.]]></summary>
        <content type="html"><![CDATA[<p>A major Document AI update covering bulk batch processing, ten functional bug fixes, fifteen security hardening items, and improved document type routing — all validated by an expanded integration and unit test suite against real compliance document formats.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/document-ai-hardening#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bulk-document-processing">Bulk document processing<a href="https://dev.traceable.digital/changelog/document-ai-hardening#bulk-document-processing" class="hash-link" aria-label="Direct link to Bulk document processing" title="Direct link to Bulk document processing" translate="no">​</a></h3>
<p>Documents processed in bulk are now mirrored into the full document management system as first-class records. Each document processed via a bulk AI extraction job creates a proper document record and an associated verification task, with the AI extraction noted in the audit trail. The operation is idempotent — re-running a bulk job on previously processed documents does not create duplicates.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-document-integration-tests">Real-document integration tests<a href="https://dev.traceable.digital/changelog/document-ai-hardening#real-document-integration-tests" class="hash-link" aria-label="Direct link to Real-document integration tests" title="Direct link to Real-document integration tests" translate="no">​</a></h3>
<p>The integration test suite now covers the five compliance document formats most commonly uploaded by operators: UN 38.3 transport test reports, CE Declarations of Conformity, PEF/LCA lifecycle assessment studies, CMRT conflict minerals reports, and Safety Data Sheets. These tests run against the live Anthropic Claude API (not mocked) and are excluded from the default test run to keep CI free.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-platform-routes">New platform routes<a href="https://dev.traceable.digital/changelog/document-ai-hardening#new-platform-routes" class="hash-link" aria-label="Direct link to New platform routes" title="Direct link to New platform routes" translate="no">​</a></h3>
<ul>
<li class="">Authentication flow improvements including dedicated sign-out handling and login redirects</li>
<li class="">Supplier data request management view in the Company Portal</li>
<li class="">Dynamic <code>robots.txt</code> — staging disallows all crawlers; production allows full indexing with sitemap</li>
<li class="">Brand logo assets available in SVG format (standard and white variants)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/document-ai-hardening#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="document-ai--ten-functional-bug-fixes">Document AI — ten functional bug fixes<a href="https://dev.traceable.digital/changelog/document-ai-hardening#document-ai--ten-functional-bug-fixes" class="hash-link" aria-label="Direct link to Document AI — ten functional bug fixes" title="Direct link to Document AI — ten functional bug fixes" translate="no">​</a></h3>
<ul>
<li class=""><strong>Collision detection</strong> — documents of the same type are no longer overwritten when multiple are uploaded in the same session</li>
<li class=""><strong>Two-pass auto-detection</strong> — document type detection now runs a second pass when the first pass confidence is below threshold</li>
<li class=""><strong>Suffix-match confidence</strong> — partial filename matches are now scored proportionally, reducing false-positive type assignments</li>
<li class=""><strong>Low-confidence pre-selection guard</strong> — the AI no longer pre-selects a document type when confidence is below a safe threshold, prompting the operator to confirm</li>
<li class=""><strong>Field deduplication</strong> — duplicate field extractions from multi-page documents are now collapsed to a single canonical value</li>
<li class=""><strong>Completeness recalculation</strong> — DPP completeness scores are recalculated immediately after AI extraction rather than on next page load</li>
<li class=""><strong>Country parsing</strong> — null safety added to country field parsing; malformed values no longer cause extraction to abort</li>
<li class=""><strong>Category fallback</strong> — the document-to-category mapping now falls back gracefully when the detected category has no direct match</li>
<li class=""><strong>Confidence boundary handling</strong> — word-overlap confidence scores no longer produce values outside the 0–1 range</li>
<li class=""><strong>Field pre-selection</strong> — the UI no longer pre-selects extracted fields that fall below the minimum confidence threshold</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="document-type-routing--significantly-expanded">Document type routing — significantly expanded<a href="https://dev.traceable.digital/changelog/document-ai-hardening#document-type-routing--significantly-expanded" class="hash-link" aria-label="Direct link to Document type routing — significantly expanded" title="Direct link to Document type routing — significantly expanded" translate="no">​</a></h3>
<p>Document type detection now uses 30+ word-bounded pattern matchers covering all major compliance document formats in English, French, and German. This replaces the previous substring-based detection which was prone to false positives.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://dev.traceable.digital/changelog/document-ai-hardening#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<p>Fifteen hardening items applied to Document AI server actions:</p>
<ul>
<li class="">Authentication and active-company checks on every server action — unauthenticated calls are rejected before any processing begins</li>
<li class="">10 MB payload cap on base64-encoded document submissions</li>
<li class="">Rate limiter now fails closed — if the rate limiting layer is unavailable, the request is rejected rather than passed through</li>
<li class="">Template field allowlist — AI-extracted values can only populate a defined set of expected DPP fields, blocking mass-assignment</li>
<li class="">Explicit error capture sent to the error monitoring service on every catch path</li>
<li class="">Path traversal check on all file references</li>
<li class="">Batch state machine gating — bulk jobs can only transition through valid states in sequence</li>
<li class="">Memory-aware chunked download helper for large documents</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cookie-consent">Cookie consent<a href="https://dev.traceable.digital/changelog/document-ai-hardening#cookie-consent" class="hash-link" aria-label="Direct link to Cookie consent" title="Direct link to Cookie consent" translate="no">​</a></h3>
<p>Cookie consent state is now deferred until the component is mounted on the client, resolving a server-client hydration mismatch that caused the consent banner to flicker on navigation between pages.</p>]]></content>
        <category label="feature" term="feature"/>
        <category label="document-ai" term="document-ai"/>
        <category label="security" term="security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Compliance Audit Completion — EV, LMT & Industrial Batteries]]></title>
        <id>https://dev.traceable.digital/changelog/compliance-audit-march-2026</id>
        <link href="https://dev.traceable.digital/changelog/compliance-audit-march-2026"/>
        <updated>2026-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Internal compliance audit for EV, LMT, and Industrial battery DPP requirements completed, along with a combined GDPR and security audit covering data handling, access controls, and infrastructure. All critical and high-priority findings resolved prior to platform launch.]]></summary>
        <content type="html"><![CDATA[<p>Internal compliance audit for EV, LMT, and Industrial battery DPP requirements completed, along with a combined GDPR and security audit covering data handling, access controls, and infrastructure. All critical and high-priority findings resolved prior to platform launch.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compliance">Compliance<a href="https://dev.traceable.digital/changelog/compliance-audit-march-2026#compliance" class="hash-link" aria-label="Direct link to Compliance" title="Direct link to Compliance" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>EV battery DPP audit completed</strong> — Full field-level review of EV battery DPP requirements against EU Regulation 2023/1542. All mandatory fields for EV batteries (carbon footprint, recycled content, state of health, supply chain due diligence, electrochemical performance, safety certifications) verified as implemented and aligned with Annex XIII requirements.</p>
</li>
<li class="">
<p><strong>LMT battery DPP audit completed</strong> — Field-level review of Light Means of Transport battery DPP requirements. DPP form coverage confirmed for LMT-specific fields under the 2026 enforcement timeline.</p>
</li>
<li class="">
<p><strong>Industrial battery (Annex XIII) audit completed</strong> — Comprehensive audit of Industrial battery DPP data requirements against Annex XIII of EU Regulation 2023/1542. All ten data categories (identification, electrochemical performance, carbon footprint, recycled content, safety, supply chain due diligence, materials, end of life, composition, and conformity) verified as supported in the platform.</p>
</li>
<li class="">
<p><strong>Regulatory field mapping verified</strong> — All Traceable DPP fields mapped to their source articles in EU Regulation 2023/1542. Mapping documented in the compliance reference section of this documentation site.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security--gdpr">Security &amp; GDPR<a href="https://dev.traceable.digital/changelog/compliance-audit-march-2026#security--gdpr" class="hash-link" aria-label="Direct link to Security &amp; GDPR" title="Direct link to Security &amp; GDPR" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>GDPR audit completed</strong> — Data flow mapping, lawful basis documentation, and data subject rights tooling (Articles 15, 17, 20) reviewed and confirmed as implemented. Data Processing Agreement template finalised.</p>
</li>
<li class="">
<p><strong>Security audit completed</strong> — Infrastructure review covering data encryption at rest (AES-256) and in transit (TLS 1.3), authentication mechanisms, RBAC access controls, audit logging completeness, and rate limiting. All critical findings resolved.</p>
</li>
<li class="">
<p><strong>Sub-processor register finalised</strong> — Supabase (database, EU Ireland), Vercel (edge/hosting, EU Frankfurt), Resend (transactional email, EU), Sentry (error monitoring, EU), and Upstash (rate limiting, EU) confirmed as EU-resident. No data leaves EU infrastructure.</p>
</li>
<li class="">
<p><strong>Data retention policy implemented</strong> — Automated cron-based data cleanup aligned with documented retention windows. Account deletion triggers 30-day erasure workflow for all personal data associated with the account.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="infrastructure">Infrastructure<a href="https://dev.traceable.digital/changelog/compliance-audit-march-2026#infrastructure" class="hash-link" aria-label="Direct link to Infrastructure" title="Direct link to Infrastructure" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Rate limiting hardened</strong> — Per-IP limits on public endpoints and per-API-key limits on authenticated endpoints active at the edge via Upstash Redis.</p>
</li>
<li class="">
<p><strong>Audit trail completeness verified</strong> — All create, update, delete, publish, and PoLI access events confirmed as captured with timestamp, actor identity, and resource reference.</p>
</li>
</ul>]]></content>
        <category label="compliance" term="compliance"/>
        <category label="audit" term="audit"/>
        <category label="ev" term="ev"/>
        <category label="lmt" term="lmt"/>
        <category label="industrial" term="industrial"/>
        <category label="gdpr" term="gdpr"/>
        <category label="security" term="security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Security & dependency maintenance]]></title>
        <id>https://dev.traceable.digital/changelog/security-maintenance-march-2026</id>
        <link href="https://dev.traceable.digital/changelog/security-maintenance-march-2026"/>
        <updated>2026-03-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dependency security audit completed, vulnerabilities resolved, and a platform-wide AI kill switch added for operational resilience.]]></summary>
        <content type="html"><![CDATA[<p>Dependency security audit completed, vulnerabilities resolved, and a platform-wide AI kill switch added for operational resilience.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://dev.traceable.digital/changelog/security-maintenance-march-2026#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Dependency security</strong>: upgraded PDF generation library and its peer dependencies, resolving one critical and four high severity vulnerabilities. Additional transitive dependency vulnerabilities resolved via automated audit tooling. Vulnerability count reduced from 42 to 4 — all remaining are in transitive dependencies where upstream maintainers have not yet shipped fixes.</p>
</li>
<li class="">
<p><strong>Runtime audit clean</strong>: <code>npm audit --omit=dev</code> now returns zero vulnerabilities in production runtime dependencies.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/security-maintenance-march-2026#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-wide-ai-kill-switch">Platform-wide AI kill switch<a href="https://dev.traceable.digital/changelog/security-maintenance-march-2026#platform-wide-ai-kill-switch" class="hash-link" aria-label="Direct link to Platform-wide AI kill switch" title="Direct link to Platform-wide AI kill switch" translate="no">​</a></h3>
<p>A central AI enable/disable switch now controls all AI features across the platform simultaneously. When disabled, all 21 AI-powered features deactivate cleanly without errors — useful for operational incidents, cost control, or compliance holds. The switch is controlled via an environment variable and takes effect without a deployment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/security-maintenance-march-2026#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class=""><strong>Compliance score</strong> — the DPP completeness score now correctly defaults to 0% when no mandatory compliance rules apply, rather than showing 100% when no certificates have been uploaded.</li>
<li class=""><strong>Brand name auto-fill</strong> — the product wizard no longer auto-fills the brand name field with the company's legal name. Legal entity suffixes (GmbH, Ltd, S.A. etc.) were being inherited into product-level brand fields, requiring manual correction on every new product.</li>
</ul>]]></content>
        <category label="security" term="security"/>
        <category label="dependencies" term="dependencies"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Battery QA — LMT, GS1 Digital Link, and form improvements]]></title>
        <id>https://dev.traceable.digital/changelog/battery-qa-fixes-march-2026</id>
        <link href="https://dev.traceable.digital/changelog/battery-qa-fixes-march-2026"/>
        <updated>2026-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Quality assurance pass covering LMT battery template accuracy, GS1 Digital Link persistence, PDF export reliability, and form validation improvements across all five battery categories.]]></summary>
        <content type="html"><![CDATA[<p>Quality assurance pass covering LMT battery template accuracy, GS1 Digital Link persistence, PDF export reliability, and form validation improvements across all five battery categories.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/battery-qa-fixes-march-2026#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Searchable dropdown for large field lists</strong> — select fields with more than fifteen options now render as searchable comboboxes. Operators can type to filter rather than scrolling through long lists. Particularly useful for country selection and material category fields.</p>
</li>
<li class="">
<p><strong>ISO 3166-1 country coverage</strong> — all country fields across battery templates now offer the full list of 195 countries via the new searchable dropdown. Previously, some fields offered only EU member states or free-text input.</p>
</li>
<li class="">
<p><strong>Schema drift detection in CI</strong> — the continuous integration pipeline now blocks pull requests that modify the database schema without including a corresponding migration file. This prevents schema drift between the codebase and the database.</p>
</li>
<li class="">
<p><strong>GTIN-14 validation</strong> — product GTIN fields now enforce exactly 14 digits and check for uniqueness across the platform. Duplicate GTIN submission is rejected with a clear error.</p>
</li>
<li class="">
<p><strong>Product edit status guard</strong> — products with a status of Approved or Deprecated can no longer be edited. Editing an approved DPP requires creating a new version, in line with Article 77 of the EU Battery Regulation.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/battery-qa-fixes-march-2026#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>GS1 Digital Link not persisting</strong> — the GS1 Digital Link URI (the QR code URL in <code>/01/{GTIN}/21/{serial}</code> format) was being generated correctly but was not being saved to the product record. Operators who subsequently regenerated a QR code would get a correctly formatted URL, but the stored value was never written. Now fixed — the URI is written to the product record at generation time.</p>
</li>
<li class="">
<p><strong>PDF export crash</strong> — the DPP PDF export was throwing a runtime error for products with certain field configurations. Root cause was an assumption that a specific field would always be an array — adding an array guard resolves the crash for all configurations.</p>
</li>
<li class="">
<p><strong>Negative numbers in numeric fields</strong> — numeric DPP fields (capacity, cycle life, efficiency, etc.) were accepting negative values that are not physically meaningful. All numeric fields now enforce a minimum of zero by default, with specific field minimums applied where regulation requires.</p>
</li>
<li class="">
<p><strong>Form validation not enforcing field rules</strong> — the DPP wizard schema validation was not applying field-level validation rules (pattern matching, minimum, maximum) defined in the template configuration. Field constraints are now correctly enforced on form submission.</p>
</li>
<li class="">
<p><strong>Document status defaulting to Verified</strong> — newly uploaded documents were being tagged with a status of "Verified" rather than "Pending". Documents now correctly enter a Pending state and require explicit verification before being marked as verified.</p>
</li>
<li class="">
<p><strong>500 errors on DPP pages</strong> — a missing database column introduced in a prior update was causing server errors on all DPP detail pages in the staging environment. The migration applying the column is now included correctly.</p>
</li>
<li class="">
<p><strong>Country fields standardised</strong> — eight free-text country fields across all five battery category templates have been converted to ISO 3166-1 select dropdowns. This ensures country values in published DPPs are machine-readable and consistently formatted.</p>
</li>
</ul>]]></content>
        <category label="fix" term="fix"/>
        <category label="batteries" term="batteries"/>
        <category label="lmt" term="lmt"/>
        <category label="gs1" term="gs1"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Compliance wizard — ESPR gate, EV fields, and UX improvements]]></title>
        <id>https://dev.traceable.digital/changelog/compliance-wizard-march-2026</id>
        <link href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026"/>
        <updated>2026-03-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A broad set of improvements to the DPP creation wizard covering ESPR compliance gating, eight new EV battery fields, a redesigned step order, and a range of UX improvements including date pickers, country dropdowns, and company profile auto-fill.]]></summary>
        <content type="html"><![CDATA[<p>A broad set of improvements to the DPP creation wizard covering ESPR compliance gating, eight new EV battery fields, a redesigned step order, and a range of UX improvements including date pickers, country dropdowns, and company profile auto-fill.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="espr-compliance-gate">ESPR compliance gate<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#espr-compliance-gate" class="hash-link" aria-label="Direct link to ESPR compliance gate" title="Direct link to ESPR compliance gate" translate="no">​</a></h3>
<p>DPP submission now includes a binary ESPR approval gate as the final step before publishing. The gate evaluates all mandatory ESPR fields and blocks publication if any are missing or incomplete — replacing the previous percentage-based completeness check. ESPR-mandated fields are marked inline with a help link to the relevant regulatory requirement.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-ev-battery-fields">New EV battery fields<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#new-ev-battery-fields" class="hash-link" aria-label="Direct link to New EV battery fields" title="Direct link to New EV battery fields" translate="no">​</a></h3>
<p>Eight additional fields added to the EV battery DPP template: rated voltage (minimum, maximum, nominal), manufacturer phone number, product model identifier, and three compliance declaration fields. These fields align with the full field set required under EU Regulation 2023/1542 for electric vehicle batteries.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dpp-wizard-redesign--11-compliance-ordered-steps">DPP wizard redesign — 11 compliance-ordered steps<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#dpp-wizard-redesign--11-compliance-ordered-steps" class="hash-link" aria-label="Direct link to DPP wizard redesign — 11 compliance-ordered steps" title="Direct link to DPP wizard redesign — 11 compliance-ordered steps" translate="no">​</a></h3>
<p>The DPP creation wizard has been reorganised into eleven steps ordered to match the regulatory compliance workflow — identity and classification first, technical performance mid, supply chain and compliance last. A template preview is now shown on the opening step so operators can see the full field scope before beginning.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="date-picker-with-year-and-month-navigation">Date picker with year and month navigation<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#date-picker-with-year-and-month-navigation" class="hash-link" aria-label="Direct link to Date picker with year and month navigation" title="Direct link to Date picker with year and month navigation" translate="no">​</a></h3>
<p>Date fields across all DPP templates now use a calendar picker with year and month dropdown navigation, making it practical to select historical dates (certificate issue dates, audit dates, manufacture dates) without clicking through months one at a time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="eu-country-dropdowns">EU country dropdowns<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#eu-country-dropdowns" class="hash-link" aria-label="Direct link to EU country dropdowns" title="Direct link to EU country dropdowns" translate="no">​</a></h3>
<p>Country fields that are restricted to EU member states now use a 27-country dropdown rather than a free-text field. This ensures published DPPs contain correctly formatted, machine-readable country values.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="company-profile-auto-fill">Company profile auto-fill<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#company-profile-auto-fill" class="hash-link" aria-label="Direct link to Company profile auto-fill" title="Direct link to Company profile auto-fill" translate="no">​</a></h3>
<p>The DPP wizard now pre-fills manufacturer and operator contact fields from the company profile, reducing repetitive data entry for operators managing multiple products.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dpp-id-collision-prevention">DPP ID collision prevention<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#dpp-id-collision-prevention" class="hash-link" aria-label="Direct link to DPP ID collision prevention" title="Direct link to DPP ID collision prevention" translate="no">​</a></h3>
<p>Product identifiers now include a random offset component when auto-generated, preventing collisions between products created close together in time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="storage-access-controls">Storage access controls<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#storage-access-controls" class="hash-link" aria-label="Direct link to Storage access controls" title="Direct link to Storage access controls" translate="no">​</a></h3>
<p>Draft and submitted DPPs are no longer accessible via direct storage URLs. Only published DPPs are publicly readable; in-progress records require an authenticated session.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="signed-url-validation">Signed URL validation<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#signed-url-validation" class="hash-link" aria-label="Direct link to Signed URL validation" title="Direct link to Signed URL validation" translate="no">​</a></h3>
<p>The public DPP viewer now validates that file references use correctly signed URLs before rendering, preventing broken asset references in published passports.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="email-template-redesign">Email template redesign<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#email-template-redesign" class="hash-link" aria-label="Direct link to Email template redesign" title="Direct link to Email template redesign" translate="no">​</a></h3>
<p>Transactional emails (invitations, OTP, data request notifications) have been redesigned with a gradient header and improved layout, aligned with the Traceable brand.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed">Changed<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#changed" class="hash-link" aria-label="Direct link to Changed" title="Direct link to Changed" translate="no">​</a></h2>
<ul>
<li class="">Non-ESPR mandatory fields have been reclassified from hard-required to soft-required, allowing operators to publish a DPP that satisfies ESPR requirements even if non-ESPR fields are incomplete. The completeness score reflects the total fill rate.</li>
<li class="">Auto-save no longer resets the form after each save. Previously, auto-save was calling form reset, which caused data entered between saves to be lost in some edge cases.</li>
<li class="">The wizard Next button advances immediately; saving happens in the background and does not block navigation.</li>
<li class="">Optional array fields (lists of hazardous substances, certifications, etc.) are now collapsed by default, reducing visual clutter for operators who don't need them.</li>
<li class="">File upload fields are treated as soft-required — the ESPR gate evaluates them, but the wizard does not block step-by-step navigation if a file hasn't been uploaded yet.</li>
<li class="">Carbon footprint values are now expressed as kg CO₂e (a number) rather than as a percentage, matching the unit specified in the EU Battery Regulation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/compliance-wizard-march-2026#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class="">Auto-save data loss — form reset after save was causing in-flight field values to be discarded.</li>
<li class="">Circular dependency in form watch causing a stack overflow on certain field configurations.</li>
<li class="">Login redirect stuck state — the post-login redirect now correctly resolves in all session states.</li>
<li class="">Select field TypeError on Radix UI during account signup resolved.</li>
<li class="">CSV template generation error now surfaces clearly rather than failing silently.</li>
</ul>]]></content>
        <category label="feature" term="feature"/>
        <category label="compliance" term="compliance"/>
        <category label="ux" term="ux"/>
        <category label="ev" term="ev"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.6.0 — Production hardening]]></title>
        <id>https://dev.traceable.digital/changelog/v0-6-0</id>
        <link href="https://dev.traceable.digital/changelog/v0-6-0"/>
        <updated>2026-03-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Production hardening release focused on authentication security, supplier data isolation, and a range of critical bug fixes surfaced during pre-launch testing.]]></summary>
        <content type="html"><![CDATA[<p>Production hardening release focused on authentication security, supplier data isolation, and a range of critical bug fixes surfaced during pre-launch testing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-6-0#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>OTP enforcement for all users</strong> — one-time password verification is now mandatory on every login, with no bypass paths available in production. Previously, OTP could be skipped under certain session conditions.</p>
</li>
<li class="">
<p><strong>Forgot password flow</strong> — operators, suppliers, and verifiers can now reset their password via a secure email link without requiring support intervention.</p>
</li>
<li class="">
<p><strong>Supplier data isolation</strong> — supplier data queries are now scoped strictly to the supplier's own company. A supplier cannot access or infer the existence of materials, certificates, or responses belonging to a different supplier company.</p>
</li>
<li class="">
<p><strong>URL protocol validation</strong> — all URL fields in DPP forms now validate that the protocol is <code>https://</code> or <code>http://</code>. Protocols such as <code>javascript:</code>, <code>data:</code>, and <code>file://</code> are rejected, preventing stored XSS via URL fields.</p>
</li>
<li class="">
<p><strong>Industry classification</strong> — the signup flow now includes a dynamic industry dropdown populated from the platform's category database, enabling accurate company classification at registration.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/v0-6-0#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class=""><strong>Login error handling</strong> — authentication errors now return structured error objects to the UI. Previously, some error paths were throwing exceptions that propagated as unhandled server errors rather than user-facing messages.</li>
<li class=""><strong>File upload URL fields</strong> — file upload fields in the DPP wizard now accept the storage path format returned by the upload API, resolving a type mismatch that prevented documents from being linked correctly.</li>
<li class=""><strong>Date field parsing</strong> — ISO 8601 date strings returned by the API are now correctly parsed into the calendar component's native date format, resolving a mismatch that caused previously saved dates to render as empty.</li>
<li class=""><strong>DPP page 500 error</strong> — metadata generation for the DPP public viewer now handles database connectivity issues gracefully instead of returning a server error page.</li>
<li class=""><strong>OTP length</strong> — one-time passwords are now six digits (down from eight), matching the standard length expected by authenticator apps and familiar to users.</li>
<li class=""><strong>Sidebar mobile flash</strong> — the mobile navigation state now initialises correctly on page load, preventing a flash of the desktop sidebar layout on mobile devices.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="security" term="security"/>
        <category label="platform" term="platform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.5.0 — Reliability, offline detection, and CI]]></title>
        <id>https://dev.traceable.digital/changelog/v0-5-0</id>
        <link href="https://dev.traceable.digital/changelog/v0-5-0"/>
        <updated>2026-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Reliability improvements including database connection hardening, offline state detection, a feedback widget, code quality tooling, and a QR code retry mechanism.]]></summary>
        <content type="html"><![CDATA[<p>Reliability improvements including database connection hardening, offline state detection, a feedback widget, code quality tooling, and a QR code retry mechanism.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-5-0#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Offline detection banner</strong> — when a user's internet connection drops, a banner appears immediately across all portal pages. The banner clears automatically when connectivity is restored, without requiring a page refresh.</p>
</li>
<li class="">
<p><strong>In-app feedback widget</strong> — operators, suppliers, and verifiers can submit feedback directly from any page in the platform. Feedback is routed to the Traceable team without leaving the portal.</p>
</li>
<li class="">
<p><strong>Pre-commit code quality hooks</strong> — automated checks now run on every commit before it is accepted, enforcing code formatting and lint rules. This keeps the codebase consistent and catches common issues before they reach CI.</p>
</li>
<li class="">
<p><strong>Scheduled cron jobs</strong> — three automated background jobs are now active: certificate expiry monitoring (notifies operators when supplier certificates are approaching their expiry date), trial expiry management, and data retention cleanup.</p>
</li>
<li class="">
<p><strong>Draft backup</strong> — the DPP creation wizard now saves a local backup of in-progress form data. If a session expires or the browser is closed unexpectedly, the draft is restored on next visit.</p>
</li>
<li class="">
<p><strong>QR code retry</strong> — if QR code generation fails (for example due to a transient network error), a retry button is shown inline without requiring the operator to navigate away.</p>
</li>
<li class="">
<p><strong>Open Graph metadata on DPP pages</strong> — published DPP pages now include Open Graph tags, so sharing a DPP URL in messaging apps, social platforms, or link previews renders the product name and description correctly.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed">Changed<a href="https://dev.traceable.digital/changelog/v0-5-0#changed" class="hash-link" aria-label="Direct link to Changed" title="Direct link to Changed" translate="no">​</a></h2>
<ul>
<li class="">The CI pipeline now runs lint, build, and unit tests only. Database migration deployment is handled separately as part of the release process, not as an automatic CI step.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="platform" term="platform"/>
        <category label="reliability" term="reliability"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.4.0 — Pre go-live QA]]></title>
        <id>https://dev.traceable.digital/changelog/v0-4-0</id>
        <link href="https://dev.traceable.digital/changelog/v0-4-0"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Pre go-live QA release incorporating unsaved changes protection, session management, AI model resilience, trial management, and significant performance improvements — server bundle size reduced by 63%.]]></summary>
        <content type="html"><![CDATA[<p>Pre go-live QA release incorporating unsaved changes protection, session management, AI model resilience, trial management, and significant performance improvements — server bundle size reduced by 63%.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-4-0#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Unsaved changes protection</strong> — navigating away from the DPP wizard while there are unsaved changes now triggers a confirmation dialog. Accidental navigation no longer discards work in progress.</p>
</li>
<li class="">
<p><strong>Session timeout warning</strong> — a five-minute countdown warning appears before an idle session expires. Operators can extend their session with a single click, avoiding the frustration of losing form state after a period of inactivity.</p>
</li>
<li class="">
<p><strong>Product search URL sync</strong> — the product list search query is now synchronised to the URL as a <code>?search=</code> parameter. Search results are bookmarkable and survive page refreshes.</p>
</li>
<li class="">
<p><strong>Print styles for DPP viewer</strong> — published DPP pages now include print-optimised styles. Printing or saving as PDF from the browser produces a clean, structured document suitable for regulatory submissions.</p>
</li>
<li class="">
<p><strong>Portal 404 page</strong> — the Company Portal now shows a purpose-built 404 page for unrecognised routes, with links back to the main sections of the portal.</p>
</li>
<li class="">
<p><strong>AI model fallback with validation</strong> — if the primary AI model returns a response that fails schema validation, the platform automatically falls back to a validated safe response rather than surfacing an error to the operator.</p>
</li>
<li class="">
<p><strong>AI usage analytics</strong> — platform administrators can now view a breakdown of AI feature usage by operator and document type, supporting cost monitoring and capacity planning.</p>
</li>
<li class="">
<p><strong>Trial management</strong> — trial account expiry is handled automatically: a drip email sequence starts three days before expiry, and a cron job handles account state transitions at the expiry moment.</p>
</li>
<li class="">
<p><strong>Last-admin protection</strong> — team management now prevents the last administrator on an account from being demoted or removed, preventing accounts from becoming permanently inaccessible.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed">Changed<a href="https://dev.traceable.digital/changelog/v0-4-0#changed" class="hash-link" aria-label="Direct link to Changed" title="Direct link to Changed" translate="no">​</a></h2>
<ul>
<li class=""><strong>Bulk product import</strong> — CSV import now uses a batched strategy with automatic fallback to individual record creation when batch insert fails, improving reliability on large import files.</li>
<li class=""><strong>Deep merge on product updates</strong> — updating a product via the API or wizard now deep-merges the incoming data with the existing record, preventing partial updates from wiping fields that weren't included in the update payload.</li>
<li class=""><strong>Wizard refactored into modules</strong> — the DPP wizard has been split into distinct modules for auto-save, AI extraction, and array field handling. This makes the wizard easier to maintain and extends cleanly to new battery categories.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance">Performance<a href="https://dev.traceable.digital/changelog/v0-4-0#performance" class="hash-link" aria-label="Direct link to Performance" title="Direct link to Performance" translate="no">​</a></h2>
<ul>
<li class=""><strong>Server bundle reduced 63%</strong> — server-side asset size reduced from 41 MB to 15 MB, significantly improving cold-start performance and reducing memory usage on edge function deployments.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="platform" term="platform"/>
        <category label="ux" term="ux"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.3.1 — 52 QA findings resolved]]></title>
        <id>https://dev.traceable.digital/changelog/v0-3-1</id>
        <link href="https://dev.traceable.digital/changelog/v0-3-1"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[52 findings from the first formal QA test round resolved. Covers connection pool exhaustion, signed URL reliability, GDPR deletion visibility, a Tier 1 Verified badge on the DPP viewer, and supplier security improvements.]]></summary>
        <content type="html"><![CDATA[<p>52 findings from the first formal QA test round resolved. Covers connection pool exhaustion, signed URL reliability, GDPR deletion visibility, a Tier 1 Verified badge on the DPP viewer, and supplier security improvements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/v0-3-1#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Database connection pool exhaustion</strong> — dashboard queries were running in parallel and overwhelming the connection pool under moderate load. Queries are now serialised where appropriate, and connection handling has been tightened. Dashboard load time and reliability improved significantly.</p>
</li>
<li class="">
<p><strong>Signed URL expiry</strong> — file download links embedded in DPPs and document views now remain valid for two hours (up from a shorter window that was causing link expiry for operators who kept a tab open).</p>
</li>
<li class="">
<p><strong>Signup error messages</strong> — generic error messages on the signup flow have been replaced with specific, actionable messages. Email enumeration is protected — the message for "email already registered" does not confirm whether the address exists.</p>
</li>
<li class="">
<p><strong>GDPR deletion audit trail</strong> — when an operator requests account deletion under Article 17, a system alert is now created for platform administrators. This ensures deletion requests are visible in the admin interface and can be tracked to completion within the 30-day SLA.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-3-1#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Tier 1 Verified badge</strong> — published DPP pages now display a "Tier 1 Verified" badge when the DPP has passed independent third-party verification. The badge is linked to the verifier's decision record.</p>
</li>
<li class="">
<p><strong>Supplier security tab</strong> — the supplier detail view in the Company Portal now includes a security tab showing the supplier's authentication status, last login, and active session count.</p>
</li>
<li class="">
<p><strong>System health metrics</strong> — the platform health dashboard now includes CPU usage, memory consumption, and uptime metrics, in addition to error counts.</p>
</li>
<li class="">
<p><strong>Clear error logs</strong> — platform administrators can now clear resolved error log entries, keeping the error log focused on active issues.</p>
</li>
<li class="">
<p><strong>Test suite expanded</strong> — automated test coverage increased substantially across authentication, GDPR, and DPP rendering flows.</p>
</li>
</ul>]]></content>
        <category label="fix" term="fix"/>
        <category label="platform" term="platform"/>
        <category label="gdpr" term="gdpr"/>
        <category label="performance" term="performance"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.3.0 — Security audit and dashboard improvements]]></title>
        <id>https://dev.traceable.digital/changelog/v0-3-0</id>
        <link href="https://dev.traceable.digital/changelog/v0-3-0"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A comprehensive 23-issue codebase security audit completed, with all findings remediated. Dashboard improved with error trend visualisation, tooltips added across all four portals, and a threshold-based alerting system introduced.]]></summary>
        <content type="html"><![CDATA[<p>A comprehensive 23-issue codebase security audit completed, with all findings remediated. Dashboard improved with error trend visualisation, tooltips added across all four portals, and a threshold-based alerting system introduced.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://dev.traceable.digital/changelog/v0-3-0#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<p>A formal security audit identified 23 issues across the codebase. All findings have been resolved:</p>
<ul>
<li class=""><strong>Hardcoded secrets removed</strong> — API keys and tokens that had been committed to the codebase replaced with environment variable references.</li>
<li class=""><strong>Cryptographic randomness</strong> — uses of <code>Math.random()</code> for security-sensitive operations replaced with <code>crypto.getRandomValues()</code>, the cryptographically secure browser API.</li>
<li class=""><strong>SVG sanitisation</strong> — user-uploaded SVG files are now sanitised before rendering to prevent XSS via SVG content.</li>
<li class=""><strong>Text sanitisation</strong> — user-supplied text rendered in the UI is sanitised to prevent cross-site scripting across all portal surfaces.</li>
<li class=""><strong>Environment validation</strong> — required environment variables are validated at startup. The application refuses to start if a required variable is missing or malformed, surfacing misconfiguration before it causes a runtime error.</li>
<li class=""><strong>Type safety</strong> — unsafe type assertions replaced with proper type guards throughout.</li>
<li class=""><strong>No localhost fallbacks in production</strong> — hardcoded <code>localhost</code> fallback URLs in environment detection removed. Production configuration is explicit.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-3-0#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Error trend sparkline</strong> — the dashboard now shows a seven-day error trend sparkline alongside the error count metric. Operators and administrators can see at a glance whether errors are rising, falling, or stable.</p>
</li>
<li class="">
<p><strong>Error severity classification</strong> — errors captured by the platform are classified as critical, high, medium, or low severity based on their type and source. High and critical errors trigger email alerts.</p>
</li>
<li class="">
<p><strong>Threshold-based alerting</strong> — operators can configure alert thresholds on key metrics (error rates, certificate expiry proximity, supplier response rates). Alerts are delivered via the platform notification system and email.</p>
</li>
<li class="">
<p><strong>Row-level security expanded</strong> — database-level access controls applied to seven additional tables, ensuring that cross-company data access is blocked at the database layer.</p>
</li>
<li class="">
<p><strong>Tooltips across all portals</strong> — over 100 contextual help tooltips added across the Company, Supplier, Verifier, and public portals. Tooltips explain field requirements, regulatory references, and workflow steps in plain language.</p>
</li>
<li class="">
<p><strong>Cron-based alert evaluation</strong> — the alerting system evaluates thresholds on a scheduled basis and creates alert records automatically when a threshold is breached.</p>
</li>
<li class="">
<p><strong>Coming Soon pages</strong> — features planned for future releases (Phase 2) now show informative Coming Soon pages with regulatory context explaining why the feature is planned, rather than blank routes.</p>
</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="security" term="security"/>
        <category label="platform" term="platform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.2.0 — PoLI access, alerting, and major feature additions]]></title>
        <id>https://dev.traceable.digital/changelog/v0-2-0</id>
        <link href="https://dev.traceable.digital/changelog/v0-2-0"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Major feature release introducing the PoLI authority access system, a threshold-based alerting system, bulk QR code generation, AI-powered sustainability insights, a database-driven email template engine, and several platform-wide improvements.]]></summary>
        <content type="html"><![CDATA[<p>Major feature release introducing the PoLI authority access system, a threshold-based alerting system, bulk QR code generation, AI-powered sustainability insights, a database-driven email template engine, and several platform-wide improvements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-2-0#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="poli--person-of-legal-interest-access-system">PoLI — Person of Legal Interest access system<a href="https://dev.traceable.digital/changelog/v0-2-0#poli--person-of-legal-interest-access-system" class="hash-link" aria-label="Direct link to PoLI — Person of Legal Interest access system" title="Direct link to PoLI — Person of Legal Interest access system" translate="no">​</a></h3>
<p>Market surveillance authorities, customs bodies, and other entities with a legal right to access restricted DPP data under EU Battery Regulation 2023/1542 can now submit a formal access request through the platform. The flow:</p>
<ol>
<li class="">The authority submits a request identifying themselves and the product(s) they require access to.</li>
<li class="">The platform sends an email verification to confirm the request.</li>
<li class="">A platform administrator reviews and approves the request.</li>
<li class="">On approval, the authority receives a time-limited access token that unlocks the restricted fields in the DPP API response.</li>
</ol>
<p>All requests, approvals, and accesses are logged in the audit trail. See the <a class="" href="https://dev.traceable.digital/docs/developer-guide/api-reference/poli-endpoints">PoLI endpoints documentation</a> for the API reference.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="threshold-based-alerting">Threshold-based alerting<a href="https://dev.traceable.digital/changelog/v0-2-0#threshold-based-alerting" class="hash-link" aria-label="Direct link to Threshold-based alerting" title="Direct link to Threshold-based alerting" translate="no">​</a></h3>
<p>Operators and administrators can define numeric thresholds on key operational metrics. When a threshold is breached, the platform creates an alert record and routes it through the notification and email system. Alerts support acknowledge and resolve workflows so the full lifecycle of an issue is captured.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bulk-qr-code-generation">Bulk QR code generation<a href="https://dev.traceable.digital/changelog/v0-2-0#bulk-qr-code-generation" class="hash-link" aria-label="Direct link to Bulk QR code generation" title="Direct link to Bulk QR code generation" translate="no">​</a></h3>
<p>Operators with multiple products can now generate all QR codes in a single operation from the product list view. Previously, QR codes had to be generated product by product.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supplier-csv-export">Supplier CSV export<a href="https://dev.traceable.digital/changelog/v0-2-0#supplier-csv-export" class="hash-link" aria-label="Direct link to Supplier CSV export" title="Direct link to Supplier CSV export" translate="no">​</a></h3>
<p>The supplier list in the Company Portal can now be exported as a CSV file, including supplier name, contact details, linked materials, response rate, and last activity date.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-sustainability-insights">AI sustainability insights<a href="https://dev.traceable.digital/changelog/v0-2-0#ai-sustainability-insights" class="hash-link" aria-label="Direct link to AI sustainability insights" title="Direct link to AI sustainability insights" translate="no">​</a></h3>
<p>An AI-powered sustainability insights panel is available on the DPP overview. The panel analyses the product's carbon footprint, recycled content, and supply chain data to surface actionable observations and benchmarks. Powered by Anthropic Claude.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="email-template-engine">Email template engine<a href="https://dev.traceable.digital/changelog/v0-2-0#email-template-engine" class="hash-link" aria-label="Direct link to Email template engine" title="Direct link to Email template engine" translate="no">​</a></h3>
<p>Transactional emails are now driven by a database-backed template system. Platform administrators can manage email content, subject lines, and sender details through the admin interface without a code deployment. Fifteen event-based triggers are wired to the template engine covering invitation, verification, notification, and alert scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="email-graceful-degradation">Email graceful degradation<a href="https://dev.traceable.digital/changelog/v0-2-0#email-graceful-degradation" class="hash-link" aria-label="Direct link to Email graceful degradation" title="Direct link to Email graceful degradation" translate="no">​</a></h3>
<p>The platform handles email delivery failures gracefully. If the email service is unavailable, the triggering action (signup, OTP, data request) still succeeds and the email is logged for retry rather than causing the user-facing action to fail.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="communications-hub">Communications hub<a href="https://dev.traceable.digital/changelog/v0-2-0#communications-hub" class="hash-link" aria-label="Direct link to Communications hub" title="Direct link to Communications hub" translate="no">​</a></h3>
<p>Platform administrators can send broadcast notifications to all operators, all suppliers, or a specific company. Useful for planned maintenance announcements, regulatory updates, and release notifications.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/v0-2-0#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class=""><strong>Duplicate OTP emails</strong> — an OTP request under certain conditions was triggering three email sends instead of one. Duplicate suppression now prevents multiple deliveries for the same OTP event.</li>
<li class=""><strong>Circular dependency in database schema</strong> — a circular foreign key dependency between category and template models resolved by making the relevant references nullable.</li>
<li class=""><strong>Admin error display</strong> — inline error messages in admin CRUD forms now display correctly. Previously they were overridden by generic toast notifications that obscured the specific error.</li>
<li class=""><strong>Cross-request caching</strong> — unstable request-level caching that caused stale data to appear between page navigations has been replaced with a correct cache invalidation strategy.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="feature" term="feature"/>
        <category label="poli" term="poli"/>
        <category label="platform" term="platform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.1.2 — GS1 Digital Link, audit logging, and portal hardening]]></title>
        <id>https://dev.traceable.digital/changelog/v0-1-2</id>
        <link href="https://dev.traceable.digital/changelog/v0-1-2"/>
        <updated>2026-03-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[GS1 Digital Link resolver, shared DPP renderer, cross-portal notifications, comprehensive audit logging gap closure, and a full sweep of unwired CRUD handlers.]]></summary>
        <content type="html"><![CDATA[<p>GS1 Digital Link resolver, shared DPP renderer, cross-portal notifications, comprehensive audit logging gap closure, and a full sweep of unwired CRUD handlers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-1-2#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>GS1 Digital Link resolver</strong> — the platform now exposes a GS1 Digital Link endpoint at <code>/01/{GTIN}</code> (and <code>/01/{GTIN}/21/{serial}</code>) implementing ISO/IEC 18975. QR codes encoded with a GTIN-based GS1 Digital Link URI resolve directly to the DPP viewer. This is the required QR code format under EU Battery Regulation 2023/1542 Article 77 for products with a GTIN assigned.</p>
</li>
<li class="">
<p><strong>Shared DPP renderer</strong> — the DPP viewer is now a single shared rendering component used by both the GS1 Digital Link resolver and the slug-based DPP URL. Both access methods display an identical, consistent DPP presentation.</p>
</li>
<li class="">
<p><strong>Cross-portal notifications</strong> — notifications created in the Company Portal (data request sent, verification task assigned) are now delivered to the appropriate Supplier and Verifier portal users in real time.</p>
</li>
<li class="">
<p><strong>Verifier task scoping</strong> — verifiers now see only the verification tasks assigned to them. Previously the task list was not correctly filtered, allowing verifiers to see tasks across all operators.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://dev.traceable.digital/changelog/v0-1-2#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class=""><strong>13 audit logging gaps</strong> — thirteen event types that were not being written to the audit trail have been added. The audit trail now captures all create, update, delete, publish, and access events across all three portals.</li>
<li class=""><strong>8 unwired CRUD handlers</strong> — eight data management actions that had UI controls but no backend implementation have been connected to the database.</li>
<li class=""><strong>9 dead code files removed</strong> — unused code files removed from the codebase to reduce maintenance surface.</li>
<li class=""><strong>Category code validation</strong> — product category codes are now validated against the allowed set at the API layer, preventing invalid categories from being persisted.</li>
<li class=""><strong>DPP slug resolution</strong> — slug lookup is now case-insensitive and supports prefix matching, so QR codes that encode the slug in different cases still resolve correctly.</li>
<li class=""><strong>100+ client components audited</strong> — a sweep of all client components verified that authentication, company scoping, and data isolation are correctly applied.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="api" term="api"/>
        <category label="gs1" term="gs1"/>
        <category label="platform" term="platform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.1.1 — Traceable rebrand and domain migration]]></title>
        <id>https://dev.traceable.digital/changelog/v0-1-1</id>
        <link href="https://dev.traceable.digital/changelog/v0-1-1"/>
        <updated>2026-03-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Platform rebranded to Traceable and migrated to the traceable.digital domain family. All identifiers, schemas, and URLs updated across the full codebase.]]></summary>
        <content type="html"><![CDATA[<p>Platform rebranded to Traceable and migrated to the <code>traceable.digital</code> domain family. All identifiers, schemas, and URLs updated across the full codebase.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed">Changed<a href="https://dev.traceable.digital/changelog/v0-1-1#changed" class="hash-link" aria-label="Direct link to Changed" title="Direct link to Changed" translate="no">​</a></h2>
<ul>
<li class="">The platform has been rebranded as <strong>Traceable</strong> across all surfaces — portal UIs, emails, API responses, QR code URLs, DPP identifiers, and schema namespaces.</li>
<li class="">The platform domain has migrated to <code>app.traceable.digital</code>. All existing DPP URLs, QR codes, and API integrations have been updated to use the new domain.</li>
<li class="">GS1 Digital Link base URI updated to <code>https://app.traceable.digital</code> to reflect the new domain.</li>
</ul>]]></content>
        <category label="platform" term="platform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.1.0 — Full SaaS platform infrastructure]]></title>
        <id>https://dev.traceable.digital/changelog/v0-1-0</id>
        <link href="https://dev.traceable.digital/changelog/v0-1-0"/>
        <updated>2026-03-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Full multi-tenant SaaS platform infrastructure: module access gating, role-based administration, ESPR compliance gates, complete audit logging, mobile-responsive portals, and 100% of CRUD operations wired to the live database.]]></summary>
        <content type="html"><![CDATA[<p>Full multi-tenant SaaS platform infrastructure: module access gating, role-based administration, ESPR compliance gates, complete audit logging, mobile-responsive portals, and 100% of CRUD operations wired to the live database.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-1-0#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-access-gating">Module access gating<a href="https://dev.traceable.digital/changelog/v0-1-0#module-access-gating" class="hash-link" aria-label="Direct link to Module access gating" title="Direct link to Module access gating" translate="no">​</a></h3>
<p>The platform now enforces a module access system across all three portals. Features are gated by module — operators only see and interact with features included in their plan. The module system covers 30 distinct capabilities and is enforced server-side on every request.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="role-based-administration">Role-based administration<a href="https://dev.traceable.digital/changelog/v0-1-0#role-based-administration" class="hash-link" aria-label="Direct link to Role-based administration" title="Direct link to Role-based administration" translate="no">​</a></h3>
<p>Platform administrators now have role-based access control: Full Access, Operations, and Viewer roles. Full Access can perform all actions; Operations can manage operators and products; Viewer has read-only access to all data.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-health-and-monitoring">System health and monitoring<a href="https://dev.traceable.digital/changelog/v0-1-0#system-health-and-monitoring" class="hash-link" aria-label="Direct link to System health and monitoring" title="Direct link to System health and monitoring" translate="no">​</a></h3>
<p>A system health dashboard is available to administrators showing real-time platform status, recent error logs with severity classification, and performance metrics. Administrators can view error trends over time and acknowledge or resolve active alerts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="espr-compliance-gates">ESPR compliance gates<a href="https://dev.traceable.digital/changelog/v0-1-0#espr-compliance-gates" class="hash-link" aria-label="Direct link to ESPR compliance gates" title="Direct link to ESPR compliance gates" translate="no">​</a></h3>
<p>The DPP publication workflow now enforces ESPR field completeness as a gate before publication. Products with incomplete mandatory ESPR fields cannot be published, ensuring that every published DPP satisfies the minimum requirements of the EU regulation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-dpp-viewer--regulatory-alignment">Public DPP viewer — regulatory alignment<a href="https://dev.traceable.digital/changelog/v0-1-0#public-dpp-viewer--regulatory-alignment" class="hash-link" aria-label="Direct link to Public DPP viewer — regulatory alignment" title="Direct link to Public DPP viewer — regulatory alignment" translate="no">​</a></h3>
<p>The public DPP viewer now presents all data categories specified in EU Battery Regulation 2023/1542 Annex XIII, with field labels in the language of the regulatory text. Viewing a DPP in a browser produces a human-readable representation of all required regulatory fields.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="complete-crud-coverage">Complete CRUD coverage<a href="https://dev.traceable.digital/changelog/v0-1-0#complete-crud-coverage" class="hash-link" aria-label="Direct link to Complete CRUD coverage" title="Direct link to Complete CRUD coverage" translate="no">​</a></h3>
<p>All create, read, update, and delete operations across all entities (products, suppliers, materials, certificates, verification tasks, team members, data requests, audit logs) are now fully implemented and connected to the live database. No mock data or placeholder handlers remain.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="100-audit-logging-coverage">100% audit logging coverage<a href="https://dev.traceable.digital/changelog/v0-1-0#100-audit-logging-coverage" class="hash-link" aria-label="Direct link to 100% audit logging coverage" title="Direct link to 100% audit logging coverage" translate="no">​</a></h3>
<p>Every state-changing action across all three portals is now captured in the audit trail with a timestamp, user identity, company scope, and action type. The audit trail is append-only and cannot be modified by any portal user.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mobile-responsiveness">Mobile responsiveness<a href="https://dev.traceable.digital/changelog/v0-1-0#mobile-responsiveness" class="hash-link" aria-label="Direct link to Mobile responsiveness" title="Direct link to Mobile responsiveness" translate="no">​</a></h3>
<p>All portal interfaces — Company, Supplier, and Verifier — are now fully responsive across mobile, tablet, and desktop viewports. The DPP public viewer is optimised for mobile QR-code scanning flows.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="operator-level-product-approval">Operator-level product approval<a href="https://dev.traceable.digital/changelog/v0-1-0#operator-level-product-approval" class="hash-link" aria-label="Direct link to Operator-level product approval" title="Direct link to Operator-level product approval" translate="no">​</a></h3>
<p>Product approval is handled at the operator level, not the platform level. Operators control the publish workflow for their own products — platform administrators are not required to approve individual DPP publications.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="revenue-analytics">Revenue analytics<a href="https://dev.traceable.digital/changelog/v0-1-0#revenue-analytics" class="hash-link" aria-label="Direct link to Revenue analytics" title="Direct link to Revenue analytics" translate="no">​</a></h3>
<p>A revenue analytics view is available to platform administrators, showing account growth, active operators, trial-to-paid conversion, and module adoption metrics.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bulk-operations">Bulk operations<a href="https://dev.traceable.digital/changelog/v0-1-0#bulk-operations" class="hash-link" aria-label="Direct link to Bulk operations" title="Direct link to Bulk operations" translate="no">​</a></h3>
<p>Batch operations for common administrative tasks are available in the admin interface: bulk company status updates, bulk product category reassignment, bulk module assignment.</p>]]></content>
        <category label="release" term="release"/>
        <category label="platform" term="platform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v0.0.1 — MVP foundation]]></title>
        <id>https://dev.traceable.digital/changelog/v0-0-1</id>
        <link href="https://dev.traceable.digital/changelog/v0-0-1"/>
        <updated>2026-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Initial platform build. Establishes the full database schema, authentication, AI integration, product management, DPP lifecycle, certificate monitoring, team roles, CSV import, supplier invitations, and GDPR tooling.]]></summary>
        <content type="html"><![CDATA[<p>Initial platform build. Establishes the full database schema, authentication, AI integration, product management, DPP lifecycle, certificate monitoring, team roles, CSV import, supplier invitations, and GDPR tooling.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="added">Added<a href="https://dev.traceable.digital/changelog/v0-0-1#added" class="hash-link" aria-label="Direct link to Added" title="Direct link to Added" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-model">Data model<a href="https://dev.traceable.digital/changelog/v0-0-1#data-model" class="hash-link" aria-label="Direct link to Data model" title="Direct link to Data model" translate="no">​</a></h3>
<p>A comprehensive multi-tenant database schema covering all core platform entities: products and DPP records across all five battery categories, suppliers and their material libraries, verification tasks and decisions, certificates with expiry tracking, audit logs, team members and roles, data requests, and GDPR consent records. Enum types cover all battery category classifications, product lifecycle states, verification outcomes, and regulatory compliance statuses required by EU Regulation 2023/1542.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication--email--otp">Authentication — email + OTP<a href="https://dev.traceable.digital/changelog/v0-0-1#authentication--email--otp" class="hash-link" aria-label="Direct link to Authentication — email + OTP" title="Direct link to Authentication — email + OTP" translate="no">​</a></h3>
<p>Secure authentication using email and password combined with one-time password (OTP) verification on every login. Sessions are managed via secure, HTTP-only cookies with server-side validation. OTP delivery is handled via transactional email.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-integration--nine-flows">AI integration — nine flows<a href="https://dev.traceable.digital/changelog/v0-0-1#ai-integration--nine-flows" class="hash-link" aria-label="Direct link to AI integration — nine flows" title="Direct link to AI integration — nine flows" translate="no">​</a></h3>
<p>Nine AI-powered workflows built on the Anthropic Claude API:</p>
<ul>
<li class=""><strong>Document extraction</strong> — extract structured DPP field values from uploaded compliance documents (test reports, certificates, declarations)</li>
<li class=""><strong>Supply chain due diligence</strong> — generate a structured due diligence summary from uploaded supplier data</li>
<li class=""><strong>Carbon footprint analysis</strong> — analyse carbon footprint figures and flag values that appear anomalous relative to battery category benchmarks</li>
<li class=""><strong>Sustainability narrative</strong> — generate a plain-language sustainability summary for the DPP public viewer from structured data</li>
<li class=""><strong>Data request drafting</strong> — generate a structured data request message to a supplier, prefilled with the specific fields being requested</li>
<li class=""><strong>Certificate review</strong> — extract key fields from uploaded certificate documents for pre-population into the certificate record</li>
<li class=""><strong>Compliance gap analysis</strong> — identify DPP fields that are missing or incomplete relative to the requirements for the product's battery category</li>
<li class=""><strong>Email refinement</strong> — improve clarity and tone of operator-to-supplier communication drafts</li>
<li class=""><strong>Campaign generation</strong> — generate structured recall or notification campaign content from product and operator details</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="product-management">Product management<a href="https://dev.traceable.digital/changelog/v0-0-1#product-management" class="hash-link" aria-label="Direct link to Product management" title="Direct link to Product management" translate="no">​</a></h3>
<p>Full product lifecycle management: create battery products across all five regulated categories (EV, LMT, Industrial, SLI, Portable), populate DPP fields through a structured wizard, manage version history, and control publication state.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dpp-immutable-snapshots">DPP immutable snapshots<a href="https://dev.traceable.digital/changelog/v0-0-1#dpp-immutable-snapshots" class="hash-link" aria-label="Direct link to DPP immutable snapshots" title="Direct link to DPP immutable snapshots" translate="no">​</a></h3>
<p>Each time a DPP is published, an immutable snapshot of its data is captured. The snapshot record links the published content to the operator's identity, publication timestamp, and DPP version number. Published DPPs cannot be modified — updates require creating a new version.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="certificate-expiry-monitoring">Certificate expiry monitoring<a href="https://dev.traceable.digital/changelog/v0-0-1#certificate-expiry-monitoring" class="hash-link" aria-label="Direct link to Certificate expiry monitoring" title="Direct link to Certificate expiry monitoring" translate="no">​</a></h3>
<p>Certificates linked to products and materials are tracked against their expiry dates. A background job runs daily, identifies certificates within 30 days of expiry, and notifies the relevant operator or supplier so renewals can be initiated before a DPP becomes non-compliant.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-user-team-roles">Multi-user team roles<a href="https://dev.traceable.digital/changelog/v0-0-1#multi-user-team-roles" class="hash-link" aria-label="Direct link to Multi-user team roles" title="Direct link to Multi-user team roles" translate="no">​</a></h3>
<p>Operator accounts support multiple team members with distinct roles: Administrator (full account control), Manager (product and supplier management), and Viewer (read-only). Role assignments are managed by account administrators and take effect immediately.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bulk-csv-import">Bulk CSV import<a href="https://dev.traceable.digital/changelog/v0-0-1#bulk-csv-import" class="hash-link" aria-label="Direct link to Bulk CSV import" title="Direct link to Bulk CSV import" translate="no">​</a></h3>
<p>Products can be imported in bulk via CSV upload. The import validates each row against the DPP field schema for the specified battery category, reports errors per row, and creates all valid product records in a single operation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supplier-invitation-and-onboarding">Supplier invitation and onboarding<a href="https://dev.traceable.digital/changelog/v0-0-1#supplier-invitation-and-onboarding" class="hash-link" aria-label="Direct link to Supplier invitation and onboarding" title="Direct link to Supplier invitation and onboarding" translate="no">​</a></h3>
<p>Operators can invite suppliers directly from the Company Portal. Invitees receive an email with a secure invitation link. Clicking the link creates a Supplier Portal account pre-linked to the inviting operator, with no separate registration required.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gdpr-compliance-tooling">GDPR compliance tooling<a href="https://dev.traceable.digital/changelog/v0-0-1#gdpr-compliance-tooling" class="hash-link" aria-label="Direct link to GDPR compliance tooling" title="Direct link to GDPR compliance tooling" translate="no">​</a></h3>
<ul>
<li class=""><strong>Data export (Article 20)</strong> — operators and individual users can request a machine-readable export of all personal data held against their account, delivered as a structured JSON file.</li>
<li class=""><strong>Erasure requests (Article 17)</strong> — account deletion requests trigger a 30-day erasure workflow covering all personal data, audit-logged for administrator visibility.</li>
<li class=""><strong>Consent management</strong> — per-feature AI processing consent is captured and stored per user, with a toggle available in account settings.</li>
</ul>]]></content>
        <category label="release" term="release"/>
        <category label="platform" term="platform"/>
        <category label="launch" term="launch"/>
    </entry>
</feed>