From e542b333e120c7a65f75ba1bdc2c8e1c0076363e Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 29 Oct 2026 08:45:17 +0000 Subject: [PATCH 1/3] test(qa): hold the DOCX fidelity corpus to its baseline whichever way a line moved MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fidelity gate failed a document only when it moved away from the page: a line more than 0.5pt further than its baseline held it, a line no longer found, or a page count further from the engine's. Measured on the gate as it stood, everything else passed in silence — a line 1.10pt nearer the page, one 5pt nearer, a page count arriving on the engine's own, a line newly found, a line more drawn on the page, and `+3.00 -> -3.00pt`, which is six points of movement that a rule comparing which of two drifts is further from the page cannot see at all, since both stand three points away. Silence there is not tidiness. A move nearer the page that nothing writes down leaves the further value in the baseline, so a later change may walk the line back to it and spend the 0.5pt on top; held that way, the Word baseline went stale in 1609 of its 5165 rows over 74 commits without one red run, 227 of them standing as much as a point nearer the page across after #944 and #948, until three documents stood 0.48pt further and the next change to touch them would have failed for drift it did not cause. So each measurement is now held as a step from where the baseline puts it: `FidelityBaseline.divergences` fails a line whose drift moves more than 0.5pt, down or across, nearer the page or further; a document the editor sets on another number of pages, or that the engine draws on another number of pages or lines; a document whose set of found lines is not the set the baseline holds; and a line the baseline holds a place across for that is measured without one. Each failure names the step and its difference, so its direction is in the message, and the remedy is in the assertion: a change that moves documents, nearer the page included, rewrites the baseline in the same commit, and that diff is the record. The slack stays one number for both directions, because it is rounding and rounding is the same size whichever way a line rounds; the row aggregates are deliberately held to nothing, since they follow from the lines, which are held one by one. The export does not change — the 71-document corpus exports byte for byte as before — and the Word baseline needs no rewrite: Word 16.0.20527 measures all 71 documents and 5165 line rows exactly as word-windows.tsv holds them, not a row differing. DocxFidelityGateTest covers each rule in both directions, 32 tests from 27, including that a step of exactly half a point is rounding for every drift from 0 to 5pt either way. Thirteen sabotages — every rule removed, and every rule that has a direction made one-sided again — were each caught by those tests. libreoffice-windows.tsv is left as it stands and named as stale instead. Neither LibreOffice baseline has been shot whole since #898, and the local run is red already under the one-sided rule: 2 documents, 8 lines no longer found, 2 page counts and 65 lines more than half a point further, 8 of them proposal-indigo's, 10.25pt lower than it holds them on the LibreOffice build the baseline names. Rewriting it here would bury a 10pt export move in a baseline diff; it wants attributing to the commit that moved it first, as the Word baseline's drift was attributed before #975 rewrote it. --- .github/workflows/ci.yml | 10 +- CHANGELOG.md | 38 ++++ CONTRIBUTING.md | 43 ++-- .../fidelity/DocxFidelityCorpusTest.java | 26 +-- .../fidelity/DocxFidelityGateTest.java | 196 ++++++++++++++---- .../fidelity/FidelityAcceptance.java | 2 +- .../templates/fidelity/FidelityBaseline.java | 125 ++++++++--- scripts/docx-visual/word-fidelity.ps1 | 5 +- 8 files changed, 335 insertions(+), 110 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12356a772..09891570c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -538,9 +538,13 @@ jobs: # Every template preset, and the documents built for shapes no preset has, exported to # DOCX, set by LibreOffice, and held line by line to # qa/src/test/resources/docx-fidelity/libreoffice-linux*.tsv - # (DocxFidelityCorpusTest): a change that sets any line of any document further - # from the engine's PDF, down or across, at other words, or on more pages fails here. Gated on - # `docx` — what an export of the corpus is made from. + # (DocxFidelityCorpusTest): a change that moves any line of any document more than 0.5pt from + # where the baseline holds it — down or across, nearer the engine's PDF or further — or sets a + # document at other words, on another number of pages, or with another set of its lines found, + # fails here. A move nearer the page is the export doing better and fails all the same, until + # the change records it by rewriting the baseline: held one-sidedly, the Word baseline drifted + # stale in 1609 of its 5165 rows over 74 commits without a single red run (FidelityBaseline's + # javadoc has the breakdown). Gated on `docx` — what an export of the corpus is made from. # # The image is pinned, not ubuntu-latest: the baseline is LibreOffice's setting # of the text, and a new image's LibreOffice sets some lines a little apart. A diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c575803e..318e77273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4345,6 +4345,44 @@ follow semantic versioning; release dates are ISO 8601. ### Tests +- **The DOCX fidelity gate holds each document where its baseline puts it, whichever way it + moved, instead of only catching lines set further from the page.** + - A document failed when a line stood more than 0.5pt further from the engine's PDF than its + baseline held it, when a line the baseline found was no longer found, or when the editor set + it on a page count further from the engine's. A line that moved nearer the page, a page count + that came nearer, and a line found that the baseline did not hold all passed, at any size. + - Each is now measured as a step from where the baseline holds it: a line fails when its drift + moves more than 0.5pt, down or across, nearer the page or further, and a document fails when + the editor sets it on another number of pages, when the engine draws it on another number, or + when the set of its lines found is not the set the baseline holds. The failure names each + line's step — `+1.10 -> +0.00pt (-1.10)` — so the direction is in the message. + - Measured on the gate as it stood: a line moving 1.10pt nearer the page, one moving 5pt + nearer, a page count coming onto the engine's own, and a line newly found were each let + through in silence, as was `+3.00 -> -3.00pt` — six points of movement, which a rule comparing + which of two drifts is further from the page cannot see at all, since both stand three points + away. + - A change that moves documents, nearer the page included, now rewrites the baseline in the + same commit (`-Dgraphcompose.docxFidelity.update=true`), and that diff is the record of what + moved. Held one-sidedly, the Word baseline went stale in 1609 of its 5165 rows over 74 + commits without one red run — 227 of them standing as much as a point nearer the page across + after #944 and #948, an improvement nothing wrote down, which left the further value in place + for a later change to walk back to and spend the 0.5pt on top of. + - The slack stays one number for both directions: it is rounding, and rounding is the same size + whichever way a line rounds. A step of exactly 0.5pt is still rounding, for every drift from + 0 to 5pt and in both directions. The aggregates a row carries — its median, its p90, its + lines past 2pt — are held to nothing: they follow from the lines, which are held one by one. + - The export does not change: the 71-document corpus exports byte for byte as before, and the + Word baseline needs no rewrite — Word 16.0.20527 measures all 71 documents and 5165 line rows + exactly as `word-windows.tsv` holds them, not a row differing. + - `libreoffice-windows.tsv` is a different matter, and is left as it stands. Neither LibreOffice + baseline has been shot whole since #898; both were only ever patched where the one-sided gate + went red, and the Windows one — which nothing in CI runs — is red already under the rule it + was written for: 2 documents, 8 lines no longer found, 2 page counts and 65 lines standing + more than half a point further. `proposal-indigo` accounts for the worst of them, 8 lines + 10.25pt lower than it holds them, on the same LibreOffice build, so the move is the export's + and not the editor's. Rewriting it here would bury that in a baseline diff; it wants + attributing to the commit that moved it first, and is named in `CONTRIBUTING.md` until then. + - **The DOCX fidelity corpus holds an icon laid over a card's corner, as the export writes it today.** - `SyntheticDocxCorpus` takes `icon_over_card`: a layer stack laying an 18pt icon over the top diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c4385f1d8..10921f529 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -349,34 +349,49 @@ Choose the smallest tests that match the change: [DocxFidelityCorpusTest.java](qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java). It exports every template preset to DOCX, with documents built for shapes no preset has on its own fixture, has LibreOffice set each one, and holds every - line of every document to the drift its baseline records, down and across: a line set further - from the page either way, a line set at other words, or a page more fails it. It needs + line of every document to the drift its baseline records, down and across: a line that + moved more than 0.5pt from where the baseline holds it, nearer the page or further, a line + set at other words, a line found that the baseline does not hold, or another number of + pages fails it. It needs LibreOffice and runs only when asked for — install first, as for any standalone `qa` run: `./mvnw -B -ntp test -f qa/pom.xml -Dtest=DocxFidelityCorpusTest -Dgraphcompose.docxFidelity=libreoffice`. - A change that moves documents nearer the page rewrites the baseline with + A change that moves documents, nearer the page included, rewrites the baseline with `-Dgraphcompose.docxFidelity.update=true`, and commits it with the change: its diff shows - which documents moved. A new preset joins the corpus in its family's `*DocxCorpus` class, - and so does a preset on a longer fixture; a shape no preset has — a page break inside a + which documents moved, and which way. A new preset joins the corpus in its family's + `*DocxCorpus` class, and so does a preset on a longer fixture; a shape no preset has — a page break inside a panel, a break in a row's column, a shape container narrower than the block it stands in or clipped short of its text, an icon a layer stack lays over a card's corner — goes in `SyntheticDocxCorpus`. Its baseline holds it as the editors set it, a defect of the export included, and the change fixing that rewrites its rows nearer the page. CI runs it on Linux (the `DOCX Fidelity` job) against `libreoffice-linux.tsv`, and uploads what it measured: LibreOffice sets text a little differently per platform, so a change that - moves documents nearer the page takes that artifact's files as the Linux baseline, and its own - run's as the Windows one. Microsoft Word, the editor the export answers to, is not in CI: on + moves documents takes that artifact's files as the Linux baseline, and its own run's as the + Windows one. Microsoft Word, the editor the export answers to, is not in CI: on Windows with Word, `scripts/docx-visual/word-fidelity.ps1` (`-Update` to rewrite) exports the corpus, has a private Word instance convert it, and holds it to `word-windows.tsv` — run it from PowerShell (pwsh), after the install above, before a DOCX export change is opened. - Rewrite the baseline in the change that moves the documents: the gate cannot remind you, as - it fails a line only once it stands more than 0.5pt further from the page than the baseline - holds it, so a change that moves documents nearer — or less than that further — passes with - the baseline left as it was. Between #899 and #974 that left 1609 of the Word baseline's 5165 - rows stale over 74 commits, 220 of them standing about a point nearer the page, until three - documents stood 0.48pt further and the next change to touch them would have failed the gate - for drift it did not cause. Each baseline's header records the build it was shot on, and a + Rewrite the baseline in the change that moves the documents, and the gate will remind you: it + fails a line that has moved more than 0.5pt from where the baseline holds it, nearer the page + or further, and a document the editor sets on another number of pages, or whose lines it + finds a different set of. Until the gate was made two-sided it only looked for lines set + further, which let a change move documents nearer, or less than 0.5pt further, with the + baseline left as it was: between #899 and #974 that left 1609 of the Word baseline's 5165 + rows stale over 74 commits, 227 of them standing as much as a point nearer the page across, + until three documents stood 0.48pt further and the next change to touch them would have + failed the gate for drift it did not cause. A failure naming lines that moved nearer the page + is not a defect to fix — it is the export doing better, and the baseline is how it gets + recorded; carry any explanatory `#` note of the rows you rewrite over into the new file, as a + rewrite keeps only the header. Each baseline's header records the build it was shot on, and a differing build is rarely the cause: Word 16.0.20430 and 16.0.20527 measure the corpus as #899 exported it identically, row for row. + `libreoffice-windows.tsv` is known stale, and the local LibreOffice run fails on it: 2 + documents fail even one-sidedly — 8 lines no longer found, 2 page counts and 65 lines more + than half a point further, 8 of them `proposal-indigo`'s, 10.25pt lower than it holds them + on the LibreOffice build the baseline names. Neither LibreOffice baseline has been shot whole + since #898. Do not rewrite it as part of an unrelated change: find the commit that moved + those documents first, as the Word baseline's drift was attributed before #975 rewrote it, and + rewrite it with that reckoning. Until then, read a local LibreOffice run against the documents + your change touches rather than against a green run. Each run also writes `measured--acceptance.md`: which documents the editor sets as the page does — the same pages, 95% of the lines found, a median of 1pt or less, no more than 10% past 2pt — and what keeps the rest short of it. CI shows LibreOffice's in the job summary. diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java index 75460a878..2a572642b 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java @@ -24,14 +24,14 @@ /** * Every template preset's DOCX, and that of each document built for a shape no preset has - * ({@link SyntheticDocxCorpus}), set by an editor, stands no further from the engine's PDF than - * its baseline holds it. + * ({@link SyntheticDocxCorpus}), set by an editor, stands where its baseline holds it. * *

The engine draws each corpus document to PDF and exports it to DOCX; an editor converts the * DOCX to PDF; each document is measured line by line against the page * ({@link FidelityMeasurement}) and held to the baseline for this editor and operating system - * ({@link FidelityBaseline}). A change to the export that sets any document further from the - * page fails here, wherever the document is.

+ * ({@link FidelityBaseline}). A change to the export that moves any document fails here, + * wherever the document is and whichever way it moved: a move nearer the page is the export + * doing better and is recorded the same way, by rewriting the baseline in the same commit.

* *

It runs only when asked for, with {@code -Dgraphcompose.docxFidelity}, and takes a few * minutes; a value it does not know fails. {@code libreoffice} exports, converts with @@ -41,9 +41,9 @@ * Word converts them, and {@code word} measures Word's PDFs against {@code word-windows.tsv} — * each only when the DOCX Word converted, by the SHA-256 its conversion records, is the one * this tree exports ({@link WordConversion}). {@code -Dgraphcompose.docxFidelity.update=true} - * writes what it measured as the baseline, for a change that moves documents nearer the page; - * the baseline's diff then shows the reviewer which documents moved. The documents, their PDFs - * and the report are left in {@code target/docx-fidelity}.

+ * writes what it measured as the baseline, which is how a change that moves documents records + * the move; the baseline's diff then shows the reviewer which documents moved, and which way. + * The documents, their PDFs and the report are left in {@code target/docx-fidelity}.

*/ class DocxFidelityCorpusTest { @@ -52,7 +52,7 @@ class DocxFidelityCorpusTest { private static final String EXPORT = "export"; @Test - void everyDocumentStandsNoFurtherFromThePageThanItsBaseline() throws Exception { + void everyDocumentStandsWhereItsBaselineHoldsIt() throws Exception { String mode = System.getProperty("graphcompose.docxFidelity", ""); Assumptions.assumeTrue(!mode.isEmpty(), "NOT_RUN: the DOCX fidelity corpus runs with " + "-Dgraphcompose.docxFidelity=libreoffice, or with Word through scripts/docx-visual/word-fidelity.ps1"); @@ -109,15 +109,17 @@ void everyDocumentStandsNoFurtherFromThePageThanItsBaseline() throws Exception { Path baseline = Path.of("src", "test", "resources", "docx-fidelity", mode + "-" + LibreOfficeConverter.platform() + ".tsv"); - List regressions = FidelityBaseline.read(baseline).regressions(measurements); + List divergences = FidelityBaseline.read(baseline).divergences(measurements); if (Boolean.getBoolean("graphcompose.docxFidelity.update")) { // Written all the same: what it lets through is the baseline's diff, shown here first. - regressions.forEach(regression -> System.err.println("baseline rewritten over: " + regression)); + divergences.forEach(divergence -> System.err.println("baseline rewritten over: " + divergence)); FidelityBaseline.write(baseline, note, measurements); return; } - assertThat(regressions) - .as("documents set further from the page than %s holds them (measured: %s)", + assertThat(divergences) + .as("documents standing apart from %s, whichever way they moved: a change that moves " + + "them — nearer the page included — rewrites the baseline in the same commit, with " + + "-Dgraphcompose.docxFidelity.update=true, so its diff shows what moved (measured: %s)", baseline, work.resolve("measured-" + mode + ".tsv")) .isEmpty(); } diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java index a92bb63dc..07d012bf4 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java @@ -21,10 +21,14 @@ /** * The fidelity gate catches what it is there to catch: lines set lower, a line lost, a page * more — measured on PDFs drawn to differ in just that way, and held line by line against a - * baseline — and lets a document that moved nearer the page through. + * baseline — and catches a document that moved nearer the page too, which the baseline has to + * record before the gate will pass it. */ class DocxFidelityGateTest { + /** The lines a synthetic document's page draws, however many of them the editor finds. */ + private static final int PAGE_LINES = 40; + private static final List LINES = List.of( "The first paragraph of the probe document.", "A second paragraph, set under the first.", @@ -87,10 +91,51 @@ void aPageMoreIsCounted() throws Exception { void theBaselineFailsALineSetFurtherFromThePage() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", -2.8)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.0), line(1, "bb", -2.8))))) - .as("a line 0.6pt further").singleElement().asString().contains("1 lines further").contains("+1.00"); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", -3.4))))) - .as("a line already 2.8pt off, set 0.6pt further").singleElement().asString().contains("further"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.0), line(1, "bb", -2.8))))) + .as("a line 0.6pt further").singleElement().asString().contains("1 lines moved") + .contains("+0.40 -> +1.00pt (+0.60)"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", -3.4))))) + .as("a line already 2.8pt off, set 0.6pt further").singleElement().asString().contains("moved"); + } + + @Test + void theBaselineFailsALineSetNearerThePageThanItHoldsIt() { + // A move nearer the page is the export doing better, and the baseline has to record it: + // left unwritten it keeps the further value, which a later change may walk back to and + // then spend the slack on top of. #944 and #948 moved 229 lines about a point nearer + // across, and nothing recorded it. + FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, + line(1, "aa", 1.10, 1.10), line(1, "bb", 0.60)))); + + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.0, 1.10), + line(1, "bb", 0.60))))) + .as("1.10pt nearer the page").singleElement().asString().contains("1 lines moved") + .contains("+1.10 -> +0.00pt (-1.10)"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.10, 0.0), + line(1, "bb", 0.60))))) + .as("1.10pt nearer across").singleElement().asString().contains("1 lines moved") + .contains("+1.10 -> +0.00pt across (-1.10)"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.10, 1.10), + line(1, "bb", 0.0))))) + .as("a line onto the page's own, 0.60pt nearer").singleElement().asString() + .contains("1 lines moved").contains("+0.60 -> +0.00pt (-0.60)"); + } + + @Test + void theBaselineFailsALineThatCrossedThePagesOwnAtTheSameDistance() { + // Measured on the gate before this: a drift held by which of two values is further from + // the page cannot see +3.00 -> -3.00, which is six points of movement at one distance. + FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, + line(1, "aa", 3.0), line(1, "bb", 0.1, 3.0)))); + + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", -3.0), + line(1, "bb", 0.1, 3.0))))) + .as("six points down, at the same distance").singleElement().asString() + .contains("1 lines moved").contains("+3.00 -> -3.00pt (-6.00)"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 3.0), + line(1, "bb", 0.1, -3.0))))) + .as("six points across, at the same distance").singleElement().asString() + .contains("1 lines moved").contains("+3.00 -> -3.00pt across (-6.00)"); } @Test @@ -113,20 +158,20 @@ void theBaselineFailsALineFurtherAcross() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 0.2), line(1, "bb", 0.1, -3.0)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, -0.71), - line(1, "bb", 0.1, -3.0))))).as("0.51pt further, to the other side") - .singleElement().asString().contains("1 lines further").contains("across"); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 0.69), - line(1, "bb", 0.1, -0.5))))).as("within half a point, and nearer").isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, -0.71), + line(1, "bb", 0.1, -3.0))))).as("0.91pt further, to the other side") + .singleElement().asString().contains("1 lines moved").contains("across"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 0.69), + line(1, "bb", 0.1, -2.55))))).as("within half a point either way").isEmpty(); } @Test - void aLineFurtherBothWaysIsNamedOnceWithBoth() { + void aLineMovedBothWaysIsNamedOnceWithBoth() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 0.1)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 2.0, -3.0))))) - .singleElement().asString().contains("1 lines further") - .contains("+0.10 -> +2.00pt, +0.10 -> -3.00pt across"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 2.0, -3.0))))) + .singleElement().asString().contains("1 lines moved") + .contains("+0.10 -> +2.00pt (+1.90), +0.10 -> -3.00pt across (-3.10)"); } @Test @@ -139,10 +184,12 @@ void aBaselineWrittenBeforeLinesWereMeasuredAcrossHoldsThemDownAlone() { assertThat(found.drift()).isEqualTo(0.25); assertThat(found.across()).isNaN(); FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-a", 1, 1, Map.entry("1:aa", found)))); - assertThat(baseline.regressions(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, 40))))) + assertThat(baseline.divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, 40))))) .as("no place across to hold it to").isEmpty(); - assertThat(baseline.regressions(List.of(doc("cv-a", 1, 1, line(1, "aa", 1.0, 0))))) - .as("and still held down").singleElement().asString().contains("further").doesNotContain("across"); + assertThat(baseline.divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 1.0, 0))))) + .as("and still held down").singleElement().asString().contains("moved").doesNotContain("across"); + assertThat(baseline.divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", -0.5, 0))))) + .as("held down either way").singleElement().asString().contains("moved").doesNotContain("across"); } @Test @@ -161,15 +208,19 @@ void aLineFileMeasuredAcrossRefusesARowWithoutItsDriftAcross() throws Exception } @Test - void halfAPointFurtherIsRoundingForEveryDrift() { - // In doubles, 0.18 + 0.5 is less than 0.68: half a point further failed 22 of these drifts. + void halfAPointIsRoundingForEveryDriftEitherWay() { + // In doubles, 1.07 - 0.57 comes out as 0.5000000000000001: an exact half-point step is + // over half a point for 36 of these drifts each way, so the rounding is what holds them. for (int hundredths = 0; hundredths <= 500; hundredths++) { double was = hundredths / 100.0; - double now = (hundredths + 50) / 100.0; + double further = (hundredths + 50) / 100.0; + double nearer = (hundredths - 50) / 100.0; FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", was, was)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", now, now))))) - .as("%.2f -> %.2f", was, now).isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", further, further))))) + .as("%.2f -> %.2f", was, further).isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", nearer, nearer))))) + .as("%.2f -> %.2f", was, nearer).isEmpty(); } } @@ -177,28 +228,77 @@ void halfAPointFurtherIsRoundingForEveryDrift() { void theBaselineFailsALineNoLongerFound() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", 2.8)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4))))) + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4))))) .singleElement().asString().contains("1 lines no longer found").contains("\"bb\""); } @Test - void theBaselineFailsAPageFurtherFromTheEnginesCountAndADocumentItDoesNotHold() { + void theBaselineFailsAPageCountOtherThanItHoldsAndADocumentItDoesNotHold() { + FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.4)))); + + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 3, line(1, "aa", 0.4))))) + .as("the editor on a page more").singleElement().asString() + .contains("set on 3 pages, and the baseline holds 2"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4))))) + .as("the editor onto the page's own count, which the baseline has to record") + .singleElement().asString().contains("set on 1 page, and the baseline holds 2"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 2, 2, line(1, "aa", 0.4))))) + .as("the pages the engine draws, one more").singleElement().asString() + .contains("the page is drawn on 2 pages, and the baseline holds 1 page"); + assertThat(FidelityBaseline.of(List.of(doc("cv-probe", 2, 2, line(1, "aa", 0.4)))) + .divergences(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.4))))) + .as("the pages the engine draws, one fewer").singleElement().asString() + .contains("the page is drawn on 1 page, and the baseline holds 2 pages"); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.4)), doc("cv-other", 1, 1, line(1, "aa", 0.4))))) + .singleElement().asString().contains("not in the baseline"); + } + + @Test + void theBaselineFailsAnotherNumberOfLinesOnThePage() { + // The lines the engine draws are what the drifts are measured against: a page drawing + // another number of them is another page, whether or not the editor finds the same ones. FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.4))))) - .singleElement().asString().contains("2 pages"); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4)), doc("cv-other", 1, 1, line(1, "aa", 0.4))))) - .singleElement().asString().contains("not in the baseline"); + assertThat(baseline.divergences(List.of(new FidelityMeasurement("cv-probe", 1, 1, PAGE_LINES + 1, 1, + 0, 0, 0, Map.ofEntries(line(1, "aa", 0.4)))))) + .as("a line more on the page, the same one found").singleElement().asString() + .contains("the page draws 41 lines, and the baseline holds 40"); + assertThat(baseline.divergences(List.of(new FidelityMeasurement("cv-probe", 1, 1, PAGE_LINES - 1, 1, + 0, 0, 0, Map.ofEntries(line(1, "aa", 0.4)))))) + .as("a line fewer on the page").singleElement().asString() + .contains("the page draws 39 lines, and the baseline holds 40"); + } + + @Test + void aLineTheBaselineHoldsAcrossAndTheMeasurementDoesNotFails() { + // Fail closed: a baseline holding a place across holds the line to it, so a measurement + // that carries none is a line nothing can hold, not a line that passes unheld. + FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 1.5)))); + + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, + Map.entry("1:aa", new FidelityMeasurement.Found(1, "aa", 0.1, Double.NaN)))))) + .singleElement().asString().contains("1 lines moved").contains("across"); } @Test - void theBaselineLetsThroughALineWithinRoundingOrNearerThePage() { + void theBaselineLetsThroughALineWithinRounding() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.4), line(1, "bb", 2.8)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.8), line(1, "bb", 3.2))))) - .as("within half a point").isEmpty(); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0), line(1, "bb", 0.1), - line(1, "cc", 0.2))))).as("nearer the page, a page fewer and a line more found").isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.8), line(1, "bb", 3.2))))) + .as("within half a point further").isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 2, line(1, "aa", 0.0), line(1, "bb", 2.4))))) + .as("within half a point nearer").isEmpty(); + } + + @Test + void theBaselineFailsALineFoundThatItDoesNotHold() { + // The editor setting a line where the page does is the export doing better, and the + // baseline has to record it: unwritten, nothing holds that line anywhere afterwards. + FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4)))); + + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", 0.1))))) + .singleElement().asString() + .contains("1 lines found that the baseline does not hold").contains("\"bb\""); } @Test @@ -209,33 +309,35 @@ void aBaselineIsReadAsItWasWritten() throws Exception { FidelityBaseline.write(file, "probe", rows); - assertThat(FidelityBaseline.read(file).regressions(rows)).isEmpty(); - assertThat(FidelityBaseline.read(file).regressions(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, -1.86)), + assertThat(FidelityBaseline.read(file).divergences(rows)).isEmpty(); + assertThat(FidelityBaseline.read(file).divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, -1.86)), doc("cv-b", 2, 3, line(1, "aa", -1.5), line(2, "cc", 3))))) - .as("a drift across read back as written: -1.25 -> -1.86 is further") + .as("a drift across read back as written: -1.25 -> -1.86 is a move") .singleElement().asString().contains("across"); - assertThat(FidelityBaseline.read(file).regressions(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.86)), + assertThat(FidelityBaseline.read(file).divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.86, -1.25)), doc("cv-b", 2, 3, line(1, "aa", -1.5), line(2, "cc", 3))))) - .as("a drift read back as written: 0.25 -> 0.86 is further").singleElement().asString().contains("further"); - assertThat(FidelityBaseline.read(file).regressions(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25)), + .as("a drift read back as written: 0.25 -> 0.86 is a move").singleElement().asString().contains("moved"); + assertThat(FidelityBaseline.read(file).divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, -1.25)), doc("cv-b", 2, 3, line(1, "aa", -1.5))))) .as("the line file read back with the document file").singleElement().asString().contains("no longer found"); assertThat(Files.readAllLines(file)).first().isEqualTo("# probe"); } @Test - void halfAPointFurtherIsRoundingAndMoreIsNot() { + void halfAPointIsRoundingAndMoreIsNotEitherWay() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.0)))); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.5))))).isEmpty(); - assertThat(baseline.regressions(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.51))))).hasSize(1); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.5))))).isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.51))))).hasSize(1); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.5))))).isEmpty(); + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.49))))).hasSize(1); } @Test void aDocumentTheCorpusNoLongerHasFails() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-gone", 1, 1, line(1, "aa", 0)))); - assertThat(baseline.regressions(List.of())).singleElement().asString().contains("no longer in the corpus"); + assertThat(baseline.divergences(List.of())).singleElement().asString().contains("no longer in the corpus"); } @Test @@ -383,6 +485,12 @@ void aMalformedBaselineRowIsRefusedByName() { .hasMessageContaining("cv-a"); } + /** + * A document of {@link #PAGE_LINES} lines, of which the editor found the ones given. The + * page's line count is held apart from them on purpose: the engine draws the same lines + * whether or not the editor finds each one, so a test about the lines found says nothing + * about how many the page draws. + */ @SafeVarargs private static FidelityMeasurement doc(String stem, int enginePages, int editorPages, Map.Entry... lines) { @@ -390,7 +498,7 @@ private static FidelityMeasurement doc(String stem, int enginePages, int editorP for (Map.Entry line : lines) { found.put(line.getKey(), line.getValue()); } - return new FidelityMeasurement(stem, enginePages, editorPages, lines.length, lines.length, 0, 0, 0, found); + return new FidelityMeasurement(stem, enginePages, editorPages, PAGE_LINES, lines.length, 0, 0, 0, found); } private static Map.Entry line(int page, String letters, double drift) { diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityAcceptance.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityAcceptance.java index 5faee5e54..8abf27fd8 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityAcceptance.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityAcceptance.java @@ -19,7 +19,7 @@ * than {@value #MEDIAN_POINTS}pt from the page, and sets no more than * {@value #FAR_SHARE_PERCENT} in a hundred more than 2pt off. It is a report of where each * document stands, not a gate: the baseline ({@link FidelityBaseline}) is what keeps a document - * from moving further away.

+ * from moving at all, either way, without the move being recorded.

*/ final class FidelityAcceptance { diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java index b36d1d9ad..fde5c6cd3 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java @@ -7,26 +7,47 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; /** * The measurements a DOCX export is held to: one per corpus document, and the drift of each of * its lines the editor set where the page does, as last accepted. * - *

A change may move the export nearer the page, never further. Against its baseline a - * document fails when the editor sets it on a page count further from the engine's, when a - * line the baseline found is no longer found — the editor breaks it at another word, or puts it - * on another page — or when a found line drifts more than {@value #LINE_SLACK}pt further from - * the page than it did, down or across. Across as well as down: a table's left margin the - * export dropped stood {@code PaymentsInvoice}'s bank details 36.7pt left of the page's and - * moved no line up or down. Line by line, because a document already set a few points off - * throughout hides a new defect in its counts. A document the baseline does not hold fails - * until the baseline is written with it, and so does one the baseline holds and the corpus no - * longer has. A document whose lines the editor mostly sets at other words is held to the few - * it finds: the gate keeps what an export has, and adds nothing for what it lacks.

+ *

The baseline is the record of where the export stands, so a change may move the export + * either way and must write the move into it. Against its baseline a document fails when the + * editor sets it on another number of pages, when the pages or the lines the engine draws it on + * change, when a line the baseline found is no longer found — the editor breaks it at another + * word, or puts it on another page — when a line is found that the baseline does not hold, or + * when a found line's drift moves by more than {@value #LINE_SLACK}pt, down or across, + * whichever way it moved. Across as well as down: a table's left margin the export dropped stood + * {@code PaymentsInvoice}'s bank details 36.7pt left of the page's and moved no line up or + * down. Line by line, because a document already set a few points off throughout hides a new + * defect in its counts. A document the baseline does not hold fails until the baseline is + * written with it, and so does one the baseline holds and the corpus no longer has.

+ * + *

Whichever way it moved, because a gate that only looks for lines set further from the page + * cannot see the state it is holding drift out from under it. Held that way from #899 to #974, + * 1609 of the Word baseline's 5165 rows went stale over 74 commits — 1388 moving down the page + * (632 nearer it, 553 further, none past the slack) and 229 across, 227 of those nearer by as + * much as 1.1pt, 8 rows moving both ways, and none of it recorded — until three documents stood + * 0.48pt further and the next change to touch them would have failed for drift it did not + * cause. A move nearer the page that goes unwritten is worse than + * untidy: the baseline keeps the further value, so a later change may walk the line back to it + * and spend the slack again on top. Comparing where a line is now against where it was, rather + * than which of the two is further from the page, also catches a line that crosses the page's: + * {@code +3.00 -> -3.00pt} stands the same distance away and has moved six points.

+ * + *

So a change that moves documents — nearer the page included — rewrites the baseline in the + * same commit ({@code -Dgraphcompose.docxFidelity.update=true}), and the diff of it is what + * shows the reviewer what moved. The aggregates a row carries — its median, its p90, the lines + * past 2pt — are not held to anything: they follow from the lines, which are held one by one, + * and an aggregate hides the tail it is an average of. Nor is the count of lines found, which + * is the set of them, held line by line above.

* *

The baseline is two files: {@code .tsv}, a row per document, and * {@code -lines.tsv}, a row per found line, named by its page and a digest of its @@ -35,7 +56,11 @@ */ final class FidelityBaseline { - /** How much further a line may drift, in points: rounding, not room for a change to spend. */ + /** + * How far a line may move, in points, before the baseline must record it: rounding, not room + * for a change to spend. One slack both ways, because rounding is the same size whichever + * way a line rounds. + */ static final double LINE_SLACK = 0.5; /** The line file's header names this column when its lines were measured across. */ @@ -114,10 +139,13 @@ static void write(Path documents, String note, Collection m Files.write(linesOf(documents), lines, StandardCharsets.UTF_8); } - /** What each measurement does worse than its baseline; empty when none does. */ - List regressions(Collection measurements) { + /** + * Where each measurement stands apart from its baseline, whichever way it moved; empty when + * none does, which is the only state the gate passes. + */ + List divergences(Collection measurements) { List found = new ArrayList<>(); - java.util.Set measured = new java.util.HashSet<>(); + Set measured = new HashSet<>(); measurements.forEach(now -> measured.add(now.stem())); rows.keySet().stream().filter(stem -> !measured.contains(stem)) .forEach(stem -> found.add(stem + ": in the baseline, and no longer in the corpus")); @@ -127,50 +155,79 @@ List regressions(Collection measurements) { found.add(now.stem() + ": not in the baseline; measured " + now.row()); continue; } - int pagesOffWas = Math.abs(was.editorPages() - was.enginePages()); - int pagesOffNow = Math.abs(now.editorPages() - now.enginePages()); - if (pagesOffNow > pagesOffWas) { - found.add(now.stem() + ": set on " + now.editorPages() + " pages against the page's " - + now.enginePages() + " (baseline " + was.editorPages() + ")"); + if (now.editorPages() != was.editorPages()) { + found.add(now.stem() + ": set on " + pages(now.editorPages()) + ", and the baseline holds " + + was.editorPages() + " (the page's " + now.enginePages() + ")"); + } + if (now.enginePages() != was.enginePages()) { + found.add(now.stem() + ": the page is drawn on " + pages(now.enginePages()) + + ", and the baseline holds " + pages(was.enginePages())); + } + if (now.lines() != was.lines()) { + found.add(now.stem() + ": the page draws " + now.lines() + " lines, and the baseline holds " + + was.lines()); } List lost = new ArrayList<>(); - List further = new ArrayList<>(); + List moved = new ArrayList<>(); was.found().forEach((id, line) -> { FidelityMeasurement.Found there = now.found().get(id); if (there == null) { lost.add("\"" + line.preview() + "\""); return; } - // Named once, with every way it moved further. + // Named once, with every way it moved. List ways = new ArrayList<>(2); - if (further(line.drift(), there.drift())) { - ways.add(String.format(Locale.ROOT, "%+.2f -> %+.2fpt", line.drift(), there.drift())); + if (moved(line.drift(), there.drift())) { + ways.add(step(line.drift(), there.drift(), "")); } - if (!Double.isNaN(line.across()) && further(line.across(), there.across())) { - ways.add(String.format(Locale.ROOT, "%+.2f -> %+.2fpt across", line.across(), there.across())); + // A baseline holding a place across holds the line to it: a measurement without + // one is a line that cannot be held, which fails rather than passing unheld. + if (!Double.isNaN(line.across()) + && (Double.isNaN(there.across()) || moved(line.across(), there.across()))) { + ways.add(step(line.across(), there.across(), " across")); } if (!ways.isEmpty()) { - further.add("\"" + line.preview() + "\" " + String.join(", ", ways)); + moved.add("\"" + line.preview() + "\" " + String.join(", ", ways)); + } + }); + List gained = new ArrayList<>(); + now.found().forEach((id, line) -> { + if (!was.found().containsKey(id)) { + gained.add("\"" + line.preview() + "\""); } }); if (!lost.isEmpty()) { found.add(now.stem() + ": " + lost.size() + " lines no longer found, set at other words or " + "on another page: " + named(lost)); } - if (!further.isEmpty()) { - found.add(now.stem() + ": " + further.size() + " lines further from the page: " + named(further)); + if (!gained.isEmpty()) { + found.add(now.stem() + ": " + gained.size() + " lines found that the baseline does not hold: " + + named(gained)); + } + if (!moved.isEmpty()) { + found.add(now.stem() + ": " + moved.size() + " lines moved: " + named(moved)); } } return found; } /** - * Whether a drift is more than {@link #LINE_SLACK}pt further from the page than it was, - * counted in the hundredths both are written in: in doubles, half a point further was - * further for some drifts and not for others. + * Whether a drift has moved more than {@link #LINE_SLACK}pt from where the baseline holds + * it, nearer the page or further, counted in the hundredths both are written in: in doubles, + * a step of exactly half a point came out over half a point for some drifts and not for + * others. */ - private static boolean further(double was, double now) { - return Math.round(Math.abs(now) * 100) > Math.round(Math.abs(was) * 100) + Math.round(LINE_SLACK * 100); + private static boolean moved(double was, double now) { + return Math.round(Math.abs(now - was) * 100) > Math.round(LINE_SLACK * 100); + } + + private static String pages(int count) { + return count + (count == 1 ? " page" : " pages"); + } + + /** A line's step, as the baseline holds it, as it is now, and the difference. */ + private static String step(double was, double now, String axis) { + return String.format(Locale.ROOT, "%+.2f -> %+.2fpt%s (%+.2f)", was, now, axis, now - was); } private static String named(List lines) { diff --git a/scripts/docx-visual/word-fidelity.ps1 b/scripts/docx-visual/word-fidelity.ps1 index b6a1e13b4..6035daa5e 100644 --- a/scripts/docx-visual/word-fidelity.ps1 +++ b/scripts/docx-visual/word-fidelity.ps1 @@ -24,8 +24,9 @@ run. .PARAMETER Update - Rewrites the Word baseline with what was measured, for a change that moves - documents nearer the page. What it writes over is printed first. + Rewrites the Word baseline with what was measured, which is how a change + that moves documents — nearer the page included — records the move. What it + writes over is printed first. .EXAMPLE .\mvnw.cmd -B -ntp -DskipTests install -pl :graph-compose-qa -am From bc7b93df9c19a50ab6e88527ed909a9fe4450ff4 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 29 Oct 2026 09:27:17 +0000 Subject: [PATCH 2/3] test(qa): shoot the Linux LibreOffice baseline whole, and close the gate's own NaN hole MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first run of the two-sided gate went red on the Linux LibreOffice baseline: 8 documents, 230 lines. Measured against the old predicate the same run is green, and of the 230 steps past the slack every one stands nearer the engine's PDF and not one further, with no line lost or gained and no page or line count moved, on the build the file names. Not shot whole since #898 and patched since only where the one-sided gate went red, the baseline was stale on 1778 of its 5149 rows purely in improvements that rule had swallowed. It is re-shot from that run, and its note records the run and the reckoning; the note explaining where cv-teal_pulse's email line stands is carried over, and three notes that only marked which run a document's rows came from are dropped, since a whole re-shoot makes them untrue. libreoffice-windows.tsv is the opposite case and is left alone, marked stale in the file rather than only in CONTRIBUTING: nothing in CI runs it, and it fails even one-sidedly on 2 documents — 8 lines no longer found, 2 page counts, 65 lines more than half a point further, 8 of them proposal-indigo's at 10.25pt on the build it names. A move further from the page wants attributing to the commit that made it before the file is shot again. Three holes the gate had, found by reading it against its own thesis: - A baseline row whose drift or place across was not a number was read, and held its line to nothing: every comparison against NaN is false, so a line 500pt from where the baseline put it produced no divergence. These files are patched by hand, so one mistyped cell was enough. Such a row is now refused, which is the mirror of the rule this change added for a measurement carrying no place across. - A rewrite dropped every hand-written note the file carried, and a rewrite is now the ordinary answer to a document moving. FidelityBaseline.write keeps them under the new header, for the author to prune. - The page's own line count was not held, so a line added to the page with the same ones found passed in silence. It is held beside the pages the engine draws. The drift figures the javadoc, the changelog and CONTRIBUTING quote were wrong and are recounted from the committed rows: of the Word baseline's 1609 stale rows, 1388 moved down the page — 717 nearer it, 635 further, 36 crossing it to stand the same distance on the other side — and 229 moved across, 228 of them nearer by as much as 1.10pt. 228 rows had moved more than the slack, 226 across and 2 down, and no row's distance from the page had grown by more than 0.41pt, which is why a rule reading distances stayed quiet. CONTRIBUTING also gains the two engine-side rules it did not list, and both it and the javadoc now say that the slack is read afresh against each rewrite and so bounds no total. 34 tests from 27, and 17 sabotages — every rule removed, every rule that has a direction made one-sided again, the non-finite refusals removed and note-keeping dropped — each caught by DocxFidelityGateTest. --- CHANGELOG.md | 37 +- CONTRIBUTING.md | 25 +- .../fidelity/DocxFidelityGateTest.java | 57 +- .../templates/fidelity/FidelityBaseline.java | 72 +- .../fidelity/FidelityMeasurement.java | 14 +- .../docx-fidelity/libreoffice-linux-lines.tsv | 3562 ++++++++--------- .../docx-fidelity/libreoffice-linux.tsv | 102 +- .../libreoffice-windows-lines.tsv | 1 + .../docx-fidelity/libreoffice-windows.tsv | 1 + 9 files changed, 1985 insertions(+), 1886 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 318e77273..1d0142f7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4363,10 +4363,17 @@ follow semantic versioning; release dates are ISO 8601. away. - A change that moves documents, nearer the page included, now rewrites the baseline in the same commit (`-Dgraphcompose.docxFidelity.update=true`), and that diff is the record of what - moved. Held one-sidedly, the Word baseline went stale in 1609 of its 5165 rows over 74 - commits without one red run — 227 of them standing as much as a point nearer the page across - after #944 and #948, an improvement nothing wrote down, which left the further value in place - for a later change to walk back to and spend the 0.5pt on top of. + moved. A rewrite now also keeps the notes the file it replaces carried, since those are where + a row's reckoning is written and a rewrite is the ordinary answer to a document moving. + - Held one-sidedly, the Word baseline went stale in 1609 of its 5165 rows over 74 commits + without one red run: 1388 rows moved down the page — 717 nearer it, 635 further, and 36 + crossing it to stand the same distance on the other side — and 229 moved across, 228 of them + nearer by as much as 1.10pt. Of all that, 228 rows had moved more than the slack, 226 across + and 2 down, and no row's *distance* from the page had grown by more than 0.41pt, which is + exactly why a rule reading distances stayed quiet. + - A baseline line row whose drift or place across is not a number is now refused. Every + comparison against `NaN` is false, so such a row held its line to nothing however far it + moved — and these files are patched by hand, so one mistyped cell was enough. - The slack stays one number for both directions: it is rounding, and rounding is the same size whichever way a line rounds. A step of exactly 0.5pt is still rounding, for every drift from 0 to 5pt and in both directions. The aggregates a row carries — its median, its p90, its @@ -4374,14 +4381,20 @@ follow semantic versioning; release dates are ISO 8601. - The export does not change: the 71-document corpus exports byte for byte as before, and the Word baseline needs no rewrite — Word 16.0.20527 measures all 71 documents and 5165 line rows exactly as `word-windows.tsv` holds them, not a row differing. - - `libreoffice-windows.tsv` is a different matter, and is left as it stands. Neither LibreOffice - baseline has been shot whole since #898; both were only ever patched where the one-sided gate - went red, and the Windows one — which nothing in CI runs — is red already under the rule it - was written for: 2 documents, 8 lines no longer found, 2 page counts and 65 lines standing - more than half a point further. `proposal-indigo` accounts for the worst of them, 8 lines - 10.25pt lower than it holds them, on the same LibreOffice build, so the move is the export's - and not the editor's. Rewriting it here would bury that in a baseline diff; it wants - attributing to the commit that moved it first, and is named in `CONTRIBUTING.md` until then. + - `libreoffice-linux.tsv` is rewritten here, from the run of this change. Not shot whole since + #898, it had gone stale in 1778 of its 5149 rows, of which 230 stood more than half a point + from where it held them — 226 across and 4 down, in 8 documents — and **every one of the 230 + stood nearer the engine's PDF, not one further**, on the LibreOffice build the file names. So + the two-sided rule's first real run recorded 230 improvements the one-sided rule had swallowed, + which is what it is for; the file's note records the run and the reckoning. + - `libreoffice-windows.tsv` is left as it stands and marked stale in the file instead, because + it is the opposite case. Nothing in CI runs it, and it is red already under the rule it was + written for: 2 documents, 8 lines no longer found, 2 page counts and 65 lines standing more + than half a point further. `proposal-indigo` accounts for the worst, 8 lines 10.25pt lower + than it holds them on the build it names, so the move is the export's and not the editor's. + Rewriting it alongside the Linux file would bury a 10pt move in a baseline diff; a move + further from the page wants attributing to the commit that made it first, as the Word + baseline's drift was attributed before #975 rewrote it. - **The DOCX fidelity corpus holds an icon laid over a card's corner, as the export writes it today.** diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 10921f529..3dad4ec1f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -351,8 +351,8 @@ Choose the smallest tests that match the change: its own fixture, has LibreOffice set each one, and holds every line of every document to the drift its baseline records, down and across: a line that moved more than 0.5pt from where the baseline holds it, nearer the page or further, a line - set at other words, a line found that the baseline does not hold, or another number of - pages fails it. It needs + set at other words, a line found that the baseline does not hold, another number of pages + from the editor, or another number of pages or lines from the engine fails it. It needs LibreOffice and runs only when asked for — install first, as for any standalone `qa` run: `./mvnw -B -ntp test -f qa/pom.xml -Dtest=DocxFidelityCorpusTest -Dgraphcompose.docxFidelity=libreoffice`. A change that moves documents, nearer the page included, rewrites the baseline with @@ -370,15 +370,18 @@ Choose the smallest tests that match the change: Windows with Word, `scripts/docx-visual/word-fidelity.ps1` (`-Update` to rewrite) exports the corpus, has a private Word instance convert it, and holds it to `word-windows.tsv` — run it from PowerShell (pwsh), after the install above, before a DOCX export change is opened. - Rewrite the baseline in the change that moves the documents, and the gate will remind you: it - fails a line that has moved more than 0.5pt from where the baseline holds it, nearer the page - or further, and a document the editor sets on another number of pages, or whose lines it - finds a different set of. Until the gate was made two-sided it only looked for lines set - further, which let a change move documents nearer, or less than 0.5pt further, with the - baseline left as it was: between #899 and #974 that left 1609 of the Word baseline's 5165 - rows stale over 74 commits, 227 of them standing as much as a point nearer the page across, - until three documents stood 0.48pt further and the next change to touch them would have - failed the gate for drift it did not cause. A failure naming lines that moved nearer the page + Rewrite the baseline in the change that moves the documents, and the gate will remind you — + as long as you run it, which for Word means running the script above: it fails a line that has + moved more than 0.5pt from where the baseline holds it, nearer the page or further, a document + the editor sets on another number of pages, one the engine draws on another number of pages or + lines, and one whose lines the editor finds a different set of. Until the gate was made + two-sided it only looked for lines set further, which let a change move documents nearer, or + less than 0.5pt further, with the baseline left as it was: between #899 and #974 that left + 1609 of the Word baseline's 5165 rows stale over 74 commits, 226 of them standing more than + half a point nearer the page across, until three documents stood 0.48pt further and the next + change to touch them would have failed the gate for drift it did not cause. The slack is read + afresh against each rewrite, so it bounds no total: what two-sidedness buys is that every move + past rounding is seen and written down, not that drift cannot accumulate over many changes. A failure naming lines that moved nearer the page is not a defect to fix — it is the export doing better, and the baseline is how it gets recorded; carry any explanatory `#` note of the rows you rewrite over into the new file, as a rewrite keeps only the header. Each baseline's header records the build it was shot on, and a diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java index 07d012bf4..c6f00e964 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java @@ -92,7 +92,7 @@ void theBaselineFailsALineSetFurtherFromThePage() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", -2.8)))); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.0), line(1, "bb", -2.8))))) - .as("a line 0.6pt further").singleElement().asString().contains("1 lines moved") + .as("a line 0.6pt further").singleElement().asString().contains("1 line moved") .contains("+0.40 -> +1.00pt (+0.60)"); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", -3.4))))) .as("a line already 2.8pt off, set 0.6pt further").singleElement().asString().contains("moved"); @@ -109,16 +109,16 @@ void theBaselineFailsALineSetNearerThePageThanItHoldsIt() { assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.0, 1.10), line(1, "bb", 0.60))))) - .as("1.10pt nearer the page").singleElement().asString().contains("1 lines moved") + .as("1.10pt nearer the page").singleElement().asString().contains("1 line moved") .contains("+1.10 -> +0.00pt (-1.10)"); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.10, 0.0), line(1, "bb", 0.60))))) - .as("1.10pt nearer across").singleElement().asString().contains("1 lines moved") + .as("1.10pt nearer across").singleElement().asString().contains("1 line moved") .contains("+1.10 -> +0.00pt across (-1.10)"); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 1.10, 1.10), line(1, "bb", 0.0))))) .as("a line onto the page's own, 0.60pt nearer").singleElement().asString() - .contains("1 lines moved").contains("+0.60 -> +0.00pt (-0.60)"); + .contains("1 line moved").contains("+0.60 -> +0.00pt (-0.60)"); } @Test @@ -131,11 +131,11 @@ void theBaselineFailsALineThatCrossedThePagesOwnAtTheSameDistance() { assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", -3.0), line(1, "bb", 0.1, 3.0))))) .as("six points down, at the same distance").singleElement().asString() - .contains("1 lines moved").contains("+3.00 -> -3.00pt (-6.00)"); + .contains("1 line moved").contains("+3.00 -> -3.00pt (-6.00)"); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 3.0), line(1, "bb", 0.1, -3.0))))) .as("six points across, at the same distance").singleElement().asString() - .contains("1 lines moved").contains("+3.00 -> -3.00pt across (-6.00)"); + .contains("1 line moved").contains("+3.00 -> -3.00pt across (-6.00)"); } @Test @@ -160,7 +160,7 @@ void theBaselineFailsALineFurtherAcross() { assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, -0.71), line(1, "bb", 0.1, -3.0))))).as("0.91pt further, to the other side") - .singleElement().asString().contains("1 lines moved").contains("across"); + .singleElement().asString().contains("1 line moved").contains("across"); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 0.69), line(1, "bb", 0.1, -2.55))))).as("within half a point either way").isEmpty(); } @@ -170,7 +170,7 @@ void aLineMovedBothWaysIsNamedOnceWithBoth() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.1, 0.1)))); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 2.0, -3.0))))) - .singleElement().asString().contains("1 lines moved") + .singleElement().asString().contains("1 line moved") .contains("+0.10 -> +2.00pt (+1.90), +0.10 -> -3.00pt across (-3.10)"); } @@ -229,7 +229,7 @@ void theBaselineFailsALineNoLongerFound() { FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", 2.8)))); assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4))))) - .singleElement().asString().contains("1 lines no longer found").contains("\"bb\""); + .singleElement().asString().contains("1 line no longer found").contains("\"bb\""); } @Test @@ -277,7 +277,8 @@ void aLineTheBaselineHoldsAcrossAndTheMeasurementDoesNotFails() { assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, Map.entry("1:aa", new FidelityMeasurement.Found(1, "aa", 0.1, Double.NaN)))))) - .singleElement().asString().contains("1 lines moved").contains("across"); + .singleElement().asString().contains("1 line moved") + .contains("+1.50pt across in the baseline, and no place across measured"); } @Test @@ -298,7 +299,7 @@ void theBaselineFailsALineFoundThatItDoesNotHold() { assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.4), line(1, "bb", 0.1))))) .singleElement().asString() - .contains("1 lines found that the baseline does not hold").contains("\"bb\""); + .contains("1 line found that the baseline does not hold").contains("\"bb\""); } @Test @@ -355,6 +356,40 @@ void aBaselineWithoutItsLinesIsRefused() throws Exception { .isInstanceOf(IllegalStateException.class).hasMessageContaining("no line file"); } + @Test + void aLineRowHoldingADriftThatIsNotANumberIsRefused() { + // Every comparison against NaN is false, so such a row would hold its line to nothing, + // however far it moved. These files are patched by hand, so the typo is refused. + assertThatThrownBy(() -> FidelityMeasurement.parseLine("cv-a\t1:aa\tNaN\t0.10\taa", new LinkedHashMap<>())) + .isInstanceOf(IllegalArgumentException.class).hasMessageContaining("hold its line to nothing"); + assertThatThrownBy(() -> FidelityMeasurement.parseLine("cv-a\t1:aa\t0.10\tNaN\taa", new LinkedHashMap<>())) + .as("and the same for its place across") + .isInstanceOf(IllegalArgumentException.class).hasMessageContaining("hold its line to nothing"); + assertThatThrownBy(() -> FidelityMeasurement.parseLine("cv-a\t1:aa\tInfinity\t0.10\taa", new LinkedHashMap<>())) + .isInstanceOf(IllegalArgumentException.class).hasMessageContaining("not a number"); + } + + @Test + void aRewrittenBaselineKeepsTheNotesTheFileItReplacesCarried() throws Exception { + // A row's reckoning is written in those notes, and a rewrite is the ordinary answer to a + // document moving, so a rewrite that dropped them would spend the record itself. + Path file = dir.resolve("baseline.tsv"); + FidelityBaseline.write(file, "first", List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, 1.5)))); + Path lines = dir.resolve("baseline-lines.tsv"); + Files.write(file, List.of(Files.readAllLines(file).get(0), "# rows of cv-a: from run 7", + Files.readAllLines(file).get(1), Files.readAllLines(file).get(2))); + Files.write(lines, List.of(Files.readAllLines(lines).get(0), "# cv-a's heading stood 0.08pt low", + Files.readAllLines(lines).get(1))); + + FidelityBaseline.write(file, "second", List.of(doc("cv-a", 1, 1, line(1, "aa", 0.30, 1.5)))); + + assertThat(Files.readAllLines(file)).containsSubsequence("# second", "# rows of cv-a: from run 7"); + assertThat(Files.readAllLines(lines)).anyMatch(row -> row.equals("# cv-a's heading stood 0.08pt low")); + assertThat(Files.readAllLines(lines)).first().asString().startsWith("# second"); + assertThat(FidelityBaseline.read(file).divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.30, 1.5))))) + .as("and reads back past its notes").isEmpty(); + } + @Test void aMalformedLineRowIsRefusedByName() { assertThatThrownBy(() -> FidelityMeasurement.parseLine("cv-a\t1:abc\tfar\tletters", new LinkedHashMap<>())) diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java index fde5c6cd3..0f2f20e08 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java @@ -32,11 +32,14 @@ * *

Whichever way it moved, because a gate that only looks for lines set further from the page * cannot see the state it is holding drift out from under it. Held that way from #899 to #974, - * 1609 of the Word baseline's 5165 rows went stale over 74 commits — 1388 moving down the page - * (632 nearer it, 553 further, none past the slack) and 229 across, 227 of those nearer by as - * much as 1.1pt, 8 rows moving both ways, and none of it recorded — until three documents stood - * 0.48pt further and the next change to touch them would have failed for drift it did not - * cause. A move nearer the page that goes unwritten is worse than + * 1609 of the Word baseline's 5165 rows went stale over 74 commits with no run ever going red: + * 1388 moved down the page — 717 nearer it, 635 further, and 36 crossing it to stand the same + * distance on the other side — and 229 moved across, 228 of them nearer by as much as 1.10pt, + * 8 rows moving both ways. Of all that, 228 rows moved more than the slack: 226 across and 2 + * down, both of those crossing the page's line. No row's distance from the page grew + * by more than 0.41pt, which is the whole reason a rule reading distances stayed quiet — until + * three documents stood 0.48pt further and the next change to touch them would have failed for + * drift it did not cause. A move nearer the page that goes unwritten is worse than * untidy: the baseline keeps the further value, so a later change may walk the line back to it * and spend the slack again on top. Comparing where a line is now against where it was, rather * than which of the two is further from the page, also catches a line that crosses the page's: @@ -49,6 +52,12 @@ * and an aggregate hides the tail it is an average of. Nor is the count of lines found, which * is the set of them, held line by line above.

* + *

The slack is read afresh against each rewrite, so it bounds no total: a line may be moved + * half a point by every change, or walked back and forth, and each step passes as rounding. What + * holding both ways buys is that every move past rounding is seen and written down — not that + * drift cannot accumulate across many changes, which is what {@link FidelityAcceptance}'s limits + * are for.

+ * *

The baseline is two files: {@code .tsv}, a row per document, and * {@code -lines.tsv}, a row per found line, named by its page and a digest of its * letters, with its drift down and across and a few of its letters to read it by. A line file @@ -123,13 +132,24 @@ static FidelityBaseline of(Collection measurements) { return new FidelityBaseline(rows); } - /** Writes the measurements as a baseline, under a note of where they were taken. */ + /** + * Writes the measurements as a baseline, under a note of where they were taken, keeping any + * further note the file it replaces carried. + * + *

Those notes are what a row's reckoning is written down in — why a line stands where it + * does, which run shot it, what was left unwritten — and a rewrite is now the ordinary answer + * to a document moving, so dropping them would spend the record this gate exists to keep. + * They are carried over as they stand, under the new header: a note the rewrite has made + * stale is for the author to prune, which the file in front of them shows.

+ */ static void write(Path documents, String note, Collection measurements) throws IOException { List sorted = measurements.stream() .sorted(Comparator.comparing(FidelityMeasurement::stem)).toList(); List rows = new ArrayList<>(List.of("# " + note, FidelityMeasurement.HEADER)); + rows.addAll(1, notesOf(documents)); List lines = new ArrayList<>(List.of("# " + note + " — document, line, drift below the page (pt), " + ACROSS_COLUMN + ", letters")); + lines.addAll(notesOf(linesOf(documents))); for (FidelityMeasurement measured : sorted) { rows.add(measured.row()); lines.addAll(measured.lineRows()); @@ -139,32 +159,42 @@ static void write(Path documents, String note, Collection m Files.write(linesOf(documents), lines, StandardCharsets.UTF_8); } + /** Every note a baseline file carries but the first, which is its own header. */ + private static List notesOf(Path file) throws IOException { + if (!Files.exists(file)) { + return List.of(); + } + List notes = Files.readAllLines(file, StandardCharsets.UTF_8).stream() + .filter(row -> row.startsWith("#")).toList(); + return notes.isEmpty() ? List.of() : notes.subList(1, notes.size()); + } + /** * Where each measurement stands apart from its baseline, whichever way it moved; empty when * none does, which is the only state the gate passes. */ List divergences(Collection measurements) { - List found = new ArrayList<>(); + List apart = new ArrayList<>(); Set measured = new HashSet<>(); measurements.forEach(now -> measured.add(now.stem())); rows.keySet().stream().filter(stem -> !measured.contains(stem)) - .forEach(stem -> found.add(stem + ": in the baseline, and no longer in the corpus")); + .forEach(stem -> apart.add(stem + ": in the baseline, and no longer in the corpus")); for (FidelityMeasurement now : measurements) { FidelityMeasurement was = rows.get(now.stem()); if (was == null) { - found.add(now.stem() + ": not in the baseline; measured " + now.row()); + apart.add(now.stem() + ": not in the baseline; measured " + now.row()); continue; } if (now.editorPages() != was.editorPages()) { - found.add(now.stem() + ": set on " + pages(now.editorPages()) + ", and the baseline holds " - + was.editorPages() + " (the page's " + now.enginePages() + ")"); + apart.add(now.stem() + ": set on " + pages(now.editorPages()) + ", and the baseline holds " + + pages(was.editorPages()) + " (the page's " + now.enginePages() + ")"); } if (now.enginePages() != was.enginePages()) { - found.add(now.stem() + ": the page is drawn on " + pages(now.enginePages()) + apart.add(now.stem() + ": the page is drawn on " + pages(now.enginePages()) + ", and the baseline holds " + pages(was.enginePages())); } if (now.lines() != was.lines()) { - found.add(now.stem() + ": the page draws " + now.lines() + " lines, and the baseline holds " + apart.add(now.stem() + ": the page draws " + now.lines() + " lines, and the baseline holds " + was.lines()); } List lost = new ArrayList<>(); @@ -197,18 +227,18 @@ List divergences(Collection measurements) { } }); if (!lost.isEmpty()) { - found.add(now.stem() + ": " + lost.size() + " lines no longer found, set at other words or " + apart.add(now.stem() + ": " + lines(lost.size()) + " no longer found, set at other words or " + "on another page: " + named(lost)); } if (!gained.isEmpty()) { - found.add(now.stem() + ": " + gained.size() + " lines found that the baseline does not hold: " + apart.add(now.stem() + ": " + lines(gained.size()) + " found that the baseline does not hold: " + named(gained)); } if (!moved.isEmpty()) { - found.add(now.stem() + ": " + moved.size() + " lines moved: " + named(moved)); + apart.add(now.stem() + ": " + lines(moved.size()) + " moved: " + named(moved)); } } - return found; + return apart; } /** @@ -227,9 +257,17 @@ private static String pages(int count) { /** A line's step, as the baseline holds it, as it is now, and the difference. */ private static String step(double was, double now, String axis) { + if (Double.isNaN(now)) { + return String.format(Locale.ROOT, "%+.2fpt%s in the baseline, and no place%s measured", + was, axis, axis); + } return String.format(Locale.ROOT, "%+.2f -> %+.2fpt%s (%+.2f)", was, now, axis, now - was); } + private static String lines(int count) { + return count + (count == 1 ? " line" : " lines"); + } + private static String named(List lines) { return String.join(", ", lines.subList(0, Math.min(NAMED, lines.size()))) + (lines.size() > NAMED ? ", and " + (lines.size() - NAMED) + " more" : ""); diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java index 949dc4817..53d08b9bd 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java @@ -211,8 +211,20 @@ static void parseLine(String row, Map> byDocument, bo boolean measuredAcross = cells.length == 5; double across = measuredAcross ? Double.parseDouble(cells[3]) : Double.NaN; String preview = measuredAcross ? cells[4] : cells.length > 3 ? cells[3] : ""; + double drift = Double.parseDouble(cells[2]); + // A drift that is not a number holds its line to nothing: every comparison against + // NaN is false, so the line would pass however far it moved. These files are patched + // by hand, so a cell mistyped that way is refused rather than read. + if (!Double.isFinite(drift)) { + throw new IllegalArgumentException("a baseline line row holds a drift that is not a " + + "number, which would hold its line to nothing: " + row); + } + if (measuredAcross && !Double.isFinite(across)) { + throw new IllegalArgumentException("a baseline line row holds a place across that is not a " + + "number, which would hold its line to nothing: " + row); + } byDocument.computeIfAbsent(cells[0], stem -> new LinkedHashMap<>()) - .put(cells[1], new Found(page, preview, Double.parseDouble(cells[2]), across)); + .put(cells[1], new Found(page, preview, drift, across)); } catch (NumberFormatException | StringIndexOutOfBoundsException malformed) { throw new IllegalArgumentException("a baseline line row is malformed: " + row, malformed); } diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv index fd32e9832..f73bce3bc 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv @@ -1,53 +1,51 @@ # libreoffice build 420(Build:2) on linux — document, line, drift below the page (pt), drift right of the page (pt), letters -# rows of invoice-metered_long, invoice-obsidian_long, synthetic-break_in_column, synthetic-break_in_panel, synthetic-card_over_pages: libreoffice build 420(Build:2) on linux -# rows of synthetic-clipped_container, synthetic-narrow_container, synthetic-rounded_card: libreoffice build 420(Build:2) on linux -# rows of synthetic-icon_over_card: libreoffice build 420(Build:2) on linux -# rows of cv-teal_pulse: libreoffice build 420(Build:2) on linux, from CI run 40503780286. Its email line, set in a cell set to the middle, stood +0.08pt while the contact separator was anchored in that cell, LibreOffice 24.2 then setting the cell from its top; the separator now goes elsewhere, as a cell set to the middle carries no drawing, and LibreOffice centres the cell as its neighbours: +0.93pt, Word +1.14pt. Ten other lines stand 0.1 to 0.3pt further, as the same run sets lines of documents the export does not change +# every row from CI run 40844463596, the run of the change that made this gate two-sided. Not shot whole since #898, the file had gone stale in 1778 of its 5149 rows, since the one-sided gate of that time wrote back only the rows it went red on. Of those, 230 stood more than half a point from where it held them — 226 across and 4 down, in 8 documents — and every one of the 230 stood nearer the engine's PDF, not one further; the rest had moved within the half point the gate reads as rounding +# rows of cv-teal_pulse: its email line, set in a cell set to the middle, stood +0.08pt while the contact separator was anchored in that cell, LibreOffice 24.2 then setting the cell from its top; the separator now goes elsewhere, as a cell set to the middle carries no drawing, and LibreOffice centres the cell as its neighbours: +0.93pt, Word +1.14pt cv-blue_banner 0:8f1010120ed6 0.02 1.90 jordanrivera cv-blue_banner 0:8d7a2cca3060 0.00 0.14 +442055551000|jordan.rivera@exam cv-blue_banner 0:b944906ed84c -0.20 -0.38 professionalsummary -cv-blue_banner 0:8d6758a29c08 -0.06 0.10 platformengineerwith10+yearsbuil -cv-blue_banner 0:f0d993eb5f9d -0.05 0.10 high-throughputpdfrendering,sema +cv-blue_banner 0:8d6758a29c08 0.04 0.10 platformengineerwith10+yearsbuil +cv-blue_banner 0:f0d993eb5f9d 0.05 0.10 high-throughputpdfrendering,sema cv-blue_banner 0:c2f296ef30a3 -0.19 -0.46 professionalexperience -cv-blue_banner 0:a76f47480818 -0.25 0.10 seniorplatformengineer -cv-blue_banner 0:060300b18051 -0.20 0.32 2024-present +cv-blue_banner 0:a76f47480818 0.00 0.10 seniorplatformengineer +cv-blue_banner 0:060300b18051 0.05 0.32 2024-present cv-blue_banner 0:f890faef907f 0.00 0.10 northwindsystems -cv-blue_banner 0:e9ca73f80176 -0.04 0.10 ledthereusabledocument-generatio -cv-blue_banner 0:4d5fc9766174 -0.03 0.10 70%byretiringper-teampdfscriptsi -cv-blue_banner 0:daf65306b3b6 -0.22 0.10 softwareengineer -cv-blue_banner 0:e7cc1822c6dc -0.17 0.37 2021-2024 +cv-blue_banner 0:e9ca73f80176 0.06 0.10 ledthereusabledocument-generatio +cv-blue_banner 0:4d5fc9766174 0.07 0.10 70%byretiringper-teampdfscriptsi +cv-blue_banner 0:daf65306b3b6 0.03 0.10 softwareengineer +cv-blue_banner 0:e7cc1822c6dc 0.08 0.37 2021-2024 cv-blue_banner 0:998c1a985022 0.03 0.10 brightleaflabs -cv-blue_banner 0:57305305a2eb -0.01 0.10 builtbackendservicesandproductio -cv-blue_banner 0:7b7239897a2f 0.00 0.10 layoutengine,eliminatinglicensin -cv-blue_banner 0:41bb54fbae8d -0.19 0.10 backendengineer -cv-blue_banner 0:3fa772117260 -0.14 0.37 2019-2021 -cv-blue_banner 0:3fa772117260#1 -0.23 0.37 2019-2021 +cv-blue_banner 0:57305305a2eb 0.09 0.10 builtbackendservicesandproductio +cv-blue_banner 0:7b7239897a2f 0.10 0.10 layoutengine,eliminatinglicensin +cv-blue_banner 0:41bb54fbae8d 0.06 0.10 backendengineer +cv-blue_banner 0:3fa772117260 0.11 0.37 2019-2021 +cv-blue_banner 0:3fa772117260#1 0.02 0.37 2019-2021 cv-blue_banner 0:ef148f221e31 0.06 0.10 helixprintco -cv-blue_banner 0:d7119ba1b2b4 0.07 0.10 maintainedahigh-volumeinvoice-pr +cv-blue_banner 0:d7119ba1b2b4 0.12 0.10 maintainedahigh-volumeinvoice-pr cv-blue_banner 0:68bf0109c6f8 -0.22 0.24 education -cv-blue_banner 0:0ad1957d6bab -0.28 0.10 msccomputerscience +cv-blue_banner 0:0ad1957d6bab -0.03 0.10 msccomputerscience cv-blue_banner 0:47ce0218bbea -0.03 0.10 universityofmanchester -cv-blue_banner 0:2ffe115b06e5 -0.02 0.10 distinction.thesis:composablelay -cv-blue_banner 0:b6749d0b616b -0.26 0.10 bscsoftwareengineering -cv-blue_banner 0:30f9262640a0 -0.21 0.37 2015-2019 +cv-blue_banner 0:2ffe115b06e5 0.03 0.10 distinction.thesis:composablelay +cv-blue_banner 0:b6749d0b616b -0.01 0.10 bscsoftwareengineering +cv-blue_banner 0:30f9262640a0 0.04 0.37 2015-2019 cv-blue_banner 0:89ad9656f393 -0.01 0.10 imperialcollegelondon -cv-blue_banner 0:baa173b4a82e 0.00 0.10 first-classhonours.specialisatio -cv-blue_banner 0:6d3d5673c39f -0.24 0.10 oraclejavacertification -cv-blue_banner 0:d40b22f00acb -0.19 0.37 2023-2024 +cv-blue_banner 0:baa173b4a82e 0.05 0.10 first-classhonours.specialisatio +cv-blue_banner 0:6d3d5673c39f 0.01 0.10 oraclejavacertification +cv-blue_banner 0:d40b22f00acb 0.06 0.37 2023-2024 cv-blue_banner 0:2669e1f6d55c 0.01 0.10 professionaltrack -cv-blue_banner 0:3857373829c1 0.02 0.10 java17platformdeep-dive:records, +cv-blue_banner 0:3857373829c1 0.07 0.10 java17platformdeep-dive:records, cv-blue_banner 0:5f94c50dc5bf -0.17 -0.01 technicalskills -cv-blue_banner 0:eea537278f83 -0.18 0.10 •languages:java21,kotlin,groovy, -cv-blue_banner 0:9c2cd7231a53 -0.17 0.10 •document&print:pdfbox,apachepoi -cv-blue_banner 0:7bf8639ec5d3 -0.16 0.10 •layoutengines:customdsldesign,s -cv-blue_banner 0:8e66776d28d7 -0.15 0.10 •build&infrastructure:maven,grad -cv-blue_banner 0:1ed4fc7d7768 -0.24 0.10 •testing:junit5,assertj,pdfbox-b -cv-blue_banner 0:26671c309eb9 -0.23 0.10 •distribution:mavencentral,sonat +cv-blue_banner 0:eea537278f83 0.07 0.10 •languages:java21,kotlin,groovy, +cv-blue_banner 0:9c2cd7231a53 0.08 0.10 •document&print:pdfbox,apachepoi +cv-blue_banner 0:7bf8639ec5d3 0.09 0.10 •layoutengines:customdsldesign,s +cv-blue_banner 0:8e66776d28d7 0.10 0.10 •build&infrastructure:maven,grad +cv-blue_banner 0:1ed4fc7d7768 0.01 0.10 •testing:junit5,assertj,pdfbox-b +cv-blue_banner 0:26671c309eb9 0.02 0.10 •distribution:mavencentral,sonat cv-blue_banner 0:676dfdd56ad2 -0.22 -0.46 additionalinformation -cv-blue_banner 0:f20997652453 -0.03 0.10 languages:english(fluent),german -cv-blue_banner 0:ec9d3622395e -0.02 0.10 workeligibility:eligibletoworkin -cv-blue_banner 0:dd20ae01c3cf -0.01 0.10 opensource:maintainerofgraphcomp -cv-blue_banner 0:33c35e9d236d 0.00 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-blue_banner 0:f20997652453 0.02 0.10 languages:english(fluent),german +cv-blue_banner 0:ec9d3622395e 0.03 0.10 workeligibility:eligibletoworkin +cv-blue_banner 0:dd20ae01c3cf 0.04 0.10 opensource:maintainerofgraphcomp +cv-blue_banner 0:33c35e9d236d 0.05 0.10 speaking:jvmsummit2024,devoxxuk2 cv-blue_banner 0:2577c0f557b2 -0.19 0.34 projects cv-blue_banner 0:47f6c54ae700 0.00 0.10 graphcompose(java21,pdfbox,maven cv-blue_banner 0:7fea658a4957 0.30 0.10 productioncv/invoice/proposalpip @@ -55,108 +53,108 @@ cv-blue_banner 0:b56776d153e9 -0.04 0.10 templatestudio(kotlin,composedes cv-blue_banner 0:88b226d51fe1 0.26 0.10 pngdiffing,side-by-sidelayout,ba cv-blue_banner 0:339245d63103 -0.53 0.10 layoutlint(java21,javaparser,spo cv-blue_banner 0:8c87b84946f3 -0.23 0.10 beforetheyshiptoproduction. -cv-boxed_sections 0:8f1010120ed6 0.46 2.20 jordanrivera +cv-boxed_sections 0:8f1010120ed6 0.01 2.20 jordanrivera cv-boxed_sections 0:8d7a2cca3060 0.08 0.12 +442055551000|jordan.rivera@exam cv-boxed_sections 0:b944906ed84c 0.08 6.44 professionalsummary -cv-boxed_sections 0:80cc87fdc4c4 -0.05 0.10 platformengineerwith10+yearsbuil -cv-boxed_sections 0:bddc0bd093ce -0.05 0.10 systems.specialisedinhigh-throug -cv-boxed_sections 0:95a43d7b3df0 -0.04 0.10 snapshot-testedlibrariesthatscal +cv-boxed_sections 0:80cc87fdc4c4 0.15 0.10 platformengineerwith10+yearsbuil +cv-boxed_sections 0:bddc0bd093ce 0.15 0.10 systems.specialisedinhigh-throug +cv-boxed_sections 0:95a43d7b3df0 0.16 0.10 snapshot-testedlibrariesthatscal cv-boxed_sections 0:5f94c50dc5bf 0.07 6.32 technicalskills -cv-boxed_sections 0:eea537278f83 0.04 0.10 •languages:java21,kotlin,groovy, -cv-boxed_sections 0:9c2cd7231a53 0.05 0.10 •document&print:pdfbox,apachepoi -cv-boxed_sections 0:7bf8639ec5d3 0.05 0.10 •layoutengines:customdsldesign,s -cv-boxed_sections 0:8e66776d28d7 0.06 0.10 •build&infrastructure:maven,grad -cv-boxed_sections 0:1ed4fc7d7768 0.06 0.10 •testing:junit5,assertj,pdfbox-b -cv-boxed_sections 0:26671c309eb9 0.07 0.10 •distribution:mavencentral,sonat +cv-boxed_sections 0:eea537278f83 0.14 0.10 •languages:java21,kotlin,groovy, +cv-boxed_sections 0:9c2cd7231a53 0.15 0.10 •document&print:pdfbox,apachepoi +cv-boxed_sections 0:7bf8639ec5d3 0.15 0.10 •layoutengines:customdsldesign,s +cv-boxed_sections 0:8e66776d28d7 0.16 0.10 •build&infrastructure:maven,grad +cv-boxed_sections 0:1ed4fc7d7768 0.16 0.10 •testing:junit5,assertj,pdfbox-b +cv-boxed_sections 0:26671c309eb9 0.17 0.10 •distribution:mavencentral,sonat cv-boxed_sections 0:68bf0109c6f8 0.08 6.18 education -cv-boxed_sections 0:0ad1957d6bab 0.08 0.10 msccomputerscience +cv-boxed_sections 0:0ad1957d6bab 0.13 0.10 msccomputerscience cv-boxed_sections 0:3fa772117260 0.04 -0.76 2019-2021 cv-boxed_sections 0:47ce0218bbea 0.07 0.10 universityofmanchester -cv-boxed_sections 0:2ffe115b06e5 0.08 0.10 distinction.thesis:composablelay -cv-boxed_sections 0:b6749d0b616b 0.11 0.10 bscsoftwareengineering +cv-boxed_sections 0:2ffe115b06e5 0.18 0.10 distinction.thesis:composablelay +cv-boxed_sections 0:b6749d0b616b 0.16 0.10 bscsoftwareengineering cv-boxed_sections 0:30f9262640a0 0.08 -0.76 2015-2019 cv-boxed_sections 0:89ad9656f393 0.10 0.10 imperialcollegelondon -cv-boxed_sections 0:baa173b4a82e 0.12 0.10 first-classhonours.specialisatio -cv-boxed_sections 0:6d3d5673c39f 0.15 0.10 oraclejavacertification +cv-boxed_sections 0:baa173b4a82e 0.22 0.10 first-classhonours.specialisatio +cv-boxed_sections 0:6d3d5673c39f 0.20 0.10 oraclejavacertification cv-boxed_sections 0:d40b22f00acb 0.11 -0.76 2023-2024 cv-boxed_sections 0:2669e1f6d55c 0.14 0.10 professionaltrack -cv-boxed_sections 0:3857373829c1 0.05 0.10 java17platformdeep-dive:records, +cv-boxed_sections 0:3857373829c1 0.15 0.10 java17platformdeep-dive:records, cv-boxed_sections 0:2577c0f557b2 0.07 6.18 projects -cv-boxed_sections 0:b2b029995203 0.04 0.10 •graphcompose(java21,pdfbox,mave -cv-boxed_sections 0:67593a76ef70 -0.06 0.11 declarativejavapdflayoutengine.s -cv-boxed_sections 0:b9292cbd1454 -0.05 0.11 pipelinesforhiringtoolsandbillin -cv-boxed_sections 0:1b50bb81df5a 0.05 0.10 •templatestudio(kotlin,composede -cv-boxed_sections 0:836e76daecbf 0.06 0.11 internaltoolforevaluatingcv,prop -cv-boxed_sections 0:25cdca2beb8b 0.06 0.10 •layoutlint(java21,javaparser,sp -cv-boxed_sections 0:7488006d7864 -0.03 0.11 staticanalyserthatflagsfragileau -cv-boxed_sections 0:c4d0c415b4f8 -0.03 0.11 production. -cv-boxed_sections 0:fb1927f88597 0.08 0.10 •chromeforge(java,graphcompose,p -cv-boxed_sections 0:e7e62230eb1f 0.08 0.11 editorial-magazinedocumenttoolki +cv-boxed_sections 0:b2b029995203 0.14 0.10 •graphcompose(java21,pdfbox,mave +cv-boxed_sections 0:67593a76ef70 0.14 0.11 declarativejavapdflayoutengine.s +cv-boxed_sections 0:b9292cbd1454 0.15 0.11 pipelinesforhiringtoolsandbillin +cv-boxed_sections 0:1b50bb81df5a 0.15 0.10 •templatestudio(kotlin,composede +cv-boxed_sections 0:836e76daecbf 0.16 0.11 internaltoolforevaluatingcv,prop +cv-boxed_sections 0:25cdca2beb8b 0.16 0.10 •layoutlint(java21,javaparser,sp +cv-boxed_sections 0:7488006d7864 0.17 0.11 staticanalyserthatflagsfragileau +cv-boxed_sections 0:c4d0c415b4f8 0.17 0.11 production. +cv-boxed_sections 0:fb1927f88597 0.18 0.10 •chromeforge(java,graphcompose,p +cv-boxed_sections 0:e7e62230eb1f 0.18 0.11 editorial-magazinedocumenttoolki cv-boxed_sections 0:c2f296ef30a3 0.10 6.46 professionalexperience -cv-boxed_sections 0:a76f47480818 0.09 0.10 seniorplatformengineer +cv-boxed_sections 0:a76f47480818 0.14 0.10 seniorplatformengineer cv-boxed_sections 0:060300b18051 0.06 0.01 2024-present cv-boxed_sections 0:f890faef907f 0.08 0.10 northwindsystems -cv-boxed_sections 1:49faf14f1f56 -0.13 0.10 ledthereusabledocument-generatio -cv-boxed_sections 1:6bd3f168e89e -0.13 0.10 maintenancetimeby70%byretiringpe -cv-boxed_sections 1:daf65306b3b6 0.00 0.10 softwareengineer +cv-boxed_sections 1:49faf14f1f56 0.07 0.10 ledthereusabledocument-generatio +cv-boxed_sections 1:6bd3f168e89e 0.07 0.10 maintenancetimeby70%byretiringpe +cv-boxed_sections 1:daf65306b3b6 0.05 0.10 softwareengineer cv-boxed_sections 1:e7cc1822c6dc -0.03 -0.76 2021-2024 cv-boxed_sections 1:998c1a985022 -0.01 0.10 brightleaflabs -cv-boxed_sections 1:e55664011cda -0.09 0.10 builtbackendservicesandproductio -cv-boxed_sections 1:e80236b6d2b1 -0.09 0.10 itexttoacustomlayoutengine,elimi -cv-boxed_sections 1:41bb54fbae8d 0.04 0.10 backendengineer +cv-boxed_sections 1:e55664011cda 0.11 0.10 builtbackendservicesandproductio +cv-boxed_sections 1:e80236b6d2b1 0.11 0.10 itexttoacustomlayoutengine,elimi +cv-boxed_sections 1:41bb54fbae8d 0.09 0.10 backendengineer cv-boxed_sections 1:3fa772117260 0.01 -0.76 2019-2021 cv-boxed_sections 1:ef148f221e31 0.03 0.10 helixprintco -cv-boxed_sections 1:9d31a6bfbc69 -0.05 0.10 maintainedahigh-volumeinvoice-pr -cv-boxed_sections 1:03af8a628309 -0.05 0.10 change. +cv-boxed_sections 1:9d31a6bfbc69 0.15 0.10 maintainedahigh-volumeinvoice-pr +cv-boxed_sections 1:03af8a628309 0.15 0.10 change. cv-boxed_sections 1:676dfdd56ad2 0.07 6.49 additionalinformation -cv-boxed_sections 1:f20997652453 0.04 0.10 languages:english(fluent),german -cv-boxed_sections 1:ec9d3622395e 0.04 0.10 workeligibility:eligibletoworkin -cv-boxed_sections 1:dd20ae01c3cf 0.05 0.10 opensource:maintainerofgraphcomp -cv-boxed_sections 1:33c35e9d236d 0.05 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-boxed_sections 1:f20997652453 0.14 0.10 languages:english(fluent),german +cv-boxed_sections 1:ec9d3622395e 0.14 0.10 workeligibility:eligibletoworkin +cv-boxed_sections 1:dd20ae01c3cf 0.15 0.10 opensource:maintainerofgraphcomp +cv-boxed_sections 1:33c35e9d236d 0.15 0.10 speaking:jvmsummit2024,devoxxuk2 cv-centered_headline 0:8f1010120ed6 -0.05 2.39 jordanrivera cv-centered_headline 0:87ca614d0eab -0.03 1.36 professionaltitle cv-centered_headline 0:8d7a2cca3060 0.02 0.28 +442055551000|jordan.rivera@exam -cv-centered_headline 0:b944906ed84c -0.03 0.10 professionalsummary +cv-centered_headline 0:b944906ed84c 0.02 0.10 professionalsummary cv-centered_headline 0:f43d42692f27 0.06 0.10 platformengineerwith10+yearsbuil -cv-centered_headline 0:5f94c50dc5bf 0.00 0.10 technicalskills -cv-centered_headline 0:eea537278f83 -0.21 0.10 •languages:java21,kotlin,groovy, -cv-centered_headline 0:9c2cd7231a53 -0.20 0.10 •document&print:pdfbox,apachepoi -cv-centered_headline 0:7bf8639ec5d3 -0.19 0.10 •layoutengines:customdsldesign,s -cv-centered_headline 0:8e66776d28d7 -0.18 0.10 •build&infrastructure:maven,grad -cv-centered_headline 0:1ed4fc7d7768 -0.17 0.10 •testing:junit5,assertj,pdfbox-b -cv-centered_headline 0:26671c309eb9 -0.16 0.10 •distribution:mavencentral,sonat -cv-centered_headline 0:68bf0109c6f8 0.06 0.10 education +cv-centered_headline 0:5f94c50dc5bf 0.05 0.10 technicalskills +cv-centered_headline 0:eea537278f83 0.09 0.10 •languages:java21,kotlin,groovy, +cv-centered_headline 0:9c2cd7231a53 0.10 0.10 •document&print:pdfbox,apachepoi +cv-centered_headline 0:7bf8639ec5d3 0.11 0.10 •layoutengines:customdsldesign,s +cv-centered_headline 0:8e66776d28d7 0.12 0.10 •build&infrastructure:maven,grad +cv-centered_headline 0:1ed4fc7d7768 0.13 0.10 •testing:junit5,assertj,pdfbox-b +cv-centered_headline 0:26671c309eb9 0.14 0.10 •distribution:mavencentral,sonat +cv-centered_headline 0:68bf0109c6f8 0.11 0.10 education cv-centered_headline 0:0ad1957d6bab -0.19 0.10 msccomputerscience -cv-centered_headline 0:3fa772117260 -0.20 0.68 2019-2021 -cv-centered_headline 0:3fa772117260#1 -0.29 0.68 2019-2021 +cv-centered_headline 0:3fa772117260 0.10 0.68 2019-2021 +cv-centered_headline 0:3fa772117260#1 0.01 0.68 2019-2021 cv-centered_headline 0:47ce0218bbea 0.04 0.10 universityofmanchester -cv-centered_headline 0:2ffe115b06e5 0.01 0.10 distinction.thesis:composablelay +cv-centered_headline 0:2ffe115b06e5 0.06 0.10 distinction.thesis:composablelay cv-centered_headline 0:b6749d0b616b -0.27 0.10 bscsoftwareengineering -cv-centered_headline 0:30f9262640a0 -0.28 0.68 2015-2019 +cv-centered_headline 0:30f9262640a0 0.02 0.68 2015-2019 cv-centered_headline 0:89ad9656f393 -0.04 0.10 imperialcollegelondon -cv-centered_headline 0:baa173b4a82e 0.03 0.10 first-classhonours.specialisatio +cv-centered_headline 0:baa173b4a82e 0.08 0.10 first-classhonours.specialisatio cv-centered_headline 0:6d3d5673c39f -0.25 0.10 oraclejavacertification -cv-centered_headline 0:d40b22f00acb -0.26 0.68 2023-2024 +cv-centered_headline 0:d40b22f00acb 0.04 0.68 2023-2024 cv-centered_headline 0:2669e1f6d55c -0.02 0.10 professionaltrack -cv-centered_headline 0:3857373829c1 0.05 0.10 java17platformdeep-dive:records, -cv-centered_headline 0:2577c0f557b2 0.02 0.10 projects -cv-centered_headline 0:0f2c67872251 -0.14 0.10 graphcompose(java21,pdfbox,maven +cv-centered_headline 0:3857373829c1 0.10 0.10 java17platformdeep-dive:records, +cv-centered_headline 0:2577c0f557b2 0.07 0.10 projects +cv-centered_headline 0:0f2c67872251 0.11 0.10 graphcompose(java21,pdfbox,maven cv-centered_headline 0:67593a76ef70 0.12 0.10 declarativejavapdflayoutengine.s cv-centered_headline 0:b9292cbd1454 0.13 0.10 pipelinesforhiringtoolsandbillin -cv-centered_headline 0:d73d02174dc9 -0.01 0.10 templatestudio(kotlin,composedes -cv-centered_headline 0:836e76daecbf 0.00 0.10 internaltoolforevaluatingcv,prop -cv-centered_headline 0:542ec793b5b1 0.01 0.10 layoutlint(java21,javaparser,spo -cv-centered_headline 0:dc31b6a18325 0.02 0.10 staticanalyserthatflagsfragileau -cv-centered_headline 0:ee180ea1e0a5 0.03 0.10 chromeforge(java,graphcompose,pa -cv-centered_headline 0:e7e62230eb1f 0.04 0.10 editorial-magazinedocumenttoolki -cv-centered_headline 0:c2f296ef30a3 0.01 0.10 professionalexperience +cv-centered_headline 0:d73d02174dc9 0.04 0.10 templatestudio(kotlin,composedes +cv-centered_headline 0:836e76daecbf 0.05 0.10 internaltoolforevaluatingcv,prop +cv-centered_headline 0:542ec793b5b1 0.06 0.10 layoutlint(java21,javaparser,spo +cv-centered_headline 0:dc31b6a18325 0.07 0.10 staticanalyserthatflagsfragileau +cv-centered_headline 0:ee180ea1e0a5 0.08 0.10 chromeforge(java,graphcompose,pa +cv-centered_headline 0:e7e62230eb1f 0.09 0.10 editorial-magazinedocumenttoolki +cv-centered_headline 0:c2f296ef30a3 0.06 0.10 professionalexperience cv-centered_headline 0:a76f47480818 -0.24 0.10 seniorplatformengineer -cv-centered_headline 0:060300b18051 -0.25 0.82 2024-present +cv-centered_headline 0:060300b18051 0.05 0.82 2024-present cv-centered_headline 0:f890faef907f -0.01 0.10 northwindsystems cv-centered_headline 0:49faf14f1f56 0.11 0.10 ledthereusabledocument-generatio cv-centered_headline 0:6bd3f168e89e 0.12 0.10 maintenancetimeby70%byretiringpe cv-centered_headline 0:daf65306b3b6 -0.21 0.10 softwareengineer -cv-centered_headline 0:e7cc1822c6dc -0.22 0.68 2021-2024 +cv-centered_headline 0:e7cc1822c6dc 0.08 0.68 2021-2024 cv-centered_headline 0:998c1a985022 0.02 0.10 brightleaflabs cv-centered_headline 0:f0e2046536d3 0.04 0.10 builtbackendservicesandproductio cv-centered_headline 0:4eb608992328 0.05 0.10 toacustomlayoutengine,eliminatin @@ -164,20 +162,20 @@ cv-centered_headline 0:41bb54fbae8d -0.28 0.10 backendengineer cv-centered_headline 0:ef148f221e31 -0.25 0.10 helixprintco cv-centered_headline 1:9d31a6bfbc69 0.36 0.10 maintainedahigh-volumeinvoice-pr cv-centered_headline 1:03af8a628309 0.37 0.10 change. -cv-centered_headline 1:676dfdd56ad2 0.29 0.10 additionalinformation -cv-centered_headline 1:f20997652453 0.33 0.10 languages:english(fluent),german -cv-centered_headline 1:ec9d3622395e 0.34 0.10 workeligibility:eligibletoworkin -cv-centered_headline 1:dd20ae01c3cf 0.35 0.10 opensource:maintainerofgraphcomp -cv-centered_headline 1:33c35e9d236d 0.11 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-charcoal_gold 0:73423c7707c4 0.26 0.09 anastasia -cv-charcoal_gold 0:6627835f988e -0.20 0.09 smith -cv-charcoal_gold 0:093e7d5fdbaa -0.23 -0.70 contact +cv-centered_headline 1:676dfdd56ad2 0.34 0.10 additionalinformation +cv-centered_headline 1:f20997652453 0.38 0.10 languages:english(fluent),german +cv-centered_headline 1:ec9d3622395e 0.39 0.10 workeligibility:eligibletoworkin +cv-centered_headline 1:dd20ae01c3cf 0.40 0.10 opensource:maintainerofgraphcomp +cv-centered_headline 1:33c35e9d236d 0.41 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-charcoal_gold 0:73423c7707c4 0.06 0.09 anastasia +cv-charcoal_gold 0:6627835f988e 0.00 0.09 smith +cv-charcoal_gold 0:093e7d5fdbaa 0.02 0.15 contact cv-charcoal_gold 0:a8acc3a90a7b -0.01 0.21 +447700900123 cv-charcoal_gold 0:0126a18bf252 -0.01 0.21 hello@anastasiasmith.com cv-charcoal_gold 0:92966f349443 -0.01 0.20 london,unitedkingdom cv-charcoal_gold 0:42535367bd3c -0.01 0.21 anastasiasmith.com cv-charcoal_gold 0:d5d2c85de2b9 -0.01 0.21 linkedin.com/in/anastasiasmith -cv-charcoal_gold 0:32c1cf49a2fe -0.23 -0.70 skills +cv-charcoal_gold 0:32c1cf49a2fe 0.02 0.15 skills cv-charcoal_gold 0:340455fbac25 -0.21 0.10 projectmanagement cv-charcoal_gold 0:03cd52ebdc67 -0.21 0.10 budgeting&forecasting cv-charcoal_gold 0:115925c1b96b -0.21 0.10 stakeholdercommunication @@ -188,16 +186,16 @@ cv-charcoal_gold 0:c7b5692b2d27 -0.21 0.10 microsoftexcel cv-charcoal_gold 0:2e2c6b2f5ad9 -0.21 0.10 powerbi cv-charcoal_gold 0:f73b1d7d3bc6 -0.21 0.10 jira/confluence cv-charcoal_gold 0:b011cfad056f -0.21 0.10 agilemethodologies -cv-charcoal_gold 0:6cb574fa10b6 -0.23 -0.70 languages -cv-charcoal_gold 0:b6234d2ea0d6 -0.24 0.10 english -cv-charcoal_gold 0:bef32d2c315a -0.24 0.08 native -cv-charcoal_gold 0:bef32d2c315a#1 -0.24 0.08 native -cv-charcoal_gold 0:aa304b5d1d72 -0.24 0.10 russian -cv-charcoal_gold 0:21bb36ad0638 -0.24 0.10 french -cv-charcoal_gold 0:23ed645595d6 -0.24 0.08 b2–upperintermediate -cv-charcoal_gold 0:28561c6b68fc -0.24 0.10 german -cv-charcoal_gold 0:3cb3c2736bad -0.24 0.08 a2–basic -cv-charcoal_gold 0:68bf0109c6f8 -0.23 -0.70 education +cv-charcoal_gold 0:6cb574fa10b6 0.02 0.15 languages +cv-charcoal_gold 0:b6234d2ea0d6 0.06 0.10 english +cv-charcoal_gold 0:bef32d2c315a 0.06 0.08 native +cv-charcoal_gold 0:bef32d2c315a#1 0.06 0.08 native +cv-charcoal_gold 0:aa304b5d1d72 0.06 0.10 russian +cv-charcoal_gold 0:21bb36ad0638 0.06 0.10 french +cv-charcoal_gold 0:23ed645595d6 0.06 0.08 b2–upperintermediate +cv-charcoal_gold 0:28561c6b68fc 0.06 0.10 german +cv-charcoal_gold 0:3cb3c2736bad 0.06 0.08 a2–basic +cv-charcoal_gold 0:68bf0109c6f8 0.02 0.15 education cv-charcoal_gold 0:48f12eb2ea0d -0.01 0.61 mscprojectmanagement cv-charcoal_gold 0:ede0c8c47a1f -0.01 0.10 universitycollegelondon cv-charcoal_gold 0:fc3f0389b9de -0.01 0.10 2018–2019 @@ -210,7 +208,7 @@ cv-charcoal_gold 0:f54e0195601a 0.01 0.09 results-drivenprojectmanagerwith cv-charcoal_gold 0:7a0497cef9c6 0.01 0.09 teamsanddeliveringcomplexproject cv-charcoal_gold 0:c38f1902ece8 0.24 0.09 skilledinagileandwaterfallmethod cv-charcoal_gold 0:ca94787c6c7a -0.46 0.09 management.passionateaboutdrivin -cv-charcoal_gold 0:53e5e7c5a884 -0.36 -0.71 experience +cv-charcoal_gold 0:53e5e7c5a884 -0.06 0.14 experience cv-charcoal_gold 0:086c0e036e67 -0.30 0.09 2021–present cv-charcoal_gold 0:eddc2d311872 -0.06 0.06 seniorprojectmanager cv-charcoal_gold 0:243953e20dc4 -0.11 0.06 digitalsolutionsltd·london,uk @@ -230,7 +228,7 @@ cv-charcoal_gold 0:77aec5bb6b7f -0.21 0.06 •supportedprojectmanagersinplann cv-charcoal_gold 0:38dafe4a1765 -0.19 0.06 •preparedreports,dashboards,andd cv-charcoal_gold 0:5c95a9041b72 -0.17 0.06 •coordinatedmeetingsandtrackedac cv-charcoal_gold 0:f0d87e2131e2 -0.15 0.06 •improvedinternalprocessesandpro -cv-charcoal_gold 0:e831beb04c00 -0.34 0.14 certifications +cv-charcoal_gold 0:e831beb04c00 -0.04 0.14 certifications cv-charcoal_gold 0:93a7ba535da0 -0.08 0.10 pmp®certification cv-charcoal_gold 0:0f9f6d10bfa3 -0.04 0.10 projectmanagementinstitute cv-charcoal_gold 0:73a2af8864fc -0.22 0.10 2020 @@ -241,7 +239,7 @@ cv-charcoal_gold 0:023e33504ab9 -0.24 0.10 2019 cv-charcoal_gold 0:023e33504ab9#1 -0.26 0.10 2019 cv-charcoal_gold 0:83cd2e790f6a -0.12 0.10 agilepm®foundation cv-charcoal_gold 0:0005e5872534 -0.08 0.10 apmginternational -cv-charcoal_gold 0:6ee18b42fbf1 -0.34 0.09 achievements +cv-charcoal_gold 0:6ee18b42fbf1 -0.04 0.09 achievements cv-charcoal_gold 0:3f06e4a3eb33 -0.08 0.00 excellenceindeliveryaward cv-charcoal_gold 0:0c373352626d -0.04 0.00 digitalsolutionsltd cv-charcoal_gold 0:d398b29d3dbb -0.22 0.00 2023 @@ -250,76 +248,76 @@ cv-charcoal_gold 0:6517b58450f7 -0.06 0.00 increasedefficiencyby30% cv-charcoal_gold 0:b1ab1e892617 -0.24 0.00 2022 cv-charcoal_gold 0:c2f5106fbd5a -0.12 0.00 topperformer cv-charcoal_gold 0:058521fbf0d1 -0.08 0.00 innovatechsystems -cv-charcoal_gold 0:3def82282260 -0.40 -0.71 technicaltools +cv-charcoal_gold 0:3def82282260 -0.10 0.14 technicaltools cv-charcoal_gold 0:eb04bd42c7fb -0.34 -1.19 microsoft365|jira|confluence|asa -cv-classic_serif 0:8f1010120ed6 -0.15 2.60 jordanrivera -cv-classic_serif 0:8d7a2cca3060 -0.01 -0.52 +442055551000|jordan.rivera@exam -cv-classic_serif 0:3c69d6bb4892 0.04 20.27 professionalprofile -cv-classic_serif 0:32c1cf49a2fe 0.09 0.10 skills +cv-classic_serif 0:8f1010120ed6 0.00 2.60 jordanrivera +cv-classic_serif 0:8d7a2cca3060 0.14 -0.52 +442055551000|jordan.rivera@exam +cv-classic_serif 0:3c69d6bb4892 0.09 20.27 professionalprofile +cv-classic_serif 0:32c1cf49a2fe 0.14 0.10 skills cv-classic_serif 0:873a24d153c8 0.11 0.10 languages:java21,kotlin,groovy,p cv-classic_serif 0:05e907ef2b18 0.09 0.10 document&print:pdfbox,apachepoi( cv-classic_serif 0:76656a8a6621 0.06 0.10 layoutengines:customdsldesign,se cv-classic_serif 0:1cd141fef347 0.04 0.10 build&infrastructure:maven,gradl cv-classic_serif 0:181ddda7f959 0.01 0.10 testing:junit5,assertj,pdfbox-ba cv-classic_serif 0:c40c656d9558 -0.01 0.10 distribution:mavencentral,sonaty -cv-classic_serif 0:53e5e7c5a884 -0.05 0.10 experience -cv-classic_serif 0:a76f47480818 -0.04 0.10 seniorplatformengineer -cv-classic_serif 0:060300b18051 -0.07 0.26 2024-present -cv-classic_serif 0:f890faef907f -0.06 0.10 northwindsystems +cv-classic_serif 0:53e5e7c5a884 0.00 0.10 experience +cv-classic_serif 0:a76f47480818 0.01 0.10 seniorplatformengineer +cv-classic_serif 0:060300b18051 0.08 0.26 2024-present +cv-classic_serif 0:f890faef907f 0.09 0.10 northwindsystems cv-classic_serif 0:49faf14f1f56 -0.09 0.10 ledthereusabledocument-generatio cv-classic_serif 0:6bd3f168e89e -0.10 0.10 maintenancetimeby70%byretiringpe -cv-classic_serif 0:daf65306b3b6 -0.02 0.10 softwareengineer -cv-classic_serif 0:e7cc1822c6dc -0.05 1.12 2021-2024 -cv-classic_serif 0:998c1a985022 -0.04 0.10 brightleaflabs +cv-classic_serif 0:daf65306b3b6 0.03 0.10 softwareengineer +cv-classic_serif 0:e7cc1822c6dc 0.10 1.12 2021-2024 +cv-classic_serif 0:998c1a985022 0.11 0.10 brightleaflabs cv-classic_serif 0:e55664011cda -0.07 0.10 builtbackendservicesandproductio cv-classic_serif 0:e80236b6d2b1 -0.08 0.10 itexttoacustomlayoutengine,elimi -cv-classic_serif 0:41bb54fbae8d -0.01 0.10 backendengineer -cv-classic_serif 0:3fa772117260 -0.04 1.12 2019-2021 -cv-classic_serif 0:3fa772117260#1 -0.02 1.12 2019-2021 -cv-classic_serif 0:ef148f221e31 -0.03 0.10 helixprintco +cv-classic_serif 0:41bb54fbae8d 0.04 0.10 backendengineer +cv-classic_serif 0:3fa772117260 0.11 1.12 2019-2021 +cv-classic_serif 0:3fa772117260#1 0.13 1.12 2019-2021 +cv-classic_serif 0:ef148f221e31 0.12 0.10 helixprintco cv-classic_serif 0:9d31a6bfbc69 -0.06 0.10 maintainedahigh-volumeinvoice-pr cv-classic_serif 0:03af8a628309 -0.07 0.10 change. -cv-classic_serif 0:2577c0f557b2 0.00 0.10 projects -cv-classic_serif 0:0f2c67872251 0.01 0.10 graphcompose(java21,pdfbox,maven +cv-classic_serif 0:2577c0f557b2 0.05 0.10 projects +cv-classic_serif 0:0f2c67872251 0.06 0.10 graphcompose(java21,pdfbox,maven cv-classic_serif 0:67593a76ef70 -0.06 0.10 declarativejavapdflayoutengine.s cv-classic_serif 0:b9292cbd1454 -0.07 0.10 pipelinesforhiringtoolsandbillin -cv-classic_serif 0:d73d02174dc9 0.00 0.10 templatestudio(kotlin,composedes +cv-classic_serif 0:d73d02174dc9 0.05 0.10 templatestudio(kotlin,composedes cv-classic_serif 0:836e76daecbf -0.02 0.10 internaltoolforevaluatingcv,prop -cv-classic_serif 0:542ec793b5b1 0.00 0.10 layoutlint(java21,javaparser,spo +cv-classic_serif 0:542ec793b5b1 0.05 0.10 layoutlint(java21,javaparser,spo cv-classic_serif 0:dc31b6a18325 -0.02 0.10 staticanalyserthatflagsfragileau -cv-classic_serif 0:ee180ea1e0a5 0.00 0.10 chromeforge(java,graphcompose,pa +cv-classic_serif 0:ee180ea1e0a5 0.05 0.10 chromeforge(java,graphcompose,pa cv-classic_serif 0:e7e62230eb1f -0.02 0.10 editorial-magazinedocumenttoolki -cv-classic_serif 0:68bf0109c6f8 0.00 0.10 education -cv-classic_serif 0:0ad1957d6bab 0.01 0.10 msccomputerscience -cv-classic_serif 0:47ce0218bbea -0.01 0.10 universityofmanchester +cv-classic_serif 0:68bf0109c6f8 0.05 0.10 education +cv-classic_serif 0:0ad1957d6bab 0.06 0.10 msccomputerscience +cv-classic_serif 0:47ce0218bbea 0.14 0.10 universityofmanchester cv-classic_serif 0:2ffe115b06e5 0.01 0.10 distinction.thesis:composablelay -cv-classic_serif 0:b6749d0b616b 0.03 0.10 bscsoftwareengineering -cv-classic_serif 0:30f9262640a0 0.00 1.12 2015-2019 -cv-classic_serif 1:89ad9656f393 0.16 0.10 imperialcollegelondon +cv-classic_serif 0:b6749d0b616b 0.08 0.10 bscsoftwareengineering +cv-classic_serif 0:30f9262640a0 0.15 1.12 2015-2019 +cv-classic_serif 1:89ad9656f393 0.11 0.10 imperialcollegelondon cv-classic_serif 1:baa173b4a82e -0.02 0.10 first-classhonours.specialisatio -cv-classic_serif 1:6d3d5673c39f 0.00 0.10 oraclejavacertification -cv-classic_serif 1:d40b22f00acb -0.03 1.12 2023-2024 -cv-classic_serif 1:2669e1f6d55c -0.02 0.10 professionaltrack +cv-classic_serif 1:6d3d5673c39f 0.05 0.10 oraclejavacertification +cv-classic_serif 1:d40b22f00acb 0.12 1.12 2023-2024 +cv-classic_serif 1:2669e1f6d55c 0.13 0.10 professionaltrack cv-classic_serif 1:3857373829c1 0.00 0.10 java17platformdeep-dive:records, -cv-classic_serif 1:7b476727faf3 0.03 0.10 additional +cv-classic_serif 1:7b476727faf3 0.08 0.10 additional cv-classic_serif 1:f20997652453 0.04 0.10 languages:english(fluent),german cv-classic_serif 1:ec9d3622395e 0.02 0.10 workeligibility:eligibletoworkin cv-classic_serif 1:dd20ae01c3cf -0.01 0.10 opensource:maintainerofgraphcomp cv-classic_serif 1:33c35e9d236d -0.03 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-compact_mono 0:8f1010120ed6 -0.04 0.10 jordanrivera +cv-compact_mono 0:8f1010120ed6 0.01 0.10 jordanrivera cv-compact_mono 0:f9e4560bd641 0.01 0.10 london,uk/+442055551000/jordan.r cv-compact_mono 0:32c1cf49a2fe -0.01 0.10 skills -cv-compact_mono 0:551282493299 -0.06 0.10 languagesjava21,kotlin,groovy,py -cv-compact_mono 0:8f5cfd05d621 -0.07 0.10 document&printpdfbox,apachepoi -cv-compact_mono 0:148ff6990529 0.04 0.10 (docx/xlsx),itext,postscript -cv-compact_mono 0:862bd50bcc32 -0.05 0.10 layoutenginescustomdsldesign,sem -cv-compact_mono 0:ec4f3e745260 0.06 0.10 layouttrees,pagination,snapshott -cv-compact_mono 0:55a8b2742c06 -0.03 0.10 build&infrastructuremaven,gradle -cv-compact_mono 0:1649ba79bc7a 0.08 0.10 actions,jitpack -cv-compact_mono 0:d4ac2ee01f81 -0.01 0.10 testingjunit5,assertj,pdfbox-bas -cv-compact_mono 0:b04e6ebfb02b 0.10 0.10 diff,layout-graphsnapshots -cv-compact_mono 0:93c9f742ef14 0.01 0.10 distributionmavencentral,sonatyp -cv-compact_mono 0:8f21bd149ad7 0.12 0.10 gpgsigning,jitpack +cv-compact_mono 0:551282493299 -0.01 0.10 languagesjava21,kotlin,groovy,py +cv-compact_mono 0:8f5cfd05d621 -0.02 0.10 document&printpdfbox,apachepoi +cv-compact_mono 0:148ff6990529 0.09 0.10 (docx/xlsx),itext,postscript +cv-compact_mono 0:862bd50bcc32 0.00 0.10 layoutenginescustomdsldesign,sem +cv-compact_mono 0:ec4f3e745260 0.11 0.10 layouttrees,pagination,snapshott +cv-compact_mono 0:55a8b2742c06 0.02 0.10 build&infrastructuremaven,gradle +cv-compact_mono 0:1649ba79bc7a 0.13 0.10 actions,jitpack +cv-compact_mono 0:d4ac2ee01f81 0.04 0.10 testingjunit5,assertj,pdfbox-bas +cv-compact_mono 0:b04e6ebfb02b 0.15 0.10 diff,layout-graphsnapshots +cv-compact_mono 0:93c9f742ef14 0.06 0.10 distributionmavencentral,sonatyp +cv-compact_mono 0:8f21bd149ad7 0.17 0.10 gpgsigning,jitpack cv-compact_mono 0:68bf0109c6f8 0.08 0.10 education cv-compact_mono 0:9ad8d9ef1711 0.08 0.10 msccomputerscience/universityof cv-compact_mono 0:594f6dd11e20 0.15 0.10 manchester/2019-2021 @@ -328,29 +326,29 @@ cv-compact_mono 0:453806946a88 0.25 0.10 london/2015-2019 cv-compact_mono 0:7816e7a28b71 0.08 0.10 oraclejavacertification/professi cv-compact_mono 0:d40b22f00acb 0.30 0.10 2023-2024 cv-compact_mono 0:7b476727faf3 0.06 0.10 additional -cv-compact_mono 0:ecc25e73b19b 0.05 0.10 languages:english(fluent),german -cv-compact_mono 0:ac7f0ee6a49e 0.06 0.10 (intermediate),spanish(basic) -cv-compact_mono 0:970ca9d789c2 0.07 0.10 workeligibility:eligibletoworkin -cv-compact_mono 0:0735680e2596 0.08 0.10 theeu -cv-compact_mono 0:8051a4b5e34f 0.09 0.10 opensource:maintainerofgraphcomp -cv-compact_mono 0:08c2e869a75b 0.10 0.10 regularcontributortopdfboxissuet -cv-compact_mono 0:12dcd1343975 0.11 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-compact_mono 0:3aea7f90f8ed 0.12 0.10 —bothondeclarativedocumentlayout +cv-compact_mono 0:ecc25e73b19b 0.10 0.10 languages:english(fluent),german +cv-compact_mono 0:ac7f0ee6a49e 0.11 0.10 (intermediate),spanish(basic) +cv-compact_mono 0:970ca9d789c2 0.12 0.10 workeligibility:eligibletoworkin +cv-compact_mono 0:0735680e2596 0.13 0.10 theeu +cv-compact_mono 0:8051a4b5e34f 0.14 0.10 opensource:maintainerofgraphcomp +cv-compact_mono 0:08c2e869a75b 0.15 0.10 regularcontributortopdfboxissuet +cv-compact_mono 0:12dcd1343975 0.16 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-compact_mono 0:3aea7f90f8ed 0.17 0.10 —bothondeclarativedocumentlayout cv-compact_mono 0:1900eab6c028 -0.01 0.09 profile -cv-compact_mono 0:3828b9718a0d -0.50 0.09 platformengineerwith10+yearsbuil -cv-compact_mono 0:f6b5e93ccadd -0.49 0.09 engines,anddeveloper-facingtempl -cv-compact_mono 0:927ef106776a -0.48 0.09 semanticauthoringdsls,andturning -cv-compact_mono 0:330fcb75ed52 -0.47 0.09 librariesthatscale. +cv-compact_mono 0:3828b9718a0d 0.00 0.09 platformengineerwith10+yearsbuil +cv-compact_mono 0:f6b5e93ccadd 0.01 0.09 engines,anddeveloper-facingtempl +cv-compact_mono 0:927ef106776a 0.02 0.09 semanticauthoringdsls,andturning +cv-compact_mono 0:330fcb75ed52 0.03 0.09 librariesthatscale. cv-compact_mono 0:53e5e7c5a884 0.01 0.09 experience -cv-compact_mono 0:c9efb118bfda -0.04 0.09 seniorplatformengineer,northwind -cv-compact_mono 0:64c4b52dceb1 -0.04 0.09 ledthereusabledocument-generatio -cv-compact_mono 0:1f193cd1d987 -0.02 0.09 productteams.reducedtemplatemain -cv-compact_mono 0:9ccc3e904e5a 0.00 0.09 favourofonecanonicalengine. -cv-compact_mono 0:e21e4e47835a 0.01 0.09 softwareengineer,brightleaflabs| -cv-compact_mono 0:0cdd48f05f9d 0.01 0.09 builtbackendservicesandproductio -cv-compact_mono 0:e48f1e2c853d 0.03 0.09 permonth.drovethemigrationfromit -cv-compact_mono 0:b78a9a72ca9a 0.05 0.09 andcuttingp99renderlatencyfrom1. -cv-compact_mono 0:9f5d87c00954 -0.04 0.09 backendengineer,helixprintco|201 +cv-compact_mono 0:c9efb118bfda 0.01 0.09 seniorplatformengineer,northwind +cv-compact_mono 0:64c4b52dceb1 0.01 0.09 ledthereusabledocument-generatio +cv-compact_mono 0:1f193cd1d987 0.03 0.09 productteams.reducedtemplatemain +cv-compact_mono 0:9ccc3e904e5a 0.05 0.09 favourofonecanonicalengine. +cv-compact_mono 0:e21e4e47835a 0.06 0.09 softwareengineer,brightleaflabs| +cv-compact_mono 0:0cdd48f05f9d 0.06 0.09 builtbackendservicesandproductio +cv-compact_mono 0:e48f1e2c853d 0.08 0.09 permonth.drovethemigrationfromit +cv-compact_mono 0:b78a9a72ca9a 0.10 0.09 andcuttingp99renderlatencyfrom1. +cv-compact_mono 0:9f5d87c00954 0.01 0.09 backendengineer,helixprintco|201 cv-compact_mono 0:a485c37fe7ea 0.01 0.09 maintainedahigh-volumeinvoice-pr cv-compact_mono 0:5a136b6b9d8c 0.03 0.09 testharnessthatgatedeverytemplat cv-compact_mono 0:d94eccbb1fbe -0.01 0.09 selectedprojects @@ -446,53 +444,53 @@ cv-editorial_blue 1:ec9d3622395e 0.00 0.10 workeligibility:eligibletoworkin cv-editorial_blue 1:dd20ae01c3cf 0.00 0.10 opensource:maintainerofgraphcomp cv-editorial_blue 1:33c35e9d236d 0.01 0.10 speaking:jvmsummit2024,devoxxuk2 cv-editorial_blue 1:0b516aa076e0 0.03 0.13 referencesavailableuponrequest. -cv-engineering_resume 0:8f1010120ed6 0.15 15.10 jordanrivera -cv-engineering_resume 0:2d58f0cadc2d -0.25 15.10 platformengineer -cv-engineering_resume 0:fbeea547d99e -0.01 15.31 london,uk -cv-engineering_resume 0:89674e6f130e 0.00 15.34 +442055551000 -cv-engineering_resume 0:e0f850305ded 0.01 15.20 jordan.rivera@example.com -cv-engineering_resume 0:84308bea4540 0.02 15.95 linkedin -cv-engineering_resume 0:c0b0109d9439 -0.17 15.85 github +cv-engineering_resume 0:8f1010120ed6 0.00 15.10 jordanrivera +cv-engineering_resume 0:2d58f0cadc2d 0.00 15.10 platformengineer +cv-engineering_resume 0:fbeea547d99e 0.04 15.31 london,uk +cv-engineering_resume 0:89674e6f130e 0.05 15.34 +442055551000 +cv-engineering_resume 0:e0f850305ded 0.06 15.20 jordan.rivera@example.com +cv-engineering_resume 0:84308bea4540 0.07 15.95 linkedin +cv-engineering_resume 0:c0b0109d9439 0.08 15.85 github cv-engineering_resume 0:32c1cf49a2fe -0.30 0.10 skills cv-engineering_resume 0:873a24d153c8 -0.04 0.10 languages:java21,kotlin,groovy,p -cv-engineering_resume 0:db84150190bb -0.08 0.10 document&print:pdfbox,apachepoi -cv-engineering_resume 0:69d03fef7130 -0.07 0.10 (docx/xlsx),itext,postscript,icc -cv-engineering_resume 0:d52fd337f016 -0.06 0.10 profiles -cv-engineering_resume 0:f93032b34754 -0.05 0.10 layoutengines:customdsldesign,se -cv-engineering_resume 0:2d6fa255ba3a -0.04 0.10 layouttrees,pagination,snapshott -cv-engineering_resume 0:f274537aaf2c -0.03 0.10 regression -cv-engineering_resume 0:45fcec9fa26d -0.02 0.10 build&infrastructure:maven,gradl -cv-engineering_resume 0:33ddf84f4bab -0.01 0.10 actions,jitpack,docker -cv-engineering_resume 0:af23376e2ec2 -0.10 0.10 testing:junit5,assertj,pdfbox-ba -cv-engineering_resume 0:a8c30cabf363 -0.09 0.10 diff,layout-graphsnapshots,mutat -cv-engineering_resume 0:7c093617a679 -0.08 0.10 (pitest) -cv-engineering_resume 0:11ca7190fe83 -0.07 0.10 distribution:mavencentral,sonaty -cv-engineering_resume 0:768ad260251b -0.06 0.10 gpgsigning,jitpack,semanticversi -cv-engineering_resume 0:d43c8bd5797a -0.05 0.10 discipline +cv-engineering_resume 0:db84150190bb -0.03 0.10 document&print:pdfbox,apachepoi +cv-engineering_resume 0:69d03fef7130 -0.02 0.10 (docx/xlsx),itext,postscript,icc +cv-engineering_resume 0:d52fd337f016 -0.01 0.10 profiles +cv-engineering_resume 0:f93032b34754 0.00 0.10 layoutengines:customdsldesign,se +cv-engineering_resume 0:2d6fa255ba3a 0.01 0.10 layouttrees,pagination,snapshott +cv-engineering_resume 0:f274537aaf2c 0.02 0.10 regression +cv-engineering_resume 0:45fcec9fa26d 0.03 0.10 build&infrastructure:maven,gradl +cv-engineering_resume 0:33ddf84f4bab 0.04 0.10 actions,jitpack,docker +cv-engineering_resume 0:af23376e2ec2 -0.05 0.10 testing:junit5,assertj,pdfbox-ba +cv-engineering_resume 0:a8c30cabf363 -0.04 0.10 diff,layout-graphsnapshots,mutat +cv-engineering_resume 0:7c093617a679 -0.03 0.10 (pitest) +cv-engineering_resume 0:11ca7190fe83 -0.02 0.10 distribution:mavencentral,sonaty +cv-engineering_resume 0:768ad260251b -0.01 0.10 gpgsigning,jitpack,semanticversi +cv-engineering_resume 0:d43c8bd5797a 0.00 0.10 discipline cv-engineering_resume 0:68bf0109c6f8 0.02 0.10 education cv-engineering_resume 0:5f9c672fafaf -0.02 0.10 msccomputerscience/2019-2021 cv-engineering_resume 0:141310eca6fb -0.01 0.10 bscsoftwareengineering/2015-2019 cv-engineering_resume 0:608c03298f47 -0.10 0.10 oraclejavacertification/2023-202 cv-engineering_resume 0:41ffd8b76afc -0.08 0.10 details -cv-engineering_resume 0:ecc25e73b19b -0.17 0.10 languages:english(fluent),german -cv-engineering_resume 0:ac7f0ee6a49e -0.16 0.10 (intermediate),spanish(basic) -cv-engineering_resume 0:970ca9d789c2 -0.15 0.10 workeligibility:eligibletoworkin -cv-engineering_resume 0:0735680e2596 -0.14 0.10 theeu -cv-engineering_resume 0:e8256e23459a -0.35 0.10 engineeringprofile -cv-engineering_resume 0:e9b75496bfb4 -0.45 0.10 platformengineerwith10+yearsbuil -cv-engineering_resume 0:866be9f7a132 -0.45 0.10 developer-facingtemplatesystems. -cv-engineering_resume 0:82c1650fbfe8 -0.45 0.10 dsls,andturningbrittleproduction +cv-engineering_resume 0:ecc25e73b19b -0.12 0.10 languages:english(fluent),german +cv-engineering_resume 0:ac7f0ee6a49e -0.11 0.10 (intermediate),spanish(basic) +cv-engineering_resume 0:970ca9d789c2 -0.10 0.10 workeligibility:eligibletoworkin +cv-engineering_resume 0:0735680e2596 -0.09 0.10 theeu +cv-engineering_resume 0:e8256e23459a 0.00 0.10 engineeringprofile +cv-engineering_resume 0:e9b75496bfb4 -0.05 0.10 platformengineerwith10+yearsbuil +cv-engineering_resume 0:866be9f7a132 -0.05 0.10 developer-facingtemplatesystems. +cv-engineering_resume 0:82c1650fbfe8 -0.05 0.10 dsls,andturningbrittleproduction cv-engineering_resume 0:53e5e7c5a884 -0.05 0.10 experience -cv-engineering_resume 0:4977534824cc -0.26 0.10 seniorplatformengineer/2024-pres +cv-engineering_resume 0:4977534824cc -0.01 0.10 seniorplatformengineer/2024-pres cv-engineering_resume 0:f890faef907f -0.02 0.10 northwindsystems -cv-engineering_resume 0:0bf7eb0b1058 -0.46 0.10 ledthereusabledocument-generatio -cv-engineering_resume 0:d69cae607226 -0.45 0.10 teams.reducedtemplatemaintenance -cv-engineering_resume 0:bdea17333528 -0.42 0.10 engine. -cv-engineering_resume 0:7033b2988e4d -0.27 0.10 softwareengineer/2021-2024 +cv-engineering_resume 0:0bf7eb0b1058 -0.06 0.10 ledthereusabledocument-generatio +cv-engineering_resume 0:d69cae607226 -0.04 0.10 teams.reducedtemplatemaintenance +cv-engineering_resume 0:bdea17333528 -0.02 0.10 engine. +cv-engineering_resume 0:7033b2988e4d -0.02 0.10 softwareengineer/2021-2024 cv-engineering_resume 0:998c1a985022 -0.03 0.10 brightleaflabs -cv-engineering_resume 0:e77e909f6ff5 -0.47 0.10 builtbackendservicesandproductio -cv-engineering_resume 0:97c59b2fdb55 -0.46 0.10 drovethemigrationfromitexttoacus -cv-engineering_resume 0:2c2b19cf214d -0.43 0.10 latencyfrom1.4sto380ms. +cv-engineering_resume 0:e77e909f6ff5 -0.07 0.10 builtbackendservicesandproductio +cv-engineering_resume 0:97c59b2fdb55 -0.05 0.10 drovethemigrationfromitexttoacus +cv-engineering_resume 0:2c2b19cf214d -0.03 0.10 latencyfrom1.4sto380ms. cv-engineering_resume 0:8b5abdc8c0d7 -0.08 0.10 technicalevidence cv-engineering_resume 0:e2fbf67cb588 0.26 0.05 graphcompose(java21,pdfbox,maven cv-engineering_resume 0:eb5950729749 0.12 0.05 templates,snapshottesting.powers @@ -504,86 +502,86 @@ cv-engineering_resume 0:2d80d05697ad -0.36 0.05 untypedoffsets,implicitpagebreak cv-engineering_resume 0:6793d28e9783 -0.17 0.05 chromeforge(java,graphcompose,pa cv-engineering_resume 0:e3cfea265b3b -0.46 0.05 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 -0.50 0.10 jordanrivera -cv-executive 0:89ff05847e96 -0.03 0.10 london,uk|+442055551000 -cv-executive 0:8817bf9310b6 -0.05 0.10 jordan.rivera@example.com|linked +cv-executive 0:89ff05847e96 0.02 0.10 london,uk|+442055551000 +cv-executive 0:8817bf9310b6 0.00 0.10 jordan.rivera@example.com|linked cv-executive 0:b944906ed84c -0.06 0.10 professionalsummary cv-executive 0:6fbdc8b79878 -0.02 0.10 platformengineerwith10+yearsbuil cv-executive 0:c2be183b1c5f -0.02 0.10 templatesystems.specialisedinhig cv-executive 0:7f92a9c9efc9 -0.02 0.10 scriptsintotyped,snapshot-tested cv-executive 0:5f94c50dc5bf -0.08 0.10 technicalskills -cv-executive 0:eea537278f83 -0.34 0.10 •languages:java21,kotlin,groovy, -cv-executive 0:9c2cd7231a53 -0.34 0.10 •document&print:pdfbox,apachepoi -cv-executive 0:7bf8639ec5d3 -0.34 0.10 •layoutengines:customdsldesign,s -cv-executive 0:8e66776d28d7 -0.34 0.10 •build&infrastructure:maven,grad -cv-executive 0:1ed4fc7d7768 -0.34 0.10 •testing:junit5,assertj,pdfbox-b -cv-executive 0:26671c309eb9 -0.34 0.10 •distribution:mavencentral,sonat +cv-executive 0:eea537278f83 -0.04 0.10 •languages:java21,kotlin,groovy, +cv-executive 0:9c2cd7231a53 -0.04 0.10 •document&print:pdfbox,apachepoi +cv-executive 0:7bf8639ec5d3 -0.04 0.10 •layoutengines:customdsldesign,s +cv-executive 0:8e66776d28d7 -0.04 0.10 •build&infrastructure:maven,grad +cv-executive 0:1ed4fc7d7768 -0.04 0.10 •testing:junit5,assertj,pdfbox-b +cv-executive 0:26671c309eb9 -0.04 0.10 •distribution:mavencentral,sonat cv-executive 0:68bf0109c6f8 -0.10 0.10 education -cv-executive 0:0ad1957d6bab -0.36 0.10 msccomputerscience -cv-executive 0:3fa772117260 -0.36 0.19 2019-2021 -cv-executive 0:47ce0218bbea -0.11 0.10 universityofmanchester -cv-executive 0:2ffe115b06e5 -0.11 0.10 distinction.thesis:composablelay -cv-executive 0:b6749d0b616b -0.36 0.10 bscsoftwareengineering -cv-executive 0:30f9262640a0 -0.36 0.19 2015-2019 -cv-executive 0:89ad9656f393 -0.11 0.10 imperialcollegelondon -cv-executive 0:baa173b4a82e -0.11 0.10 first-classhonours.specialisatio -cv-executive 0:6d3d5673c39f -0.36 0.10 oraclejavacertification -cv-executive 0:d40b22f00acb -0.36 0.19 2023-2024 -cv-executive 0:2669e1f6d55c -0.11 0.10 professionaltrack -cv-executive 0:3857373829c1 -0.11 0.10 java17platformdeep-dive:records, +cv-executive 0:0ad1957d6bab -0.06 0.10 msccomputerscience +cv-executive 0:3fa772117260 -0.06 0.19 2019-2021 +cv-executive 0:47ce0218bbea -0.06 0.10 universityofmanchester +cv-executive 0:2ffe115b06e5 -0.06 0.10 distinction.thesis:composablelay +cv-executive 0:b6749d0b616b -0.06 0.10 bscsoftwareengineering +cv-executive 0:30f9262640a0 -0.06 0.19 2015-2019 +cv-executive 0:89ad9656f393 -0.06 0.10 imperialcollegelondon +cv-executive 0:baa173b4a82e -0.06 0.10 first-classhonours.specialisatio +cv-executive 0:6d3d5673c39f -0.06 0.10 oraclejavacertification +cv-executive 0:d40b22f00acb -0.06 0.19 2023-2024 +cv-executive 0:2669e1f6d55c -0.06 0.10 professionaltrack +cv-executive 0:3857373829c1 -0.06 0.10 java17platformdeep-dive:records, cv-executive 0:2577c0f557b2 -0.12 0.10 projects -cv-executive 0:b2b029995203 -0.38 0.10 •graphcompose(java21,pdfbox,mave +cv-executive 0:b2b029995203 -0.08 0.10 •graphcompose(java21,pdfbox,mave cv-executive 0:cf13c8a0c3d0 -0.08 0.12 declarativejavapdflayoutengine.s cv-executive 0:cfef54184ea6 -0.08 0.12 proposalpipelinesforhiringtoolsa -cv-executive 0:1b50bb81df5a -0.38 0.10 •templatestudio(kotlin,composede +cv-executive 0:1b50bb81df5a -0.08 0.10 •templatestudio(kotlin,composede cv-executive 0:7127a108c33c -0.08 0.12 internaltoolforevaluatingcv,prop cv-executive 0:6b844249c695 -0.08 0.12 freezing. -cv-executive 0:25cdca2beb8b -0.38 0.10 •layoutlint(java21,javaparser,sp +cv-executive 0:25cdca2beb8b -0.08 0.10 •layoutlint(java21,javaparser,sp cv-executive 0:f5fa2add7746 -0.08 0.12 staticanalyserthatflagsfragileau cv-executive 0:9f5414016bd1 -0.08 0.12 toproduction. -cv-executive 0:fb1927f88597 -0.38 0.10 •chromeforge(java,graphcompose,p -cv-executive 0:e7e62230eb1f -0.38 0.12 editorial-magazinedocumenttoolki +cv-executive 0:fb1927f88597 -0.08 0.10 •chromeforge(java,graphcompose,p +cv-executive 0:e7e62230eb1f -0.08 0.12 editorial-magazinedocumenttoolki cv-executive 0:c2f296ef30a3 -0.14 0.10 professionalexperience -cv-executive 0:a76f47480818 -0.30 0.10 seniorplatformengineer -cv-executive 0:060300b18051 -0.30 0.17 2024-present -cv-executive 0:f890faef907f -0.05 0.10 northwindsystems +cv-executive 0:a76f47480818 0.00 0.10 seniorplatformengineer +cv-executive 0:060300b18051 0.00 0.17 2024-present +cv-executive 0:f890faef907f 0.00 0.10 northwindsystems cv-executive 0:1af5650959fe 0.00 0.10 ledthereusabledocument-generatio cv-executive 0:27c01c228bd8 0.00 0.10 templatemaintenancetimeby70%byre -cv-executive 1:daf65306b3b6 -0.28 0.10 softwareengineer -cv-executive 1:e7cc1822c6dc -0.28 0.19 2021-2024 -cv-executive 1:998c1a985022 -0.03 0.10 brightleaflabs +cv-executive 1:daf65306b3b6 0.02 0.10 softwareengineer +cv-executive 1:e7cc1822c6dc 0.02 0.19 2021-2024 +cv-executive 1:998c1a985022 0.02 0.10 brightleaflabs cv-executive 1:ff8303967fa4 0.02 0.10 builtbackendservicesandproductio cv-executive 1:bd1fc9a4d815 0.02 0.10 fromitexttoacustomlayoutengine,e -cv-executive 1:41bb54fbae8d -0.28 0.10 backendengineer -cv-executive 1:3fa772117260 -0.28 0.19 2019-2021 -cv-executive 1:ef148f221e31 -0.03 0.10 helixprintco +cv-executive 1:41bb54fbae8d 0.02 0.10 backendengineer +cv-executive 1:3fa772117260 0.02 0.19 2019-2021 +cv-executive 1:ef148f221e31 0.02 0.10 helixprintco cv-executive 1:f811fbee6901 0.02 0.10 maintainedahigh-volumeinvoice-pr cv-executive 1:cbfca5b2a6d7 0.02 0.10 templatechange. cv-executive 1:676dfdd56ad2 -0.04 0.10 additionalinformation -cv-executive 1:f20997652453 -0.05 0.10 languages:english(fluent),german -cv-executive 1:ec9d3622395e -0.05 0.10 workeligibility:eligibletoworkin -cv-executive 1:dd20ae01c3cf -0.05 0.10 opensource:maintainerofgraphcomp -cv-executive 1:33c35e9d236d -0.30 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-midnight_navy 0:21d2636ad3df 0.38 0.28 alexmorgan -cv-midnight_navy 0:5518402feccc 0.00 1.64 marketingmanager -cv-midnight_navy 0:5518402feccc#1 -0.57 0.07 marketingmanager -cv-midnight_navy 0:093e7d5fdbaa -0.02 0.08 contact +cv-executive 1:f20997652453 0.00 0.10 languages:english(fluent),german +cv-executive 1:ec9d3622395e 0.00 0.10 workeligibility:eligibletoworkin +cv-executive 1:dd20ae01c3cf 0.00 0.10 opensource:maintainerofgraphcomp +cv-executive 1:33c35e9d236d 0.00 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-midnight_navy 0:21d2636ad3df 0.03 0.28 alexmorgan +cv-midnight_navy 0:5518402feccc 0.05 1.64 marketingmanager +cv-midnight_navy 0:5518402feccc#1 -0.12 0.07 marketingmanager +cv-midnight_navy 0:093e7d5fdbaa 0.03 0.08 contact cv-midnight_navy 0:01dcad830244 0.31 0.01 +1(555)123-4567 cv-midnight_navy 0:3eef38c97138 0.30 0.01 alex.morgan@email.com cv-midnight_navy 0:d5a0d0abdc64 0.30 0.01 newyork,ny,usa cv-midnight_navy 0:84308bea4540 0.29 0.01 linkedin cv-midnight_navy 0:0e6a8e0b849e 0.28 0.01 portfolio -cv-midnight_navy 0:68bf0109c6f8 -0.06 0.08 education +cv-midnight_navy 0:68bf0109c6f8 -0.01 0.08 education cv-midnight_navy 0:6e1119579227 -0.03 0.08 masterofbusiness cv-midnight_navy 0:512afb6c7631 -0.03 0.08 administration -cv-midnight_navy 0:09b0e2130c1e -0.03 0.08 universityofchicagoboothschoolof -cv-midnight_navy 0:11d404179596 -0.04 0.08 business +cv-midnight_navy 0:09b0e2130c1e -0.08 0.08 universityofchicagoboothschoolof +cv-midnight_navy 0:11d404179596 -0.09 0.08 business cv-midnight_navy 0:3b8048983ecc -0.07 0.08 2016–2018 cv-midnight_navy 0:3b8048983ecc#1 -0.29 -0.49 2016–2018 cv-midnight_navy 0:84c2243138f7 -0.05 0.08 bachelorofsciencein cv-midnight_navy 0:e2a530e251d3 -0.04 0.08 marketing cv-midnight_navy 0:1f676d444ffb -0.04 0.08 bostonuniversity cv-midnight_navy 0:8789bd1a8f91 -0.07 0.08 2012–2016 -cv-midnight_navy 0:32c1cf49a2fe -0.10 0.08 skills +cv-midnight_navy 0:32c1cf49a2fe -0.05 0.08 skills cv-midnight_navy 0:4a3750fc1d48 -0.35 0.08 strategicplanning cv-midnight_navy 0:0d676ed982b4 -0.35 0.08 digitalmarketing cv-midnight_navy 0:c29cfa799c8d -0.34 0.08 marketresearch @@ -594,16 +592,16 @@ cv-midnight_navy 0:96fa20c5c60d -0.33 0.08 googleanalytics cv-midnight_navy 0:9bc298c12dc3 -0.32 0.08 seo/sem cv-midnight_navy 0:a95ee8d8cf67 -0.32 0.08 microsoftofficesuite cv-midnight_navy 0:d4e16994df90 -0.31 0.08 communication -cv-midnight_navy 0:6cb574fa10b6 -0.07 0.08 languages -cv-midnight_navy 0:b6234d2ea0d6 -0.34 0.08 english -cv-midnight_navy 0:9c9b13446cd9 -0.36 0.08 spanish -cv-midnight_navy 0:21bb36ad0638 -0.38 0.08 french +cv-midnight_navy 0:6cb574fa10b6 -0.02 0.08 languages +cv-midnight_navy 0:b6234d2ea0d6 0.01 0.08 english +cv-midnight_navy 0:9c9b13446cd9 -0.01 0.08 spanish +cv-midnight_navy 0:21bb36ad0638 -0.03 0.08 french cv-midnight_navy 0:b944906ed84c -0.06 0.12 professionalsummary -cv-midnight_navy 0:05b2b441ce7b 0.30 0.12 results-drivenmarketingmanagerwi -cv-midnight_navy 0:66d5ff95c72a 0.28 0.12 executingdata-drivenmarketingstr -cv-midnight_navy 0:27747b7a33ce 0.26 0.12 engagement.proventrackrecordinle -cv-midnight_navy 0:a0f4e7019ffc 0.24 0.12 successfulcampaigns,anddeliverin -cv-midnight_navy 0:68352cb08e62 0.22 0.12 strongbrandsandcreatingimpactful +cv-midnight_navy 0:05b2b441ce7b -0.05 0.12 results-drivenmarketingmanagerwi +cv-midnight_navy 0:66d5ff95c72a -0.07 0.12 executingdata-drivenmarketingstr +cv-midnight_navy 0:27747b7a33ce -0.09 0.12 engagement.proventrackrecordinle +cv-midnight_navy 0:a0f4e7019ffc -0.11 0.12 successfulcampaigns,anddeliverin +cv-midnight_navy 0:68352cb08e62 -0.13 0.12 strongbrandsandcreatingimpactful cv-midnight_navy 0:53e5e7c5a884 -0.13 0.12 experience cv-midnight_navy 0:086c0e036e67 -0.51 -0.67 2021–present cv-midnight_navy 0:009b5b6479fa -0.43 0.07 starwavesolutions @@ -617,14 +615,14 @@ cv-midnight_navy 0:407f710db042 -0.03 0.07 ·overseedigitalcampaignsacrossse cv-midnight_navy 0:308aef77a1c3 -0.01 0.10 resultingina25%increaseinroi. cv-midnight_navy 0:40f5daa37f9a 0.00 0.07 ·analyzemarkettrendsandcompetito cv-midnight_navy 0:af67fd7a2e8b 0.02 0.10 optimizemarketingefforts. -cv-midnight_navy 0:7e121dceb78a -0.47 0.07 seniormarketingspecialist +cv-midnight_navy 0:7e121dceb78a -0.02 0.07 seniormarketingspecialist cv-midnight_navy 0:f7d1049ec64b -0.41 -0.50 2018–2021 cv-midnight_navy 0:4b8292fda43e -0.33 0.07 brightlinetechnologies cv-midnight_navy 0:a246f7ba3f71 0.01 0.07 ·executedmulti-channelmarketingc cv-midnight_navy 0:58b162e46dda 0.03 0.10 engagementby30%. cv-midnight_navy 0:ef77f2daef0f -0.28 0.07 ·managedsocialmediachannelsandco cv-midnight_navy 0:a112a7b3c16b -0.26 0.07 ·coordinatedwithcreativeteamstod -cv-midnight_navy 0:990b9f22bb48 -0.35 0.07 marketingcoordinator +cv-midnight_navy 0:990b9f22bb48 0.10 0.07 marketingcoordinator cv-midnight_navy 0:88f4e236ebcd -0.21 0.07 peakperformancegroup cv-midnight_navy 0:c8186fbbdae9 -0.21 -0.51 boston,ma cv-midnight_navy 0:87777be540ce -0.22 0.07 ·supportedthedevelopmentandexecu @@ -647,65 +645,65 @@ cv-midnight_navy 0:73a2af8864fc -0.16 0.14 2020 cv-midnight_navy 0:86e529fac99d -0.12 0.65 hubspotcontentmarketingcertified cv-midnight_navy 0:200b36afcfde 0.21 0.09 hubspotacademy cv-midnight_navy 0:1bea20e1df19 -0.16 0.09 2021 -cv-minimal_underlined 0:8f1010120ed6 0.46 2.20 jordanrivera +cv-minimal_underlined 0:8f1010120ed6 0.01 2.20 jordanrivera cv-minimal_underlined 0:8d7a2cca3060 0.03 0.12 +442055551000|jordan.rivera@exam -cv-minimal_underlined 0:b944906ed84c 0.04 0.10 professionalsummary -cv-minimal_underlined 0:80cc87fdc4c4 -0.02 0.10 platformengineerwith10+yearsbuil -cv-minimal_underlined 0:bddc0bd093ce -0.02 0.10 systems.specialisedinhigh-throug -cv-minimal_underlined 0:95a43d7b3df0 -0.01 0.10 snapshot-testedlibrariesthatscal -cv-minimal_underlined 0:5f94c50dc5bf 0.12 0.10 technicalskills -cv-minimal_underlined 0:eea537278f83 0.15 0.10 •languages:java21,kotlin,groovy, -cv-minimal_underlined 0:9c2cd7231a53 0.16 0.10 •document&print:pdfbox,apachepoi -cv-minimal_underlined 0:7bf8639ec5d3 0.16 0.10 •layoutengines:customdsldesign,s -cv-minimal_underlined 0:8e66776d28d7 0.17 0.10 •build&infrastructure:maven,grad -cv-minimal_underlined 0:1ed4fc7d7768 0.17 0.10 •testing:junit5,assertj,pdfbox-b -cv-minimal_underlined 0:26671c309eb9 0.18 0.10 •distribution:mavencentral,sonat -cv-minimal_underlined 0:68bf0109c6f8 0.21 0.10 education -cv-minimal_underlined 0:0ad1957d6bab 0.27 0.10 msccomputerscience +cv-minimal_underlined 0:b944906ed84c 0.09 0.10 professionalsummary +cv-minimal_underlined 0:80cc87fdc4c4 0.18 0.10 platformengineerwith10+yearsbuil +cv-minimal_underlined 0:bddc0bd093ce 0.18 0.10 systems.specialisedinhigh-throug +cv-minimal_underlined 0:95a43d7b3df0 0.19 0.10 snapshot-testedlibrariesthatscal +cv-minimal_underlined 0:5f94c50dc5bf 0.17 0.10 technicalskills +cv-minimal_underlined 0:eea537278f83 0.25 0.10 •languages:java21,kotlin,groovy, +cv-minimal_underlined 0:9c2cd7231a53 0.26 0.10 •document&print:pdfbox,apachepoi +cv-minimal_underlined 0:7bf8639ec5d3 0.26 0.10 •layoutengines:customdsldesign,s +cv-minimal_underlined 0:8e66776d28d7 0.27 0.10 •build&infrastructure:maven,grad +cv-minimal_underlined 0:1ed4fc7d7768 0.27 0.10 •testing:junit5,assertj,pdfbox-b +cv-minimal_underlined 0:26671c309eb9 0.28 0.10 •distribution:mavencentral,sonat +cv-minimal_underlined 0:68bf0109c6f8 0.26 0.10 education +cv-minimal_underlined 0:0ad1957d6bab 0.32 0.10 msccomputerscience cv-minimal_underlined 0:3fa772117260 0.23 -0.76 2019-2021 cv-minimal_underlined 0:47ce0218bbea 0.26 0.10 universityofmanchester -cv-minimal_underlined 0:2ffe115b06e5 0.27 0.10 distinction.thesis:composablelay -cv-minimal_underlined 0:b6749d0b616b 0.30 0.10 bscsoftwareengineering +cv-minimal_underlined 0:2ffe115b06e5 0.37 0.10 distinction.thesis:composablelay +cv-minimal_underlined 0:b6749d0b616b 0.35 0.10 bscsoftwareengineering cv-minimal_underlined 0:30f9262640a0 0.27 -0.76 2015-2019 cv-minimal_underlined 0:89ad9656f393 0.29 0.10 imperialcollegelondon -cv-minimal_underlined 0:baa173b4a82e 0.21 0.10 first-classhonours.specialisatio -cv-minimal_underlined 0:6d3d5673c39f 0.24 0.10 oraclejavacertification +cv-minimal_underlined 0:baa173b4a82e 0.31 0.10 first-classhonours.specialisatio +cv-minimal_underlined 0:6d3d5673c39f 0.29 0.10 oraclejavacertification cv-minimal_underlined 0:d40b22f00acb 0.20 -0.76 2023-2024 cv-minimal_underlined 0:2669e1f6d55c 0.23 0.10 professionaltrack -cv-minimal_underlined 0:3857373829c1 0.24 0.10 java17platformdeep-dive:records, -cv-minimal_underlined 0:2577c0f557b2 0.27 0.10 projects -cv-minimal_underlined 0:b2b029995203 0.31 0.10 •graphcompose(java21,pdfbox,mave -cv-minimal_underlined 0:67593a76ef70 0.21 0.11 declarativejavapdflayoutengine.s -cv-minimal_underlined 0:b9292cbd1454 0.22 0.11 pipelinesforhiringtoolsandbillin -cv-minimal_underlined 0:1b50bb81df5a 0.32 0.10 •templatestudio(kotlin,composede -cv-minimal_underlined 0:7127a108c33c 0.23 0.11 internaltoolforevaluatingcv,prop -cv-minimal_underlined 0:6b844249c695 0.23 0.11 freezing. -cv-minimal_underlined 0:25cdca2beb8b 0.34 0.10 •layoutlint(java21,javaparser,sp -cv-minimal_underlined 0:7488006d7864 0.24 0.11 staticanalyserthatflagsfragileau -cv-minimal_underlined 0:c4d0c415b4f8 0.25 0.11 production. -cv-minimal_underlined 0:fb1927f88597 0.35 0.10 •chromeforge(java,graphcompose,p -cv-minimal_underlined 0:e7e62230eb1f 0.36 0.11 editorial-magazinedocumenttoolki -cv-minimal_underlined 0:c2f296ef30a3 0.39 0.10 professionalexperience -cv-minimal_underlined 0:a76f47480818 0.45 0.10 seniorplatformengineer +cv-minimal_underlined 0:3857373829c1 0.34 0.10 java17platformdeep-dive:records, +cv-minimal_underlined 0:2577c0f557b2 0.32 0.10 projects +cv-minimal_underlined 0:b2b029995203 0.41 0.10 •graphcompose(java21,pdfbox,mave +cv-minimal_underlined 0:67593a76ef70 0.41 0.11 declarativejavapdflayoutengine.s +cv-minimal_underlined 0:b9292cbd1454 0.42 0.11 pipelinesforhiringtoolsandbillin +cv-minimal_underlined 0:1b50bb81df5a 0.42 0.10 •templatestudio(kotlin,composede +cv-minimal_underlined 0:7127a108c33c 0.43 0.11 internaltoolforevaluatingcv,prop +cv-minimal_underlined 0:6b844249c695 0.43 0.11 freezing. +cv-minimal_underlined 0:25cdca2beb8b 0.44 0.10 •layoutlint(java21,javaparser,sp +cv-minimal_underlined 0:7488006d7864 0.44 0.11 staticanalyserthatflagsfragileau +cv-minimal_underlined 0:c4d0c415b4f8 0.45 0.11 production. +cv-minimal_underlined 0:fb1927f88597 0.45 0.10 •chromeforge(java,graphcompose,p +cv-minimal_underlined 0:e7e62230eb1f 0.46 0.11 editorial-magazinedocumenttoolki +cv-minimal_underlined 0:c2f296ef30a3 0.44 0.10 professionalexperience +cv-minimal_underlined 0:a76f47480818 0.50 0.10 seniorplatformengineer cv-minimal_underlined 0:060300b18051 0.41 0.01 2024-present cv-minimal_underlined 0:f890faef907f 0.44 0.10 northwindsystems -cv-minimal_underlined 1:49faf14f1f56 -0.13 0.10 ledthereusabledocument-generatio -cv-minimal_underlined 1:6bd3f168e89e -0.13 0.10 maintenancetimeby70%byretiringpe -cv-minimal_underlined 1:daf65306b3b6 0.00 0.10 softwareengineer +cv-minimal_underlined 1:49faf14f1f56 0.07 0.10 ledthereusabledocument-generatio +cv-minimal_underlined 1:6bd3f168e89e 0.07 0.10 maintenancetimeby70%byretiringpe +cv-minimal_underlined 1:daf65306b3b6 0.05 0.10 softwareengineer cv-minimal_underlined 1:e7cc1822c6dc -0.03 -0.76 2021-2024 cv-minimal_underlined 1:998c1a985022 -0.01 0.10 brightleaflabs -cv-minimal_underlined 1:e55664011cda -0.09 0.10 builtbackendservicesandproductio -cv-minimal_underlined 1:e80236b6d2b1 -0.09 0.10 itexttoacustomlayoutengine,elimi -cv-minimal_underlined 1:41bb54fbae8d 0.04 0.10 backendengineer +cv-minimal_underlined 1:e55664011cda 0.11 0.10 builtbackendservicesandproductio +cv-minimal_underlined 1:e80236b6d2b1 0.11 0.10 itexttoacustomlayoutengine,elimi +cv-minimal_underlined 1:41bb54fbae8d 0.09 0.10 backendengineer cv-minimal_underlined 1:3fa772117260 0.01 -0.76 2019-2021 cv-minimal_underlined 1:ef148f221e31 0.03 0.10 helixprintco -cv-minimal_underlined 1:9d31a6bfbc69 -0.05 0.10 maintainedahigh-volumeinvoice-pr -cv-minimal_underlined 1:03af8a628309 -0.05 0.10 change. -cv-minimal_underlined 1:676dfdd56ad2 0.08 0.10 additionalinformation -cv-minimal_underlined 1:f20997652453 0.12 0.10 languages:english(fluent),german -cv-minimal_underlined 1:ec9d3622395e 0.12 0.10 workeligibility:eligibletoworkin -cv-minimal_underlined 1:dd20ae01c3cf 0.13 0.10 opensource:maintainerofgraphcomp -cv-minimal_underlined 1:33c35e9d236d 0.13 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-minimal_underlined 1:9d31a6bfbc69 0.15 0.10 maintainedahigh-volumeinvoice-pr +cv-minimal_underlined 1:03af8a628309 0.15 0.10 change. +cv-minimal_underlined 1:676dfdd56ad2 0.13 0.10 additionalinformation +cv-minimal_underlined 1:f20997652453 0.22 0.10 languages:english(fluent),german +cv-minimal_underlined 1:ec9d3622395e 0.22 0.10 workeligibility:eligibletoworkin +cv-minimal_underlined 1:dd20ae01c3cf 0.23 0.10 opensource:maintainerofgraphcomp +cv-minimal_underlined 1:33c35e9d236d 0.23 0.10 speaking:jvmsummit2024,devoxxuk2 cv-mint_editorial 0:8f1010120ed6 -1.30 2.33 jordanrivera cv-mint_editorial 0:2d58f0cadc2d -0.02 0.12 platformengineer cv-mint_editorial 0:093e7d5fdbaa -0.71 0.10 contact @@ -824,20 +822,20 @@ cv-modern_professional 1:f20997652453 0.03 0.10 languages:english(fluent),german cv-modern_professional 1:ec9d3622395e 0.03 0.10 workeligibility:eligibletoworkin cv-modern_professional 1:dd20ae01c3cf 0.03 0.10 opensource:maintainerofgraphcomp cv-modern_professional 1:33c35e9d236d 0.03 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-monogram_sidebar 0:093e7d5fdbaa -0.05 0.81 contact +cv-monogram_sidebar 0:093e7d5fdbaa 0.00 0.81 contact cv-monogram_sidebar 0:89674e6f130e 0.00 -0.33 +442055551000 cv-monogram_sidebar 0:e0f850305ded 0.02 0.06 jordan.rivera@example.com cv-monogram_sidebar 0:fbeea547d99e 0.04 -0.16 london,uk cv-monogram_sidebar 0:84308bea4540 0.06 -0.11 linkedin cv-monogram_sidebar 0:c0b0109d9439 0.08 -0.09 github -cv-monogram_sidebar 0:68bf0109c6f8 0.05 0.81 education -cv-monogram_sidebar 0:0ad1957d6bab 0.05 0.23 msccomputerscience +cv-monogram_sidebar 0:68bf0109c6f8 0.10 0.81 education +cv-monogram_sidebar 0:0ad1957d6bab 0.10 0.23 msccomputerscience cv-monogram_sidebar 0:47ce0218bbea 0.08 0.09 universityofmanchester -cv-monogram_sidebar 0:3fa772117260 0.09 0.17 2019-2021 -cv-monogram_sidebar 0:b6749d0b616b -0.04 0.25 bscsoftwareengineering +cv-monogram_sidebar 0:3fa772117260 0.14 0.17 2019-2021 +cv-monogram_sidebar 0:b6749d0b616b 0.01 0.25 bscsoftwareengineering cv-monogram_sidebar 0:89ad9656f393 -0.01 0.08 imperialcollegelondon -cv-monogram_sidebar 0:30f9262640a0 0.00 0.17 2015-2019 -cv-monogram_sidebar 0:32c1cf49a2fe -0.03 0.78 skills +cv-monogram_sidebar 0:30f9262640a0 0.05 0.17 2015-2019 +cv-monogram_sidebar 0:32c1cf49a2fe 0.02 0.78 skills cv-monogram_sidebar 0:d5680c2e2769 0.02 -0.08 java21 cv-monogram_sidebar 0:19a67c2a5369 0.04 -0.02 kotlin cv-monogram_sidebar 0:95bfacd3a466 0.06 -0.05 groovy @@ -848,132 +846,132 @@ cv-monogram_sidebar 0:1814aacb6d5a -0.16 0.02 apachepoi(docx/xlsx) cv-monogram_sidebar 0:136c67657614 0.02 2.80 jordan cv-monogram_sidebar 0:8ba35ebe3d5c 0.03 2.83 rivera cv-monogram_sidebar 0:2d58f0cadc2d 0.01 0.11 platformengineer -cv-monogram_sidebar 0:b944906ed84c 0.00 0.06 professionalsummary -cv-monogram_sidebar 0:e9b75496bfb4 -0.02 0.06 platformengineerwith10+yearsbuil -cv-monogram_sidebar 0:84b4d993d952 -0.02 0.06 developer-facingtemplatesystems. -cv-monogram_sidebar 0:dc1181e6cd7b -0.02 0.06 andturningbrittleproduction-opss -cv-monogram_sidebar 0:c2f296ef30a3 0.00 0.06 professionalexperience +cv-monogram_sidebar 0:b944906ed84c 0.05 0.06 professionalsummary +cv-monogram_sidebar 0:e9b75496bfb4 0.03 0.06 platformengineerwith10+yearsbuil +cv-monogram_sidebar 0:84b4d993d952 0.03 0.06 developer-facingtemplatesystems. +cv-monogram_sidebar 0:dc1181e6cd7b 0.03 0.06 andturningbrittleproduction-opss +cv-monogram_sidebar 0:c2f296ef30a3 0.05 0.06 professionalexperience cv-monogram_sidebar 0:a76f47480818 -0.02 0.06 seniorplatformengineer cv-monogram_sidebar 0:f890faef907f 0.02 0.06 northwindsystems cv-monogram_sidebar 0:060300b18051 0.04 0.06 2024-present -cv-monogram_sidebar 0:0bf7eb0b1058 0.01 0.06 ledthereusabledocument-generatio -cv-monogram_sidebar 0:b9f0f08f8ce0 0.01 0.06 teams.reducedtemplatemaintenance -cv-monogram_sidebar 0:ab9a16f78540 0.01 0.06 canonicalengine. +cv-monogram_sidebar 0:0bf7eb0b1058 0.06 0.06 ledthereusabledocument-generatio +cv-monogram_sidebar 0:b9f0f08f8ce0 0.06 0.06 teams.reducedtemplatemaintenance +cv-monogram_sidebar 0:ab9a16f78540 0.06 0.06 canonicalengine. cv-monogram_sidebar 0:daf65306b3b6 0.01 0.06 softwareengineer cv-monogram_sidebar 0:998c1a985022 0.05 0.06 brightleaflabs cv-monogram_sidebar 0:e7cc1822c6dc 0.07 0.06 2021-2024 -cv-monogram_sidebar 0:e77e909f6ff5 0.04 0.06 builtbackendservicesandproductio -cv-monogram_sidebar 0:97c59b2fdb55 0.04 0.06 drovethemigrationfromitexttoacus -cv-monogram_sidebar 0:2c2b19cf214d 0.04 0.06 latencyfrom1.4sto380ms. -cv-monogram_sidebar 0:2577c0f557b2 0.06 0.06 projects +cv-monogram_sidebar 0:e77e909f6ff5 0.09 0.06 builtbackendservicesandproductio +cv-monogram_sidebar 0:97c59b2fdb55 0.09 0.06 drovethemigrationfromitexttoacus +cv-monogram_sidebar 0:2c2b19cf214d 0.09 0.06 latencyfrom1.4sto380ms. +cv-monogram_sidebar 0:2577c0f557b2 0.11 0.06 projects cv-monogram_sidebar 0:abdcacccefe1 -0.02 0.06 templatestudio(kotlin,composedes cv-monogram_sidebar 0:041a43f9a663 0.27 0.06 andinvoiceoutputacross14designpr cv-monogram_sidebar 0:f87e2f0c02dc -0.03 0.06 layoutlint(java21,javaparser,spo cv-monogram_sidebar 0:a646f74483b1 0.26 0.06 rows,untypedoffsets,implicitpage -cv-monogram_sidebar 0:676dfdd56ad2 -0.07 0.06 additionalinformation +cv-monogram_sidebar 0:676dfdd56ad2 -0.02 0.06 additionalinformation cv-monogram_sidebar 0:f20997652453 -0.09 0.06 languages:english(fluent),german cv-monogram_sidebar 0:ec9d3622395e -0.10 0.06 workeligibility:eligibletoworkin cv-monogram_sidebar 0:dd20ae01c3cf -0.31 0.06 opensource:maintainerofgraphcomp -cv-navy_sidebar 0:9fdaa20e32a0 0.24 0.10 oliviamartinez -cv-navy_sidebar 0:093e7d5fdbaa 0.01 0.10 contact +cv-navy_sidebar 0:9fdaa20e32a0 -0.01 0.10 oliviamartinez +cv-navy_sidebar 0:093e7d5fdbaa 0.06 0.10 contact cv-navy_sidebar 0:01dcad830244 -0.13 0.10 +1(555)123-4567 cv-navy_sidebar 0:51deda7d1a4f -0.13 0.10 your.email@gmail.com cv-navy_sidebar 0:d5a0d0abdc64 0.07 0.10 newyork,ny,usa cv-navy_sidebar 0:8d5bb5bf42be 0.02 0.10 linkedin.com/in/yourname -cv-navy_sidebar 0:68bf0109c6f8 0.01 0.10 education -cv-navy_sidebar 0:6e1410a7b5cb 0.12 0.10 masterofsciencein -cv-navy_sidebar 0:e2a530e251d3 0.12 0.10 marketing -cv-navy_sidebar 0:d244381bfb58 0.02 0.10 newyorkuniversity -cv-navy_sidebar 0:60cebc1ec80c 0.02 0.10 newyork,ny -cv-navy_sidebar 0:01e4455cec51 0.02 0.10 2020-2022 -cv-navy_sidebar 0:fb1235740d31 0.12 0.10 bachelorofbusiness -cv-navy_sidebar 0:512afb6c7631 0.12 0.10 administration -cv-navy_sidebar 0:1d9547a99a4e 0.02 0.10 universityofcalifornia -cv-navy_sidebar 0:de747164b75f 0.02 0.10 losangeles,ca -cv-navy_sidebar 0:7878b9e4385f 0.02 0.10 2016-2020 -cv-navy_sidebar 0:32c1cf49a2fe 0.01 0.10 skills -cv-navy_sidebar 0:ccae905da5fc -0.23 0.10 •digitalmarketing -cv-navy_sidebar 0:3e8cddd043e9 -0.23 0.10 •dataanalysis -cv-navy_sidebar 0:cb393a256ce2 -0.23 0.10 •projectmanagement -cv-navy_sidebar 0:45dad5d5c3cc -0.23 0.10 •seo/sem -cv-navy_sidebar 0:004ded92a5a3 -0.23 0.10 •microsoftofficesuite -cv-navy_sidebar 0:e06c8b35cc09 -0.23 0.10 •googleanalytics -cv-navy_sidebar 0:238987499bc7 -0.23 0.10 •socialmediastrategy -cv-navy_sidebar 0:a3d99b3cc7e0 -0.23 0.10 •contentmarketing -cv-navy_sidebar 0:6cb574fa10b6 0.01 0.10 languages +cv-navy_sidebar 0:68bf0109c6f8 0.06 0.10 education +cv-navy_sidebar 0:6e1410a7b5cb 0.07 0.10 masterofsciencein +cv-navy_sidebar 0:e2a530e251d3 0.07 0.10 marketing +cv-navy_sidebar 0:d244381bfb58 0.07 0.10 newyorkuniversity +cv-navy_sidebar 0:60cebc1ec80c 0.07 0.10 newyork,ny +cv-navy_sidebar 0:01e4455cec51 0.07 0.10 2020-2022 +cv-navy_sidebar 0:fb1235740d31 0.07 0.10 bachelorofbusiness +cv-navy_sidebar 0:512afb6c7631 0.07 0.10 administration +cv-navy_sidebar 0:1d9547a99a4e 0.07 0.10 universityofcalifornia +cv-navy_sidebar 0:de747164b75f 0.07 0.10 losangeles,ca +cv-navy_sidebar 0:7878b9e4385f 0.07 0.10 2016-2020 +cv-navy_sidebar 0:32c1cf49a2fe 0.06 0.10 skills +cv-navy_sidebar 0:ccae905da5fc 0.07 0.10 •digitalmarketing +cv-navy_sidebar 0:3e8cddd043e9 0.07 0.10 •dataanalysis +cv-navy_sidebar 0:cb393a256ce2 0.07 0.10 •projectmanagement +cv-navy_sidebar 0:45dad5d5c3cc 0.07 0.10 •seo/sem +cv-navy_sidebar 0:004ded92a5a3 0.07 0.10 •microsoftofficesuite +cv-navy_sidebar 0:e06c8b35cc09 0.07 0.10 •googleanalytics +cv-navy_sidebar 0:238987499bc7 0.07 0.10 •socialmediastrategy +cv-navy_sidebar 0:a3d99b3cc7e0 0.07 0.10 •contentmarketing +cv-navy_sidebar 0:6cb574fa10b6 0.06 0.10 languages cv-navy_sidebar 0:b6234d2ea0d6 -0.20 0.60 english cv-navy_sidebar 0:1889f4162fb9 -0.20 0.09 –native cv-navy_sidebar 0:77915a7314f0 -0.20 0.60 spanish–advanced cv-navy_sidebar 0:21bb36ad0638 -0.20 0.60 french cv-navy_sidebar 0:3bc244be050e -0.20 0.09 –intermediate -cv-navy_sidebar 0:5518402feccc -0.02 0.10 marketingmanager +cv-navy_sidebar 0:5518402feccc 0.03 0.10 marketingmanager cv-navy_sidebar 0:5518402feccc#1 -0.29 0.10 marketingmanager -cv-navy_sidebar 0:7b5815d7a663 0.04 0.10 results-drivenmarketingprofessio -cv-navy_sidebar 0:18f8b50d02d8 0.06 0.10 developingandexecutingdata-drive -cv-navy_sidebar 0:2adca2422cbe 0.08 0.10 growth,increaseengagement,anddel -cv-navy_sidebar 0:b3c222da2e1d 0.10 0.10 digitalmarketing,marketresearch, -cv-navy_sidebar 0:53e5e7c5a884 -0.28 0.10 experience +cv-navy_sidebar 0:7b5815d7a663 -0.01 0.10 results-drivenmarketingprofessio +cv-navy_sidebar 0:18f8b50d02d8 0.01 0.10 developingandexecutingdata-drive +cv-navy_sidebar 0:2adca2422cbe 0.03 0.10 growth,increaseengagement,anddel +cv-navy_sidebar 0:b3c222da2e1d 0.05 0.10 digitalmarketing,marketresearch, +cv-navy_sidebar 0:53e5e7c5a884 0.07 0.10 experience cv-navy_sidebar 0:8a39b996b27c 0.09 0.16 jan2022-present -cv-navy_sidebar 0:f97eeb2fe120 0.00 0.10 brightwavesolutions,newyork,ny -cv-navy_sidebar 0:f97eeb2fe120#1 -0.02 0.10 brightwavesolutions,newyork,ny -cv-navy_sidebar 0:f97eeb2fe120#2 -0.05 0.10 brightwavesolutions,newyork,ny -cv-navy_sidebar 0:a4beef0c22d9 0.00 0.10 •developandimplementintegratedma -cv-navy_sidebar 0:234eaa6417f7 0.00 0.09 awarenessby35%andleadgenerationb -cv-navy_sidebar 0:dfd245470d6e 0.00 0.10 •manageateamof4marketingspeciali -cv-navy_sidebar 0:94d0b8d13763 0.00 0.09 anddesignteamstoalignstrategies. -cv-navy_sidebar 0:5dabf21df91b 0.00 0.10 •analyzecampaignperformanceusing -cv-navy_sidebar 0:1cb810ca6189 0.00 0.09 optimizeroiandreporting. +cv-navy_sidebar 0:f97eeb2fe120 0.05 0.10 brightwavesolutions,newyork,ny +cv-navy_sidebar 0:f97eeb2fe120#1 0.03 0.10 brightwavesolutions,newyork,ny +cv-navy_sidebar 0:f97eeb2fe120#2 0.00 0.10 brightwavesolutions,newyork,ny +cv-navy_sidebar 0:a4beef0c22d9 0.05 0.10 •developandimplementintegratedma +cv-navy_sidebar 0:234eaa6417f7 0.05 0.09 awarenessby35%andleadgenerationb +cv-navy_sidebar 0:dfd245470d6e 0.05 0.10 •manageateamof4marketingspeciali +cv-navy_sidebar 0:94d0b8d13763 0.05 0.09 anddesignteamstoalignstrategies. +cv-navy_sidebar 0:5dabf21df91b 0.05 0.10 •analyzecampaignperformanceusing +cv-navy_sidebar 0:1cb810ca6189 0.05 0.09 optimizeroiandreporting. cv-navy_sidebar 0:3b172b9ab75e -0.31 0.10 marketingspecialist cv-navy_sidebar 0:d514872487af 0.07 0.15 jun2020-dec2021 -cv-navy_sidebar 0:a13f57f4d861 -0.02 0.10 •executeddigitalmarketingcampaig -cv-navy_sidebar 0:4b308a27b878 -0.02 0.09 channels. -cv-navy_sidebar 0:39b87fda4a82 -0.02 0.10 •conductedmarketresearchandcompe -cv-navy_sidebar 0:b088780ed500 -0.02 0.09 andinformstrategy. -cv-navy_sidebar 0:bafd8ea30ebe -0.02 0.10 •createdengagingcontentforblogs, -cv-navy_sidebar 0:88a47597543f -0.02 0.09 engagementby40%. +cv-navy_sidebar 0:a13f57f4d861 0.03 0.10 •executeddigitalmarketingcampaig +cv-navy_sidebar 0:4b308a27b878 0.03 0.09 channels. +cv-navy_sidebar 0:39b87fda4a82 0.03 0.10 •conductedmarketresearchandcompe +cv-navy_sidebar 0:b088780ed500 0.03 0.09 andinformstrategy. +cv-navy_sidebar 0:bafd8ea30ebe 0.03 0.10 •createdengagingcontentforblogs, +cv-navy_sidebar 0:88a47597543f 0.03 0.09 engagementby40%. cv-navy_sidebar 0:dcf0600524d2 -0.34 0.10 marketingintern cv-navy_sidebar 0:73a85d4a71b0 0.04 0.13 jan2020-may2020 -cv-navy_sidebar 0:e31c3dfebb27 -0.30 0.10 •assistedinplanningandexecutingm -cv-navy_sidebar 0:f7ee178c4b93 -0.30 0.10 •supportedcontentcreationandsoci -cv-navy_sidebar 0:3ffec90452c5 -0.30 0.10 •analyzeddataandpreparedreportst -cv-navy_sidebar 0:6ee18b42fbf1 -0.36 0.10 achievements -cv-navy_sidebar 0:cff13cc228a6 -0.05 0.10 •increasedwebsitetrafficby60%wit -cv-navy_sidebar 0:fae41a639f96 -0.05 0.09 strategy. -cv-navy_sidebar 0:b46da9584f4f -0.30 0.10 •launchedasuccessfulemailmarketi -cv-navy_sidebar 0:3654c4d2721e -0.30 0.10 •received“employeeoftheyear”awar -cv-navy_sidebar 0:e831beb04c00 -0.36 0.10 certifications -cv-navy_sidebar 0:431b6df4450d -0.30 0.10 •googleanalyticsindividualqualif -cv-navy_sidebar 0:334a657f5d85 -0.30 0.10 •hubspotcontentmarketingcertific -cv-navy_sidebar 0:19323523a3e6 -0.30 0.10 •facebookblueprintcertification -cv-nordic_clean 0:8f1010120ed6 0.15 0.10 jordanrivera -cv-nordic_clean 0:2d58f0cadc2d 0.00 0.10 platformengineer +cv-navy_sidebar 0:e31c3dfebb27 0.00 0.10 •assistedinplanningandexecutingm +cv-navy_sidebar 0:f7ee178c4b93 0.00 0.10 •supportedcontentcreationandsoci +cv-navy_sidebar 0:3ffec90452c5 0.00 0.10 •analyzeddataandpreparedreportst +cv-navy_sidebar 0:6ee18b42fbf1 -0.01 0.10 achievements +cv-navy_sidebar 0:cff13cc228a6 0.00 0.10 •increasedwebsitetrafficby60%wit +cv-navy_sidebar 0:fae41a639f96 0.00 0.09 strategy. +cv-navy_sidebar 0:b46da9584f4f 0.00 0.10 •launchedasuccessfulemailmarketi +cv-navy_sidebar 0:3654c4d2721e 0.00 0.10 •received“employeeoftheyear”awar +cv-navy_sidebar 0:e831beb04c00 -0.01 0.10 certifications +cv-navy_sidebar 0:431b6df4450d 0.00 0.10 •googleanalyticsindividualqualif +cv-navy_sidebar 0:334a657f5d85 0.00 0.10 •hubspotcontentmarketingcertific +cv-navy_sidebar 0:19323523a3e6 0.00 0.10 •facebookblueprintcertification +cv-nordic_clean 0:8f1010120ed6 0.00 0.10 jordanrivera +cv-nordic_clean 0:2d58f0cadc2d 0.05 0.10 platformengineer cv-nordic_clean 0:fbeea547d99e 0.00 -0.35 london,uk cv-nordic_clean 0:89674e6f130e 0.02 -0.65 +442055551000 cv-nordic_clean 0:e0f850305ded 0.04 0.13 jordan.rivera@example.com cv-nordic_clean 0:84308bea4540 0.06 -0.21 linkedin cv-nordic_clean 0:c0b0109d9439 -0.12 -0.16 github -cv-nordic_clean 0:1900eab6c028 -0.35 11.60 profile -cv-nordic_clean 0:8d6758a29c08 -0.47 11.60 platformengineerwith10+yearsbuil -cv-nordic_clean 0:f0d993eb5f9d -0.49 11.60 high-throughputpdfrendering,sema -cv-nordic_clean 0:32c1cf49a2fe -0.36 0.10 skills -cv-nordic_clean 0:873a24d153c8 -0.04 0.10 languages:java21,kotlin,groovy,p -cv-nordic_clean 0:db84150190bb -0.07 0.10 document&print:pdfbox,apachepoi -cv-nordic_clean 0:1d1d129512e6 -0.05 0.10 (docx/xlsx),itext,postscript,icc -cv-nordic_clean 0:7985eee03934 -0.03 0.10 fontmetrics -cv-nordic_clean 0:a1cec3782701 0.04 0.10 layoutengines:customdsldesign,se -cv-nordic_clean 0:3a3b8c3bddd0 0.06 0.10 trees,pagination,snapshottesting -cv-nordic_clean 0:b7d8ca9428a4 -0.02 0.10 build&infrastructure:maven,gradl -cv-nordic_clean 0:656a2a3e57e0 0.00 0.10 jitpack,docker,jmhbenchmarking -cv-nordic_clean 0:b8b1a42a45e1 0.02 0.10 testing:junit5,assertj,pdfbox-ba -cv-nordic_clean 0:2ec2836b6df6 0.04 0.10 layout-graphsnapshots,mutationte -cv-nordic_clean 0:74b69eb8de4b 0.06 0.10 distribution:mavencentral,sonaty -cv-nordic_clean 0:43ad67a4e3f5 0.08 0.10 signing,jitpack,semanticversioni -cv-nordic_clean 0:68bf0109c6f8 -0.04 0.10 education +cv-nordic_clean 0:1900eab6c028 0.00 11.60 profile +cv-nordic_clean 0:8d6758a29c08 -0.07 11.60 platformengineerwith10+yearsbuil +cv-nordic_clean 0:f0d993eb5f9d -0.09 11.60 high-throughputpdfrendering,sema +cv-nordic_clean 0:32c1cf49a2fe -0.01 0.10 skills +cv-nordic_clean 0:873a24d153c8 0.01 0.10 languages:java21,kotlin,groovy,p +cv-nordic_clean 0:db84150190bb 0.03 0.10 document&print:pdfbox,apachepoi +cv-nordic_clean 0:1d1d129512e6 0.05 0.10 (docx/xlsx),itext,postscript,icc +cv-nordic_clean 0:7985eee03934 0.07 0.10 fontmetrics +cv-nordic_clean 0:a1cec3782701 0.09 0.10 layoutengines:customdsldesign,se +cv-nordic_clean 0:3a3b8c3bddd0 0.11 0.10 trees,pagination,snapshottesting +cv-nordic_clean 0:b7d8ca9428a4 0.03 0.10 build&infrastructure:maven,gradl +cv-nordic_clean 0:656a2a3e57e0 0.05 0.10 jitpack,docker,jmhbenchmarking +cv-nordic_clean 0:b8b1a42a45e1 0.07 0.10 testing:junit5,assertj,pdfbox-ba +cv-nordic_clean 0:2ec2836b6df6 0.09 0.10 layout-graphsnapshots,mutationte +cv-nordic_clean 0:74b69eb8de4b 0.11 0.10 distribution:mavencentral,sonaty +cv-nordic_clean 0:43ad67a4e3f5 0.13 0.10 signing,jitpack,semanticversioni +cv-nordic_clean 0:68bf0109c6f8 0.01 0.10 education cv-nordic_clean 0:904a600c3869 -0.02 0.10 msccomputerscience/universityofm cv-nordic_clean 0:3fa772117260 0.17 0.10 2019-2021 cv-nordic_clean 0:78a380e4d1f0 0.00 0.10 bscsoftwareengineering/imperialc cv-nordic_clean 0:30f9262640a0 0.19 0.10 2015-2019 -cv-nordic_clean 0:7b476727faf3 0.00 0.10 additional +cv-nordic_clean 0:7b476727faf3 0.05 0.10 additional cv-nordic_clean 0:3b0f5db9217f 0.02 0.10 languages:english(fluent),german cv-nordic_clean 0:d8a971cea795 0.00 0.10 spanish(basic) cv-nordic_clean 0:ec9d3622395e -0.02 0.10 workeligibility:eligibletoworkin @@ -981,81 +979,81 @@ cv-nordic_clean 0:d05b8b335e96 -0.04 0.10 opensource:maintainerofgraphcomp cv-nordic_clean 0:2f3b4176123d -0.06 0.10 contributortopdfboxissuetriage. cv-nordic_clean 0:b6b5a250cb72 0.02 0.10 speaking:jvmsummit2024,devoxxuk2 cv-nordic_clean 0:7ead14c50085 0.00 0.10 ondeclarativedocumentlayout. -cv-nordic_clean 0:53e5e7c5a884 -0.06 0.11 experience -cv-nordic_clean 0:4977534824cc -0.08 0.11 seniorplatformengineer/2024-pres -cv-nordic_clean 0:f890faef907f -0.04 0.11 northwindsystems -cv-nordic_clean 0:64c4b52dceb1 -0.07 0.11 ledthereusabledocument-generatio -cv-nordic_clean 0:b2773305641a -0.08 0.11 productteams.reducedtemplatemain -cv-nordic_clean 0:7be82f4e179d -0.09 0.11 onecanonicalengine. -cv-nordic_clean 0:7033b2988e4d -0.08 0.11 softwareengineer/2021-2024 -cv-nordic_clean 0:998c1a985022 -0.04 0.11 brightleaflabs -cv-nordic_clean 0:632618b20dab -0.07 0.11 builtbackendservicesandproductio -cv-nordic_clean 0:3c3f0a37747d -0.08 0.11 month.drovethemigrationfromitext -cv-nordic_clean 0:e710587711df -0.09 0.11 p99renderlatencyfrom1.4sto380ms. -cv-nordic_clean 0:fa8695dd2893 -0.08 0.11 backendengineer/2019-2021 -cv-nordic_clean 0:ef148f221e31 -0.04 0.11 helixprintco -cv-nordic_clean 0:41d451f465c2 -0.07 0.11 maintainedahigh-volumeinvoice-pr -cv-nordic_clean 0:6859fed08b66 -0.08 0.11 harnessthatgatedeverytemplatecha -cv-nordic_clean 0:d94eccbb1fbe -0.07 0.11 selectedprojects +cv-nordic_clean 0:53e5e7c5a884 -0.01 0.11 experience +cv-nordic_clean 0:4977534824cc -0.03 0.11 seniorplatformengineer/2024-pres +cv-nordic_clean 0:f890faef907f 0.01 0.11 northwindsystems +cv-nordic_clean 0:64c4b52dceb1 -0.02 0.11 ledthereusabledocument-generatio +cv-nordic_clean 0:b2773305641a -0.03 0.11 productteams.reducedtemplatemain +cv-nordic_clean 0:7be82f4e179d -0.04 0.11 onecanonicalengine. +cv-nordic_clean 0:7033b2988e4d -0.03 0.11 softwareengineer/2021-2024 +cv-nordic_clean 0:998c1a985022 0.01 0.11 brightleaflabs +cv-nordic_clean 0:632618b20dab -0.02 0.11 builtbackendservicesandproductio +cv-nordic_clean 0:3c3f0a37747d -0.03 0.11 month.drovethemigrationfromitext +cv-nordic_clean 0:e710587711df -0.04 0.11 p99renderlatencyfrom1.4sto380ms. +cv-nordic_clean 0:fa8695dd2893 -0.03 0.11 backendengineer/2019-2021 +cv-nordic_clean 0:ef148f221e31 0.01 0.11 helixprintco +cv-nordic_clean 0:41d451f465c2 -0.02 0.11 maintainedahigh-volumeinvoice-pr +cv-nordic_clean 0:6859fed08b66 -0.03 0.11 harnessthatgatedeverytemplatecha +cv-nordic_clean 0:d94eccbb1fbe -0.02 0.11 selectedprojects cv-nordic_clean 0:643428f0ebf8 0.00 0.11 templatestudio(kotlin,composedes cv-nordic_clean 0:c259a0e7581e 0.14 0.11 invoiceoutputacross14designprese cv-nordic_clean 0:f87e2f0c02dc 0.01 0.11 layoutlint(java21,javaparser,spo cv-nordic_clean 0:a646f74483b1 0.15 0.11 rows,untypedoffsets,implicitpage cv-nordic_clean 0:6793d28e9783 -0.43 0.11 chromeforge(java,graphcompose,pa cv-nordic_clean 0:e3cfea265b3b -0.29 0.11 graphcompose:cinematiccovers,pul -cv-orange_ops 0:a6c9a7bc3a1d -0.41 0.12 marcusbennett -cv-orange_ops 0:8157f110feec -0.29 0.12 warehouseoperationssupervisor +cv-orange_ops 0:a6c9a7bc3a1d 0.09 0.12 marcusbennett +cv-orange_ops 0:8157f110feec 0.01 0.12 warehouseoperationssupervisor cv-orange_ops 0:8157f110feec#1 -0.16 0.17 warehouseoperationssupervisor cv-orange_ops 0:a8acc3a90a7b -0.18 0.02 +447700900123 cv-orange_ops 0:e6da1125d5d5 -0.18 -0.37 marcus.bennett@email.com cv-orange_ops 0:6a3bd39f358d -0.18 -0.74 birmingham,westmidlands,uk cv-orange_ops 0:84308bea4540 -0.18 -1.02 linkedin cv-orange_ops 0:32c1cf49a2fe 0.03 0.12 skills -cv-orange_ops 0:8225698c0a01 -0.10 0.13 warehouseoperationsmanagement -cv-orange_ops 0:fab5b1b3f07b -0.11 0.13 teamleadership&development -cv-orange_ops 0:fe67bd8bcb96 -0.12 0.13 inventorycontrol&accuracy -cv-orange_ops 0:52d5776e1f94 -0.14 0.13 logistics&freightcoordination -cv-orange_ops 0:40c502892bf5 -0.15 0.13 orderfulfilment&dispatch -cv-orange_ops 0:16d5a33ecc7e -0.16 0.13 kpimonitoring&reporting -cv-orange_ops 0:01fc299910cc -0.18 0.13 leanprocessimprovement -cv-orange_ops 0:d52f9933e794 -0.19 0.13 health&safetycompliance -cv-orange_ops 0:2513b7af97dd -0.20 0.13 wms&erpsystems -cv-orange_ops 0:034e1f3a8777 -0.22 0.13 problemsolving&decisionmaking -cv-orange_ops 0:115925c1b96b -0.23 0.13 stakeholdercommunication +cv-orange_ops 0:8225698c0a01 0.20 0.13 warehouseoperationsmanagement +cv-orange_ops 0:fab5b1b3f07b 0.19 0.13 teamleadership&development +cv-orange_ops 0:fe67bd8bcb96 0.18 0.13 inventorycontrol&accuracy +cv-orange_ops 0:52d5776e1f94 0.16 0.13 logistics&freightcoordination +cv-orange_ops 0:40c502892bf5 0.15 0.13 orderfulfilment&dispatch +cv-orange_ops 0:16d5a33ecc7e 0.14 0.13 kpimonitoring&reporting +cv-orange_ops 0:01fc299910cc 0.12 0.13 leanprocessimprovement +cv-orange_ops 0:d52f9933e794 0.11 0.13 health&safetycompliance +cv-orange_ops 0:2513b7af97dd 0.10 0.13 wms&erpsystems +cv-orange_ops 0:034e1f3a8777 0.08 0.13 problemsolving&decisionmaking +cv-orange_ops 0:115925c1b96b 0.07 0.13 stakeholdercommunication cv-orange_ops 0:6ee18b42fbf1 -0.25 0.12 achievements -cv-orange_ops 0:8c76fa6dfb6b -0.22 0.06 15%productivityincrease -cv-orange_ops 0:5ba0c9469ae2 -0.39 0.06 improvedwarehouseproductivity -cv-orange_ops 0:4738b76d6b6a -0.35 0.06 by15%throughworkflow -cv-orange_ops 0:449e0d003818 -0.31 0.06 redesignandperformance -cv-orange_ops 0:7071b774bee5 -0.26 0.06 management. -cv-orange_ops 0:93d8df801c78 -0.23 0.11 99.2%inventoryaccuracy -cv-orange_ops 0:91021a576e54 -0.40 0.11 maintainedinventoryaccuracy -cv-orange_ops 0:ab234354692f -0.36 0.11 above99%for12consecutive -cv-orange_ops 0:6d4b37f38385 -0.32 0.11 monthsthroughcyclecount -cv-orange_ops 0:95eb3dca6f29 -0.27 0.11 disciplineandprocesscontrol. -cv-orange_ops 0:6c9aed656984 -0.25 0.11 zerolosttimeincidents -cv-orange_ops 0:af3bece11942 -0.42 0.11 ledasafety-firstcultureresulting -cv-orange_ops 0:0be170a927a8 -0.37 0.11 inzerolosttimeincidentsover24 -cv-orange_ops 0:326641f2b791 -0.33 0.11 monthsacrossoperations. -cv-orange_ops 0:44ad72befc81 -0.25 0.06 £280kcostsavings -cv-orange_ops 0:ccf85623aab7 -0.42 0.06 delivered£280kinannualsavings -cv-orange_ops 0:b43687fef93a -0.38 0.06 byreducingwaste,lowering -cv-orange_ops 0:c63a4328568d -0.33 0.06 overtimeandrenegotiatingcarrier -cv-orange_ops 0:203fe55e82c0 -0.29 0.06 contracts. +cv-orange_ops 0:8c76fa6dfb6b -0.07 0.06 15%productivityincrease +cv-orange_ops 0:5ba0c9469ae2 -0.14 0.06 improvedwarehouseproductivity +cv-orange_ops 0:4738b76d6b6a -0.10 0.06 by15%throughworkflow +cv-orange_ops 0:449e0d003818 -0.06 0.06 redesignandperformance +cv-orange_ops 0:7071b774bee5 -0.01 0.06 management. +cv-orange_ops 0:93d8df801c78 -0.08 0.11 99.2%inventoryaccuracy +cv-orange_ops 0:91021a576e54 -0.15 0.11 maintainedinventoryaccuracy +cv-orange_ops 0:ab234354692f -0.11 0.11 above99%for12consecutive +cv-orange_ops 0:6d4b37f38385 -0.07 0.11 monthsthroughcyclecount +cv-orange_ops 0:95eb3dca6f29 -0.02 0.11 disciplineandprocesscontrol. +cv-orange_ops 0:6c9aed656984 -0.10 0.11 zerolosttimeincidents +cv-orange_ops 0:af3bece11942 -0.17 0.11 ledasafety-firstcultureresulting +cv-orange_ops 0:0be170a927a8 -0.12 0.11 inzerolosttimeincidentsover24 +cv-orange_ops 0:326641f2b791 -0.08 0.11 monthsacrossoperations. +cv-orange_ops 0:44ad72befc81 -0.10 0.06 £280kcostsavings +cv-orange_ops 0:ccf85623aab7 -0.17 0.06 delivered£280kinannualsavings +cv-orange_ops 0:b43687fef93a -0.13 0.06 byreducingwaste,lowering +cv-orange_ops 0:c63a4328568d -0.08 0.06 overtimeandrenegotiatingcarrier +cv-orange_ops 0:203fe55e82c0 -0.04 0.06 contracts. cv-orange_ops 0:68bf0109c6f8 -0.33 0.12 education cv-orange_ops 0:c075e52d1429 -0.20 0.13 bsc(hons)logistics&supplychain cv-orange_ops 0:288965a1f2c8 -0.20 0.13 management -cv-orange_ops 0:4e3ad0b9c561 -0.23 0.13 demontfortuniversity -cv-orange_ops 0:19c022f9ca15 -0.23 0.13 leicester,uk -cv-orange_ops 0:2920a7fb42fc -0.43 0.13 2011–2014 +cv-orange_ops 0:4e3ad0b9c561 -0.18 0.13 demontfortuniversity +cv-orange_ops 0:19c022f9ca15 -0.18 0.13 leicester,uk +cv-orange_ops 0:2920a7fb42fc -0.18 0.13 2011–2014 cv-orange_ops 0:e831beb04c00 -0.34 0.12 certifications -cv-orange_ops 0:7bfe84d02a79 -0.26 0.12 ioshmanagingsafely +cv-orange_ops 0:7bfe84d02a79 -0.16 0.12 ioshmanagingsafely cv-orange_ops 0:a13fc3060cc2 -0.22 0.09 institutionofoccupationalsafetya -cv-orange_ops 0:cb9792111d09 -0.27 0.12 leansixsigmayellowbelt +cv-orange_ops 0:cb9792111d09 -0.17 0.12 leansixsigmayellowbelt cv-orange_ops 0:da7ec3a3fba6 -0.22 0.09 theknowledgeacademy–2020 -cv-orange_ops 0:8d34b20716e1 -0.27 0.12 counterbalanceforklifttruckinstr +cv-orange_ops 0:8d34b20716e1 -0.17 0.12 counterbalanceforklifttruckinstr cv-orange_ops 0:8225f209e334 -0.23 0.09 rtitb–2019 -cv-orange_ops 0:afcc559aff07 -0.28 0.12 firstaidatwork +cv-orange_ops 0:afcc559aff07 -0.18 0.12 firstaidatwork cv-orange_ops 0:2eff3c9d0161 -0.43 0.09 stjohnambulance–2019 cv-orange_ops 0:3c69d6bb4892 0.03 0.17 professionalprofile cv-orange_ops 0:41fad67acd21 0.15 0.17 environments.proventrackrecordof @@ -1063,47 +1061,47 @@ cv-orange_ops 0:08fe5844eac2 0.18 0.17 accuracy,anddeliveringexcellents cv-orange_ops 0:b1f2a388d597 0.20 0.17 andsafety.adeptatusingdatatodriv cv-orange_ops 0:0ef62989056c 0.23 0.17 measurableresults. cv-orange_ops 0:360626c9f718 0.02 0.17 workexperience -cv-orange_ops 0:03f6d636aa6b -0.12 0.20 mar2021–present +cv-orange_ops 0:03f6d636aa6b 0.13 0.20 mar2021–present cv-orange_ops 0:24c0d4863b50 0.12 0.17 expresslinkdistributionltd|birmi -cv-orange_ops 0:873c40886362 -0.20 0.17 •overseedailywarehouseoperations -cv-orange_ops 0:e789c025e038 -0.21 0.17 staffacrossinbound,storage,picki -cv-orange_ops 0:005412ac77a3 -0.13 0.17 •ensuretimelyandaccurateorderful -cv-orange_ops 0:4e9c4aed8e43 -0.16 0.17 •monitorandmaintaininventoryaccu -cv-orange_ops 0:1509c3cbd20f -0.16 0.17 variances. -cv-orange_ops 0:928837818f67 -0.09 0.17 •analysekpisandoperationaldatato -cv-orange_ops 0:70ed682534c9 -0.12 0.17 •coordinatewithtransportandcusto -cv-orange_ops 0:901159ffc9e3 -0.12 0.17 improveservicelevels. -cv-orange_ops 0:947008cdcf98 -0.10 0.17 •driveacultureofsafetyandaccount -cv-orange_ops 0:e6b1b813ff0b -0.10 0.17 compliancewithh&sregulations. -cv-orange_ops 0:c8a3bdb04f89 -0.08 0.17 •leadcontinuousimprovementinitia -cv-orange_ops 0:e28f5bf00122 -0.09 0.17 productivity. +cv-orange_ops 0:873c40886362 0.15 0.17 •overseedailywarehouseoperations +cv-orange_ops 0:e789c025e038 0.14 0.17 staffacrossinbound,storage,picki +cv-orange_ops 0:005412ac77a3 0.17 0.17 •ensuretimelyandaccurateorderful +cv-orange_ops 0:4e9c4aed8e43 0.19 0.17 •monitorandmaintaininventoryaccu +cv-orange_ops 0:1509c3cbd20f 0.19 0.17 variances. +cv-orange_ops 0:928837818f67 0.21 0.17 •analysekpisandoperationaldatato +cv-orange_ops 0:70ed682534c9 0.23 0.17 •coordinatewithtransportandcusto +cv-orange_ops 0:901159ffc9e3 0.23 0.17 improveservicelevels. +cv-orange_ops 0:947008cdcf98 0.25 0.17 •driveacultureofsafetyandaccount +cv-orange_ops 0:e6b1b813ff0b 0.25 0.17 compliancewithh&sregulations. +cv-orange_ops 0:c8a3bdb04f89 0.27 0.17 •leadcontinuousimprovementinitia +cv-orange_ops 0:e28f5bf00122 0.26 0.17 productivity. cv-orange_ops 0:bfb9273fea4d -0.08 0.17 warehouseteamleader -cv-orange_ops 0:9a8c213939be -0.04 0.20 may2017–feb2021 +cv-orange_ops 0:9a8c213939be 0.21 0.20 may2017–feb2021 cv-orange_ops 0:df1f256d362d 0.20 0.17 midlandgatelogistics|coventry,uk -cv-orange_ops 0:92d5e6992bc1 -0.07 0.17 •ledateamof25warehouseoperatives -cv-orange_ops 0:ec21a3e83856 -0.05 0.17 •managedinboundreceipts,putaway, -cv-orange_ops 0:ac1fa66fcf19 -0.02 0.17 •maintainedaccuratestockrecordsa -cv-orange_ops 0:195624e8565f 0.00 0.17 •supportedtheimplementationofane -cv-orange_ops 0:dd2458930e31 0.03 0.17 •reducedpickingerrorsby23%throug +cv-orange_ops 0:92d5e6992bc1 0.23 0.17 •ledateamof25warehouseoperatives +cv-orange_ops 0:ec21a3e83856 0.25 0.17 •managedinboundreceipts,putaway, +cv-orange_ops 0:ac1fa66fcf19 0.28 0.17 •maintainedaccuratestockrecordsa +cv-orange_ops 0:195624e8565f 0.30 0.17 •supportedtheimplementationofane +cv-orange_ops 0:dd2458930e31 0.33 0.17 •reducedpickingerrorsby23%throug cv-orange_ops 0:81219b44ff52 -0.02 0.17 warehousecoordinator -cv-orange_ops 0:eb5e95e8b64c 0.02 0.23 jun2015–apr2017 +cv-orange_ops 0:eb5e95e8b64c 0.27 0.23 jun2015–apr2017 cv-orange_ops 0:95f3c676853f 0.26 0.17 totalsupplysolutions|northampton -cv-orange_ops 0:3e147aae9ba8 -0.01 0.17 •coordinateddailyoperationsandal -cv-orange_ops 0:b786faa44990 0.01 0.17 •monitoredstocklevelsandinitiate -cv-orange_ops 0:9806038f6123 -0.06 0.17 •assistedwithkpireportingandperf -cv-orange_ops 0:c2ec5b8c794d -0.04 0.17 •ensuredcompliancewithcompanypol +cv-orange_ops 0:3e147aae9ba8 0.29 0.17 •coordinateddailyoperationsandal +cv-orange_ops 0:b786faa44990 0.31 0.17 •monitoredstocklevelsandinitiate +cv-orange_ops 0:9806038f6123 0.24 0.17 •assistedwithkpireportingandperf +cv-orange_ops 0:c2ec5b8c794d 0.26 0.17 •ensuredcompliancewithcompanypol cv-orange_ops 0:a691a9aab3fc 0.08 0.17 keykpisnapshot(recent12months) -cv-orange_ops 0:b5f6dbae04bd -0.28 0.29 15% -cv-orange_ops 0:e918ea42a538 -0.28 0.32 99.2% -cv-orange_ops 0:16906b6f3827 -0.28 0.29 98.4% -cv-orange_ops 0:bd1b16004d22 -0.07 0.39 productivity -cv-orange_ops 0:b11a85b296a9 -0.07 0.33 inventory -cv-orange_ops 0:b1e25044bf23 -0.07 0.33 on-time -cv-orange_ops 0:05595e942a13 -0.07 0.36 losttime -cv-orange_ops 0:e20a548f23fa -0.09 0.37 increase -cv-orange_ops 0:5879092f86c5 -0.09 0.37 accuracy -cv-orange_ops 0:b4af39d5b65a -0.09 0.31 delivery -cv-orange_ops 0:a6d1765ab64d -0.09 0.35 incidents +cv-orange_ops 0:b5f6dbae04bd 0.22 0.29 15% +cv-orange_ops 0:e918ea42a538 0.22 0.32 99.2% +cv-orange_ops 0:16906b6f3827 0.22 0.29 98.4% +cv-orange_ops 0:bd1b16004d22 0.23 0.39 productivity +cv-orange_ops 0:b11a85b296a9 0.23 0.33 inventory +cv-orange_ops 0:b1e25044bf23 0.23 0.33 on-time +cv-orange_ops 0:05595e942a13 0.23 0.36 losttime +cv-orange_ops 0:e20a548f23fa 0.21 0.37 increase +cv-orange_ops 0:5879092f86c5 0.21 0.37 accuracy +cv-orange_ops 0:b4af39d5b65a 0.21 0.31 delivery +cv-orange_ops 0:a6d1765ab64d 0.21 0.35 incidents cv-orange_ops 0:676dfdd56ad2 0.08 0.17 additionalinformation cv-orange_ops 0:0945b35c95a8 0.14 0.02 systems:sapewm,manhattanwms,micr cv-orange_ops 0:44aaa523dc2c 0.14 0.02 languages:english(native) @@ -1114,75 +1112,75 @@ cv-panel 0:2d58f0cadc2d 0.02 8.27 platformengineer cv-panel 0:89ff05847e96 0.04 8.54 london,uk|+442055551000 cv-panel 0:8817bf9310b6 -0.14 8.55 jordan.rivera@example.com|linked cv-panel 0:1900eab6c028 0.14 8.35 profile -cv-panel 0:80cc87fdc4c4 -0.33 8.35 platformengineerwith10+yearsbuil -cv-panel 0:c323ef4c385f -0.31 8.35 systems.specialisedinhigh-throug -cv-panel 0:3ff1933dba9a -0.29 8.35 typed,snapshot-testedlibrariesth +cv-panel 0:80cc87fdc4c4 0.17 8.35 platformengineerwith10+yearsbuil +cv-panel 0:c323ef4c385f 0.19 8.35 systems.specialisedinhigh-throug +cv-panel 0:3ff1933dba9a 0.21 8.35 typed,snapshot-testedlibrariesth cv-panel 0:32c1cf49a2fe 0.19 0.15 skills cv-panel 0:eea537278f83 -0.08 0.15 •languages:java21,kotlin,groovy, -cv-panel 0:7e941e729572 -0.26 0.15 •document&print:pdfbox,apachepoi -cv-panel 0:9e3166ce2413 -0.24 0.15 itext,postscript,icccolourprofil -cv-panel 0:ebc70ed9b71b -0.22 0.15 •layoutengines:customdsldesign,s -cv-panel 0:dd4f24d85605 -0.20 0.15 pagination,snapshottesting,visua -cv-panel 0:f5f76d479ec8 -0.18 0.15 •build&infrastructure:maven,grad -cv-panel 0:656a2a3e57e0 -0.16 0.15 jitpack,docker,jmhbenchmarking -cv-panel 0:9a6921f79b7d -0.25 0.15 •distribution:mavencentral,sonat -cv-panel 0:77a74982066f -0.23 0.15 jitpack,semanticversioningdiscip +cv-panel 0:7e941e729572 0.24 0.15 •document&print:pdfbox,apachepoi +cv-panel 0:9e3166ce2413 0.26 0.15 itext,postscript,icccolourprofil +cv-panel 0:ebc70ed9b71b 0.28 0.15 •layoutengines:customdsldesign,s +cv-panel 0:dd4f24d85605 0.30 0.15 pagination,snapshottesting,visua +cv-panel 0:f5f76d479ec8 0.32 0.15 •build&infrastructure:maven,grad +cv-panel 0:656a2a3e57e0 0.34 0.15 jitpack,docker,jmhbenchmarking +cv-panel 0:9a6921f79b7d 0.25 0.15 •distribution:mavencentral,sonat +cv-panel 0:77a74982066f 0.27 0.15 jitpack,semanticversioningdiscip cv-panel 0:68bf0109c6f8 0.25 0.15 education cv-panel 0:871923f4f0f2 0.23 0.15 msccomputerscience-2019-2021 -cv-panel 0:47ce0218bbea 0.25 0.15 universityofmanchester -cv-panel 0:51e1ec7daa5a 0.25 0.15 distinction.thesis:composablelay -cv-panel 0:d10553cd7368 0.27 0.15 deterministicdocumentrendering. +cv-panel 0:47ce0218bbea 0.30 0.15 universityofmanchester +cv-panel 0:51e1ec7daa5a 0.30 0.15 distinction.thesis:composablelay +cv-panel 0:d10553cd7368 0.32 0.15 deterministicdocumentrendering. cv-panel 0:ba6d361079f4 0.29 0.15 bscsoftwareengineering-2015-2019 -cv-panel 0:89ad9656f393 0.31 0.15 imperialcollegelondon -cv-panel 0:4c58bcad7242 0.31 0.15 first-classhonours.specialisatio -cv-panel 0:2189b9b3b549 0.33 0.15 analysis. +cv-panel 0:89ad9656f393 0.36 0.15 imperialcollegelondon +cv-panel 0:4c58bcad7242 0.36 0.15 first-classhonours.specialisatio +cv-panel 0:2189b9b3b549 0.38 0.15 analysis. cv-panel 0:8971b01c36bb 0.25 0.15 oraclejavacertification-2023-202 -cv-panel 0:2669e1f6d55c 0.27 0.15 professionaltrack -cv-panel 0:4f17e3d7d6f4 -0.18 0.15 java17platformdeep-dive:records, -cv-panel 0:9e6154a3b625 -0.16 0.15 matching,virtualthreads. +cv-panel 0:2669e1f6d55c 0.32 0.15 professionaltrack +cv-panel 0:4f17e3d7d6f4 0.32 0.15 java17platformdeep-dive:records, +cv-panel 0:9e6154a3b625 0.34 0.15 matching,virtualthreads. cv-panel 0:7b476727faf3 0.37 0.15 additional -cv-panel 0:3f88eb4c530c 0.35 0.15 languages:english(fluent),german -cv-panel 0:5d276fee8c17 0.37 0.15 (basic) +cv-panel 0:3f88eb4c530c 0.40 0.15 languages:english(fluent),german +cv-panel 0:5d276fee8c17 0.42 0.15 (basic) cv-panel 0:ec9d3622395e 0.39 0.15 workeligibility:eligibletoworkin -cv-panel 0:d05b8b335e96 0.41 0.15 opensource:maintainerofgraphcomp -cv-panel 0:2f3b4176123d 0.43 0.15 contributortopdfboxissuetriage. -cv-panel 0:1ae173b42166 0.00 0.15 speaking:jvmsummit2024,devoxxuk2 -cv-panel 0:309255ca6a36 0.02 0.15 declarativedocumentlayout. +cv-panel 0:d05b8b335e96 0.46 0.15 opensource:maintainerofgraphcomp +cv-panel 0:2f3b4176123d 0.48 0.15 contributortopdfboxissuetriage. +cv-panel 0:1ae173b42166 0.50 0.15 speaking:jvmsummit2024,devoxxuk2 +cv-panel 0:309255ca6a36 0.52 0.15 declarativedocumentlayout. cv-panel 0:53e5e7c5a884 0.19 0.16 experience cv-panel 0:99b44abc1b3e 0.17 0.16 seniorplatformengineer-2024-pres -cv-panel 0:f890faef907f 0.19 0.16 northwindsystems -cv-panel 0:e32ca827bfd5 0.19 0.16 ledthereusabledocument-generatio -cv-panel 0:675f8862fdda 0.21 0.16 hiring,andreportingflowsacross8p -cv-panel 0:93d48fc85054 0.23 0.16 templatemaintenancetimeby70%byre -cv-panel 0:e7f09e2ba7d2 0.25 0.16 scriptsinfavourofonecanonicaleng +cv-panel 0:f890faef907f 0.24 0.16 northwindsystems +cv-panel 0:e32ca827bfd5 0.24 0.16 ledthereusabledocument-generatio +cv-panel 0:675f8862fdda 0.26 0.16 hiring,andreportingflowsacross8p +cv-panel 0:93d48fc85054 0.28 0.16 templatemaintenancetimeby70%byre +cv-panel 0:e7f09e2ba7d2 0.30 0.16 scriptsinfavourofonecanonicaleng cv-panel 0:ded138c59d03 0.27 0.16 softwareengineer-2021-2024 -cv-panel 0:998c1a985022 0.19 0.16 brightleaflabs -cv-panel 0:0ed66ac9265d 0.19 0.16 builtbackendservicesandproductio -cv-panel 0:17c4ef49d4e6 0.21 0.16 pipelinesprocessing2m+documentsp -cv-panel 0:a7dd3c5be76b 0.23 0.16 migrationfromitexttoacustomlayou -cv-panel 0:a35401d8bcad 0.25 0.16 licensingriskandcuttingp99render -cv-panel 0:649d2d9d10d0 0.27 0.16 380ms. +cv-panel 0:998c1a985022 0.24 0.16 brightleaflabs +cv-panel 0:0ed66ac9265d 0.24 0.16 builtbackendservicesandproductio +cv-panel 0:17c4ef49d4e6 0.26 0.16 pipelinesprocessing2m+documentsp +cv-panel 0:a7dd3c5be76b 0.28 0.16 migrationfromitexttoacustomlayou +cv-panel 0:a35401d8bcad 0.30 0.16 licensingriskandcuttingp99render +cv-panel 0:649d2d9d10d0 0.32 0.16 380ms. cv-panel 0:019bbdc8d0bb 0.19 0.16 backendengineer-2019-2021 -cv-panel 0:ef148f221e31 0.21 0.16 helixprintco -cv-panel 0:09cc06a649eb -0.24 0.16 maintainedahigh-volumeinvoice-pr -cv-panel 0:090e2184c17b -0.22 0.16 pdfs/year)andauthoredthecomplian -cv-panel 0:6f071fdf7529 -0.20 0.16 gatedeverytemplatechange. +cv-panel 0:ef148f221e31 0.26 0.16 helixprintco +cv-panel 0:09cc06a649eb 0.26 0.16 maintainedahigh-volumeinvoice-pr +cv-panel 0:090e2184c17b 0.28 0.16 pdfs/year)andauthoredthecomplian +cv-panel 0:6f071fdf7529 0.30 0.16 gatedeverytemplatechange. cv-panel 0:2577c0f557b2 0.28 0.16 projects cv-panel 0:b2b029995203 0.01 0.16 •graphcompose(java21,pdfbox,mave -cv-panel 0:81c8132f9792 -0.11 0.16 systems.(opensource) -cv-panel 0:753f46e4e01b -0.09 0.16 •templatestudio(kotlin,composede -cv-panel 0:6eb35b5b9a91 -0.07 0.16 diff) -cv-panel 0:d919bd2d50b6 -0.20 0.16 internaltoolforevaluatingcv,prop -cv-panel 0:245b9e56b9de -0.18 0.16 across14designpresets.pngdiffing -cv-panel 0:6bc2807453c6 -0.16 0.16 baselinefreezing. +cv-panel 0:81c8132f9792 0.39 0.16 systems.(opensource) +cv-panel 0:753f46e4e01b 0.41 0.16 •templatestudio(kotlin,composede +cv-panel 0:6eb35b5b9a91 0.43 0.16 diff) +cv-panel 0:d919bd2d50b6 0.30 0.16 internaltoolforevaluatingcv,prop +cv-panel 0:245b9e56b9de 0.32 0.16 across14designpresets.pngdiffing +cv-panel 0:6bc2807453c6 0.34 0.16 baselinefreezing. cv-panel 0:25cdca2beb8b 0.06 0.16 •layoutlint(java21,javaparser,sp -cv-panel 0:30e034b9c7b2 -0.12 0.16 staticanalyserthatflagsfragileau -cv-panel 0:e7ad19d64668 -0.10 0.16 nestedrows,untypedoffsets,implic -cv-panel 0:95ac1a62c76f -0.08 0.16 theyshiptoproduction. +cv-panel 0:30e034b9c7b2 0.38 0.16 staticanalyserthatflagsfragileau +cv-panel 0:e7ad19d64668 0.40 0.16 nestedrows,untypedoffsets,implic +cv-panel 0:95ac1a62c76f 0.42 0.16 theyshiptoproduction. cv-panel 0:fb1927f88597 -0.01 0.16 •chromeforge(java,graphcompose,p -cv-panel 0:bb865a4ccac1 -0.19 0.16 editorial-magazinedocumenttoolki -cv-panel 0:8a31ccd889ee -0.17 0.16 cinematiccovers,pullquotes,multi -cv-panel 0:fe63fe18585a -0.15 0.16 callouts. +cv-panel 0:bb865a4ccac1 0.31 0.16 editorial-magazinedocumenttoolki +cv-panel 0:8a31ccd889ee 0.33 0.16 cinematiccovers,pullquotes,multi +cv-panel 0:fe63fe18585a 0.35 0.16 callouts. cv-professional_sidebar 0:093e7d5fdbaa 0.02 0.10 contact cv-professional_sidebar 0:7f459725e1f6 0.02 0.00 +12345678900 cv-professional_sidebar 0:52bf11c1afe0 -0.03 0.00 your.email@example.com @@ -1190,115 +1188,115 @@ cv-professional_sidebar 0:0280d774794b -0.13 0.00 city,state,country cv-professional_sidebar 0:6901da423fd3 -0.08 0.00 linkedin.com/in/username cv-professional_sidebar 0:941682c65056 -0.13 0.00 www.yourwebsite.com cv-professional_sidebar 0:32c1cf49a2fe 0.02 0.10 skills -cv-professional_sidebar 0:38a0963a6364 -0.20 0.10 java -cv-professional_sidebar 0:7e901df4274b -0.20 0.10 springboot -cv-professional_sidebar 0:ab1011e077e1 -0.20 0.10 sql/databases -cv-professional_sidebar 0:bcfad352e21d -0.20 0.10 restfulapis -cv-professional_sidebar 0:60a872f76d54 -0.20 0.10 microservices -cv-professional_sidebar 0:0c525b8c00a0 -0.20 0.10 git/github -cv-professional_sidebar 0:d548c5b83fa6 -0.20 0.10 docker -cv-professional_sidebar 0:d1de52313c86 -0.20 0.10 testing(junit) -cv-professional_sidebar 0:7e7f74200f0e -0.20 0.10 problemsolving -cv-professional_sidebar 0:d4e16994df90 -0.20 0.10 communication +cv-professional_sidebar 0:38a0963a6364 0.00 0.10 java +cv-professional_sidebar 0:7e901df4274b 0.00 0.10 springboot +cv-professional_sidebar 0:ab1011e077e1 0.00 0.10 sql/databases +cv-professional_sidebar 0:bcfad352e21d 0.00 0.10 restfulapis +cv-professional_sidebar 0:60a872f76d54 0.00 0.10 microservices +cv-professional_sidebar 0:0c525b8c00a0 0.00 0.10 git/github +cv-professional_sidebar 0:d548c5b83fa6 0.00 0.10 docker +cv-professional_sidebar 0:d1de52313c86 0.00 0.10 testing(junit) +cv-professional_sidebar 0:7e7f74200f0e 0.00 0.10 problemsolving +cv-professional_sidebar 0:d4e16994df90 0.00 0.10 communication cv-professional_sidebar 0:68bf0109c6f8 0.02 0.10 education cv-professional_sidebar 0:9928b2859b5c -0.02 0.10 degreename cv-professional_sidebar 0:9928b2859b5c#1 -0.06 0.10 degreename cv-professional_sidebar 0:4dca5f288079 -0.05 0.10 universityname cv-professional_sidebar 0:4dca5f288079#1 -0.09 0.10 universityname -cv-professional_sidebar 0:dbbecd8a99c4 -0.22 0.10 2016–2020 -cv-professional_sidebar 0:8789bd1a8f91 -0.26 0.10 2012–2016 +cv-professional_sidebar 0:dbbecd8a99c4 -0.07 0.10 2016–2020 +cv-professional_sidebar 0:8789bd1a8f91 -0.11 0.10 2012–2016 cv-professional_sidebar 0:6cb574fa10b6 -0.06 0.10 languages -cv-professional_sidebar 0:b6234d2ea0d6 -0.28 0.10 english -cv-professional_sidebar 0:87d8ab25d296 -0.28 0.10 ukrainian -cv-professional_sidebar 0:aa304b5d1d72 -0.28 0.10 russian -cv-professional_sidebar 0:22f6e39681dd 0.25 0.09 yourname -cv-professional_sidebar 0:ce613d3da423 -0.02 0.09 yourprofessionaltitle -cv-professional_sidebar 0:1900eab6c028 0.02 0.09 profile -cv-professional_sidebar 0:53e5e7c5a884 0.01 0.09 experience +cv-professional_sidebar 0:b6234d2ea0d6 -0.08 0.10 english +cv-professional_sidebar 0:87d8ab25d296 -0.08 0.10 ukrainian +cv-professional_sidebar 0:aa304b5d1d72 -0.08 0.10 russian +cv-professional_sidebar 0:22f6e39681dd 0.05 0.09 yourname +cv-professional_sidebar 0:ce613d3da423 0.03 0.09 yourprofessionaltitle +cv-professional_sidebar 0:1900eab6c028 0.07 0.09 profile +cv-professional_sidebar 0:53e5e7c5a884 0.06 0.09 experience cv-professional_sidebar 0:59d596674b3e -0.19 0.09 javabackenddeveloper cv-professional_sidebar 0:50c8c8fd14da -0.08 1.49 2023–present -cv-professional_sidebar 0:bb2dd5ad974a 0.00 0.09 productstudio|london,uk -cv-professional_sidebar 0:ceaee04c6187 -0.19 0.09 •builtsecurespringbootrestapisfo -cv-professional_sidebar 0:ee25fe80eeb5 -0.21 0.09 •addedjwtauthentication,validati -cv-professional_sidebar 0:f44671369999 -0.23 0.09 •tunedjpaqueriesandpostgresqlind -cv-professional_sidebar 0:2bc488c1b6a1 -0.25 0.09 •addedjunittestsanddockerenviron +cv-professional_sidebar 0:bb2dd5ad974a 0.05 0.09 productstudio|london,uk +cv-professional_sidebar 0:ceaee04c6187 0.01 0.09 •builtsecurespringbootrestapisfo +cv-professional_sidebar 0:ee25fe80eeb5 -0.01 0.09 •addedjwtauthentication,validati +cv-professional_sidebar 0:f44671369999 -0.03 0.09 •tunedjpaqueriesandpostgresqlind +cv-professional_sidebar 0:2bc488c1b6a1 -0.05 0.09 •addedjunittestsanddockerenviron cv-professional_sidebar 0:798164649242 -0.26 0.09 softwaredeveloper cv-professional_sidebar 0:d8ce4fa21722 -0.15 1.27 2021–2023 -cv-professional_sidebar 0:8824d2ae15b0 -0.07 0.09 digitalsolutionsltd|manchester,u -cv-professional_sidebar 0:2e3ec0f8e8c9 -0.26 0.09 •integratedinternalserviceswitht -cv-professional_sidebar 0:34a68587109d -0.28 0.09 •deliveredflywaymigrationsandimp -cv-professional_sidebar 0:d3e359b3c9ce -0.30 0.09 •introducedstructuredloggingandp -cv-professional_sidebar 0:69a682467a69 -0.22 0.09 •workedwithfrontendengineersoncl +cv-professional_sidebar 0:8824d2ae15b0 -0.02 0.09 digitalsolutionsltd|manchester,u +cv-professional_sidebar 0:2e3ec0f8e8c9 -0.06 0.09 •integratedinternalserviceswitht +cv-professional_sidebar 0:34a68587109d -0.08 0.09 •deliveredflywaymigrationsandimp +cv-professional_sidebar 0:d3e359b3c9ce -0.10 0.09 •introducedstructuredloggingandp +cv-professional_sidebar 0:69a682467a69 -0.02 0.09 •workedwithfrontendengineersoncl cv-professional_sidebar 0:bcde83e4c2f6 -0.23 0.09 juniorjavadeveloper cv-professional_sidebar 0:6c39082d9294 -0.12 1.27 2019–2021 -cv-professional_sidebar 0:25bd55f46bdf -0.04 0.09 techworks|remote -cv-professional_sidebar 0:1ee9d7642bbb -0.23 0.09 •developedjavaservicesandreusabl -cv-professional_sidebar 0:a96267ad58f6 -0.25 0.09 •fixeddefectsacrossrest,persiste -cv-professional_sidebar 0:dfaa35ac8977 -0.27 0.09 •wrotejunittestsandsupportedcont -cv-professional_sidebar 0:a232e51261bb -0.29 0.09 •documentedendpointsandoperation -cv-professional_sidebar 0:2577c0f557b2 -0.09 0.09 projects +cv-professional_sidebar 0:25bd55f46bdf 0.01 0.09 techworks|remote +cv-professional_sidebar 0:1ee9d7642bbb -0.03 0.09 •developedjavaservicesandreusabl +cv-professional_sidebar 0:a96267ad58f6 -0.05 0.09 •fixeddefectsacrossrest,persiste +cv-professional_sidebar 0:dfaa35ac8977 -0.07 0.09 •wrotejunittestsandsupportedcont +cv-professional_sidebar 0:a232e51261bb -0.09 0.09 •documentedendpointsandoperation +cv-professional_sidebar 0:2577c0f557b2 -0.04 0.09 projects cv-professional_sidebar 0:55f503c6b9a8 -0.29 0.09 cvrewriter cv-professional_sidebar 0:158a323a7ba4 -0.18 0.55 2026 cv-professional_sidebar 0:6ee87c5d8b09 -0.10 0.09 ai-poweredresumetailoringplatfor cv-professional_sidebar 0:810d1e1d40e0 -0.10 0.09 andapplicationtracking. cv-professional_sidebar 0:d8afbbbd5294 -0.21 0.09 graphcompose cv-professional_sidebar 0:b2b2f104d32c -0.10 0.55 2025 -cv-professional_sidebar 0:403f46579303 -0.47 0.09 declarativejavaandkotlindocument -cv-professional_sidebar 0:9c15026b6402 -0.47 0.09 multi-formatrendering. -cv-professional_sidebar 0:07a0b0962107 -0.02 0.09 references +cv-professional_sidebar 0:403f46579303 -0.02 0.09 declarativejavaandkotlindocument +cv-professional_sidebar 0:9c15026b6402 -0.02 0.09 multi-formatrendering. +cv-professional_sidebar 0:07a0b0962107 0.03 0.09 references cv-professional_sidebar 0:5bf64f34444e -0.22 0.09 availableuponrequest. cv-serif_headline 0:5f6ca99b67a6 -0.51 0.12 alexandermorgan cv-serif_headline 0:daf65306b3b6 0.03 0.12 softwareengineer cv-serif_headline 0:daf65306b3b6#1 -0.09 0.10 softwareengineer -cv-serif_headline 0:01dcad830244 -0.22 0.07 +1(555)123-4567 -cv-serif_headline 0:3eef38c97138 -0.18 0.07 alex.morgan@email.com -cv-serif_headline 0:d5a0d0abdc64 -0.15 0.07 newyork,ny,usa -cv-serif_headline 0:a0a064d0e491 -0.12 0.07 linkedin.com/in/alexmorgan -cv-serif_headline 0:0a52c5f62d73 -0.09 0.07 github.com/alexmorgan -cv-serif_headline 0:ff00f99bc03c -0.01 0.12 softwareengineerwith5+yearsofexp -cv-serif_headline 0:7fd0d2d0fde8 -0.02 0.12 backendservices.proficientinjava -cv-serif_headline 0:81bb94512f0b -0.03 0.12 systemdesign,anddeliveringhigh-q -cv-serif_headline 0:53e5e7c5a884 -0.15 0.13 experience +cv-serif_headline 0:01dcad830244 0.03 0.07 +1(555)123-4567 +cv-serif_headline 0:3eef38c97138 0.07 0.07 alex.morgan@email.com +cv-serif_headline 0:d5a0d0abdc64 0.10 0.07 newyork,ny,usa +cv-serif_headline 0:a0a064d0e491 0.13 0.07 linkedin.com/in/alexmorgan +cv-serif_headline 0:0a52c5f62d73 0.16 0.07 github.com/alexmorgan +cv-serif_headline 0:ff00f99bc03c 0.04 0.12 softwareengineerwith5+yearsofexp +cv-serif_headline 0:7fd0d2d0fde8 0.03 0.12 backendservices.proficientinjava +cv-serif_headline 0:81bb94512f0b 0.02 0.12 systemdesign,anddeliveringhigh-q +cv-serif_headline 0:53e5e7c5a884 0.20 0.13 experience cv-serif_headline 0:b37c6a2d5d11 -0.16 0.10 seniorsoftwareengineer cv-serif_headline 0:e7227bbe0c40 -0.06 0.76 jan2022–present cv-serif_headline 0:f4e5af202d87 0.05 0.10 techsolutionsinc.|newyork,ny -cv-serif_headline 0:e6f39d8143bc -0.35 0.10 •designedanddevelopedmicroservic -cv-serif_headline 0:f41ff924454c -0.35 0.10 over1mactiveusers. -cv-serif_headline 0:4b16c2d8cb52 -0.10 0.10 •implementedrestfulapisandintegr -cv-serif_headline 0:5fd82b15227c -0.34 0.10 •optimizeddatabasequeriesandappl -cv-serif_headline 0:38a7ed6f25a8 -0.35 0.10 35%. -cv-serif_headline 0:df1ebc2b61e1 -0.09 0.10 •ledateamof4engineersandmentored +cv-serif_headline 0:e6f39d8143bc 0.15 0.10 •designedanddevelopedmicroservic +cv-serif_headline 0:f41ff924454c 0.15 0.10 over1mactiveusers. +cv-serif_headline 0:4b16c2d8cb52 0.15 0.10 •implementedrestfulapisandintegr +cv-serif_headline 0:5fd82b15227c 0.16 0.10 •optimizeddatabasequeriesandappl +cv-serif_headline 0:38a7ed6f25a8 0.15 0.10 35%. +cv-serif_headline 0:df1ebc2b61e1 0.16 0.10 •ledateamof4engineersandmentored cv-serif_headline 0:ee96c91a5683 0.00 0.80 jun2019–dec2021 cv-serif_headline 0:01bb3d9e4f47 0.11 0.10 innovatechltd.|newyork,ny -cv-serif_headline 0:1e69401eddeb -0.03 0.10 •builtscalablewebapplicationsusi -cv-serif_headline 0:babe9476fc8f -0.02 0.10 •collaboratedwithcross-functiona -cv-serif_headline 0:23cd6cbea0ca -0.02 0.10 •implementedci/cdpipelinesusingj -cv-serif_headline 0:45cca445fa04 -0.01 0.10 •improvedcodequalityandreducedpr +cv-serif_headline 0:1e69401eddeb 0.22 0.10 •builtscalablewebapplicationsusi +cv-serif_headline 0:babe9476fc8f 0.23 0.10 •collaboratedwithcross-functiona +cv-serif_headline 0:23cd6cbea0ca 0.23 0.10 •implementedci/cdpipelinesusingj +cv-serif_headline 0:45cca445fa04 0.24 0.10 •improvedcodequalityandreducedpr cv-serif_headline 0:78b24f507c79 -0.01 0.10 juniorsoftwareengineer cv-serif_headline 0:07b9e4fd0073 0.08 0.81 jun2018–may2019 cv-serif_headline 0:2198cdea3aba 0.19 0.10 devsphere|newyork,ny -cv-serif_headline 0:173ed9f7b6b1 0.05 0.10 •assistedindevelopingandmaintain -cv-serif_headline 0:0a1fbe0c94d9 0.05 0.10 •wroteunitandintegrationteststoe -cv-serif_headline 0:bd5eec545fa8 0.06 0.10 •participatedinagileceremoniesan -cv-serif_headline 0:2577c0f557b2 -0.01 0.13 projects -cv-serif_headline 0:c03ade0f8985 0.24 0.13 e-commerceplatform +cv-serif_headline 0:173ed9f7b6b1 0.30 0.10 •assistedindevelopingandmaintain +cv-serif_headline 0:0a1fbe0c94d9 0.30 0.10 •wroteunitandintegrationteststoe +cv-serif_headline 0:bd5eec545fa8 0.31 0.10 •participatedinagileceremoniesan +cv-serif_headline 0:2577c0f557b2 0.34 0.13 projects +cv-serif_headline 0:c03ade0f8985 0.29 0.13 e-commerceplatform cv-serif_headline 0:f726495cb8e6 0.19 0.13 java,springboot,react,postgresql -cv-serif_headline 0:09271909c2c5 -0.19 0.13 developedafull-stacke-commerce -cv-serif_headline 0:a395647dca6c -0.19 0.13 platformwithuserauthentication,p -cv-serif_headline 0:19ed6c29c718 -0.19 0.13 catalog,cart,andpaymentintegrati -cv-serif_headline 0:1c1e5cfc5031 0.24 0.11 taskmanagementapi +cv-serif_headline 0:09271909c2c5 0.26 0.13 developedafull-stacke-commerce +cv-serif_headline 0:a395647dca6c 0.26 0.13 platformwithuserauthentication,p +cv-serif_headline 0:19ed6c29c718 0.26 0.13 catalog,cart,andpaymentintegrati +cv-serif_headline 0:1c1e5cfc5031 0.29 0.11 taskmanagementapi cv-serif_headline 0:4e8f2a166cfe 0.19 0.11 java,springboot,mongodb,docker -cv-serif_headline 0:793437bcb507 -0.19 0.11 builtarestfulapifortaskmanagemen -cv-serif_headline 0:47492456be77 -0.19 0.11 withrole-basedaccess,real-time -cv-serif_headline 0:7d9a1a98ac6c -0.19 0.11 updates,anddockerizeddeployment. -cv-serif_headline 0:68bf0109c6f8 -0.15 0.09 education -cv-serif_headline 0:6a75b3a10877 0.07 0.14 m.s.incomputerscience +cv-serif_headline 0:793437bcb507 0.26 0.11 builtarestfulapifortaskmanagemen +cv-serif_headline 0:47492456be77 0.26 0.11 withrole-basedaccess,real-time +cv-serif_headline 0:7d9a1a98ac6c 0.26 0.11 updates,anddockerizeddeployment. +cv-serif_headline 0:68bf0109c6f8 0.20 0.09 education +cv-serif_headline 0:6a75b3a10877 0.12 0.14 m.s.incomputerscience cv-serif_headline 0:d244381bfb58 0.05 0.14 newyorkuniversity cv-serif_headline 0:d52c9df2c684 0.09 0.14 2018–2020|newyork,ny -cv-serif_headline 0:8913dcd543d0 0.14 0.14 b.s.incomputerscience +cv-serif_headline 0:8913dcd543d0 0.19 0.14 b.s.incomputerscience cv-serif_headline 0:ee7a3f01df1e 0.13 0.14 universityofcalifornia,losangele cv-serif_headline 0:5f29961bb46f 0.01 0.14 2014–2018|losangeles,ca -cv-serif_headline 0:32c1cf49a2fe -0.03 0.09 skills +cv-serif_headline 0:32c1cf49a2fe 0.32 0.09 skills cv-serif_headline 0:6cb574fa10b6 0.00 0.14 languages cv-serif_headline 0:38a0963a6364 -0.08 0.14 java cv-serif_headline 0:11a4a60b518b -0.04 0.14 python @@ -1317,40 +1315,40 @@ cv-serif_headline 0:1cc9a79bdaf0 0.34 0.14 mongodb cv-serif_headline 0:7dc785098784 0.36 0.14 tools&technologies cv-serif_headline 0:d548c5b83fa6 0.38 0.14 docker cv-serif_headline 0:94abcb2d2773 0.42 0.14 kubernetes -cv-serif_headline 0:94abcb2d2773#1 0.37 0.11 kubernetes +cv-serif_headline 0:94abcb2d2773#1 0.82 0.11 kubernetes cv-serif_headline 0:424e9661130e 0.46 0.14 jenkins cv-serif_headline 0:9a881b9b9f23 0.50 0.14 git cv-serif_headline 0:7d1507284a57 0.53 0.14 aws cv-serif_headline 0:b78463a925a0 0.70 0.14 softskills -cv-serif_headline 0:1b3b2a6f7d93 0.58 0.14 problemsolving|communication -cv-serif_headline 0:c3738991cb30 0.59 0.14 teamwork|adaptability -cv-serif_headline 0:7bce4fcdeb12 0.60 0.14 leadership|timemanagement -cv-serif_headline 0:e831beb04c00 0.51 0.08 certifications -cv-serif_headline 0:eb246465ec07 0.37 0.13 awscertified -cv-serif_headline 0:a48e133bb1b3 0.38 0.13 developer–associate +cv-serif_headline 0:1b3b2a6f7d93 0.83 0.14 problemsolving|communication +cv-serif_headline 0:c3738991cb30 0.84 0.14 teamwork|adaptability +cv-serif_headline 0:7bce4fcdeb12 0.85 0.14 leadership|timemanagement +cv-serif_headline 0:e831beb04c00 0.86 0.08 certifications +cv-serif_headline 0:eb246465ec07 0.82 0.13 awscertified +cv-serif_headline 0:a48e133bb1b3 0.83 0.13 developer–associate cv-serif_headline 0:eb2d55035d04 0.65 0.13 (aws) -cv-serif_headline 0:39f98aca30e7 0.37 0.06 oraclecertified -cv-serif_headline 0:6b5ac810679c 0.38 0.06 professional, +cv-serif_headline 0:39f98aca30e7 0.82 0.06 oraclecertified +cv-serif_headline 0:6b5ac810679c 0.83 0.06 professional, cv-serif_headline 0:d52585984184 0.65 0.06 javase17(oracle) -cv-serif_headline 0:72be4e94032e 0.37 0.07 dockercertified -cv-serif_headline 0:178b6e061a04 0.38 0.07 associate +cv-serif_headline 0:72be4e94032e 0.82 0.07 dockercertified +cv-serif_headline 0:178b6e061a04 0.83 0.07 associate cv-serif_headline 0:418860eec88d 0.65 0.07 (dca) -cv-serif_headline 0:958c81247482 0.37 0.09 springprofessional -cv-serif_headline 0:b00a6c108553 0.38 0.09 certification +cv-serif_headline 0:958c81247482 0.82 0.09 springprofessional +cv-serif_headline 0:b00a6c108553 0.83 0.09 certification cv-serif_headline 0:485507d8292d 0.65 0.09 (vmware) -cv-serif_headline 0:64a3f18ab4fa 0.38 0.11 fundamentals +cv-serif_headline 0:64a3f18ab4fa 0.83 0.11 fundamentals cv-serif_headline 0:f4bf1c62326f 0.65 0.11 (linuxfoundation) -cv-serif_headline 0:6ee18b42fbf1 0.50 0.08 achievements -cv-serif_headline 0:e3072a9546f9 0.78 0.13 engineeroftheyear–2023 -cv-serif_headline 0:e658796611c9 0.33 0.13 recognizedforoutstandingperforma -cv-serif_headline 0:c1c5f58006ec 0.37 0.13 leadership. -cv-serif_headline 0:daa04ec0f117 0.78 0.05 performanceoptimization -cv-serif_headline 0:781774e3ebfe 0.33 0.05 improvedsystemefficiencyby40% -cv-serif_headline 0:95099c880a38 0.37 0.05 throughdatabaseandcodeoptimizati -cv-serif_headline 0:4d752ab730a4 0.78 0.10 successfulmigration -cv-serif_headline 0:71abb443ce1c 0.33 0.10 ledthemigrationofamonolithapplic -cv-serif_headline 0:af70de72fe57 0.37 0.10 tomicroservicesarchitecture. -cv-sidebar_portrait 0:8f1010120ed6 -0.63 0.14 jordanrivera +cv-serif_headline 0:6ee18b42fbf1 0.85 0.08 achievements +cv-serif_headline 0:e3072a9546f9 0.83 0.13 engineeroftheyear–2023 +cv-serif_headline 0:e658796611c9 0.78 0.13 recognizedforoutstandingperforma +cv-serif_headline 0:c1c5f58006ec 0.82 0.13 leadership. +cv-serif_headline 0:daa04ec0f117 0.83 0.05 performanceoptimization +cv-serif_headline 0:781774e3ebfe 0.78 0.05 improvedsystemefficiencyby40% +cv-serif_headline 0:95099c880a38 0.82 0.05 throughdatabaseandcodeoptimizati +cv-serif_headline 0:4d752ab730a4 0.83 0.10 successfulmigration +cv-serif_headline 0:71abb443ce1c 0.78 0.10 ledthemigrationofamonolithapplic +cv-serif_headline 0:af70de72fe57 0.82 0.10 tomicroservicesarchitecture. +cv-sidebar_portrait 0:8f1010120ed6 0.12 0.14 jordanrivera cv-sidebar_portrait 0:89674e6f130e 0.07 0.60 +442055551000 cv-sidebar_portrait 0:e0f850305ded 0.07 0.60 jordan.rivera@example.com cv-sidebar_portrait 0:fbeea547d99e 0.07 0.60 london,uk @@ -1364,59 +1362,59 @@ cv-sidebar_portrait 0:b6749d0b616b -0.05 0.10 bscsoftwareengineering cv-sidebar_portrait 0:89ad9656f393 -0.04 0.10 imperialcollegelondon cv-sidebar_portrait 0:30f9262640a0 -0.05 0.10 2015-2019 cv-sidebar_portrait 0:32c1cf49a2fe -0.02 0.10 skills -cv-sidebar_portrait 0:d5680c2e2769 -0.07 0.10 java21 -cv-sidebar_portrait 0:19a67c2a5369 -0.07 0.10 kotlin -cv-sidebar_portrait 0:95bfacd3a466 -0.07 0.10 groovy -cv-sidebar_portrait 0:11a4a60b518b -0.07 0.10 python -cv-sidebar_portrait 0:4ec7c53222c8 -0.07 0.10 sql +cv-sidebar_portrait 0:d5680c2e2769 -0.02 0.10 java21 +cv-sidebar_portrait 0:19a67c2a5369 -0.02 0.10 kotlin +cv-sidebar_portrait 0:95bfacd3a466 -0.02 0.10 groovy +cv-sidebar_portrait 0:11a4a60b518b -0.02 0.10 python +cv-sidebar_portrait 0:4ec7c53222c8 -0.02 0.10 sql cv-sidebar_portrait 0:6cb574fa10b6 -0.03 0.10 languages cv-sidebar_portrait 0:d359699acbd5 -0.02 0.10 english(fluent) cv-sidebar_portrait 0:a09174803665 -0.04 0.10 german(intermediate) -cv-sidebar_portrait 0:d8a971cea795 -0.31 0.10 spanish(basic) +cv-sidebar_portrait 0:d8a971cea795 -0.06 0.10 spanish(basic) cv-sidebar_portrait 0:2d58f0cadc2d -0.14 0.49 platformengineer -cv-sidebar_portrait 0:3c69d6bb4892 0.03 0.11 professionalprofile -cv-sidebar_portrait 0:924e8fc8d04f 0.05 0.11 platformengineerwith10+yearsbuil -cv-sidebar_portrait 0:df58bf5ac853 0.07 0.11 pipelines,layoutengines,anddevel -cv-sidebar_portrait 0:b6d3e08745d8 0.09 0.11 inhigh-throughputpdfrendering,se -cv-sidebar_portrait 0:3ea39d224e93 0.11 0.11 brittleproduction-opsscriptsinto -cv-sidebar_portrait 0:53e5e7c5a884 0.11 0.11 experience +cv-sidebar_portrait 0:3c69d6bb4892 0.08 0.11 professionalprofile +cv-sidebar_portrait 0:924e8fc8d04f 0.10 0.11 platformengineerwith10+yearsbuil +cv-sidebar_portrait 0:df58bf5ac853 0.12 0.11 pipelines,layoutengines,anddevel +cv-sidebar_portrait 0:b6d3e08745d8 0.14 0.11 inhigh-throughputpdfrendering,se +cv-sidebar_portrait 0:3ea39d224e93 0.16 0.11 brittleproduction-opsscriptsinto +cv-sidebar_portrait 0:53e5e7c5a884 0.16 0.11 experience cv-sidebar_portrait 0:a76f47480818 0.14 0.11 seniorplatformengineer -cv-sidebar_portrait 0:d492f2d34b81 0.13 0.11 northwindsystems|2024-present -cv-sidebar_portrait 0:11a63b6a756a 0.14 0.11 ledthereusabledocument-generatio -cv-sidebar_portrait 0:e9ddcca2381b 0.16 0.11 reportingflowsacross8productteam -cv-sidebar_portrait 0:8e7a066998f5 0.18 0.11 by70%byretiringper-teampdfscript +cv-sidebar_portrait 0:d492f2d34b81 0.23 0.11 northwindsystems|2024-present +cv-sidebar_portrait 0:11a63b6a756a 0.19 0.11 ledthereusabledocument-generatio +cv-sidebar_portrait 0:e9ddcca2381b 0.21 0.11 reportingflowsacross8productteam +cv-sidebar_portrait 0:8e7a066998f5 0.23 0.11 by70%byretiringper-teampdfscript cv-sidebar_portrait 0:daf65306b3b6 0.06 0.11 softwareengineer -cv-sidebar_portrait 0:14aeb7d88f36 0.05 0.11 brightleaflabs|2021-2024 -cv-sidebar_portrait 0:78c890058374 0.06 0.11 builtbackendservicesandproductio -cv-sidebar_portrait 0:798b575aa9c2 0.08 0.11 processing2m+documentspermonth.d -cv-sidebar_portrait 0:337c2b00cc88 0.10 0.11 customlayoutengine,eliminatingli -cv-sidebar_portrait 0:cbec16fb4c22 0.12 0.11 from1.4sto380ms. -cv-sidebar_portrait 0:2577c0f557b2 0.12 0.11 projects +cv-sidebar_portrait 0:14aeb7d88f36 0.15 0.11 brightleaflabs|2021-2024 +cv-sidebar_portrait 0:78c890058374 0.11 0.11 builtbackendservicesandproductio +cv-sidebar_portrait 0:798b575aa9c2 0.13 0.11 processing2m+documentspermonth.d +cv-sidebar_portrait 0:337c2b00cc88 0.15 0.11 customlayoutengine,eliminatingli +cv-sidebar_portrait 0:cbec16fb4c22 0.17 0.11 from1.4sto380ms. +cv-sidebar_portrait 0:2577c0f557b2 0.17 0.11 projects cv-sidebar_portrait 0:0f2c67872251 0.15 0.11 graphcompose(java21,pdfbox,maven -cv-sidebar_portrait 0:1538919cd7d4 0.14 0.11 declarativejavapdflayoutengine.s -cv-sidebar_portrait 0:f6d88deff945 0.16 0.11 snapshottesting.powersproduction -cv-sidebar_portrait 0:0869235b9cf7 0.18 0.11 hiringtoolsandbillingsystems.(op +cv-sidebar_portrait 0:1538919cd7d4 0.19 0.11 declarativejavapdflayoutengine.s +cv-sidebar_portrait 0:f6d88deff945 0.21 0.11 snapshottesting.powersproduction +cv-sidebar_portrait 0:0869235b9cf7 0.23 0.11 hiringtoolsandbillingsystems.(op cv-sidebar_portrait 0:d73d02174dc9 0.06 0.11 templatestudio(kotlin,composedes -cv-sidebar_portrait 0:5ebdeb66a893 -0.45 0.11 internaltoolforevaluatingcv,prop -cv-sidebar_portrait 0:a66d3183c752 -0.43 0.11 presets.pngdiffing,side-by-sidel +cv-sidebar_portrait 0:5ebdeb66a893 0.10 0.11 internaltoolforevaluatingcv,prop +cv-sidebar_portrait 0:a66d3183c752 0.12 0.11 presets.pngdiffing,side-by-sidel cv-slate_orange 0:4b64999089cd -0.02 0.05 versatileprofessional -cv-slate_orange 0:73c506bc28be -0.23 0.05 operations•customersuccess•coord +cv-slate_orange 0:73c506bc28be -0.03 0.05 operations•customersuccess•coord cv-slate_orange 0:b4ac3856722a 0.22 0.03 (555)123-4567 cv-slate_orange 0:422684be6cf9 0.22 0.03 daniel.harper@email.com cv-slate_orange 0:84308bea4540 0.22 0.03 linkedin cv-slate_orange 0:a64d6af50109 0.22 0.03 austin,texas•opentorelocate -cv-slate_orange 0:32c1cf49a2fe 0.18 0.10 skills -cv-slate_orange 0:ee41e992b046 0.43 0.10 customerserviceexcellence -cv-slate_orange 0:39433b0c8c42 0.43 0.10 operations&processsupport -cv-slate_orange 0:68ac2246858d 0.43 0.10 project&calendarmanagement -cv-slate_orange 0:d2b0c62842b8 0.43 0.10 datamanagement&reporting -cv-slate_orange 0:713ccc3fc2fc 0.43 0.10 communication&stakeholders -cv-slate_orange 0:010f2ad55bed 0.43 0.10 problemsolving&adaptability -cv-slate_orange 0:02020d943fbc 0.43 0.10 sales&relationshipbuilding -cv-slate_orange 0:88cc29c2fda2 0.43 0.10 microsoftoffice&googlesuite -cv-slate_orange 0:e37d86244e99 0.43 0.10 crmsystems(salesforce,hubspot) -cv-slate_orange 0:d70e5edb4685 0.43 0.10 timemanagement&prioritization -cv-slate_orange 0:8bab53aa1bee 0.20 0.10 selectedachievements +cv-slate_orange 0:32c1cf49a2fe 0.23 0.10 skills +cv-slate_orange 0:ee41e992b046 0.28 0.10 customerserviceexcellence +cv-slate_orange 0:39433b0c8c42 0.28 0.10 operations&processsupport +cv-slate_orange 0:68ac2246858d 0.28 0.10 project&calendarmanagement +cv-slate_orange 0:d2b0c62842b8 0.28 0.10 datamanagement&reporting +cv-slate_orange 0:713ccc3fc2fc 0.28 0.10 communication&stakeholders +cv-slate_orange 0:010f2ad55bed 0.28 0.10 problemsolving&adaptability +cv-slate_orange 0:02020d943fbc 0.28 0.10 sales&relationshipbuilding +cv-slate_orange 0:88cc29c2fda2 0.28 0.10 microsoftoffice&googlesuite +cv-slate_orange 0:e37d86244e99 0.28 0.10 crmsystems(salesforce,hubspot) +cv-slate_orange 0:d70e5edb4685 0.28 0.10 timemanagement&prioritization +cv-slate_orange 0:8bab53aa1bee 0.25 0.10 selectedachievements cv-slate_orange 0:b08c44dac044 0.46 0.10 processimprovement cv-slate_orange 0:c7966365f508 1.14 0.10 designedanewtrackingsystemthat cv-slate_orange 0:3a5ad5d0dc8d 0.69 0.10 reducedreportingtimeby30%and @@ -1429,48 +1427,48 @@ cv-slate_orange 0:365853229c97 0.44 0.10 revenuecontribution cv-slate_orange 0:292a456730c2 1.12 0.10 consistentlyexceededmonthlysales cv-slate_orange 0:8eb387deb3e1 0.67 0.10 goalsby15–20%throughrelationship cv-slate_orange 0:77706bc9ed09 0.22 0.10 buildingandconsultativeservice. -cv-slate_orange 0:6cb574fa10b6 0.20 0.10 languages +cv-slate_orange 0:6cb574fa10b6 0.25 0.10 languages cv-slate_orange 0:b6234d2ea0d6 0.52 0.10 english -cv-slate_orange 0:bef32d2c315a 0.49 0.05 native +cv-slate_orange 0:bef32d2c315a 0.39 0.05 native cv-slate_orange 0:890744623577 0.77 0.10 spanishprofessionalworking cv-slate_orange 0:21bb36ad0638 1.02 0.10 french -cv-slate_orange 0:fbb7b5bf4ca3 0.99 0.05 basic -cv-slate_orange 0:676dfdd56ad2 0.96 0.10 additionalinformation -cv-slate_orange 0:ef68dac1790b 1.21 0.10 availability:full-time -cv-slate_orange 0:6795aec0e50a 1.21 0.10 willingtorelocate:yes -cv-slate_orange 0:b8eeb230ca32 1.22 0.10 remotework:opento -cv-slate_orange 0:b73078ca247c 1.24 0.10 hybrid/remote -cv-slate_orange 0:3c69d6bb4892 0.18 0.07 professionalprofile -cv-slate_orange 0:36eb8f626c42 0.14 0.07 adaptableandresourcefulprofessio -cv-slate_orange 0:f4e999c08086 0.16 0.07 customerservice,sales,andproject -cv-slate_orange 0:41221430e3f8 0.18 0.07 organizationalskills,andtheabili -cv-slate_orange 0:324c4509a3e4 0.20 0.07 managingpriorities,buildingrelat -cv-slate_orange 0:57271827af78 0.22 0.07 customersatisfaction,andbusiness -cv-slate_orange 0:c2f296ef30a3 0.15 0.07 professionalexperience +cv-slate_orange 0:fbb7b5bf4ca3 0.89 0.05 basic +cv-slate_orange 0:676dfdd56ad2 1.01 0.10 additionalinformation +cv-slate_orange 0:ef68dac1790b 1.06 0.10 availability:full-time +cv-slate_orange 0:6795aec0e50a 1.06 0.10 willingtorelocate:yes +cv-slate_orange 0:b8eeb230ca32 1.07 0.10 remotework:opento +cv-slate_orange 0:b73078ca247c 1.09 0.10 hybrid/remote +cv-slate_orange 0:3c69d6bb4892 0.23 0.07 professionalprofile +cv-slate_orange 0:36eb8f626c42 0.24 0.07 adaptableandresourcefulprofessio +cv-slate_orange 0:f4e999c08086 0.26 0.07 customerservice,sales,andproject +cv-slate_orange 0:41221430e3f8 0.28 0.07 organizationalskills,andtheabili +cv-slate_orange 0:324c4509a3e4 0.30 0.07 managingpriorities,buildingrelat +cv-slate_orange 0:57271827af78 0.32 0.07 customersatisfaction,andbusiness +cv-slate_orange 0:c2f296ef30a3 0.20 0.07 professionalexperience cv-slate_orange 0:da2ea6509bec 0.42 0.07 operationscoordinator -cv-slate_orange 0:e7227bbe0c40 0.38 0.86 jan2022–present +cv-slate_orange 0:e7227bbe0c40 0.23 0.86 jan2022–present cv-slate_orange 0:9f7cecddf317 0.17 0.07 brightstartlogistics,austin,tx cv-slate_orange 0:e0bbd6c9782e 0.15 0.07 •coordinatedailyoperationsandsch cv-slate_orange 0:dc9a542f8db9 0.14 0.07 •developandmaintaindashboardsand cv-slate_orange 0:66acc2e5b891 0.13 0.07 •streamlinecommunicationbetweend cv-slate_orange 0:8bd3fd672f95 0.12 0.07 •managevendorrelationshipsandass cv-slate_orange 0:dd7872236383 0.39 0.07 customersupportspecialist -cv-slate_orange 0:1734c189cfe2 0.35 0.94 jun2020–dec2021 +cv-slate_orange 0:1734c189cfe2 0.20 0.94 jun2020–dec2021 cv-slate_orange 0:b9dfc8902d16 0.14 0.07 techwavesolutions,remote cv-slate_orange 0:56391e23e83a 0.12 0.07 •providedtechnicalsupporttocusto cv-slate_orange 0:7eb50a39cf50 0.11 0.07 •resolvedanaverageof40+inquiries cv-slate_orange 0:46f632748ba8 0.10 0.07 •createdknowledgebasearticlesand cv-slate_orange 0:02b44f46125c 0.09 0.07 •collaboratedwithproductandengin cv-slate_orange 0:a1707ef6164e 0.36 0.07 salesassociate -cv-slate_orange 0:2bc613d4e516 0.32 0.96 mar2019–may2020 +cv-slate_orange 0:2bc613d4e516 0.17 0.96 mar2019–may2020 cv-slate_orange 0:bb7253ff7002 0.11 0.07 urbanoutfitters,austin,tx -cv-slate_orange 0:aaa52372c317 -0.11 0.07 •consistentlyexceededsalestarget -cv-slate_orange 0:198e638fe8f3 -0.10 0.09 personalizedcustomerservice. +cv-slate_orange 0:aaa52372c317 0.09 0.07 •consistentlyexceededsalestarget +cv-slate_orange 0:198e638fe8f3 0.10 0.09 personalizedcustomerservice. cv-slate_orange 0:dabead95ee7e 0.09 0.07 •builtandmaintainedstrongcustome cv-slate_orange 0:ff3f5f9ca7a0 0.08 0.07 •merchandisedfloordisplaysandcon cv-slate_orange 0:05a39f2908ba 0.07 0.07 •recognizedas“topperformer”forq4 cv-slate_orange 0:832235539465 0.34 0.07 administrativeassistant/projecta -cv-slate_orange 0:2ccfc04a3ae7 0.30 0.98 may2018–feb2019 +cv-slate_orange 0:2ccfc04a3ae7 0.15 0.98 may2018–feb2019 cv-slate_orange 0:cfc5fd80ae80 0.09 0.07 greenfieldnonprofitinitiative,au cv-slate_orange 0:b8aecb03e7ed 0.07 0.07 •supportedprojectmanagerswithsch cv-slate_orange 0:77f797d4d64c 0.06 0.07 •managedcalendars,travelarrangem @@ -1478,9 +1476,9 @@ cv-slate_orange 0:80a7a6cdc723 0.05 0.07 •maintaineddonorrecordsandprepar cv-slate_orange 0:51539a61bb62 0.04 0.07 •assistedwitheventplanningandcom cv-slate_orange 0:68bf0109c6f8 -0.10 0.07 education cv-slate_orange 0:84ba6b88f439 -0.10 0.07 certifications&training -cv-slate_orange 0:9d7190053be6 0.30 0.07 bachelorofartsincommunications -cv-slate_orange 0:f592b4ba6aa4 0.27 0.07 universityoftexasataustin -cv-slate_orange 0:3f84d2e470fe 0.27 0.07 austin,tx•graduatedmay2018 +cv-slate_orange 0:9d7190053be6 0.15 0.07 bachelorofartsincommunications +cv-slate_orange 0:f592b4ba6aa4 0.12 0.07 universityoftexasataustin +cv-slate_orange 0:3f84d2e470fe 0.12 0.07 austin,tx•graduatedmay2018 cv-slate_orange 0:99b337b1faf4 0.25 0.07 •googleprojectmanagementcertific cv-slate_orange 0:4d1b69dc33a1 0.05 0.07 •hubspotcustomerservicecertifica cv-slate_orange 0:01a1e16912b7 0.05 0.07 •microsoftexcel:advancedformulas @@ -1542,116 +1540,116 @@ cv-teal_pulse 0:de15ca9e3d9f 0.03 0.07 polish(conversational) cv-teal_pulse 0:b035d3696f4e 0.03 0.07 righttowork:unitedkingdom cv-teal_pulse 0:cfa1d6dd779c 0.03 0.07 availability:1monthnotice cv-teal_pulse 0:b9b8965717b3 0.07 1.62 compassionatecare.clinicalexcell -cv-terracotta_rail 0:920a88ef5818 0.10 0.12 oliver.bennett@email.com -cv-terracotta_rail 0:a8acc3a90a7b 0.10 0.12 +447700900123 -cv-terracotta_rail 0:e8c463a6c54d 0.10 0.12 bristol,unitedkingdom -cv-terracotta_rail 0:84308bea4540 0.10 0.12 linkedin -cv-terracotta_rail 0:32c1cf49a2fe 0.04 0.10 skills -cv-terracotta_rail 0:4e1fe6feb1d5 0.12 0.12 architecturaldesign -cv-terracotta_rail 0:4b1ce58ed984 0.12 0.12 conceptdevelopment -cv-terracotta_rail 0:e8386273ac51 0.12 0.12 planningapplications -cv-terracotta_rail 0:09033be5db1b 0.12 0.12 technicaldrawings -cv-terracotta_rail 0:de4e9e607840 0.12 0.12 revit -cv-terracotta_rail 0:de4e9e607840#1 0.15 0.52 revit -cv-terracotta_rail 0:50f08e64c5a6 0.12 0.12 autocad -cv-terracotta_rail 0:50f08e64c5a6#1 0.15 0.52 autocad -cv-terracotta_rail 0:af7c811cbfce 0.12 0.12 bimcoordination -cv-terracotta_rail 0:531b7caeda92 0.12 0.12 designpresentations -cv-terracotta_rail 0:bfcd894f9698 0.12 0.12 projectdelivery -cv-terracotta_rail 0:9a1192ab93d0 0.12 0.12 stakeholdermanagement -cv-terracotta_rail 0:48fe07df4f1c 0.12 0.12 sustainabledesign -cv-terracotta_rail 0:95626582af55 0.12 0.12 buildingregulations -cv-terracotta_rail 0:35390f5453e8 0.07 0.10 software -cv-terracotta_rail 0:2d5d6ea604fd 0.15 0.52 rhino -cv-terracotta_rail 0:5971b0dc0625 0.15 0.52 sketchup -cv-terracotta_rail 0:e9d09d8ff5bb 0.15 0.52 adobeindesign -cv-terracotta_rail 0:3f4a09b92ccf 0.15 0.52 photoshop -cv-terracotta_rail 0:3abe8752b2c0 0.15 0.52 microsoftoffice -cv-terracotta_rail 0:e831beb04c00 0.09 0.10 certifications -cv-terracotta_rail 0:3ad949ee8543 0.17 0.52 arbregisteredarchitect -cv-terracotta_rail 0:fa807066704f 0.17 0.52 ribacharteredmember -cv-terracotta_rail 0:676dfdd56ad2 -0.09 0.10 additionalinformation -cv-terracotta_rail 0:705ab1a9cb61 0.18 0.07 languages: -cv-terracotta_rail 0:9ee0e2dddc94 0.16 0.07 english(native), -cv-terracotta_rail 0:de6d9b2b98d4 0.15 0.07 spanish(conversational) -cv-terracotta_rail 0:c75efa67c038 0.19 0.07 righttowork: -cv-terracotta_rail 0:2474519f77a9 0.17 0.07 unitedkingdom -cv-terracotta_rail 0:76a9cead2e9f 0.21 0.07 availability: -cv-terracotta_rail 0:d14126d0f8f4 -0.05 0.07 1monthnotice -cv-terracotta_rail 0:0f08c27aab24 0.61 0.11 oliverbennett -cv-terracotta_rail 0:334d566a27b2 0.07 0.11 seniorarchitect -cv-terracotta_rail 0:334d566a27b2#1 -0.25 0.06 seniorarchitect -cv-terracotta_rail 0:b944906ed84c 0.04 0.11 professionalsummary -cv-terracotta_rail 0:a0eed0988b1d 0.19 0.11 seniorarchitectwithover8yearsofe -cv-terracotta_rail 0:6165c7077b36 0.17 0.11 commercialprojectsacrossallribaw -cv-terracotta_rail 0:bbb25a1ee248 0.15 0.11 provenexpertiseindesigndevelopme -cv-terracotta_rail 0:bf4ab196cbb6 0.13 0.11 strongfocusonsustainability,qual -cv-terracotta_rail 0:0dfcf4444281 0.11 0.11 collaborativecommunicatorskilled -cv-terracotta_rail 0:22fdcc5cfe61 0.09 0.11 leadingmultidisciplinaryteamstoa -cv-terracotta_rail 0:c2f296ef30a3 -0.25 0.11 professionalexperience -cv-terracotta_rail 0:086c0e036e67 -0.25 -0.14 2021–present -cv-terracotta_rail 0:b3af3b56129a -0.03 0.06 northlinestudio,bristol,uk -cv-terracotta_rail 0:27819bba9c0f -0.49 0.06 •leaddesignpackagesfromconceptth -cv-terracotta_rail 0:d49fddeb9701 -0.52 0.05 andmixed-useprojects. -cv-terracotta_rail 0:1d6340aa301d -0.54 0.06 •coordinatestructural,m&e,landsc -cv-terracotta_rail 0:7062411e212a -0.56 0.05 buildablesolutions. -cv-terracotta_rail 0:bf75379f5486 -0.48 0.06 •prepareandmanageplanningapplica -cv-terracotta_rail 0:894e988cdf94 -0.49 0.05 documentation. -cv-terracotta_rail 0:894e988cdf94#1 -0.59 0.05 documentation. -cv-terracotta_rail 0:40c00971356d -0.52 0.06 •presentandcommunicatedesignprop -cv-terracotta_rail 0:a218287e182e -0.54 0.05 anddrivingprojectsforward. -cv-terracotta_rail 0:f2e40fc1edb7 -0.24 0.06 architect -cv-terracotta_rail 0:f7d1049ec64b -0.24 -0.24 2018–2021 -cv-terracotta_rail 0:59e0b0e4edc9 -0.02 0.06 urbanformpartners,bath,uk -cv-terracotta_rail 0:4f2dbefcbec0 -0.49 0.06 •developedconceptandtechnicaldes -cv-terracotta_rail 0:e2a5e1a23401 -0.51 0.05 educationprojects. -cv-terracotta_rail 0:dedc7bfc0f49 -0.53 0.06 •preparedcoordinateddrawingsets, -cv-terracotta_rail 0:abba33f53e5a -0.55 0.05 construction. -cv-terracotta_rail 0:91a14d5e3005 -0.27 0.06 •supportedprojectdeliveryonsite, -cv-terracotta_rail 0:6b3142466e26 -0.49 0.06 •coordinatedwithcontractorsandco -cv-terracotta_rail 0:1150d4ba642c -0.51 0.05 intent. -cv-terracotta_rail 0:1150d4ba642c#1 -0.55 0.05 intent. -cv-terracotta_rail 0:2d2cd24f87d7 -0.27 0.06 partiiarchitecturalassistant -cv-terracotta_rail 0:3b8048983ecc -0.27 -0.24 2016–2018 -cv-terracotta_rail 0:ebd31e5e7505 -0.04 0.06 axisdesignworkshop,cardiff,uk -cv-terracotta_rail 0:e48e46c3ddf3 -0.31 0.06 •supportedseniorarchitectsacross -cv-terracotta_rail 0:810bbb784193 -0.53 0.06 •producedcadandrevitdrawings,mod -cv-terracotta_rail 0:74b6191dd1ef -0.57 0.06 •undertookresearch,preparedprese -cv-terracotta_rail 0:d94eccbb1fbe -0.08 0.11 selectedprojects -cv-terracotta_rail 0:6b12fdc11f2a 0.02 0.03 harbourpoint -cv-terracotta_rail 0:59765cc5b00d -0.04 0.03 mixed-useregeneration -cv-terracotta_rail 0:db8e363f0316 -0.25 0.03 bristol -cv-terracotta_rail 0:cd7ef0097a95 0.41 0.10 mixed-usedevelopmentdelivering14 -cv-terracotta_rail 0:d37f8456ca99 0.00 0.10 retailspaceandpublicrealmimprove -cv-terracotta_rail 0:8378846eb8e4 -0.41 0.10 securedplanningconsentandisnowon -cv-terracotta_rail 0:4ffc92a0d6bb 0.03 0.03 theassemblyhotel -cv-terracotta_rail 0:9233fa2c31bc -0.03 0.03 boutiquehotelrefurbishment -cv-terracotta_rail 0:0de8ab631548 -0.24 0.03 bath -cv-terracotta_rail 0:af610a85e11a 0.42 0.10 sensitiverefurbishmentoflistedbu -cv-terracotta_rail 0:fa90dda52a42 0.01 0.10 a36-bedroomboutiquehotel;enhance -cv-terracotta_rail 0:ee09d6e6e7ce -0.40 0.10 featuresandguestexperience. -cv-terracotta_rail 0:bb04008bb937 0.04 0.03 elmwoodmews -cv-terracotta_rail 0:43e0681601c8 -0.02 0.03 residentialdevelopment -cv-terracotta_rail 0:25e38d563739 -0.23 0.03 clifton,bristol -cv-terracotta_rail 0:42b055a661a6 0.52 0.10 designof28high-qualityhomeswithi -cv-terracotta_rail 0:bdc5f821f737 0.21 0.10 sustainablemasterplan;achievedhi -cv-terracotta_rail 0:208ed62d3df6 -0.10 0.10 environmentalstandardsandstrongs -cv-terracotta_rail 0:ac5e63220124 -0.41 0.10 performance. -cv-terracotta_rail 0:68bf0109c6f8 -0.04 0.11 education -cv-terracotta_rail 0:1d1dcf789873 -0.24 0.11 marcharchitecture -cv-terracotta_rail 0:00583a6bed38 -0.24 -0.16 2014–2016 -cv-terracotta_rail 0:5761434c99d8 -0.27 0.11 universityofsheffield -cv-terracotta_rail 0:e3f2f6a4e375 -0.27 0.11 ba(hons)architecture -cv-terracotta_rail 0:2920a7fb42fc -0.27 -0.16 2011–2014 -cv-terracotta_rail 0:af625dd0aa20 -0.30 0.11 universityofthewestofengland -cv-timeline_minimal 0:8f1010120ed6 0.15 0.10 jordanrivera -cv-timeline_minimal 0:2d58f0cadc2d -0.40 0.10 platformengineer +cv-terracotta_rail 0:920a88ef5818 0.00 0.12 oliver.bennett@email.com +cv-terracotta_rail 0:a8acc3a90a7b 0.00 0.12 +447700900123 +cv-terracotta_rail 0:e8c463a6c54d 0.00 0.12 bristol,unitedkingdom +cv-terracotta_rail 0:84308bea4540 0.00 0.12 linkedin +cv-terracotta_rail 0:32c1cf49a2fe -0.06 0.10 skills +cv-terracotta_rail 0:4e1fe6feb1d5 0.02 0.12 architecturaldesign +cv-terracotta_rail 0:4b1ce58ed984 0.02 0.12 conceptdevelopment +cv-terracotta_rail 0:e8386273ac51 0.02 0.12 planningapplications +cv-terracotta_rail 0:09033be5db1b 0.02 0.12 technicaldrawings +cv-terracotta_rail 0:de4e9e607840 0.02 0.12 revit +cv-terracotta_rail 0:de4e9e607840#1 0.05 0.52 revit +cv-terracotta_rail 0:50f08e64c5a6 0.02 0.12 autocad +cv-terracotta_rail 0:50f08e64c5a6#1 0.05 0.52 autocad +cv-terracotta_rail 0:af7c811cbfce 0.02 0.12 bimcoordination +cv-terracotta_rail 0:531b7caeda92 0.02 0.12 designpresentations +cv-terracotta_rail 0:bfcd894f9698 0.02 0.12 projectdelivery +cv-terracotta_rail 0:9a1192ab93d0 0.02 0.12 stakeholdermanagement +cv-terracotta_rail 0:48fe07df4f1c 0.02 0.12 sustainabledesign +cv-terracotta_rail 0:95626582af55 0.02 0.12 buildingregulations +cv-terracotta_rail 0:35390f5453e8 -0.03 0.10 software +cv-terracotta_rail 0:2d5d6ea604fd 0.05 0.52 rhino +cv-terracotta_rail 0:5971b0dc0625 0.05 0.52 sketchup +cv-terracotta_rail 0:e9d09d8ff5bb 0.05 0.52 adobeindesign +cv-terracotta_rail 0:3f4a09b92ccf 0.05 0.52 photoshop +cv-terracotta_rail 0:3abe8752b2c0 0.05 0.52 microsoftoffice +cv-terracotta_rail 0:e831beb04c00 -0.01 0.10 certifications +cv-terracotta_rail 0:3ad949ee8543 0.07 0.52 arbregisteredarchitect +cv-terracotta_rail 0:fa807066704f 0.07 0.52 ribacharteredmember +cv-terracotta_rail 0:676dfdd56ad2 -0.19 0.10 additionalinformation +cv-terracotta_rail 0:705ab1a9cb61 0.08 0.07 languages: +cv-terracotta_rail 0:9ee0e2dddc94 0.06 0.07 english(native), +cv-terracotta_rail 0:de6d9b2b98d4 0.05 0.07 spanish(conversational) +cv-terracotta_rail 0:c75efa67c038 0.09 0.07 righttowork: +cv-terracotta_rail 0:2474519f77a9 0.07 0.07 unitedkingdom +cv-terracotta_rail 0:76a9cead2e9f 0.11 0.07 availability: +cv-terracotta_rail 0:d14126d0f8f4 -0.15 0.07 1monthnotice +cv-terracotta_rail 0:0f08c27aab24 0.01 0.11 oliverbennett +cv-terracotta_rail 0:334d566a27b2 0.02 0.11 seniorarchitect +cv-terracotta_rail 0:334d566a27b2#1 -0.35 0.06 seniorarchitect +cv-terracotta_rail 0:b944906ed84c -0.06 0.11 professionalsummary +cv-terracotta_rail 0:a0eed0988b1d 0.04 0.11 seniorarchitectwithover8yearsofe +cv-terracotta_rail 0:6165c7077b36 0.02 0.11 commercialprojectsacrossallribaw +cv-terracotta_rail 0:bbb25a1ee248 0.00 0.11 provenexpertiseindesigndevelopme +cv-terracotta_rail 0:bf4ab196cbb6 -0.02 0.11 strongfocusonsustainability,qual +cv-terracotta_rail 0:0dfcf4444281 -0.04 0.11 collaborativecommunicatorskilled +cv-terracotta_rail 0:22fdcc5cfe61 -0.06 0.11 leadingmultidisciplinaryteamstoa +cv-terracotta_rail 0:c2f296ef30a3 -0.35 0.11 professionalexperience +cv-terracotta_rail 0:086c0e036e67 -0.35 -0.14 2021–present +cv-terracotta_rail 0:b3af3b56129a -0.08 0.06 northlinestudio,bristol,uk +cv-terracotta_rail 0:27819bba9c0f -0.10 0.06 •leaddesignpackagesfromconceptth +cv-terracotta_rail 0:d49fddeb9701 -0.12 0.05 andmixed-useprojects. +cv-terracotta_rail 0:1d6340aa301d -0.14 0.06 •coordinatestructural,m&e,landsc +cv-terracotta_rail 0:7062411e212a -0.16 0.05 buildablesolutions. +cv-terracotta_rail 0:bf75379f5486 -0.08 0.06 •prepareandmanageplanningapplica +cv-terracotta_rail 0:894e988cdf94 -0.10 0.05 documentation. +cv-terracotta_rail 0:894e988cdf94#1 -0.19 0.05 documentation. +cv-terracotta_rail 0:40c00971356d -0.12 0.06 •presentandcommunicatedesignprop +cv-terracotta_rail 0:a218287e182e -0.14 0.05 anddrivingprojectsforward. +cv-terracotta_rail 0:f2e40fc1edb7 -0.34 0.06 architect +cv-terracotta_rail 0:f7d1049ec64b -0.34 -0.24 2018–2021 +cv-terracotta_rail 0:59e0b0e4edc9 -0.07 0.06 urbanformpartners,bath,uk +cv-terracotta_rail 0:4f2dbefcbec0 -0.09 0.06 •developedconceptandtechnicaldes +cv-terracotta_rail 0:e2a5e1a23401 -0.11 0.05 educationprojects. +cv-terracotta_rail 0:dedc7bfc0f49 -0.13 0.06 •preparedcoordinateddrawingsets, +cv-terracotta_rail 0:abba33f53e5a -0.15 0.05 construction. +cv-terracotta_rail 0:91a14d5e3005 -0.07 0.06 •supportedprojectdeliveryonsite, +cv-terracotta_rail 0:6b3142466e26 -0.09 0.06 •coordinatedwithcontractorsandco +cv-terracotta_rail 0:1150d4ba642c -0.11 0.05 intent. +cv-terracotta_rail 0:1150d4ba642c#1 -0.15 0.05 intent. +cv-terracotta_rail 0:2d2cd24f87d7 -0.37 0.06 partiiarchitecturalassistant +cv-terracotta_rail 0:3b8048983ecc -0.37 -0.24 2016–2018 +cv-terracotta_rail 0:ebd31e5e7505 -0.09 0.06 axisdesignworkshop,cardiff,uk +cv-terracotta_rail 0:e48e46c3ddf3 -0.11 0.06 •supportedseniorarchitectsacross +cv-terracotta_rail 0:810bbb784193 -0.13 0.06 •producedcadandrevitdrawings,mod +cv-terracotta_rail 0:74b6191dd1ef -0.17 0.06 •undertookresearch,preparedprese +cv-terracotta_rail 0:d94eccbb1fbe -0.18 0.11 selectedprojects +cv-terracotta_rail 0:6b12fdc11f2a -0.08 0.03 harbourpoint +cv-terracotta_rail 0:59765cc5b00d -0.14 0.03 mixed-useregeneration +cv-terracotta_rail 0:db8e363f0316 -0.35 0.03 bristol +cv-terracotta_rail 0:cd7ef0097a95 0.31 0.10 mixed-usedevelopmentdelivering14 +cv-terracotta_rail 0:d37f8456ca99 -0.10 0.10 retailspaceandpublicrealmimprove +cv-terracotta_rail 0:8378846eb8e4 -0.51 0.10 securedplanningconsentandisnowon +cv-terracotta_rail 0:4ffc92a0d6bb -0.07 0.03 theassemblyhotel +cv-terracotta_rail 0:9233fa2c31bc -0.13 0.03 boutiquehotelrefurbishment +cv-terracotta_rail 0:0de8ab631548 -0.34 0.03 bath +cv-terracotta_rail 0:af610a85e11a 0.32 0.10 sensitiverefurbishmentoflistedbu +cv-terracotta_rail 0:fa90dda52a42 -0.09 0.10 a36-bedroomboutiquehotel;enhance +cv-terracotta_rail 0:ee09d6e6e7ce -0.50 0.10 featuresandguestexperience. +cv-terracotta_rail 0:bb04008bb937 -0.06 0.03 elmwoodmews +cv-terracotta_rail 0:43e0681601c8 -0.12 0.03 residentialdevelopment +cv-terracotta_rail 0:25e38d563739 -0.33 0.03 clifton,bristol +cv-terracotta_rail 0:42b055a661a6 0.42 0.10 designof28high-qualityhomeswithi +cv-terracotta_rail 0:bdc5f821f737 0.11 0.10 sustainablemasterplan;achievedhi +cv-terracotta_rail 0:208ed62d3df6 -0.20 0.10 environmentalstandardsandstrongs +cv-terracotta_rail 0:ac5e63220124 -0.51 0.10 performance. +cv-terracotta_rail 0:68bf0109c6f8 -0.14 0.11 education +cv-terracotta_rail 0:1d1dcf789873 -0.34 0.11 marcharchitecture +cv-terracotta_rail 0:00583a6bed38 -0.34 -0.16 2014–2016 +cv-terracotta_rail 0:5761434c99d8 -0.07 0.11 universityofsheffield +cv-terracotta_rail 0:e3f2f6a4e375 -0.37 0.11 ba(hons)architecture +cv-terracotta_rail 0:2920a7fb42fc -0.37 -0.16 2011–2014 +cv-terracotta_rail 0:af625dd0aa20 -0.10 0.11 universityofthewestofengland +cv-timeline_minimal 0:8f1010120ed6 0.00 0.10 jordanrivera +cv-timeline_minimal 0:2d58f0cadc2d 0.00 0.10 platformengineer cv-timeline_minimal 0:fbeea547d99e -0.19 -1.36 london,uk cv-timeline_minimal 0:89674e6f130e -0.19 -1.99 +442055551000 cv-timeline_minimal 0:e0f850305ded -0.19 -2.77 jordan.rivera@example.com cv-timeline_minimal 0:84308bea4540 -0.19 -1.06 linkedin cv-timeline_minimal 0:c0b0109d9439 -0.19 -1.00 github -cv-timeline_minimal 0:68bf0109c6f8 0.05 0.10 education +cv-timeline_minimal 0:68bf0109c6f8 -0.05 0.10 education cv-timeline_minimal 0:54654b90a771 -0.05 0.10 msccomputerscience|universityof cv-timeline_minimal 0:a57111bb5a18 -0.05 0.10 manchester-2019-2021 cv-timeline_minimal 0:bf13436325bd -0.05 0.10 distinction.thesis:composablelay @@ -1665,7 +1663,7 @@ cv-timeline_minimal 0:dddc36d8bb44 -0.05 0.10 oraclejavacertification|professi cv-timeline_minimal 0:6c065bee3945 -0.05 0.10 track-2023-2024 cv-timeline_minimal 0:40f2bfbae245 -0.05 0.10 java17platformdeep-dive:records, cv-timeline_minimal 0:6cba964fe5fe -0.05 0.10 types,patternmatching,virtualthr -cv-timeline_minimal 0:5f94c50dc5bf 0.05 0.10 technicalskills +cv-timeline_minimal 0:5f94c50dc5bf -0.05 0.10 technicalskills cv-timeline_minimal 0:5d6819554c7a -0.05 0.10 languages:java21,kotlin,groovy,p cv-timeline_minimal 0:4ec7c53222c8 -0.05 0.10 sql cv-timeline_minimal 0:db84150190bb -0.05 0.10 document&print:pdfbox,apachepoi @@ -1683,7 +1681,7 @@ cv-timeline_minimal 0:c001aa5cc6fb -0.05 0.10 testing(pitest) cv-timeline_minimal 0:90c057c30e8f -0.05 0.10 distribution:mavencentral,sonaty cv-timeline_minimal 0:7347a19cb48d -0.05 0.10 ossrh,gpgsigning,jitpack,semanti cv-timeline_minimal 0:b13180079f20 -0.05 0.10 versioningdiscipline -cv-timeline_minimal 0:2577c0f557b2 0.05 0.10 projects +cv-timeline_minimal 0:2577c0f557b2 -0.05 0.10 projects cv-timeline_minimal 0:bd82e94c4024 -0.05 0.10 graphcompose(java21,pdfbox,maven cv-timeline_minimal 0:54b7bb3a12a0 -0.05 0.10 jmh):declarativejavapdflayouteng cv-timeline_minimal 0:83ee0a75c2d4 -0.05 0.10 semanticdsl,slot-basedtemplates, @@ -1703,12 +1701,12 @@ cv-timeline_minimal 0:f87a435df3ac -0.05 0.10 pandocbridge):editorial-magazine cv-timeline_minimal 0:73678fb1255e -0.05 0.10 documenttoolkitbuiltongraphcompo cv-timeline_minimal 0:a0c280e181e2 -0.05 0.10 cinematiccovers,pullquotes,multi cv-timeline_minimal 0:d9f1b263312f -0.05 0.10 flow,sidebarcallouts. -cv-timeline_minimal 0:b944906ed84c 0.00 0.09 professionalsummary -cv-timeline_minimal 0:4bc9e0d2344b -0.10 0.09 platformengineerwith10+yearsbuil -cv-timeline_minimal 0:453eef50417c -0.08 0.09 anddeveloper-facingtemplatesyste -cv-timeline_minimal 0:39881b36a9c0 -0.06 0.09 authoringdsls,andturningbrittlep -cv-timeline_minimal 0:83064bdc95f5 -0.04 0.09 scale. -cv-timeline_minimal 0:c2f296ef30a3 0.08 0.09 professionalexperience +cv-timeline_minimal 0:b944906ed84c -0.05 0.09 professionalsummary +cv-timeline_minimal 0:4bc9e0d2344b -0.05 0.09 platformengineerwith10+yearsbuil +cv-timeline_minimal 0:453eef50417c -0.03 0.09 anddeveloper-facingtemplatesyste +cv-timeline_minimal 0:39881b36a9c0 -0.01 0.09 authoringdsls,andturningbrittlep +cv-timeline_minimal 0:83064bdc95f5 0.01 0.09 scale. +cv-timeline_minimal 0:c2f296ef30a3 0.03 0.09 professionalexperience cv-timeline_minimal 0:68c08b2a5966 -0.02 0.09 seniorplatformengineer|northwind cv-timeline_minimal 0:64c4b52dceb1 -0.03 0.09 ledthereusabledocument-generatio cv-timeline_minimal 0:1f193cd1d987 -0.04 0.09 productteams.reducedtemplatemain @@ -1720,7 +1718,7 @@ cv-timeline_minimal 0:70dd947a4558 -0.09 0.09 cuttingp99renderlatencyfrom1.4st cv-timeline_minimal 0:8a9898d2c965 -0.10 0.09 backendengineer|helixprintco-201 cv-timeline_minimal 0:a485c37fe7ea -0.11 0.09 maintainedahigh-volumeinvoice-pr cv-timeline_minimal 0:5a136b6b9d8c -0.12 0.09 testharnessthatgatedeverytemplat -cv-timeline_minimal 1:676dfdd56ad2 0.20 0.10 additionalinformation +cv-timeline_minimal 1:676dfdd56ad2 0.10 0.10 additionalinformation cv-timeline_minimal 1:ecc25e73b19b 0.10 0.10 languages:english(fluent),german cv-timeline_minimal 1:ac7f0ee6a49e 0.10 0.10 (intermediate),spanish(basic) cv-timeline_minimal 1:db2a16c45fd5 0.10 0.10 workeligibility:eligibletoworkin @@ -1731,8 +1729,8 @@ cv-timeline_minimal 1:bf474bb1a54a 0.10 0.10 pdfboxissuetriage. cv-timeline_minimal 1:86512c31ab91 0.10 0.10 speaking:jvmsummit2024,devoxxuk cv-timeline_minimal 1:e1a9c88a2aa2 0.10 0.10 2025—bothondeclarativedocument cv-timeline_minimal 1:9331a1c670e0 0.10 0.10 layout. -cv-violet_grid 0:68a76c74faf5 0.23 0.10 sofiamartinez -cv-violet_grid 0:04694b6a602f -0.05 0.10 ux/uidesigner +cv-violet_grid 0:68a76c74faf5 0.03 0.10 sofiamartinez +cv-violet_grid 0:04694b6a602f 0.05 0.10 ux/uidesigner cv-violet_grid 0:12932a9489aa -0.10 0.11 sofia.martinez.design@gmail.com cv-violet_grid 0:77b27b9ce612 -0.11 0.11 +1(415)555-7842 cv-violet_grid 0:12d25ebdca93 -0.11 0.13 sanfrancisco,ca,usa @@ -1743,70 +1741,70 @@ cv-violet_grid 0:c5d00ee335d1 -0.09 0.10 icombineresearch,designthinking, cv-violet_grid 0:62fd7c29c3c0 -0.11 0.10 passionateaboutcollaboratingwith cv-violet_grid 0:32c1cf49a2fe -0.36 0.10 skills cv-violet_grid 0:b96067918254 -0.16 -0.41 uxresearch -cv-violet_grid 0:9058674fd905 -0.21 -0.71 userinterviews,surveys, -cv-violet_grid 0:0cdd38014d79 -0.22 -0.70 personas,journeymaps, -cv-violet_grid 0:61e4ba28d469 -0.22 -0.71 competitiveanalysis +cv-violet_grid 0:9058674fd905 -0.16 -0.71 userinterviews,surveys, +cv-violet_grid 0:0cdd38014d79 -0.17 -0.70 personas,journeymaps, +cv-violet_grid 0:61e4ba28d469 -0.17 -0.71 competitiveanalysis cv-violet_grid 0:3de6be58cb9f -0.16 0.11 informationarchitecture -cv-violet_grid 0:db5c6756c4b6 -0.21 -0.77 sitemaps,userflows,card -cv-violet_grid 0:6c7ad1834a60 -0.22 -0.77 sorting,contentstrategy +cv-violet_grid 0:db5c6756c4b6 -0.16 -0.77 sitemaps,userflows,card +cv-violet_grid 0:6c7ad1834a60 -0.17 -0.77 sorting,contentstrategy cv-violet_grid 0:187737d59250 -0.16 -0.05 wireframing -cv-violet_grid 0:2286e5aa328a -0.21 -0.52 lowtohigh-fidelity +cv-violet_grid 0:2286e5aa328a -0.16 -0.52 lowtohigh-fidelity cv-violet_grid 0:5c4b21cb1af8 -0.16 0.02 prototyping -cv-violet_grid 0:1abfa9dc1773 -0.21 -0.69 interactiveprototypes, -cv-violet_grid 0:1ddc6c379a54 -0.22 -0.54 microinteractions, -cv-violet_grid 0:d1d99c54cf40 -0.22 -0.27 transitions +cv-violet_grid 0:1abfa9dc1773 -0.16 -0.69 interactiveprototypes, +cv-violet_grid 0:1ddc6c379a54 -0.17 -0.54 microinteractions, +cv-violet_grid 0:d1d99c54cf40 -0.17 -0.27 transitions cv-violet_grid 0:7a38f8d94009 -0.16 0.13 usabilitytesting -cv-violet_grid 0:63af69ae99e6 -0.21 -0.68 testplanning,usability -cv-violet_grid 0:f67c409cc44f -0.22 -0.87 tests,heuristicevaluation, -cv-violet_grid 0:438e1d3264dd -0.22 -0.61 insights&iteration +cv-violet_grid 0:63af69ae99e6 -0.16 -0.68 testplanning,usability +cv-violet_grid 0:f67c409cc44f -0.17 -0.87 tests,heuristicevaluation, +cv-violet_grid 0:438e1d3264dd -0.17 -0.61 insights&iteration cv-violet_grid 0:7e02941d76f5 -0.16 0.07 designsystems -cv-violet_grid 0:a0d27161913a -0.21 -0.57 componentlibraries, -cv-violet_grid 0:82374d275507 -0.22 -0.54 designtokens,pattern -cv-violet_grid 0:caf9f906b16a -0.22 -0.45 documentation +cv-violet_grid 0:a0d27161913a -0.16 -0.57 componentlibraries, +cv-violet_grid 0:82374d275507 -0.17 -0.54 designtokens,pattern +cv-violet_grid 0:caf9f906b16a -0.17 -0.45 documentation cv-violet_grid 0:f9d35d43770d -0.24 0.10 tools -cv-violet_grid 0:5cb2b3b6143c 0.02 0.10 figmafigjamadobexdsketchmironoti +cv-violet_grid 0:5cb2b3b6143c 0.07 0.10 figmafigjamadobexdsketchmironoti cv-violet_grid 0:53e5e7c5a884 -0.20 0.10 experience -cv-violet_grid 0:5a0774260e0c -0.23 0.10 2022-present +cv-violet_grid 0:5a0774260e0c 0.07 0.10 2022-present cv-violet_grid 0:204f460767ff -0.27 0.02 seniorux/uidesigner|novafin(fint cv-violet_grid 0:318bba211bdc -0.22 -0.28 sanfrancisco,ca cv-violet_grid 0:318bba211bdc#1 -0.30 -0.28 sanfrancisco,ca -cv-violet_grid 0:3883e88c63c3 -0.23 0.05 ledend-to-enddesignforapersonalf -cv-violet_grid 0:ccc00663f089 -0.25 0.05 conducteduserresearch,builtperso -cv-violet_grid 0:7d0f908c7e5f -0.27 0.05 designedwireframes,prototypes,an -cv-violet_grid 0:9b57c4a85aad -0.28 0.05 establishedandmaintainedascalabl -cv-violet_grid 0:6894eafb99c2 -0.30 0.05 collaboratedwithproductmanagers, -cv-violet_grid 0:01e4455cec51 -0.31 0.10 2020-2022 +cv-violet_grid 0:3883e88c63c3 0.02 0.05 ledend-to-enddesignforapersonalf +cv-violet_grid 0:ccc00663f089 0.00 0.05 conducteduserresearch,builtperso +cv-violet_grid 0:7d0f908c7e5f -0.02 0.05 designedwireframes,prototypes,an +cv-violet_grid 0:9b57c4a85aad -0.03 0.05 establishedandmaintainedascalabl +cv-violet_grid 0:6894eafb99c2 -0.05 0.05 collaboratedwithproductmanagers, +cv-violet_grid 0:01e4455cec51 -0.01 0.10 2020-2022 cv-violet_grid 0:24d722f0cfbe -0.35 0.02 uxdesigner|brighthealth(healthte -cv-violet_grid 0:530707fb0897 -0.31 0.05 redesignedpatientportalexperienc -cv-violet_grid 0:b2e27a1d9270 -0.33 0.05 plannedandfacilitatedusabilityte -cv-violet_grid 0:ab80a52d70fe -0.35 0.05 partneredwithengineerstoensurefe -cv-violet_grid 0:11cbf615189b -0.36 0.05 createdreusablecomponentsandstyl -cv-violet_grid 0:7e5081a3ed48 -0.37 0.10 2018-2020 +cv-violet_grid 0:530707fb0897 -0.06 0.05 redesignedpatientportalexperienc +cv-violet_grid 0:b2e27a1d9270 -0.08 0.05 plannedandfacilitatedusabilityte +cv-violet_grid 0:ab80a52d70fe -0.10 0.05 partneredwithengineerstoensurefe +cv-violet_grid 0:11cbf615189b -0.11 0.05 createdreusablecomponentsandstyl +cv-violet_grid 0:7e5081a3ed48 -0.07 0.10 2018-2020 cv-violet_grid 0:73f7bbf7cd60 -0.41 0.02 juniorux/uidesigner|lumendigital cv-violet_grid 0:c6b06045332f -0.36 -0.17 austin,tx -cv-violet_grid 0:5ea8234925c5 -0.37 0.05 supporteddiscoveryworkshops,user -cv-violet_grid 0:46f00c76528c -0.39 0.05 designedresponsivewebsitesandlan -cv-violet_grid 0:f3cea36a9d83 -0.41 0.05 collaboratedwithcopywritersandde +cv-violet_grid 0:5ea8234925c5 -0.12 0.05 supporteddiscoveryworkshops,user +cv-violet_grid 0:46f00c76528c -0.14 0.05 designedresponsivewebsitesandlan +cv-violet_grid 0:f3cea36a9d83 -0.16 0.05 collaboratedwithcopywritersandde cv-violet_grid 0:d94eccbb1fbe -0.44 0.10 selectedprojects -cv-violet_grid 0:45dc8bf81211 -0.49 0.08 novafinmobileapp|personalfinance -cv-violet_grid 0:d398b29d3dbb -0.44 0.61 2023 -cv-violet_grid 0:e66c1ce573d3 -0.58 0.08 ledux/uidesignforbudgeting,goalt -cv-violet_grid 0:0ed8829e68d0 -0.58 0.08 thatinformedasimplifiednavigatio -cv-violet_grid 0:ee9bd17ebccf -0.58 0.08 22%increaseinweeklyactiveusers. -cv-violet_grid 0:28b4603d784a -0.50 0.08 brighthealthpatientportal|health -cv-violet_grid 0:1bea20e1df19 -0.45 0.61 2021 -cv-violet_grid 0:999ddb26bed6 -0.59 0.08 redesignedkeypatientflowsincludi -cv-violet_grid 0:073d15633c0b -0.59 0.08 systemandcomponentlibraryusedacr +cv-violet_grid 0:45dc8bf81211 -0.14 0.08 novafinmobileapp|personalfinance +cv-violet_grid 0:d398b29d3dbb -0.14 0.61 2023 +cv-violet_grid 0:e66c1ce573d3 -0.18 0.08 ledux/uidesignforbudgeting,goalt +cv-violet_grid 0:0ed8829e68d0 -0.18 0.08 thatinformedasimplifiednavigatio +cv-violet_grid 0:ee9bd17ebccf -0.18 0.08 22%increaseinweeklyactiveusers. +cv-violet_grid 0:28b4603d784a -0.15 0.08 brighthealthpatientportal|health +cv-violet_grid 0:1bea20e1df19 -0.15 0.61 2021 +cv-violet_grid 0:999ddb26bed6 -0.19 0.08 redesignedkeypatientflowsincludi +cv-violet_grid 0:073d15633c0b -0.19 0.08 systemandcomponentlibraryusedacr cv-violet_grid 0:68bf0109c6f8 -0.34 0.10 education cv-violet_grid 0:6cb574fa10b6 -0.34 0.07 languages cv-violet_grid 0:0cf7506cf94a -0.27 0.10 bacheloroffineartsingraphicdesig cv-violet_grid 0:00ab7a6aa5f1 -0.26 0.10 californiacollegeofthearts -cv-violet_grid 0:7e2c21bb41db -0.27 0.10 sanfrancisco,ca|2014-2018 -cv-violet_grid 0:b6234d2ea0d6 -1.62 0.02 english +cv-violet_grid 0:7e2c21bb41db -0.02 0.10 sanfrancisco,ca|2014-2018 +cv-violet_grid 0:b6234d2ea0d6 -1.37 0.02 english cv-violet_grid 0:bef32d2c315a -1.63 -0.03 native cv-violet_grid 0:bef32d2c315a#1 -1.59 -0.03 native -cv-violet_grid 0:9c9b13446cd9 -1.59 0.02 spanish -cv-violet_grid 0:e35242c809c8 -1.56 0.02 portuguese +cv-violet_grid 0:9c9b13446cd9 -1.34 0.02 spanish +cv-violet_grid 0:e35242c809c8 -1.31 0.02 portuguese cv-violet_grid 0:c5d1de4964d6 -1.56 -0.03 conversational cv-violet_grid 0:1de4fede4f63 -1.31 22.41 idesignwithempathy,iteratewithpu invoice-classic 0:c26c22b94338 0.09 0.10 graphcomposestudio @@ -1831,27 +1829,27 @@ invoice-classic 0:faf1569a98e9 -0.02 0.06 ec1a4gc invoice-classic 0:befc6e9b5c24 -0.05 0.06 billing@graphcompose.dev invoice-classic 0:89674e6f130e -0.07 0.06 +442055551000 invoice-classic 0:c9046f7a37ad 0.10 8.40 description -invoice-classic 0:32e8369a9c4f 0.10 9.36 qty -invoice-classic 0:385cfdbc00ec 0.10 9.36 unit -invoice-classic 0:cf38d95c9c6b 0.10 9.36 amount +invoice-classic 0:32e8369a9c4f 0.10 8.36 qty +invoice-classic 0:385cfdbc00ec 0.10 8.36 unit +invoice-classic 0:cf38d95c9c6b 0.10 8.36 amount invoice-classic 0:987c6297d0a9 0.07 8.40 discoveryworkshop -invoice-classic 0:532674c6eb89 0.07 9.36 gbp1,450 -invoice-classic 0:532674c6eb89#1 0.07 9.36 gbp1,450 +invoice-classic 0:532674c6eb89 0.07 8.36 gbp1,450 +invoice-classic 0:532674c6eb89#1 0.07 8.36 gbp1,450 invoice-classic 0:08ec6deb1c40 0.07 8.40 templatearchitecture2 -invoice-classic 0:d2e67c4b1cca 0.07 9.36 gbp980 -invoice-classic 0:d6cdf6a05754 0.07 9.36 gbp1,960 +invoice-classic 0:d2e67c4b1cca 0.07 8.36 gbp980 +invoice-classic 0:d6cdf6a05754 0.07 8.36 gbp1,960 invoice-classic 0:fe13f8ee4f99 0.07 8.40 renderqa -invoice-classic 0:7e7398cbff7c 0.07 9.36 gbp320 -invoice-classic 0:e23164e940c7 0.07 9.36 gbp960 +invoice-classic 0:7e7398cbff7c 0.07 8.36 gbp320 +invoice-classic 0:e23164e940c7 0.07 8.36 gbp960 invoice-classic 0:6047df51175c 0.07 8.40 developerenablement1 -invoice-classic 0:c2ad01ea64ae 0.07 9.36 gbp780 -invoice-classic 0:c2ad01ea64ae#1 0.07 9.36 gbp780 -invoice-classic 0:d6577e95efba 0.07 8.40 subtotal -invoice-classic 0:50cae0510231 0.07 8.40 gbp5,150 -invoice-classic 0:a52611c9261b 0.07 8.40 vat(20%) -invoice-classic 0:d7f4425b8b16 0.07 8.40 gbp1,030 -invoice-classic 0:11239872d178 0.08 8.40 total -invoice-classic 0:45a5ad5ad430 0.08 8.40 gbp6,180 +invoice-classic 0:c2ad01ea64ae 0.07 8.36 gbp780 +invoice-classic 0:c2ad01ea64ae#1 0.07 8.36 gbp780 +invoice-classic 0:d6577e95efba 0.07 7.40 subtotal +invoice-classic 0:50cae0510231 0.07 7.40 gbp5,150 +invoice-classic 0:a52611c9261b 0.07 7.40 vat(20%) +invoice-classic 0:d7f4425b8b16 0.07 7.40 gbp1,030 +invoice-classic 0:11239872d178 0.08 7.40 total +invoice-classic 0:45a5ad5ad430 0.08 7.40 gbp6,180 invoice-classic 0:ab5aa97074c4 0.25 0.10 notes invoice-classic 0:b78eb53cbd11 0.02 0.10 •pleaseincludetheinvoicenumberon invoice-classic 0:8c8fd62f15a7 0.02 0.12 yourremittanceadvice. @@ -1887,139 +1885,139 @@ invoice-classic_long 0:faf1569a98e9 -0.02 0.06 ec1a4gc invoice-classic_long 0:befc6e9b5c24 -0.05 0.06 billing@graphcompose.dev invoice-classic_long 0:89674e6f130e -0.07 0.06 +442055551000 invoice-classic_long 0:c9046f7a37ad 0.10 8.40 description -invoice-classic_long 0:32e8369a9c4f 0.10 9.35 qty -invoice-classic_long 0:385cfdbc00ec 0.10 9.40 unit -invoice-classic_long 0:cf38d95c9c6b 0.10 9.35 amount +invoice-classic_long 0:32e8369a9c4f 0.10 8.35 qty +invoice-classic_long 0:385cfdbc00ec 0.10 8.35 unit +invoice-classic_long 0:cf38d95c9c6b 0.10 8.35 amount invoice-classic_long 0:aa29f2f4fcb4 0.07 8.40 discoveryworkshop—sprint1 -invoice-classic_long 0:ce4081aef7a1 0.07 9.40 gbp180 -invoice-classic_long 0:ce4081aef7a1#1 0.07 9.35 gbp180 +invoice-classic_long 0:ce4081aef7a1 0.07 8.35 gbp180 +invoice-classic_long 0:ce4081aef7a1#1 0.07 8.35 gbp180 invoice-classic_long 0:9c9a412f0a45 0.07 8.40 designsystemaudit—sprint1 -invoice-classic_long 0:7be809cb1590 0.07 9.40 gbp217 -invoice-classic_long 0:378b363c8601 0.07 9.35 gbp434 +invoice-classic_long 0:7be809cb1590 0.07 8.35 gbp217 +invoice-classic_long 0:378b363c8601 0.07 8.35 gbp434 invoice-classic_long 0:5257532a7b5d 0.07 8.40 templatearchitecture—sprint1 -invoice-classic_long 0:c467cca4e45a 0.07 9.40 gbp254 -invoice-classic_long 0:4a4a218b012a 0.07 9.35 gbp762 +invoice-classic_long 0:c467cca4e45a 0.07 8.35 gbp254 +invoice-classic_long 0:4a4a218b012a 0.07 8.35 gbp762 invoice-classic_long 0:58a1caacbf7e 0.07 8.40 layoutenginetuning—sprint1 -invoice-classic_long 0:dde0144b97b7 0.07 9.40 gbp291 -invoice-classic_long 0:457a71636ad9 0.07 9.35 gbp1164 +invoice-classic_long 0:dde0144b97b7 0.07 8.35 gbp291 +invoice-classic_long 0:457a71636ad9 0.07 8.35 gbp1164 invoice-classic_long 0:6fcf7d6dd606 0.07 8.40 renderqapass—sprint1 -invoice-classic_long 0:dda88f5786f5 0.07 9.40 gbp328 -invoice-classic_long 0:dda88f5786f5#1 0.07 9.35 gbp328 +invoice-classic_long 0:dda88f5786f5 0.07 8.35 gbp328 +invoice-classic_long 0:dda88f5786f5#1 0.07 8.35 gbp328 invoice-classic_long 0:ee18ad3bbb42 0.07 8.40 accessibilityreview—sprint1 -invoice-classic_long 0:e681b4843ffb 0.07 9.40 gbp365 -invoice-classic_long 0:1859c20b35dd 0.07 9.35 gbp730 +invoice-classic_long 0:e681b4843ffb 0.07 8.35 gbp365 +invoice-classic_long 0:1859c20b35dd 0.07 8.35 gbp730 invoice-classic_long 0:c12c14945fcd 0.07 8.40 fontpipelinesetup—sprint1 -invoice-classic_long 0:9033a33f66e7 0.07 9.40 gbp402 -invoice-classic_long 0:837d48c1ff40 0.07 9.35 gbp1206 +invoice-classic_long 0:9033a33f66e7 0.07 8.35 gbp402 +invoice-classic_long 0:837d48c1ff40 0.07 8.35 gbp1206 invoice-classic_long 0:af6cba848dc0 0.07 8.40 chartintegration—sprint1 -invoice-classic_long 0:6109a2c30104 0.07 9.40 gbp439 -invoice-classic_long 0:87e9fcb6151d 0.07 9.35 gbp1756 +invoice-classic_long 0:6109a2c30104 0.07 8.35 gbp439 +invoice-classic_long 0:87e9fcb6151d 0.07 8.35 gbp1756 invoice-classic_long 0:a6bee1ec5e35 0.07 8.40 datamapping—sprint1 -invoice-classic_long 0:df1f9d4443d8 0.07 9.40 gbp476 -invoice-classic_long 0:df1f9d4443d8#1 0.07 9.35 gbp476 +invoice-classic_long 0:df1f9d4443d8 0.07 8.35 gbp476 +invoice-classic_long 0:df1f9d4443d8#1 0.07 8.35 gbp476 invoice-classic_long 0:052c9f49a4b8 0.07 8.40 paginationhardening—sprint1 -invoice-classic_long 0:9fba6332e489 0.07 9.40 gbp513 -invoice-classic_long 0:6f805c9f78c3 0.07 9.35 gbp1026 +invoice-classic_long 0:9fba6332e489 0.07 8.35 gbp513 +invoice-classic_long 0:6f805c9f78c3 0.07 8.35 gbp1026 invoice-classic_long 0:b54b7f77d86c 0.07 8.40 visualregressionwiring—sprint13 -invoice-classic_long 0:dc3d212d6b32 0.07 9.40 gbp550 -invoice-classic_long 0:96667fee53f3 0.07 9.35 gbp1650 +invoice-classic_long 0:dc3d212d6b32 0.07 8.35 gbp550 +invoice-classic_long 0:96667fee53f3 0.07 8.35 gbp1650 invoice-classic_long 0:9fe9e123b0f0 0.07 8.40 docsauthoring—sprint1 -invoice-classic_long 0:e7b406f24f04 0.07 9.40 gbp587 -invoice-classic_long 0:74357ca6b30e 0.07 9.35 gbp2348 +invoice-classic_long 0:e7b406f24f04 0.07 8.35 gbp587 +invoice-classic_long 0:74357ca6b30e 0.07 8.35 gbp2348 invoice-classic_long 0:9c6cf539f5bc 0.07 8.40 stakeholderdemo—sprint1 -invoice-classic_long 0:cf79b5cdb735 0.07 9.40 gbp624 -invoice-classic_long 0:cf79b5cdb735#1 0.07 9.35 gbp624 +invoice-classic_long 0:cf79b5cdb735 0.07 8.35 gbp624 +invoice-classic_long 0:cf79b5cdb735#1 0.07 8.35 gbp624 invoice-classic_long 0:d2bde6642670 0.07 8.40 performanceprofiling—sprint1 -invoice-classic_long 0:679f017f73c1 0.07 9.40 gbp661 -invoice-classic_long 0:63985b524723 0.07 9.35 gbp1322 +invoice-classic_long 0:679f017f73c1 0.07 8.35 gbp661 +invoice-classic_long 0:63985b524723 0.07 8.35 gbp1322 invoice-classic_long 0:f82bef1ac80d 0.07 8.40 releaseengineering—sprint1 -invoice-classic_long 0:0b21b7cf2ff9 0.07 9.40 gbp698 -invoice-classic_long 0:6afc08056aaa 0.07 9.35 gbp2094 +invoice-classic_long 0:0b21b7cf2ff9 0.07 8.35 gbp698 +invoice-classic_long 0:6afc08056aaa 0.07 8.35 gbp2094 invoice-classic_long 0:632f71e8ff8b 0.07 8.40 supportretainer—sprint1 -invoice-classic_long 0:70b393b5fb10 0.07 9.40 gbp735 -invoice-classic_long 0:29edf7588a57 0.07 9.35 gbp2940 +invoice-classic_long 0:70b393b5fb10 0.07 8.35 gbp735 +invoice-classic_long 0:29edf7588a57 0.07 8.35 gbp2940 invoice-classic_long 0:82a9218b91ae 0.07 8.40 discoveryworkshop—sprint2 -invoice-classic_long 0:c313f34b71b9 0.07 9.40 gbp772 -invoice-classic_long 0:c313f34b71b9#1 0.07 9.35 gbp772 +invoice-classic_long 0:c313f34b71b9 0.07 8.35 gbp772 +invoice-classic_long 0:c313f34b71b9#1 0.07 8.35 gbp772 invoice-classic_long 0:7e69fbffe3e2 0.07 8.40 designsystemaudit—sprint2 -invoice-classic_long 0:e096e4fddf9a 0.07 9.40 gbp809 -invoice-classic_long 0:c985a0123929 0.07 9.35 gbp1618 +invoice-classic_long 0:e096e4fddf9a 0.07 8.35 gbp809 +invoice-classic_long 0:c985a0123929 0.07 8.35 gbp1618 invoice-classic_long 0:899f0392eecb 0.07 8.40 templatearchitecture—sprint2 -invoice-classic_long 0:4c973ddb9245 0.07 9.40 gbp846 -invoice-classic_long 0:6ec359ce3927 0.07 9.35 gbp2538 +invoice-classic_long 0:4c973ddb9245 0.07 8.35 gbp846 +invoice-classic_long 0:6ec359ce3927 0.07 8.35 gbp2538 invoice-classic_long 0:69523ba7402c 0.07 8.40 layoutenginetuning—sprint2 -invoice-classic_long 0:0e196c2b490b 0.07 9.40 gbp883 -invoice-classic_long 0:6e0d19ab72c6 0.07 9.35 gbp3532 +invoice-classic_long 0:0e196c2b490b 0.07 8.35 gbp883 +invoice-classic_long 0:6e0d19ab72c6 0.07 8.35 gbp3532 invoice-classic_long 1:c9046f7a37ad 0.00 8.40 description -invoice-classic_long 1:32e8369a9c4f 0.00 9.35 qty -invoice-classic_long 1:385cfdbc00ec 0.00 9.40 unit -invoice-classic_long 1:cf38d95c9c6b 0.00 9.35 amount +invoice-classic_long 1:32e8369a9c4f 0.00 8.35 qty +invoice-classic_long 1:385cfdbc00ec 0.00 8.35 unit +invoice-classic_long 1:cf38d95c9c6b 0.00 8.35 amount invoice-classic_long 1:f12cbb7c274d -0.03 8.40 renderqapass—sprint2 -invoice-classic_long 1:b813c73bc488 -0.03 9.40 gbp920 -invoice-classic_long 1:b813c73bc488#1 -0.03 9.35 gbp920 +invoice-classic_long 1:b813c73bc488 -0.03 8.35 gbp920 +invoice-classic_long 1:b813c73bc488#1 -0.03 8.35 gbp920 invoice-classic_long 1:12cd54b50187 -0.03 8.40 accessibilityreview—sprint2 -invoice-classic_long 1:377d92702316 -0.03 9.40 gbp957 -invoice-classic_long 1:e7c66f6cf477 -0.03 9.35 gbp1914 +invoice-classic_long 1:377d92702316 -0.03 8.35 gbp957 +invoice-classic_long 1:e7c66f6cf477 -0.03 8.35 gbp1914 invoice-classic_long 1:e3d8409ace07 -0.03 8.40 fontpipelinesetup—sprint2 -invoice-classic_long 1:21604b8f0b36 -0.03 9.40 gbp994 -invoice-classic_long 1:fe15ed444063 -0.03 9.35 gbp2982 +invoice-classic_long 1:21604b8f0b36 -0.03 8.35 gbp994 +invoice-classic_long 1:fe15ed444063 -0.03 8.35 gbp2982 invoice-classic_long 1:ca4d3c8eca22 -0.03 8.40 chartintegration—sprint2 -invoice-classic_long 1:a4c7a6612c99 -0.03 9.40 gbp1031 -invoice-classic_long 1:1c83f0b47e27 -0.03 9.35 gbp4124 +invoice-classic_long 1:a4c7a6612c99 -0.03 8.35 gbp1031 +invoice-classic_long 1:1c83f0b47e27 -0.03 8.35 gbp4124 invoice-classic_long 1:00de69c6e70f -0.03 8.40 datamapping—sprint2 -invoice-classic_long 1:b9d5c56a2cfd -0.03 9.40 gbp1068 -invoice-classic_long 1:b9d5c56a2cfd#1 -0.03 9.35 gbp1068 +invoice-classic_long 1:b9d5c56a2cfd -0.03 8.35 gbp1068 +invoice-classic_long 1:b9d5c56a2cfd#1 -0.03 8.35 gbp1068 invoice-classic_long 1:eb628b5ea8ab -0.03 8.40 paginationhardening—sprint2 -invoice-classic_long 1:db5327b47d0e -0.03 9.40 gbp205 -invoice-classic_long 1:99d9b3b49da2 -0.03 9.35 gbp410 +invoice-classic_long 1:db5327b47d0e -0.03 8.35 gbp205 +invoice-classic_long 1:99d9b3b49da2 -0.03 8.35 gbp410 invoice-classic_long 1:505693cbc91e -0.03 8.40 visualregressionwiring—sprint23 -invoice-classic_long 1:9f0c5094fb63 -0.03 9.40 gbp242 -invoice-classic_long 1:095b72c9d880 -0.03 9.35 gbp726 +invoice-classic_long 1:9f0c5094fb63 -0.03 8.35 gbp242 +invoice-classic_long 1:095b72c9d880 -0.03 8.35 gbp726 invoice-classic_long 1:2a787e61730a -0.03 8.40 docsauthoring—sprint2 -invoice-classic_long 1:28ad00e76aef -0.03 9.40 gbp279 -invoice-classic_long 1:fbb12fed0bbc -0.03 9.35 gbp1116 +invoice-classic_long 1:28ad00e76aef -0.03 8.35 gbp279 +invoice-classic_long 1:fbb12fed0bbc -0.03 8.35 gbp1116 invoice-classic_long 1:5369a2c40ff8 -0.03 8.40 stakeholderdemo—sprint2 -invoice-classic_long 1:16562cbcd318 -0.03 9.40 gbp316 -invoice-classic_long 1:16562cbcd318#1 -0.03 9.35 gbp316 +invoice-classic_long 1:16562cbcd318 -0.03 8.35 gbp316 +invoice-classic_long 1:16562cbcd318#1 -0.03 8.35 gbp316 invoice-classic_long 1:611b258cb41e -0.03 8.40 performanceprofiling—sprint2 -invoice-classic_long 1:e391d4e46366 -0.03 9.40 gbp353 -invoice-classic_long 1:7106c00cb009 -0.03 9.35 gbp706 +invoice-classic_long 1:e391d4e46366 -0.03 8.35 gbp353 +invoice-classic_long 1:7106c00cb009 -0.03 8.35 gbp706 invoice-classic_long 1:d24a15800df1 -0.03 8.40 releaseengineering—sprint2 -invoice-classic_long 1:4bed9b4092ee -0.03 9.40 gbp390 -invoice-classic_long 1:ae16cd1e31b1 -0.03 9.35 gbp1170 +invoice-classic_long 1:4bed9b4092ee -0.03 8.35 gbp390 +invoice-classic_long 1:ae16cd1e31b1 -0.03 8.35 gbp1170 invoice-classic_long 1:6876c7b0fe66 -0.03 8.40 supportretainer—sprint2 -invoice-classic_long 1:909481a45a34 -0.03 9.40 gbp427 -invoice-classic_long 1:4e58d78d0958 -0.03 9.35 gbp1708 +invoice-classic_long 1:909481a45a34 -0.03 8.35 gbp427 +invoice-classic_long 1:4e58d78d0958 -0.03 8.35 gbp1708 invoice-classic_long 1:ddce236bccd7 -0.03 8.40 discoveryworkshop—sprint3 -invoice-classic_long 1:f8d17c11d834 -0.03 9.40 gbp464 -invoice-classic_long 1:f8d17c11d834#1 -0.03 9.35 gbp464 +invoice-classic_long 1:f8d17c11d834 -0.03 8.35 gbp464 +invoice-classic_long 1:f8d17c11d834#1 -0.03 8.35 gbp464 invoice-classic_long 1:c0986cd7b1d4 -0.03 8.40 designsystemaudit—sprint3 -invoice-classic_long 1:09c7aebd89f6 -0.03 9.40 gbp501 -invoice-classic_long 1:a61c7b6bdd20 -0.03 9.35 gbp1002 +invoice-classic_long 1:09c7aebd89f6 -0.03 8.35 gbp501 +invoice-classic_long 1:a61c7b6bdd20 -0.03 8.35 gbp1002 invoice-classic_long 1:21fd82d170b2 -0.03 8.40 templatearchitecture—sprint3 -invoice-classic_long 1:399e39a6eff5 -0.03 9.40 gbp538 -invoice-classic_long 1:81ea39164f41 -0.03 9.35 gbp1614 +invoice-classic_long 1:399e39a6eff5 -0.03 8.35 gbp538 +invoice-classic_long 1:81ea39164f41 -0.03 8.35 gbp1614 invoice-classic_long 1:47cb1e683e8d -0.03 8.40 layoutenginetuning—sprint3 -invoice-classic_long 1:f6df6e8e8f30 -0.03 9.40 gbp575 -invoice-classic_long 1:7f7db0f4c1cf -0.03 9.35 gbp2300 +invoice-classic_long 1:f6df6e8e8f30 -0.03 8.35 gbp575 +invoice-classic_long 1:7f7db0f4c1cf -0.03 8.35 gbp2300 invoice-classic_long 1:608e31719f07 -0.03 8.40 renderqapass—sprint3 -invoice-classic_long 1:e4fbc626999e -0.03 9.40 gbp612 -invoice-classic_long 1:e4fbc626999e#1 -0.03 9.35 gbp612 +invoice-classic_long 1:e4fbc626999e -0.03 8.35 gbp612 +invoice-classic_long 1:e4fbc626999e#1 -0.03 8.35 gbp612 invoice-classic_long 1:98bfb4deb0b7 -0.03 8.40 accessibilityreview—sprint3 -invoice-classic_long 1:7915a839b285 -0.03 9.40 gbp649 -invoice-classic_long 1:ca74221d78ad -0.03 9.35 gbp1298 +invoice-classic_long 1:7915a839b285 -0.03 8.35 gbp649 +invoice-classic_long 1:ca74221d78ad -0.03 8.35 gbp1298 invoice-classic_long 1:375dddcbee43 -0.03 8.40 fontpipelinesetup—sprint3 -invoice-classic_long 1:7b97f0ac8a87 -0.03 9.40 gbp686 -invoice-classic_long 1:6a57f6a84a1c -0.03 9.35 gbp2058 +invoice-classic_long 1:7b97f0ac8a87 -0.03 8.35 gbp686 +invoice-classic_long 1:6a57f6a84a1c -0.03 8.35 gbp2058 invoice-classic_long 1:2f4f507058ff -0.03 8.40 chartintegration—sprint3 -invoice-classic_long 1:74df855b318c -0.03 9.40 gbp723 -invoice-classic_long 1:78016cdf49ca -0.03 9.35 gbp2892 -invoice-classic_long 1:d6577e95efba -0.03 8.40 subtotal -invoice-classic_long 1:5969b6461056 -0.03 8.40 gbp44,890 -invoice-classic_long 1:a52611c9261b -0.03 8.40 vat(20%) -invoice-classic_long 1:e7fda33332e9 -0.03 8.40 gbp8,978 -invoice-classic_long 1:11239872d178 -0.02 8.40 total -invoice-classic_long 1:90b9dec01ea9 -0.02 8.40 gbp53,868 +invoice-classic_long 1:74df855b318c -0.03 8.35 gbp723 +invoice-classic_long 1:78016cdf49ca -0.03 8.35 gbp2892 +invoice-classic_long 1:d6577e95efba -0.03 7.40 subtotal +invoice-classic_long 1:5969b6461056 -0.03 7.40 gbp44,890 +invoice-classic_long 1:a52611c9261b -0.03 7.40 vat(20%) +invoice-classic_long 1:e7fda33332e9 -0.03 7.40 gbp8,978 +invoice-classic_long 1:11239872d178 -0.02 7.40 total +invoice-classic_long 1:90b9dec01ea9 -0.02 7.40 gbp53,868 invoice-classic_long 1:ab5aa97074c4 0.15 0.10 notes invoice-classic_long 1:970fb4bf9d95 -0.08 0.10 •sprints1-3weredeliveredunderthe invoice-classic_long 1:a781fa6c76d2 -0.08 0.12 frameworkagreement. @@ -2056,8 +2054,8 @@ invoice-consulting 0:89f5b4615dc3 0.03 0.10 melbournevic3000 invoice-consulting 0:c585f1decb98 0.04 0.10 australia invoice-consulting 0:4438ad217dea 0.05 0.10 email:ap@greenfield.com.au invoice-consulting 0:cfebda697822 -0.11 0.10 invoicesummary -invoice-consulting 0:5656f37a9311 0.05 0.10 professionalservicesrenderedinac -invoice-consulting 0:a918299ac844 0.06 0.10 statementofworkfortheperiod +invoice-consulting 0:5656f37a9311 0.10 0.10 professionalservicesrenderedinac +invoice-consulting 0:a918299ac844 0.11 0.10 statementofworkfortheperiod invoice-consulting 0:3fa8489d9aac 0.02 0.10 1may2025–25may2025. invoice-consulting 0:c9046f7a37ad 0.02 -0.15 description invoice-consulting 0:b28225a1247c 0.02 -0.22 serviceperiod @@ -2117,9 +2115,9 @@ invoice-consulting 0:c608665436db 0.21 0.10 reference: invoice-consulting 0:010450dee1ff 0.22 0.10 pleaseensuretheinvoicenumberisin invoice-consulting 0:ab5aa97074c4 0.11 0.12 notes invoice-consulting 0:7c6ab37d83ef 0.22 0.12 thankyouforyourbusiness. -invoice-consulting 0:4a699e29a3bb 0.23 0.12 ifyouhaveanyquestionsregardingth -invoice-consulting 0:c766251af1f4 0.24 0.12 contactusataccounts@northpoint.c -invoice-consulting 0:3d32fa219332 0.25 0.12 +61398765432. +invoice-consulting 0:4a699e29a3bb 0.33 0.12 ifyouhaveanyquestionsregardingth +invoice-consulting 0:c766251af1f4 0.34 0.12 contactusataccounts@northpoint.c +invoice-consulting 0:3d32fa219332 0.35 0.12 +61398765432. invoice-consulting 0:a6f6e2ddab6d 0.27 0.12 paymentisduewithin30daysfromthei invoice-consulting 0:55ee5fe62c33 0.01 0.13 northpointconsultingptyltd|abn12 invoice-consulting 0:bdbada284e80 0.01 0.09 page1/1 @@ -2147,8 +2145,8 @@ invoice-consulting_long 0:89f5b4615dc3 0.03 0.10 melbournevic3000 invoice-consulting_long 0:c585f1decb98 0.04 0.10 australia invoice-consulting_long 0:4438ad217dea 0.05 0.10 email:ap@greenfield.com.au invoice-consulting_long 0:cfebda697822 -0.11 0.10 invoicesummary -invoice-consulting_long 0:5656f37a9311 0.05 0.10 professionalservicesrenderedinac -invoice-consulting_long 0:a918299ac844 0.06 0.10 statementofworkfortheperiod +invoice-consulting_long 0:5656f37a9311 0.10 0.10 professionalservicesrenderedinac +invoice-consulting_long 0:a918299ac844 0.11 0.10 statementofworkfortheperiod invoice-consulting_long 0:3fa8489d9aac 0.02 0.10 1may2025–25may2025. invoice-consulting_long 0:c9046f7a37ad 0.02 -0.15 description invoice-consulting_long 0:b28225a1247c 0.02 -0.22 serviceperiod @@ -2353,26 +2351,26 @@ invoice-consulting_long 1:7d66eb3c1070 0.19 0.10 inv-2025-0478 invoice-consulting_long 1:010450dee1ff 0.20 0.10 pleaseensuretheinvoicenumberisin invoice-consulting_long 1:ab5aa97074c4 0.09 0.12 notes invoice-consulting_long 1:7c6ab37d83ef 0.20 0.12 thankyouforyourbusiness. -invoice-consulting_long 1:4a699e29a3bb 0.21 0.12 ifyouhaveanyquestionsregardingth -invoice-consulting_long 1:c766251af1f4 0.22 0.12 contactusataccounts@northpoint.c -invoice-consulting_long 1:3d32fa219332 0.23 0.12 +61398765432. +invoice-consulting_long 1:4a699e29a3bb 0.31 0.12 ifyouhaveanyquestionsregardingth +invoice-consulting_long 1:c766251af1f4 0.32 0.12 contactusataccounts@northpoint.c +invoice-consulting_long 1:3d32fa219332 0.33 0.12 +61398765432. invoice-consulting_long 1:a6f6e2ddab6d 0.25 0.12 paymentisduewithin30daysfromthei invoice-consulting_long 1:55ee5fe62c33 0.01 0.13 northpointconsultingptyltd|abn12 invoice-consulting_long 1:1bed6052d9b3 0.01 0.09 page2/2 invoice-luma_studio 0:ac5742bfd7c4 -9.14 0.11 &co. invoice-luma_studio 0:1583c0f92f86 -0.38 0.11 luma&co.studio -invoice-luma_studio 0:1583c0f92f86#1 0.28 0.09 luma&co.studio +invoice-luma_studio 0:1583c0f92f86#1 0.03 0.09 luma&co.studio invoice-luma_studio 0:b2b5b83cc26d -0.07 0.11 branding.design.digital. -invoice-luma_studio 0:c9ed0a9b9c8d 0.02 0.09 studio3.02,theloom -invoice-luma_studio 0:0a7d7e43c5de 0.00 0.09 14gowerstreet -invoice-luma_studio 0:b87f5fb5bcfa -0.02 0.09 londonwc1e6bt -invoice-luma_studio 0:2474519f77a9 -0.04 0.09 unitedkingdom +invoice-luma_studio 0:c9ed0a9b9c8d -0.03 0.09 studio3.02,theloom +invoice-luma_studio 0:0a7d7e43c5de -0.05 0.09 14gowerstreet +invoice-luma_studio 0:b87f5fb5bcfa -0.07 0.09 londonwc1e6bt +invoice-luma_studio 0:2474519f77a9 -0.09 0.09 unitedkingdom invoice-luma_studio 0:2474519f77a9#1 -0.22 0.09 unitedkingdom invoice-luma_studio 0:2474519f77a9#2 -0.22 -0.01 unitedkingdom invoice-luma_studio 0:89b5eccb38ff -0.08 0.09 +44(0)2079460832 invoice-luma_studio 0:ea8232890494 -0.13 0.09 hello@lumaandco.studio invoice-luma_studio 0:374d89493adc -0.17 0.09 www.lumaandco.studio -invoice-luma_studio 0:be3e8b44676d -0.25 0.09 companyno.12578934|vatno.3694567 +invoice-luma_studio 0:be3e8b44676d -0.15 0.09 companyno.12578934|vatno.3694567 invoice-luma_studio 0:52d6e3de4fa0 -9.19 0.02 invoice invoice-luma_studio 0:6bb089477e20 0.12 0.02 invoiceno. invoice-luma_studio 0:4435610d8a9f 0.19 0.01 inv-2024-0587 @@ -2406,27 +2404,27 @@ invoice-luma_studio 0:dc934fe30a94#1 -0.12 0.00 20% invoice-luma_studio 0:dc934fe30a94#2 -0.12 0.00 20% invoice-luma_studio 0:dc934fe30a94#3 -0.11 0.00 20% invoice-luma_studio 0:dc934fe30a94#4 -0.10 0.00 20% -invoice-luma_studio 0:d8f4e3a46d2d -0.19 0.03 brandstrategyworkshop -invoice-luma_studio 0:be624d692600 -0.56 0.03 discoverysession,research&brand -invoice-luma_studio 0:40ca2aad940f -0.55 0.03 positioning. +invoice-luma_studio 0:d8f4e3a46d2d -0.09 0.03 brandstrategyworkshop +invoice-luma_studio 0:be624d692600 -0.16 0.03 discoverysession,research&brand +invoice-luma_studio 0:40ca2aad940f -0.15 0.03 positioning. invoice-luma_studio 0:07bcffc86e95 -0.12 -0.10 £2,650.00 invoice-luma_studio 0:07bcffc86e95#1 -0.12 -0.30 £2,650.00 -invoice-luma_studio 0:e302dd04d528 -0.18 0.03 visualidentitydesign -invoice-luma_studio 0:40e412f627fb -0.55 0.03 logosuite,colourpalette,typograp -invoice-luma_studio 0:9c17d116fe08 -0.54 0.03 &guidelines. +invoice-luma_studio 0:e302dd04d528 -0.08 0.03 visualidentitydesign +invoice-luma_studio 0:40e412f627fb -0.15 0.03 logosuite,colourpalette,typograp +invoice-luma_studio 0:9c17d116fe08 -0.14 0.03 &guidelines. invoice-luma_studio 0:a20d66947acc -0.12 -0.10 £3,200.00 invoice-luma_studio 0:a20d66947acc#1 -0.12 -0.30 £3,200.00 -invoice-luma_studio 0:b25ac9cd66bd -0.17 0.03 websitedesign(upto8pages) +invoice-luma_studio 0:b25ac9cd66bd -0.07 0.03 websitedesign(upto8pages) invoice-luma_studio 0:dab758788e6f -0.19 0.03 ux/uidesignfordesktopandmobile. invoice-luma_studio 0:f916278cb74c -0.11 -0.10 £850.00 invoice-luma_studio 0:f916278cb74c#1 -0.11 -0.24 £850.00 -invoice-luma_studio 0:4a1359f78476 -0.16 0.03 copywriting +invoice-luma_studio 0:4a1359f78476 -0.06 0.03 copywriting invoice-luma_studio 0:69afea703455 -0.18 0.03 websitecopy&keymessaging. invoice-luma_studio 0:07b417914317 -0.10 -0.10 £600.00 invoice-luma_studio 0:07b417914317#1 -0.10 -0.24 £600.00 -invoice-luma_studio 0:340455fbac25 -0.15 0.03 projectmanagement -invoice-luma_studio 0:72534f9863ad -0.52 0.03 planning,coordination&client -invoice-luma_studio 0:4df00f9a2b20 -0.52 0.03 liaison. +invoice-luma_studio 0:340455fbac25 -0.05 0.03 projectmanagement +invoice-luma_studio 0:72534f9863ad -0.12 0.03 planning,coordination&client +invoice-luma_studio 0:4df00f9a2b20 -0.12 0.03 liaison. invoice-luma_studio 0:d6577e95efba -0.14 0.10 subtotal invoice-luma_studio 0:b504edd8ea39 -0.14 0.45 £8,500.00 invoice-luma_studio 0:a52611c9261b -0.15 0.10 vat(20%) @@ -2434,12 +2432,12 @@ invoice-luma_studio 0:a894ec54e7f3 -0.15 0.45 £1,700.00 invoice-luma_studio 0:57a66d21eb1b -1.14 0.10 totaldue invoice-luma_studio 0:b4cb2a644826 0.29 0.10 £10,200.00 invoice-luma_studio 0:ab5aa97074c4 -0.27 0.08 notes -invoice-luma_studio 0:7c6ab37d83ef -0.39 0.08 thankyouforyourbusiness. -invoice-luma_studio 0:3d717dfb25d8 -0.43 0.08 ifyouhaveanyquestionsregarding -invoice-luma_studio 0:479a74142336 -0.48 0.08 thisinvoice,pleasegetintouch. -invoice-luma_studio 0:1960744391ed -0.37 0.08 allworkremainstheintellectualpro -invoice-luma_studio 0:eeb53247f32c -0.41 0.08 ofluma&co.studiountilpayment -invoice-luma_studio 0:9eef22d7d34e -0.46 0.08 hasbeenreceivedinfull. +invoice-luma_studio 0:7c6ab37d83ef -0.24 0.08 thankyouforyourbusiness. +invoice-luma_studio 0:3d717dfb25d8 -0.28 0.08 ifyouhaveanyquestionsregarding +invoice-luma_studio 0:479a74142336 -0.33 0.08 thisinvoice,pleasegetintouch. +invoice-luma_studio 0:1960744391ed -0.22 0.08 allworkremainstheintellectualpro +invoice-luma_studio 0:eeb53247f32c -0.26 0.08 ofluma&co.studiountilpayment +invoice-luma_studio 0:9eef22d7d34e -0.31 0.08 hasbeenreceivedinfull. invoice-luma_studio 0:3c7ade679fdf -0.27 0.00 paymentdetails invoice-luma_studio 0:b1819c9cd5bf -0.34 0.00 pleasemakepaymentbybanktransfert invoice-luma_studio 0:8c1e4a24f6a8 -0.30 0.00 luma&co.studioltd @@ -2458,18 +2456,18 @@ invoice-luma_studio 0:7111b3fcbf69 -0.07 0.07 paymentisdueby19june2024. invoice-luma_studio 0:7b14b8d2c5c4 0.01 1.04 page1of1 invoice-luma_studio_long 0:ac5742bfd7c4 -9.14 0.11 &co. invoice-luma_studio_long 0:1583c0f92f86 -0.38 0.11 luma&co.studio -invoice-luma_studio_long 0:1583c0f92f86#1 0.28 0.09 luma&co.studio +invoice-luma_studio_long 0:1583c0f92f86#1 0.03 0.09 luma&co.studio invoice-luma_studio_long 0:b2b5b83cc26d -0.07 0.11 branding.design.digital. -invoice-luma_studio_long 0:c9ed0a9b9c8d 0.02 0.09 studio3.02,theloom -invoice-luma_studio_long 0:0a7d7e43c5de 0.00 0.09 14gowerstreet -invoice-luma_studio_long 0:b87f5fb5bcfa -0.02 0.09 londonwc1e6bt -invoice-luma_studio_long 0:2474519f77a9 -0.04 0.09 unitedkingdom +invoice-luma_studio_long 0:c9ed0a9b9c8d -0.03 0.09 studio3.02,theloom +invoice-luma_studio_long 0:0a7d7e43c5de -0.05 0.09 14gowerstreet +invoice-luma_studio_long 0:b87f5fb5bcfa -0.07 0.09 londonwc1e6bt +invoice-luma_studio_long 0:2474519f77a9 -0.09 0.09 unitedkingdom invoice-luma_studio_long 0:2474519f77a9#1 -0.22 0.09 unitedkingdom invoice-luma_studio_long 0:2474519f77a9#2 -0.22 -0.01 unitedkingdom invoice-luma_studio_long 0:89b5eccb38ff -0.08 0.09 +44(0)2079460832 invoice-luma_studio_long 0:ea8232890494 -0.13 0.09 hello@lumaandco.studio invoice-luma_studio_long 0:374d89493adc -0.17 0.09 www.lumaandco.studio -invoice-luma_studio_long 0:be3e8b44676d -0.25 0.09 companyno.12578934|vatno.3694567 +invoice-luma_studio_long 0:be3e8b44676d -0.15 0.09 companyno.12578934|vatno.3694567 invoice-luma_studio_long 0:52d6e3de4fa0 -9.19 0.02 invoice invoice-luma_studio_long 0:6bb089477e20 0.12 0.02 invoiceno. invoice-luma_studio_long 0:4435610d8a9f 0.19 0.01 inv-2024-0587 @@ -2508,41 +2506,41 @@ invoice-luma_studio_long 0:dc934fe30a94#4 -0.09 0.00 20% invoice-luma_studio_long 0:dc934fe30a94#5 -0.08 0.00 20% invoice-luma_studio_long 0:dc934fe30a94#6 -0.07 0.00 20% invoice-luma_studio_long 0:dc934fe30a94#7 -0.06 0.00 20% -invoice-luma_studio_long 0:d8f4e3a46d2d -0.19 0.03 brandstrategyworkshop -invoice-luma_studio_long 0:d8f4e3a46d2d#1 -0.14 0.03 brandstrategyworkshop -invoice-luma_studio_long 0:be624d692600 -0.56 0.03 discoverysession,research&brand -invoice-luma_studio_long 0:be624d692600#1 -0.51 0.03 discoverysession,research&brand -invoice-luma_studio_long 0:d6def76ba3d1 -0.55 0.03 positioning.phase1. +invoice-luma_studio_long 0:d8f4e3a46d2d -0.09 0.03 brandstrategyworkshop +invoice-luma_studio_long 0:d8f4e3a46d2d#1 -0.04 0.03 brandstrategyworkshop +invoice-luma_studio_long 0:be624d692600 -0.16 0.03 discoverysession,research&brand +invoice-luma_studio_long 0:be624d692600#1 -0.11 0.03 discoverysession,research&brand +invoice-luma_studio_long 0:d6def76ba3d1 -0.15 0.03 positioning.phase1. invoice-luma_studio_long 0:07bcffc86e95 -0.12 -0.10 £2,650.00 invoice-luma_studio_long 0:07bcffc86e95#1 -0.12 -0.30 £2,650.00 invoice-luma_studio_long 0:07bcffc86e95#2 -0.07 -0.10 £2,650.00 invoice-luma_studio_long 0:07bcffc86e95#3 -0.07 -0.30 £2,650.00 -invoice-luma_studio_long 0:e302dd04d528 -0.18 0.03 visualidentitydesign -invoice-luma_studio_long 0:e302dd04d528#1 -0.13 0.03 visualidentitydesign -invoice-luma_studio_long 0:40e412f627fb -0.55 0.03 logosuite,colourpalette,typograp -invoice-luma_studio_long 0:40e412f627fb#1 -0.50 0.03 logosuite,colourpalette,typograp -invoice-luma_studio_long 0:270a9e26d2e0 -0.54 0.03 &guidelines.phase1. +invoice-luma_studio_long 0:e302dd04d528 -0.08 0.03 visualidentitydesign +invoice-luma_studio_long 0:e302dd04d528#1 -0.03 0.03 visualidentitydesign +invoice-luma_studio_long 0:40e412f627fb -0.15 0.03 logosuite,colourpalette,typograp +invoice-luma_studio_long 0:40e412f627fb#1 -0.10 0.03 logosuite,colourpalette,typograp +invoice-luma_studio_long 0:270a9e26d2e0 -0.14 0.03 &guidelines.phase1. invoice-luma_studio_long 0:a20d66947acc -0.11 -0.10 £3,200.00 invoice-luma_studio_long 0:a20d66947acc#1 -0.11 -0.30 £3,200.00 invoice-luma_studio_long 0:a20d66947acc#2 -0.06 -0.10 £3,200.00 invoice-luma_studio_long 0:a20d66947acc#3 -0.06 -0.30 £3,200.00 -invoice-luma_studio_long 0:b25ac9cd66bd -0.17 0.03 websitedesign(upto8pages) -invoice-luma_studio_long 0:b25ac9cd66bd#1 -0.12 0.03 websitedesign(upto8pages) -invoice-luma_studio_long 0:dab758788e6f -0.54 0.03 ux/uidesignfordesktopandmobile. -invoice-luma_studio_long 0:dab758788e6f#1 -0.49 0.03 ux/uidesignfordesktopandmobile. -invoice-luma_studio_long 0:bb1a79cda1ae -0.53 0.03 phase1. +invoice-luma_studio_long 0:b25ac9cd66bd -0.07 0.03 websitedesign(upto8pages) +invoice-luma_studio_long 0:b25ac9cd66bd#1 -0.02 0.03 websitedesign(upto8pages) +invoice-luma_studio_long 0:dab758788e6f -0.14 0.03 ux/uidesignfordesktopandmobile. +invoice-luma_studio_long 0:dab758788e6f#1 -0.09 0.03 ux/uidesignfordesktopandmobile. +invoice-luma_studio_long 0:bb1a79cda1ae -0.13 0.03 phase1. invoice-luma_studio_long 0:f916278cb74c -0.10 -0.10 £850.00 invoice-luma_studio_long 0:f916278cb74c#1 -0.10 -0.24 £850.00 -invoice-luma_studio_long 0:4a1359f78476 -0.16 0.03 copywriting -invoice-luma_studio_long 0:e6a181326fc9 -0.53 0.03 websitecopy&keymessaging.phase +invoice-luma_studio_long 0:4a1359f78476 -0.06 0.03 copywriting +invoice-luma_studio_long 0:e6a181326fc9 -0.13 0.03 websitecopy&keymessaging.phase invoice-luma_studio_long 0:07b417914317 -0.09 -0.10 £600.00 invoice-luma_studio_long 0:07b417914317#1 -0.09 -0.24 £600.00 -invoice-luma_studio_long 0:340455fbac25 -0.15 0.03 projectmanagement -invoice-luma_studio_long 0:72534f9863ad -0.52 0.03 planning,coordination&client -invoice-luma_studio_long 0:8f09113ca513 -0.51 0.03 liaison.phase1. -invoice-luma_studio_long 0:532160121f5f -0.50 0.03 positioning.phase2. -invoice-luma_studio_long 0:82ed33a90b4e -0.49 0.03 &guidelines.phase2. -invoice-luma_studio_long 0:81deaef85fed -0.48 0.03 phase2. +invoice-luma_studio_long 0:340455fbac25 -0.05 0.03 projectmanagement +invoice-luma_studio_long 0:72534f9863ad -0.12 0.03 planning,coordination&client +invoice-luma_studio_long 0:8f09113ca513 -0.11 0.03 liaison.phase1. +invoice-luma_studio_long 0:532160121f5f -0.10 0.03 positioning.phase2. +invoice-luma_studio_long 0:82ed33a90b4e -0.09 0.03 &guidelines.phase2. +invoice-luma_studio_long 0:81deaef85fed -0.08 0.03 phase2. invoice-luma_studio_long 0:cc6f3d44f8c5 0.01 1.04 page1of3 invoice-luma_studio_long 1:c9046f7a37ad -0.02 0.10 description invoice-luma_studio_long 1:32e8369a9c4f -0.02 0.80 qty @@ -2567,57 +2565,57 @@ invoice-luma_studio_long 1:dc934fe30a94#8 0.09 0.00 20% invoice-luma_studio_long 1:dc934fe30a94#9 0.10 0.00 20% invoice-luma_studio_long 1:dc934fe30a94#10 0.11 0.00 20% invoice-luma_studio_long 1:dc934fe30a94#11 0.12 0.00 20% -invoice-luma_studio_long 1:4a1359f78476 -0.05 0.03 copywriting -invoice-luma_studio_long 1:4a1359f78476#1 0.00 0.03 copywriting -invoice-luma_studio_long 1:4a1359f78476#2 0.05 0.03 copywriting -invoice-luma_studio_long 1:e6a181326fc9 -0.41 0.03 websitecopy&keymessaging.phase -invoice-luma_studio_long 1:e6a181326fc9#1 -0.36 0.03 websitecopy&keymessaging.phase -invoice-luma_studio_long 1:e6a181326fc9#2 -0.31 0.03 websitecopy&keymessaging.phase +invoice-luma_studio_long 1:4a1359f78476 0.05 0.03 copywriting +invoice-luma_studio_long 1:4a1359f78476#1 0.10 0.03 copywriting +invoice-luma_studio_long 1:4a1359f78476#2 0.15 0.03 copywriting +invoice-luma_studio_long 1:e6a181326fc9 -0.01 0.03 websitecopy&keymessaging.phase +invoice-luma_studio_long 1:e6a181326fc9#1 0.04 0.03 websitecopy&keymessaging.phase +invoice-luma_studio_long 1:e6a181326fc9#2 0.09 0.03 websitecopy&keymessaging.phase invoice-luma_studio_long 1:07b417914317 0.02 -0.10 £600.00 invoice-luma_studio_long 1:07b417914317#1 0.02 -0.24 £600.00 invoice-luma_studio_long 1:07b417914317#2 0.07 -0.10 £600.00 invoice-luma_studio_long 1:07b417914317#3 0.07 -0.24 £600.00 invoice-luma_studio_long 1:07b417914317#4 0.12 -0.10 £600.00 invoice-luma_studio_long 1:07b417914317#5 0.12 -0.24 £600.00 -invoice-luma_studio_long 1:340455fbac25 -0.04 0.03 projectmanagement -invoice-luma_studio_long 1:340455fbac25#1 0.01 0.03 projectmanagement -invoice-luma_studio_long 1:340455fbac25#2 0.07 0.03 projectmanagement -invoice-luma_studio_long 1:72534f9863ad -0.40 0.03 planning,coordination&client -invoice-luma_studio_long 1:72534f9863ad#1 -0.35 0.03 planning,coordination&client -invoice-luma_studio_long 1:72534f9863ad#2 -0.30 0.03 planning,coordination&client -invoice-luma_studio_long 1:ad05c4b80bfe -0.40 0.03 liaison.phase2. +invoice-luma_studio_long 1:340455fbac25 0.06 0.03 projectmanagement +invoice-luma_studio_long 1:340455fbac25#1 0.11 0.03 projectmanagement +invoice-luma_studio_long 1:340455fbac25#2 0.16 0.03 projectmanagement +invoice-luma_studio_long 1:72534f9863ad 0.00 0.03 planning,coordination&client +invoice-luma_studio_long 1:72534f9863ad#1 0.05 0.03 planning,coordination&client +invoice-luma_studio_long 1:72534f9863ad#2 0.10 0.03 planning,coordination&client +invoice-luma_studio_long 1:ad05c4b80bfe 0.00 0.03 liaison.phase2. invoice-luma_studio_long 1:7b420577e50f 0.03 -0.10 £1,200.00 invoice-luma_studio_long 1:7b420577e50f#1 0.03 -0.30 £1,200.00 invoice-luma_studio_long 1:7b420577e50f#2 0.08 -0.10 £1,200.00 invoice-luma_studio_long 1:7b420577e50f#3 0.08 -0.30 £1,200.00 -invoice-luma_studio_long 1:d8f4e3a46d2d -0.03 0.03 brandstrategyworkshop -invoice-luma_studio_long 1:d8f4e3a46d2d#1 0.02 0.03 brandstrategyworkshop -invoice-luma_studio_long 1:be624d692600 -0.39 0.03 discoverysession,research&brand -invoice-luma_studio_long 1:be624d692600#1 -0.34 0.03 discoverysession,research&brand -invoice-luma_studio_long 1:b95a82d5055c -0.39 0.03 positioning.phase3. +invoice-luma_studio_long 1:d8f4e3a46d2d 0.07 0.03 brandstrategyworkshop +invoice-luma_studio_long 1:d8f4e3a46d2d#1 0.12 0.03 brandstrategyworkshop +invoice-luma_studio_long 1:be624d692600 0.01 0.03 discoverysession,research&brand +invoice-luma_studio_long 1:be624d692600#1 0.06 0.03 discoverysession,research&brand +invoice-luma_studio_long 1:b95a82d5055c 0.01 0.03 positioning.phase3. invoice-luma_studio_long 1:07bcffc86e95 0.04 -0.10 £2,650.00 invoice-luma_studio_long 1:07bcffc86e95#1 0.04 -0.30 £2,650.00 invoice-luma_studio_long 1:07bcffc86e95#2 0.09 -0.10 £2,650.00 invoice-luma_studio_long 1:07bcffc86e95#3 0.09 -0.30 £2,650.00 -invoice-luma_studio_long 1:e302dd04d528 -0.02 0.03 visualidentitydesign -invoice-luma_studio_long 1:e302dd04d528#1 0.03 0.03 visualidentitydesign -invoice-luma_studio_long 1:40e412f627fb -0.38 0.03 logosuite,colourpalette,typograp -invoice-luma_studio_long 1:40e412f627fb#1 -0.33 0.03 logosuite,colourpalette,typograp -invoice-luma_studio_long 1:708bc0c2e87c -0.38 0.03 &guidelines.phase3. +invoice-luma_studio_long 1:e302dd04d528 0.08 0.03 visualidentitydesign +invoice-luma_studio_long 1:e302dd04d528#1 0.13 0.03 visualidentitydesign +invoice-luma_studio_long 1:40e412f627fb 0.02 0.03 logosuite,colourpalette,typograp +invoice-luma_studio_long 1:40e412f627fb#1 0.07 0.03 logosuite,colourpalette,typograp +invoice-luma_studio_long 1:708bc0c2e87c 0.02 0.03 &guidelines.phase3. invoice-luma_studio_long 1:a20d66947acc 0.05 -0.10 £3,200.00 invoice-luma_studio_long 1:a20d66947acc#1 0.05 -0.30 £3,200.00 invoice-luma_studio_long 1:a20d66947acc#2 0.10 -0.10 £3,200.00 invoice-luma_studio_long 1:a20d66947acc#3 0.10 -0.30 £3,200.00 -invoice-luma_studio_long 1:b25ac9cd66bd -0.01 0.03 websitedesign(upto8pages) -invoice-luma_studio_long 1:b25ac9cd66bd#1 0.04 0.03 websitedesign(upto8pages) -invoice-luma_studio_long 1:dab758788e6f -0.37 0.03 ux/uidesignfordesktopandmobile. -invoice-luma_studio_long 1:dab758788e6f#1 -0.32 0.03 ux/uidesignfordesktopandmobile. -invoice-luma_studio_long 1:155500f32e83 -0.37 0.03 phase3. -invoice-luma_studio_long 1:82f971bee7f8 -0.35 0.03 liaison.phase3. -invoice-luma_studio_long 1:7affbd48dd15 -0.34 0.03 positioning.phase4. -invoice-luma_studio_long 1:e489d439e723 -0.33 0.03 &guidelines.phase4. -invoice-luma_studio_long 1:7024991be198 -0.32 0.03 phase4. -invoice-luma_studio_long 1:bbcc6ebb140f -0.30 0.03 liaison.phase4. +invoice-luma_studio_long 1:b25ac9cd66bd 0.09 0.03 websitedesign(upto8pages) +invoice-luma_studio_long 1:b25ac9cd66bd#1 0.14 0.03 websitedesign(upto8pages) +invoice-luma_studio_long 1:dab758788e6f 0.03 0.03 ux/uidesignfordesktopandmobile. +invoice-luma_studio_long 1:dab758788e6f#1 0.08 0.03 ux/uidesignfordesktopandmobile. +invoice-luma_studio_long 1:155500f32e83 0.03 0.03 phase3. +invoice-luma_studio_long 1:82f971bee7f8 0.05 0.03 liaison.phase3. +invoice-luma_studio_long 1:7affbd48dd15 0.06 0.03 positioning.phase4. +invoice-luma_studio_long 1:e489d439e723 0.07 0.03 &guidelines.phase4. +invoice-luma_studio_long 1:7024991be198 0.08 0.03 phase4. +invoice-luma_studio_long 1:bbcc6ebb140f 0.10 0.03 liaison.phase4. invoice-luma_studio_long 1:d6577e95efba 0.08 0.10 subtotal invoice-luma_studio_long 1:b504edd8ea39 0.08 0.45 £8,500.00 invoice-luma_studio_long 1:a52611c9261b 0.07 0.10 vat(20%) @@ -2626,12 +2624,12 @@ invoice-luma_studio_long 1:57a66d21eb1b -0.92 0.10 totaldue invoice-luma_studio_long 1:b4cb2a644826 0.51 0.10 £10,200.00 invoice-luma_studio_long 1:60fd7eb93483 0.01 1.04 page2of3 invoice-luma_studio_long 2:ab5aa97074c4 -0.03 0.08 notes -invoice-luma_studio_long 2:7c6ab37d83ef -0.15 0.08 thankyouforyourbusiness. -invoice-luma_studio_long 2:3d717dfb25d8 -0.20 0.08 ifyouhaveanyquestionsregarding -invoice-luma_studio_long 2:479a74142336 -0.24 0.08 thisinvoice,pleasegetintouch. -invoice-luma_studio_long 2:1960744391ed -0.13 0.08 allworkremainstheintellectualpro -invoice-luma_studio_long 2:eeb53247f32c -0.18 0.08 ofluma&co.studiountilpayment -invoice-luma_studio_long 2:9eef22d7d34e -0.22 0.08 hasbeenreceivedinfull. +invoice-luma_studio_long 2:7c6ab37d83ef 0.00 0.08 thankyouforyourbusiness. +invoice-luma_studio_long 2:3d717dfb25d8 -0.05 0.08 ifyouhaveanyquestionsregarding +invoice-luma_studio_long 2:479a74142336 -0.09 0.08 thisinvoice,pleasegetintouch. +invoice-luma_studio_long 2:1960744391ed 0.02 0.08 allworkremainstheintellectualpro +invoice-luma_studio_long 2:eeb53247f32c -0.03 0.08 ofluma&co.studiountilpayment +invoice-luma_studio_long 2:9eef22d7d34e -0.07 0.08 hasbeenreceivedinfull. invoice-luma_studio_long 2:3c7ade679fdf -0.03 0.00 paymentdetails invoice-luma_studio_long 2:b1819c9cd5bf -0.10 0.00 pleasemakepaymentbybanktransfert invoice-luma_studio_long 2:8c1e4a24f6a8 -0.06 0.00 luma&co.studioltd @@ -2742,102 +2740,102 @@ invoice-merchant 0:a416c258bdd9 -3.00 0.02 thankyouforchoosingcoastline. invoice-merchant 0:aaa4b5e2074f -3.03 0.02 ifyouhaveanyquestionsaboutthisin invoice-merchant 0:2c865b459156 -3.03 0.10 150elginstreet,8thfloor,ottawa,o invoice-merchant 0:7b14b8d2c5c4 -0.04 0.43 page1of1 -invoice-metered 0:8a80987c409a 0.23 0.12 northwindcloud -invoice-metered 0:52d6e3de4fa0 0.20 0.26 invoice -invoice-metered 0:41305d2c2d3b -0.29 0.12 northwindcloudservicesltd. -invoice-metered 0:41305d2c2d3b#1 -10.61 0.07 northwindcloudservicesltd. -invoice-metered 0:c3f5f4cc9def -0.03 0.12 120riversideway -invoice-metered 0:5be08c6bee4c -0.04 0.12 bristol,bs16qt -invoice-metered 0:2474519f77a9 -0.30 0.12 unitedkingdom -invoice-metered 0:2474519f77a9#1 -0.37 0.13 unitedkingdom -invoice-metered 0:2474519f77a9#2 -0.31 0.06 unitedkingdom -invoice-metered 0:ec6d474a1bfc -0.31 0.12 vatid: -invoice-metered 0:b03c22d79b17 -0.31 0.06 gb412883027 -invoice-metered 0:83e16ec72a3f -0.33 0.12 phone: -invoice-metered 0:bff9aeb5400b -0.33 0.06 +44(0)1174962280 -invoice-metered 0:439961205ae6 -0.35 0.12 email: -invoice-metered 0:228e0a39fe6e -0.35 0.06 billing@northwind.example -invoice-metered 0:228e0a39fe6e#1 -10.74 0.07 billing@northwind.example -invoice-metered 0:294ed2cfe15e -0.36 0.12 website:https://northwind.exampl -invoice-metered 0:6282391a4cc1 -0.18 0.11 invoicenumber: -invoice-metered 0:0edf022238f1 -0.17 0.08 inv-2026-00041882 -invoice-metered 0:8d05f5d55191 -0.20 0.11 invoicedate: -invoice-metered 0:52c8b7a9ee5f -0.19 0.08 31july2026 -invoice-metered 0:0e0fb0fc0939 -0.20 0.11 duedate: -invoice-metered 0:6a077b4f161e -0.19 0.08 30august2026 +invoice-metered 0:8a80987c409a 0.08 0.12 northwindcloud +invoice-metered 0:52d6e3de4fa0 0.05 0.26 invoice +invoice-metered 0:41305d2c2d3b 0.01 0.12 northwindcloudservicesltd. +invoice-metered 0:41305d2c2d3b#1 -10.36 0.07 northwindcloudservicesltd. +invoice-metered 0:c3f5f4cc9def 0.02 0.12 120riversideway +invoice-metered 0:5be08c6bee4c 0.01 0.12 bristol,bs16qt +invoice-metered 0:2474519f77a9 0.00 0.12 unitedkingdom +invoice-metered 0:2474519f77a9#1 -0.07 0.13 unitedkingdom +invoice-metered 0:2474519f77a9#2 -0.11 0.06 unitedkingdom +invoice-metered 0:ec6d474a1bfc -0.01 0.12 vatid: +invoice-metered 0:b03c22d79b17 -0.01 0.06 gb412883027 +invoice-metered 0:83e16ec72a3f -0.03 0.12 phone: +invoice-metered 0:bff9aeb5400b -0.03 0.06 +44(0)1174962280 +invoice-metered 0:439961205ae6 -0.05 0.12 email: +invoice-metered 0:228e0a39fe6e -0.05 0.06 billing@northwind.example +invoice-metered 0:228e0a39fe6e#1 -10.49 0.07 billing@northwind.example +invoice-metered 0:294ed2cfe15e -0.06 0.12 website:https://northwind.exampl +invoice-metered 0:6282391a4cc1 0.12 0.11 invoicenumber: +invoice-metered 0:0edf022238f1 0.18 0.08 inv-2026-00041882 +invoice-metered 0:8d05f5d55191 0.10 0.11 invoicedate: +invoice-metered 0:52c8b7a9ee5f 0.11 0.08 31july2026 +invoice-metered 0:0e0fb0fc0939 0.10 0.11 duedate: +invoice-metered 0:6a077b4f161e 0.11 0.08 30august2026 invoice-metered 0:6a077b4f161e#1 -10.25 0.11 30august2026 -invoice-metered 0:aa1e9c8092ab -0.20 0.11 billperiod: -invoice-metered 0:3e380076ca84 -0.19 0.08 01jul2026–31jul2026 -invoice-metered 0:18e2cca1098e -0.19 0.11 paymentterms: -invoice-metered 0:c6af9fc633ee -0.19 0.08 net30days -invoice-metered 0:967e0b6ca4b9 -0.19 0.11 currency: -invoice-metered 0:54f8e1b3fe44 -0.19 0.08 gbp +invoice-metered 0:aa1e9c8092ab 0.10 0.11 billperiod: +invoice-metered 0:3e380076ca84 0.11 0.08 01jul2026–31jul2026 +invoice-metered 0:18e2cca1098e 0.11 0.11 paymentterms: +invoice-metered 0:c6af9fc633ee 0.11 0.08 net30days +invoice-metered 0:967e0b6ca4b9 0.11 0.11 currency: +invoice-metered 0:54f8e1b3fe44 0.11 0.08 gbp invoice-metered 0:aeba3a7b3598 -0.24 0.13 billto invoice-metered 0:45fe04dbae24 0.00 0.13 brightfutureltd. invoice-metered 0:45fe04dbae24#1 0.00 0.06 brightfutureltd. -invoice-metered 0:65405af34bf9 -0.04 0.13 45kingstreet -invoice-metered 0:1f8da9c4e269 -0.08 0.13 manchester,m24wu -invoice-metered 0:1f8da9c4e269#1 -0.12 0.06 manchester,m24wu -invoice-metered 0:c7a9cfdd1c55 -0.41 0.13 vatid:gb987654321 +invoice-metered 0:65405af34bf9 0.01 0.13 45kingstreet +invoice-metered 0:1f8da9c4e269 -0.03 0.13 manchester,m24wu +invoice-metered 0:1f8da9c4e269#1 -0.07 0.06 manchester,m24wu +invoice-metered 0:c7a9cfdd1c55 -0.11 0.13 vatid:gb987654321 invoice-metered 0:725a8f5062e7 -0.24 0.06 shipto -invoice-metered 0:5895c7cd8d5b -0.04 0.06 warehouse7 -invoice-metered 0:caf76743df2d -0.08 0.06 northindustrialestate -invoice-metered 0:c9046f7a37ad -0.17 0.58 description -invoice-metered 0:9df6b026a8c6 -0.17 0.61 service -invoice-metered 0:32e8369a9c4f -0.17 0.61 qty -invoice-metered 0:d1062d072acd -0.17 0.64 unitprice -invoice-metered 0:cf38d95c9c6b -0.17 0.62 amount -invoice-metered 0:f13d9c7c6f89 -1.26 0.58 computeinstances -invoice-metered 0:d08426b31521 -1.29 0.58 on-demandusage -invoice-metered 0:05313a23f706 -1.25 0.66 london(eu-west) -invoice-metered 0:05313a23f706#1 -3.22 0.66 london(eu-west) -invoice-metered 0:05313a23f706#2 -5.18 0.66 london(eu-west) -invoice-metered 0:6e477a22f840 -1.25 0.98 744hrs -invoice-metered 0:6e477a22f840#1 -5.18 0.98 744hrs -invoice-metered 0:352967434b63 -1.25 0.72 gbp0.0710 -invoice-metered 0:eec5f520909e -1.25 1.11 gbp52.82 -invoice-metered 0:721ffa554e56 -3.22 0.58 objectstorage -invoice-metered 0:df2f05798b9e -3.25 0.58 storedvolume -invoice-metered 0:41542149a8a5 -3.22 0.93 480gb -invoice-metered 0:2242bd7aa8ce -3.22 0.72 gbp0.0215 -invoice-metered 0:7c6be041f9c2 -3.22 1.11 gbp10.32 -invoice-metered 0:8152fd217e12 -5.19 0.58 manageddatabase -invoice-metered 0:3c8556c4aa26 -5.22 0.58 primaryandreplica -invoice-metered 0:76afc71f5b3e -5.18 0.72 gbp0.1650 -invoice-metered 0:baad0db43ed6 -5.18 0.74 gbp122.76 -invoice-metered 0:444858f5bf18 -7.15 0.58 egresstraffic -invoice-metered 0:8b72bb875a83 -7.18 0.58 datatransferout -invoice-metered 0:8001c2743965 -7.15 0.92 global -invoice-metered 0:8001c2743965#1 -9.11 0.92 global -invoice-metered 0:847eb4cbbb42 -7.15 0.93 310gb -invoice-metered 0:d651e46704f7 -7.15 0.72 gbp0.0900 -invoice-metered 0:4ecaa7313375 -7.15 1.11 gbp27.90 -invoice-metered 0:efa8771baad9 -9.11 0.58 supportplan -invoice-metered 0:9e81cd6e653a -9.15 0.58 standardresponse -invoice-metered 0:a0443240c5ed -9.11 1.01 gbp0.91 -invoice-metered 0:a0443240c5ed#1 -9.11 1.03 gbp0.91 +invoice-metered 0:5895c7cd8d5b 0.01 0.06 warehouse7 +invoice-metered 0:caf76743df2d -0.03 0.06 northindustrialestate +invoice-metered 0:c9046f7a37ad 0.03 0.58 description +invoice-metered 0:9df6b026a8c6 0.03 0.61 service +invoice-metered 0:32e8369a9c4f 0.03 0.61 qty +invoice-metered 0:d1062d072acd 0.03 0.64 unitprice +invoice-metered 0:cf38d95c9c6b 0.03 0.62 amount +invoice-metered 0:f13d9c7c6f89 -1.01 0.58 computeinstances +invoice-metered 0:d08426b31521 -0.99 0.58 on-demandusage +invoice-metered 0:05313a23f706 -0.95 0.66 london(eu-west) +invoice-metered 0:05313a23f706#1 -2.92 0.66 london(eu-west) +invoice-metered 0:05313a23f706#2 -4.88 0.66 london(eu-west) +invoice-metered 0:6e477a22f840 -0.95 0.98 744hrs +invoice-metered 0:6e477a22f840#1 -4.88 0.98 744hrs +invoice-metered 0:352967434b63 -0.95 0.72 gbp0.0710 +invoice-metered 0:eec5f520909e -0.95 1.11 gbp52.82 +invoice-metered 0:721ffa554e56 -2.97 0.58 objectstorage +invoice-metered 0:df2f05798b9e -2.95 0.58 storedvolume +invoice-metered 0:41542149a8a5 -2.92 0.93 480gb +invoice-metered 0:2242bd7aa8ce -2.92 0.72 gbp0.0215 +invoice-metered 0:7c6be041f9c2 -2.92 1.11 gbp10.32 +invoice-metered 0:8152fd217e12 -4.94 0.58 manageddatabase +invoice-metered 0:3c8556c4aa26 -4.92 0.58 primaryandreplica +invoice-metered 0:76afc71f5b3e -4.88 0.72 gbp0.1650 +invoice-metered 0:baad0db43ed6 -4.88 0.74 gbp122.76 +invoice-metered 0:444858f5bf18 -6.90 0.58 egresstraffic +invoice-metered 0:8b72bb875a83 -6.88 0.58 datatransferout +invoice-metered 0:8001c2743965 -6.85 0.92 global +invoice-metered 0:8001c2743965#1 -8.81 0.92 global +invoice-metered 0:847eb4cbbb42 -6.85 0.93 310gb +invoice-metered 0:d651e46704f7 -6.85 0.72 gbp0.0900 +invoice-metered 0:4ecaa7313375 -6.85 1.11 gbp27.90 +invoice-metered 0:efa8771baad9 -8.86 0.58 supportplan +invoice-metered 0:9e81cd6e653a -8.85 0.58 standardresponse +invoice-metered 0:a0443240c5ed -8.81 1.01 gbp0.91 +invoice-metered 0:a0443240c5ed#1 -8.81 1.03 gbp0.91 invoice-metered 0:3c7ade679fdf -10.60 0.08 paymentdetails -invoice-metered 0:0ecb5847ffa7 -10.61 0.12 accountname: -invoice-metered 0:944d398aea60 -10.63 0.12 bankname: -invoice-metered 0:062433da3c2a -10.63 0.07 riverbankplc -invoice-metered 0:6b4894c28363 -10.65 0.12 accountnumber: -invoice-metered 0:7c068e1eded4 -10.65 0.07 60415523 -invoice-metered 0:4bf9e1b71d6b -10.67 0.12 sortcode: -invoice-metered 0:0309d81ea4af -10.67 0.07 20-41-08 -invoice-metered 0:1f619f9689b2 -10.69 0.12 iban: -invoice-metered 0:6c4b0e61038b -10.69 0.07 gb29rivb20410860415523 -invoice-metered 0:4f657c67e41a -10.72 0.12 accounttype: -invoice-metered 0:3af279547725 -10.72 0.07 businesscurrent -invoice-metered 0:fa0fbe194b51 -10.74 0.12 remittanceemail: -invoice-metered 0:d6577e95efba -10.12 0.14 subtotal -invoice-metered 0:79fabcfaa819 -10.12 0.73 gbp214.71 -invoice-metered 0:a52611c9261b -10.15 0.14 vat(20%) -invoice-metered 0:e50d8a0ea599 -10.15 0.70 gbp42.94 -invoice-metered 0:57a66d21eb1b -10.28 0.14 totaldue +invoice-metered 0:0ecb5847ffa7 -10.36 0.12 accountname: +invoice-metered 0:944d398aea60 -10.38 0.12 bankname: +invoice-metered 0:062433da3c2a -10.38 0.07 riverbankplc +invoice-metered 0:6b4894c28363 -10.40 0.12 accountnumber: +invoice-metered 0:7c068e1eded4 -10.40 0.07 60415523 +invoice-metered 0:4bf9e1b71d6b -10.42 0.12 sortcode: +invoice-metered 0:0309d81ea4af -10.42 0.07 20-41-08 +invoice-metered 0:1f619f9689b2 -10.44 0.12 iban: +invoice-metered 0:6c4b0e61038b -10.44 0.07 gb29rivb20410860415523 +invoice-metered 0:4f657c67e41a -10.47 0.12 accounttype: +invoice-metered 0:3af279547725 -10.47 0.07 businesscurrent +invoice-metered 0:fa0fbe194b51 -10.49 0.12 remittanceemail: +invoice-metered 0:d6577e95efba -9.82 0.14 subtotal +invoice-metered 0:79fabcfaa819 -9.82 0.73 gbp214.71 +invoice-metered 0:a52611c9261b -9.85 0.14 vat(20%) +invoice-metered 0:e50d8a0ea599 -9.85 0.70 gbp42.94 +invoice-metered 0:57a66d21eb1b -9.98 0.14 totaldue invoice-metered 0:f207312dff2f -10.35 -0.05 gbp257.65 -invoice-metered 0:b0553f008513 -10.19 0.11 paymentdueby -invoice-metered 0:e60e7ef06ccc -10.01 0.10 thankyouforrunningonnorthwindclo -invoice-metered 0:34ea2ec3fe72 -10.26 0.10 forbillingandaccountsupport,visi +invoice-metered 0:b0553f008513 -9.94 0.11 paymentdueby +invoice-metered 0:e60e7ef06ccc -9.96 0.10 thankyouforrunningonnorthwindclo +invoice-metered 0:34ea2ec3fe72 -10.01 0.10 forbillingandaccountsupport,visi invoice-metered 0:e28672d64882 -0.04 0.12 northwindcloudservicesltd.isasub invoice-metered 0:985e43c2de34 -0.04 0.12 120riversideway,bristol,bs16qt,u invoice-metered 0:7b14b8d2c5c4 -0.04 0.16 page1of1 @@ -3194,27 +3192,27 @@ invoice-modern 0:62fcfa8745fc -0.07 0.11 ap@northwind.example invoice-modern 0:2081a41a7764 -0.10 0.11 +441615552200 invoice-modern 0:5a6e7135d21b -0.12 0.11 taxidnw-2026-01 invoice-modern 0:c9046f7a37ad 0.00 0.40 description -invoice-modern 0:32e8369a9c4f 0.00 1.36 qty -invoice-modern 0:385cfdbc00ec 0.00 1.36 unit -invoice-modern 0:cf38d95c9c6b 0.00 1.36 amount +invoice-modern 0:32e8369a9c4f 0.00 0.36 qty +invoice-modern 0:385cfdbc00ec 0.00 0.36 unit +invoice-modern 0:cf38d95c9c6b 0.00 0.36 amount invoice-modern 0:987c6297d0a9 -0.03 0.40 discoveryworkshop -invoice-modern 0:532674c6eb89 -0.03 1.36 gbp1,450 -invoice-modern 0:532674c6eb89#1 -0.03 1.36 gbp1,450 +invoice-modern 0:532674c6eb89 -0.03 0.36 gbp1,450 +invoice-modern 0:532674c6eb89#1 -0.03 0.36 gbp1,450 invoice-modern 0:08ec6deb1c40 -0.03 0.40 templatearchitecture2 -invoice-modern 0:d2e67c4b1cca -0.03 1.36 gbp980 -invoice-modern 0:d6cdf6a05754 -0.03 1.36 gbp1,960 +invoice-modern 0:d2e67c4b1cca -0.03 0.36 gbp980 +invoice-modern 0:d6cdf6a05754 -0.03 0.36 gbp1,960 invoice-modern 0:fe13f8ee4f99 -0.03 0.40 renderqa -invoice-modern 0:7e7398cbff7c -0.03 1.36 gbp320 -invoice-modern 0:e23164e940c7 -0.03 1.36 gbp960 +invoice-modern 0:7e7398cbff7c -0.03 0.36 gbp320 +invoice-modern 0:e23164e940c7 -0.03 0.36 gbp960 invoice-modern 0:6047df51175c -0.03 0.40 developerenablement1 -invoice-modern 0:c2ad01ea64ae -0.03 1.36 gbp780 -invoice-modern 0:c2ad01ea64ae#1 -0.03 1.36 gbp780 -invoice-modern 0:d6577e95efba -0.03 1.36 subtotal -invoice-modern 0:50cae0510231 -0.03 1.36 gbp5,150 -invoice-modern 0:a52611c9261b -0.03 1.36 vat(20%) -invoice-modern 0:d7f4425b8b16 -0.03 1.36 gbp1,030 -invoice-modern 0:11239872d178 -0.02 1.36 total -invoice-modern 0:45a5ad5ad430 -0.02 1.36 gbp6,180 +invoice-modern 0:c2ad01ea64ae -0.03 0.36 gbp780 +invoice-modern 0:c2ad01ea64ae#1 -0.03 0.36 gbp780 +invoice-modern 0:d6577e95efba -0.03 0.36 subtotal +invoice-modern 0:50cae0510231 -0.03 0.36 gbp5,150 +invoice-modern 0:a52611c9261b -0.03 0.36 vat(20%) +invoice-modern 0:d7f4425b8b16 -0.03 0.36 gbp1,030 +invoice-modern 0:11239872d178 -0.02 0.36 total +invoice-modern 0:45a5ad5ad430 -0.02 0.36 gbp6,180 invoice-modern 0:ab5aa97074c4 0.15 0.10 notes invoice-modern 0:b78eb53cbd11 -0.08 0.10 •pleaseincludetheinvoicenumberon invoice-modern 0:8c8fd62f15a7 -0.08 0.12 yourremittanceadvice. @@ -3247,139 +3245,139 @@ invoice-modern_long 0:00a97da4e243 -0.15 0.11 manchester,uk invoice-modern_long 0:62fcfa8745fc -0.17 0.11 ap@northwind.example invoice-modern_long 0:2081a41a7764 -0.20 0.11 +441615552200 invoice-modern_long 0:c9046f7a37ad -0.02 0.40 description -invoice-modern_long 0:32e8369a9c4f -0.02 1.35 qty -invoice-modern_long 0:385cfdbc00ec -0.02 1.40 unit -invoice-modern_long 0:cf38d95c9c6b -0.02 1.35 amount +invoice-modern_long 0:32e8369a9c4f -0.02 0.35 qty +invoice-modern_long 0:385cfdbc00ec -0.02 0.35 unit +invoice-modern_long 0:cf38d95c9c6b -0.02 0.35 amount invoice-modern_long 0:aa29f2f4fcb4 -0.05 0.40 discoveryworkshop—sprint1 -invoice-modern_long 0:ce4081aef7a1 -0.05 1.40 gbp180 -invoice-modern_long 0:ce4081aef7a1#1 -0.05 1.35 gbp180 +invoice-modern_long 0:ce4081aef7a1 -0.05 0.35 gbp180 +invoice-modern_long 0:ce4081aef7a1#1 -0.05 0.35 gbp180 invoice-modern_long 0:9c9a412f0a45 -0.05 0.40 designsystemaudit—sprint1 -invoice-modern_long 0:7be809cb1590 -0.05 1.40 gbp217 -invoice-modern_long 0:378b363c8601 -0.05 1.35 gbp434 +invoice-modern_long 0:7be809cb1590 -0.05 0.35 gbp217 +invoice-modern_long 0:378b363c8601 -0.05 0.35 gbp434 invoice-modern_long 0:5257532a7b5d -0.05 0.40 templatearchitecture—sprint1 -invoice-modern_long 0:c467cca4e45a -0.05 1.40 gbp254 -invoice-modern_long 0:4a4a218b012a -0.05 1.35 gbp762 +invoice-modern_long 0:c467cca4e45a -0.05 0.35 gbp254 +invoice-modern_long 0:4a4a218b012a -0.05 0.35 gbp762 invoice-modern_long 0:58a1caacbf7e -0.05 0.40 layoutenginetuning—sprint1 -invoice-modern_long 0:dde0144b97b7 -0.05 1.40 gbp291 -invoice-modern_long 0:457a71636ad9 -0.05 1.35 gbp1164 +invoice-modern_long 0:dde0144b97b7 -0.05 0.35 gbp291 +invoice-modern_long 0:457a71636ad9 -0.05 0.35 gbp1164 invoice-modern_long 0:6fcf7d6dd606 -0.05 0.40 renderqapass—sprint1 -invoice-modern_long 0:dda88f5786f5 -0.05 1.40 gbp328 -invoice-modern_long 0:dda88f5786f5#1 -0.05 1.35 gbp328 +invoice-modern_long 0:dda88f5786f5 -0.05 0.35 gbp328 +invoice-modern_long 0:dda88f5786f5#1 -0.05 0.35 gbp328 invoice-modern_long 0:ee18ad3bbb42 -0.05 0.40 accessibilityreview—sprint1 -invoice-modern_long 0:e681b4843ffb -0.05 1.40 gbp365 -invoice-modern_long 0:1859c20b35dd -0.05 1.35 gbp730 +invoice-modern_long 0:e681b4843ffb -0.05 0.35 gbp365 +invoice-modern_long 0:1859c20b35dd -0.05 0.35 gbp730 invoice-modern_long 0:c12c14945fcd -0.05 0.40 fontpipelinesetup—sprint1 -invoice-modern_long 0:9033a33f66e7 -0.05 1.40 gbp402 -invoice-modern_long 0:837d48c1ff40 -0.05 1.35 gbp1206 +invoice-modern_long 0:9033a33f66e7 -0.05 0.35 gbp402 +invoice-modern_long 0:837d48c1ff40 -0.05 0.35 gbp1206 invoice-modern_long 0:af6cba848dc0 -0.05 0.40 chartintegration—sprint1 -invoice-modern_long 0:6109a2c30104 -0.05 1.40 gbp439 -invoice-modern_long 0:87e9fcb6151d -0.05 1.35 gbp1756 +invoice-modern_long 0:6109a2c30104 -0.05 0.35 gbp439 +invoice-modern_long 0:87e9fcb6151d -0.05 0.35 gbp1756 invoice-modern_long 0:a6bee1ec5e35 -0.05 0.40 datamapping—sprint1 -invoice-modern_long 0:df1f9d4443d8 -0.05 1.40 gbp476 -invoice-modern_long 0:df1f9d4443d8#1 -0.05 1.35 gbp476 +invoice-modern_long 0:df1f9d4443d8 -0.05 0.35 gbp476 +invoice-modern_long 0:df1f9d4443d8#1 -0.05 0.35 gbp476 invoice-modern_long 0:052c9f49a4b8 -0.05 0.40 paginationhardening—sprint1 -invoice-modern_long 0:9fba6332e489 -0.05 1.40 gbp513 -invoice-modern_long 0:6f805c9f78c3 -0.05 1.35 gbp1026 +invoice-modern_long 0:9fba6332e489 -0.05 0.35 gbp513 +invoice-modern_long 0:6f805c9f78c3 -0.05 0.35 gbp1026 invoice-modern_long 0:b54b7f77d86c -0.05 0.40 visualregressionwiring—sprint13 -invoice-modern_long 0:dc3d212d6b32 -0.05 1.40 gbp550 -invoice-modern_long 0:96667fee53f3 -0.05 1.35 gbp1650 +invoice-modern_long 0:dc3d212d6b32 -0.05 0.35 gbp550 +invoice-modern_long 0:96667fee53f3 -0.05 0.35 gbp1650 invoice-modern_long 0:9fe9e123b0f0 -0.05 0.40 docsauthoring—sprint1 -invoice-modern_long 0:e7b406f24f04 -0.05 1.40 gbp587 -invoice-modern_long 0:74357ca6b30e -0.05 1.35 gbp2348 +invoice-modern_long 0:e7b406f24f04 -0.05 0.35 gbp587 +invoice-modern_long 0:74357ca6b30e -0.05 0.35 gbp2348 invoice-modern_long 0:9c6cf539f5bc -0.05 0.40 stakeholderdemo—sprint1 -invoice-modern_long 0:cf79b5cdb735 -0.05 1.40 gbp624 -invoice-modern_long 0:cf79b5cdb735#1 -0.05 1.35 gbp624 +invoice-modern_long 0:cf79b5cdb735 -0.05 0.35 gbp624 +invoice-modern_long 0:cf79b5cdb735#1 -0.05 0.35 gbp624 invoice-modern_long 0:d2bde6642670 -0.05 0.40 performanceprofiling—sprint1 -invoice-modern_long 0:679f017f73c1 -0.05 1.40 gbp661 -invoice-modern_long 0:63985b524723 -0.05 1.35 gbp1322 +invoice-modern_long 0:679f017f73c1 -0.05 0.35 gbp661 +invoice-modern_long 0:63985b524723 -0.05 0.35 gbp1322 invoice-modern_long 0:f82bef1ac80d -0.05 0.40 releaseengineering—sprint1 -invoice-modern_long 0:0b21b7cf2ff9 -0.05 1.40 gbp698 -invoice-modern_long 0:6afc08056aaa -0.05 1.35 gbp2094 +invoice-modern_long 0:0b21b7cf2ff9 -0.05 0.35 gbp698 +invoice-modern_long 0:6afc08056aaa -0.05 0.35 gbp2094 invoice-modern_long 0:632f71e8ff8b -0.05 0.40 supportretainer—sprint1 -invoice-modern_long 0:70b393b5fb10 -0.05 1.40 gbp735 -invoice-modern_long 0:29edf7588a57 -0.05 1.35 gbp2940 +invoice-modern_long 0:70b393b5fb10 -0.05 0.35 gbp735 +invoice-modern_long 0:29edf7588a57 -0.05 0.35 gbp2940 invoice-modern_long 0:82a9218b91ae -0.05 0.40 discoveryworkshop—sprint2 -invoice-modern_long 0:c313f34b71b9 -0.05 1.40 gbp772 -invoice-modern_long 0:c313f34b71b9#1 -0.05 1.35 gbp772 +invoice-modern_long 0:c313f34b71b9 -0.05 0.35 gbp772 +invoice-modern_long 0:c313f34b71b9#1 -0.05 0.35 gbp772 invoice-modern_long 0:7e69fbffe3e2 -0.05 0.40 designsystemaudit—sprint2 -invoice-modern_long 0:e096e4fddf9a -0.05 1.40 gbp809 -invoice-modern_long 0:c985a0123929 -0.05 1.35 gbp1618 +invoice-modern_long 0:e096e4fddf9a -0.05 0.35 gbp809 +invoice-modern_long 0:c985a0123929 -0.05 0.35 gbp1618 invoice-modern_long 0:899f0392eecb -0.05 0.40 templatearchitecture—sprint2 -invoice-modern_long 0:4c973ddb9245 -0.05 1.40 gbp846 -invoice-modern_long 0:6ec359ce3927 -0.05 1.35 gbp2538 +invoice-modern_long 0:4c973ddb9245 -0.05 0.35 gbp846 +invoice-modern_long 0:6ec359ce3927 -0.05 0.35 gbp2538 invoice-modern_long 0:69523ba7402c -0.05 0.40 layoutenginetuning—sprint2 -invoice-modern_long 0:0e196c2b490b -0.05 1.40 gbp883 -invoice-modern_long 0:6e0d19ab72c6 -0.05 1.35 gbp3532 +invoice-modern_long 0:0e196c2b490b -0.05 0.35 gbp883 +invoice-modern_long 0:6e0d19ab72c6 -0.05 0.35 gbp3532 invoice-modern_long 1:c9046f7a37ad 0.00 0.40 description -invoice-modern_long 1:32e8369a9c4f 0.00 1.35 qty -invoice-modern_long 1:385cfdbc00ec 0.00 1.40 unit -invoice-modern_long 1:cf38d95c9c6b 0.00 1.35 amount +invoice-modern_long 1:32e8369a9c4f 0.00 0.35 qty +invoice-modern_long 1:385cfdbc00ec 0.00 0.35 unit +invoice-modern_long 1:cf38d95c9c6b 0.00 0.35 amount invoice-modern_long 1:f12cbb7c274d -0.03 0.40 renderqapass—sprint2 -invoice-modern_long 1:b813c73bc488 -0.03 1.40 gbp920 -invoice-modern_long 1:b813c73bc488#1 -0.03 1.35 gbp920 +invoice-modern_long 1:b813c73bc488 -0.03 0.35 gbp920 +invoice-modern_long 1:b813c73bc488#1 -0.03 0.35 gbp920 invoice-modern_long 1:12cd54b50187 -0.03 0.40 accessibilityreview—sprint2 -invoice-modern_long 1:377d92702316 -0.03 1.40 gbp957 -invoice-modern_long 1:e7c66f6cf477 -0.03 1.35 gbp1914 +invoice-modern_long 1:377d92702316 -0.03 0.35 gbp957 +invoice-modern_long 1:e7c66f6cf477 -0.03 0.35 gbp1914 invoice-modern_long 1:e3d8409ace07 -0.03 0.40 fontpipelinesetup—sprint2 -invoice-modern_long 1:21604b8f0b36 -0.03 1.40 gbp994 -invoice-modern_long 1:fe15ed444063 -0.03 1.35 gbp2982 +invoice-modern_long 1:21604b8f0b36 -0.03 0.35 gbp994 +invoice-modern_long 1:fe15ed444063 -0.03 0.35 gbp2982 invoice-modern_long 1:ca4d3c8eca22 -0.03 0.40 chartintegration—sprint2 -invoice-modern_long 1:a4c7a6612c99 -0.03 1.40 gbp1031 -invoice-modern_long 1:1c83f0b47e27 -0.03 1.35 gbp4124 +invoice-modern_long 1:a4c7a6612c99 -0.03 0.35 gbp1031 +invoice-modern_long 1:1c83f0b47e27 -0.03 0.35 gbp4124 invoice-modern_long 1:00de69c6e70f -0.03 0.40 datamapping—sprint2 -invoice-modern_long 1:b9d5c56a2cfd -0.03 1.40 gbp1068 -invoice-modern_long 1:b9d5c56a2cfd#1 -0.03 1.35 gbp1068 +invoice-modern_long 1:b9d5c56a2cfd -0.03 0.35 gbp1068 +invoice-modern_long 1:b9d5c56a2cfd#1 -0.03 0.35 gbp1068 invoice-modern_long 1:eb628b5ea8ab -0.03 0.40 paginationhardening—sprint2 -invoice-modern_long 1:db5327b47d0e -0.03 1.40 gbp205 -invoice-modern_long 1:99d9b3b49da2 -0.03 1.35 gbp410 +invoice-modern_long 1:db5327b47d0e -0.03 0.35 gbp205 +invoice-modern_long 1:99d9b3b49da2 -0.03 0.35 gbp410 invoice-modern_long 1:505693cbc91e -0.03 0.40 visualregressionwiring—sprint23 -invoice-modern_long 1:9f0c5094fb63 -0.03 1.40 gbp242 -invoice-modern_long 1:095b72c9d880 -0.03 1.35 gbp726 +invoice-modern_long 1:9f0c5094fb63 -0.03 0.35 gbp242 +invoice-modern_long 1:095b72c9d880 -0.03 0.35 gbp726 invoice-modern_long 1:2a787e61730a -0.03 0.40 docsauthoring—sprint2 -invoice-modern_long 1:28ad00e76aef -0.03 1.40 gbp279 -invoice-modern_long 1:fbb12fed0bbc -0.03 1.35 gbp1116 +invoice-modern_long 1:28ad00e76aef -0.03 0.35 gbp279 +invoice-modern_long 1:fbb12fed0bbc -0.03 0.35 gbp1116 invoice-modern_long 1:5369a2c40ff8 -0.03 0.40 stakeholderdemo—sprint2 -invoice-modern_long 1:16562cbcd318 -0.03 1.40 gbp316 -invoice-modern_long 1:16562cbcd318#1 -0.03 1.35 gbp316 +invoice-modern_long 1:16562cbcd318 -0.03 0.35 gbp316 +invoice-modern_long 1:16562cbcd318#1 -0.03 0.35 gbp316 invoice-modern_long 1:611b258cb41e -0.03 0.40 performanceprofiling—sprint2 -invoice-modern_long 1:e391d4e46366 -0.03 1.40 gbp353 -invoice-modern_long 1:7106c00cb009 -0.03 1.35 gbp706 +invoice-modern_long 1:e391d4e46366 -0.03 0.35 gbp353 +invoice-modern_long 1:7106c00cb009 -0.03 0.35 gbp706 invoice-modern_long 1:d24a15800df1 -0.03 0.40 releaseengineering—sprint2 -invoice-modern_long 1:4bed9b4092ee -0.03 1.40 gbp390 -invoice-modern_long 1:ae16cd1e31b1 -0.03 1.35 gbp1170 +invoice-modern_long 1:4bed9b4092ee -0.03 0.35 gbp390 +invoice-modern_long 1:ae16cd1e31b1 -0.03 0.35 gbp1170 invoice-modern_long 1:6876c7b0fe66 -0.03 0.40 supportretainer—sprint2 -invoice-modern_long 1:909481a45a34 -0.03 1.40 gbp427 -invoice-modern_long 1:4e58d78d0958 -0.03 1.35 gbp1708 +invoice-modern_long 1:909481a45a34 -0.03 0.35 gbp427 +invoice-modern_long 1:4e58d78d0958 -0.03 0.35 gbp1708 invoice-modern_long 1:ddce236bccd7 -0.03 0.40 discoveryworkshop—sprint3 -invoice-modern_long 1:f8d17c11d834 -0.03 1.40 gbp464 -invoice-modern_long 1:f8d17c11d834#1 -0.03 1.35 gbp464 +invoice-modern_long 1:f8d17c11d834 -0.03 0.35 gbp464 +invoice-modern_long 1:f8d17c11d834#1 -0.03 0.35 gbp464 invoice-modern_long 1:c0986cd7b1d4 -0.03 0.40 designsystemaudit—sprint3 -invoice-modern_long 1:09c7aebd89f6 -0.03 1.40 gbp501 -invoice-modern_long 1:a61c7b6bdd20 -0.03 1.35 gbp1002 +invoice-modern_long 1:09c7aebd89f6 -0.03 0.35 gbp501 +invoice-modern_long 1:a61c7b6bdd20 -0.03 0.35 gbp1002 invoice-modern_long 1:21fd82d170b2 -0.03 0.40 templatearchitecture—sprint3 -invoice-modern_long 1:399e39a6eff5 -0.03 1.40 gbp538 -invoice-modern_long 1:81ea39164f41 -0.03 1.35 gbp1614 +invoice-modern_long 1:399e39a6eff5 -0.03 0.35 gbp538 +invoice-modern_long 1:81ea39164f41 -0.03 0.35 gbp1614 invoice-modern_long 1:47cb1e683e8d -0.03 0.40 layoutenginetuning—sprint3 -invoice-modern_long 1:f6df6e8e8f30 -0.03 1.40 gbp575 -invoice-modern_long 1:7f7db0f4c1cf -0.03 1.35 gbp2300 +invoice-modern_long 1:f6df6e8e8f30 -0.03 0.35 gbp575 +invoice-modern_long 1:7f7db0f4c1cf -0.03 0.35 gbp2300 invoice-modern_long 1:608e31719f07 -0.03 0.40 renderqapass—sprint3 -invoice-modern_long 1:e4fbc626999e -0.03 1.40 gbp612 -invoice-modern_long 1:e4fbc626999e#1 -0.03 1.35 gbp612 +invoice-modern_long 1:e4fbc626999e -0.03 0.35 gbp612 +invoice-modern_long 1:e4fbc626999e#1 -0.03 0.35 gbp612 invoice-modern_long 1:98bfb4deb0b7 -0.03 0.40 accessibilityreview—sprint3 -invoice-modern_long 1:7915a839b285 -0.03 1.40 gbp649 -invoice-modern_long 1:ca74221d78ad -0.03 1.35 gbp1298 +invoice-modern_long 1:7915a839b285 -0.03 0.35 gbp649 +invoice-modern_long 1:ca74221d78ad -0.03 0.35 gbp1298 invoice-modern_long 1:375dddcbee43 -0.03 0.40 fontpipelinesetup—sprint3 -invoice-modern_long 1:7b97f0ac8a87 -0.03 1.40 gbp686 -invoice-modern_long 1:6a57f6a84a1c -0.03 1.35 gbp2058 +invoice-modern_long 1:7b97f0ac8a87 -0.03 0.35 gbp686 +invoice-modern_long 1:6a57f6a84a1c -0.03 0.35 gbp2058 invoice-modern_long 1:2f4f507058ff -0.03 0.40 chartintegration—sprint3 -invoice-modern_long 1:74df855b318c -0.03 1.40 gbp723 -invoice-modern_long 1:78016cdf49ca -0.03 1.35 gbp2892 -invoice-modern_long 1:d6577e95efba -0.03 1.40 subtotal -invoice-modern_long 1:5969b6461056 -0.03 1.35 gbp44,890 -invoice-modern_long 1:a52611c9261b -0.03 1.40 vat(20%) -invoice-modern_long 1:e7fda33332e9 -0.03 1.35 gbp8,978 -invoice-modern_long 1:11239872d178 -0.02 1.40 total -invoice-modern_long 1:90b9dec01ea9 -0.02 1.35 gbp53,868 +invoice-modern_long 1:74df855b318c -0.03 0.35 gbp723 +invoice-modern_long 1:78016cdf49ca -0.03 0.35 gbp2892 +invoice-modern_long 1:d6577e95efba -0.03 0.35 subtotal +invoice-modern_long 1:5969b6461056 -0.03 0.35 gbp44,890 +invoice-modern_long 1:a52611c9261b -0.03 0.35 vat(20%) +invoice-modern_long 1:e7fda33332e9 -0.03 0.35 gbp8,978 +invoice-modern_long 1:11239872d178 -0.02 0.35 total +invoice-modern_long 1:90b9dec01ea9 -0.02 0.35 gbp53,868 invoice-modern_long 1:ab5aa97074c4 0.15 0.10 notes invoice-modern_long 1:970fb4bf9d95 -0.08 0.10 •sprints1-3weredeliveredunderthe invoice-modern_long 1:a781fa6c76d2 -0.08 0.12 frameworkagreement. @@ -3455,14 +3453,14 @@ invoice-obsidian 0:eafa82a0eadf -0.24 0.63 £146.00 invoice-obsidian 0:57a66d21eb1b -0.32 0.11 totaldue invoice-obsidian 0:ad3ba615a506 -0.34 -0.59 £876.00 invoice-obsidian 0:ab5aa97074c4 -0.23 0.08 notes -invoice-obsidian 0:0956d8d0441d 0.14 0.08 thankyouforchoosingkestrelbusine -invoice-obsidian 0:0b4d6f0e8783 0.14 0.08 thisinvoicecoversservicesandfeat -invoice-obsidian 0:02e483554647 0.15 0.08 toyourbusinessasofthedateofissue -invoice-obsidian 0:b439106fc5a1 0.16 0.08 ifyouhaveanyquestionsaboutthisin -invoice-obsidian 0:877ac656a147 0.17 0.08 pleasecontactusatar@kestrel.exam +invoice-obsidian 0:0956d8d0441d -0.26 0.08 thankyouforchoosingkestrelbusine +invoice-obsidian 0:0b4d6f0e8783 -0.26 0.08 thisinvoicecoversservicesandfeat +invoice-obsidian 0:02e483554647 -0.25 0.08 toyourbusinessasofthedateofissue +invoice-obsidian 0:b439106fc5a1 -0.24 0.08 ifyouhaveanyquestionsaboutthisin +invoice-obsidian 0:877ac656a147 -0.23 0.08 pleasecontactusatar@kestrel.exam invoice-obsidian 0:3c7ade679fdf -0.23 0.09 paymentdetails -invoice-obsidian 0:473fbeedb47c -0.75 0.11 pleasepaybybanktransfer -invoice-obsidian 0:59f2b74175d7 -0.74 0.11 totheaccountbelow. +invoice-obsidian 0:473fbeedb47c -0.25 0.11 pleasepaybybanktransfer +invoice-obsidian 0:59f2b74175d7 -0.24 0.11 totheaccountbelow. invoice-obsidian 0:811f691f5582 -0.22 0.11 payee invoice-obsidian 0:10aeacde20ff -0.23 0.11 sortcode invoice-obsidian 0:a748c443f622 -0.29 0.08 04-00-75 @@ -3851,77 +3849,77 @@ invoice-payments 0:b6c4ac412ac8 -0.02 0.10 meridian invoice-payments 0:52d6e3de4fa0 0.41 0.05 invoice invoice-payments 0:c0cc75b9cfdc -0.22 0.12 meridianpaymentsltd. invoice-payments 0:c0cc75b9cfdc#1 -5.11 0.10 meridianpaymentsltd. -invoice-payments 0:5eeaa101da6c -0.19 0.12 1harbourexchange -invoice-payments 0:e3f6090f249b -0.23 0.12 canarywharf -invoice-payments 0:1bb9adbf32ff -0.26 0.12 londone149ge -invoice-payments 0:2474519f77a9 -0.30 0.12 unitedkingdom -invoice-payments 0:2474519f77a9#1 0.19 0.12 unitedkingdom -invoice-payments 0:2474519f77a9#2 -0.01 0.05 unitedkingdom -invoice-payments 0:e89d810f7944 -0.22 0.12 companyno.09048900 -invoice-payments 0:a3052fe78c6e -0.22 0.12 vatno.gb123456789 -invoice-payments 0:5d1d1b79af09 -0.07 0.05 invoicenumber -invoice-payments 0:3d9e18bc1da9 -0.09 0.05 invoicedate -invoice-payments 0:9fb3dbb29042 -0.12 0.05 billingperiod -invoice-payments 0:acc0140cb66d -0.14 0.05 accountid -invoice-payments 0:fb854bac39c8 -0.16 0.05 paymentterms -invoice-payments 0:ac10f8c16320 -0.19 0.05 duedate -invoice-payments 0:073c1634c496 -0.21 0.05 status -invoice-payments 0:052ff4dff688 -0.04 -0.02 inv-2025-05-10472 +invoice-payments 0:5eeaa101da6c 0.11 0.12 1harbourexchange +invoice-payments 0:e3f6090f249b 0.07 0.12 canarywharf +invoice-payments 0:1bb9adbf32ff 0.04 0.12 londone149ge +invoice-payments 0:2474519f77a9 0.00 0.12 unitedkingdom +invoice-payments 0:2474519f77a9#1 0.24 0.12 unitedkingdom +invoice-payments 0:2474519f77a9#2 0.24 0.05 unitedkingdom +invoice-payments 0:e89d810f7944 0.08 0.12 companyno.09048900 +invoice-payments 0:a3052fe78c6e 0.08 0.12 vatno.gb123456789 +invoice-payments 0:5d1d1b79af09 0.23 0.05 invoicenumber +invoice-payments 0:3d9e18bc1da9 0.21 0.05 invoicedate +invoice-payments 0:9fb3dbb29042 0.18 0.05 billingperiod +invoice-payments 0:acc0140cb66d 0.16 0.05 accountid +invoice-payments 0:fb854bac39c8 0.14 0.05 paymentterms +invoice-payments 0:ac10f8c16320 0.11 0.05 duedate +invoice-payments 0:073c1634c496 0.09 0.05 status +invoice-payments 0:052ff4dff688 0.26 -0.02 inv-2025-05-10472 invoice-payments 0:052ff4dff688#1 -5.41 0.10 inv-2025-05-10472 -invoice-payments 0:23a4c624cbda -0.01 -0.02 10may2025 -invoice-payments 0:7b052c343b27 0.02 -0.02 1-30april2025 -invoice-payments 0:018052c1dd59 0.04 -0.02 acct_4q8xtb2mkp -invoice-payments 0:98ec3d1fd5b9 0.07 -0.02 net30 -invoice-payments 0:1ade0cb4877f 0.10 -0.02 14june2025 -invoice-payments 0:e66d03af0bf1 -0.01 -0.02 unpaid -invoice-payments 0:aeba3a7b3598 0.03 0.17 billto -invoice-payments 0:98997fb707ef 0.20 0.12 northwindltd. -invoice-payments 0:98997fb707ef#1 0.20 0.05 northwindltd. -invoice-payments 0:834834123752 0.28 0.12 attention:financeteam -invoice-payments 0:76b6fd2080ed 0.25 0.12 42bridgewaterstreet -invoice-payments 0:e031db0583eb 0.22 0.12 manchesterm154qt -invoice-payments 0:23f3489a1043 0.04 0.12 vatno.gb987654321 -invoice-payments 0:725a8f5062e7 0.03 0.00 shipto -invoice-payments 0:9976f2392d8c 0.28 0.05 operationscentre -invoice-payments 0:fc0e113402c7 0.25 0.05 7kingswaypark -invoice-payments 0:a72c3f2308ed 0.22 0.05 leedsls126bd +invoice-payments 0:23a4c624cbda 0.29 -0.02 10may2025 +invoice-payments 0:7b052c343b27 0.32 -0.02 1-30april2025 +invoice-payments 0:018052c1dd59 0.34 -0.02 acct_4q8xtb2mkp +invoice-payments 0:98ec3d1fd5b9 0.37 -0.02 net30 +invoice-payments 0:1ade0cb4877f 0.40 -0.02 14june2025 +invoice-payments 0:e66d03af0bf1 0.29 -0.02 unpaid +invoice-payments 0:aeba3a7b3598 0.28 0.17 billto +invoice-payments 0:98997fb707ef 0.30 0.12 northwindltd. +invoice-payments 0:98997fb707ef#1 0.30 0.05 northwindltd. +invoice-payments 0:834834123752 0.33 0.12 attention:financeteam +invoice-payments 0:76b6fd2080ed 0.30 0.12 42bridgewaterstreet +invoice-payments 0:e031db0583eb 0.27 0.12 manchesterm154qt +invoice-payments 0:23f3489a1043 0.24 0.12 vatno.gb987654321 +invoice-payments 0:725a8f5062e7 0.28 0.00 shipto +invoice-payments 0:9976f2392d8c 0.33 0.05 operationscentre +invoice-payments 0:fc0e113402c7 0.30 0.05 7kingswaypark +invoice-payments 0:a72c3f2308ed 0.27 0.05 leedsls126bd invoice-payments 0:c9046f7a37ad -0.01 0.47 description invoice-payments 0:1a7b308d8df6 -0.01 0.38 quantity invoice-payments 0:d1062d072acd -0.01 0.36 unitprice invoice-payments 0:7c512b48ba8a -0.01 0.40 vat invoice-payments 0:2da123241332 -0.01 1.09 amount(gbp) -invoice-payments 0:3ab6c1099bcc -0.02 0.42 subscriptionbilling -invoice-payments 0:c8e69cd6e074 0.12 0.42 subscriptionmanagementandrecurri -invoice-payments 0:0c95c7ece1ce -0.04 0.42 billing +invoice-payments 0:3ab6c1099bcc 0.28 0.42 subscriptionbilling +invoice-payments 0:c8e69cd6e074 0.42 0.42 subscriptionmanagementandrecurri +invoice-payments 0:0c95c7ece1ce 0.26 0.42 billing invoice-payments 0:96d6b62c061d -0.05 -0.21 £250.00 -invoice-payments 0:96d6b62c061d#1 -0.04 0.74 £250.00 +invoice-payments 0:96d6b62c061d#1 0.26 0.74 £250.00 invoice-payments 0:dc934fe30a94 -0.05 0.26 20% invoice-payments 0:dc934fe30a94#1 -0.05 0.26 20% invoice-payments 0:dc934fe30a94#2 -0.68 0.26 20% invoice-payments 0:dc934fe30a94#3 -1.99 0.26 20% invoice-payments 0:dc934fe30a94#4 -3.30 0.26 20% invoice-payments 0:dc934fe30a94#5 -4.61 0.26 20% -invoice-payments 0:0a9acaea6477 -0.02 0.42 paymentprocessing -invoice-payments 0:b8a3c21545b4 0.12 0.42 onlinecardpaymentsprocessing -invoice-payments 0:b42561a38a06 -0.04 0.42 (volumetier) +invoice-payments 0:0a9acaea6477 0.28 0.42 paymentprocessing +invoice-payments 0:b8a3c21545b4 0.42 0.42 onlinecardpaymentsprocessing +invoice-payments 0:b42561a38a06 0.26 0.42 (volumetier) invoice-payments 0:351704ebff51 -0.05 -0.35 £1,180.00 -invoice-payments 0:351704ebff51#1 -0.04 0.77 £1,180.00 -invoice-payments 0:b3bc34f90a55 -0.68 0.42 fraudscreening -invoice-payments 0:ed051c6a1942 -0.64 0.42 advancedfraudscreeningandrules +invoice-payments 0:351704ebff51#1 0.26 0.77 £1,180.00 +invoice-payments 0:b3bc34f90a55 -0.38 0.42 fraudscreening +invoice-payments 0:ed051c6a1942 -0.39 0.42 advancedfraudscreeningandrules invoice-payments 0:a0a787efd867 -0.68 -0.21 £320.00 -invoice-payments 0:a0a787efd867#1 -0.67 0.74 £320.00 -invoice-payments 0:34b75c1d0234 -1.99 0.42 companyformation -invoice-payments 0:bf45c494a8dc -1.95 0.42 incorporationandcompliancefiling +invoice-payments 0:a0a787efd867#1 -0.37 0.74 £320.00 +invoice-payments 0:34b75c1d0234 -1.69 0.42 companyformation +invoice-payments 0:bf45c494a8dc -1.70 0.42 incorporationandcompliancefiling invoice-payments 0:629184210581 -1.99 -0.21 £180.00 -invoice-payments 0:629184210581#1 -1.98 0.74 £180.00 -invoice-payments 0:9427a01801d2 -3.30 0.42 in-personterminals -invoice-payments 0:882be821cf2e -3.26 0.42 terminalrentalandfirmwareupdates +invoice-payments 0:629184210581#1 -1.68 0.74 £180.00 +invoice-payments 0:9427a01801d2 -3.00 0.42 in-personterminals +invoice-payments 0:882be821cf2e -3.01 0.42 terminalrentalandfirmwareupdates invoice-payments 0:3c4459a5e4ec -3.30 -0.07 £39.00 -invoice-payments 0:5d16afda896e -3.29 0.74 £156.00 -invoice-payments 0:0036ebf2cfb2 -4.61 0.42 prioritysupport -invoice-payments 0:7ef1d2ff5e3a -4.57 0.42 namedengineer,one-hourresponse +invoice-payments 0:5d16afda896e -2.99 0.74 £156.00 +invoice-payments 0:0036ebf2cfb2 -4.31 0.42 prioritysupport +invoice-payments 0:7ef1d2ff5e3a -4.32 0.42 namedengineer,one-hourresponse invoice-payments 0:cf02270203a4 -4.61 -0.21 £100.00 -invoice-payments 0:cf02270203a4#1 -4.60 0.74 £100.00 +invoice-payments 0:cf02270203a4#1 -4.30 0.74 £100.00 invoice-payments 0:3c7ade679fdf -5.28 0.14 paymentdetails invoice-payments 0:182748d2fece -5.04 0.15 bankname invoice-payments 0:758f4a6f175f -5.03 0.15 accountname @@ -3937,32 +3935,32 @@ invoice-payments 0:48617b6d05d4 -5.23 0.10 gb29hrbk40025071295408 invoice-payments 0:6929e6db6e1f -5.27 0.10 hrbkgb2l invoice-payments 0:e4c4788968b2 -4.94 -0.01 subtotal(excl.vat) invoice-payments 0:7ed180496d4e -5.18 -0.01 vatat20% -invoice-payments 0:751cbab81a3a -4.90 0.29 £2,186.00 -invoice-payments 0:9a5256946abd -5.14 0.89 £437.20 +invoice-payments 0:751cbab81a3a -4.80 0.29 £2,186.00 +invoice-payments 0:9a5256946abd -4.79 0.89 £437.20 invoice-payments 0:57a66d21eb1b -4.90 -0.01 totaldue -invoice-payments 0:5eb0b17220fa -5.14 -0.01 dueby14june2025 +invoice-payments 0:5eb0b17220fa -4.89 -0.01 dueby14june2025 invoice-payments 0:30d896eb989f -5.40 -0.83 £2,623.20 -invoice-payments 0:ab5aa97074c4 -4.89 0.14 notes +invoice-payments 0:ab5aa97074c4 -4.84 0.14 notes invoice-payments 0:241bcf576ac5 -4.82 0.14 thankyouforyourbusiness.thisinvo invoice-payments 0:f912ca46bf39 -5.09 0.14 latepaymentmayincurinterestatthe invoice-payments 0:73a09fec2c1a -4.80 0.10 paymentdueby14june2025 invoice-payments 0:79df6c5bbc16 -5.07 0.10 pleaseincludetheinvoicenumberasp -invoice-payments 0:28b3008f693b -4.86 0.01 questions?we'reheretohelp. +invoice-payments 0:28b3008f693b -4.81 0.01 questions?we'reheretohelp. invoice-payments 0:5b88ed40a689 -5.08 0.01 support@meridianpayments.example invoice-payments 0:2e3891f6ba2f -5.07 0.01 39661900 invoice-payments 0:7b14b8d2c5c4 -0.04 -0.11 page1of1 invoice-platform 0:9817f28442bf 0.04 0.12 auroracloud -invoice-platform 0:9817f28442bf#1 -1.16 0.14 auroracloud +invoice-platform 0:9817f28442bf#1 -0.76 0.14 auroracloud invoice-platform 0:52d6e3de4fa0 0.61 -0.26 invoice invoice-platform 0:1cf61cdc6464 0.06 0.13 auroracloudinc. -invoice-platform 0:1cf61cdc6464#1 -0.20 0.40 auroracloudinc. +invoice-platform 0:1cf61cdc6464#1 0.20 0.40 auroracloudinc. invoice-platform 0:1cf61cdc6464#2 -0.78 0.25 auroracloudinc. invoice-platform 0:43315277b007 0.00 0.13 500harbourstreet invoice-platform 0:d9065bfb8f59 0.00 0.13 vancouver,bcv6c2w2 invoice-platform 0:408c7c5887a0 -0.01 0.13 canada invoice-platform 0:88a643f14708 0.18 0.21 aurora.example invoice-platform 0:f2cfc804c0f3 0.18 0.21 billing@aurora.example -invoice-platform 0:f2cfc804c0f3#1 -0.17 0.40 billing@aurora.example +invoice-platform 0:f2cfc804c0f3#1 0.23 0.40 billing@aurora.example invoice-platform 0:799715f2b96e 0.19 0.21 +1604-555-0180 invoice-platform 0:719c55c7e988 -0.39 0.13 vatid:cabn842137755 invoice-platform 0:6282391a4cc1 -0.31 0.10 invoicenumber: @@ -3998,107 +3996,107 @@ invoice-platform 0:c697d2981bf4 0.13 0.11 region invoice-platform 0:0a4e4c29432e 0.13 0.11 usage invoice-platform 0:965711fdf178 0.13 -0.69 unitprice(cad) invoice-platform 0:1742adf77d8c 0.13 -0.56 amount(cad) -invoice-platform 0:b04a12f6483e -0.31 0.07 compute -invoice-platform 0:a2cd33d50126 -0.31 0.11 ca-central1 -invoice-platform 0:a2cd33d50126#1 -0.32 0.11 ca-central1 -invoice-platform 0:a2cd33d50126#2 -0.32 0.11 ca-central1 -invoice-platform 0:ff5f15700bca -0.31 0.11 744.00 -invoice-platform 0:ff5f15700bca#1 -0.32 0.11 744.00 -invoice-platform 0:404314b1f4bd -0.32 0.11 hours -invoice-platform 0:404314b1f4bd#1 -0.32 0.11 hours -invoice-platform 0:456fa3bce642 -0.31 0.29 0.0685 -invoice-platform 0:4249970361b2 -0.31 0.24 50.96 +invoice-platform 0:b04a12f6483e 0.09 0.07 compute +invoice-platform 0:a2cd33d50126 0.09 0.11 ca-central1 +invoice-platform 0:a2cd33d50126#1 0.08 0.11 ca-central1 +invoice-platform 0:a2cd33d50126#2 0.08 0.11 ca-central1 +invoice-platform 0:ff5f15700bca 0.09 0.11 744.00 +invoice-platform 0:ff5f15700bca#1 0.08 0.11 744.00 +invoice-platform 0:404314b1f4bd 0.08 0.11 hours +invoice-platform 0:404314b1f4bd#1 0.08 0.11 hours +invoice-platform 0:456fa3bce642 0.09 0.29 0.0685 +invoice-platform 0:4249970361b2 0.09 0.24 50.96 invoice-platform 0:f13d9c7c6f89 -0.32 0.09 computeinstances -invoice-platform 0:524b18673a85 -0.29 0.09 n2standardvm -invoice-platform 0:49a25f9feefa -0.32 0.07 storage -invoice-platform 0:f58bef646914 -0.31 0.11 480.00 -invoice-platform 0:089bbc1623e2 -0.32 0.28 0.0210 -invoice-platform 0:782fd1b0f47e -0.32 0.27 10.08 +invoice-platform 0:524b18673a85 0.11 0.09 n2standardvm +invoice-platform 0:49a25f9feefa 0.08 0.07 storage +invoice-platform 0:f58bef646914 0.09 0.11 480.00 +invoice-platform 0:089bbc1623e2 0.08 0.28 0.0210 +invoice-platform 0:782fd1b0f47e 0.08 0.27 10.08 invoice-platform 0:721ffa554e56 -0.32 0.09 objectstorage -invoice-platform 0:b3223a301c5f -0.29 0.09 standardclass -invoice-platform 0:3549b0028b75 -0.32 0.07 database -invoice-platform 0:ae96e95d52ac -0.32 0.25 0.1385 -invoice-platform 0:2ff58dbe7993 -0.32 0.31 103.04 +invoice-platform 0:b3223a301c5f 0.11 0.09 standardclass +invoice-platform 0:3549b0028b75 0.08 0.07 database +invoice-platform 0:ae96e95d52ac 0.08 0.25 0.1385 +invoice-platform 0:2ff58dbe7993 0.08 0.31 103.04 invoice-platform 0:8152fd217e12 -0.32 0.09 manageddatabase -invoice-platform 0:3500adb3c8a1 -0.30 0.09 postgresqlinstance -invoice-platform 0:3009be769fb8 -0.32 0.07 network -invoice-platform 0:8001c2743965 -0.32 0.11 global -invoice-platform 0:8001c2743965#1 -0.32 0.11 global -invoice-platform 0:3f6ae649df50 -0.32 0.11 260.00 -invoice-platform 0:7775158f6d3a -0.32 0.27 0.0860 -invoice-platform 0:f7650feb3574 -0.32 0.28 22.36 +invoice-platform 0:3500adb3c8a1 0.10 0.09 postgresqlinstance +invoice-platform 0:3009be769fb8 0.08 0.07 network +invoice-platform 0:8001c2743965 0.08 0.11 global +invoice-platform 0:8001c2743965#1 0.08 0.11 global +invoice-platform 0:3f6ae649df50 0.08 0.11 260.00 +invoice-platform 0:7775158f6d3a 0.08 0.27 0.0860 +invoice-platform 0:f7650feb3574 0.08 0.28 22.36 invoice-platform 0:444858f5bf18 -0.32 0.09 egresstraffic -invoice-platform 0:8b72bb875a83 -0.30 0.09 datatransferout -invoice-platform 0:a18603086e5b -0.32 0.07 support -invoice-platform 0:561b2814d3c0 -0.32 0.24 0.00 -invoice-platform 0:561b2814d3c0#1 -0.32 0.22 0.00 +invoice-platform 0:8b72bb875a83 0.10 0.09 datatransferout +invoice-platform 0:a18603086e5b 0.08 0.07 support +invoice-platform 0:561b2814d3c0 0.08 0.24 0.00 +invoice-platform 0:561b2814d3c0#1 0.08 0.22 0.00 invoice-platform 0:efa8771baad9 -0.33 0.09 supportplan -invoice-platform 0:9e81cd6e653a -0.30 0.09 standardresponse +invoice-platform 0:9e81cd6e653a 0.10 0.09 standardresponse invoice-platform 0:13000a5d442c -0.25 0.35 paymentinformation -invoice-platform 0:944d398aea60 -0.21 0.44 bankname: -invoice-platform 0:d6c3cea2e943 -0.21 0.40 harbourbankofcanada -invoice-platform 0:0ecb5847ffa7 -0.20 0.44 accountname: -invoice-platform 0:6b4894c28363 -0.20 0.44 accountnumber: -invoice-platform 0:559c58c48948 -0.20 0.40 417802336 -invoice-platform 0:555043320c0c -0.19 0.44 swiftcode: -invoice-platform 0:5a986aa9e713 -0.19 0.40 hbcacat1 -invoice-platform 0:e47c9313aced -0.18 0.44 transitnumber: -invoice-platform 0:20b565bff5c3 -0.18 0.40 00812 -invoice-platform 0:f1b1597830d6 -0.18 0.44 institutionnumber: -invoice-platform 0:3c241d267414 -0.18 0.40 049 -invoice-platform 0:4f657c67e41a -0.17 0.44 accounttype: -invoice-platform 0:7522b6a6c098 -0.17 0.40 businesschequing -invoice-platform 0:fa0fbe194b51 -0.17 0.44 remittanceemail: +invoice-platform 0:944d398aea60 0.19 0.44 bankname: +invoice-platform 0:d6c3cea2e943 0.19 0.40 harbourbankofcanada +invoice-platform 0:0ecb5847ffa7 0.20 0.44 accountname: +invoice-platform 0:6b4894c28363 0.20 0.44 accountnumber: +invoice-platform 0:559c58c48948 0.20 0.40 417802336 +invoice-platform 0:555043320c0c 0.21 0.44 swiftcode: +invoice-platform 0:5a986aa9e713 0.21 0.40 hbcacat1 +invoice-platform 0:e47c9313aced 0.22 0.44 transitnumber: +invoice-platform 0:20b565bff5c3 0.22 0.40 00812 +invoice-platform 0:f1b1597830d6 0.22 0.44 institutionnumber: +invoice-platform 0:3c241d267414 0.22 0.40 049 +invoice-platform 0:4f657c67e41a 0.23 0.44 accounttype: +invoice-platform 0:7522b6a6c098 0.23 0.40 businesschequing +invoice-platform 0:fa0fbe194b51 0.23 0.44 remittanceemail: invoice-platform 0:b3ec04f337ed 0.13 0.35 includeyourbillingaccountid -invoice-platform 0:a11a3e122422 -0.28 0.35 onyourpaymentremittance. +invoice-platform 0:a11a3e122422 0.12 0.35 onyourpaymentremittance. invoice-platform 0:d6577e95efba -0.21 0.07 subtotal invoice-platform 0:6fb943a5640a -0.21 0.02 186.44 invoice-platform 0:26a72d1933a2 -0.20 0.07 tax(5%) invoice-platform 0:6c5bbecf6ec0 -0.20 0.04 9.32 invoice-platform 0:57a66d21eb1b -0.38 0.07 totaldue -invoice-platform 0:17e16a2f994d 0.00 0.63 cad195.76 +invoice-platform 0:17e16a2f994d 0.15 0.63 cad195.76 invoice-platform 0:ac10f8c16320 0.17 0.05 duedate invoice-platform 0:d5ef7c1f9830 -0.66 0.11 thankyouforrunningonauroracloud. -invoice-platform 0:6a88f440b84e -1.06 0.11 manageyouraccountataurora.exampl +invoice-platform 0:6a88f440b84e -0.66 0.11 manageyouraccountataurora.exampl invoice-platform 0:cf0a1e1dc87b -1.14 0.45 500harbourstreet,vancouver,bcv6c invoice-platform 0:7b14b8d2c5c4 0.02 0.44 page1of1 -invoice-subscription 0:435df6fdbffd 0.00 0.12 halstead +invoice-subscription 0:435df6fdbffd 0.05 0.12 halstead invoice-subscription 0:52d6e3de4fa0 0.02 -0.40 invoice -invoice-subscription 0:0a36c1665b7e -0.02 0.12 halsteadsoftwareltd. -invoice-subscription 0:6bc2056359b7 -0.05 0.12 18chandlerrow -invoice-subscription 0:776a7e9eb92a -0.03 0.12 leedsls14qt -invoice-subscription 0:2474519f77a9 -0.01 0.12 unitedkingdom -invoice-subscription 0:2474519f77a9#1 0.00 0.12 unitedkingdom -invoice-subscription 0:2474519f77a9#2 0.00 0.07 unitedkingdom -invoice-subscription 0:bfdec553b85a -0.01 0.12 billing@halstead.example -invoice-subscription 0:78acb3cb907b 0.02 0.12 www.halstead.example -invoice-subscription 0:f1c030eb4329 0.04 0.12 vatnogb418227603 -invoice-subscription 0:77ead61b5875 0.29 0.09 invoiceno -invoice-subscription 0:0b0c0ee24de8 0.26 0.69 hs-inv-2026-0417 -invoice-subscription 0:0b0c0ee24de8#1 -0.17 0.88 hs-inv-2026-0417 -invoice-subscription 0:8feaf8016bab 0.29 0.09 issuedate -invoice-subscription 0:4d49cb78b810 0.27 0.62 27august2026 -invoice-subscription 0:ac10f8c16320 0.29 0.09 duedate -invoice-subscription 0:b55571aaabac 0.27 0.71 10september2026 -invoice-subscription 0:fb854bac39c8 0.30 0.09 paymentterms -invoice-subscription 0:56a2e019b8aa 0.27 0.38 14days -invoice-subscription 0:466e5b9cd57f 0.30 0.09 currency -invoice-subscription 0:54f8e1b3fe44 0.27 0.31 gbp -invoice-subscription 0:aeba3a7b3598 0.31 0.12 billto -invoice-subscription 0:7bfc2b791f41 -0.07 0.12 northlineconsultingltd -invoice-subscription 0:7bfc2b791f41#1 -0.07 0.07 northlineconsultingltd -invoice-subscription 0:bcb7024f74fe -0.05 0.12 attn:sarahmitchell -invoice-subscription 0:13dd937d2fe6 -0.03 0.12 21jubileeway -invoice-subscription 0:f9bab6a0b45b -0.02 0.12 londonse13ss -invoice-subscription 0:725a8f5062e7 0.31 0.07 shipto -invoice-subscription 0:254289ce0191 -0.05 0.07 thefoundry,2ndfloor -invoice-subscription 0:84db1f48facb -0.03 0.07 17-19greatsuffolkstreet -invoice-subscription 0:e7a5f0717d99 -0.02 0.07 londonse10ns -invoice-subscription 0:c9046f7a37ad 0.29 0.12 description -invoice-subscription 0:32e8369a9c4f 0.29 0.13 qty -invoice-subscription 0:d1062d072acd 0.29 0.06 unitprice -invoice-subscription 0:7c512b48ba8a 0.29 0.12 vat -invoice-subscription 0:cf38d95c9c6b 0.29 0.05 amount +invoice-subscription 0:0a36c1665b7e 0.03 0.12 halsteadsoftwareltd. +invoice-subscription 0:6bc2056359b7 0.00 0.12 18chandlerrow +invoice-subscription 0:776a7e9eb92a 0.02 0.12 leedsls14qt +invoice-subscription 0:2474519f77a9 0.04 0.12 unitedkingdom +invoice-subscription 0:2474519f77a9#1 0.05 0.12 unitedkingdom +invoice-subscription 0:2474519f77a9#2 0.05 0.07 unitedkingdom +invoice-subscription 0:bfdec553b85a 0.04 0.12 billing@halstead.example +invoice-subscription 0:78acb3cb907b 0.07 0.12 www.halstead.example +invoice-subscription 0:f1c030eb4329 0.09 0.12 vatnogb418227603 +invoice-subscription 0:77ead61b5875 0.04 0.09 invoiceno +invoice-subscription 0:0b0c0ee24de8 0.06 0.69 hs-inv-2026-0417 +invoice-subscription 0:0b0c0ee24de8#1 -0.12 0.88 hs-inv-2026-0417 +invoice-subscription 0:8feaf8016bab 0.04 0.09 issuedate +invoice-subscription 0:4d49cb78b810 0.07 0.62 27august2026 +invoice-subscription 0:ac10f8c16320 0.04 0.09 duedate +invoice-subscription 0:b55571aaabac 0.07 0.71 10september2026 +invoice-subscription 0:fb854bac39c8 0.05 0.09 paymentterms +invoice-subscription 0:56a2e019b8aa 0.07 0.38 14days +invoice-subscription 0:466e5b9cd57f 0.05 0.09 currency +invoice-subscription 0:54f8e1b3fe44 0.07 0.31 gbp +invoice-subscription 0:aeba3a7b3598 0.06 0.12 billto +invoice-subscription 0:7bfc2b791f41 -0.01 0.12 northlineconsultingltd +invoice-subscription 0:7bfc2b791f41#1 -0.01 0.07 northlineconsultingltd +invoice-subscription 0:bcb7024f74fe 0.00 0.12 attn:sarahmitchell +invoice-subscription 0:13dd937d2fe6 0.02 0.12 21jubileeway +invoice-subscription 0:f9bab6a0b45b 0.03 0.12 londonse13ss +invoice-subscription 0:725a8f5062e7 0.06 0.07 shipto +invoice-subscription 0:254289ce0191 0.00 0.07 thefoundry,2ndfloor +invoice-subscription 0:84db1f48facb 0.02 0.07 17-19greatsuffolkstreet +invoice-subscription 0:e7a5f0717d99 0.03 0.07 londonse10ns +invoice-subscription 0:c9046f7a37ad 0.04 0.12 description +invoice-subscription 0:32e8369a9c4f 0.04 0.13 qty +invoice-subscription 0:d1062d072acd 0.04 0.06 unitprice +invoice-subscription 0:7c512b48ba8a 0.04 0.12 vat +invoice-subscription 0:cf38d95c9c6b 0.04 0.05 amount invoice-subscription 0:86705447c73d 0.03 0.12 halsteadworkspacepremium(10seats invoice-subscription 0:0c8dc980db3f 0.03 0.18 £18.00 invoice-subscription 0:dc934fe30a94 0.03 0.09 20% @@ -4119,57 +4117,57 @@ invoice-subscription 0:1077d7cede59#1 -0.06 0.13 £275.00 invoice-subscription 0:361537ef6a11 -0.09 0.12 voiceadd-on(5seats) invoice-subscription 0:8bf9ac7b27bd -0.09 0.14 £6.00 invoice-subscription 0:893d7480f763 -0.09 0.14 £30.00 -invoice-subscription 0:ab5aa97074c4 0.30 0.12 notes -invoice-subscription 0:4440ed73b83f -0.17 0.12 thisinvoicecoverssoftwaresubscri -invoice-subscription 0:fffc319556fa -0.16 0.12 hostedservicesforthecurrentbilli +invoice-subscription 0:ab5aa97074c4 0.05 0.12 notes +invoice-subscription 0:4440ed73b83f -0.02 0.12 thisinvoicecoverssoftwaresubscri +invoice-subscription 0:fffc319556fa -0.01 0.12 hostedservicesforthecurrentbilli invoice-subscription 0:d6577e95efba -0.11 0.11 subtotal invoice-subscription 0:adde9b2bd3ad -0.11 0.47 £947.00 invoice-subscription 0:a52611c9261b -0.13 0.11 vat(20%) invoice-subscription 0:14edcfc20351 -0.13 0.44 £189.40 -invoice-subscription 0:57a66d21eb1b -0.18 0.11 totaldue -invoice-subscription 0:cf1b68cc49ef -0.11 0.89 £1,136.40 -invoice-subscription 0:3c7ade679fdf 0.24 0.12 paymentdetails +invoice-subscription 0:57a66d21eb1b -0.13 0.11 totaldue +invoice-subscription 0:cf1b68cc49ef -0.06 0.89 £1,136.40 +invoice-subscription 0:3c7ade679fdf -0.01 0.12 paymentdetails invoice-subscription 0:56ed021beb35 -0.13 0.49 beneficiary -invoice-subscription 0:0b85f3c8ed04 -0.17 0.33 halsteadsoftwareltd +invoice-subscription 0:0b85f3c8ed04 -0.12 0.33 halsteadsoftwareltd invoice-subscription 0:4381dc2ab142 -0.13 0.72 bank -invoice-subscription 0:6d50b2dd724f -0.17 0.84 northgatebank +invoice-subscription 0:6d50b2dd724f -0.12 0.84 northgatebank invoice-subscription 0:10aeacde20ff -0.13 0.83 sortcode -invoice-subscription 0:b19b1415ef9b -0.17 0.94 40-05-30 +invoice-subscription 0:b19b1415ef9b -0.12 0.94 40-05-30 invoice-subscription 0:f92a9c925024 -0.13 0.94 accountnumber -invoice-subscription 0:ef797c8118f0 -0.17 0.97 12345678 +invoice-subscription 0:ef797c8118f0 -0.12 0.97 12345678 invoice-subscription 0:52367a6622b1 -0.13 0.86 reference invoice-subscription 0:04f7247e8e99 -0.13 0.12 pleaseincludetheinvoicenumberast -invoice-subscription 0:7c6ab37d83ef 0.11 23.79 thankyouforyourbusiness. +invoice-subscription 0:7c6ab37d83ef -0.09 23.79 thankyouforyourbusiness. invoice-subscription 0:354ffeb2bbc3 -0.18 23.79 paymentisdueby10september2026.if invoice-subscription 0:7f7d98088133 -0.17 23.79 foranyqueries,pleasecontactbilli invoice-subscription 0:7b14b8d2c5c4 0.00 0.09 page1of1 invoice-workspace 0:07f15cde5b18 0.15 0.11 kestrel invoice-workspace 0:07f15cde5b18#1 -0.19 0.11 kestrel invoice-workspace 0:52d6e3de4fa0 -0.16 0.60 invoice -invoice-workspace 0:091019880d88 -0.07 0.13 kestrelcollaboration,inc. +invoice-workspace 0:091019880d88 -0.02 0.13 kestrelcollaboration,inc. invoice-workspace 0:091019880d88#1 -0.13 0.06 kestrelcollaboration,inc. invoice-workspace 0:091019880d88#2 -0.34 0.06 kestrelcollaboration,inc. invoice-workspace 0:9167e0470dae -0.06 0.13 500howardstreet,6thfloor invoice-workspace 0:efa5e1529794 -0.03 0.13 sanfrancisco,ca94105 invoice-workspace 0:fd7321c405f8 -0.24 0.13 unitedstates invoice-workspace 0:d3c6f273c22d -0.24 0.13 vatid:us77-0560185 -invoice-workspace 0:6282391a4cc1 -0.31 0.04 invoicenumber: +invoice-workspace 0:6282391a4cc1 -0.01 0.04 invoicenumber: invoice-workspace 0:b13757c9a6fc -0.30 -0.03 inv-2024-0003521 invoice-workspace 0:b13757c9a6fc#1 -0.32 0.06 inv-2024-0003521 -invoice-workspace 0:8d05f5d55191 -0.29 0.04 invoicedate: +invoice-workspace 0:8d05f5d55191 0.01 0.04 invoicedate: invoice-workspace 0:8da43dd45024 -0.27 -0.03 27may2024 -invoice-workspace 0:d39366fa1423 -0.26 0.04 billingperiod: +invoice-workspace 0:d39366fa1423 0.04 0.04 billingperiod: invoice-workspace 0:ec09225090a8 -0.25 -0.03 1-31may2024 -invoice-workspace 0:23513511df83 -0.24 0.04 workspaceid: +invoice-workspace 0:23513511df83 0.06 0.04 workspaceid: invoice-workspace 0:1179fb658a97 -0.23 -0.03 t04fq9l2m -invoice-workspace 0:18e2cca1098e -0.21 0.04 paymentterms: +invoice-workspace 0:18e2cca1098e 0.09 0.04 paymentterms: invoice-workspace 0:98ec3d1fd5b9 -0.20 -0.03 net30 -invoice-workspace 0:0e0fb0fc0939 -0.19 0.04 duedate: +invoice-workspace 0:0e0fb0fc0939 0.11 0.04 duedate: invoice-workspace 0:f1e2a60122bd -0.18 -0.03 26june2024 -invoice-workspace 0:f1e2a60122bd#1 -0.18 0.10 26june2024 +invoice-workspace 0:f1e2a60122bd#1 0.22 0.10 26june2024 invoice-workspace 0:aeba3a7b3598 -0.23 0.10 billto -invoice-workspace 0:45fe04dbae24 0.03 0.10 brightfutureltd. -invoice-workspace 0:45fe04dbae24#1 0.03 0.02 brightfutureltd. +invoice-workspace 0:45fe04dbae24 0.08 0.10 brightfutureltd. +invoice-workspace 0:45fe04dbae24#1 0.08 0.02 brightfutureltd. invoice-workspace 0:65405af34bf9 0.03 0.10 45kingstreet invoice-workspace 0:494f1a937311 0.04 0.10 manchesterm27az invoice-workspace 0:2474519f77a9 -0.21 0.10 unitedkingdom @@ -4185,27 +4183,27 @@ invoice-workspace 0:e2a9c81da5f6 -0.14 0.22 unitprice(usd) invoice-workspace 0:5dfb966b2bcf -0.14 0.36 amount(usd) invoice-workspace 0:2bcc555090a1 -0.24 0.40 kestrelbusiness+ invoice-workspace 0:68fad867a983 -0.19 0.40 workspacesubscription -invoice-workspace 0:e0b844887562 -0.18 0.53 business+annual -invoice-workspace 0:84906b0f4b73 -0.18 0.46 50users -invoice-workspace 0:5ee31a6284bc -0.18 0.44 8.75 -invoice-workspace 0:843d501d422c -0.18 0.47 437.50 +invoice-workspace 0:e0b844887562 0.07 0.53 business+annual +invoice-workspace 0:84906b0f4b73 0.07 0.46 50users +invoice-workspace 0:5ee31a6284bc 0.07 0.44 8.75 +invoice-workspace 0:843d501d422c 0.07 0.47 437.50 invoice-workspace 0:3007667b4e18 -0.21 0.40 enterprisekeymanagement invoice-workspace 0:162e9c93c528 -0.16 0.40 customer-managedencryptionkeys -invoice-workspace 0:a33a54a73112 -0.15 0.46 add-on -invoice-workspace 0:d66c66a96157 -0.15 0.47 100.00 -invoice-workspace 0:d66c66a96157#1 -0.15 0.47 100.00 +invoice-workspace 0:a33a54a73112 0.10 0.46 add-on +invoice-workspace 0:d66c66a96157 0.10 0.47 100.00 +invoice-workspace 0:d66c66a96157#1 0.10 0.47 100.00 invoice-workspace 0:0036ebf2cfb2 -0.18 0.40 prioritysupport invoice-workspace 0:51833276172f -0.13 0.40 namedengineerandresponsetarget -invoice-workspace 0:fe6d3468cf5c -0.12 0.50 standard -invoice-workspace 0:a99210875f11 -0.12 0.46 50.00 -invoice-workspace 0:a99210875f11#1 -0.12 0.45 50.00 +invoice-workspace 0:fe6d3468cf5c 0.13 0.50 standard +invoice-workspace 0:a99210875f11 0.13 0.46 50.00 +invoice-workspace 0:a99210875f11#1 0.13 0.45 50.00 invoice-workspace 0:14209e8ccd53 -0.15 0.40 workflowautomation invoice-workspace 0:31be3ff05457 -0.10 0.40 templatesandscheduledruns -invoice-workspace 0:7f0f70e643bc -0.09 0.49 included -invoice-workspace 0:561b2814d3c0 -0.09 0.44 0.00 -invoice-workspace 0:561b2814d3c0#1 -0.09 0.48 0.00 -invoice-workspace 0:561b2814d3c0#2 0.01 0.29 0.00 -invoice-workspace 0:3c7ade679fdf -0.08 0.08 paymentdetails +invoice-workspace 0:7f0f70e643bc 0.16 0.49 included +invoice-workspace 0:561b2814d3c0 0.16 0.44 0.00 +invoice-workspace 0:561b2814d3c0#1 0.16 0.48 0.00 +invoice-workspace 0:561b2814d3c0#2 0.31 0.29 0.00 +invoice-workspace 0:3c7ade679fdf 0.17 0.08 paymentdetails invoice-workspace 0:944d398aea60 -0.09 0.12 bankname: invoice-workspace 0:a18e9fdf120e -0.09 0.06 bayunionbank,n.a. invoice-workspace 0:0ecb5847ffa7 -0.13 0.12 accountname: @@ -4220,62 +4218,62 @@ invoice-workspace 0:d60fbd8718ec -0.28 0.06 usd invoice-workspace 0:c608665436db -0.32 0.12 reference: invoice-workspace 0:3db3fa89ea2c -0.36 0.12 bankaddress: invoice-workspace 0:b1645851e755 -0.36 0.06 1marketplaza,sanfrancisco -invoice-workspace 0:9b600d1211c8 -0.32 0.14 pleaseincludetheinvoicenumberiny -invoice-workspace 0:415eb9e42f41 -0.33 0.14 reference. -invoice-workspace 0:d6577e95efba 0.01 0.13 subtotal -invoice-workspace 0:460dd5bae888 0.01 0.40 587.50 -invoice-workspace 0:2ee4d3de4ddf 0.01 0.13 tax(0%) -invoice-workspace 0:57a66d21eb1b -0.01 0.13 totaldue -invoice-workspace 0:ad00e93ce79a -0.09 0.62 usd587.50 +invoice-workspace 0:9b600d1211c8 -0.22 0.14 pleaseincludetheinvoicenumberiny +invoice-workspace 0:415eb9e42f41 -0.23 0.14 reference. +invoice-workspace 0:d6577e95efba 0.31 0.13 subtotal +invoice-workspace 0:460dd5bae888 0.31 0.40 587.50 +invoice-workspace 0:2ee4d3de4ddf 0.31 0.13 tax(0%) +invoice-workspace 0:57a66d21eb1b 0.34 0.13 totaldue +invoice-workspace 0:ad00e93ce79a 0.31 0.62 usd587.50 invoice-workspace 0:b0553f008513 0.18 0.10 paymentdueby -invoice-workspace 0:08775a92bfca -0.31 0.12 thankyouforusingkestrel. -invoice-workspace 0:18e82fbd48a3 -0.49 0.12 questionsaboutthisinvoice?reachu +invoice-workspace 0:08775a92bfca -0.26 0.12 thankyouforusingkestrel. +invoice-workspace 0:18e82fbd48a3 -0.29 0.12 questionsaboutthisinvoice?reachu invoice-workspace 0:3c72ba0e1eb8 -0.62 0.06 500howardstreet,6thfloor,sanfran invoice-workspace 0:9e2917e23527 -0.63 -0.12 kestrel.example invoice-workspace 0:7b14b8d2c5c4 -0.05 -0.13 page1of1 letter-blue_banner 0:8f1010120ed6 0.02 1.90 jordanrivera -letter-blue_banner 0:8f1010120ed6#1 -0.02 0.10 jordanrivera +letter-blue_banner 0:8f1010120ed6#1 0.23 0.10 jordanrivera letter-blue_banner 0:8d7a2cca3060 0.00 0.14 +442055551000|jordan.rivera@exam -letter-blue_banner 0:bef81b541365 -0.01 0.10 dearhiringteamatnorthwindsystems -letter-blue_banner 0:3e40124f0365 -0.02 0.10 iamexcitedtosharemyinterestinthe -letter-blue_banner 0:4b617288d627 -0.01 0.10 systemsthatbalancepublicapidesig -letter-blue_banner 0:b110d3af5609 0.02 0.10 ienjoytranslatingfuzzyworkflowre -letter-blue_banner 0:eae27893a255 0.03 0.10 therestoftheteam. -letter-blue_banner 0:a71e98216baa 0.12 0.10 iwouldwelcometheopportunitytobri -letter-blue_banner 0:80a6a628ad52 0.15 0.10 sincerely, -letter-boxed_sections 0:8f1010120ed6 0.46 2.20 jordanrivera -letter-boxed_sections 0:8f1010120ed6#1 0.13 0.10 jordanrivera +letter-blue_banner 0:bef81b541365 0.04 0.10 dearhiringteamatnorthwindsystems +letter-blue_banner 0:3e40124f0365 0.08 0.10 iamexcitedtosharemyinterestinthe +letter-blue_banner 0:4b617288d627 0.09 0.10 systemsthatbalancepublicapidesig +letter-blue_banner 0:b110d3af5609 0.12 0.10 ienjoytranslatingfuzzyworkflowre +letter-blue_banner 0:eae27893a255 0.13 0.10 therestoftheteam. +letter-blue_banner 0:a71e98216baa 0.17 0.10 iwouldwelcometheopportunitytobri +letter-blue_banner 0:80a6a628ad52 0.20 0.10 sincerely, +letter-boxed_sections 0:8f1010120ed6 0.01 2.20 jordanrivera +letter-boxed_sections 0:8f1010120ed6#1 0.23 0.10 jordanrivera letter-boxed_sections 0:8d7a2cca3060 0.08 0.12 +442055551000|jordan.rivera@exam -letter-boxed_sections 0:bef81b541365 0.09 0.10 dearhiringteamatnorthwindsystems -letter-boxed_sections 0:ab54410ead82 -0.01 0.10 iamexcitedtosharemyinterestinthe -letter-boxed_sections 0:9185168d2cf8 0.00 0.10 document-generationsystemsthatba -letter-boxed_sections 0:5fb2802723b6 0.00 0.10 ienjoytranslatingfuzzyworkflowre -letter-boxed_sections 0:dab2d688b7ab 0.01 0.10 adoptioneasierfortherestofthetea -letter-boxed_sections 0:a71e98216baa 0.11 0.10 iwouldwelcometheopportunitytobri -letter-boxed_sections 0:80a6a628ad52 0.12 0.10 sincerely, +letter-boxed_sections 0:bef81b541365 0.19 0.10 dearhiringteamatnorthwindsystems +letter-boxed_sections 0:ab54410ead82 0.19 0.10 iamexcitedtosharemyinterestinthe +letter-boxed_sections 0:9185168d2cf8 0.20 0.10 document-generationsystemsthatba +letter-boxed_sections 0:5fb2802723b6 0.20 0.10 ienjoytranslatingfuzzyworkflowre +letter-boxed_sections 0:dab2d688b7ab 0.21 0.10 adoptioneasierfortherestofthetea +letter-boxed_sections 0:a71e98216baa 0.21 0.10 iwouldwelcometheopportunitytobri +letter-boxed_sections 0:80a6a628ad52 0.22 0.10 sincerely, letter-centered_headline 0:8f1010120ed6 -0.05 2.39 jordanrivera -letter-centered_headline 0:8f1010120ed6#1 -0.06 0.10 jordanrivera +letter-centered_headline 0:8f1010120ed6#1 0.24 0.10 jordanrivera letter-centered_headline 0:2d58f0cadc2d -0.03 1.40 platformengineer letter-centered_headline 0:8d7a2cca3060 0.02 0.28 +442055551000|jordan.rivera@exam -letter-centered_headline 0:bef81b541365 0.00 0.10 dearhiringteamatnorthwindsystems +letter-centered_headline 0:bef81b541365 0.05 0.10 dearhiringteamatnorthwindsystems letter-centered_headline 0:ab54410ead82 0.09 0.10 iamexcitedtosharemyinterestinthe letter-centered_headline 0:9185168d2cf8 0.10 0.10 document-generationsystemsthatba letter-centered_headline 0:5fb2802723b6 0.13 0.10 ienjoytranslatingfuzzyworkflowre letter-centered_headline 0:dab2d688b7ab 0.14 0.10 adoptioneasierfortherestofthetea -letter-centered_headline 0:a71e98216baa 0.13 0.10 iwouldwelcometheopportunitytobri -letter-centered_headline 0:80a6a628ad52 0.16 0.10 sincerely, -letter-classic_serif 0:8f1010120ed6 -0.15 2.60 jordanrivera +letter-centered_headline 0:a71e98216baa 0.18 0.10 iwouldwelcometheopportunitytobri +letter-centered_headline 0:80a6a628ad52 0.21 0.10 sincerely, +letter-classic_serif 0:8f1010120ed6 0.00 2.60 jordanrivera letter-classic_serif 0:8f1010120ed6#1 -0.03 0.10 jordanrivera -letter-classic_serif 0:8d7a2cca3060 -0.01 -0.52 +442055551000|jordan.rivera@exam +letter-classic_serif 0:8d7a2cca3060 0.14 -0.52 +442055551000|jordan.rivera@exam letter-classic_serif 0:bef81b541365 0.05 0.10 dearhiringteamatnorthwindsystems -letter-classic_serif 0:ab54410ead82 0.02 0.10 iamexcitedtosharemyinterestinthe -letter-classic_serif 0:9185168d2cf8 0.00 0.10 document-generationsystemsthatba -letter-classic_serif 0:a463bced3db2 -0.03 0.10 ienjoytranslatingfuzzyworkflowre -letter-classic_serif 0:dd474e249222 -0.05 0.10 makeadoptioneasierfortherestofth +letter-classic_serif 0:ab54410ead82 -0.03 0.10 iamexcitedtosharemyinterestinthe +letter-classic_serif 0:9185168d2cf8 -0.05 0.10 document-generationsystemsthatba +letter-classic_serif 0:a463bced3db2 -0.08 0.10 ienjoytranslatingfuzzyworkflowre +letter-classic_serif 0:dd474e249222 -0.10 0.10 makeadoptioneasierfortherestofth letter-classic_serif 0:a71e98216baa -0.08 0.10 iwouldwelcometheopportunitytobri letter-classic_serif 0:80a6a628ad52 0.00 0.10 sincerely, -letter-compact_mono 0:8f1010120ed6 -0.04 16.10 jordanrivera -letter-compact_mono 0:8f1010120ed6#1 -0.18 0.10 jordanrivera +letter-compact_mono 0:8f1010120ed6 0.01 16.10 jordanrivera +letter-compact_mono 0:8f1010120ed6#1 0.07 0.10 jordanrivera letter-compact_mono 0:f9e4560bd641 0.01 16.10 london,uk/+442055551000/jordan.r letter-compact_mono 0:bef81b541365 0.02 0.10 dearhiringteamatnorthwindsystems letter-compact_mono 0:1382a6e37675 0.00 0.10 ienjoytranslatingfuzzyworkflowre @@ -4294,14 +4292,14 @@ letter-editorial_blue 0:0c42fe9f3491 -0.15 0.10 ienjoytranslatingfuzzyworkflowre letter-editorial_blue 0:dda41d31bb3c -0.15 0.10 thatmakeadoptioneasierfortherest letter-editorial_blue 0:a71e98216baa -0.04 0.10 iwouldwelcometheopportunitytobri letter-editorial_blue 0:80a6a628ad52 -0.04 0.10 sincerely, -letter-engineering_resume 0:8f1010120ed6 0.15 15.10 jordanrivera +letter-engineering_resume 0:8f1010120ed6 0.00 15.10 jordanrivera letter-engineering_resume 0:8f1010120ed6#1 -0.21 0.10 jordanrivera -letter-engineering_resume 0:2d58f0cadc2d -0.25 15.10 platformengineer -letter-engineering_resume 0:fbeea547d99e -0.01 15.31 london,uk -letter-engineering_resume 0:89674e6f130e 0.00 15.34 +442055551000 -letter-engineering_resume 0:e0f850305ded 0.01 15.20 jordan.rivera@example.com -letter-engineering_resume 0:84308bea4540 0.02 15.95 linkedin -letter-engineering_resume 0:c0b0109d9439 -0.17 15.85 github +letter-engineering_resume 0:2d58f0cadc2d 0.00 15.10 platformengineer +letter-engineering_resume 0:fbeea547d99e 0.04 15.31 london,uk +letter-engineering_resume 0:89674e6f130e 0.05 15.34 +442055551000 +letter-engineering_resume 0:e0f850305ded 0.06 15.20 jordan.rivera@example.com +letter-engineering_resume 0:84308bea4540 0.07 15.95 linkedin +letter-engineering_resume 0:c0b0109d9439 0.08 15.85 github letter-engineering_resume 0:bef81b541365 -0.01 0.10 dearhiringteamatnorthwindsystems letter-engineering_resume 0:c5331fbe74e1 -0.07 0.10 iamexcitedtosharemyinterestinthe letter-engineering_resume 0:f27264b519fd -0.05 0.10 balancepublicapidesign,renderqua @@ -4310,17 +4308,17 @@ letter-engineering_resume 0:30edab94d52e -0.04 0.10 oftheteam. letter-engineering_resume 0:a71e98216baa 0.00 0.10 iwouldwelcometheopportunitytobri letter-engineering_resume 0:80a6a628ad52 -0.01 0.10 sincerely, letter-executive 0:8f1010120ed6 -0.50 0.10 jordanrivera -letter-executive 0:8f1010120ed6#1 -0.20 0.10 jordanrivera -letter-executive 0:89ff05847e96 -0.03 0.10 london,uk|+442055551000 -letter-executive 0:8817bf9310b6 -0.05 0.10 jordan.rivera@example.com|linked -letter-executive 0:bef81b541365 -0.05 0.10 dearhiringteamatnorthwindsystems +letter-executive 0:8f1010120ed6#1 0.10 0.10 jordanrivera +letter-executive 0:89ff05847e96 0.02 0.10 london,uk|+442055551000 +letter-executive 0:8817bf9310b6 0.00 0.10 jordan.rivera@example.com|linked +letter-executive 0:bef81b541365 0.00 0.10 dearhiringteamatnorthwindsystems letter-executive 0:ab54410ead82 0.03 0.10 iamexcitedtosharemyinterestinthe letter-executive 0:9185168d2cf8 0.03 0.10 document-generationsystemsthatba letter-executive 0:0c42fe9f3491 0.05 0.10 ienjoytranslatingfuzzyworkflowre letter-executive 0:dda41d31bb3c 0.05 0.10 thatmakeadoptioneasierfortherest letter-executive 0:7c5a9817c868 0.08 0.10 iwouldwelcometheopportunitytobri letter-executive 0:4012eb4b05db 0.08 0.10 group. -letter-executive 0:80a6a628ad52 0.05 0.10 sincerely, +letter-executive 0:80a6a628ad52 0.10 0.10 sincerely, letter-mint-editorial-letter 0:8f1010120ed6 -1.30 2.33 jordanrivera letter-mint-editorial-letter 0:8f1010120ed6#1 -0.01 0.10 jordanrivera letter-mint-editorial-letter 0:2d58f0cadc2d -0.02 0.12 platformengineer @@ -4347,27 +4345,27 @@ letter-monogram_sidebar 0:136c67657614 0.02 2.82 jordan letter-monogram_sidebar 0:8ba35ebe3d5c 0.03 2.85 rivera letter-monogram_sidebar 0:2d58f0cadc2d 0.01 0.13 platformengineer letter-monogram_sidebar 0:8d7a2cca3060 0.03 0.24 +442055551000|jordan.rivera@exam -letter-monogram_sidebar 0:bef81b541365 0.02 0.10 dearhiringteamatnorthwindsystems -letter-monogram_sidebar 0:ab54410ead82 0.12 0.10 iamexcitedtosharemyinterestinthe -letter-monogram_sidebar 0:9185168d2cf8 0.12 0.10 document-generationsystemsthatba -letter-monogram_sidebar 0:a463bced3db2 0.12 0.10 ienjoytranslatingfuzzyworkflowre -letter-monogram_sidebar 0:dd474e249222 0.12 0.10 makeadoptioneasierfortherestofth -letter-monogram_sidebar 0:a71e98216baa 0.02 0.10 iwouldwelcometheopportunitytobri -letter-monogram_sidebar 0:80a6a628ad52 0.02 0.10 sincerely, -letter-monogram_sidebar 0:8f1010120ed6 -0.23 0.10 jordanrivera -letter-nordic_clean 0:8f1010120ed6 0.15 0.10 jordanrivera +letter-monogram_sidebar 0:bef81b541365 0.07 0.10 dearhiringteamatnorthwindsystems +letter-monogram_sidebar 0:ab54410ead82 0.07 0.10 iamexcitedtosharemyinterestinthe +letter-monogram_sidebar 0:9185168d2cf8 0.07 0.10 document-generationsystemsthatba +letter-monogram_sidebar 0:a463bced3db2 0.07 0.10 ienjoytranslatingfuzzyworkflowre +letter-monogram_sidebar 0:dd474e249222 0.07 0.10 makeadoptioneasierfortherestofth +letter-monogram_sidebar 0:a71e98216baa 0.07 0.10 iwouldwelcometheopportunitytobri +letter-monogram_sidebar 0:80a6a628ad52 0.07 0.10 sincerely, +letter-monogram_sidebar 0:8f1010120ed6 0.07 0.10 jordanrivera +letter-nordic_clean 0:8f1010120ed6 0.00 0.10 jordanrivera letter-nordic_clean 0:8f1010120ed6#1 -0.21 0.10 jordanrivera -letter-nordic_clean 0:2d58f0cadc2d 0.00 0.10 platformengineer +letter-nordic_clean 0:2d58f0cadc2d 0.05 0.10 platformengineer letter-nordic_clean 0:fbeea547d99e 0.00 -0.35 london,uk letter-nordic_clean 0:89674e6f130e 0.02 -0.65 +442055551000 letter-nordic_clean 0:e0f850305ded 0.04 0.13 jordan.rivera@example.com letter-nordic_clean 0:84308bea4540 0.06 -0.21 linkedin letter-nordic_clean 0:c0b0109d9439 -0.12 -0.16 github letter-nordic_clean 0:bef81b541365 -0.01 0.10 dearhiringteamatnorthwindsystems -letter-nordic_clean 0:8d84d32bef54 -0.06 0.10 iamexcitedtosharemyinterestinthe -letter-nordic_clean 0:be14171d4555 -0.07 0.10 thatbalancepublicapidesign,rende -letter-nordic_clean 0:26e89af4523d -0.08 0.10 ienjoytranslatingfuzzyworkflowre -letter-nordic_clean 0:27c5581ffbbc -0.09 0.10 restoftheteam. +letter-nordic_clean 0:8d84d32bef54 -0.01 0.10 iamexcitedtosharemyinterestinthe +letter-nordic_clean 0:be14171d4555 -0.02 0.10 thatbalancepublicapidesign,rende +letter-nordic_clean 0:26e89af4523d -0.03 0.10 ienjoytranslatingfuzzyworkflowre +letter-nordic_clean 0:27c5581ffbbc -0.04 0.10 restoftheteam. letter-nordic_clean 0:a71e98216baa -0.04 0.10 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.04 0.10 sincerely, letter-panel 0:8f1010120ed6 0.00 8.57 jordanrivera @@ -4376,40 +4374,40 @@ letter-panel 0:2d58f0cadc2d 0.02 8.27 platformengineer letter-panel 0:89ff05847e96 0.04 8.54 london,uk|+442055551000 letter-panel 0:8817bf9310b6 -0.14 8.55 jordan.rivera@example.com|linked letter-panel 0:bef81b541365 0.01 0.10 dearhiringteamatnorthwindsystems -letter-panel 0:ab54410ead82 0.03 0.10 iamexcitedtosharemyinterestinthe -letter-panel 0:9185168d2cf8 0.05 0.10 document-generationsystemsthatba -letter-panel 0:0c42fe9f3491 0.07 0.10 ienjoytranslatingfuzzyworkflowre -letter-panel 0:dda41d31bb3c 0.09 0.10 thatmakeadoptioneasierfortherest -letter-panel 0:7c5a9817c868 0.01 0.10 iwouldwelcometheopportunitytobri -letter-panel 0:4012eb4b05db 0.03 0.10 group. +letter-panel 0:ab54410ead82 0.08 0.10 iamexcitedtosharemyinterestinthe +letter-panel 0:9185168d2cf8 0.10 0.10 document-generationsystemsthatba +letter-panel 0:0c42fe9f3491 0.12 0.10 ienjoytranslatingfuzzyworkflowre +letter-panel 0:dda41d31bb3c 0.14 0.10 thatmakeadoptioneasierfortherest +letter-panel 0:7c5a9817c868 0.06 0.10 iwouldwelcometheopportunitytobri +letter-panel 0:4012eb4b05db 0.08 0.10 group. letter-panel 0:80a6a628ad52 0.05 0.10 sincerely, -letter-sidebar_portrait 0:8f1010120ed6 -0.03 0.14 jordanrivera +letter-sidebar_portrait 0:8f1010120ed6 0.02 0.14 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.23 0.10 jordanrivera letter-sidebar_portrait 0:2d58f0cadc2d -0.03 0.49 platformengineer letter-sidebar_portrait 0:8d7a2cca3060 0.03 0.48 +442055551000|jordan.rivera@exam letter-sidebar_portrait 0:bef81b541365 -0.03 0.10 dearhiringteamatnorthwindsystems -letter-sidebar_portrait 0:ab54410ead82 -0.01 0.10 iamexcitedtosharemyinterestinthe -letter-sidebar_portrait 0:9185168d2cf8 0.01 0.10 document-generationsystemsthatba -letter-sidebar_portrait 0:0c42fe9f3491 0.03 0.10 ienjoytranslatingfuzzyworkflowre -letter-sidebar_portrait 0:dda41d31bb3c 0.05 0.10 thatmakeadoptioneasierfortherest -letter-sidebar_portrait 0:7c5a9817c868 -0.03 0.10 iwouldwelcometheopportunitytobri -letter-sidebar_portrait 0:4012eb4b05db -0.01 0.10 group. +letter-sidebar_portrait 0:ab54410ead82 0.04 0.10 iamexcitedtosharemyinterestinthe +letter-sidebar_portrait 0:9185168d2cf8 0.06 0.10 document-generationsystemsthatba +letter-sidebar_portrait 0:0c42fe9f3491 0.08 0.10 ienjoytranslatingfuzzyworkflowre +letter-sidebar_portrait 0:dda41d31bb3c 0.10 0.10 thatmakeadoptioneasierfortherest +letter-sidebar_portrait 0:7c5a9817c868 0.02 0.10 iwouldwelcometheopportunitytobri +letter-sidebar_portrait 0:4012eb4b05db 0.04 0.10 group. letter-sidebar_portrait 0:80a6a628ad52 0.01 0.10 sincerely, -letter-timeline_minimal 0:8f1010120ed6 0.15 0.10 jordanrivera -letter-timeline_minimal 0:8f1010120ed6#1 -0.33 0.10 jordanrivera -letter-timeline_minimal 0:2d58f0cadc2d -0.40 0.10 platformengineer +letter-timeline_minimal 0:8f1010120ed6 0.00 0.10 jordanrivera +letter-timeline_minimal 0:8f1010120ed6#1 -0.03 0.10 jordanrivera +letter-timeline_minimal 0:2d58f0cadc2d 0.00 0.10 platformengineer letter-timeline_minimal 0:fbeea547d99e -0.19 -1.36 london,uk letter-timeline_minimal 0:89674e6f130e -0.19 -1.99 +442055551000 letter-timeline_minimal 0:e0f850305ded -0.19 -2.77 jordan.rivera@example.com letter-timeline_minimal 0:84308bea4540 -0.19 -1.06 linkedin letter-timeline_minimal 0:c0b0109d9439 -0.19 -1.00 github -letter-timeline_minimal 0:bef81b541365 -0.08 0.10 dearhiringteamatnorthwindsystems +letter-timeline_minimal 0:bef81b541365 -0.03 0.10 dearhiringteamatnorthwindsystems letter-timeline_minimal 0:ab54410ead82 -0.03 0.10 iamexcitedtosharemyinterestinthe letter-timeline_minimal 0:9185168d2cf8 -0.03 0.10 document-generationsystemsthatba letter-timeline_minimal 0:a463bced3db2 -0.03 0.10 ienjoytranslatingfuzzyworkflowre letter-timeline_minimal 0:dd474e249222 -0.03 0.10 makeadoptioneasierfortherestofth -letter-timeline_minimal 0:a71e98216baa -0.08 0.10 iwouldwelcometheopportunitytobri -letter-timeline_minimal 0:80a6a628ad52 -0.08 0.10 sincerely, +letter-timeline_minimal 0:a71e98216baa -0.03 0.10 iwouldwelcometheopportunitytobri +letter-timeline_minimal 0:80a6a628ad52 -0.03 0.10 sincerely, proposal-editorial 0:5205c2a261bc 0.81 0.10 northline proposal-editorial 0:da0daaba4b15 0.33 0.10 studio proposal-editorial 0:ecd1378bc9dc -0.06 0.56 proposal @@ -4418,53 +4416,53 @@ proposal-editorial 0:03a41208320e 1.13 0.10 brandrefresh& proposal-editorial 0:c20712117515 -1.22 0.10 websiteredesign proposal-editorial 0:1bae6dc6c199 -0.01 0.10 preparedforasterahealthco.|prepa proposal-editorial 0:566835ed7fba -1.21 0.10 executivesummary -proposal-editorial 0:a27307c3fd63 0.27 0.10 thankyoufortheopportunitytopartn -proposal-editorial 0:b03206c0ed03 0.27 0.10 nextchapter.thisproposaloutlines -proposal-editorial 0:838b34bafe7b 0.27 0.10 brandidentityandredesigningyourw -proposal-editorial 0:c704f790608e 0.27 0.10 mission,elevatecredibility,andde -proposal-editorial 0:20bdf45ebb79 0.27 0.10 peopleyouserve. -proposal-editorial 0:d28f860aec04 0.27 0.10 ourprocessblendsstrategicthinkin -proposal-editorial 0:53fcd88ebb00 0.27 0.10 cohesivebrandsystemandamodern,co -proposal-editorial 0:95bad9757a67 0.27 0.10 outcomewillbeaclear,confidentpre -proposal-editorial 0:8863e2b998da 0.27 0.10 improvesengagement,andsupportsyo +proposal-editorial 0:a27307c3fd63 -0.03 0.10 thankyoufortheopportunitytopartn +proposal-editorial 0:b03206c0ed03 -0.03 0.10 nextchapter.thisproposaloutlines +proposal-editorial 0:838b34bafe7b -0.03 0.10 brandidentityandredesigningyourw +proposal-editorial 0:c704f790608e -0.03 0.10 mission,elevatecredibility,andde +proposal-editorial 0:20bdf45ebb79 -0.03 0.10 peopleyouserve. +proposal-editorial 0:d28f860aec04 -0.03 0.10 ourprocessblendsstrategicthinkin +proposal-editorial 0:53fcd88ebb00 -0.03 0.10 cohesivebrandsystemandamodern,co +proposal-editorial 0:95bad9757a67 -0.03 0.10 outcomewillbeaclear,confidentpre +proposal-editorial 0:8863e2b998da -0.03 0.10 improvesengagement,andsupportsyo proposal-editorial 0:f16c2c2f1999 -0.07 0.10 projectgoals -proposal-editorial 0:c008ab0ba85f -0.04 0.10 projectduration -proposal-editorial 0:5a6b4bf425f2 -0.26 0.10 6weeks -proposal-editorial 0:7aa73e5c14d3 -0.02 0.10 startwindow -proposal-editorial 0:6fcb2d3f02ba -0.23 0.10 september2026 -proposal-editorial 0:185e8dc84248 0.00 0.10 primarycontact -proposal-editorial 0:59d00e0c1b99 -0.21 0.10 projectlead -proposal-editorial 0:4190fd3a8d72 -0.01 0.10 proposalvalidity -proposal-editorial 0:56a2e019b8aa -0.22 0.10 14days -proposal-editorial 0:265e93f6b9da -0.05 0.10 (until8september2026) -proposal-editorial 0:e2ea93b97611 0.25 0.05 strengthenbrand -proposal-editorial 0:7d95098b921b 0.25 0.05 credibilityandvisual -proposal-editorial 0:218e304f8b84 0.25 0.05 consistency. -proposal-editorial 0:35597cc9803f 0.25 0.06 improvewebsite -proposal-editorial 0:83f63137756b 0.25 0.06 usabilityanddrive -proposal-editorial 0:cce9fba37d4e 0.25 0.06 meaningfulaction. -proposal-editorial 0:59aaadaf0c54 0.25 0.06 communicateyour -proposal-editorial 0:30193022f687 0.25 0.06 valueclearlyacrossall -proposal-editorial 0:04b5995c746f 0.25 0.06 touchpoints. -proposal-editorial 0:b45d848fe1b6 0.25 0.07 buildascalabledigital -proposal-editorial 0:e8228bfeba0e 0.25 0.07 foundationforfuture -proposal-editorial 0:1fa35c7a1402 0.25 0.07 growth. +proposal-editorial 0:c008ab0ba85f 0.16 0.10 projectduration +proposal-editorial 0:5a6b4bf425f2 0.15 0.10 6weeks +proposal-editorial 0:7aa73e5c14d3 0.18 0.10 startwindow +proposal-editorial 0:6fcb2d3f02ba 0.17 0.10 september2026 +proposal-editorial 0:185e8dc84248 0.20 0.10 primarycontact +proposal-editorial 0:59d00e0c1b99 0.19 0.10 projectlead +proposal-editorial 0:4190fd3a8d72 0.20 0.10 proposalvalidity +proposal-editorial 0:56a2e019b8aa 0.18 0.10 14days +proposal-editorial 0:265e93f6b9da 0.20 0.10 (until8september2026) +proposal-editorial 0:e2ea93b97611 0.00 0.05 strengthenbrand +proposal-editorial 0:7d95098b921b 0.00 0.05 credibilityandvisual +proposal-editorial 0:218e304f8b84 0.00 0.05 consistency. +proposal-editorial 0:35597cc9803f 0.00 0.06 improvewebsite +proposal-editorial 0:83f63137756b 0.00 0.06 usabilityanddrive +proposal-editorial 0:cce9fba37d4e 0.00 0.06 meaningfulaction. +proposal-editorial 0:59aaadaf0c54 0.00 0.06 communicateyour +proposal-editorial 0:30193022f687 0.00 0.06 valueclearlyacrossall +proposal-editorial 0:04b5995c746f 0.00 0.06 touchpoints. +proposal-editorial 0:b45d848fe1b6 0.00 0.07 buildascalabledigital +proposal-editorial 0:e8228bfeba0e 0.00 0.07 foundationforfuture +proposal-editorial 0:1fa35c7a1402 0.00 0.07 growth. proposal-editorial 0:bc981abcdf59 0.02 0.10 scopeofwork -proposal-editorial 0:28450edd9a4f -0.20 0.05 discovery&research -proposal-editorial 0:ce9012b74aa2 0.05 0.08 stakeholderinterviews,brandaudit -proposal-editorial 0:730c3e278933 -0.23 0.08 audienceinsightstoinformstrategy -proposal-editorial 0:12bff3036b66 -0.21 0.05 visualidentityrefinement -proposal-editorial 0:937ad523a90c 0.04 0.08 refinelogosystem,colorpalette,ty -proposal-editorial 0:9b232e66f46c -0.24 0.08 guidelinesforacohesive,modernide -proposal-editorial 0:fc5134bf5fd1 -0.22 0.05 websiteux/uidesign -proposal-editorial 0:5d58b01c7096 0.03 0.08 designaresponsive,accessibility- -proposal-editorial 0:5d6068f6a879 -0.25 0.08 navigationandclearconversionpath -proposal-editorial 0:32001e20b2ed -0.23 0.05 contentstructure&messaging -proposal-editorial 0:b3c948ec3e36 0.02 0.08 definesitearchitecture,keymessag -proposal-editorial 0:231428fde7aa -0.26 0.08 communicatevalueandbuildtrust. -proposal-editorial 0:8c7703bb6fb7 -0.24 0.05 launchsupport -proposal-editorial 0:34f9fe468474 0.01 0.08 developerhandoff,qasupport,train -proposal-editorial 0:2b4cf15f6f16 -0.27 0.08 toensureasmoothlaunch. +proposal-editorial 0:28450edd9a4f 0.10 0.05 discovery&research +proposal-editorial 0:ce9012b74aa2 0.20 0.08 stakeholderinterviews,brandaudit +proposal-editorial 0:730c3e278933 -0.08 0.08 audienceinsightstoinformstrategy +proposal-editorial 0:12bff3036b66 0.09 0.05 visualidentityrefinement +proposal-editorial 0:937ad523a90c 0.19 0.08 refinelogosystem,colorpalette,ty +proposal-editorial 0:9b232e66f46c -0.09 0.08 guidelinesforacohesive,modernide +proposal-editorial 0:fc5134bf5fd1 0.08 0.05 websiteux/uidesign +proposal-editorial 0:5d58b01c7096 0.18 0.08 designaresponsive,accessibility- +proposal-editorial 0:5d6068f6a879 -0.10 0.08 navigationandclearconversionpath +proposal-editorial 0:32001e20b2ed 0.07 0.05 contentstructure&messaging +proposal-editorial 0:b3c948ec3e36 0.17 0.08 definesitearchitecture,keymessag +proposal-editorial 0:231428fde7aa -0.11 0.08 communicatevalueandbuildtrust. +proposal-editorial 0:8c7703bb6fb7 0.06 0.05 launchsupport +proposal-editorial 0:34f9fe468474 0.16 0.08 developerhandoff,qasupport,train +proposal-editorial 0:2b4cf15f6f16 -0.12 0.08 toensureasmoothlaunch. proposal-editorial 0:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. proposal-editorial 1:5205c2a261bc 0.91 0.10 northline proposal-editorial 1:da0daaba4b15 0.43 0.10 studio @@ -4474,56 +4472,56 @@ proposal-editorial 1:23eb79a19b39 0.07 0.60 brandstrategysummary proposal-editorial 1:aaa2a6073d69 0.07 0.60 refinedlogosuite&brandguidelines proposal-editorial 1:d626f7532564 0.07 0.60 color,typography&designsystem proposal-editorial 1:018ec557a513 0.07 0.60 websiteuxwireframes -proposal-editorial 1:5ed4970fa285 -0.18 0.60 high-fidelitywebsitedesigns +proposal-editorial 1:5ed4970fa285 0.07 0.60 high-fidelitywebsitedesigns proposal-editorial 1:a579d6d1c12e -0.03 0.58 responsivedesignfordesktop,table proposal-editorial 1:d524c1a0811d -0.03 0.10 mobile proposal-editorial 1:8b712e7e93bf 0.05 0.58 contentstrategy&pagetemplates proposal-editorial 1:e9bf06d9b130 0.05 0.58 developer-readyassets&specificat -proposal-editorial 1:e93e7ba95ceb -0.20 0.58 launchchecklist&trainingsession +proposal-editorial 1:e93e7ba95ceb 0.05 0.58 launchchecklist&trainingsession proposal-editorial 1:94d192b3a326 0.03 0.10 timeline proposal-editorial 1:02195b8e9896 0.09 0.45 phase proposal-editorial 1:c51faa148557 0.09 0.42 focus proposal-editorial 1:caa79af4db67 0.09 0.44 duration proposal-editorial 1:e0ee8bb50685 0.09 0.42 output -proposal-editorial 1:9a5c531db125 -0.23 0.45 01discover -proposal-editorial 1:99b15ca862e5 -0.23 0.44 1week -proposal-editorial 1:99b15ca862e5#1 -0.23 0.44 1week -proposal-editorial 1:7817fa5085e2 0.35 0.42 research,audit,insights,and -proposal-editorial 1:73dff70e25ad 0.35 0.42 strategy -proposal-editorial 1:ddfbc608570a 0.35 0.42 discoveryreport&creative -proposal-editorial 1:93c4abe27cf1 0.35 0.42 direction -proposal-editorial 1:9285b279249c -0.23 0.45 02design -proposal-editorial 1:b183847fe9f8 -0.23 0.44 2weeks -proposal-editorial 1:b183847fe9f8#1 -0.20 0.44 2weeks -proposal-editorial 1:1e0716635ae3 0.35 0.42 brandrefinementandwebsite -proposal-editorial 1:80f5fb36f074 0.35 0.42 ux/uidesign -proposal-editorial 1:ad5e8a376247 0.35 0.42 designsystem&high-fidelity -proposal-editorial 1:dbb1831acb45 0.35 0.42 designs -proposal-editorial 1:ea1ecc5ce8ad -0.23 0.45 03developprep -proposal-editorial 1:381b99928ddd 0.35 0.42 contentstructure,developer -proposal-editorial 1:b144c5104484 0.35 0.42 handoff&assetpreparation -proposal-editorial 1:6ba4e54f2632 0.35 0.42 specs,assets&content -proposal-editorial 1:06a61df042ad 0.35 0.42 framework -proposal-editorial 1:17f923a4777c -0.20 0.45 04launchsupport -proposal-editorial 1:8f16bc1588b5 -0.20 0.42 qa,training&go-liveassistance -proposal-editorial 1:7c23497e09b0 -0.20 0.42 qasign-off&successfullaunch +proposal-editorial 1:9a5c531db125 0.07 0.45 01discover +proposal-editorial 1:99b15ca862e5 0.07 0.44 1week +proposal-editorial 1:99b15ca862e5#1 0.07 0.44 1week +proposal-editorial 1:7817fa5085e2 0.10 0.42 research,audit,insights,and +proposal-editorial 1:73dff70e25ad 0.10 0.42 strategy +proposal-editorial 1:ddfbc608570a 0.10 0.42 discoveryreport&creative +proposal-editorial 1:93c4abe27cf1 0.10 0.42 direction +proposal-editorial 1:9285b279249c 0.07 0.45 02design +proposal-editorial 1:b183847fe9f8 0.07 0.44 2weeks +proposal-editorial 1:b183847fe9f8#1 0.10 0.44 2weeks +proposal-editorial 1:1e0716635ae3 0.10 0.42 brandrefinementandwebsite +proposal-editorial 1:80f5fb36f074 0.10 0.42 ux/uidesign +proposal-editorial 1:ad5e8a376247 0.10 0.42 designsystem&high-fidelity +proposal-editorial 1:dbb1831acb45 0.10 0.42 designs +proposal-editorial 1:ea1ecc5ce8ad 0.07 0.45 03developprep +proposal-editorial 1:381b99928ddd 0.10 0.42 contentstructure,developer +proposal-editorial 1:b144c5104484 0.10 0.42 handoff&assetpreparation +proposal-editorial 1:6ba4e54f2632 0.10 0.42 specs,assets&content +proposal-editorial 1:06a61df042ad 0.10 0.42 framework +proposal-editorial 1:17f923a4777c 0.10 0.45 04launchsupport +proposal-editorial 1:8f16bc1588b5 0.10 0.42 qa,training&go-liveassistance +proposal-editorial 1:7c23497e09b0 0.10 0.42 qasign-off&successfullaunch proposal-editorial 1:f9b21c4bda58 -1.13 0.10 investment proposal-editorial 1:4a33eacd5fa6 0.08 0.45 item proposal-editorial 1:2da123241332 0.08 0.48 amount(gbp) -proposal-editorial 1:1167b381fe2f 0.04 0.45 discovery&strategy -proposal-editorial 1:572a8dc5a455 0.04 0.47 £2,500 -proposal-editorial 1:7c2ad9ba0fd0 0.04 0.45 brandidentityrefinement -proposal-editorial 1:7f2732df7390 0.04 0.47 £4,500 -proposal-editorial 1:fc5134bf5fd1 0.04 0.45 websiteux/uidesign -proposal-editorial 1:8534d989b9ed 0.04 0.47 £7,000 -proposal-editorial 1:32001e20b2ed 0.04 0.45 contentstructure&messaging -proposal-editorial 1:e58a378ffc52 0.04 0.47 £2,000 -proposal-editorial 1:8c7703bb6fb7 0.04 0.45 launchsupport -proposal-editorial 1:d423fc0a31c2 0.04 0.47 £1,500 -proposal-editorial 1:d6577e95efba 0.04 0.45 subtotal -proposal-editorial 1:8873236d3571 0.04 0.45 £17,500 -proposal-editorial 1:3d213570f707 0.04 0.45 optional:3monthspost-launchsuppo -proposal-editorial 1:7ffd918ebc4a 0.04 0.48 £1,750 +proposal-editorial 1:1167b381fe2f 0.09 0.45 discovery&strategy +proposal-editorial 1:572a8dc5a455 0.09 0.47 £2,500 +proposal-editorial 1:7c2ad9ba0fd0 0.09 0.45 brandidentityrefinement +proposal-editorial 1:7f2732df7390 0.09 0.47 £4,500 +proposal-editorial 1:fc5134bf5fd1 0.09 0.45 websiteux/uidesign +proposal-editorial 1:8534d989b9ed 0.09 0.47 £7,000 +proposal-editorial 1:32001e20b2ed 0.09 0.45 contentstructure&messaging +proposal-editorial 1:e58a378ffc52 0.09 0.47 £2,000 +proposal-editorial 1:8c7703bb6fb7 0.09 0.45 launchsupport +proposal-editorial 1:d423fc0a31c2 0.09 0.47 £1,500 +proposal-editorial 1:d6577e95efba 0.09 0.45 subtotal +proposal-editorial 1:8873236d3571 0.09 0.45 £17,500 +proposal-editorial 1:3d213570f707 0.09 0.45 optional:3monthspost-launchsuppo +proposal-editorial 1:7ffd918ebc4a 0.09 0.48 £1,750 proposal-editorial 1:58656319146d 0.06 0.45 totalinvestment proposal-editorial 1:4aadcd9bc785 0.06 0.47 £19,250 proposal-editorial 1:51d2361f4fae -1.13 0.12 terms @@ -4538,9 +4536,9 @@ proposal-editorial 1:deda6d86d965 -0.16 0.14 transferstoasterahealthco.after proposal-editorial 1:aaa7d3e9affb -0.58 0.14 fullpaymentisreceived. proposal-editorial 1:c1514c6cdad1 -1.09 9.50 acceptance proposal-editorial 1:893663b06769 0.09 9.50 bysigningbelow,youagreetothescop -proposal-editorial 1:df16232de5b9 -0.17 9.50 acceptedby: -proposal-editorial 1:f089d24d7cf3 -0.17 9.38 signature: -proposal-editorial 1:c74c9cd82f13 -0.17 9.24 date: +proposal-editorial 1:df16232de5b9 0.13 9.50 acceptedby: +proposal-editorial 1:f089d24d7cf3 0.13 9.48 signature: +proposal-editorial 1:c74c9cd82f13 0.13 9.54 date: proposal-editorial 1:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. proposal-indigo 0:07f15cde5b18 0.14 0.08 kestrel proposal-indigo 0:ecd1378bc9dc 0.13 -0.43 proposal @@ -4558,9 +4556,9 @@ proposal-indigo 0:f99fb5990e3f 0.16 0.03 proposalfor proposal-indigo 0:460ebeabf0d7 0.16 0.03 financialinfrastructure proposal-indigo 0:e0b894e9070f 0.17 0.03 &embeddedfinance proposal-indigo 0:76f9df77e8af 0.18 0.03 partnership -proposal-indigo 0:f33b9e206de3 0.66 0.03 empoweringbrightfutureltd.withmo -proposal-indigo 0:16a14b235896 0.66 0.03 infrastructure,globalcapabilitie -proposal-indigo 0:2fdd6f092df5 0.65 0.03 experienceforyourcustomers. +proposal-indigo 0:f33b9e206de3 0.21 0.03 empoweringbrightfutureltd.withmo +proposal-indigo 0:16a14b235896 0.21 0.03 infrastructure,globalcapabilitie +proposal-indigo 0:2fdd6f092df5 0.20 0.03 experienceforyourcustomers. proposal-indigo 0:0e87632cd46b 0.10 0.03 date proposal-indigo 0:dc9696f61d36 0.09 0.03 27may2026 proposal-indigo 0:621f581e97b4 0.10 -0.04 proposalid @@ -4570,8 +4568,8 @@ proposal-indigo 0:93059e9a1c07 0.09 0.03 26june2026 proposal-indigo 0:8d6867ab3a4c 0.10 0.01 preparedby proposal-indigo 0:50910841c2da 0.09 0.01 kestrelbusinessteam proposal-indigo 0:69cca54632df 0.13 27.73 aboutkestrelbusiness -proposal-indigo 0:81a3de6caa05 0.01 27.73 kestrelbusinessprovidesmodernfin -proposal-indigo 0:a999713d90ce 0.01 27.73 forward-thinkingcompanies.frommu +proposal-indigo 0:81a3de6caa05 0.11 27.73 kestrelbusinessprovidesmodernfin +proposal-indigo 0:a999713d90ce 0.11 27.73 forward-thinkingcompanies.frommu proposal-indigo 0:8001c2743965 0.10 27.73 global proposal-indigo 0:f469802a3144 0.12 27.73 scale proposal-indigo 0:774cdf08f6a8 0.10 27.71 modern @@ -4581,9 +4579,9 @@ proposal-indigo 0:b67c263c0379 0.12 27.68 compliant proposal-indigo 0:88fa0d759f84 0.10 27.66 developer proposal-indigo 0:962cba9fd476 0.12 27.66 firstapis proposal-indigo 0:4f30d3328d6f 0.11 0.08 projectoverview -proposal-indigo 0:a73369734180 0.01 0.08 thisproposaloutlinesatailoredfin -proposal-indigo 0:19a7c085cb24 0.02 0.08 supportbrightfutureltd.inenablin -proposal-indigo 0:ff5888ea18e0 0.02 0.08 financialservicesforyourbusiness +proposal-indigo 0:a73369734180 0.16 0.08 thisproposaloutlinesatailoredfin +proposal-indigo 0:19a7c085cb24 0.17 0.08 supportbrightfutureltd.inenablin +proposal-indigo 0:ff5888ea18e0 0.17 0.08 financialservicesforyourbusiness proposal-indigo 0:2855076f724f 0.13 0.07 multi-currencybusinessaccounts proposal-indigo 0:4e36c64ccf3a 0.14 0.07 hold,send,receivein30+currencies proposal-indigo 0:17f85ac3692b 0.22 0.07 corporatecards&expenses @@ -4647,75 +4645,75 @@ proposal-modern 0:7a802048127d 0.00 0.35 engine+templatemigration proposal-modern 0:f9b21c4bda58 -0.01 0.10 investment proposal-modern 0:4a33eacd5fa6 0.03 0.40 item proposal-modern 0:c9046f7a37ad 0.03 0.35 description -proposal-modern 0:cf38d95c9c6b 0.03 1.42 amount +proposal-modern 0:cf38d95c9c6b 0.03 0.37 amount proposal-modern 0:fe9b6b4f133b 0.00 0.35 workshops+auditgbp6,000 proposal-modern 0:62e788ae3916 0.00 0.35 engine+templatesgbp24,000 proposal-modern 0:11239872d178 0.00 0.40 total -proposal-modern 0:1c3065490625 0.00 1.42 gbp30,000 +proposal-modern 0:1c3065490625 0.00 0.37 gbp30,000 proposal-modern 0:63feb7230a5d -0.03 0.10 acceptanceterms proposal-modern 0:35046a9f5675 0.30 9.60 •50%onsignature,50%ondelivery. proposal-modern 0:f03c1877ea2b 0.30 9.60 •validfor30daysfromthepreparedda proposal-modern 0:90572e911376 0.02 0.10 thankyouforconsideringgraphcompo -proposal-northline 0:5205c2a261bc -0.44 0.05 northline -proposal-northline 0:da0daaba4b15 -0.44 0.05 studio -proposal-northline 0:ecd1378bc9dc -0.13 1.93 proposal +proposal-northline 0:5205c2a261bc 0.01 0.05 northline +proposal-northline 0:da0daaba4b15 0.01 0.05 studio +proposal-northline 0:ecd1378bc9dc -0.08 1.93 proposal proposal-northline 0:53df6a685985 -0.11 0.10 proposal– proposal-northline 0:03a41208320e 0.49 0.10 brandrefresh& proposal-northline 0:c20712117515 -0.21 0.10 websiteredesign -proposal-northline 0:1bae6dc6c199 -0.05 0.10 preparedforasterahealthco.|prepa +proposal-northline 0:1bae6dc6c199 0.00 0.10 preparedforasterahealthco.|prepa proposal-northline 0:566835ed7fba -0.59 0.11 executivesummary -proposal-northline 0:a27307c3fd63 0.03 0.10 thankyoufortheopportunitytopartn -proposal-northline 0:b03206c0ed03 0.03 0.10 nextchapter.thisproposaloutlines -proposal-northline 0:838b34bafe7b 0.03 0.10 brandidentityandredesigningyourw -proposal-northline 0:c704f790608e 0.03 0.10 mission,elevatecredibility,andde -proposal-northline 0:20bdf45ebb79 0.03 0.10 peopleyouserve. -proposal-northline 0:d28f860aec04 0.03 0.10 ourprocessblendsstrategicthinkin -proposal-northline 0:53fcd88ebb00 0.03 0.10 cohesivebrandsystemandamodern,co -proposal-northline 0:95bad9757a67 0.03 0.10 outcomewillbeaclear,confidentpre -proposal-northline 0:8863e2b998da 0.03 0.10 improvesengagement,andsupportsyo +proposal-northline 0:a27307c3fd63 -0.02 0.10 thankyoufortheopportunitytopartn +proposal-northline 0:b03206c0ed03 -0.02 0.10 nextchapter.thisproposaloutlines +proposal-northline 0:838b34bafe7b -0.02 0.10 brandidentityandredesigningyourw +proposal-northline 0:c704f790608e -0.02 0.10 mission,elevatecredibility,andde +proposal-northline 0:20bdf45ebb79 -0.02 0.10 peopleyouserve. +proposal-northline 0:d28f860aec04 -0.02 0.10 ourprocessblendsstrategicthinkin +proposal-northline 0:53fcd88ebb00 -0.02 0.10 cohesivebrandsystemandamodern,co +proposal-northline 0:95bad9757a67 -0.02 0.10 outcomewillbeaclear,confidentpre +proposal-northline 0:8863e2b998da -0.02 0.10 improvesengagement,andsupportsyo proposal-northline 0:f16c2c2f1999 -0.59 0.11 projectgoals -proposal-northline 0:e4af490aeb22 -0.31 0.07 projectataglance -proposal-northline 0:c008ab0ba85f -0.25 0.07 projectduration -proposal-northline 0:5a6b4bf425f2 -0.42 0.07 6weeks -proposal-northline 0:7aa73e5c14d3 -0.25 0.07 startwindow -proposal-northline 0:6fcb2d3f02ba -0.42 0.07 september2026 -proposal-northline 0:185e8dc84248 -0.25 0.07 primarycontact -proposal-northline 0:59d00e0c1b99 -0.42 0.07 projectlead -proposal-northline 0:4190fd3a8d72 -0.25 0.07 proposalvalidity -proposal-northline 0:56a2e019b8aa -0.42 0.07 14days -proposal-northline 0:265e93f6b9da -0.24 0.07 (until8september2026) -proposal-northline 0:e2ea93b97611 0.07 0.10 strengthenbrand -proposal-northline 0:7d95098b921b 0.07 0.10 credibilityandvisual -proposal-northline 0:218e304f8b84 0.07 0.10 consistency. -proposal-northline 0:35597cc9803f 0.07 0.06 improvewebsite -proposal-northline 0:83f63137756b 0.07 0.06 usabilityanddrive -proposal-northline 0:cce9fba37d4e 0.07 0.06 meaningfulaction. -proposal-northline 0:59aaadaf0c54 0.07 0.06 communicateyour -proposal-northline 0:30193022f687 0.07 0.06 valueclearlyacrossall -proposal-northline 0:04b5995c746f 0.07 0.06 touchpoints. -proposal-northline 0:b45d848fe1b6 0.07 0.12 buildascalabledigital -proposal-northline 0:e8228bfeba0e 0.07 0.12 foundationforfuture -proposal-northline 0:1fa35c7a1402 0.07 0.12 growth. +proposal-northline 0:e4af490aeb22 -0.01 0.07 projectataglance +proposal-northline 0:c008ab0ba85f 0.00 0.07 projectduration +proposal-northline 0:5a6b4bf425f2 -0.02 0.07 6weeks +proposal-northline 0:7aa73e5c14d3 0.00 0.07 startwindow +proposal-northline 0:6fcb2d3f02ba -0.02 0.07 september2026 +proposal-northline 0:185e8dc84248 0.00 0.07 primarycontact +proposal-northline 0:59d00e0c1b99 -0.02 0.07 projectlead +proposal-northline 0:4190fd3a8d72 0.00 0.07 proposalvalidity +proposal-northline 0:56a2e019b8aa -0.02 0.07 14days +proposal-northline 0:265e93f6b9da 0.01 0.07 (until8september2026) +proposal-northline 0:e2ea93b97611 0.02 0.10 strengthenbrand +proposal-northline 0:7d95098b921b 0.02 0.10 credibilityandvisual +proposal-northline 0:218e304f8b84 0.02 0.10 consistency. +proposal-northline 0:35597cc9803f 0.02 0.06 improvewebsite +proposal-northline 0:83f63137756b 0.02 0.06 usabilityanddrive +proposal-northline 0:cce9fba37d4e 0.02 0.06 meaningfulaction. +proposal-northline 0:59aaadaf0c54 0.02 0.06 communicateyour +proposal-northline 0:30193022f687 0.02 0.06 valueclearlyacrossall +proposal-northline 0:04b5995c746f 0.02 0.06 touchpoints. +proposal-northline 0:b45d848fe1b6 0.02 0.12 buildascalabledigital +proposal-northline 0:e8228bfeba0e 0.02 0.12 foundationforfuture +proposal-northline 0:1fa35c7a1402 0.02 0.12 growth. proposal-northline 0:bc981abcdf59 -0.49 0.11 scopeofwork -proposal-northline 0:28450edd9a4f -0.18 0.05 discovery&research -proposal-northline 0:155f35b4967f 0.17 0.07 stakeholderinterviews,brandaudit -proposal-northline 0:973aeda5fe6d 0.17 0.07 insightstoinformstrategy. -proposal-northline 0:12bff3036b66 -0.18 0.05 visualidentityrefinement -proposal-northline 0:d7ac738462f9 0.17 0.07 refinelogosystem,colorpalette,ty -proposal-northline 0:9136e740c370 0.17 0.07 cohesive,modernidentity. -proposal-northline 0:fc5134bf5fd1 -0.18 0.05 websiteux/uidesign -proposal-northline 0:5d58b01c7096 0.17 0.07 designaresponsive,accessibility- -proposal-northline 0:5d6068f6a879 0.17 0.07 navigationandclearconversionpath -proposal-northline 0:32001e20b2ed -0.18 0.05 contentstructure&messaging -proposal-northline 0:b3c948ec3e36 0.17 0.07 definesitearchitecture,keymessag -proposal-northline 0:231428fde7aa 0.17 0.07 communicatevalueandbuildtrust. -proposal-northline 0:8c7703bb6fb7 -0.18 0.05 launchsupport -proposal-northline 0:64aa6ccd2e0e 0.17 0.07 developerhandoff,qasupport,train -proposal-northline 0:1f71a8d2d1d2 0.17 0.07 ensureasmoothlaunch. +proposal-northline 0:28450edd9a4f 0.12 0.05 discovery&research +proposal-northline 0:155f35b4967f 0.12 0.07 stakeholderinterviews,brandaudit +proposal-northline 0:973aeda5fe6d 0.12 0.07 insightstoinformstrategy. +proposal-northline 0:12bff3036b66 0.12 0.05 visualidentityrefinement +proposal-northline 0:d7ac738462f9 0.12 0.07 refinelogosystem,colorpalette,ty +proposal-northline 0:9136e740c370 0.12 0.07 cohesive,modernidentity. +proposal-northline 0:fc5134bf5fd1 0.12 0.05 websiteux/uidesign +proposal-northline 0:5d58b01c7096 0.12 0.07 designaresponsive,accessibility- +proposal-northline 0:5d6068f6a879 0.12 0.07 navigationandclearconversionpath +proposal-northline 0:32001e20b2ed 0.12 0.05 contentstructure&messaging +proposal-northline 0:b3c948ec3e36 0.12 0.07 definesitearchitecture,keymessag +proposal-northline 0:231428fde7aa 0.12 0.07 communicatevalueandbuildtrust. +proposal-northline 0:8c7703bb6fb7 0.12 0.05 launchsupport +proposal-northline 0:64aa6ccd2e0e 0.12 0.07 developerhandoff,qasupport,train +proposal-northline 0:1f71a8d2d1d2 0.12 0.07 ensureasmoothlaunch. proposal-northline 0:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. -proposal-northline 1:5205c2a261bc -0.34 0.05 northline -proposal-northline 1:da0daaba4b15 -0.34 0.05 studio -proposal-northline 1:ecd1378bc9dc -0.03 1.93 proposal +proposal-northline 1:5205c2a261bc 0.11 0.05 northline +proposal-northline 1:da0daaba4b15 0.11 0.05 studio +proposal-northline 1:ecd1378bc9dc 0.02 1.93 proposal proposal-northline 1:e35c32bb5ed8 -0.49 0.11 deliverables proposal-northline 1:23eb79a19b39 0.08 0.60 brandstrategysummary proposal-northline 1:aaa2a6073d69 0.08 0.60 refinedlogosuite&brandguidelines @@ -4731,45 +4729,45 @@ proposal-northline 1:02195b8e9896 0.11 0.45 phase proposal-northline 1:c51faa148557 0.11 0.45 focus proposal-northline 1:caa79af4db67 0.11 0.41 duration proposal-northline 1:e0ee8bb50685 0.11 0.45 output -proposal-northline 1:9a5c531db125 -0.21 0.45 01discover -proposal-northline 1:99b15ca862e5 -0.21 0.41 1week -proposal-northline 1:99b15ca862e5#1 -0.21 0.41 1week -proposal-northline 1:7817fa5085e2 0.17 0.45 research,audit,insights,and -proposal-northline 1:73dff70e25ad 0.17 0.45 strategy -proposal-northline 1:ddfbc608570a 0.17 0.45 discoveryreport&creative -proposal-northline 1:93c4abe27cf1 0.17 0.45 direction -proposal-northline 1:9285b279249c -0.21 0.45 02design -proposal-northline 1:b183847fe9f8 -0.21 0.41 2weeks -proposal-northline 1:b183847fe9f8#1 -0.18 0.41 2weeks -proposal-northline 1:1e0716635ae3 0.17 0.45 brandrefinementandwebsite -proposal-northline 1:80f5fb36f074 0.17 0.45 ux/uidesign -proposal-northline 1:ad5e8a376247 0.17 0.45 designsystem&high-fidelity -proposal-northline 1:dbb1831acb45 0.17 0.45 designs -proposal-northline 1:ea1ecc5ce8ad -0.21 0.45 03developprep -proposal-northline 1:381b99928ddd 0.17 0.45 contentstructure,developer -proposal-northline 1:b144c5104484 0.17 0.45 handoff&assetpreparation -proposal-northline 1:6ba4e54f2632 0.17 0.45 specs,assets&content -proposal-northline 1:06a61df042ad 0.17 0.45 framework -proposal-northline 1:17f923a4777c -0.18 0.45 04launchsupport -proposal-northline 1:8f16bc1588b5 -0.18 0.45 qa,training&go-liveassistance -proposal-northline 1:7c23497e09b0 -0.18 0.45 qasign-off&successfullaunch +proposal-northline 1:9a5c531db125 0.09 0.45 01discover +proposal-northline 1:99b15ca862e5 0.09 0.41 1week +proposal-northline 1:99b15ca862e5#1 0.09 0.41 1week +proposal-northline 1:7817fa5085e2 0.12 0.45 research,audit,insights,and +proposal-northline 1:73dff70e25ad 0.12 0.45 strategy +proposal-northline 1:ddfbc608570a 0.12 0.45 discoveryreport&creative +proposal-northline 1:93c4abe27cf1 0.12 0.45 direction +proposal-northline 1:9285b279249c 0.09 0.45 02design +proposal-northline 1:b183847fe9f8 0.09 0.41 2weeks +proposal-northline 1:b183847fe9f8#1 0.12 0.41 2weeks +proposal-northline 1:1e0716635ae3 0.12 0.45 brandrefinementandwebsite +proposal-northline 1:80f5fb36f074 0.12 0.45 ux/uidesign +proposal-northline 1:ad5e8a376247 0.12 0.45 designsystem&high-fidelity +proposal-northline 1:dbb1831acb45 0.12 0.45 designs +proposal-northline 1:ea1ecc5ce8ad 0.09 0.45 03developprep +proposal-northline 1:381b99928ddd 0.12 0.45 contentstructure,developer +proposal-northline 1:b144c5104484 0.12 0.45 handoff&assetpreparation +proposal-northline 1:6ba4e54f2632 0.12 0.45 specs,assets&content +proposal-northline 1:06a61df042ad 0.12 0.45 framework +proposal-northline 1:17f923a4777c 0.12 0.45 04launchsupport +proposal-northline 1:8f16bc1588b5 0.12 0.45 qa,training&go-liveassistance +proposal-northline 1:7c23497e09b0 0.12 0.45 qasign-off&successfullaunch proposal-northline 1:f9b21c4bda58 -0.49 0.11 investment proposal-northline 1:4a33eacd5fa6 0.11 0.45 item proposal-northline 1:2da123241332 0.11 0.52 amount(gbp) -proposal-northline 1:1167b381fe2f 0.07 0.45 discovery&strategy -proposal-northline 1:572a8dc5a455 0.07 0.51 £2,500 -proposal-northline 1:7c2ad9ba0fd0 0.07 0.45 brandidentityrefinement -proposal-northline 1:7f2732df7390 0.07 0.51 £4,500 -proposal-northline 1:fc5134bf5fd1 0.07 0.45 websiteux/uidesign -proposal-northline 1:8534d989b9ed 0.07 0.51 £7,000 -proposal-northline 1:32001e20b2ed 0.07 0.45 contentstructure&messaging -proposal-northline 1:e58a378ffc52 0.07 0.51 £2,000 -proposal-northline 1:8c7703bb6fb7 0.07 0.45 launchsupport -proposal-northline 1:d423fc0a31c2 0.07 0.51 £1,500 -proposal-northline 1:d6577e95efba 0.07 0.45 subtotal -proposal-northline 1:8873236d3571 0.07 0.49 £17,500 -proposal-northline 1:3d213570f707 0.07 0.45 optional:3monthspost-launchsuppo -proposal-northline 1:7ffd918ebc4a 0.07 0.52 £1,750 +proposal-northline 1:1167b381fe2f 0.12 0.45 discovery&strategy +proposal-northline 1:572a8dc5a455 0.12 0.51 £2,500 +proposal-northline 1:7c2ad9ba0fd0 0.12 0.45 brandidentityrefinement +proposal-northline 1:7f2732df7390 0.12 0.51 £4,500 +proposal-northline 1:fc5134bf5fd1 0.12 0.45 websiteux/uidesign +proposal-northline 1:8534d989b9ed 0.12 0.51 £7,000 +proposal-northline 1:32001e20b2ed 0.12 0.45 contentstructure&messaging +proposal-northline 1:e58a378ffc52 0.12 0.51 £2,000 +proposal-northline 1:8c7703bb6fb7 0.12 0.45 launchsupport +proposal-northline 1:d423fc0a31c2 0.12 0.51 £1,500 +proposal-northline 1:d6577e95efba 0.12 0.45 subtotal +proposal-northline 1:8873236d3571 0.12 0.49 £17,500 +proposal-northline 1:3d213570f707 0.12 0.45 optional:3monthspost-launchsuppo +proposal-northline 1:7ffd918ebc4a 0.12 0.52 £1,750 proposal-northline 1:58656319146d 0.09 0.45 totalinvestment proposal-northline 1:4aadcd9bc785 0.09 0.51 £19,250 proposal-northline 1:51d2361f4fae -0.49 0.08 terms @@ -4784,9 +4782,9 @@ proposal-northline 1:5312201597c1 -0.10 0.09 transferstoasterahealthco.afterf proposal-northline 1:d31e8d77a816 -0.50 0.09 paymentisreceived. proposal-northline 1:c1514c6cdad1 -0.44 11.46 acceptance proposal-northline 1:893663b06769 0.13 11.45 bysigningbelow,youagreetothescop -proposal-northline 1:df16232de5b9 -0.13 11.45 acceptedby: -proposal-northline 1:f089d24d7cf3 -0.13 11.41 signature: -proposal-northline 1:c74c9cd82f13 -0.13 11.42 date: +proposal-northline 1:df16232de5b9 0.17 11.45 acceptedby: +proposal-northline 1:f089d24d7cf3 0.17 11.41 signature: +proposal-northline 1:c74c9cd82f13 0.17 11.42 date: proposal-northline 1:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. receipt-modern 0:2b019b5b46da 0.31 0.10 northwindpay receipt-modern 0:a3c304a23bb1 0.30 0.16 transferconfirmation @@ -4845,8 +4843,8 @@ receipt-modern 0:94d25770d489 -0.02 0.05 help@northwind-pay.example receipt-modern 0:d613d9566d09 -0.02 0.05 northwindpayisafictionalinstitut receipt-modern 0:403a860bfc00 -0.02 0.05 invented. receipt-modern 0:7b14b8d2c5c4 -0.04 0.14 page1of1 -rota-cobalt 0:33888e306262 0.28 0.52 quay -rota-cobalt 0:f5f481423c57 -0.22 0.52 quaysidebar +rota-cobalt 0:33888e306262 0.38 0.52 quay +rota-cobalt 0:f5f481423c57 -0.17 0.52 quaysidebar rota-cobalt 0:d457d4238a16 -0.02 0.73 monday31st rota-cobalt 0:916a90a10237 -0.02 0.74 tuesday1st rota-cobalt 0:c602d130bfde -0.02 0.77 wednesday2nd @@ -4854,17 +4852,17 @@ rota-cobalt 0:74cf6babb6f6 -0.02 0.73 thursday3rd rota-cobalt 0:ae6aa379ad0c -0.02 0.68 friday4th rota-cobalt 0:a6643f169bfd -0.02 0.72 saturday5th rota-cobalt 0:58752a3c0543 -0.02 0.73 sunday6th -rota-cobalt 0:c4aee96677b0 -0.08 0.66 /cleancrushedice -rota-cobalt 0:2895e01ceae0 -0.09 0.63 machine&area -rota-cobalt 0:f4e7df025c89 -0.03 0.70 pianist18:30/clean -rota-cobalt 0:d3acaa767810 -0.04 0.70 crushedicemachine& -rota-cobalt 0:4a91ee5f0106 -0.05 0.56 area -rota-cobalt 0:b913ee5e077a -0.08 0.68 privatedinner44pax/ -rota-cobalt 0:d89987d22df9 -0.09 0.69 soulgf/pianist18:30 -rota-cobalt 0:fb980282ae0a -0.08 0.63 pianist18:30/partner -rota-cobalt 0:3c1fc038017e -0.09 0.64 meeting3:30pm +rota-cobalt 0:c4aee96677b0 0.02 0.66 /cleancrushedice +rota-cobalt 0:2895e01ceae0 0.01 0.63 machine&area +rota-cobalt 0:f4e7df025c89 0.02 0.70 pianist18:30/clean +rota-cobalt 0:d3acaa767810 0.01 0.70 crushedicemachine& +rota-cobalt 0:4a91ee5f0106 0.00 0.56 area +rota-cobalt 0:b913ee5e077a 0.02 0.68 privatedinner44pax/ +rota-cobalt 0:d89987d22df9 0.01 0.69 soulgf/pianist18:30 +rota-cobalt 0:fb980282ae0a 0.02 0.63 pianist18:30/partner +rota-cobalt 0:3c1fc038017e 0.01 0.64 meeting3:30pm rota-cobalt 0:cc96b22615e5 0.02 0.60 pianist19:00 -rota-cobalt 0:bc14a4ce6407 -0.03 1.26 statuslegend +rota-cobalt 0:bc14a4ce6407 0.07 1.26 statuslegend rota-cobalt 0:1f58b9145b24 -0.07 0.88 request rota-cobalt 0:b4dc66dde806 -0.07 0.73 off rota-cobalt 0:b4dc66dde806#1 -0.06 0.45 off @@ -4904,8 +4902,8 @@ rota-cobalt 0:cdc2def9aec4#13 -0.55 0.37 hol rota-cobalt 0:cdc2def9aec4#14 -0.55 0.42 hol rota-cobalt 0:cdc2def9aec4#15 -0.55 0.37 hol rota-cobalt 0:08c4242b5f58 -0.07 0.78 stock -rota-cobalt 0:f8f8922da592 0.18 0.81 standby -rota-cobalt 0:c2fb788c7dee 0.18 0.85 training +rota-cobalt 0:f8f8922da592 0.03 0.81 standby +rota-cobalt 0:c2fb788c7dee 0.03 0.85 training rota-cobalt 0:a18603086e5b -0.07 0.81 support rota-cobalt 0:17ae69cc7e46 -0.04 0.52 covers rota-cobalt 0:412a5c513322 -0.03 0.64 l104/d50 @@ -4916,7 +4914,7 @@ rota-cobalt 0:7062fafe1dab -0.03 0.60 l65/d112 rota-cobalt 0:778cb57b62fa -0.03 0.60 l73/d112 rota-cobalt 0:1b4471920f01 -0.03 0.62 l72/d83 rota-cobalt 0:288965a1f2c8 0.17 0.53 management -rota-cobalt 0:6a61eb7383e8 -0.07 0.76 rosa +rota-cobalt 0:6a61eb7383e8 0.03 0.76 rosa rota-cobalt 0:3bb0f0bb5552 -0.06 0.26 09:00-18:00 rota-cobalt 0:3bb0f0bb5552#1 -0.15 0.22 09:00-18:00 rota-cobalt 0:3bb0f0bb5552#2 -0.15 0.23 09:00-18:00 @@ -4944,7 +4942,7 @@ rota-cobalt 0:e669544e9895 0.05 0.91 08:00-16:00 rota-cobalt 0:e669544e9895#1 -0.27 0.96 08:00-16:00 rota-cobalt 0:19c30663e8ef 0.41 1.71 16:00-21:00 rota-cobalt 0:19c30663e8ef#1 0.10 1.76 16:00-21:00 -rota-cobalt 0:c9affe7f7587 -0.11 0.88 tomas +rota-cobalt 0:c9affe7f7587 -0.01 0.88 tomas rota-cobalt 0:6d43df86fe4b -0.10 0.26 16:00-00:00 rota-cobalt 0:6d43df86fe4b#1 -0.10 0.31 16:00-00:00 rota-cobalt 0:6d43df86fe4b#2 -0.15 0.27 16:00-00:00 @@ -4961,7 +4959,7 @@ rota-cobalt 0:6d43df86fe4b#12 -0.55 0.27 16:00-00:00 rota-cobalt 0:6d43df86fe4b#13 -0.48 0.95 16:00-00:00 rota-cobalt 0:5a5f719aae11 0.00 0.90 11:00-16:00 rota-cobalt 0:df9ba122242c 0.07 0.53 bartenders -rota-cobalt 0:dbaf86dd80e3 -0.16 0.82 nadia +rota-cobalt 0:dbaf86dd80e3 -0.06 0.82 nadia rota-cobalt 0:0cdd9d9e75dc -0.05 0.94 09:00-16:00 rota-cobalt 0:0cdd9d9e75dc#1 -0.09 0.96 09:00-16:00 rota-cobalt 0:0cdd9d9e75dc#2 -0.14 0.99 09:00-16:00 @@ -4971,7 +4969,7 @@ rota-cobalt 0:f1e2ce9aa575#1 0.27 1.70 16:00-22:00 rota-cobalt 0:f1e2ce9aa575#2 0.27 1.76 16:00-22:00 rota-cobalt 0:f1e2ce9aa575#3 0.23 1.79 16:00-22:00 rota-cobalt 0:f1e2ce9aa575#4 0.23 1.75 16:00-22:00 -rota-cobalt 0:de7ee76e7373 -0.20 0.78 elias +rota-cobalt 0:de7ee76e7373 -0.10 0.78 elias rota-cobalt 0:61587c4c0d6d -0.20 0.31 09:00-17:00 rota-cobalt 0:7195a8ed72b9 -0.09 0.90 12:00-16:00 rota-cobalt 0:7195a8ed72b9#1 -0.18 0.94 12:00-16:00 @@ -4983,17 +4981,17 @@ rota-cobalt 0:7195a8ed72b9#6 -0.40 0.96 12:00-16:00 rota-cobalt 0:7195a8ed72b9#7 -0.40 0.91 12:00-16:00 rota-cobalt 0:7195a8ed72b9#8 -0.45 0.94 12:00-16:00 rota-cobalt 0:7195a8ed72b9#9 -0.45 0.95 12:00-16:00 -rota-cobalt 0:953cb9ba8128 -0.25 0.90 mirela +rota-cobalt 0:953cb9ba8128 -0.15 0.90 mirela rota-cobalt 0:c1298a6e85c2 -0.24 0.27 12:00-18:00 rota-cobalt 0:c1298a6e85c2#1 -0.33 0.27 12:00-18:00 -rota-cobalt 0:86846e84f9bf -0.29 0.78 sofia -rota-cobalt 0:effcc54ba75f -0.34 0.82 karol -rota-cobalt 0:5c1e134d2d34 -0.38 0.89 henrik -rota-cobalt 0:6326e0e8cfda -0.42 0.82 lucia +rota-cobalt 0:86846e84f9bf -0.19 0.78 sofia +rota-cobalt 0:effcc54ba75f -0.24 0.82 karol +rota-cobalt 0:5c1e134d2d34 -0.28 0.89 henrik +rota-cobalt 0:6326e0e8cfda -0.32 0.82 lucia rota-cobalt 0:c235e502637c -0.24 0.53 barbacks -rota-cobalt 0:bd558de5f794 -0.47 0.84 oskar -rota-cobalt 0:4941d6993ee9 -0.52 0.89 teodor -rota-cobalt 0:1d3d3d6a07bd -0.56 0.83 vesna +rota-cobalt 0:bd558de5f794 -0.37 0.84 oskar +rota-cobalt 0:4941d6993ee9 -0.42 0.89 teodor +rota-cobalt 0:1d3d3d6a07bd -0.46 0.83 vesna rota-cobalt 0:59f2ff7c7c70 0.03 0.08 timesshownin24-hourformat.shiftc rota-cobalt 0:594c41ec0506 0.03 -3.60 quaysidebar|31aug-6sep2026 synthetic-break_in_column 0:80f18b7de78a -0.02 0.10 arowandastack,eachwithabreakinit diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv index cc8d69ca8..479231d46 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv @@ -1,73 +1,71 @@ # libreoffice build 420(Build:2) on linux +# every row from CI run 40844463596, the run of the change that made this gate two-sided. Not shot whole since #898, the file had gone stale in 1778 of its 5149 rows, since the one-sided gate of that time wrote back only the rows it went red on. Of those, 230 stood more than half a point from where it held them — 226 across and 4 down, in 8 documents — and every one of the 230 stood nearer the engine's PDF, not one further; the rest had moved within the half point the gate reads as rounding +# rows of cv-teal_pulse: its email line, set in a cell set to the middle, stood +0.08pt while the contact separator was anchored in that cell, LibreOffice 24.2 then setting the cell from its top; the separator now goes elsewhere, as a cell set to the middle carries no drawing, and LibreOffice centres the cell as its neighbours: +0.93pt, Word +1.14pt document engine_pages editor_pages lines matched median p90 over2 -# rows of invoice-metered_long, invoice-obsidian_long, synthetic-break_in_column, synthetic-break_in_panel, synthetic-card_over_pages: libreoffice build 420(Build:2) on linux -# rows of synthetic-clipped_container, synthetic-narrow_container, synthetic-rounded_card: libreoffice build 420(Build:2) on linux -# rows of synthetic-icon_over_card: libreoffice build 420(Build:2) on linux -# rows of cv-teal_pulse: libreoffice build 420(Build:2) on linux, from CI run 40503780286. Its email line, set in a cell set to the middle, stood +0.08pt while the contact separator was anchored in that cell, LibreOffice 24.2 then setting the cell from its top; the separator now goes elsewhere, as a cell set to the middle carries no drawing, and LibreOffice centres the cell as its neighbours: +0.93pt, Word +1.14pt. Ten other lines stand 0.1 to 0.3pt further, as the same run sets lines of documents the export does not change -cv-blue_banner 2 2 54 52 0.16 0.25 0 -cv-boxed_sections 2 2 58 58 0.06 0.11 0 -cv-centered_headline 2 2 58 56 0.12 0.29 0 -cv-charcoal_gold 1 1 85 83 0.20 0.28 0 -cv-classic_serif 2 2 57 54 0.03 0.09 0 -cv-compact_mono 1 1 58 58 0.06 0.18 0 +cv-blue_banner 2 2 54 52 0.05 0.22 0 +cv-boxed_sections 2 2 58 58 0.14 0.17 0 +cv-centered_headline 2 2 58 56 0.09 0.36 0 +cv-charcoal_gold 1 1 85 83 0.09 0.24 0 +cv-classic_serif 2 2 57 54 0.06 0.13 0 +cv-compact_mono 1 1 58 58 0.06 0.15 0 cv-editorial_blue 2 2 82 82 0.12 0.19 0 -cv-engineering_resume 1 1 57 57 0.09 0.45 0 -cv-executive 2 2 60 60 0.11 0.36 0 -cv-midnight_navy 1 1 86 84 0.23 0.41 0 -cv-minimal_underlined 2 2 59 59 0.20 0.35 0 +cv-engineering_resume 1 1 57 57 0.04 0.12 0 +cv-executive 2 2 60 60 0.04 0.08 0 +cv-midnight_navy 1 1 86 84 0.17 0.38 0 +cv-minimal_underlined 2 2 59 59 0.26 0.44 0 cv-mint_editorial 2 2 59 59 0.07 0.30 0 cv-modern_professional 2 2 61 59 0.08 0.10 0 -cv-monogram_sidebar 1 1 53 50 0.04 0.10 0 -cv-navy_sidebar 1 1 71 71 0.09 0.30 0 -cv-nordic_clean 1 1 63 58 0.06 0.19 0 -cv-orange_ops 1 1 108 106 0.18 0.35 0 -cv-panel 1 1 79 74 0.21 0.33 0 -cv-professional_sidebar 1 1 68 64 0.20 0.28 0 -cv-serif_headline 1 1 103 103 0.19 0.59 0 -cv-sidebar_portrait 1 1 49 49 0.07 0.18 0 -cv-slate_orange 1 1 87 86 0.23 0.99 0 +cv-monogram_sidebar 1 1 53 50 0.05 0.11 0 +cv-navy_sidebar 1 1 71 71 0.06 0.20 0 +cv-nordic_clean 1 1 63 58 0.03 0.13 0 +cv-orange_ops 1 1 108 106 0.18 0.26 0 +cv-panel 1 1 79 74 0.29 0.41 0 +cv-professional_sidebar 1 1 68 64 0.05 0.18 0 +cv-serif_headline 1 1 103 103 0.26 0.83 0 +cv-sidebar_portrait 1 1 49 49 0.08 0.19 0 +cv-slate_orange 1 1 87 86 0.23 1.01 0 cv-teal_pulse 1 1 57 57 0.12 0.25 0 -cv-terracotta_rail 1 1 102 102 0.17 0.52 0 -cv-timeline_minimal 2 2 89 87 0.05 0.11 0 -cv-violet_grid 1 1 80 78 0.27 0.59 0 +cv-terracotta_rail 1 1 102 102 0.09 0.35 0 +cv-timeline_minimal 2 2 89 87 0.05 0.10 0 +cv-violet_grid 1 1 80 78 0.16 0.41 0 invoice-classic 1 1 56 56 0.07 0.12 0 invoice-classic_long 2 2 166 166 0.07 0.08 0 -invoice-consulting 1 1 92 92 0.08 0.26 0 -invoice-consulting_long 2 2 236 236 0.12 0.28 0 -invoice-luma_studio 1 1 97 97 0.17 0.46 2 -invoice-luma_studio_long 3 3 192 192 0.11 0.41 2 +invoice-consulting 1 1 92 92 0.11 0.33 0 +invoice-consulting_long 2 2 236 236 0.12 0.31 0 +invoice-luma_studio 1 1 97 97 0.15 0.33 2 +invoice-luma_studio_long 3 3 192 192 0.09 0.16 2 invoice-merchant 1 1 94 94 0.78 1.96 5 -invoice-metered 1 1 99 99 1.26 10.63 48 +invoice-metered 1 1 99 99 0.99 10.40 48 invoice-metered_long 4 4 350 334 41.91 96.38 239 invoice-modern 1 1 54 54 0.03 0.10 0 invoice-modern_long 2 2 162 162 0.03 0.08 0 -invoice-obsidian 1 1 81 81 0.37 2.90 15 +invoice-obsidian 1 1 81 81 0.36 2.90 15 invoice-obsidian_long 5 5 375 375 4.17 8.36 253 -invoice-payments 1 1 104 104 0.30 5.14 40 -invoice-platform 1 1 111 111 0.31 0.41 0 -invoice-subscription 1 1 81 81 0.11 0.29 0 -invoice-workspace 1 1 90 90 0.18 0.32 0 -letter-blue_banner 1 1 10 10 0.02 0.12 0 -letter-boxed_sections 1 1 10 10 0.09 0.13 0 -letter-centered_headline 1 1 11 11 0.09 0.14 0 -letter-classic_serif 1 1 10 10 0.03 0.08 0 -letter-compact_mono 1 1 10 8 0.04 0.08 0 +invoice-payments 1 1 104 104 0.39 5.09 40 +invoice-platform 1 1 111 111 0.18 0.41 0 +invoice-subscription 1 1 81 81 0.05 0.13 0 +invoice-workspace 1 1 90 90 0.17 0.31 0 +letter-blue_banner 1 1 10 10 0.12 0.20 0 +letter-boxed_sections 1 1 10 10 0.20 0.22 0 +letter-centered_headline 1 1 11 11 0.10 0.21 0 +letter-classic_serif 1 1 10 10 0.05 0.10 0 +letter-compact_mono 1 1 10 8 0.03 0.07 0 letter-editorial_blue 1 1 12 12 0.07 0.16 0 -letter-engineering_resume 1 1 15 15 0.04 0.21 0 -letter-executive 1 1 12 12 0.05 0.20 0 +letter-engineering_resume 1 1 15 15 0.05 0.08 0 +letter-executive 1 1 12 12 0.05 0.10 0 letter-mint-editorial-letter 1 1 10 10 0.01 0.02 0 letter-modern_professional 1 1 12 12 0.03 0.11 0 -letter-monogram_sidebar 1 1 12 12 0.03 0.12 0 -letter-nordic_clean 1 1 15 15 0.06 0.15 0 -letter-panel 1 1 13 13 0.04 0.14 0 -letter-sidebar_portrait 1 1 12 12 0.03 0.05 0 -letter-timeline_minimal 1 1 15 15 0.15 0.33 0 -proposal-editorial 2 2 132 132 0.20 0.35 0 -proposal-indigo 1 1 72 70 0.12 0.50 0 +letter-monogram_sidebar 1 1 12 12 0.07 0.07 0 +letter-nordic_clean 1 1 15 15 0.04 0.12 0 +letter-panel 1 1 13 13 0.08 0.14 0 +letter-sidebar_portrait 1 1 12 12 0.04 0.10 0 +letter-timeline_minimal 1 1 15 15 0.03 0.19 0 +proposal-editorial 2 2 132 132 0.09 0.20 0 +proposal-indigo 1 1 72 70 0.13 0.33 0 proposal-modern 1 1 44 44 0.03 0.12 0 -proposal-northline 2 2 132 132 0.13 0.42 0 +proposal-northline 2 2 132 132 0.11 0.17 0 receipt-modern 1 1 57 57 0.04 0.09 0 -rota-cobalt 1 1 154 151 0.22 0.47 0 +rota-cobalt 1 1 154 151 0.20 0.47 0 synthetic-break_in_column 1 1 7 7 0.02 0.02 0 synthetic-break_in_panel 3 3 8 8 3.02 5.02 5 synthetic-card_over_pages 3 3 114 114 0.98 1.08 0 diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv index fd8f7c5be..cf3a13bc8 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv @@ -1,4 +1,5 @@ # libreoffice build bf6ef2662401 on windows — document, line, drift below the page (pt), drift right of the page (pt), letters +# known stale, and not rewritten by the change that made this gate two-sided: 2 documents fail it even one-sidedly — 8 lines no longer found, 2 page counts, and 65 lines more than half a point further, 8 of them proposal-indigo's, 10.25pt lower than the rows below hold them on the build this file names. The move is the export's, not the editor's. It wants attributing to the commit that made it before the file is shot again; see CONTRIBUTING.md # rows of invoice-metered_long, invoice-obsidian_long, synthetic-break_in_column, synthetic-break_in_panel, synthetic-card_over_pages: libreoffice build bf6ef2662401 on windows # rows of synthetic-clipped_container, synthetic-narrow_container, synthetic-rounded_card: libreoffice build bf6ef2662401 on windows # rows of synthetic-icon_over_card: libreoffice build bf6ef2662401 on windows diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv index d79c451a5..f1bb6ea34 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv @@ -1,4 +1,5 @@ # libreoffice build bf6ef2662401 on windows +# known stale, and not rewritten by the change that made this gate two-sided: 2 documents fail it even one-sidedly — 8 lines no longer found, 2 page counts, and 65 lines more than half a point further, 8 of them proposal-indigo's, 10.25pt lower than the rows below hold them on the build this file names. The move is the export's, not the editor's. It wants attributing to the commit that made it before the file is shot again; see CONTRIBUTING.md document engine_pages editor_pages lines matched median p90 over2 # rows of invoice-metered_long, invoice-obsidian_long, synthetic-break_in_column, synthetic-break_in_panel, synthetic-card_over_pages: libreoffice build bf6ef2662401 on windows # rows of synthetic-clipped_container, synthetic-narrow_container, synthetic-rounded_card: libreoffice build bf6ef2662401 on windows From fe4cb1badbc2ab11c9b13a7caefa7a0bb3b37998 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 29 Oct 2026 10:11:05 +0000 Subject: [PATCH 3/3] test(qa): count the drift the gate's own reckoning quotes, and fail closed on both axes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The figure the javadoc, the changelog and the pull request quoted for how far the stale rows had grown — 0.41pt — was the largest growth among the rows whose step passed the slack, not among the rows that moved, and it contradicted the next clause of its own sentence. Recounted from the committed rows: no row's distance from the page grew by more than 0.48pt, 21 rows of cv-serif_headline, cv-panel and invoice-obsidian by that much and the rest by 0.36pt or less, and those three documents are the ones that ended 0.48pt further. The argument is the same and now agrees with itself: 0.48 against half a point of slack is why a rule reading distances stayed quiet. Three things the gate still let through: - A measurement carrying no number for its drift down passed every rule, since Math.round(NaN) is 0 and the step against it compares false. The across axis had that guard; the down axis did not, so the mirror the last change claimed was one-sided. Both axes fail closed now. - A baseline row's median and p90 were read unchecked, and a median that is not a number reads as passing every limit it is put to. They are refused as the drift already is. - Keeping a file's notes did not reach the path the contributor is told to take: a measured run writes its own file, which carries no notes, and a run on a machine the baseline cannot be shot on is copied over the baseline from there. write takes the notes from the baseline, so the copy carries them. Where a file's header stands is now its shape rather than a guess. The header cannot be told from a note by its text — both are a # row of prose — so a note written above it could not be kept without dropping the header in its place and leaving the file naming a build it was never shot on. notesOf takes the first line to be the header and refuses a file that does not open with one. CONTRIBUTING no longer says neither LibreOffice baseline has been shot whole since #898, which the Linux one now has, and it, the changelog and the job comment name the engine's two rules in their lists. 37 tests from 27, and 20 sabotages — each rule removed, each rule that has a direction made one-sided, both NaN guards reopened, every non-finite refusal removed, note-keeping dropped from either file and the header's place made a guess — every one caught by DocxFidelityGateTest. --- .github/workflows/ci.yml | 4 +- CHANGELOG.md | 9 ++- CONTRIBUTING.md | 24 ++++--- .../fidelity/DocxFidelityCorpusTest.java | 7 +- .../fidelity/DocxFidelityGateTest.java | 53 ++++++++++++++- .../templates/fidelity/FidelityBaseline.java | 66 ++++++++++++++----- .../fidelity/FidelityMeasurement.java | 12 +++- 7 files changed, 135 insertions(+), 40 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09891570c..bc234d869 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -540,8 +540,8 @@ jobs: # qa/src/test/resources/docx-fidelity/libreoffice-linux*.tsv # (DocxFidelityCorpusTest): a change that moves any line of any document more than 0.5pt from # where the baseline holds it — down or across, nearer the engine's PDF or further — or sets a - # document at other words, on another number of pages, or with another set of its lines found, - # fails here. A move nearer the page is the export doing better and fails all the same, until + # document at other words, on another number of pages, with another set of its lines found, or + # one the engine draws on another number of pages or lines, fails here. A move nearer the page is the export doing better and fails all the same, until # the change records it by rewriting the baseline: held one-sidedly, the Word baseline drifted # stale in 1609 of its 5165 rows over 74 commits without a single red run (FidelityBaseline's # javadoc has the breakdown). Gated on `docx` — what an export of the corpus is made from. diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d0142f7b..16b179dbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4353,7 +4353,8 @@ follow semantic versioning; release dates are ISO 8601. that came nearer, and a line found that the baseline did not hold all passed, at any size. - Each is now measured as a step from where the baseline holds it: a line fails when its drift moves more than 0.5pt, down or across, nearer the page or further, and a document fails when - the editor sets it on another number of pages, when the engine draws it on another number, or + the editor sets it on another number of pages, when the engine draws it on another number of + pages or another number of lines, or when the set of its lines found is not the set the baseline holds. The failure names each line's step — `+1.10 -> +0.00pt (-1.10)` — so the direction is in the message. - Measured on the gate as it stood: a line moving 1.10pt nearer the page, one moving 5pt @@ -4369,8 +4370,10 @@ follow semantic versioning; release dates are ISO 8601. without one red run: 1388 rows moved down the page — 717 nearer it, 635 further, and 36 crossing it to stand the same distance on the other side — and 229 moved across, 228 of them nearer by as much as 1.10pt. Of all that, 228 rows had moved more than the slack, 226 across - and 2 down, and no row's *distance* from the page had grown by more than 0.41pt, which is - exactly why a rule reading distances stayed quiet. + and 2 down. And yet no row's *distance* from the page had grown by more than 0.48pt — 21 rows + of `cv-serif_headline`, `cv-panel` and `invoice-obsidian` by that much, the rest by 0.36pt or + less — which against half a point of slack is exactly why a rule reading distances stayed + quiet, and those three documents are the ones that ended 0.48pt further. - A baseline line row whose drift or place across is not a number is now refused. Every comparison against `NaN` is false, so such a row held its line to nothing however far it moved — and these files are patched by hand, so one mistyped cell was enough. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3dad4ec1f..ab4b2b437 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -358,7 +358,8 @@ Choose the smallest tests that match the change: A change that moves documents, nearer the page included, rewrites the baseline with `-Dgraphcompose.docxFidelity.update=true`, and commits it with the change: its diff shows which documents moved, and which way. A new preset joins the corpus in its family's - `*DocxCorpus` class, and so does a preset on a longer fixture; a shape no preset has — a page break inside a + `*DocxCorpus` class, and so does a preset on a longer fixture; a shape no preset has + — a page break inside a panel, a break in a row's column, a shape container narrower than the block it stands in or clipped short of its text, an icon a layer stack lays over a card's corner — goes in `SyntheticDocxCorpus`. Its baseline holds it as the editors set it, a defect of the export @@ -381,20 +382,23 @@ Choose the smallest tests that match the change: half a point nearer the page across, until three documents stood 0.48pt further and the next change to touch them would have failed the gate for drift it did not cause. The slack is read afresh against each rewrite, so it bounds no total: what two-sidedness buys is that every move - past rounding is seen and written down, not that drift cannot accumulate over many changes. A failure naming lines that moved nearer the page - is not a defect to fix — it is the export doing better, and the baseline is how it gets - recorded; carry any explanatory `#` note of the rows you rewrite over into the new file, as a - rewrite keeps only the header. Each baseline's header records the build it was shot on, and a + past rounding is seen and written down, not that drift cannot accumulate over many changes. + A failure naming lines that moved nearer the page is not a defect to fix — it is the export + doing better, and the baseline is how it gets recorded. A rewrite keeps the `#` notes the file + it replaces carried, by either path, and leaves it to you to prune the ones it has made stale; + a note is a block under the header, not an annotation of the rows below it, and comes back + above them. Each baseline's header records the build it was shot on, and a differing build is rarely the cause: Word 16.0.20430 and 16.0.20527 measure the corpus as #899 exported it identically, row for row. `libreoffice-windows.tsv` is known stale, and the local LibreOffice run fails on it: 2 documents fail even one-sidedly — 8 lines no longer found, 2 page counts and 65 lines more than half a point further, 8 of them `proposal-indigo`'s, 10.25pt lower than it holds them - on the LibreOffice build the baseline names. Neither LibreOffice baseline has been shot whole - since #898. Do not rewrite it as part of an unrelated change: find the commit that moved - those documents first, as the Word baseline's drift was attributed before #975 rewrote it, and - rewrite it with that reckoning. Until then, read a local LibreOffice run against the documents - your change touches rather than against a green run. + on the LibreOffice build the baseline names. It has not been shot whole since #898, where + `libreoffice-linux.tsv` now has. Do not rewrite it as part of an unrelated change: a move + further from the page wants the commit that made it found first, as the Word baseline's drift + was attributed before #975 rewrote it, and the file rewritten with that reckoning. Until then, + read a local LibreOffice run against the documents your change touches rather than against a + green run. Each run also writes `measured--acceptance.md`: which documents the editor sets as the page does — the same pages, 95% of the lines found, a median of 1pt or less, no more than 10% past 2pt — and what keeps the rest short of it. CI shows LibreOffice's in the job summary. diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java index 2a572642b..363e31efd 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityCorpusTest.java @@ -104,11 +104,12 @@ void everyDocumentStandsWhereItsBaselineHoldsIt() throws Exception { measurements.add(FidelityMeasurement.of(document.stem(), engine.resolve(document.stem() + ".pdf"), converted)); } - FidelityBaseline.write(work.resolve("measured-" + mode + ".tsv"), note, measurements); - FidelityAcceptance.write(work.resolve("measured-" + mode + "-acceptance.md"), note, measurements); - Path baseline = Path.of("src", "test", "resources", "docx-fidelity", mode + "-" + LibreOfficeConverter.platform() + ".tsv"); + // Written with the baseline's notes, so that copying this file over the baseline — what a + // run on a machine the baseline cannot be shot on, CI's, is for — keeps them. + FidelityBaseline.write(work.resolve("measured-" + mode + ".tsv"), note, measurements, baseline); + FidelityAcceptance.write(work.resolve("measured-" + mode + "-acceptance.md"), note, measurements); List divergences = FidelityBaseline.read(baseline).divergences(measurements); if (Boolean.getBoolean("graphcompose.docxFidelity.update")) { // Written all the same: what it lets through is the baseline's diff, shown here first. diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java index c6f00e964..887a5cc76 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/DocxFidelityGateTest.java @@ -383,11 +383,58 @@ void aRewrittenBaselineKeepsTheNotesTheFileItReplacesCarried() throws Exception FidelityBaseline.write(file, "second", List.of(doc("cv-a", 1, 1, line(1, "aa", 0.30, 1.5)))); - assertThat(Files.readAllLines(file)).containsSubsequence("# second", "# rows of cv-a: from run 7"); - assertThat(Files.readAllLines(lines)).anyMatch(row -> row.equals("# cv-a's heading stood 0.08pt low")); - assertThat(Files.readAllLines(lines)).first().asString().startsWith("# second"); + // Exactly these notes: keeping the old header as well would annotate the file with a + // build it was not shot on, and would add one such line on every rewrite thereafter. + assertThat(Files.readAllLines(file).stream().filter(row -> row.startsWith("#")).toList()) + .containsExactly("# second", "# rows of cv-a: from run 7"); + assertThat(Files.readAllLines(lines).stream().filter(row -> row.startsWith("#")).toList()) + .containsExactly("# second — document, line, drift below the page (pt), " + + "drift right of the page (pt), letters", + "# cv-a's heading stood 0.08pt low"); assertThat(FidelityBaseline.read(file).divergences(List.of(doc("cv-a", 1, 1, line(1, "aa", 0.30, 1.5))))) .as("and reads back past its notes").isEmpty(); + + FidelityBaseline.write(file, "third", List.of(doc("cv-a", 1, 1, line(1, "aa", 0.30, 1.5)))); + + assertThat(Files.readAllLines(file).stream().filter(row -> row.startsWith("#")).toList()) + .as("a second rewrite neither duplicates them nor adds a header") + .containsExactly("# third", "# rows of cv-a: from run 7"); + } + + @Test + void aBaselineThatDoesNotOpenWithItsHeaderIsRefusedRatherThanHalfRead() throws Exception { + // The header cannot be told from a note by its text, so it is known by standing first. + // A file shaped otherwise would come back naming a build it was never shot on, its own + // header kept as though it were a note; it is refused instead. + Path file = dir.resolve("baseline.tsv"); + FidelityBaseline.write(file, "build A", List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, 1.5)))); + List rows = new java.util.ArrayList<>(Files.readAllLines(file)); + rows.add(0, "document\tengine_pages\teditor_pages\tlines\tmatched\tmedian\tp90\tover2"); + Files.write(file, rows); + + assertThatThrownBy(() -> FidelityBaseline.write(file, "build B", + List.of(doc("cv-a", 1, 1, line(1, "aa", 0.25, 1.5))))) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("does not open with the note of where it was taken"); + } + + @Test + void aMeasurementCarryingNoDriftOfItsOwnFails() { + // Math.round(NaN) is 0, so a step measured against it compares false: both axes fail + // closed on a measurement that carries no number, not the across one alone. + FidelityBaseline baseline = FidelityBaseline.of(List.of(doc("cv-probe", 1, 1, line(1, "aa", 0.10, 1.5)))); + + assertThat(baseline.divergences(List.of(doc("cv-probe", 1, 1, + Map.entry("1:aa", new FidelityMeasurement.Found(1, "aa", Double.NaN, 1.5)))))) + .singleElement().asString().contains("1 line moved") + .contains("+0.10pt in the baseline, and no place measured"); + } + + @Test + void aBaselineRowHoldingAMedianThatIsNotANumberIsRefused() { + assertThatThrownBy(() -> FidelityMeasurement.parse("cv-a\t1\t1\t40\t0\tNaN\t0.5\t1", Map.of())) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("read as passing every limit"); } @Test diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java index 0f2f20e08..0b87e7e8d 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityBaseline.java @@ -36,10 +36,12 @@ * 1388 moved down the page — 717 nearer it, 635 further, and 36 crossing it to stand the same * distance on the other side — and 229 moved across, 228 of them nearer by as much as 1.10pt, * 8 rows moving both ways. Of all that, 228 rows moved more than the slack: 226 across and 2 - * down, both of those crossing the page's line. No row's distance from the page grew - * by more than 0.41pt, which is the whole reason a rule reading distances stayed quiet — until - * three documents stood 0.48pt further and the next change to touch them would have failed for - * drift it did not cause. A move nearer the page that goes unwritten is worse than + * down, both of those crossing the page's line. And yet no row's distance from the page + * grew by more than 0.48pt — 21 rows of {@code cv-serif_headline}, {@code cv-panel} and + * {@code invoice-obsidian} by that much and the rest by 0.36pt or less — which is the whole + * reason a rule reading distances against half a point of slack stayed quiet. Those same three + * documents are the ones that ended 0.48pt further, where the next change to touch them would + * have failed for drift it did not cause. A move nearer the page that goes unwritten is worse than * untidy: the baseline keeps the further value, so a later change may walk the line back to it * and spend the slack again on top. Comparing where a line is now against where it was, rather * than which of the two is further from the page, also catches a line that crosses the page's: @@ -143,13 +145,27 @@ static FidelityBaseline of(Collection measurements) { * stale is for the author to prune, which the file in front of them shows.

*/ static void write(Path documents, String note, Collection measurements) throws IOException { + write(documents, note, measurements, documents); + } + + /** + * Writes the measurements, taking the notes to keep from another baseline than the file being + * written. + * + *

A measured run writes its own files in {@code target}, which carry no notes of their own, + * and a run on a machine the baseline cannot be shot on — CI — is copied over the baseline + * from there. Written with the baseline as its notes, that copy carries them, so the path the + * contributor is told to take keeps the record as the {@code update} path does.

+ */ + static void write(Path documents, String note, Collection measurements, + Path notesFrom) throws IOException { List sorted = measurements.stream() .sorted(Comparator.comparing(FidelityMeasurement::stem)).toList(); List rows = new ArrayList<>(List.of("# " + note, FidelityMeasurement.HEADER)); - rows.addAll(1, notesOf(documents)); + rows.addAll(1, notesOf(notesFrom)); List lines = new ArrayList<>(List.of("# " + note + " — document, line, drift below the page (pt), " + ACROSS_COLUMN + ", letters")); - lines.addAll(notesOf(linesOf(documents))); + lines.addAll(notesOf(linesOf(notesFrom))); for (FidelityMeasurement measured : sorted) { rows.add(measured.row()); lines.addAll(measured.lineRows()); @@ -159,14 +175,27 @@ static void write(Path documents, String note, Collection m Files.write(linesOf(documents), lines, StandardCharsets.UTF_8); } - /** Every note a baseline file carries but the first, which is its own header. */ + /** + * Every note a baseline file carries under its header, which is its first line. + * + *

Where the header stands is the file's shape, not a guess: {@link #write} puts it there + * and {@link #read} reads the line file's from there. The header cannot be told from a note + * by its text — both are a {@code #} row of prose — so a note written above it could not be + * kept without dropping the header in its place, and the file would come back naming a build + * it was never shot on. A file that does not open with its header is therefore refused here + * rather than half-read: notes are a block under the header, and a file shaped otherwise is + * not one this wrote.

+ */ private static List notesOf(Path file) throws IOException { if (!Files.exists(file)) { return List.of(); } - List notes = Files.readAllLines(file, StandardCharsets.UTF_8).stream() - .filter(row -> row.startsWith("#")).toList(); - return notes.isEmpty() ? List.of() : notes.subList(1, notes.size()); + List rows = Files.readAllLines(file, StandardCharsets.UTF_8); + if (!rows.isEmpty() && !rows.get(0).startsWith("#")) { + throw new IllegalStateException("the baseline " + file + " does not open with the note of" + + " where it was taken, so its own notes cannot be told from its header: " + rows.get(0)); + } + return rows.stream().skip(1).filter(row -> row.startsWith("#")).toList(); } /** @@ -194,8 +223,8 @@ List divergences(Collection measurements) { + ", and the baseline holds " + pages(was.enginePages())); } if (now.lines() != was.lines()) { - apart.add(now.stem() + ": the page draws " + now.lines() + " lines, and the baseline holds " - + was.lines()); + apart.add(now.stem() + ": the page draws " + lineCount(now.lines()) + + ", and the baseline holds " + was.lines()); } List lost = new ArrayList<>(); List moved = new ArrayList<>(); @@ -207,7 +236,9 @@ List divergences(Collection measurements) { } // Named once, with every way it moved. List ways = new ArrayList<>(2); - if (moved(line.drift(), there.drift())) { + // Both axes fail closed on a measurement that carries no number: Math.round(NaN) + // is 0, so a step against it compares false and the line would pass unheld. + if (Double.isNaN(there.drift()) || moved(line.drift(), there.drift())) { ways.add(step(line.drift(), there.drift(), "")); } // A baseline holding a place across holds the line to it: a measurement without @@ -227,15 +258,15 @@ List divergences(Collection measurements) { } }); if (!lost.isEmpty()) { - apart.add(now.stem() + ": " + lines(lost.size()) + " no longer found, set at other words or " + apart.add(now.stem() + ": " + lineCount(lost.size()) + " no longer found, set at other words or " + "on another page: " + named(lost)); } if (!gained.isEmpty()) { - apart.add(now.stem() + ": " + lines(gained.size()) + " found that the baseline does not hold: " + apart.add(now.stem() + ": " + lineCount(gained.size()) + " found that the baseline does not hold: " + named(gained)); } if (!moved.isEmpty()) { - apart.add(now.stem() + ": " + lines(moved.size()) + " moved: " + named(moved)); + apart.add(now.stem() + ": " + lineCount(moved.size()) + " moved: " + named(moved)); } } return apart; @@ -264,7 +295,8 @@ private static String step(double was, double now, String axis) { return String.format(Locale.ROOT, "%+.2f -> %+.2fpt%s (%+.2f)", was, now, axis, now - was); } - private static String lines(int count) { + /** A count of lines, named so it reads in a sentence. */ + private static String lineCount(int count) { return count + (count == 1 ? " line" : " lines"); } diff --git a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java index 53d08b9bd..d7dc7bb19 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/fidelity/FidelityMeasurement.java @@ -177,9 +177,17 @@ static FidelityMeasurement parse(String row, Map found) { throw new IllegalArgumentException("a baseline row has 8 cells, not " + cells.length + ": " + row); } try { + double median = Double.parseDouble(cells[5]); + double p90 = Double.parseDouble(cells[6]); + // Nothing holds these to anything — they follow from the lines — but a row read back + // with a median that is not a number would read as passing every limit it is put to. + if (!Double.isFinite(median) || !Double.isFinite(p90)) { + throw new IllegalArgumentException("a baseline row holds a median or p90 that is not a " + + "number, which would read as passing every limit: " + row); + } return new FidelityMeasurement(cells[0], Integer.parseInt(cells[1]), Integer.parseInt(cells[2]), - Integer.parseInt(cells[3]), Integer.parseInt(cells[4]), Double.parseDouble(cells[5]), - Double.parseDouble(cells[6]), Integer.parseInt(cells[7]), found); + Integer.parseInt(cells[3]), Integer.parseInt(cells[4]), median, + p90, Integer.parseInt(cells[7]), found); } catch (NumberFormatException malformed) { throw new IllegalArgumentException("a baseline row holds a cell that is not a number: " + row, malformed); }