dbf937043ec4ba681c55c53ad42b351b2831d1b4
108
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
dbf937043e |
fix(scout): BIS per-vacancy location and Confluent via the IBM careers API
BIS
- The RSS feed carries no location, so every vacancy was stamped with
default_location "Basel, Switzerland". jr100491 (Hong Kong, BIS Asia office)
therefore passed the CH filter and reached the 2026-10-14 triage.
- fetch_rss now resolves the location per item through _rss_item_location:
the vacancy page's static "Geographical location" field
(location_page_regex), then a "based in ..." sentence in the feed
description, then default_location with a warning on stderr.
- Verified with --only=bis: 3 scraped, 2 eligible (both Basel); jr100491 now
reads "8 Finance Street, Central, Hong Kong" and is excluded.
Confluent
- IBM closed the acquisition on 2026-03-17. The Ashby board dropped from 17
jobs (2026-10-08) to {"jobs":[]} (2026-10-14), and careers.confluent.io is
behind a Vercel bot checkpoint.
- New `ibm` adapter for the open IBM careers search API
(www-api.ibm.com/search/api/v2; POST; size capped at 100, paged with
`from`). Location is built from city, country and work mode, e.g.
"United States - Remote".
- Confluent keeps its id, so seen-state and decisions still link. Verified
with --only=confluent: 84 roles, none in CH/Europe-remote scope today, and no
0-jobs warning.
CLAUDE.md corrections log: 2026-10-15 entry. Also notes that HashiCorp
(dropped 2026-06-06 for lacking a public API after the IBM acquisition) could
return through the same adapter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
2273c3eac8 |
feat(app): BIS jr100498 Senior/Lead Data & Analytics Engineer (MED IT) submitted; KB gaps closed; scout triage 2026-10-14
Application - BIS Basel, Senior/Lead Data & Analytics Engineer, Monetary and Economic Department IT (jr100498, 3-year term): resume, cover letter, verbatim JD, session, critique and the four portal free-text answers. Submitted 2026-10-15 via the BIS portal, cold (Evidence Fit 78 Core, hard gate PASS, Document Quality 88 after Tier 2 polish). Different unit from the rejected jr100429 (Banking Technology). Recorded in applications.json and decisions.json. Knowledge base - claims.json: BS-9 and SW-10 (onboarded and mentored junior developers at Bosch and Swisscom); skills TIBCO Spotfire, Teradata, Oracle Database and Hadoop / Impala registered from existing claim scopes; SDMX registered as forbidden (user-confirmed never used); SW-4 scope records the prototype-and-iterate approach with B2B business, architects and engineers. - Clarification note 2026-10-14 with verbatim user answers, including "schedule yes, budget no" for project planning (unattributed, so not a claim yet). - CLAUDE.md corrections log: 2026-10-14 entry. Scout - 2026-10-14 run (37 companies, 101 new): 19 JDs read; BIS jr100498 taken forward; Snowflake Engineering Productivity (mis-titled "Sr SWE, Enterprise"), Google SWE III Shopping Graph Feeds and Meta SWE Infrastructure logged as maybe; 15 roles logged as skip with the failing JD line quoted. Found: BIS RSS adapter stamps every vacancy as Basel (jr100491 is Hong Kong); Confluent Ashby board returns no jobs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
504fa373f7 |
feat(app): Kongsberg Seatex DevOps & Test Infra submitted; KB gaps closed; scout triage 2026-10-08
Application - Kongsberg Discovery / Seatex, Lead Engineer DevOps and Test Infrastructure (Trondheim): resume, cover letter (+ paste text), verbatim JD, session and critique. Submitted 2026-10-08 via EasyCruit as a deliberate cold application on a user override of the embedded-SW hard gate (Evidence Fit 69, Document Quality 84). Recorded in applications.json and decisions.json. - Google Senior SWE Full Stack Commerce: session and verbatim JD from 2026-10-03 (no-go on the frontend gap, held, not submitted). Knowledge base - claims.json: ED-1 (embedded/robotics coursework, none since studies), SW-9 (current unit testing, pytest), new skills (pytest, unit testing, embedded systems (coursework), VHDL, robotics (coursework)), and Jenkins and GitLab CI/CD registered from existing GN-1/FC-1/BS-6/SW-3 scopes. - Earlier uncommitted KB work: 2026-09-18 Python frameworks / enterprise SaaS clarification, 2026-10-03 data-product design / no-frontend clarification, 2026-10-06 working-model rule (3 homeoffice days baseline) in config.md and application_strategy.md, plus related experience/bundle/taxonomy updates. - CLAUDE.md corrections log: 2026-10-08 entry for the three canonical gaps. Scout - 2026-10-08 run triaged by JD read: NVIDIA DGX Cloud Senior Production Engineer, Google SRE III Prod AI / Senior SRE / Staff Shopping Graph and Amazon RIVR DevOps logged as maybe; GenAI FDE family, Kraken AI Platform, PostFinance DevOps and five Kdo Cy reqs logged as skip with reasons. Housekeeping - .gitignore: ignore .cache/ and raw HTML page dumps under output/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
881d904e68 |
feat(app): Swisscom Data Engineer - Geo Platform (internal, R-0006447), submitted
Internal application, submitted 2026-09-15. Evidence Fit 78, hard gate FAIL (ArcGIS and FME required, never used), overridden by the user. Document Quality 89, no Tier 1 findings. Channel Moderate: hiring manager Marianne Temerowski was contacted first and encouraged the application - the first time a named contact was used before applying. 2-page English resume, no cover letter (internal). KB CORRECTIONS FOUND ON THE WAY - BS-8: geospatial work at Bosch (Oracle SDO_GEOMETRY; normalizing and transforming wafer data across coordinate reference systems; performance tuning) was missing from claims.json. The first assessment also wrongly assumed wafer data carries no CRS; the user corrected it. ArcGIS, FME, QGIS, PostGIS, GeoServer and GDAL are registered as forbidden. - Swisscom was recorded as one undifferentiated current role. It is two units: ART B2B (past - Teradata DWH component ownership, Kubernetes, GitLab CI/CD, Kafka) and ART DPT, Team Offering (current - AWS data products with ODP-Flow, PySpark/Python, Glue, Iceberg, Athena, Airflow). The first build wrote the B2B ownership in present tense. Kafka and Kubernetes are now production-historical. Official internal title recorded (Engineer IV, III before Apr 2025); the unit switch date deliberately not. - Confirmed: SW-1 migration in Python Glue jobs with ODP-Flow; SW-3 multi-environment deployments; SW-7 relational data models. SW-3 narrowed: he worked with automated GitLab CI/CD and did not build it. - Skills added: Apache Iceberg, relational data modelling, ODP-Flow, Oracle SDO_GEOMETRY, coordinate system transformation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
34299bce54 |
fix: follow-up review corrections, BIS rejection, and a gitignore miss
Second-pass review of this session's work by another agent. It corrected several
real mistakes of mine and finished F06 gaps I had left open. Reviewed, verified
and committed as-is.
THE MISS THAT MATTERS
`job_scout/state/applications.json` — the authoritative application registry
introduced by F02 — was never actually tracked. `job_scout/state/*` in
.gitignore silently excluded it, so my checkpoint commit
|
||
|
|
925a2d74a3 |
chore(scout): skip Kdo Cy ICT-System Engineer - overqualified, not under-qualified
User decision 2026-09-11. The requirement floor is HF/FH or Techniker HF; no university degree is asked for at all, and he holds an M.Eng. Level evidence, from Kdo Cy own postings on the same board: every LK 24 role requires a Hochschul-/Fachhochschul-/Universitaetsabschluss, LK 26 requires a Studium at FH/UNI/ETH, and LK 18 roles require an Informatik-EFZ. This posting sits between the EFZ tier and the degree tier - roughly LK 20-22 - while its own Lohnklasse field said "Keine Angabe". Against ~135k that is very likely a pay cut: the EPA Lohntabelle 2026 maxima are LK 20 131,870 / LK 21 137,341 / LK 22 142,832, and those are CEILINGS, not entry salaries. Recorded emphatically as NOT a capability rejection. Technically this was the cleanest fit in the log for a DevOps/platform role - Ansible required and BS-6 is intensive including self-written plugins, plus Kubernetes, CI/CD, IaC and observability - and it carried NO networking line, the gap that killed RUAG Principal System Engineering, RUAG System Engineer C5I and the NVIDIA hard gate. The only gaps were vendor substitutions: RHEL vs Debian, OpenShift vs Kubernetes, AAP vs Ansible. If a similar posting appears a level up, take it seriously. Generalised into memory `reference_bund_lohnklassen`: screen jobs.admin.ch roles on the EDUCATION FLOOR first. The title hides the level - this one carried no seniority marker at all - but the education requirement tracks the Lohnklasse closely. Kdo Cy as an organisation stays open: the 2026-09-10 rejection and this skip are two requisitions, not a verdict on the employer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
468116959e |
feat(kb): BS-7 - Zweitpruefer and supervisor for a Bachelor thesis at Bosch
User-confirmed 2026-09-11, extending the Arbeitszeugnis line about supervising students and their theses. Zweitpruefer (second examiner) is a FORMAL role carrying assessment responsibility, not informal mentoring. That matters because "developing other engineers" keeps appearing as a JD requirement and the profile has otherwise only team-role evidence to offer - Security Champion, the Generali Java community, Application Owner training. SBB asked for it explicitly and the prepared answer had to fall back on exactly those. Limits recorded with it: exactly ONE thesis is confirmed as second-examiner work, so it must not be pluralised; the wider number of students supervised is not recorded; and none of it is people management. `forbidden` now blocks "supervised multiple theses", "lecturer", "taught a course" and an academic appointment reading. Carried into both data bundles so it can actually be selected - the BS-6 lesson from the same week: evidence that reaches no bundle cannot be chosen. Validator PASS, 37/37 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
f515a1e522 |
fix(kb): close all six Zeugnis discrepancies on the user's rulings
D1/D2 - Bosch title and promotion: CONFIRMED by the user. The promotion and its
timing are correct and came from a re-grading (Neueinstufung). The Zeugnis does
not contradict it - it names DEPARTMENTS ("Ingenieur" in Fertigungstechnologie
1/2/3) rather than job titles. Separately corrected a false provenance note that
claimed official_title was "the formal combined string on the Zeugnis"; it never
came from that document, it comes from the user and LinkedIn.
D3 - part-time from 2021-09: NOT recorded, by the user's decision. Noted for
completeness that tenure wording such as "over ten years" measures elapsed time
and is unaffected; it would only matter if a document claimed FTE years, and
none does.
D4 - French and Italian: the Swisscom Zwischenzeugnis says he uses both
professionally on a regular basis. The user reviewed the sentence and confirmed
it is an ERROR IN THE DOCUMENT. DE/EN only stands. Recorded in
identity.language_note so nobody rediscovers the line and acts on it, with the
practical warning that a reader of that Zeugnis may take it at face value.
D5 - the RUAG MSSQL rule-out: the DECISION stands (user does not want it
revisited), the REASONING is corrected. Two of its four premises were wrong:
MSSQL is not 0 (Fraunhofer SCEDAS ran on Microsoft SQL Server), and "his stack
is AWS cloud-native" was too narrow - the Swisscom Zeugnis documents component
ownership for ETL into the Teradata DWH. Talend and SAP S/4HANA remain genuinely
0, and the required line reads "Aufbau UND Betrieb" while he has documented
Betrieb only - so the skip is still defensible, it was just better than its
written justification. Both RUAG decision rows now carry the correction and a
standing rule for future DWH postings.
D6 - Vizrt end date: 2018-05 stands by the user's decision.
And the follow-through that matters: the data-warehouse, MSSQL and mentoring
evidence is now IN THE BUNDLES, not only in claims.json. BS-6 showed last week
that evidence which reaches no bundle cannot be selected - this is the same
failure mode, caught the same week. The DWH entry carries its scope limit
explicitly: documented Betrieb, not Aufbau.
Validator PASS, 37/37 tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
|
||
|
|
d702c4bc0c |
feat(kb): extract Bosch, Swisscom and Vizrt evidence; record 6 discrepancies
All three read as primary documents. Uncontested facts are written in; six conflicts between the documents and the KB are RECORDED AND LEFT OPEN, because several are the user's call and one contradicts a memory entry that shaped targeting. New evidence - Swisscom Zwischenzeugnis (Okt 2025) is unusually specific and now backs SW-1, SW-2 and SW-3 verbatim: component ownership for the ETL pipelines feeding the TERADATA DATA WAREHOUSE, Python on Kubernetes with GitLab CI/CD, AWS migration (S3, Glue, Athena, Redshift, Airflow), 2nd/3rd-level support and on-call. - Bosch Zeugnis corroborates BS-1 directly: "Erarbeitung und Durchfuehrung von Integrationsstrategien fuer den Einsatz von Machine Learning Modellen in der 24/7 Fertigungsumgebung". It also confirms the BS-4 PoC framing as the document's own wording rather than a policy hedge. - NEW claim BS-7: "Fachliche Betreuung von Studierenden, auch im Rahmen von Abschlussarbeiten". Documented mentoring evidence, recorded NOWHERE before today, although "developing other engineers" is a recurring JD requirement - SBB asked for it explicitly and the answer had to lean on team roles instead. - Vizrt's letter is thin: testing responsibilities only. It does NOT mention the transcoding backend, Python or C++, so VZ-1 is marked as resting on the user's statement rather than on the document. Six open discrepancies (claims.json: open_discrepancies_2026_09_11) - D1 HIGH: the Bosch Zeugnis says "Ingenieur" in "Fertigungstechnologie" 1/2/3. The words "Senior" and "Data Analysis" do not appear in it, yet the KB note claims official_title is "the formal combined string on the Zeugnis". - D2: KB has a promotion at 2021-01; the Zeugnis shows department moves at 2021-06 and 2022-03 and names no promotion. - D3 HIGH: "Seit dem 01. September 2021 arbeitete Herr Thiessen in Teilzeit." Bosch was PART-TIME for its final ~16 months. Recorded nowhere. Tenure wording including "over ten years" was written without knowing this. - D4 HIGH: the Swisscom Zeugnis says he uses ENGLISH, FRENCH and ITALIAN professionally on a regular basis. Memory user_international_mobility says "DE/EN only (no French)" - and that entry screened out French-speaking roles. - D5 HIGH: Swisscom component ownership feeding a Teradata DWH, plus Fraunhofer MSSQL, undercut two premises of the RUAG "Senior Data Engineer (MSSQL)" rule-out. Talend and SAP S/4HANA are still 0 and may still carry it. - D6 LOW: Vizrt letter says 01.07.2017-01.07.2018; KB has end 2018-05. None of the six is resolved here. Do not quietly pick a side when writing a document - ask. Validator PASS, 37/37 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
2687d652de |
feat(kb): extract Fraunhofer and Generali evidence from the Arbeitszeugnisse
Both references are image-only scans with no text layer, so they were read visually. Everything recorded is quoted or directly paraphrased from the documents; nothing is inferred. Fraunhofer (Arbeitszeugnis 31.10.2019) - FC-1 SCEDAS: C#, Entity Framework and MICROSOFT SQL SERVER; introduced and configured Jenkins and built the deployment build jobs. No language was recorded on this claim before today. - FC-2 ARTUS: SPEECH RECOGNITION and ML for an automatic transcription system for SEA RESCUE. Separately co-authored a research proposal on predicting optimal MAINTENANCE TIMING with ML - genuine predictive-maintenance exposure, at proposal stage. - FC-3 MISSION: microservices with EXPRESS.JS, JAVASCRIPT, DOCKER and SQLITE. Generali (Zwischenzeugnis/Endzeugnis 30.06.2017) - GN-1: the BDD stack is named - SERENITY-BDD, SELENIUM, JBEHAVE, with the build jobs administered in Jenkins. - GN-2: UIPath RPA PoCs plus evaluation of IBM ODM Decision Center 8.7. - GN-3: migrated web services to XLDEPLOY, CONTRIBUTED TO DESIGN AND ARCHITECTURE DECISIONS, and built into the Dispatcher PoC with APACHE CAMEL and SPRING BOOT. 11 skills newly evidenced from primary documents. TWO OF THESE CHANGE EARLIER CONCLUSIONS: 1. Microsoft SQL Server is NOT zero. The RUAG "Senior Data Engineer (MSSQL)" rule-out of 2026-09-04 stated "claims.json has 0 for MSSQL, Talend and SAP". That premise was wrong. The rule-out may still stand on its other required lines - multi-year ON-PREMISE data-warehouse construction, Talend, SAP S/4HANA are all genuinely 0 - but the MSSQL half must not be repeated, and one project database in 2018-2019 is not data-warehouse experience either. 2. Spring Boot is now documented rather than asserted. The SBB interview brief claimed "a PoC contribution roughly a decade ago" from memory; the Arbeitszeugnis confirms it exactly. Still PoC-scale and still no Angular. This is the fifth time a real capability turned out to be missing from claims.json. The previous four surfaced by accident in conversation; these surfaced because the user asked to read the primary documents. That is the cheaper route and should be the default for the remaining employers. Validator PASS, 37/37 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
b05ffbfbd6 |
feat(kb): record language split per employer, KLA DMS ownership, register Kotlin
User corrections, 2026-09-11. KOTLIN was absent from claims.json entirely and was therefore unwritable under the evidence-first rule. Bosch 2020-2022: backend services, Ansible plugin work and extensions. This is the FOURTH real skill found missing this way, after Ansible and Linux (2026-08-27) and Bash (2026-09-05). Correction to an earlier statement in this session: I described Kotlin as the fifth instance and named Groovy/Snowflake as the other two. That was wrong and the user caught it. Groovy and Snowflake were registered the same day as `forbidden` - skills he does NOT have, registered so the document scanner could catch them. The opposite of this pattern. The Kotlin note records the distinction so it does not propagate. Language split per employer, none of it previously recorded: - Fraunhofer: C#. FC-1 and FC-3 named no language at all. - Vizrt: Python for the wrapper, C++ for the transcoding engine (FFmpeg). Cross-referenced to the standing rule not to oversell C++. - Bosch: primarily Python, with some Java and Kotlin (backend, Ansible plugins, extensions) and C# for Spotfire plugins. BS-3 / BS-5: he was TECHNICAL Application Owner for the KLA Defect Management System (DMS) as well as for Spotfire. "Technical" is explicit so the line cannot be read as people management or vendor-side ownership. SW-6 (PySpark): the scope line carried "scale and performance metrics are not verified", which duplicated the metrics field and read as doubt about the skill rather than about the numbers - the skill is production-current and allowed. The caveat now lives only where it belongs. last_verified REMOVED from all 26 evidence blocks at the user's instruction: every claim already carries its employer in the ID prefix, and for closed employers a recency date measured nothing. Provenance (source, ownership) stays. The schema records the reasoning so it is not reintroduced out of habit. Validator advisory warnings 18 -> 0. 37/37 tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
f2a1229701 |
fix: clarify the Bosch 24/7 constraint; tidy build artefacts
BS-1 operating constraint - the F07 open item, resolved by the user The user clarified what the 24/7 constraint actually is: a defect in the software could, worst case, halt production - an outcome that must never occur. That is a FAILURE-CONSEQUENCE constraint, and the submitted NVIDIA cover letter states something different: "a production line that could not be stopped for a deployment" describes a scheduling window. The distinction matters in both directions - the letter is inaccurate, and the truth is the stronger claim. - BS-1 scope now records the real constraint and how to write it. - Both variants of the letter's phrasing are added to BS-1 `forbidden`, so the scanner catches them. Verified: it now flags the submitted letter. - BS-1 evidence filled from a real source (this clarification) rather than left unrecorded, including ownership - integration and operation, not model work. - The submitted letter is NOT rewritten (F17). experience_bosch.md records the resolution and the wording to use instead. Scanner false positive fixed: the employer-date check now runs on CVs only. A cover letter naming an employer in prose is not claiming a date. Cleanup, authorised by the user - 136 LaTeX build artefacts removed (already gitignored, regenerable). - 7 superseded intermediate QA renders removed, 6 of them in NATO_AI_ENGINEER which carried nine PDFs for two documents. - Nothing evidential touched: 36 submitted PDFs, 41 e2e deliverables, 44 sources, 54 session/critique files and 20 JD files are intact. The Kraken PDF was checked before deleting and turned out to be the saved job description, not a render. - output/ 16M -> 13M. 37/37 tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
b8c5141279 |
fix(F18-F19): get evidence onto page one earlier, measured not asserted
F18 - page-one weighting - Across four compiled packages the first employment entry began at 45-55% of page one. A reader reaching the middle of the page had seen a profile and a skills block, and no evidence. - The old skills rule counted `\skillline` MACROS, which does not control density: six categories with long value lists wrap to twelve or more rendered lines. Replaced with a rendered-line budget verified in the compiled PDF, plus the rule that a skills line repeating what three bullets below already prove is spending the first screen to say it twice. - Employer chronology stays reverse-chronological; the ordering freedom is WITHIN a position, where the bullet closest to the target role leads. - New helper `page_metrics.py` measures page-one geometry from the PDF via pdftotext -bbox. F19 - education and phrasing - Degree + focus + institution crammed into one cell with a right-aligned date produced visible word spacing and mid-word breaks in SBB, NVIDIA and Aker BP. Split the entry, as RUAG_AI_Engineer_C5I already did. Template carries the rule. - Grades and thesis stay only where concretely relevant. claims.json grade_output_rule already keeps grades off by default; the M.Eng. thesis earns its place on condition-monitoring or sensor-data roles and otherwise does not. Validated by measurement rather than assertion - page_metrics.py first reproduced the review's own figures (NVIDIA 55.4%, SBB 50.6%, RUAG 50.3%). That is what makes the after-figure meaningful. - The NVIDIA CV was rebuilt FROM A COPY with the guidance applied: experience moved 55.4% -> 44.0% of page one, page-one text lines 47 -> 39, still two pages, zero overfull boxes, validator PASS. - The submitted package itself was not modified. F17 classifies archives as evidence, not as drafts. The percentage is a diagnostic, not a target: no pixel goal and no rule that page two must be filled. All 19 review findings are now complete. 37/37 tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
eecdbdade6 |
fix(F17): a PDF in a folder is not proof the package can be rebuilt
Build sweep run this session: 48 sources, 46 built, 2 failed. Infineon_AI_Engineer's cover letter fails on font expansion (the font is not scalable); cv_template.tex fails on unfilled placeholders, which is expected for the academic legacy path. Overfull boxes: Microsoft ISE 25.33pt, Isovalent 0.88pt. All historical, all left alone. New: resume_builder/helpers/package_manifest.py records, per application package, what a rebuild would ACTUALLY do - sources, class-file hashes, PDFs present, and the reasons a rebuild would not reproduce the submitted document. It is descriptive; nothing in it authorises rewriting a submitted file. What it found across 21 packages: - 17 are DATE-DEPENDENT. The cover letters use oday, so recompiling a historical package silently restamps it with today's date. - 1 has an INCOMPLETE SOURCE DISTRIBUTION: output/NATO_AI_ENGINEER ships no resume.cls. It builds on this machine only because a copy exists elsewhere, and the shipped PDF hid that. Not repaired by copying the newest class in - the repo carries THREE different resume.cls variants (13/7/1 copies) and older macros differ, so that "fix" could silently change a historical document. - 1 has no PDF at all, so nothing is reviewable without a build. Classification: 7 application packages were in no reuse category. Added to historical_revalidate, and the register now records the default explicitly - anything unlisted is treated as revalidate-before-reuse. Being recent is not the same as being verified; none of the seven was re-read for this. Prevention rather than repair: oday removed from the cover-letter template so new packages stop adding to the pile. A test now fails if it comes back, if the manifest goes stale, or if a package is left unclassified. Also: scan_document gained a template mode. A placeholder in a TEMPLATE is what makes it a template; the defect is one surviving into a generated document. 37/37 tests pass; counter-proof still catches all 9. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
c7e8d4e058 |
fix(F15-F16): stop losing dates, contacts and whole daily reports
F15 - dates and metadata kept their meaning - The Taleo parser stored an application DEADLINE in `posted`, so a role closing on 30 September looked as though it had been published then - backwards for a freshness signal. It now populates `deadline`, and `posted` stays empty because that board genuinely publishes none. - The Prospective adapter read unit, Lohnklasse and a named contact, folded them into `description` for scoring, and `_process_company` then discarded `description` - losing exactly the fields that decide level, pay and whether a cold submit is necessary. They are now carried as fields through to the report and the JSON dump, alongside `date_provenance`. - Named contacts now appear in report rows. Channel is the rationed variable since 2026-09-05, so a published, reachable name is the difference between a cold submit being a choice and being the only option. F16 - writes stopped destroying delivered work - Every run of a day wrote `<date>.md`/`.json`, so a restricted run replaced the full daily report. This is not hypothetical: it happened twice in this session and both times the 37-company run had to be repeated by hand. Restricted runs now write `<date>.only-kdocy.md` and say so. - `save_seen()` ran in a `finally:` BEFORE the report was written. A failed report write therefore left roles marked seen, so a `--new-only` retry would hide precisely the hits that were never delivered. Seen-state is now committed only after report and dump are on disk - and never by a restricted run, which did not look at the whole board. - Atomic writes used a fixed `.tmp` name; two writers could share it and os.replace the wrong content into place. Unique temp names now. 34/34 tests pass; validated on a live 37-company run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
ce8619b8e3 |
fix(F14): call keyword relevance what it is, and teach it German
The scout presented a keyword count as "Strong fit" / "Medium fit". It is neither: it measures how many profile keywords a posting echoes, and knows nothing about his evidence, the hard requirements, the level, the language or the commute. - Buckets renamed to keyword relevance, with "NOT a fit judgement" in the heading, and score_job documents the limit with the review's own example: "Senior AI Engineer, Generative AI / LLM / RAG" scores 12 against "Senior Data Engineer" at 3, while the second is much closer to what he can evidence. - German job vocabulary added. Every German-language posting used to score near zero regardless of fit, which is the real reason RUAG, SBB, BKW, PostFinance and Kdo Cy all needed a _score_floor. The floor was a workaround; the missing terms were the defect. "Senior Dateningenieur" 1 -> 3, level with its English twin. - Platform/DevOps vocabulary was simply absent: devsecops, platform engineer, platform automation, infrastructure as code, observability, site reliability. The Kdo Cy "ICT-System Engineer (DevSecOps / Platform Automation)" scored ZERO before this - a posting whose requirement lines match his canonical evidence almost line for line. It now scores 10. - Noise is unaffected: "Office Manager:in Administration" still scores 0. Floors were left in place so this diff stays attributable; they can likely be reduced now that the vocabulary exists. 34/34 tests pass; validated on a live 37-company run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
afd8174bbd |
fix(F11-F13): scout selection bugs that dropped roles before any judgement
These three all cost roles BEFORE a human ever read them, which is the expensive kind of defect: a job that never reaches the report cannot be evaluated at all. F11 - dedupe by requisition, not title - The old rule collapsed everything sharing a normalised title within one employer. Two different reqs called "Senior Data Engineer" in Bern and Zurich became one row, and different teams hiring the same title vanished. - Requisition identity is now the key, parsed from the URL with the same patterns the decision log uses, employer-scoped so two boards cannot collide. - The legitimate case the old rule existed for - one role republished per location - is a SAME-REQUISITION case, so those merge their locations. - A shared title across different requisitions is now a warning, never a deletion. F12 - location filters - Substring matching accepted "Bernau bei Berlin" as Bern. Place matching is now whole-word. - Thun, Zimmerwald, Baar, Olten and ~25 more Swiss towns were rejected outright when the adapter supplied no country. Zimmerwald is the Kdo Cy site he applied to; Thun is where he lives. - Aarhus, Odense and other Danish cities added alongside Copenhagen. - A stray "Europe" no longer implies remote eligibility next to an explicit onsite marker or a single-country residence restriction. - All 14 cases named in the review now resolve correctly. F13 - decision identity - The generic fallback key dropped the query string, so /vacancy?job=1 and ?job=2 were the same key and one decision silently covered both. Identifying query parameters are now kept; tracking noise is not. - The READ path had no slug fallback although the WRITE path got one on 2026-09-04. Every RUAG repost therefore came back undecided despite a recorded decision - which is what happened to Lead-Architekt Network- und Richtfunk on 2026-09-10, days after 63 RUAG rule-outs were written. - Both paths now share `lookup_decision`. Verified on a live RUAG run: 7 reposted requisitions recovered their decisions. - A slug match is reported as RELATED with the matched URL, never applied as if it were the same requisition: a repost can differ materially, as RUAG demonstrated when it moved a disqualifier into a job title. tests/test_scout_matching.py added. Full suite 34/34 pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
3519b2ffe7 |
fix(F08-F10): machine-checkable evidence, honest templates, demoted GPA
F08 - evidence metadata - Only 1 of 26 claims carried structured source/last_verified/ownership, which is why recency and reference checks could not run. Added an evidence_schema block and an evidence block on all 26 claims. - 8 dates were recovered from each claim's OWN recorded text; the other 18 are written as the literal "unrecorded". Nothing was inferred. "unrecorded" means nobody wrote it down, NOT that the claim is unevidenced - most carry evidence in their free-text scope. - Coverage is reported as an advisory warning, never a gate: failing on it would push a future session to invent dates to clear the run. F09 - templates - resume_template.tex asserted "12+ years of production software experience". It does not hold: canonical employment starts 2014-11 (~11y10m) and the VISIBLE chronology starts 2015-05 (~11y4m) because Capgemini is omitted. Now "over ten years", with the arithmetic and the no-date-math rule inline. - cv_template.tex still carries page targets, rendered-line budgets and 2L/3L variants the project dropped. Banner-marked as the ACADEMIC legacy path so it is not reached for whenever a posting says "CV". F10 - US GPA - The modified Bavarian formula converts FOREIGN grades INTO the German system. Inverting it to produce a US GPA is not a recognised method, and the TUM source calls even its forward calculator orientation only. - Fields renamed to final_grade_us_4pt_orientation_only with that caveat. The German grades remain the canonical facts. If a recipient publishes its own conversion, use theirs and record which was used. Validator PASS (1 advisory), 31/31 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
ce5b7f511f |
fix(F07): propagate recorded corrections into active writing sources
The review's key point is that the error ran BOTH ways. Overstatement, narrowed to canonical scope: - BS-1 variants claimed "eliminated manual wafer inspection", "no manual intervention" and "unattended quality monitoring". Canonical BS-1 supports a qualitative reduction whose size is unverified. Reworded; the scope limit is now stated inline where the variants are written. - bundle_data_platform called BS-1 a "zero-downtime constrained deployment". Integration into a fab that runs continuously is not a measured zero-downtime property. - experience_swisscom carried "grounded retrieval" as a skill and ATS keyword while SW-8 records retrieval implementation as explicitly unknown, and its reframing note invited "evaluation discipline" although formal model evaluation is a globally forbidden pattern. Both removed. - PyTorch sat in bundle_ml_ai_engineer as a bold tool and an ATS must-include with no certification context - the exact way the context gets lost. Undervaluation, the half that quietly costs him roles: - BS-6 (Linux administration, intensive Ansible incl. self-written extensions) has been canonical since 2026-08-27 but appeared in NO bundle, so the normal selection paths could not see it. Added to the data-platform and data-engineer bundles with its currency limit (employer-side ended Dec 2022; PP-3 is personal) and the standing GitOps prohibition. - Linux, Ansible and Bash were missing from skills_taxonomy entirely. - skills_taxonomy still said the IBM certification year was "not recorded" and that PyTorch needed verification; both were settled on 2026-08-27. Not rewritten, deliberately: the NVIDIA and RUAG cover letters state the production line could not be stopped. That exceeds the canonical record but is plausible and both are already submitted. Recorded as an OPEN ITEM in experience_bosch.md to be confirmed with the user before any reuse. Validator PASS, 31/31 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
fc5f3e49ba |
fix: review findings F03-F06 — quotas, rule hierarchy and a validator that checks
F03 — application records
- Quota already removed with F02's tracker; verified uncapped and that
"interview reached" survives a later withdrawal.
- Aker BP: application date confirmed 2026-07-29 by the user, settling the
one-day conflict. Its Adjacent-despite-79 classification is kept, NOT
reclassified: the user does not remember the rationale and judged it
immaterial on a closed role, and silently reclassifying to make the
arithmetic tidy is the exact objection the review raised. Recorded as an
explicit override reason with a rubric version instead.
F04 — rule hierarchy
- Three levels stated in AGENTS.md and CLAUDE.md: immutable evidence rules,
standing user preferences, market/employer presentation.
- Deliverables separated from QA. The .tex stays the artefact of record; you
still compile, into the application's own output/ folder, because the user
cannot approve what he cannot open.
- `resume_reference.md` said "Capgemini/Bundeswehr: include only when directly
relevant", contradicting the standing never-include rule. Split and fixed.
F05 — a green validator now means something
- Per-claim `forbidden` wording is enforced. 14 of 26 claims carried such a
list and NONE of it was checked, which is why "owned the full ML lifecycle"
passed. Matching tolerates inserted adjectives: the real regression read
"Built a decentralized Data Mesh" and one word defeated the literal list.
- Added identity (e-mail/phone), employer-date, placeholder and
document-exclusion checks. Capgemini's omission rule now has a canonical
home in claims.json instead of living only in memory and config.md.
- Registered Groovy and Snowflake as forbidden skills. Both were absent from
claims.json entirely, so "forbidden" existed in prose with nothing enforcing
it.
- PASS no longer reads as a truth certificate: it prints what it did not check
— scope implications, bullet-to-claim support, whether a number is real.
F06 — the scanner stopped fighting the documents
- LaTeX comments are no longer claims; `% never claim Terraform` was a finding
before, which taught the workflow to write around the checker.
- Markup, accent macros and umlauts are normalized, so `\textbf{Snow}flake`
cannot smuggle a forbidden skill past a substring test and
`Universit\"at der Bundeswehr M\"unchen` is recognisably a school.
- Honest denials pass in English and German.
- The triple-list cadence hint knew only English "and", so it silently did
nothing on every German package. Advisory only, and now labelled as such.
Verification
- The six counter-proofs from the report are caught: 9 errors on one synthetic
document, where the old scanner found none.
- All six packages built under current rules scan clean — SBB, NVIDIA, RUAG,
Kdo Cy, Citadel, Aker BP. Four false positives of my own were found and fixed
on the way there; each is now a regression test.
- 13 older packages do report findings. Those look like genuine historical
violations and are deliberately NOT fixed here: F17 governs archives and they
must not be silently rewritten.
- `tests/test_document_scanner.py` added. Full suite 31/31 pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
|
||
|
|
afdef7eb94 |
refactor: shared agent workflows (F01) and one application registry (F02)
Checkpoint for the 2026-09-11 project review remediation. Work by a previous agent that ran out of context; committed unchanged as a rollback point before the remaining findings land on top of it. F01 — the two agent directories had drifted into different processes - Six shared workflows under `resume_builder/reference/workflows/`; both `.agents/skills/` and `.claude/skills/` are now thin entrypoints that route to the same file instead of carrying full copies. - The `.claude` copies were the stale side: fixed bullet line variants and character budgets that the newer process had already dropped. Removing them is the point of the change, not collateral. - Parity/link regression test added; corrected the top-level file map, which pointed at a directory that does not exist. F02 — application status was stored in four places and disagreed - New registry `job_scout/state/applications.json` (26 records) with `application_records.py` (schema, validation, transactional write) and `application_tracker.py` (add/update, no quota). - AGENTS.md and CLAUDE.md no longer keep their own status tables; both point at `current_applications.md`, generated from the registry. - Interview-reached is now independent of outcome, so a withdrawal after an interview can record both facts. The old tables are preserved verbatim in `job_scout/state/history/application_status_before_2026-09-11.json`. Verification: `python -m unittest discover -s tests -v` — 18/18 pass. Spot-checked that the detailed SBB and Kdo Cy notes survived the migration into the registry rather than being flattened. Known unresolved, deliberately not invented (see FIX_PROGRESS.md): Aker BP's application date and its Adjacent-despite-79 classification. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
0d999ab21b |
feat(scout): automate Kdo Cy via Prospective API; close SBB and Kdo Cy
Scout - New `prospective` adapter for ohws.prospective.ch, wired up as `kdocy` (jobs.admin.ch, filtered to Kommando Cyber). jobs.admin.ch is an S3-hosted SPA that returns AccessDenied to any direct fetch, headless included, so the site cannot be scraped -- but the SPA reads a public, unauthenticated API. All 463 federal roles in ~2.4s, against RUAG's 35s Playwright scrape. - This board is richer than any other source: Lohnklasse, application deadline, a named contact per posting, and the full Aufgaben/Anforderungen body, so scoring runs against the JD text rather than the title. - Thread `deadline` through normalization, the markdown report and the JSON dump. A board with hard deadlines needs them on the row. - Match `verwaltungseinheit_*` by prefix: the sub-unit key is department specific (VBS 1083398, EFD 1083364) and hardcoding one breaks reuse. - MANUAL_CHECK entry for the Bundeswehr Reserve portal. The data is reachable (SAP E-Recruiting OData, SearchCategory 0022) but the portal actively blocks automation, and getting through needs UA spoofing plus masking navigator.webdriver. Not wired up by choice -- the operator-sanctioned Suchauftrag/job alert is the better channel. Reasoning is in the comment. Applications - SBB Data Engineer 103755: interviewed 2026-09-09, WITHDRAWN by the candidate 2026-09-11. Net downgrade on four axes (41h vs 40h, 25+Brueckentage vs 28+5, 3 vs 2 office days, and Anforderungsniveau K tops out ~145k against ~135k inside a band running to ~160k -- he would enter K at its ceiling merely to break even). The cohort's only interview, and it ended as his no, not theirs. - Kdo Cy DevOps Engineer III: REJECTED 2026-09-10, 14 days, no interview. Form letter with no diagnostic content. Identical on every recorded dimension to SBB (core / 79 / gate pass / DQ 92 / weak channel) and the two went opposite ways -- recorded as worth watching, not as evidence for the channel thesis. - Citadel row cleaned up: it claimed the cohort and decision-log entries were deliberately unwritten while its own status line read SUBMITTED. Both exist. The next-step cell still said "ask BEFORE building the package" two weeks after submission. Decision log - 69 RUAG rows -> 3 undecided. 63 title/family rule-outs, each noting that it is not a JD read, plus three that are: Test Manager C5I, System Engineer C5I, ICT Solution Architect. Guarded against the shared F/A-18 slug so one write could not silently swallow the other. Note: the K->L/Kader rule is SBB-specific and was deliberately narrowed -- Anforderungsniveau is SBB's own system and does not map onto jobs.admin.ch (Lohnklassen), RUAG or PostFinance. Thun-area employers sit outside the Bern salary logic entirely. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM |
||
|
|
a0ec2fedb5 |
feat: NVIDIA Sr DevOps application, drop cohort caps, fix Workday/decision-log bugs
Scout run 2026-09-04 (36 companies, 778 eligible) plus the NVIDIA package it surfaced, and the tooling and policy fixes found along the way. Application - NVIDIA Senior DevOps Engineer, Zurich (JR2024256): submitted 2026-09-05. Evidence Fit 64/100 Stretch, hard gate FAIL x2, channel Weak. Sent on an explicit user override with the working model unresolved, so hybrid-vs-onsite is a live screening topic. 2pp resume + 1pp cover letter, both validators PASS, 0 boxes, 0 Tier 1 findings open. Policy - Drop the 7 Core / 2 Adjacent / 1 Stretch cohort caps. They had no derivation and were overridden whenever they bound, and the cohort was confounded: it tested fit class while holding channel constant at Weak across all six applications. Keep the recording, drop the rationing. - Channel replaces the slot budget as the rationed variable: no application goes out cold when a named contact is published and reachable. - Propagated through shared_ops, session_file_template, cohort_tracker (counts, never counts-against-a-target) and application_cohort.json. Tool fixes - fetch_workday emitted 404 URLs for every Workday company (NVIDIA, Novartis, Equinor): externalPath is site-relative and needs the locale + site prefix. 6/6 short-form 404, 3/3 long-form 200. 773 dead links repaired across 42 archived reports. - find_decision_url silently de-linked decisions on two boards, which is why ruled-out roles kept resurfacing as undecided. RUAG rotates its UUID on repost; BIS migrated its vacancy URL scheme, orphaning 5 decisions including a live application. Fixed as a two-tier match, not a slug key -- slugs collide (two live RUAG reqs shared one). Knowledge base - claims.json: add Bash / shell scripting, the third canonical gap of this shape after Ansible and Linux administration. - bundle_data_platform: BS-4 was framed as a delivered observability stack over what claims.json calls a proof of concept -- the defect the 2026-08-21 sweep was told to look for. - CLAUDE.md and AGENTS.md: correct the RUAG Data Lakehouse shortlist claim, which the JD does not support and which both files still asserted. - resume_template: comment-guard the missing babel/ngerman language block. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QFb8tTCig5r1KzkQiNXcYt |
||
|
|
89af779bf3 |
docs(sbb): add total-comp break-even worksheet
The deciding question on 2026-09-09 is a number nobody has, so the worksheet is a frame to complete before the call rather than a filled-in answer: Anforderungsniveau K is not public, which is why Q1 exists. Records the three things that make a Swiss base-to-base comparison lie: the free GA, Regionalzulage and employer pension share are real money invisible in a base figure, while a Swisscom bonus is real money SBB will not match; the GA is a taxable Lohnausweis benefit so its net value sits below list price; and the GA and the "commute saving" are the same franken, so counting both flatters SBB by four figures. K is a capped GAV band with no negotiation lever at the top, so this is a yes/no against a fixed number, not an opening position. User's read is that it will not clear. Taking the call regardless: the questions are worth asking, it is interview practice while NATO JWC, BIS and Microsoft Principal are still live, and the K figure is the first real data point on what the entire Bern/Thun local tier pays - RUAG, Swissgrid, BKW and BFH sit in comparable band structures. Worth recording whatever the outcome. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk |
||
|
|
9a188cafef |
feat(sbb): interview invitation 2026-09-09, write interview brief
SBB Data Engineer (Job ID 103755): invited 2026-08-28 for Wednesday 9 September 2026, 08:30, 45 min on Teams. Per the posting's own process this is stage 2 of 4 - "Virtuelles Kennenlernen mit HR und Fuehrungskraft" - so HR together with Andri Wienandts, not a pure HR screen. 45 minutes shared between two people, which is the practical constraint the brief is built around. Two facts worth recording: - This is the FIRST conversion of the evidence-first cohort (6 applications, 2 rejections), and it came from a COLD submit. The channel plan called for phoning Wienandts before applying; that never happened, so the published warm contact went unused. - The resume never contained Snowflake, dbt or Power BI - the three literals an ATS keyword screen would have keyed on, and a risk the session had explicitly recorded as "accepted, not solvable". It did not filter him out, so a human read the dossier and the honest substitution framing survived first contact. One data point; not enough to revise strategy on, but it is evidence against assuming honest omissions are fatal at the screen. Brief covers the four questions that must not go unasked (Anforderungs- niveau K band, design/architecture scope vs current Staff + Component Owner level, RAMSI's Java/Spring Boot/Angular share, Kidz Care rate), the substitution answers for each named-but-non-canonical tool, the swissTAMP/RIS/MUD context, and the thesis boundary - methods prototype, no operational data, no accuracy figures, PSO surveyed only. It also asks him to decide three things before the call rather than on camera: what he does if K lands at 130-150k, if architecture is set elsewhere, or if RAMSI turns out to be heavily Angular. Any one can be a no, and the level question is the same shape as the declined BKW. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk |
||
|
|
a0f844c143 |
feat(ruag): submit AI Engineer C5I, and record the Kdo Cy package
RUAG C5I - AI Engineer C5I (Thun, app ID 18027): SUBMITTED 2026-08-27. Evidence Fit 74/100, fit class Stretch, title-capability hard gate FAIL (R1 build/operate the AI-LLM platform and R2 in-house LLM/retrieval are Adjacent, not Direct) - all knowingly accepted under the user's explicit Phase 0 override. Consumes the cohort's sole Stretch slot: cohort is now 6/10, Stretch 1/1. Critique ran twice. Round 1 scored the documents 85/100 and raised three Tier 1 items; Round 2, after the fixes, scores 93/100 with truth and provenance 24/25 and zero Tier 1 findings. Evidence Fit did not move and was not allowed to: PP-3 is a personal project and cannot convert an Adjacent title-capability into a Direct one. Documents (.tex is the deliverable; PDFs are gitignored): - resume 2pp/13 bullets, letter 1pp/295 words, both validators PASS - headline is now the canonical title "Staff Data, Analytics & AI Engineer", which puts the req's own word above the fold - PP-3 added as a Projekte section - the only current Linux/hardening evidence, since BS-6 ended Dec 2022 - the letter names the AI-platform gap in one sentence, then connects SW-5 to C5I's stated DevSecOps model - "governte" -> "governance-konforme"; JD term coverage 18/22 -> 22/22 claimable, with all six gap terms still correctly absent Two defects found and fixed that the first critique missed: - the resume never loaded babel, so a German document was hyphenated with English patterns (Hal-bleiterfertigung, Tran-skription). Fixed with babel[ngerman] plus a Transkription exception; this also cleared an overfull box. Check this on every future German package - resume_template.tex likely has the same omission. - IBM AI Engineering had no primary-source record. Certificate read directly (IBM via Coursera, 4 Jun 2020, verify 3ZBZFVAL6A34), recorded as entry #8; it also proves PyTorch, now evidence: certification. Also included: the submitted Kdo Cy DevOps Engineer III package, the Capgemini omit rule promoted into config.md, BW-1 canonicalized in experience_bundeswehr.md, and a scout.py comment correcting the telenorgroup slug from "near-empty" to a claimed board serving stale phantom listings that DEMO_TITLES would not catch. Compensation, PSP/project eligibility and role level were never resolved before sending and are now live screening topics. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk |
||
|
|
93b0fc5b76 |
chore(akerbp): record rejection, cold channel and slot stays consumed
Rejected 2026-08-27, no interview, ~28 days after submission. Recorded
in all four places that track an outcome: cohort state, decision log,
the Active Sessions row and the session file's status block.
The cohort slot is not freed. A rejection consumes an attempt the same
way a submission does, so the Adjacent count stays 2/2 and the cohort
stays 4/10 - unlike the Google FDE III and AWS FDE no-gos, which were
declined before a package existed.
Recorded as rejected_no_interview on the evidence: nothing in the log
shows any contact after submission. Recruiter-vs-hiring-manager
disposition is a tracked cohort variable, so this is one edit away from
being corrected if a screen did happen.
The package was validator PASS with no Tier 1 truth findings and the
follow-up email to Per Olav Marthinsen was never actioned, making this a
pure cold submit. A cold-channel no-interview rejection does not
implicate document quality on its own. That is now 2 of 4 cohort
applications rejected without interview, both cold, which fits the
channel thesis already in the log - and application_strategy.md forbids
reacting to a single rejection, so no positioning or targeting changed.
The Norway lane is explicitly not closed. NATO JWC Stavanger is still
live and strong Norwegian employers remain in scope; both the row and
the decision note say so, because with Aker BP closed the earlier
Equinor note ("lane now reduced to the open Aker BP application") would
otherwise read as an implied closure.
Submission date left inconsistent on purpose: the contemporaneous
records say 2026-07-29, the retrospective ones 2026-07-30. Both now
carry a note pointing at the other rather than one being overwritten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk
|
||
|
|
420e205e37 |
fix(kb): settle ECTS B as the 10-35% band, 'top 35%' is correct
ECTS grade B is the next 25% after the top 10%, so the accurate phrasing is 'top 35%'. The record's original value was right; the 'top 30%' considered yesterday was the error, now removed rather than left as an open question. The field also now says never to narrow B to a point estimate. B is a band, and quoting 'top 30%' or 'top 25%' overstates the standing - the kind of small, checkable claim that costs credibility for no gain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
124f5d4953 |
feat(kb): record degree final grades and US 4.0 conversions
A Citadel application form asked for GPA and neither degree's Abschlussnote existed anywhere in claims.json - only the M.Eng. thesis grade. The single lead was an old CV extraction whose own provenance note disclaims it and which already carries a known error, so it was not safe to convert from. User confirmed both directly: M.Eng. 1.6 and B.Eng. 2.4 on the German 1.0-4.0 scale. US 4.0 equivalents recorded via the modified Bavarian formula, which simplifies to 5.0 - G: 3.4 and 2.6. Both fields carry usage rules, because a converted grade is easy to misuse. They are for application forms and credential checks only, never to be presented as a natively awarded GPA, and the German scale must always be stated alongside - particularly for the bachelor, where the conversion makes a solid "gut" read weaker to a US audience than it is. Also flagged a percentile that does not agree with itself. The relative grade is ECTS B, but this record said top 35%, the user said top 30%, and ECTS B is formally the next 25% after the top 10%. Rather than pick one, the field now says to check the certificate and notes that quoting "ECTS grade B" alone is always safe. A specific percentile on an application is exactly the kind of small number that a credential check can contradict. New grade_output_rule: neither grade belongs on a resume or in a cover letter by default. Industry resumes omit grades, and the thesis 1.0 is the only figure worth surfacing where academic performance is valued. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
5cd5f49aa5 |
chore(citadel): record submission, and the form had no Zurich option
Submitted 2026-08-26. Cohort entry added (Adjacent 2/2, cohort now 4/10, channel weak x3) and decision logged. The finding that matters is not the submission. The application form's preferred-work-location selector offered no Zurich, despite the JD body reading "in Miami, Zurich or New York", the posting header listing Zurich, and the site's own Zurich location filter returning this exact req when checked on 2026-08-25. The careers site footer reads Citadel Enterprise Americas LLC, so the likeliest explanation is a US-entity apply flow with European seats routed elsewhere, or a Zurich seat that is closed while the multi-location posting stands. This partly supersedes the working-model risk that blocked Phase 2. If no Zurich seat is reachable through that form, whether Zurich runs hybrid or five-day onsite is moot, and the application may be sitting against a US requisition - a hard no under the standing no-relocation constraint. Carry-forward rule recorded in both CLAUDE.md and the session file: check the application form's location selector before investing in a package. Two independent signals - the posting's stated locations and the employer's own location filter - both proved unreliable as evidence that a seat is actually reachable. Phase 0 treated the filter result as confirmation that the req was live in Zurich; that inference was weaker than it looked. Package itself is finished and reusable: both documents cleared the validator with zero warnings and the Tier 1 fixes lifted JD term coverage from 51% to 68%. Nothing about the documents is the weak point. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
0c34bd0347 |
chore(citadel): finalize package, hold submission records
Finalization per shared_ops.md. Both submitted documents re-validated: resume and cover letter each PASS with zero warnings. Final PDFs copied to Dennis_Thiessen_Resume.pdf and Dennis_Thiessen_Cover_Letter.pdf. Steps 5 and 6 - submission date and cohort entry - are deliberately not done. The user directed "apply as is" but has not confirmed the application was actually sent, and stamping today's date on a submission that may happen tomorrow corrupts the log that every cohort and disposition-timing judgement is read from. Both commands are written out in the session file, ready to run on confirmation. This is the same discipline applied to the SBB Wienandts call: record what happened, not what was intended. The critique stays STALE by choice rather than being re-run: it scored the pre-Tier-1 resume and predates the cover letter. The estimated ~91 post-edit Document Quality is flagged in both the session file and here as an estimate that must never be quoted as a score. The working-model question is unresolved and now travels with the application rather than blocking it, which is the user's call and a reasonable one now that the package exists: clarifying first only pays off in the branch where a cold application gets a call. It must be asked at first recruiter contact. If Zurich is 5-day onsite this is a decline on the Bern constraint no matter how the process goes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
57c5a388a9 |
docs(citadel): record cover letter in session file
The session update in
|
||
|
|
f8b4cd3473 |
feat(citadel): cover letter, and fix SW-1 scope traps in two more bundles
Cover letter: 1 page, 270 words, 3 paragraphs, validator PASS. Carries the one thing the resume structurally cannot - why a Swisscom data engineer credibly wants a research-platform seat at a market maker, which against an ex-FAANG field is the main differentiator. Deliberately uses no external hooks. cl_reference.md says to omit an unnecessary hook rather than spend words proving company familiarity, so the only hook is the JD's own language, scraped verbatim and first-party. No named executives: nothing to verify, and nothing that reads as name-dropping. The letter also states the R1 gap plainly rather than hiding it, because a technical reviewer will find it in the first question anyway and owning it is stronger than being caught by it. PP-1 appears with its personal-project label and an explicit "I make no claims for its results". Separately, loading the bundles for this letter surfaced two live scope traps. The 2026-08-21 correction that fixed the SW-1 violation in bundle_data_engineer.md ended with "check the other four bundles for the same pattern". That sweep was never done, and two of them carried it: bundle_data_platform.md - the S5 cover-letter hook read "migrating Swisscom's legacy ETL stack to a cloud-native AWS platform", and its narrative thread said "migrating an entire ETL infrastructure". Both pair a full-ownership framing with a company-scale object, which claims.json SW-1 forbids outright. bundle_ml_ai_engineer.md - the SW-1 reframing row read "Built cloud-native data infrastructure on AWS ... the scalable data layer", which is both a full-ownership verb on an org-scale object and an unverified scale claim. Both rewritten to the scoped form with inline scope warnings, matching the data_engineer fix. bundle_analytics_engineer.md and bundle_semiconductor.md were checked and are clean. These were loaded traps: any future cover letter built from either bundle would have started from a sentence claims.json forbids. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
c94edbce44 |
fix(citadel): apply Tier 1 relevance fixes, JD coverage 51% -> 68%
All three Tier 1 items from the critique, all honestly available, no claim altered. The R2 vocabulary now appears where R2 is actually evidenced: the SW-7 bullet carries ingestion and lifecycle, and SW-1 carries transformation and storage. R2 was the single core responsibility scored Direct, and the document had been proving it in substance while missing it in the JD's own words. SW-2 now names the Oracle/Kafka/Python/Teradata estate a distributed system he operates - not one he designed, which stays a gap. The second skills line is relabelled "Distributed systems" and names distributed databases explicitly, closing the fifth preferred-technology hit that Phase 0 counted as Direct but the resume never actually wrote. Recorded what was deliberately not added, because raising keyword coverage is exactly where a later run would be tempted to overreach: "scalable" is an unverified scale claim, and SDK, high-throughput, data-intensive, simulation, model development and self-service have no canonical evidence. Verified still absent after the edit. Scope kept to what was approved. The user said "tier 1 fixes", so the Tier 2 headline retitle - "Production Data Platforms on AWS", the line most likely to draw the opening challenge from a technical reviewer - was left in place for them to decide. Validator PASS with zero warnings: the 58% cadence warning cleared as a side effect, because restructuring two bullets with em-dashes broke the comma-list pattern the checker keys on. Still exactly 2 pages, zero overfull/underfull boxes, PDF re-inspected. Critique marked STALE - it scored the pre-edit document. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
7953884810 |
feat(citadel): critique the resume - Document Quality 86/100
No Tier 1 truth findings, validator PASS, and the claim audit clears every material claim including the PP-1 block, which carries its personal-project label three times and no performance figure. The one real weakness is that the document under-uses the JD's own language for the responsibility it matches best. R2 - ingestion, transformation, storage and lifecycle management of large datasets - is the single core responsibility scored Direct and is close to a plain description of SW-1 and SW-7, yet none of those four words appears in the resume body. Two related misses: "distributed systems" never appears as a phrase even though Q4 is a required qualification scored Direct, so the nearest exact match sits on an eight-year-old Vizrt bullet rather than current work; and "distributed databases" was called a Direct preferred hit in Phase 0 but is only ever implied through product names. Three Tier 1 fixes, all honestly available, worth roughly +4. Recorded what must NOT be added, since the obvious way to raise keyword coverage is the wrong one: "scalable" is an unverified scale claim that ai_fingerprint_rules forbids, and SDK, high-throughput, data-intensive, simulation, model development and self-service have zero canonical evidence. Their absence is correct, not a defect. Flagged the headline "Production Data Platforms on AWS" as Tier 2. It carries no ownership verb so it is not a scope violation, but it is the most prominent line in the document and leans toward exactly the platform framing R1 is a gap on - the likeliest opening challenge from a technical reviewer. Scored against critique_framework.md section 9. The SKILL.md 8-dimension table with "Publications 10%" is a stale CV-era scheme and was not used, the same conflict class as its "all bullets 2L" line. The verdict does not change the decision. Document quality is not the constraint here: the working model is still unresolved and the channel is still cold. 86 is not submit-ready. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
89f9af5d89 |
feat(citadel): 2-page resume for Citadel Securities Platform Engineer
13 bullets, validator PASS, compiles to exactly 2 pages, rendered PDF inspected clean - no clipping, orphans, header wrapping or bad breaks. Built at the user's direction with the working-model question still open. That block stands: if the Zurich seat is 5-day onsite, this package does not get submitted. Recorded in the session file rather than quietly dropped. Three Phase 2 decisions the user left open, taken and marked reversible. VZ-1 is in - it is the only canonical evidence pairing C++ with a distributed backend and this JD names both, hedged verb preserved. A Personal Project section carries PP-1, labelled three separate ways and with no performance figure of any kind; PP-2 appears as supporting coursework, never as a credential. Generali is kept against the Phase 1 "omit" recommendation, because dropping it opened an unexplained May 2015 to Jun 2017 employment gap that costs more than the weak bullet. Cadence sits at 7/12 (58%), above the section 7a guide of ~50%, down from 75% after reshaping two bullets. The rest are legitimate technology enumerations - "Oracle, Kafka, Python and Teradata", "Elasticsearch, Logstash, Kibana and Kafka". The checker added yesterday cannot tell a rhetorical rule-of-three from a list of tools actually used, which is a real limitation of the pattern rather than a defect in this document. Cutting them would delete accurate ATS-relevant names, which section 7a itself forbids. Left deliberately. Also walked into the trap the SBB .tex header warns about: the first draft named the excluded non-canonical tools in a comment explaining why they were excluded, and the validator errored on all three because it scans raw file text. Comment rewritten without naming them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
0eda29327a |
fix(citadel): working model unresolved - block Phase 2, 74 -> 71
The user asked whether Citadel has a hybrid model. The JD is silent: grepping the verbatim posting for hybrid, remote, onsite, in-office and days per week returns zero matches. Phase 0 scored practical constraints 5/5 on an unexamined assumption that Zurich was workable. Withdrawn. Ken Griffin is on record that Citadel returned to the office five days a week, early and deliberately, and calls it his most important leadership decision of the past seven years - framed as core apprenticeship culture rather than a policy setting. The only contrary evidence is an anonymous 2022 Fishbowl post about Operations claiming three days minimum: four years stale, wrong division, contradicted by the founder on record. No official Citadel Securities Zurich policy statement could be found. If five-day onsite holds for Zurich, it means roughly 2 to 2.5 hours of commuting per day from Bern, or relocating - which breaks both the Bern-based, 2-3 day hybrid bar in user_comp_bar and the "keep a Swiss home base" constraint in user_international_mobility. Practical constraints 5/5 -> 2/5 (language and authorization stay clean: English working language, EU citizen, Swiss B permit). Evidence Fit 74 -> 71, still Adjacent but mid-band rather than a point below Core. More consequential than the number: critique_framework.md treats an unresolved location or relocation constraint as a NO-GO trigger, so the qualifications gate passes while the practical gate does not. Phase 2 is blocked pending an answer. This has to be asked, not researched - the same class of question as the SBB Anforderungsniveau K band. Recording the sequencing explicitly, because SBB was submitted with its equivalent question still open and that question is now a live screening topic instead of a settled fact. Repeating it here should be a deliberate choice, not an oversight. The Phase 1 bullet plan is written and unaffected: 11 recommended, 14 with options, budget PASS. Two items still open - the Vizrt VZ-1 C++/distributed bullet the user previously skipped on Snowflake, and adding a Projects section for PP-1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
ec5be5f2ed |
feat(citadel): Phase 0 for Citadel Securities Platform Engineer, Zurich
Evidence Fit 74/100, Adjacent at the top of the band, hard gate PASS with one flagged risk. Phase 1 not started - user asked for Phase 0 only. The stack alignment is the best in the log: zero Gaps across all seven minimum qualifications, and all five preferred technologies (Kafka, Kubernetes, Spark, Airflow, distributed databases) are Direct and production-current. What holds it at 74 is that the title-defining function splits. R2 - ingestion, transformation, storage and lifecycle management of large datasets - is Direct and describes SW-1/SW-7 almost word for word. R1 - design and build the distributed research platform itself - is Adjacent, the same authoring-vs-building shape as Aker BP, and it cannot be written around: Scope Discipline forbids pairing a full-ownership verb with an org-scale object, so it can only be honestly bridged. Recorded the classification conflict rather than hiding it. application_strategy.md says a defining responsibility that is only Adjacent makes the role Stretch; that strict reading applies to R1. It is filed as Adjacent because R2 is equally title-defining and is Direct, and because Aker BP set that precedent at 79. Both cohort slots are free either way, so the label changes nothing operationally. Corrections the user was right about, now recorded so a later run does not repeat them: Go is NOT a gap, because Q3 is disjunctive and Python satisfies it outright; and a production Kafka/K8s/Spark/Airflow estate IS a distributed system, so Q4 is Direct rather than a stretch. Two traps written down explicitly. The $175,000-350,000 base range is a US pay-transparency disclosure under NY law and says nothing about the Zurich figure - it must be asked, not assumed. And the sibling reqs that web search surfaces as closer title matches (Research Platform - Data Platform Engineer, Research Platform Infrastructure Engineer) are dead: 404 and Cloudflare-blocked, absent from the live board. Those Built In listings are stale. JD saved verbatim via Playwright; WebFetch returns 403 on this host. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
b97dec978a |
feat(kb): add trading-domain evidence as PP-1 and PP-2
claims.json had zero hits for trading, finance or quant, so a real capability could not legally reach any document: the file is the highest-authority source and nothing outside it is claimable. Surfaced while assessing the Citadel Securities Platform Engineer req (Zurich), where domain fluency is exactly what was missing. PP-1 is the self-built investing/signal platform: US-equity price, fundamental and LLM-assisted sentiment ingestion, a long-only cross-sectional residual 12-1 momentum book with ATR stop/trail and max 15 concurrent names, scheduled scan and backtest pipelines, web dashboard and Telegram alerts. PP-2 is the Udacity AI for Trading nanodegree. Two allowed-with-context skills reference both. Written defensively, because this is the kind of entry a later run inflates. Each carries an explicit forbidden list: no PnL, Sharpe, return or backtest figure may EVER be quoted (none is verified); PP-1 is single-user and self-hosted, so never distributed, scalable, production or multi-user; neither implies professional quantitative, trading or finance experience; the nanodegree is never an academic or quant credential. Legitimate use is self-directed domain fluency plus an end-to-end ingestion/backtest/alerting build outside work. PP-1 is also the one claim where full-ownership verbs are correct - it is genuinely solo, unlike the employer work that Scope Discipline governs. Stated in the scope so the two rules do not collide later. JSON valid, validator PASS, 9/9 tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
92a81a7dcb |
feat(resume): check bullet cadence variety, warn-only
An audit of all 18 packages in output/ (368 bullets) found one rhythm
running through every document: 45% of bullets used the same "X, Y and
Z" triple, and the SBB package reached 85% - 11 of 13 bullets, every
Swisscom and Bosch line - plus two adjacent bullets both opening
"Build and...".
This is a style finding, not a truth finding. Every bullet was accurate.
The corpus is clean on the axes that actually signal generated text: no
AI vocabulary (0 hits for leverage/spearheaded/robust/passionate and 56
others across 35 documents), prose em-dashes at 0.08/bullet, and PDF
metadata carrying nothing but MiKTeX pdfTeX with empty Author/Title
(0 AI tokens and 0 generator-term leaks across 69 PDFs). What is left is
cadence: ten bullets sharing one three-beat rhythm read as machine-made
even when nothing in them is false.
Guarded deliberately so it cannot do harm. cadence_checks() emits WARN
and never ERROR, the critique deduction caps at 1 point, and both the
reference and the docstring state that no claim, scope or hedged verb
may be bent to satisfy rhythm. An anti-monotony rule with teeth would be
worse than the problem - it would pressure a future run into loosening a
scoped claim to vary a sentence.
Thresholds are calibrated on the corpus, not guessed. Position length
spreads are bimodal (1-9 words, then 15-17), so the check flags a spread
of <=4, the tight tail at ~28% of positions; the first draft used <=6
and flagged the median. Also fixed the opening-verb extractor, which
read \textbf{Owned ...} as the word "textbf" and produced six false
positives on one document. Per-package warnings now run 0-3.
Docs: resume_reference.md 7a + verification step, critical_rules.md 7a,
critique_framework.md mechanics row, CLAUDE.md corrections log.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
|
||
|
|
af7189a93d |
chore(scout): version the application cohort tracker
application_cohort.json was caught by the blanket job_scout/state/* ignore, so the cohort slot record (core/adjacent/stretch mix and every application's fit class, evidence fit, hard gate and outcome) existed only on one machine. decisions.json escaped the same rule only because it had been tracked before the rule was added - an accident of history, not a decision. Both files are durable application history and belong in the repo. The churny scan state (seen_jobs.json, last_scrape.json) stays ignored, as does reports/ - all of it is regenerable by re-running the scout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
e53abd4ff6 |
chore(log): submit SBB, close Snowflake, correct Norway lane framing
Application log updates from the 2026-08-24 scout run and the days after. SBB Data Engineer (Asset Management, Bern, job 103755): SUBMITTED 2026-08-25. Consumes Core slot 2/7 in evidence-first-2026-01. Submitted with the Anforderungsniveau K comp question still unresolved, against the channel plan and the critique's closing advice, so the K band, the design-vs-build-and-run scope question and the Kidz Care rate are now screening-call topics rather than pre-cleared facts. Next action changed from "call then submit" to "prep an interview brief". The stale pointer to an /edit-resume Tier 1 fix is removed - that fix landed 2026-08-21. Snowflake Sr SWE Enterprise (Observe): CLOSED - NO RESPONSE at 80 days silent, past the longest real disposition in the log (Equinor, 79). Recorded as closed_no_response, deliberately NOT as a rejection: none was ever received, so it must not enter rejection statistics or read as a document-quality signal. Pre-dates the cohort, so no slot is freed. An ~86/100 package - the highest in the log - drawing no reply at all is the strongest evidence yet that the constraint is channel, not documents. Unblocks the Observe Metrics Platform req, which was paused only to avoid stacking a second cold application on the same org. Norway lane: corrected a false "closed" framing that had propagated into the Equinor row and was used to dismiss Norwegian rows in the scout readout. The lane is OPEN but selective. The gates are norsk working language and NO security clearance - NOT compensation: the 180k bar is CH-only and explicitly does not apply to Norway. Equinor, Telenor and NATO JWC stay in the scout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK |
||
|
|
73336cc4f9 |
feat(sbb): critique the package and apply its Tier 1 fix
Critique per critique_framework.md: hard gate PASS, Evidence Fit 79/100
(Core, unchanged — a document cannot move candidate-role fit), Document
Quality 90/100, Channel Weak but uniquely upgradeable. Claim audit clean
across all 13 bullets; no Tier 1 truth findings.
The skill's own spec asks for a single 8-dimension score including a
Publications weight, which contradicts critique_framework.md and CLAUDE.md
("never collapse them into one optimistic score"). Followed CLAUDE.md and
recorded the conflict — the skill definition looks stale relative to the
July rewrite.
Tier 1 finding and fix: the JD names Abfrageleistungsoptimierung in a
required line and the document had zero occurrences of "query", despite
canonical support sitting in BS-2's 3L variant. BS-2 now reads "tuning
query performance for analysis teams working with…" and the Pipelines
skills line gains "query performance tuning". Also surfaced "agile" in
SW-3, whose canonical 2L variant records "in an agile DevOps team" and
whose absence left the JD's second required line unaddressed.
Deliberately NOT applied: the API term. claims.json SW-7 records only
"onboard source systems" and SW-2's ingestion is Oracle to Kafka, so
adding it would be vocabulary substitution rather than evidence. Left
open pending user confirmation.
Re-verified after the edit: validator PASS, forbidden-token scan PASS,
compile PASS at 2 pages, both pages re-rendered and inspected. Longest
bullet 34 words, still under the flag threshold. Document Quality 90 to
92 on relevance/terminology.
Still not submitted — held pending the Anforderungsniveau K comp answer.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB
|
||
|
|
a64661e42a |
feat(sbb): 2-page English resume for SBB Data Engineer, Bern
13 bullets, 6 skills lines, International Tech profile in English with an explicit Languages line naming German as mother tongue (user instruction). Framing leads on operate-and-own — Component Ownership with on-call and governance answers the JD's "Betrieb" and "Verantwortung für Qualität und Nachhaltigkeit" — and carries the Bosch industrial sensor-data thread (defect records, wafer inspection images, PCM parameters) against the role's vorausschauende-Wartung purpose. GenAI/LLM material dropped. Two deviations from the approved 11-bullet plan, both deliberate: Fraunhofer keeps one combined bullet rather than zero, because dropping the role opens an unexplained 21-month gap between Vizrt and Bosch; and BS-1 is added as a fifth Bosch bullet, HIGH priority in the bundle and directly relevant to an employer running a 24/7 network. Kept the guarded page break after testing the natural flow: without it page 1 fills, but two Bosch bullets land on page 2 with no visible employer header. Hierarchy beats page-fill, and page-fill quotas were removed on 2026-07-27. Gates: canonical validator PASS (0 warnings), forbidden-token scan PASS (none of the seven non-canonical JD tools present), scope-discipline scan PASS, compile PASS at exactly 2 pages, both pages visually inspected. SW-1 and SW-7 bullets also read by eye against their claims.json forbidden lists. Not submitted — held pending the Anforderungsniveau K comp answer. Also fixes a KB defect found during generation: bundle_data_engineer.md §S5's cover-letter hook read "leading the migration of our legacy stack", a full-ownership verb on a company-scale object that contradicts claims.json SW-1 and its own narrative thread. Rewritten, warned inline, and recorded in the CLAUDE.md corrections log. The other four bundles are unchecked. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB |
||
|
|
787a1d937e |
feat(sbb): Phase 0 for SBB Data Engineer, Asset Management, Bern
Job ID 103755, posted 2026-08-20, surfaced by the 2026-08-21 scout run. Evidence Fit 79/100 (Core, lower end), hard gate PASS. The title-defining capability — build and operate cloud data pipelines and governed data products — is Direct and current, unlike the AWS FDE NO-GO. Best practical fit in the log: Bern-based, German-language, no relocation, EU citizen plus B permit. Real strength cluster for the role's vorausschauende Wartung purpose: Bosch fab sensor/process data, ELK/Kafka anomaly detection, containerized ML inference, plus the condition-monitoring thesis. Two open risks, both level and comp rather than fit: Anforderungsniveau K is a capped GAV band whose figures are not public and must be asked, and the seat reads lateral or below current Staff plus Component Owner scope — the same shape declined at BKW. Level and ownership scored 9/15 for that reason. Seven named tools are non-canonical (Snowflake, dbt, Argo Workflows, Helm, Power BI, Spring Boot, Angular); survivable only because the JD prefixes the stack list with "z. B.". Recorded as an accepted ATS risk, with a Phase 2 gate to keep all seven out of the generated document. Cover letter: NO — SBB explicitly waives it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB |
||
|
|
8a30c68c95 |
fix(scout): key decision lookups by stable job ID, not raw URL
Boards rewrite their own URLs between runs, so a decision recorded under one URL was lost the next time the same req appeared. Amazon truncates the job slug to a fixed width and that width changed, which silently resurfaced the already-skipped Principal Delivery Consultant req at score 7 in the 08-21 run. Adds _decision_key(): "<host>#<req-id>" via per-board ID patterns, falling back to a normalized path. Host-scoping is deliberate — a wrong ID match can never mark a role decided at a different company. Also collapses genuine duplicates: Workday's /apply suffix, PostFinance's per-locale URLs, Apple's ?team= and /locationPicker variants, the same NVIDIA req under two locations. The log file stays URL-keyed (it is hand-edited and the URL is the readable part); lookups go through index_decisions(). --decide now updates an existing entry when the job is already logged under a drifted URL instead of adding a second row. Verified against all 955 URLs in the decision log plus the 2026-08-21 report: 4 groups collapse, each inspected and correct, no false merges. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB |
||
|
|
2fadfdb8eb |
feat(scout): probe four unverified boards — add CERN, NCIA to manual check
Probed CERN, Swiss Post, NATO NCIA and SIX Group. Two actionable results: - CERN: SmartRecruiters board "CERN", 66 live Geneva postings with real engineering (Deep Learning Developer, ML Engineer NGT, Full-stack SWE, Data Storage R&D Engineer). Added — the adapter already existed. Two standing caveats recorded in the entry: Geneva is ~1h50 from Bern so a 2-3 day hybrid is not viable without relocation, and CERN grades sit below the 180k bar. - NATO NCIA: nato.int is Cloudflare-blocked to headless browsers. Moved to MANUAL_CHECK beside Oracle, with a note that NCIA is a separate pipeline from the JWC Stavanger reqs the `nato` adapter returns. Not added, documented instead: - Swiss Post: real board is job.post.ch (SuccessFactors CSB), scrapable via a[href*='/job/']. The only tech role on page 1 was served from the PostFinance sub-board, which is already covered. Paginated, so this is page-1 evidence only, not a whole-board verdict. - SIX Group: SAPUI5 SPA backed by a legacy DWR RPC endpoint (careerJobSearchControllerProxy.getInitialJobSearchData.dwr). Scrapable in principle, brittle in practice; job rows did not render into readable text. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
cbb713ba7d |
chore(aws-fde): NO-GO at Phase 0 gate — 69/100 below the fit bar
User declined at the gate: 69 is not a strong enough fit to spend a package on. Consistent with revealed behaviour — every application actually submitted scored 77.5-89; nothing below 75 has ever been sent. No cohort slot consumed (Adjacent stays 1/2). No bullets written, no resume, no cover letter. Phase 0 analysis retained in the session file in case a better-fitting AWS req appears. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
cc109524f8 |
feat(aws-fde): Phase 0 for AWS Senior Forward Deployed Engineer, Zurich
Verbatim JD (amazon.jobs 10504263, posted 2026-08-17) retrieved via Playwright and stored with the session. Evidence Fit 69/100, Adjacent. All four Basic Qualifications are Direct, so the minimum-qualification gate passes. Disclosed rather than buried: forward deployment is the title-defining capability and is a Gap - SW-4, VZ-1 and global_forbidden_output_patterns all forbid "customer-embedded delivery", and application_strategy lists strategic-account FDE as a Stretch target. Scored Adjacent because AWS's published minimum bar is pure software engineering and the org is seven weeks old, hiring builders at volume. Assets: AWS is the evidenced cloud (claims.json forbids GCP output), and Kiro - named in the JD - is in the verified GenAI toolchain. CL decision YES. Would consume the last Adjacent cohort slot. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
e09437dc27 |
chore(pipeline): close SDU + Google FDE III, triage 5 JDs, drop Louis Dreyfus
Pipeline: - SDU PhD: closed, not proceeding. Prof. Jørgensen never replied to the 2026-08-02 enquiry; user dismissed it two days before the 2026-08-20 deadline. - Google FDE III GTM: closed, not proceeding after two Google rejections. The bar for a third attempt is now a very strong fit; this was Adjacent with an agent-orchestration gap. Frees the Adjacent cohort slot (back to 1/2). JD triage — 5 pulled and read, 1 survives: - SHORTLIST AWS Senior FDE Zurich: all four basic quals pass and AI/agentic is preferred-only, unlike the Google Senior Staff FDE where vector DB + RAG were minimum quals. AWS is the evidenced cloud; JD names Kiro, which he uses. - SKIP AWS ProServe Bern (clinical pharma domain gate), AWS Principal Delivery Consultant (8+ yrs architecture leadership + VP+ exec comms), GitLab FDE EMEA (Ruby/Go hard gate), MS 200044133 (title says FDE Data Scientist, quals are BGP/MPLS/SD-WAN network engineering — mislabelled req). Roster: - Dropped Louis Dreyfus: 300 roles, all Brazil/India/Bulgaria ops, zero Swiss. - Kept MET Group: its "0 eligible" was a filter artifact; exclusion mode reveals real Baar/Zug commodity-trading roles. - Kept Equinor/Telenor/NATO. Memory corrected: the Norway lane is selective, not closed — the user still wants very good Norwegian roles. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |