diff --git a/PROJECT_MANIFEST.json b/PROJECT_MANIFEST.json index 1add04f..315b7eb 100644 --- a/PROJECT_MANIFEST.json +++ b/PROJECT_MANIFEST.json @@ -1,9 +1,9 @@ { "project": "VacatureRadar", "artifact_root": "VacatureRadar_Project", - "generated_at": "2026-07-21T00:35:18.665134+00:00", - "file_count_excluding_manifest": 217, - "total_bytes_excluding_manifest": 3081406, + "generated_at": "2026-07-21T21:03:35.829818+00:00", + "file_count_excluding_manifest": 323, + "total_bytes_excluding_manifest": 8496576, "files": [ { "path": ".agents/skills/vacatureradar-maintainer/SKILL.md", @@ -12,8 +12,8 @@ }, { "path": ".dockerignore", - "bytes": 123, - "sha256": "3c2f05c09dedea046f2fd6494519f7fa9fbefb8fd4487bc0a8fa1ae61b24b4a8" + "bytes": 175, + "sha256": "829f2621b4c38c469fc0f7eae36d480a50410f1a7ee2ec16fc53b2eb5b08cd79" }, { "path": ".editorconfig", @@ -22,14 +22,19 @@ }, { "path": ".env.example", - "bytes": 1719, - "sha256": "d4e3c68671001509ef7cb0aa3332d2a69294395736b98a1abbda04306a38f7f4" + "bytes": 1965, + "sha256": "d28ed5cdbfb35fffddc5a1cf4397f76de73bc097e5b8641c37b32cbb34d39d57" }, { "path": ".gitattributes", "bytes": 86, "sha256": "e0a0e19de86a82dce2b9a5152553a81b0f2d6b36b521540c9c95f9fa24f97eaf" }, + { + "path": ".gitea/workflows/deploy.yml", + "bytes": 1328, + "sha256": "9e95b09a567131fc71217482834bb4b8fb386c0be0eb95515ae57e04484c1c95" + }, { "path": ".github/dependabot.yml", "bytes": 373, @@ -37,8 +42,8 @@ }, { "path": ".github/workflows/ci.yml", - "bytes": 1159, - "sha256": "fdb423866ff6ceb8ba68af086d7735c069075e15e219005ca7f43d08f5fa8135" + "bytes": 1878, + "sha256": "7e88836fb9ecc93e0ec25c35c2e98810d1f4b9c549a744fb2ec0be8e8d9a8138" }, { "path": ".gitignore", @@ -55,56 +60,6 @@ "bytes": 3904, "sha256": "48df997b9301df9fe9e7228a8318f68fa03b23a5b4102f792d52c7b34ee4cf8b" }, - { - "path": "CHANGELOG.md", - "bytes": 615, - "sha256": "c1d6598799477efb43a5f178a81f25b88389ed9cf86e6eaf5e1a3d7450f4d35b" - }, - { - "path": "CODEX_START_HERE.md", - "bytes": 2964, - "sha256": "225f7804a4616c65addc796417810a9391d135248467b6e69bba4db1820d2834" - }, - { - "path": "CONTRIBUTING.md", - "bytes": 1129, - "sha256": "d7f17ab14e7bb0763d1cee12a1cae9a7cdeebded2d69ab1552ca5a5a5606dcdb" - }, - { - "path": "Dockerfile", - "bytes": 805, - "sha256": "fb1d400365e11b38dc1dc84f8ed326098dc5e44b34590e72f74abd9437cd7927" - }, - { - "path": "LICENSE", - "bytes": 1061, - "sha256": "a1e3ff537d8be01e7bec1376969d1b66ea2088dfcf7dbf1f2227793ef67c13a6" - }, - { - "path": "Makefile", - "bytes": 1236, - "sha256": "1e3b04f7b74167347c2f11bebb9161a716c6fa4e4cb2630caa8f6af044fece81" - }, - { - "path": "PLANS.md", - "bytes": 980, - "sha256": "0bb6d51c01003a0dbf9de3a82aeb13967f024d9c267386f29c76fc7a4be97fa6" - }, - { - "path": "README.md", - "bytes": 7204, - "sha256": "cb8080c71dd5feda271825554e67e8b5f0bb3be3e2d73ca973fb447b3d903c57" - }, - { - "path": "SECURITY.md", - "bytes": 1931, - "sha256": "9ca57ce4d8b077fe860343762595c3af3a5aad1a843582faa1bb2197b3b638a6" - }, - { - "path": "VERIFICATION_REPORT.md", - "bytes": 3446, - "sha256": "2daaca73cbe3d228b8ac7c25aaa679cea09e7289eebc8ac911dd0ca53437d3db" - }, { "path": "apps/__init__.py", "bytes": 0, @@ -128,7 +83,7 @@ { "path": "apps/core/context_processors.py", "bytes": 250, - "sha256": "bdb2b77b17694ad3f3bc880398f7fb391f98f2a9568e42760222faf407102faa" + "sha256": "ed054ec1013257bfbcc65bbf57e4d951175a8a2daa00c1ac736089e46eb4beda" }, { "path": "apps/core/health.py", @@ -145,6 +100,11 @@ "bytes": 256, "sha256": "516c3986da0f2ba82519c0828c0d3150524882806025f79a340791411a4ed792" }, + { + "path": "apps/core/rate_limit.py", + "bytes": 3284, + "sha256": "febf507ccae70502d141c2b2bb23b269353bdf158f7abe4c33f1e7bb91b8b5fb" + }, { "path": "apps/core/urls.py", "bytes": 357, @@ -152,8 +112,8 @@ }, { "path": "apps/core/views.py", - "bytes": 2610, - "sha256": "5b0a0ddaad9449b77528484e0072e442a7dcbd0197a38a75483ce4f1faf8f491" + "bytes": 4956, + "sha256": "a2eafc07898a94fa1c425fb2c39a86fd446261c98c67637f5ad5712bbcf0ccb0" }, { "path": "apps/jobs/__init__.py", @@ -162,8 +122,8 @@ }, { "path": "apps/jobs/admin.py", - "bytes": 1409, - "sha256": "5a39eeac98cc858de02b8c9a225db2d5c2a05d98ea6134ba49acfa64989cbf72" + "bytes": 2151, + "sha256": "7bceca4ba0c81916242f35fc620aa05bc3acde9cd320a9dcdcaff79213edbe33" }, { "path": "apps/jobs/apps.py", @@ -190,11 +150,31 @@ "bytes": 2934, "sha256": "501d689186092eab4e6c4a258daf1360c3f15a1d9a2f243d3715c62e30eab789" }, + { + "path": "apps/jobs/management/commands/import_geodata.py", + "bytes": 3196, + "sha256": "f99d5bd0eb09259fb37b0fce3918c292735922184a12d93d1376b327896b42bf" + }, { "path": "apps/jobs/migrations/0001_initial.py", "bytes": 15258, "sha256": "a4a94d10883c06846bd25f3ca4b3a14936b4852fbbbe1079ff425799ab90916f" }, + { + "path": "apps/jobs/migrations/0002_geocode_location_lookup.py", + "bytes": 2867, + "sha256": "ff911e092d03f8764ed7c7068c296f7309bfca4bd1e47c87d333fd5349ccff68" + }, + { + "path": "apps/jobs/migrations/0003_ai_analysis_cache.py", + "bytes": 2433, + "sha256": "2d3920e924c22b23bf0a621f914ae15a6ae95d27369fd071bbb80882f1ca3ad3" + }, + { + "path": "apps/jobs/migrations/0004_application_timeline_and_metadata.py", + "bytes": 2639, + "sha256": "a3e6dd32f7dbce03cbe8dc0b426497de8e728565becbd093775af648e924778a" + }, { "path": "apps/jobs/migrations/__init__.py", "bytes": 0, @@ -202,8 +182,8 @@ }, { "path": "apps/jobs/models.py", - "bytes": 10907, - "sha256": "eeba4002787ed72649178a45347d4883c4575704a4d3fef0d8a5ddc3da0e2181" + "bytes": 15550, + "sha256": "84d0a8f8c4e419e2a0a9efc8049ceb3b8d1bd8b97d146bdac8fafcba223ef8d5" }, { "path": "apps/jobs/services/__init__.py", @@ -212,18 +192,28 @@ }, { "path": "apps/jobs/services/ai.py", - "bytes": 2870, - "sha256": "92b6b55ec616cb6a6fd4d9ba69304c55ca41206a249b0fca308db25193b9dc19" + "bytes": 11893, + "sha256": "f7a59bd7596baa7d2628dd983774aeb549e20a36bc3cde7a9c2365637f62a234" + }, + { + "path": "apps/jobs/services/applications.py", + "bytes": 13197, + "sha256": "70c94fc23bf1004a1d3517ac5ea065b0b5993a25b8f8decbf22a0eb83b9cada7" }, { "path": "apps/jobs/services/dedupe.py", - "bytes": 2931, - "sha256": "592572611418974385b4f77e7ee8554894a220654611170a5570e79e99f7dcc8" + "bytes": 3902, + "sha256": "645834a7d59ecffa4a888702eebb03f20df79af5e30c8e6ed6ae4e9411ec0471" }, { "path": "apps/jobs/services/distance.py", - "bytes": 385, - "sha256": "6be5d06eb04f1880104e8615d860fb1ae8f440e1a79cd48213c03eca932048ba" + "bytes": 1743, + "sha256": "6e34bf7ba43d2a619f84d2d440a944ab704aad4d9b7075622dc8ce839d57e0b8" + }, + { + "path": "apps/jobs/services/employer_resolution.py", + "bytes": 6203, + "sha256": "579b018611daf8c68878539eb7d1fa44e837e289a0f0129fb17107da7b17e4a6" }, { "path": "apps/jobs/services/features.py", @@ -232,8 +222,13 @@ }, { "path": "apps/jobs/services/feedback.py", - "bytes": 1393, - "sha256": "18fed91d9c589c9815bfb224f35c8ff96a2de9c0d8e97e79cb1bce95bad9ade2" + "bytes": 6212, + "sha256": "c0a56d313eefcb3da51a8e44fa11a1db740f0eb3a407b3f3d48a16b8d9ca131a" + }, + { + "path": "apps/jobs/services/geocoding.py", + "bytes": 13899, + "sha256": "03ca5cbdc3e1a3afd20e583c9035da27ef1bbaf493004e36c0aa755721cf285f" }, { "path": "apps/jobs/services/lifecycle.py", @@ -247,8 +242,8 @@ }, { "path": "apps/jobs/services/pipeline.py", - "bytes": 11264, - "sha256": "35b86a8151b89833d3a34d8e6d6d004dd13f4af88d047a90c6a86cf14c394185" + "bytes": 12570, + "sha256": "e947d3d2a8a4ecb6e6c89d64758a48e1f0f8c2e29d0bf051b46fd6755b16dad8" }, { "path": "apps/jobs/services/sanitize.py", @@ -257,23 +252,23 @@ }, { "path": "apps/jobs/services/scoring.py", - "bytes": 8856, - "sha256": "e1bab6871d3ec5aeb48a8ce1135453d074e1d6933fc0b2c9f3dcf821c9ae2713" + "bytes": 18515, + "sha256": "27927625f3055d47e5d2b92ab50862565f6e5596b7b128b779ee9ccb97814c2e" }, { "path": "apps/jobs/tasks.py", - "bytes": 918, - "sha256": "3faa7f4ca94dd42245b5103928c6bcf4fefd811476c6cbf0e9331d4361c38c48" + "bytes": 657, + "sha256": "57c7677297aeeb8ffa6d4db822934c8fcbc12667ae1dfa580e26361acec9bd87" }, { "path": "apps/jobs/urls.py", - "bytes": 529, - "sha256": "4c0209f54cd454ff8f973376c2b97d4ac1b1942044c171182ec970eccb366e35" + "bytes": 867, + "sha256": "9ddf60db95b5923193d3e2bbf12e364ff8c0e0e7b4269c737c9b74b8acde1e2b" }, { "path": "apps/jobs/views.py", - "bytes": 4044, - "sha256": "02106ea312602e3c8368562765e11f8ce66c28e5a3b2dad43f264c8c6a0ae481" + "bytes": 6635, + "sha256": "445e29305e19589f2e3f05797bbfcb9f235cf1274ab0fbbd34c67b818c0943df" }, { "path": "apps/notifications/__init__.py", @@ -282,8 +277,8 @@ }, { "path": "apps/notifications/admin.py", - "bytes": 399, - "sha256": "23cceee3d2690ac367d5ea1104f3e16b0f3cca37f5fbf991e8bd4e9fe343124e" + "bytes": 796, + "sha256": "1e955cbd13a835b70885032a4e299dd5b2b9e1dee3d5285b4be455b2fa8f6f9f" }, { "path": "apps/notifications/apps.py", @@ -295,6 +290,11 @@ "bytes": 1576, "sha256": "9865cf5f709043a164861d5a1e6d1517e23058b525bfda9a135e8c1064248fcb" }, + { + "path": "apps/notifications/migrations/0002_reminder_outbox.py", + "bytes": 3517, + "sha256": "4318695422913b6e6518fba02d9c9f52a29c4221ca34765b00945c9de1aac8bb" + }, { "path": "apps/notifications/migrations/__init__.py", "bytes": 0, @@ -302,18 +302,18 @@ }, { "path": "apps/notifications/models.py", - "bytes": 1258, - "sha256": "72fc697b9d46969a07833be8269561a4e144ca8dc3e0fab27e1c7a7d83566f89" + "bytes": 3980, + "sha256": "4dd8fc3e9c3f3d637abfd359526b1910893001fdb0f3ff889800ea73d5240038" }, { "path": "apps/notifications/services.py", - "bytes": 4898, - "sha256": "db01f1e6192534a18519676a37fcd3811a6794f1600f520058aecadb5d677821" + "bytes": 16814, + "sha256": "9a9715c0aa413767737f59569b84e4f9aeb2dcdb79e35995641623b940cf158f" }, { "path": "apps/notifications/tasks.py", - "bytes": 698, - "sha256": "5246f185e7aa231230ad16651aa2c207a3d34e3d1a9a01515814ac6ea9c85645" + "bytes": 1391, + "sha256": "03d186e9f45a5be4df1f1491502e580c987d297462e4cf7de72157135e055e11" }, { "path": "apps/profiles/__init__.py", @@ -332,8 +332,8 @@ }, { "path": "apps/profiles/defaults.py", - "bytes": 691, - "sha256": "7a400a0234b63529ce077033cd0851a2939d9c587bde9a1f62c26c4fc5810861" + "bytes": 786, + "sha256": "e4cbad770f32cfe777371bd955b0fe5064656f6d8682a71374e1bb3eddf1f012" }, { "path": "apps/profiles/forms.py", @@ -345,6 +345,21 @@ "bytes": 4539, "sha256": "93fe45b7417c564e31a93cb522864c3112175716ec2813032036ad26c7a2ded6" }, + { + "path": "apps/profiles/migrations/0002_ai_scoring_enabled.py", + "bytes": 383, + "sha256": "3d5d61947734bd9eb9df271772f1b9ce527cf88118bcbd2623c5df9de5b78e01" + }, + { + "path": "apps/profiles/migrations/0003_learning_enabled_default_false.py", + "bytes": 394, + "sha256": "0bd7d9a5429f20115039c42a34bf79758ecf649f1b8227d00e03acabfe9fc752" + }, + { + "path": "apps/profiles/migrations/0004_reminder_settings.py", + "bytes": 856, + "sha256": "4ea855302b04288e7bc91d8c4ef67c472cd1a6ac268d0ea1ed9e2a8422af0373" + }, { "path": "apps/profiles/migrations/__init__.py", "bytes": 0, @@ -352,8 +367,8 @@ }, { "path": "apps/profiles/models.py", - "bytes": 6231, - "sha256": "5edb9861f16810a250a8ac6827b22036a48198c0045b898d257ab45bfed05f28" + "bytes": 7110, + "sha256": "2812a1d6a7ca24b94384d85774fb7bc0cc2b760990fcea9914f07301f78bdd05" }, { "path": "apps/profiles/services.py", @@ -377,8 +392,13 @@ }, { "path": "apps/sources/adapters/__init__.py", - "bytes": 300, - "sha256": "5593792061020943bc61d904289a5b3b3759ee7da36861109660492fbdff6bbb" + "bytes": 555, + "sha256": "d29e30ad41f4c43a98eb8c9285dc97590ab2f75e1804e72ee486538b9c0a1535" + }, + { + "path": "apps/sources/adapters/ats.py", + "bytes": 18142, + "sha256": "e43a8f4328aa4affea6e6cefe0e15d398e0b98e0850244186efb4f306178bd59" }, { "path": "apps/sources/adapters/base.py", @@ -402,8 +422,8 @@ }, { "path": "apps/sources/adapters/registry.py", - "bytes": 1117, - "sha256": "8fcf310f6c654ad79f3736512c191a9634616bc7e7e1f97472ef71f6eaae49b1" + "bytes": 2128, + "sha256": "85042cb30be58ce6170b5c380f22f4377997ac71cc5b9ef55ca9a7bbe315a98a" }, { "path": "apps/sources/adapters/rss.py", @@ -412,14 +432,19 @@ }, { "path": "apps/sources/admin.py", - "bytes": 1384, - "sha256": "fe8214cd58755f5a92bee687d41e2c0a62f246cd892225e8c6693a458f8fc44a" + "bytes": 2800, + "sha256": "06a6b41d1d85a41f18e7f628c5284c9530656b7f69536206ac689123b65c7d35" }, { "path": "apps/sources/apps.py", "bytes": 180, "sha256": "111b418b99ba40216728c9fe01387a33bcb2d1e827d4a703b7a2ec4fb8a6f155" }, + { + "path": "apps/sources/forms.py", + "bytes": 939, + "sha256": "b58a0f824afa808e853194899c98b73d6c2758a0d283b22ac4e182367d3a12fd" + }, { "path": "apps/sources/management/__init__.py", "bytes": 0, @@ -430,6 +455,11 @@ "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, + { + "path": "apps/sources/management/commands/discover_sources.py", + "bytes": 2930, + "sha256": "f4a588fdebda10810b8e3b9fa9f166b0379d1fd511e3a14c807d62866ce7f4cf" + }, { "path": "apps/sources/management/commands/import_job_fixture.py", "bytes": 2734, @@ -445,6 +475,16 @@ "bytes": 8511, "sha256": "6d64bc12d528794e25f5fc30175be6f054b8bf7ca8f81123659af14bc0498aec" }, + { + "path": "apps/sources/migrations/0002_policy_review_and_robots_cache.py", + "bytes": 2748, + "sha256": "6ce50f7ce6d772b9b312c17ae6345589bb0f29341817d3f91be71eba56774655" + }, + { + "path": "apps/sources/migrations/0003_source_lease_and_origin_state.py", + "bytes": 1770, + "sha256": "2125f2c6566298d6f15c86256d5598ea31fc113db6ad8597d0e924c4d0ab3e23" + }, { "path": "apps/sources/migrations/__init__.py", "bytes": 0, @@ -452,8 +492,8 @@ }, { "path": "apps/sources/models.py", - "bytes": 8367, - "sha256": "347aeb9f0a543a182057680b9d34609d4a0b86e348e3e33bd0f7b007e8912c4c" + "bytes": 12887, + "sha256": "781d9e379904a82a4b8bba356d7835ba2f5b0188528e9d9848eede8c1369e017" }, { "path": "apps/sources/services/__init__.py", @@ -467,8 +507,8 @@ }, { "path": "apps/sources/services/discovery.py", - "bytes": 1470, - "sha256": "b10bc8fa5dc11f65737f6757e8d0e8f1853feebb961988c388cc7c946bce2aea" + "bytes": 12641, + "sha256": "da9b31af171a67e428310430fd1ed596be186c82cade5261022fbb4c807056ff" }, { "path": "apps/sources/services/email_import.py", @@ -477,13 +517,33 @@ }, { "path": "apps/sources/services/fetcher.py", - "bytes": 3905, - "sha256": "52ec120d9d7714b7793488dd5fc289829aa0cea32d52e468af9ddc7f0a195ffd" + "bytes": 6335, + "sha256": "be99236dc8ce3ecc0f3c262a672f3a97088a3b767a143f5daa01652cc1e4d51f" + }, + { + "path": "apps/sources/services/health.py", + "bytes": 11635, + "sha256": "62fb603868b12f1464502f1ef1fef08992b454b5cf522dc8b570fa481c3d70be" + }, + { + "path": "apps/sources/services/manual_import.py", + "bytes": 12976, + "sha256": "4fdc4a6d850e16ec091737847ae86e1f6ba34cf2ade08cfb26b34b76fc7473fc" }, { "path": "apps/sources/services/policy.py", - "bytes": 1611, - "sha256": "38defe3e397a0ef3fadf34de9389d65cee25188be431f3cf02c605649c9ce638" + "bytes": 4294, + "sha256": "b07c5a62c3483fe3dc320a32cd67fcc8f4a717b275c336f3cba8ea7beb2fd295" + }, + { + "path": "apps/sources/services/robots.py", + "bytes": 8869, + "sha256": "fb46e645d0f6d8c45205f0cd45a55e07e9ebb255fcefea1866574f800b314d5c" + }, + { + "path": "apps/sources/services/scheduling.py", + "bytes": 5329, + "sha256": "13e059faf4668176b6ba25ebf3e5332eb7b012f40ad0e3af033b0125a3b46e25" }, { "path": "apps/sources/services/url_security.py", @@ -492,18 +552,28 @@ }, { "path": "apps/sources/tasks.py", - "bytes": 7189, - "sha256": "207b07d1964cf09caf2f9dc7d30dc4cbcb53b4b31d56d9c90d63f4ba08135a9b" + "bytes": 10101, + "sha256": "85691e14dd10a4f9545fa3e13dc4f79a5ae5bfd3ec2ceacae335e1f3b4f9a9a4" }, { "path": "apps/sources/urls.py", - "bytes": 207, - "sha256": "63aff104a33235f3d5a7d07a3122aa0045b891df48304cad8537c1bb25ae6002" + "bytes": 375, + "sha256": "1c6bc7029f7af2e4a3ee0bdfb8a4d933b2b518e66c7ac18dd9c2e04d11df9d8d" }, { "path": "apps/sources/views.py", - "bytes": 1025, - "sha256": "4a6979a3bbe5406119fc5309c690addbdfa9c9c8fbaea096b229506bf1ddda05" + "bytes": 7713, + "sha256": "e1f4cadddadae4daac34b12bc595ba6ab82cd8e43d45dc60aa0a3034e34d9d2e" + }, + { + "path": "CHANGELOG.md", + "bytes": 2157, + "sha256": "163aec745cb3326f6fdf651175ba6a94a3e1d9a526962956e3094feb153ca42e" + }, + { + "path": "CODEX_START_HERE.md", + "bytes": 2964, + "sha256": "225f7804a4616c65addc796417810a9391d135248467b6e69bba4db1820d2834" }, { "path": "config/__init__.py", @@ -522,19 +592,24 @@ }, { "path": "config/settings.py", - "bytes": 7483, - "sha256": "b75b9eddf51a4f05c868512a4afde9103d9f3574a839691ef2ad98a4910497e6" + "bytes": 12928, + "sha256": "ec4b781092db54821b65ca534b0a12916413ebfbbd283df480b3d954166b4927" }, { "path": "config/urls.py", - "bytes": 926, - "sha256": "8de2442f01a16204626e80fc2ca82a2105d9122229da6d8d2df13031e5590cb4" + "bytes": 941, + "sha256": "b472b24a0213fb020add183215b9c4ea7107d89b4fd8db22f4aa17aff727f5a0" }, { "path": "config/wsgi.py", "bytes": 202, "sha256": "805e9a28d51ab873da5a33666e72525b1bae6c8fb0ed948ad9ada0d73393d445" }, + { + "path": "config-data/geodata/README.local.md", + "bytes": 453, + "sha256": "f98c437ea3437ca1419c9a739864b7f3ff5938c33121128337355db0cdf7c6b3" + }, { "path": "config-data/profile.example.yaml", "bytes": 623, @@ -550,6 +625,11 @@ "bytes": 450, "sha256": "616e2bd584d70812b87bd4129900f87bececc9d331815530e57b538711e6536d" }, + { + "path": "CONTRIBUTING.md", + "bytes": 1129, + "sha256": "d7f17ab14e7bb0763d1cee12a1cae9a7cdeebded2d69ab1552ca5a5a5606dcdb" + }, { "path": "deployment/unraid/README.md", "bytes": 394, @@ -557,18 +637,18 @@ }, { "path": "docker-compose.unraid.yml", - "bytes": 1815, - "sha256": "be85c45d8d541cca37f93584369695ce2d23340d89de1ac6263d7f259b0be9de" + "bytes": 2255, + "sha256": "2cfb47cabebf2bde71aa859239c99a771502773d853b48b1c735feb66c64e797" }, { "path": "docker-compose.yml", - "bytes": 2091, - "sha256": "cf1f63ad621a2df718ccabfdc8e6a4139fc3e28e50adb939fafab3666d2330e9" + "bytes": 2499, + "sha256": "b9aaf71d28591a0b4afed0d6f28f2ad31cccae951d6050629e77dcce59e9840d" }, { - "path": "docs/README.md", - "bytes": 1441, - "sha256": "eaebd430f76066740144fda5913ad53efee76c9c3de96c18757ea035066b4201" + "path": "Dockerfile", + "bytes": 1203, + "sha256": "a231c7f0872c8a6fe8c2fe3bac46479e1b8ce3ec419fb3cdfadb25b541386ec2" }, { "path": "docs/ai/AUTONOMOUS_EXECUTION_PROTOCOL.md", @@ -577,19 +657,19 @@ }, { "path": "docs/ai/BACKLOG.yaml", - "bytes": 38636, - "sha256": "b3d7c3f09634992a1ee6a6589d7fbd134a23c0181c560206c761af9c824435e3" - }, - { - "path": "docs/ai/CODEX_CONFIG.example.toml", - "bytes": 469, - "sha256": "64de3dce1453851f216ee48dcc6fdcb07b578b1fab7519c6ffc3609420a3907c" + "bytes": 46387, + "sha256": "52f5db602dfb6c83e38e8668520107c2c360d3ba9702a6ad537b5d62aa0aa71b" }, { "path": "docs/ai/CODE_REVIEW.md", "bytes": 1810, "sha256": "0c6716f0a4da8e8dd76446bff6d9c2ec1e9d8e5f44bcc39e8a0b7094723d3987" }, + { + "path": "docs/ai/CODEX_CONFIG.example.toml", + "bytes": 469, + "sha256": "64de3dce1453851f216ee48dcc6fdcb07b578b1fab7519c6ffc3609420a3907c" + }, { "path": "docs/ai/DECISION_LOG.md", "bytes": 2476, @@ -597,8 +677,8 @@ }, { "path": "docs/ai/PROJECT_STATE.md", - "bytes": 2582, - "sha256": "63e3f7d3c50bdca59a864794719cc6009ee2f36073523eba3873066ce84fdce0" + "bytes": 11335, + "sha256": "b172145378da83600528253aab0862deef3cee3db9b121aed65cbb40da30cab4" }, { "path": "docs/ai/SESSION_BOOTSTRAP_PROMPT.md", @@ -615,36 +695,6 @@ "bytes": 2634, "sha256": "6c3f070ba6aadb3e95fa2a9f4d4bcfce1e4a4e7567f53380cde552d875b62c6e" }, - { - "path": "docs/architecture/DATA_FLOW.md", - "bytes": 3372, - "sha256": "fc162692ffa5a5af0940dd57d3063a34ef551333962074586196bffa85531a89" - }, - { - "path": "docs/architecture/DATA_MODEL.md", - "bytes": 4540, - "sha256": "00372369b4e560da0d7ab4127fbf50a48cac294316b6c11c387dd6d027e0b6f1" - }, - { - "path": "docs/architecture/SCORING_ENGINE.md", - "bytes": 3975, - "sha256": "4dc4e92fcdcea326a632195b4f087baa60943e306c72b773686a73afdcd47d59" - }, - { - "path": "docs/architecture/SECURITY_ARCHITECTURE.md", - "bytes": 3548, - "sha256": "193c2a62680bc42e0aefd8bbaea964d47282ed4f41ffe4ef93ad728d808692f9" - }, - { - "path": "docs/architecture/SOURCE_ADAPTERS.md", - "bytes": 4132, - "sha256": "aedcc00a33d25182106052e042a8cf2306563e619122a6d70331d767c8cd2dee" - }, - { - "path": "docs/architecture/SYSTEM_ARCHITECTURE.md", - "bytes": 5186, - "sha256": "ca19bcd61db9b5a73b373d97b09977557842488e621e55d173255b2a9a269e24" - }, { "path": "docs/architecture/adrs/0001-modular-django-monolith.md", "bytes": 1045, @@ -685,36 +735,256 @@ "bytes": 639, "sha256": "790be11bc672536a518b7fc7c9d849054f1831cacbe97a41b9546903d8cdebcd" }, + { + "path": "docs/architecture/DATA_FLOW.md", + "bytes": 3372, + "sha256": "fc162692ffa5a5af0940dd57d3063a34ef551333962074586196bffa85531a89" + }, + { + "path": "docs/architecture/DATA_MODEL.md", + "bytes": 4540, + "sha256": "00372369b4e560da0d7ab4127fbf50a48cac294316b6c11c387dd6d027e0b6f1" + }, + { + "path": "docs/architecture/SCORING_ENGINE.md", + "bytes": 4755, + "sha256": "9e464c4d1ecb80085af8e214c7d4f2d61a1330233dc5146a19139cdb9c91876d" + }, + { + "path": "docs/architecture/SECURITY_ARCHITECTURE.md", + "bytes": 3548, + "sha256": "193c2a62680bc42e0aefd8bbaea964d47282ed4f41ffe4ef93ad728d808692f9" + }, + { + "path": "docs/architecture/SOURCE_ADAPTERS.md", + "bytes": 5499, + "sha256": "dcc2dd5b47d1119b4b91b2231bebcfb9b67aa8777d0ecdb9891b87ca77d4b8d2" + }, + { + "path": "docs/architecture/SYSTEM_ARCHITECTURE.md", + "bytes": 5186, + "sha256": "ca19bcd61db9b5a73b373d97b09977557842488e621e55d173255b2a9a269e24" + }, { "path": "docs/design/ACCESSIBILITY.md", - "bytes": 2076, - "sha256": "4b9de05338a8287aaf94d47c2a887e6fa4f3c31ff7165770e17b3d5a87a9e27a" - }, - { - "path": "docs/design/DESIGN_SYSTEM.md", - "bytes": 3589, - "sha256": "eecb4f69c62607b93a1555c28eafbf81a94e4ab1c53b714bf6e1bd9f3ea5f1d5" - }, - { - "path": "docs/design/UX_SPEC.md", - "bytes": 4805, - "sha256": "7df8ba1a2f31be9237725c920e6a36d1441a11ba1366d3bec70b5d1e95e9b5eb" - }, - { - "path": "docs/design/WIREFRAMES.md", - "bytes": 5678, - "sha256": "4afdfb392adf415ca77c5e503042c6dd1a4744d2772645267ea4ee7facf27970" + "bytes": 2850, + "sha256": "8e57f0d558cda5efad6a1af8fc227e68096a9eb423c5cb966a88786436d3da00" }, { "path": "docs/design/dashboard-wireframe.svg", "bytes": 4449, "sha256": "344d02fe9a24bbccd50d78561842d04e50af2e583a9d5b96eb894f653ed43c38" }, + { + "path": "docs/design/DESIGN_SYSTEM.md", + "bytes": 4168, + "sha256": "5454b8ba4d0238ea4683497b6fcbc41f980f7aa7e4f2a563ccaa78a1b92c4a07" + }, + { + "path": "docs/design/stitch-reference/activiteitenlogboek/code.html", + "bytes": 21557, + "sha256": "599e5609ab7a66060383f01d91db58759c4e483fb471451bb45f54e77733281e" + }, + { + "path": "docs/design/stitch-reference/activiteitenlogboek/screen.png", + "bytes": 370080, + "sha256": "20988364208a4115fa0a6bd142aaabdfbdce7a054c7ed692d3f281871551b17c" + }, + { + "path": "docs/design/stitch-reference/automatisering_centrum/code.html", + "bytes": 26143, + "sha256": "ec055d0565fec14e2866fe0de1dd7c45722bc79f2e8eb95203c0218995a72621" + }, + { + "path": "docs/design/stitch-reference/automatisering_centrum/screen.png", + "bytes": 433684, + "sha256": "544c2653706abb7accbd85d737df2cde194a268c4c0616152ebc05babfbcd0e9" + }, + { + "path": "docs/design/stitch-reference/bronnenbeheer_gezondheid/code.html", + "bytes": 24661, + "sha256": "b94439bffbd8fd959ce670a51812018b35906bbbc4b9ad2754b125c20b68d1f4" + }, + { + "path": "docs/design/stitch-reference/bronnenbeheer_gezondheid/screen.png", + "bytes": 265285, + "sha256": "5190ecbdd48d99231f810680c54c4e2817dfb9f3f5733fe2fab47c2fd030df22" + }, + { + "path": "docs/design/stitch-reference/dashboard_overzicht/code.html", + "bytes": 32191, + "sha256": "d89f424aa60db21ce6344a3db343be3916ed808c610775b72247d6fa94648764" + }, + { + "path": "docs/design/stitch-reference/dashboard_overzicht/screen.png", + "bytes": 569991, + "sha256": "80f6015ba0f59284fec30a858abb930eea002a241b8ce90dbe31795dce98e0f3" + }, + { + "path": "docs/design/stitch-reference/intelligence_cockpit/DESIGN.md", + "bytes": 7574, + "sha256": "54253c646073c8e942fb214a2b543ebd16a5d9e58785fec4be19f343fb222b0d" + }, + { + "path": "docs/design/stitch-reference/nieuwe_matches/code.html", + "bytes": 29154, + "sha256": "9501ab830e2c917a5d1352c9636a0af915288bf5ec7e37bda51afa9f4b382445" + }, + { + "path": "docs/design/stitch-reference/nieuwe_matches/screen.png", + "bytes": 548688, + "sha256": "455d789b36544759fc6fc8f1814ccc2241cc31a670a5a4005f8d9db0e4486686" + }, + { + "path": "docs/design/stitch-reference/sollicitatie_pipeline/code.html", + "bytes": 26278, + "sha256": "f6393eefdf4324f1c6a120a554e181f00070adee7e1b58fd9d6cbdf52678c9f1" + }, + { + "path": "docs/design/stitch-reference/sollicitatie_pipeline/screen.png", + "bytes": 167382, + "sha256": "f5aaf63929aef98e2de549be5d339be251bc99434237ddf3ec50dc003938087e" + }, + { + "path": "docs/design/stitch-reference/vacature_intelligentie_detail/code.html", + "bytes": 28216, + "sha256": "214e343c98ebf86b41de6a788599f163798314ba898b98387ed477fd886bd704" + }, + { + "path": "docs/design/stitch-reference/vacature_intelligentie_detail/screen.png", + "bytes": 705132, + "sha256": "95ae0c5755ea145e91f8c78d906e023ad12356a3da0e286fc948c6d9352065b2" + }, + { + "path": "docs/design/stitch-reference/werkgevers_intelligentie/code.html", + "bytes": 29507, + "sha256": "7de6e90c3ecec6d1264bccfa6982b213c4b19b02f922ee43dd27d50d5b876cd6" + }, + { + "path": "docs/design/stitch-reference/werkgevers_intelligentie/screen.png", + "bytes": 268351, + "sha256": "19805f0a4dad1d036e6897240cf24284ba81ae4267f036f44a948f9b50708b5f" + }, + { + "path": "docs/design/stitch-reference/zoekprofiel_editor/code.html", + "bytes": 26391, + "sha256": "b06f16e269e0de61de1a28753545cb3610d9e642d45bb5e52224ef380e87f8e4" + }, + { + "path": "docs/design/stitch-reference/zoekprofiel_editor/screen.png", + "bytes": 331989, + "sha256": "4a49d9d1c9c7249465ddd24f5d64ba5957592eb2a4d9e76eef4f851a8c15ce6d" + }, + { + "path": "docs/design/STITCH_INTEGRATION_PLAN.md", + "bytes": 5515, + "sha256": "25f2d62598f2d3535e32b7931e688f97425396ea517215eedfd12ea36995a8ce" + }, + { + "path": "docs/design/UX_SPEC.md", + "bytes": 4805, + "sha256": "7df8ba1a2f31be9237725c920e6a36d1441a11ba1366d3bec70b5d1e95e9b5eb" + }, + { + "path": "docs/design/validation/applications-dark-1280x800.png", + "bytes": 70569, + "sha256": "48673712f6784a4dc48862c93c6826b5d5fadf6db9036adea9d67926581d93f2" + }, + { + "path": "docs/design/validation/dashboard-1024x768.png", + "bytes": 61863, + "sha256": "483def968eecd6bfbca5fcf113ea5ea14158a66c1f8cc60aeeffab0acf6bcce6" + }, + { + "path": "docs/design/validation/dashboard-1280x800.png", + "bytes": 80941, + "sha256": "a53a25affd6c0d91a4676494dbd732f0c492513eb1d182b291a617570266884d" + }, + { + "path": "docs/design/validation/dashboard-1440x900.png", + "bytes": 100400, + "sha256": "16bae43d72f93ee773d4cfdf5c53acc933bc2131e833bffa545858e1536d00bc" + }, + { + "path": "docs/design/validation/dashboard-360x800.png", + "bytes": 25730, + "sha256": "145a9421479c680c76063c175d34d240f8825ab60802603ba83e431541fd3b4a" + }, + { + "path": "docs/design/validation/dashboard-390x844.png", + "bytes": 27313, + "sha256": "14560e389107eec814f78566cec7ac8869efc73dbaa9a3a4550b83c7871563b5" + }, + { + "path": "docs/design/validation/dashboard-768x1024.png", + "bytes": 62840, + "sha256": "2ebf601cf5a3abc0f8d6011831b11ed6095f4153ed1f5e7347d152a9df6d72d5" + }, + { + "path": "docs/design/validation/dashboard-light-1280x800.png", + "bytes": 75038, + "sha256": "4984721c34a28ae92f8e120fb05c927f15d224ac6c0dcd9949b3242a9a98b946" + }, + { + "path": "docs/design/validation/dashboard-light-1440x900.png", + "bytes": 101026, + "sha256": "caa0690af94d8db55779eb9b6f1de3ce6b5e55c5c9fcf610aaf214ae7d62f78b" + }, + { + "path": "docs/design/validation/job-detail-dark-1280x800.png", + "bytes": 80487, + "sha256": "77f991b5533035e0b03707a8e7ce8c37051307ecc5bd7a681d730cb105c85c36" + }, + { + "path": "docs/design/validation/jobs-dark-1280x800.png", + "bytes": 68805, + "sha256": "93dd15187ad8079799243ac1a3c4bd29020f1f66ddb1dffacc8120efd272c2e2" + }, + { + "path": "docs/design/validation/mobile-navigation-390x844.png", + "bytes": 21186, + "sha256": "cd4c2b341914c37b994b9c4acbef5d54dd514c8036cbd4f082d917d53db90bae" + }, + { + "path": "docs/design/validation/profile-editor-dark-1280x800.png", + "bytes": 62596, + "sha256": "7c3dd42ab46f897eee4563b08d9f2dc055ecb57d6caf73d464e8cf1ded042b1a" + }, + { + "path": "docs/design/validation/profiles-dark-1280x800.png", + "bytes": 57701, + "sha256": "6ea0a49310a8ed9ab78be14a54f1bf91bfd35e19e47e56b355b5386ab826336c" + }, + { + "path": "docs/design/validation/sources-dark-1280x800.png", + "bytes": 69015, + "sha256": "85817b7305093f80441618f95b62d9fa6761c99421f1ad828b5b4bb7f53e8bc3" + }, + { + "path": "docs/design/validation/system-dark-1280x800.png", + "bytes": 74148, + "sha256": "545febbbce38cab784bff11be4c78e4e608f71c424fbc8271013270305f13c84" + }, + { + "path": "docs/design/WIREFRAMES.md", + "bytes": 5678, + "sha256": "4afdfb392adf415ca77c5e503042c6dd1a4744d2772645267ea4ee7facf27970" + }, { "path": "docs/operations/BACKUP_RESTORE.md", "bytes": 3482, "sha256": "c1b46c266a99ca60703271c2de3ff702112d190685d5c5f310a15ca008a94fb4" }, + { + "path": "docs/operations/GEOCODING_DATA_IMPORT.md", + "bytes": 1026, + "sha256": "ed88233e0df929fbdb9ca2db4bf72b6bc2fbc44c0a08129a0f69563cfafc95ec" + }, + { + "path": "docs/operations/GITEA_DEPLOYMENT.md", + "bytes": 1300, + "sha256": "861ce84bec62ffafe30605c7e78b97a51ad808b55524f206892dd9615d79a1d2" + }, { "path": "docs/operations/LOCAL_DEVELOPMENT.md", "bytes": 3281, @@ -722,18 +992,18 @@ }, { "path": "docs/operations/RUNBOOK.md", - "bytes": 5035, - "sha256": "dfb61e9bebe5f82557a367f73b8afa076ae81dd2001b911d699cd629c8df196e" + "bytes": 5698, + "sha256": "dded9b921c597af6da54f58e963a642614439ae7c364f8d2254efa79dcc73ceb" }, { "path": "docs/operations/SOURCE_ONBOARDING.md", - "bytes": 4522, - "sha256": "dbfd7017f8df60302b7492988bea8b22512fed7ef19e1c516b72e332a4021b17" + "bytes": 6384, + "sha256": "4a63d376242d20a57bdbbac94ed14caec8df5df42a9e718dadf6f9a1483fc291" }, { "path": "docs/operations/UNRAID_DEPLOYMENT.md", - "bytes": 5544, - "sha256": "2ee20a59bb7aae8b5917b0223bba5bb417cec271700eaf5d43c080b3cd4ceb37" + "bytes": 6203, + "sha256": "adbaeceb905976df3af0442f55a19c8061bcd187e6b25aa4b14d3eb271852be8" }, { "path": "docs/product/ACCEPTANCE_CRITERIA.md", @@ -755,6 +1025,11 @@ "bytes": 3592, "sha256": "1b546055478f122a2172736ce4d06e1ee165025e7a73b5fd1e92a6760721278d" }, + { + "path": "docs/quality/BENCHMARKS.md", + "bytes": 2002, + "sha256": "d5be92b8808d4f7b511e650bf415b69747f63e35e5ef61b0f22b4f995a6ad6bd" + }, { "path": "docs/quality/DEFINITION_OF_DONE.md", "bytes": 4024, @@ -772,13 +1047,23 @@ }, { "path": "docs/quality/THREAT_MODEL.md", - "bytes": 7604, - "sha256": "2d323db627635713406e8855a776b8fcd3cd422eabf8388149c7ebb4d72421df" + "bytes": 10944, + "sha256": "6026b39f011bc03198607d73d3674a03421ea8b2ca302f730286bf104f404d3c" }, { "path": "docs/quality/TRACEABILITY_MATRIX.md", - "bytes": 5619, - "sha256": "b07ef835aef2ea96772c5ff95077cb1fcc24b16d84ae80e588ece1933584ad30" + "bytes": 8311, + "sha256": "9037f3010b06a73c1a42645a2735655fe4a01f4a9cc7613313ff6a9e58cad746" + }, + { + "path": "docs/README.md", + "bytes": 1667, + "sha256": "325b8df8b58afdb8cbe8f0d9603ca49d5a9c4ae6a2bb4ed781901a3368e65709" + }, + { + "path": "docs/reference/original-design-extract.md", + "bytes": 66524, + "sha256": "f3df06b49c3ad0ef6f2525988d216dd2b9e5fca8e43f4603d1112ef0ec780e2a" }, { "path": "docs/reference/VacatureRadar_functioneel_en_technisch_ontwerp.docx", @@ -791,9 +1076,84 @@ "sha256": "c67ea54e9d5eed7c8404e56d00d0a559cce01032b25890c1d3a97e31d8f640db" }, { - "path": "docs/reference/original-design-extract.md", - "bytes": 66524, - "sha256": "f3df06b49c3ad0ef6f2525988d216dd2b9e5fca8e43f4603d1112ef0ec780e2a" + "path": "fixtures/ai/evaluation_set.json", + "bytes": 2349, + "sha256": "efef3e3ac543a3d811e2298dc2432b9e73f53d5d4657bf24d7bfb1f20b420233" + }, + { + "path": "fixtures/ats/greenhouse-detail.json", + "bytes": 419, + "sha256": "676ac7ed08fe25195d29eeffdf1fc5832016420f08c4a57d758ce81689c3705f" + }, + { + "path": "fixtures/ats/greenhouse-listing.json", + "bytes": 1120, + "sha256": "a328dda66f0a9b64f6b1d35d8fabf8fedf26ade06250c5d7c30e08e613c7384e" + }, + { + "path": "fixtures/ats/lever-detail.json", + "bytes": 417, + "sha256": "91b3aae1387e62a512bae944d20b2e5a232cefd1f950ca20de3e92676ff26fb3" + }, + { + "path": "fixtures/ats/lever-listing.json", + "bytes": 807, + "sha256": "b4b995b74148a8854a14534c47df1cdc194b2951b4a11630c35065eabbd51d4d" + }, + { + "path": "fixtures/ats/recruitee-detail.json", + "bytes": 426, + "sha256": "1080c7684fa5adea9a03ba4427822c9269f4c16b9c198a635c03519a96db844b" + }, + { + "path": "fixtures/ats/recruitee-listing.json", + "bytes": 702, + "sha256": "30f13caa9a2a0319e356e1c92ec242858a44a22f10327bedd9761c7c56f174d9" + }, + { + "path": "fixtures/ats/smartrecruiters-detail.json", + "bytes": 432, + "sha256": "ccc590fc96fd6a932071a084d2375c4c57063409c00d74f681b8e836bc992139" + }, + { + "path": "fixtures/ats/smartrecruiters-listing.json", + "bytes": 757, + "sha256": "1274332f42afdf6949f6aea6bd1e60d7f68adca7bbb672f6a753ab4a8de33b34" + }, + { + "path": "fixtures/ats/workable-detail.json", + "bytes": 447, + "sha256": "5f7a8200d05a55db0dbed95f8a7f153ac6a7f50fce5f02f5945a35bc19768e31" + }, + { + "path": "fixtures/ats/workable-listing.json", + "bytes": 675, + "sha256": "920237a44787d05fdedc0bb4a014301cb486099bf67d4de660818236599e4ea5" + }, + { + "path": "fixtures/benchmark/quality_benchmark.json", + "bytes": 5101, + "sha256": "3384b79c28bd082ddba728449dca57cccff39c286cd2e9de2eac82de86145ee8" + }, + { + "path": "fixtures/discovery/feed_jobs.xml", + "bytes": 679, + "sha256": "383c67dbbba8ce9ca0ede34ae15855d2a4cd137db0dfc22e3b65a27040524ff2" + }, + { + "path": "fixtures/discovery/html_candidate_discovery.html", + "bytes": 743, + "sha256": "3da5e072cf60b84926aa65fe12b7bf875fd3eee55732571447d9b0e3ace375ad" + }, + { + "path": "fixtures/discovery/sitemap_index.xml", + "bytes": 274, + "sha256": "efb1b84c84e06dbc74369c32f041d4fb72642c7f235c0e438a9458ddf77e180b" + }, + { + "path": "fixtures/discovery/sitemap_urlset.xml", + "bytes": 311, + "sha256": "f5aa7edc8a0b910868a53ef66732851386e8ee70bc960a05206f56d69ee3f977" }, { "path": "fixtures/emails/sample_alert.eml", @@ -820,20 +1180,40 @@ "bytes": 1454, "sha256": "18f9ad33ec462ea40566eb0e7e6f711fdbb3e732fc85e10be3046e5d0da6ad93" }, + { + "path": "LICENSE", + "bytes": 1061, + "sha256": "a1e3ff537d8be01e7bec1376969d1b66ea2088dfcf7dbf1f2227793ef67c13a6" + }, { "path": "local/.gitkeep", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, + { + "path": "Makefile", + "bytes": 1236, + "sha256": "1e3b04f7b74167347c2f11bebb9161a716c6fa4e4cb2630caa8f6af044fece81" + }, { "path": "manage.py", "bytes": 450, "sha256": "ee9c7fa0f1ad7758fbf6fd6c5ec01de1e4d20cee205c6247604d8418ae000d05" }, + { + "path": "PLANS.md", + "bytes": 980, + "sha256": "0bb6d51c01003a0dbf9de3a82aeb13967f024d9c267386f29c76fc7a4be97fa6" + }, { "path": "pyproject.toml", - "bytes": 1821, - "sha256": "b373253b22134cf26dc5368d4c90757c98eb640fc516f9ab3d5c7aa6a110664a" + "bytes": 1844, + "sha256": "b0082d3efc0a35429f5eddbbcf2784f83506cf51ddaf4744a64c40da6e6934a1" + }, + { + "path": "README.md", + "bytes": 8532, + "sha256": "f8e27889ee485ae2dfc264f39a0c2a35c1f8465574212a9bd9b807e16403d158" }, { "path": "scripts/backlog.py", @@ -845,6 +1225,11 @@ "bytes": 777, "sha256": "2ebd3e5661df88cbe657f0308356867b2f73344440a5fba6a771b38975f5e6f0" }, + { + "path": "scripts/benchmark.py", + "bytes": 36754, + "sha256": "d7a0afe78cffa1e87809a719e0630d3d8c05113ca8642e4bc50cdd540f9f5d4f" + }, { "path": "scripts/codex_bootstrap.sh", "bytes": 1215, @@ -855,10 +1240,20 @@ "bytes": 370, "sha256": "985b346f381648373369e9c80bdfa854f3b90961311bcefc4fa479e2a81ccc57" }, + { + "path": "scripts/deploy_docker.sh", + "bytes": 5151, + "sha256": "f4f746d6ddc822c293cb60cba127602fb9876181bb634e88e9b408e075a09cce" + }, { "path": "scripts/entrypoint.sh", - "bytes": 220, - "sha256": "c1ec37e150b323781f11e0b4cb2c90713f8ed8c68617ca24f1df544ef69c3aec" + "bytes": 309, + "sha256": "ef5ef0561af09e970bbc7dfc49ea28f589e65c108ca02cb3cf5d4932e6a525db" + }, + { + "path": "scripts/feedback_learning_report.py", + "bytes": 4564, + "sha256": "9c473da94efbd1705d952afe6c016ce86cb38a098ad650080394306e4e251739" }, { "path": "scripts/generate_secret.py", @@ -872,8 +1267,23 @@ }, { "path": "scripts/package_project.py", - "bytes": 3714, - "sha256": "f301f8369e34b1ff9e190a3648319d26ede3dde373f0c3fc047f06928e0a26da" + "bytes": 4511, + "sha256": "af932ae25510c961b897d6fc38b5fe3d25984aebc3b75d8800eb7c77b5e06e3a" + }, + { + "path": "scripts/release_smoke.py", + "bytes": 7667, + "sha256": "61cc3b4c9e34df6ec3f01b8fcbee1f14d177e08ebcd407a4999df7bc3549ca63" + }, + { + "path": "scripts/release_verify.sh", + "bytes": 12868, + "sha256": "a8139f910e1bea5e7eb415df18edf76539de629adb10e31c5a2ef844594542e6" + }, + { + "path": "scripts/remote_deploy.sh", + "bytes": 1464, + "sha256": "42365240d91e665f914bd85f83e1c78e0d40333a6463031e72695f6ea40cc817" }, { "path": "scripts/reset_demo.sh", @@ -900,35 +1310,50 @@ "bytes": 5096, "sha256": "5c14fd14ace8772230855c6b6fe2cada7ecb6e34faf7756efdf5c613768900f9" }, + { + "path": "SECURITY.md", + "bytes": 1931, + "sha256": "9ca57ce4d8b077fe860343762595c3af3a5aad1a843582faa1bb2197b3b638a6" + }, { "path": "static/css/app.css", - "bytes": 15668, - "sha256": "141073ea194a3052e95b4f9297956b31d3f9c01378a045e49d1abd0a00bb54c6" + "bytes": 29522, + "sha256": "9343c4b4b22bb64e9dea82bc0598cf7e20b6e4465d4939698c25876f0bc57b4a" }, { "path": "static/js/app.js", - "bytes": 739, - "sha256": "72881fec1134e8b459b97d720477e12290a75f6f86ae10d2bb24dcb62dd9065b" + "bytes": 2160, + "sha256": "e601f9fba09bafb6d3783d54212e849a8b2fa0efd0d989237e89a71d70d30cc9" + }, + { + "path": "static/js/manual_import.js", + "bytes": 1728, + "sha256": "f33a0c2df55fb44da570076172cf1dd54f168b6fe07bee93494f351b2c965f72" }, { "path": "templates/applications/edit.html", - "bytes": 805, - "sha256": "2a78a7ab58fc1f17813e28ab5d21c08fac704523e81dca2185a38ebd085673dc" + "bytes": 1528, + "sha256": "db67de672690f72ae4f46bd7282f007481ca981df5bb83d18b5fdfb83af8eaa1" }, { "path": "templates/applications/list.html", - "bytes": 1202, - "sha256": "8a46870867099f7cf0f8274ed5cb51546ea45788107355b1dff20d2785f678a4" + "bytes": 1949, + "sha256": "2b3a72573223a6847165304dbcdfda0b8b8ed1debc31bcbc7885736e9fcd73d5" }, { "path": "templates/base.html", - "bytes": 2934, - "sha256": "8128637a36f33c8c00c0132309893f3eb8c040a09de151e2ae19219933e13fa3" + "bytes": 5612, + "sha256": "c7c70b22127b9df20d1746049aa9d44faa2b3ca21a6c540bac2ab7557672aa30" + }, + { + "path": "templates/components/icon_sprite.html", + "bytes": 2853, + "sha256": "1c41232f40b667e0d4a706da5798a1a68f241b39ecc48507366132de0f662b63" }, { "path": "templates/dashboard/today.html", - "bytes": 3081, - "sha256": "97b2118d5a3bc363b69ea08f7915c4b0775648c1bf0eca61675153fe15b63545" + "bytes": 5204, + "sha256": "5f0e78d1d41c1036e890343dec4b967453c1f6c78ce8fa4a022e08d5145afc40" }, { "path": "templates/emails/digest.html", @@ -940,80 +1365,135 @@ "bytes": 557, "sha256": "af12fe465718cd0f303deebe2de3c08a8e9ad6a481f03ef7c3cddc5de31874b8" }, + { + "path": "templates/emails/reminder.html", + "bytes": 1062, + "sha256": "4a4a1ed081a614b0323351915ac7ad124b194291f21ca9a789df7b5cf3a2bd33" + }, + { + "path": "templates/emails/reminder.txt", + "bytes": 682, + "sha256": "beb7766d424011d3688eecf4315c4cb23058e07226eb5565478eccb5383f9415" + }, { "path": "templates/jobs/detail.html", - "bytes": 4865, - "sha256": "b1e26189b17db9a2a299fb4d4291f3c41c6a466804771d56a47b9c59dea12769" + "bytes": 6125, + "sha256": "25cff571861995c3498e01293bbd9e656582dd5d2536d8e368a960d6be87bbe0" }, { "path": "templates/jobs/list.html", - "bytes": 2239, - "sha256": "39233157206ff13d6e2a943ba271342d85a9572edcf76405aef96550bfb07409" + "bytes": 3381, + "sha256": "586891f02d9750ec9a5c41e045a161e4f904383ba1aa5bd1abfe9e24a8b1bce7" }, { "path": "templates/profiles/edit.html", - "bytes": 1054, - "sha256": "704f4d69db7fbaf1734eb4a0f02845632cdc10d28bae76d396634898224e0407" + "bytes": 1976, + "sha256": "740ba48670743698e3f3fa833caf3035357159580aecf3cc25caad9f56d7ca32" }, { "path": "templates/profiles/list.html", - "bytes": 1307, - "sha256": "b3e8881960791018ba30df9f35f3d397b1640939fe3e7f28cdcfb436c79ae925" + "bytes": 1729, + "sha256": "2d14f3e25d4e4795f0b388454982a01294d640954f21783fa62aef1be14b6ec9" }, { "path": "templates/registration/login.html", - "bytes": 756, - "sha256": "66b568b7b2df77b27d0113f02da6790062e7ce7e14748a2550a90ac8f1924aca" + "bytes": 840, + "sha256": "b26bea5cca8afbe255dac4d4b7df6626979b6ae5acfa4a17056640021ae02560" }, { "path": "templates/sources/list.html", - "bytes": 1358, - "sha256": "163cba25b58cc23afa0badaa48fcebf5bdbb1570ee983f38e6ff1cc9b7affbf0" + "bytes": 8548, + "sha256": "602cba691063a27c42aac69a2dd3b997c627dd4f182f1f9f00aac8561e23306c" }, { "path": "templates/system/status.html", - "bytes": 993, - "sha256": "042000b3cf7ffd45d39226b20f7cd13a76aad1fd9ff9d1aa2daf75a3c251ff56" + "bytes": 1528, + "sha256": "57e31c7c1df548043587530601015168b8cf2dff352c8cd04176b4e15f1696e8" }, { "path": "tests/__init__.py", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, + { + "path": "tests/benchmark/test_benchmark.py", + "bytes": 1248, + "sha256": "6f60877f52067a5a4c401318d41c519c3bd628562827e63526df1f3d974dbc7d" + }, { "path": "tests/conftest.py", - "bytes": 2760, - "sha256": "65b913d4d444e621a49e0c4bde88ff080fb835c2a5c87e6c0612815f33b6bd42" + "bytes": 3341, + "sha256": "7a07f6d1855541a6d7789bdc1c3c1d510befc233f2ffc0a2c0e271817a8d0baf" + }, + { + "path": "tests/e2e/test_vr114_browser_and_accessibility.py", + "bytes": 11161, + "sha256": "0b1b030cea0699f48ee1d695746eb1c961d16a6e198540a045dbaae9345034fc" + }, + { + "path": "tests/integration/test_applications.py", + "bytes": 7825, + "sha256": "ebbe5a42a7d12203fc4be3ca840495873224853146a999d9b05a35d58a58750b" }, { "path": "tests/integration/test_dedupe_lifecycle_feedback.py", "bytes": 5114, "sha256": "b203198e18bab773b1bb43c03f667e934ab1d8fbcac3d923e00d5ab9b67a0169" }, + { + "path": "tests/integration/test_discovery_command.py", + "bytes": 2337, + "sha256": "18e4ecfe590b0bbe2410a129bf2e15d8a3929fe3de044f2c36c0589295f2f14a" + }, { "path": "tests/integration/test_email_import_notifications.py", "bytes": 2618, "sha256": "d8cdd08f444538e2b8ddc927e96b57a020a82a46de45f8fdd58fce7965ad7cb2" }, + { + "path": "tests/integration/test_import_geodata.py", + "bytes": 3209, + "sha256": "9a653f625777bd6748c0dedc52c53354b99190fbc07134934616594a27429d90" + }, { "path": "tests/integration/test_pipeline.py", - "bytes": 1290, - "sha256": "a112fb1277693a2d5e7d540ad7c06041538db90ffc23e354362e36e39e930f19" + "bytes": 5179, + "sha256": "c81bf3f37a7fff1bdf35b978e6a82c2c5282e657b29b63edbeb1a328d778a520" + }, + { + "path": "tests/integration/test_reminders.py", + "bytes": 4731, + "sha256": "a8de719ef79d79b772d5730d37d61544eb7d646a7152d1c605dbe440033fcd3a" + }, + { + "path": "tests/integration/test_source_health.py", + "bytes": 5333, + "sha256": "1a725d2c8a3eebf60cb3c2407b31831d1b11d15c64b95e14d504ddee357167f8" + }, + { + "path": "tests/integration/test_sources_manual_import.py", + "bytes": 3781, + "sha256": "e395579f26da375976a13e13ef5ba5cc4c49fde6fb1e99a18055af7125f19f2b" }, { "path": "tests/integration/test_tasks_and_more_views.py", - "bytes": 2933, - "sha256": "f402b24d36634125e0f52d90df3bc90926ba7f573820f95efdc7b45d6686afcf" + "bytes": 8460, + "sha256": "223d7d4415c58c339e99f11d9964c0651c9cb2c612ea9b5bdab2feb9b677af60" }, { "path": "tests/integration/test_views.py", - "bytes": 548, - "sha256": "5c7f6533865e888f6628e5f879ecd6c09e2201caa0e0555227952b7405634b18" + "bytes": 1466, + "sha256": "d903608384a3e8426121e67c0319bfe48738f12b3cd8dd58c02c6fe7d4927319" }, { "path": "tests/security/test_policy.py", - "bytes": 354, - "sha256": "a1a839f2f19b2b5a4b59f74944bc5a4a881dc08b74691a0b325fa2c5f6862f20" + "bytes": 3327, + "sha256": "9b2d73a19dc8dffbeda89fe52e988fa4fb572e2599c78f36d7c756e83afaea09" + }, + { + "path": "tests/security/test_robots.py", + "bytes": 2885, + "sha256": "f86ad2ef7a48d83ccb97f36dafe51a44ef0519ca011996f928ee2d25527689ac" }, { "path": "tests/security/test_sanitize.py", @@ -1027,44 +1507,74 @@ }, { "path": "tests/unit/test_ai.py", - "bytes": 2468, - "sha256": "fe95dfb85f9e5f7cd2ae9da4439c83c5fa90eb55e97a516ccd52bde71ce7dd9b" + "bytes": 4687, + "sha256": "0167c9fe77ddab53062e061b25ea4aa1684890be79c7ac21cebf2d1d1980ae92" + }, + { + "path": "tests/unit/test_ats_adapters.py", + "bytes": 5360, + "sha256": "aefc66fba10d9f7ad11308b08cdbbad4fb566522c929d49ed670f5f6bdb0135b" }, { "path": "tests/unit/test_canonicalize.py", "bytes": 526, "sha256": "7aadf35994dd99c5352e3d927e5ffaaff688fbbfc5708ac05afd9f377ecde726" }, + { + "path": "tests/unit/test_deployment_configuration.py", + "bytes": 1060, + "sha256": "5ba775564059be474cd4ed4454b02f431598f62a6dffe7ba22dcd1a3ded99800" + }, { "path": "tests/unit/test_discovery_rss.py", - "bytes": 1161, - "sha256": "1752d396087fe1eebec508fc20a23ed7681695fec661db69d31e82af09156744" + "bytes": 4483, + "sha256": "b50ed7be28ab196c53cd3fc0ce39c4d9aad86836ba3eeecabcb6af8292eda214" }, { "path": "tests/unit/test_email_adapter.py", "bytes": 521, "sha256": "c08836446bc7be70a8ef1dddce4ea083c4bc70b871878d123c0f7b44f793ebd6" }, + { + "path": "tests/unit/test_employer_resolution.py", + "bytes": 6235, + "sha256": "c25e27e05ac4418130766f2d9203830be6a178767cea9c82706a4b0591fa019d" + }, { "path": "tests/unit/test_features_distance.py", - "bytes": 784, - "sha256": "4b0abf5fc3dd2132ae4fbd332768192d8eda7bee07b1ce960dd9619c743d2da3" + "bytes": 1673, + "sha256": "336710832c042c4167d89c57440b5472fe72a77aeddb0d60d9f8eb80a38f3b9f" + }, + { + "path": "tests/unit/test_feedback_learning.py", + "bytes": 1477, + "sha256": "9edab6468bc8c2d196e6b1c54720891e4f018fc9eb6dddfe441359180c9c9f3c" }, { "path": "tests/unit/test_fetcher.py", - "bytes": 3410, - "sha256": "5a91c2837c6b96f54562146a5eb4ee0e7c97cc48b9477a876e7cab2cef9e212c" + "bytes": 5319, + "sha256": "ecdbc46a10c6a68cc2802b21e759ddf44ff7f725f968fc974139204586f336dc" }, { "path": "tests/unit/test_generic_html_adapter.py", "bytes": 506, "sha256": "ab4f53f6b7b0be533747478c158cad3d3804258a89c34166cedcb5c06b4f179c" }, + { + "path": "tests/unit/test_geocoding.py", + "bytes": 6798, + "sha256": "11a79bb94cdd6d5c60674de80623ef48f6575fd237d68ef5a86d6fe3a501ca38" + }, { "path": "tests/unit/test_jsonld_adapter.py", "bytes": 583, "sha256": "d1319359e4cf20dd85c0921d36b01b6552dfa2e2763b1c51485e26e339cf4b3a" }, + { + "path": "tests/unit/test_manual_import_service.py", + "bytes": 3049, + "sha256": "c5a581ab1fb02576233afed3a3ef5b622fe7f4fc62d38abe13c103c51e77d634" + }, { "path": "tests/unit/test_normalization.py", "bytes": 587, @@ -1075,10 +1585,25 @@ "bytes": 2285, "sha256": "1368e9cde247289f083924a99b5ef0ca72814c884dc91750cb2d263cc5184475" }, + { + "path": "tests/unit/test_rate_limit.py", + "bytes": 2504, + "sha256": "18a8c3d57c031205a270aa753d9cc8f6effb2bf504760723ab94df7e3d36c5ed" + }, + { + "path": "tests/unit/test_scheduling.py", + "bytes": 2846, + "sha256": "12fa21097a7f2b8213a9776b86ad4f98e278147b4b4c4cef49f04ca649a90c95" + }, { "path": "tests/unit/test_scoring.py", - "bytes": 2099, - "sha256": "2f7cea4bb517352ae3f093be4c320390796979ee49da8faf8d7ac0eb7dc485de" + "bytes": 7665, + "sha256": "84d5d0f4a5eaf486f6af0692b93c4e0998067ff07e032f01a091f7e8a003078f" + }, + { + "path": "tests/unit/test_settings_security.py", + "bytes": 2050, + "sha256": "9a1e3eecf3d6d51b9ecfdef13f2f063d73428c309e75d92591fb948b9a1b6ccc" }, { "path": "tests/unit/test_source_models.py", @@ -1087,8 +1612,13 @@ }, { "path": "uv.lock", - "bytes": 108994, - "sha256": "15d823a2dcce4c92003bc74faee711b140cf20711d5dd2303963a4e243c9c34e" + "bytes": 87544, + "sha256": "c7931fe4292624e9ab85dbb21ec18ef7c7c5f4b96d13d6f5a9221d0fb0398812" + }, + { + "path": "VERIFICATION_REPORT.md", + "bytes": 4650, + "sha256": "cd1680b3929606470698eca25a89af93f3582e67ae0234a7e2368ffa686ab6a4" } ] } diff --git a/README.md b/README.md index e413276..a4b5ea2 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ De repository bevat zowel een **werkende MVP-kern** als de volledige product-, a Reeds geïmplementeerd: -- Django 5.2-modulaire monoliet met Nederlandstalige responsieve interface; +- Django 5.2-modulaire monoliet met Nederlandstalige responsive dark/light Intelligence Cockpit; - PostgreSQL in productie en SQLite voor lokale ontwikkeling; - Celery-worker en scheduler via Redis; - veilige HTTP-fetcher met domeinbeleid, redirecthercontrole, contentlimieten en SSRF-blokkering; @@ -180,6 +180,7 @@ Lees [`SECURITY.md`](SECURITY.md) en [`docs/quality/THREAT_MODEL.md`](docs/quali - [Systeemarchitectuur](docs/architecture/SYSTEM_ARCHITECTURE.md) - [Datamodel](docs/architecture/DATA_MODEL.md) - [UX- en designspecificatie](docs/design/UX_SPEC.md) +- [Stitch-integratieplan en schermmapping](docs/design/STITCH_INTEGRATION_PLAN.md) - [Bron- en adaptercontract](docs/architecture/SOURCE_ADAPTERS.md) - [Scoringengine](docs/architecture/SCORING_ENGINE.md) - [Unraid-deployment](docs/operations/UNRAID_DEPLOYMENT.md) diff --git a/VERIFICATION_REPORT.md b/VERIFICATION_REPORT.md index 723cacd..95a1d02 100644 --- a/VERIFICATION_REPORT.md +++ b/VERIFICATION_REPORT.md @@ -91,4 +91,12 @@ Uitgevoerde browsermatrix: Screenshots: `docs/design/validation/`. Deze map en de originele Stitch-referentie zijn via `.dockerignore` uitgesloten van de productiecontainer. -De volledige afrondingsgate en actuele aantallen worden onderaan dit rapport toegevoegd na `scripts/codex_verify.sh`. +Volledige afrondingsgate: + +- Ruff: geslaagd; +- Django system check: geslaagd; +- migratiecontrole: geen wijzigingen; +- pytest: 146 geslaagd, 2 optionele Playwrightvarianten overgeslagen met geslaagde HTML/a11y-fallback; +- branch-aware codedekking: 82,00%, boven de vereiste 70%; +- taakledger: 36 taken, waarvan 28 done, 5 blocked-external, 3 deferred en 0 ready; +- repositorydocumentatie en configuratie: geldig. diff --git a/docs/README.md b/docs/README.md index 35e7f6d..fa22acd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,6 +10,8 @@ De documentatie is opgesplitst per beslisniveau zodat een mens of coding agent a - `product/PRODUCT_REQUIREMENTS.md` — wat het product moet doen; - `architecture/SYSTEM_ARCHITECTURE.md` — hoe het systeem is opgebouwd; - `design/UX_SPEC.md` — gebruikerservaring en schermgedrag; +- `design/STITCH_INTEGRATION_PLAN.md` — mapping van de Stitch Intelligence Cockpit naar echte Django-routes en data; +- `design/validation/` — responsieve browservalidatiebeelden van VR-118 (niet in de productiecontainer); - `operations/UNRAID_DEPLOYMENT.md` — productie-installatie; - `quality/DEFINITION_OF_DONE.md` — afrondingsnorm. - `../VERIFICATION_REPORT.md` — bewezen baseline en expliciete verificatiebeperkingen. diff --git a/docs/ai/PROJECT_STATE.md b/docs/ai/PROJECT_STATE.md index 123247c..a713522 100644 --- a/docs/ai/PROJECT_STATE.md +++ b/docs/ai/PROJECT_STATE.md @@ -33,6 +33,14 @@ Release-audit op 2026-07-21: - een echte Dockerimagebuild op de Unraid-server, migratiecontrole en live LAN-smoke voor liveness, readiness, login en static assets zijn geslaagd; - deploymenthardening voorkomt gelijktijdige migraties door worker/scheduler, schakelt de Gunicorn-controlsocket uit voor de read-only container en houdt de lokale healthcheckhost toegestaan. +VR-118-herverificatie op 2026-07-21: + +- 146 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd; +- 82,00% branch-aware codedekking; +- Ruff, Django system check en migratiecontrole geslaagd; +- taakledger geldig met 36 taken: 28 done, 5 blocked-external, 3 deferred en 0 ready; +- geïntegreerde browservalidatie op zes viewports en beide thema's geslaagd. + ## Deploymentstatus - `main` is via de bestaande Gitea-SSH-sleutel naar `NuklearRabbit/VacatureRadar` gepusht. diff --git a/scripts/package_project.py b/scripts/package_project.py index 14319f9..6faaff3 100644 --- a/scripts/package_project.py +++ b/scripts/package_project.py @@ -4,6 +4,7 @@ from __future__ import annotations import argparse import hashlib import json +import os import shutil import tempfile import zipfile @@ -41,7 +42,17 @@ def is_included(path: Path) -> bool: def iter_files() -> Iterable[Path]: - return sorted(path for path in ROOT.rglob("*") if is_included(path)) + files: list[Path] = [] + for directory, dirnames, filenames in os.walk(ROOT): + dirnames[:] = sorted(name for name in dirnames if name not in EXCLUDED_DIRS) + base = Path(directory) + if base == ROOT / "local": + dirnames.clear() + for filename in sorted(filenames): + path = base / filename + if is_included(path): + files.append(path) + return sorted(files) def sha256(path: Path) -> str: @@ -52,9 +63,10 @@ def sha256(path: Path) -> str: return digest.hexdigest() -def write_manifest(staging_root: Path) -> None: +def write_manifest(staging_root: Path, paths: Iterable[Path] | None = None) -> None: entries = [] - for path in sorted(staging_root.rglob("*")): + candidates = sorted(paths) if paths is not None else sorted(staging_root.rglob("*")) + for path in candidates: if not path.is_file() or path.name == "PROJECT_MANIFEST.json": continue entries.append( @@ -103,6 +115,11 @@ def package(output: Path) -> tuple[int, str]: def main() -> int: parser = argparse.ArgumentParser(description="Maak een schone VacatureRadar-project-ZIP") + parser.add_argument( + "--manifest-only", + action="store_true", + help="Werk alleen PROJECT_MANIFEST.json in de repository bij.", + ) parser.add_argument( "output", nargs="?", @@ -110,6 +127,10 @@ def main() -> int: default=ROOT.parent / "VacatureRadar_Project.zip", ) args = parser.parse_args() + if args.manifest_only: + write_manifest(ROOT, iter_files()) + print(f"Manifest: {(ROOT / 'PROJECT_MANIFEST.json').resolve()}") + return 0 size, checksum = package(args.output) print(f"ZIP: {args.output.resolve()}") print(f"Bytes: {size}")