Compare commits

..

86 Commits

Author SHA1 Message Date
cesnimda 2eb0a24a74 fix(i18n): initialize new applications on local today 2026-11-11 07:51:20 +01:00
cesnimda f7c3617e63 docs(i18n): distinguish raw receipt whitespace warning 2026-11-11 07:42:46 +01:00
cesnimda 926f423f70 fix(i18n): preserve local calendar day in job date pickers 2026-11-11 07:42:27 +01:00
cesnimda ec57a24d77 test(a3): preserve saved search drawer regression evidence 2026-11-11 07:27:15 +01:00
cesnimda 07df0c688d test(discovery): retain saved search and tracker verifier flows with drawer 2026-11-11 07:26:24 +01:00
cesnimda 1d73367576 test(a3): seal integrated discovery drawer evidence 2026-11-11 07:14:44 +01:00
cesnimda 4f3541e5b8 test(discovery): verify drawer focus and retained search journeys 2026-11-11 07:12:49 +01:00
cesnimda 7e23a27463 test(applications): preserve server-backed density and action evidence 2026-11-11 07:07:15 +01:00
cesnimda a6ec225598 feat(discovery): move mobile filters into accessible drawer 2026-11-11 07:05:42 +01:00
cesnimda ce7e48665c fix(i18n): sort discovery titles using selected UI locale 2026-11-10 23:22:41 +01:00
cesnimda 6c75e97bdb docs(perf): preserve native rules freshness receipts 2026-11-10 23:22:41 +01:00
cesnimda e286be48ba fix(rules): read saved thresholds without stale cache 2026-11-10 23:22:40 +01:00
cesnimda 64603f5602 fix(applications): preserve mobile title space and selected link contrast 2026-11-10 23:22:40 +01:00
cesnimda aac0f3b3a9 docs(a3): reconcile application route coverage 2026-11-10 23:11:58 +01:00
cesnimda 9c9fe48d5f test(a3): qualify compact application actions across responsive states 2026-11-10 23:11:24 +01:00
cesnimda bfbfaeb903 fix(applications): keep row actions within viewport 2026-11-10 23:10:21 +01:00
cesnimda 86c589a0e0 feat(applications): consolidate row actions into keyboard menus 2026-11-10 23:04:08 +01:00
cesnimda 70ddee8d3d test(perf): qualify A3 Jobs integration and mobile split tradeoff 2026-11-10 22:49:53 +01:00
cesnimda b6ee418c7a fix(i18n): integrate localised admin metrics 2026-11-10 22:49:05 +01:00
cesnimda b8292f6f72 perf(jobs): integrate locale-stable reads and salary formatting 2026-11-10 22:44:24 +01:00
cesnimda 6bfdbd9db7 perf(companies): integrate verified owner cache invalidation 2026-11-10 17:44:51 +01:00
cesnimda bca750446f perf(applications): bound correspondence reads to the current page 2026-11-10 17:42:08 +01:00
cesnimda 327d99dfda test(admin): qualify compact user actions 2026-11-10 17:38:42 +01:00
cesnimda 171a69089f feat(admin): consolidate user actions into keyboard menus 2026-11-10 17:37:37 +01:00
cesnimda fd524a4b9d test(admin): qualify recent audit filters and disclosure 2026-11-10 13:24:48 +01:00
cesnimda cd69b769a2 feat(admin): filter and expand recent audit events 2026-11-10 13:23:26 +01:00
cesnimda 49e79875d9 test(admin): qualify recent audit search and responsive feedback 2026-11-10 13:12:23 +01:00
cesnimda 1a8a97a578 feat(admin): search recent audit metadata 2026-11-10 13:11:29 +01:00
cesnimda 2033aea31b fix(security): integrate mail subject isolation into A3 2026-11-10 12:48:38 +01:00
cesnimda 2717c6afaf test(admin): qualify read-only account status 2026-11-10 12:46:45 +01:00
cesnimda e22f2d6450 feat(admin): show read-only account 2FA status 2026-11-10 12:45:11 +01:00
cesnimda 13c9c65352 test(admin): qualify status refresh and document diagnostics 2026-11-10 12:42:57 +01:00
cesnimda 4981a24238 fix(admin): keep status timestamp above secondary warnings 2026-11-10 12:40:07 +01:00
cesnimda 320bf6d1c7 feat(admin): show when system status last refreshed 2026-11-10 12:37:34 +01:00
cesnimda d6e5a45ba2 test(admin): qualify the users table alignment 2026-11-10 12:35:20 +01:00
cesnimda dddec04366 fix(admin): align user details and actions within each row 2026-11-10 12:33:02 +01:00
cesnimda 252759f420 test(applications): qualify the explicit selection mode 2026-11-10 12:28:50 +01:00
cesnimda 1246994cca feat(applications): make bulk selection an explicit mode 2026-11-10 12:26:06 +01:00
cesnimda 99a2b6f4f6 test(discovery): qualify search-first layout and keyboard submission 2026-11-09 23:03:59 +01:00
cesnimda 0540e84ff6 feat(discovery): lead with the existing search controls 2026-11-09 22:57:07 +01:00
cesnimda bd34a3504f test(launch): capture existing public homepage baseline 2026-11-09 22:56:22 +01:00
cesnimda 0bb7226725 docs(roadmap): incorporate A3 refinements and Europe readiness 2026-11-09 22:56:00 +01:00
cesnimda 511945b4f2 test(settings): qualify privacy read and rejected save recovery 2026-11-09 22:50:33 +01:00
cesnimda 91e5a6bf3a test(i18n): qualify Gmail review counts across EN and NB 2026-11-09 22:41:12 +01:00
cesnimda e8e7d83958 fix(i18n): use singular Gmail review counts 2026-11-09 22:36:32 +01:00
cesnimda 2af1502594 test(admin): qualify audit timestamps and table density 2026-11-09 22:35:58 +01:00
cesnimda 2dc8fe4c31 fix(admin): preserve audit table density when columns scroll 2026-11-09 22:33:55 +01:00
cesnimda 9c95096e1a fix(admin): keep audit timestamps readable in narrow tables 2026-11-09 22:31:05 +01:00
cesnimda f79024df69 test(mail): qualify review recovery and draft conflict 2026-11-09 22:30:10 +01:00
cesnimda 71c927b15b test(admin): qualify heading hierarchy across four routes 2026-11-09 22:25:02 +01:00
cesnimda c7e8627ca7 fix(admin): consolidate route headings and descriptions 2026-11-09 22:16:59 +01:00
cesnimda e585561a02 test(calendar): qualify connected follow-up and agenda refresh 2026-11-09 22:12:27 +01:00
cesnimda c0ef4171d5 fix(calendar): refresh recorded dates after follow-up changes 2026-11-04 13:34:16 +01:00
cesnimda e70c7098cd test(i18n): qualify CV singular captions and preserved editor behavior 2026-11-04 13:21:23 +01:00
cesnimda 122956b6a3 fix(i18n): use singular CV entry and page captions 2026-11-04 13:16:44 +01:00
cesnimda 7e2bf20187 test(ui): qualify profile selection to CV download workflow 2026-11-04 13:09:29 +01:00
cesnimda 8fef819c4e test(i18n): qualify singular counts across table and board 2026-11-04 09:26:58 +01:00
cesnimda 9bfc51b067 fix(i18n): localize singular matching job counts 2026-11-04 09:22:59 +01:00
cesnimda ed4ce4cc3a test(ui): qualify connected discovery to tracker journey 2026-11-04 09:15:09 +01:00
cesnimda b5b9069d1e test(ui): qualify career evidence read and recovery states 2026-11-04 09:06:47 +01:00
cesnimda 505b0c01b9 test(ui): qualify settings and themed toast feedback 2026-11-04 09:02:07 +01:00
cesnimda a84a97cb61 fix(ui): apply application theme to toast feedback 2026-11-04 08:54:26 +01:00
cesnimda 266e8bc09d style(ui): open settings quick capture section 2026-11-04 08:51:32 +01:00
cesnimda 0e2ccfe984 test(ui): qualify flat administration across responsive locales 2026-11-04 08:48:35 +01:00
cesnimda d651ce7aa4 style(ui): flatten administration collections and diagnostics 2026-11-04 08:40:02 +01:00
cesnimda 1427eb2184 test(i18n): qualify singular mail counts across responsive locales 2026-11-04 08:25:36 +01:00
cesnimda cd116ab8ca fix(i18n): use singular mail label counts in English and Bokmal 2026-11-04 08:16:01 +01:00
cesnimda 1881fdb224 test(ui): qualify flat mail rows and recorded application context 2026-11-04 08:11:38 +01:00
cesnimda a9208ab4b3 feat(ui): show recorded application context beside opened mail 2026-11-04 08:00:43 +01:00
cesnimda dd284782fd test(ui): qualify career documents calendar and chart visuals 2026-11-04 07:48:23 +01:00
cesnimda b31ce6176b style(ui): open career and document surfaces and show single-month activity 2026-11-04 07:16:25 +01:00
cesnimda 79d7bbe0a1 test(ui): qualify denser dashboard discovery and offer date states 2026-11-04 07:06:46 +01:00
cesnimda a7d726738b style(ui): reduce initial dashboard gaps and flatten discovery rows 2026-11-04 01:58:30 +01:00
cesnimda df0ef68cd9 fix(i18n): preserve literal calendar dates in offer comparisons 2026-11-04 01:58:27 +01:00
cesnimda 09904ecc68 test(i18n): qualify public language controls across responsive states 2026-11-04 01:52:11 +01:00
cesnimda fa6bd5d98e fix(i18n): preserve public auth commands and feedback across language changes 2026-11-04 01:44:39 +01:00
cesnimda 368e90d572 test(ui): qualify account sections and editor hierarchy 2026-11-04 01:41:02 +01:00
cesnimda b6d830f279 style(ui): simplify account sections and prioritise recorded role titles
81 account and 16 layout tests pass. Settled export built; fresh rendered matrices and final visual acceptance remain pending.
2026-11-04 01:13:24 +01:00
cesnimda 1c88cacb4d test(ui): qualify flat application layouts and keyboard focus 2026-11-04 01:06:13 +01:00
cesnimda c9138af01e style(ui): open application rows and workspace sections
65 targeted tests and focused six-state phone pilot pass. Full 216-state visual qualification remains pending; final owner acceptance is separate.
2026-11-04 00:56:57 +01:00
cesnimda af2df36062 test(ui): qualify responsive secondary and application routes 2026-11-04 00:47:24 +01:00
cesnimda 69621788ee style(ui): flatten activity and offer comparison sections
61 selected tests and build/lint pass. Wider rendered qualification remains in progress; this local checkpoint does not establish visual acceptance.
2026-11-04 00:41:27 +01:00
cesnimda 2218659ecf feat(ui): simplify A3 workspace and refresh saved AI availability 2026-11-04 00:21:04 +01:00
cesnimda 7aa54bff1f test(ui): qualify retained secondary routes and preservation map 2026-11-03 20:27:34 +01:00
cesnimda ccf8d26426 fix(ui): retain locale-aware document review labels 2026-11-03 20:09:19 +01:00
cesnimda 31ce702716 fix(i18n): localise attachment size displays 2026-11-03 19:56:33 +01:00
6222 changed files with 153240 additions and 682 deletions
@@ -159,6 +159,82 @@ public sealed class AdminProcessingControllerTests
Assert.Equal(expected, (await client.GetAsync(route)).StatusCode);
}
[Fact]
public async Task Audit_log_keeps_mail_subjects_in_the_owner_record()
{
await using var host = await Host.Start();
const string privateSubject = "Synthetic private correspondence subject";
const string operationalNote = "Synthetic workflow status change";
await using (var scope = host.Services.CreateAsyncScope())
{
var db = scope.ServiceProvider.GetRequiredService<JobTrackerContext>();
db.JobEvents.AddRange(
new JobEvent { JobApplicationId = 2, Type = "ReplyReceived", NewValue = "True:2026-11-03", Note = privateSubject, At = DateTime.UtcNow },
new JobEvent { JobApplicationId = 2, Type = "StatusChanged", OldValue = "Applied", NewValue = "Interview", Note = operationalNote, At = DateTime.UtcNow });
await db.SaveChangesAsync();
}
using var anonymous = host.Client(null);
using var ordinary = host.Client("owner");
foreach (var (client, status) in new[] { (anonymous, HttpStatusCode.Unauthorized), (ordinary, HttpStatusCode.Forbidden) })
{
using var response = await client.GetAsync("/api/admin/audit");
Assert.Equal(status, response.StatusCode);
Assert.DoesNotContain(privateSubject, await response.Content.ReadAsStringAsync());
}
using var admin = host.Client("admin");
var audit = await admin.GetFromJsonAsync<JsonElement>("/api/admin/audit");
var events = audit.EnumerateArray().ToDictionary(item => item.GetProperty("type").GetString()!);
Assert.DoesNotContain(privateSubject, audit.GetRawText());
var reply = events["ReplyReceived"];
Assert.Equal(JsonValueKind.Null, reply.GetProperty("note").ValueKind);
Assert.Equal("True:2026-11-03", reply.GetProperty("newValue").GetString());
Assert.Equal(2, reply.GetProperty("jobApplicationId").GetInt32());
Assert.Equal(operationalNote, events["StatusChanged"].GetProperty("note").GetString());
await using var verifyScope = host.Services.CreateAsyncScope();
var verifyDb = verifyScope.ServiceProvider.GetRequiredService<JobTrackerContext>();
Assert.Equal(privateSubject, await verifyDb.JobEvents.IgnoreQueryFilters().Where(item => item.Type == "ReplyReceived").Select(item => item.Note).SingleAsync());
}
[Fact]
public async Task User_polling_does_not_expose_another_owners_notifications_or_processing_records()
{
await using var host = await Host.Start();
var foreignNoticeId = Guid.NewGuid();
const string foreignNotice = "Synthetic notice for the other owner";
await using (var scope = host.Services.CreateAsyncScope())
{
var db = scope.ServiceProvider.GetRequiredService<JobTrackerContext>();
db.UserNotifications.AddRange(
new UserNotification { Id = Guid.NewGuid(), OwnerUserId = "owner", Kind = "operation_failed", Title = "Operation failed", Message = "Synthetic owner notice", CreatedAtUtc = DateTime.UtcNow },
new UserNotification { Id = foreignNoticeId, OwnerUserId = "other", Kind = "operation_failed", Title = "Operation failed", Message = foreignNotice, CreatedAtUtc = DateTime.UtcNow });
await db.SaveChangesAsync();
}
using var owner = host.Client("owner");
var notices = await owner.GetFromJsonAsync<JsonElement>("/api/notifications?owner=other");
Assert.Equal("Synthetic owner notice", Assert.Single(notices.EnumerateArray()).GetProperty("message").GetString());
var unread = await owner.GetFromJsonAsync<JsonElement>("/api/notifications/unread-count?owner=other");
Assert.Equal(1, unread.GetProperty("count").GetInt32());
Assert.Equal(HttpStatusCode.NotFound, (await owner.PostAsync($"/api/notifications/{foreignNoticeId}/read", null)).StatusCode);
Assert.Equal(HttpStatusCode.NotFound, (await owner.DeleteAsync($"/api/notifications/{foreignNoticeId}")).StatusCode);
Assert.Equal(HttpStatusCode.NotFound, (await owner.GetAsync($"/api/operations/{host.ForeignSubjectOperationId}")).StatusCode);
var ownOperation = await owner.GetStringAsync($"/api/operations/{host.OperationId}");
foreach (var internalValue in new[] { "SECRET_TOKEN", "SECRET_EXCEPTION", "SECRET_RESULT", "SECRET_CV_CONTENT" })
Assert.DoesNotContain(internalValue, ownOperation);
using var other = host.Client("other");
notices = await other.GetFromJsonAsync<JsonElement>("/api/notifications");
Assert.Equal(foreignNotice, Assert.Single(notices.EnumerateArray()).GetProperty("message").GetString());
await using var verifyScope = host.Services.CreateAsyncScope();
var verifyDb = verifyScope.ServiceProvider.GetRequiredService<JobTrackerContext>();
var notice = await verifyDb.UserNotifications.IgnoreQueryFilters().SingleAsync(item => item.Id == foreignNoticeId);
Assert.Null(notice.ReadAtUtc);
Assert.Null(notice.DismissedAtUtc);
}
[Fact]
public async Task Admin_projection_filters_owners_and_never_returns_raw_processing_contents_or_lease_data()
{
@@ -216,7 +292,9 @@ public sealed class AdminProcessingControllerTests
var builder = WebApplication.CreateBuilder();
builder.Logging.ClearProviders(); builder.WebHost.UseUrls("http://127.0.0.1:0");
builder.Services.AddControllers().AddApplicationPart(typeof(AuthController).Assembly);
builder.Services.AddAuthentication("test").AddScheme<AuthenticationSchemeOptions, TestAuthentication>("test", _ => { });
builder.Services.AddAuthentication("test")
.AddScheme<AuthenticationSchemeOptions, TestAuthentication>("test", _ => { })
.AddScheme<AuthenticationSchemeOptions, TestAuthentication>("local", _ => { });
builder.Services.AddAuthorization(); builder.Services.AddHttpContextAccessor();
builder.Services.AddRateLimiter(options =>
{
@@ -226,6 +304,8 @@ public sealed class AdminProcessingControllerTests
_ => new FixedWindowRateLimiterOptions { PermitLimit = permits, Window = TimeSpan.FromMinutes(1), QueueLimit = 0 }));
});
builder.Services.AddScoped<ICurrentUserService, CurrentUserService>();
builder.Services.AddScoped<UserOperationStore>();
builder.Services.AddScoped<UserNotificationStore>();
builder.Services.AddSingleton(TimeProvider.System);
builder.Services.AddDbContext<JobTrackerContext>(options => options.UseSqlite($"Data Source={Path.Combine(directory, "processing.db")};Pooling=False"));
var app = builder.Build();
@@ -1,4 +1,5 @@
using System.Security.Claims;
using System.Data.Common;
using JobTrackerApi.Controllers;
using JobTrackerApi.Data;
using JobTrackerApi.Models;
@@ -8,6 +9,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Moq;
using Xunit;
@@ -16,6 +18,78 @@ namespace JobTrackerApi.Tests;
// Real SQLite: EF InMemory cannot prove LIKE, relational ordering or tenant joins.
public sealed class JobQueryParityTests
{
[Theory]
[InlineData(250)]
[InlineData(2500)]
public async Task Ordinary_table_materialises_correspondence_groups_only_for_the_returned_page(int size)
{
await using var connection = new SqliteConnection("Data Source=:memory:");
await connection.OpenAsync();
var aggregate = new CorrespondenceAggregateRecorder();
var options = new DbContextOptionsBuilder<JobTrackerContext>().UseSqlite(connection).AddInterceptors(aggregate).Options;
var user = new Mock<ICurrentUserService>();
user.SetupGet(x => x.UserId).Returns("owner");
await using var db = new JobTrackerContext(options, user.Object);
await db.Database.EnsureCreatedAsync();
db.Users.AddRange(new ApplicationUser { Id = "owner", UserName = "owner" }, new ApplicationUser { Id = "other", UserName = "other" });
var company = new Company { Name = "Synthetic", OwnerUserId = "owner" };
var jobs = Enumerable.Range(0, size).Select(i => new JobApplication
{
Company = company, OwnerUserId = "owner", JobTitle = $"Application {i:D4}", Status = "Applied",
DateApplied = new DateTime(2026, 10, 1),
}).ToList();
db.JobApplications.AddRange(jobs);
await db.SaveChangesAsync();
db.Correspondences.AddRange(jobs.Select(job => new Correspondence
{
JobApplicationId = job.Id, Content = "Synthetic mail", From = "Company", Date = new DateTime(2026, 10, 2),
}));
await db.SaveChangesAsync();
user.SetupGet(x => x.UserId).Returns("other");
var foreign = new JobApplication { Company = new Company { Name = "Foreign", OwnerUserId = "other" }, OwnerUserId = "other", JobTitle = "Foreign", Status = "Applied" };
db.JobApplications.Add(foreign);
await db.SaveChangesAsync();
db.Correspondences.Add(new Correspondence { JobApplicationId = foreign.Id, Content = "Foreign mail", From = "Company", Date = new DateTime(2026, 10, 3) });
await db.SaveChangesAsync();
user.SetupGet(x => x.UserId).Returns("owner");
var controller = new JobApplicationsController(db, Mock.Of<ISummarizerService>(), TestHostFactory.CreateUserManager().Object)
{
ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity([new Claim(ClaimTypes.NameIdentifier, "owner")], "test")) } }
};
var result = await controller.GetAll(page: 2, pageSize: 15, sortBy: "jobTitle", sortDir: "asc");
var page = Assert.IsType<PagedResult<JobApplicationDto>>(Assert.IsType<OkObjectResult>(result.Result).Value);
Assert.Equal(size, page.Total);
var expected = jobs.Skip(15).Take(15).Select(job => job.Id).ToArray();
Assert.Equal(expected, page.Items.Select(job => job.Id));
var (sql, parameters) = Assert.Single(aggregate.Commands);
await using var replay = connection.CreateCommand();
replay.CommandText = sql;
foreach (var parameter in parameters) replay.Parameters.AddWithValue(parameter.Key, parameter.Value ?? DBNull.Value);
var materialised = new List<int>();
await using (var reader = await replay.ExecuteReaderAsync())
while (await reader.ReadAsync()) materialised.Add(reader.GetInt32(0));
Assert.Equal(15, materialised.Count);
Assert.Equal(expected.Order(), materialised.Order());
aggregate.Commands.Clear();
await controller.GetBoard();
await controller.GetAll(q: "absent");
Assert.Empty(aggregate.Commands);
}
private sealed class CorrespondenceAggregateRecorder : DbCommandInterceptor
{
public List<(string Sql, Dictionary<string, object?> Parameters)> Commands { get; } = [];
public override ValueTask<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result, CancellationToken cancellationToken = default)
{
if (command.CommandText.Contains("MAX(", StringComparison.OrdinalIgnoreCase) && command.CommandText.Contains("\"Correspondences\"", StringComparison.Ordinal))
Commands.Add((command.CommandText, command.Parameters.Cast<DbParameter>().ToDictionary(p => p.ParameterName, p => p.Value)));
return ValueTask.FromResult(result);
}
}
[Theory]
[InlineData("all")]
[InlineData("search")]
@@ -0,0 +1,206 @@
using JobTrackerApi.Controllers;
using JobTrackerApi.Data;
using JobTrackerApi.Models;
using JobTrackerApi.Services;
using JobTrackerApi.Tests.TestSupport;
using System.Security.Claims;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Moq;
using Xunit;
namespace JobTrackerApi.Tests;
public sealed class RuleSettingsFreshnessTests
{
[Theory]
[InlineData("list")]
[InlineData("board")]
[InlineData("detail")]
[InlineData("reminders")]
[InlineData("readiness")]
public async Task Saved_owner_thresholds_are_visible_on_the_next_read(string surface)
{
await using var fixture = await Fixture.CreateAsync();
await using var read = fixture.Context("owner-a");
var controller = fixture.Controller(read);
Assert.False(await FollowUp(controller, fixture.JobA, surface));
await using (var write = fixture.Context("owner-a"))
Assert.IsType<NoContentResult>(await new RulesController(write).Update(Settings(1), default));
// Reuse the reader after the committed write: tracked entities must not mask persistence.
Assert.True(await FollowUp(controller, fixture.JobA, surface));
}
[Fact]
public async Task Saving_owner_a_preserves_owner_b_and_existing_readers_see_subsequent_writes()
{
await using var fixture = await Fixture.CreateAsync();
await using var a = fixture.Context("owner-a");
await using var b = fixture.Context("owner-b");
var ca = fixture.Controller(a);
var cb = fixture.Controller(b);
Assert.False(await FollowUp(ca, fixture.JobA, "list"));
Assert.False(await FollowUp(cb, fixture.JobB, "list"));
await using (var write = fixture.Context("owner-a"))
await new RulesController(write).Update(Settings(1), default);
Assert.True(await FollowUp(ca, fixture.JobA, "list"));
Assert.False(await FollowUp(cb, fixture.JobB, "list"));
// A later write in the opposite direction must also be visible through both old/new controllers.
await using (var write = fixture.Context("owner-a"))
await new RulesController(write).Update(Settings(30), default);
await using var fresh = fixture.Context("owner-a");
Assert.False(await FollowUp(fixture.Controller(fresh), fixture.JobA, "list"));
Assert.False(await FollowUp(ca, fixture.JobA, "list"));
}
[Fact]
public async Task Completing_an_older_request_cannot_restore_old_rules_after_a_save()
{
await using var fixture = await Fixture.CreateAsync();
await using var oldRead = fixture.Context("owner-a");
var reached = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
var release = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
var users = TestHostFactory.CreateUserManager();
users.Setup(x => x.FindByIdAsync("owner-a")).Returns(async () =>
{
// GetById has already loaded/evaluated the old rules; no model is called.
reached.TrySetResult(true);
await release.Task;
return (ApplicationUser?)null;
});
var older = new JobApplicationsController(oldRead, Mock.Of<ISummarizerService>(), users.Object)
{
ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext
{
User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "owner-a") }, "test")),
} },
};
var pending = FollowUp(older, fixture.JobA, "detail");
try
{
await reached.Task.WaitAsync(TimeSpan.FromSeconds(10));
await using (var write = fixture.Context("owner-a"))
await new RulesController(write).Update(Settings(1), default);
await using var freshRead = fixture.Context("owner-a");
var fresh = fixture.Controller(freshRead);
Assert.True(await FollowUp(fresh, fixture.JobA, "list"));
release.TrySetResult(true);
Assert.False(await pending); // A request begun before the save may return its earlier snapshot.
Assert.True(await FollowUp(fresh, fixture.JobA, "list"));
}
finally
{
release.TrySetResult(true);
await pending;
}
}
[Fact]
public async Task Global_save_refreshes_fallback_but_preserves_explicit_owner_override()
{
await using var fixture = await Fixture.CreateAsync();
await using (var setup = fixture.Context("owner-a"))
{
setup.UserRuleSettings.Remove(await setup.UserRuleSettings.SingleAsync());
await setup.SaveChangesAsync();
}
await using var fallback = fixture.Context("owner-a");
await using var overridden = fixture.Context("owner-b");
var ca = fixture.Controller(fallback);
var cb = fixture.Controller(overridden);
Assert.False(await FollowUp(ca, fixture.JobA, "list"));
Assert.False(await FollowUp(cb, fixture.JobB, "list"));
await using (var global = fixture.Context(null))
Assert.IsType<NoContentResult>(await new RulesController(global).Update(Settings(1), default));
Assert.True(await FollowUp(ca, fixture.JobA, "list"));
Assert.False(await FollowUp(cb, fixture.JobB, "list"));
}
private static RuleSettings Settings(int followUp) => new()
{
AppliedFollowUpDays = followUp, AppliedGhostDays = 365,
OfferFollowUpDays = 30, OfferGhostDays = 365,
FeedbackFollowUpDays = 30, FeedbackGhostDays = 365,
};
private static async Task<bool> FollowUp(JobApplicationsController controller, int id, string surface)
{
if (surface == "readiness")
{
var result = await controller.GetReadiness(id, default);
return Assert.IsType<ReadinessDto>(Assert.IsType<OkObjectResult>(result.Result).Value).WorkflowSignal.NeedsFollowUpAction;
}
if (surface == "detail")
{
var result = await controller.GetById(id, default);
return Assert.IsType<JobApplicationDto>(Assert.IsType<OkObjectResult>(result.Result).Value).NeedsFollowUp;
}
if (surface == "list")
{
var result = await controller.GetAll();
return Assert.Single(Assert.IsType<PagedResult<JobApplicationDto>>(Assert.IsType<OkObjectResult>(result.Result).Value).Items).NeedsFollowUp;
}
if (surface == "board")
{
var result = await controller.GetBoard(needsFollowUp: true);
return Assert.IsType<List<JobApplication>>(Assert.IsType<OkObjectResult>(result.Result).Value).Any(job => job.Id == id);
}
var response = await controller.GetReminders();
var jobs = Assert.IsType<List<JobApplicationDto>>(Assert.IsType<OkObjectResult>(response.Result).Value);
return jobs.SingleOrDefault(job => job.Id == id)?.NeedsFollowUp ?? false;
}
private sealed class Fixture : IAsyncDisposable
{
private readonly SqliteConnection _connection = new("Data Source=:memory:");
public int JobA { get; private set; }
public int JobB { get; private set; }
public JobTrackerContext Context(string? owner)
{
var user = new Mock<ICurrentUserService>();
user.SetupGet(x => x.UserId).Returns(owner);
return new JobTrackerContext(new DbContextOptionsBuilder<JobTrackerContext>().UseSqlite(_connection).Options, user.Object);
}
public JobApplicationsController Controller(JobTrackerContext db) =>
new(db, Mock.Of<ISummarizerService>(), TestHostFactory.CreateUserManager().Object);
public static async Task<Fixture> CreateAsync()
{
var fixture = new Fixture();
await fixture._connection.OpenAsync();
await using var db = fixture.Context("owner-a");
await db.Database.EnsureCreatedAsync();
db.Users.AddRange(new ApplicationUser { Id = "owner-a", UserName = "owner-a" }, new ApplicationUser { Id = "owner-b", UserName = "owner-b" });
var global = await db.RuleSettings.SingleAsync();
global.AppliedFollowUpDays = 30;
global.AppliedGhostDays = 365;
foreach (var owner in new[] { "owner-a", "owner-b" })
{
await using var owned = fixture.Context(owner);
owned.UserRuleSettings.Add(new UserRuleSettings { OwnerUserId = owner, AppliedFollowUpDays = 30, AppliedGhostDays = 365 });
// Complete package avoids unrelated package-gap reminders masking the rule decision.
var job = new JobApplication
{
OwnerUserId = owner, Company = new Company { Name = owner, OwnerUserId = owner },
JobTitle = "Synthetic engineer", Status = "Applied", DateApplied = DateTime.Now.AddDays(-10), FollowUpAt = DateTime.Now.AddDays(100),
TailoredCvText = "Synthetic CV", Notes = "<<<APPLICATION_ANSWER_DRAFT>>>\nSynthetic answer\n<<<END_APPLICATION_ANSWER_DRAFT>>>",
};
owned.JobApplications.Add(job);
// Users must exist before owner-scoped rows are inserted.
await db.SaveChangesAsync();
await owned.SaveChangesAsync();
if (owner == "owner-a") fixture.JobA = job.Id; else fixture.JobB = job.Id;
}
return fixture;
}
public async ValueTask DisposeAsync()
{
await _connection.DisposeAsync();
}
}
}
@@ -170,6 +170,7 @@ public sealed class UsersControllerTests
var memberRole = new IdentityRole("Member") { Id = "role-member", NormalizedName = "MEMBER" };
db.Roles.AddRange(adminRole, memberRole);
var usersToAdd = Enumerable.Range(1, 75).Select(index => User(index == 1 ? "admin-1" : $"user-{index}")).ToList();
usersToAdd[0].TwoFactorEnabled = true;
db.Users.AddRange(usersToAdd);
db.UserRoles.Add(new IdentityUserRole<string> { UserId = "admin-1", RoleId = adminRole.Id });
foreach (var user in usersToAdd.Skip(1))
@@ -183,6 +184,8 @@ public sealed class UsersControllerTests
var rows = Assert.IsType<List<UsersController.UserDto>>(Assert.IsType<OkObjectResult>(action.Result).Value);
Assert.Equal(75, rows.Count);
Assert.True(Assert.Single(rows, row => row.Id == "admin-1").TwoFactorEnabled);
Assert.False(Assert.Single(rows, row => row.Id == "user-2").TwoFactorEnabled);
Assert.Equal(2, counter.ReaderCount);
manager.Verify(userManager => userManager.GetRolesAsync(It.IsAny<ApplicationUser>()), Times.Never);
manager.Verify(userManager => userManager.GetUsersInRoleAsync(It.IsAny<string>()), Times.Never);
@@ -51,7 +51,8 @@ public sealed class AdminAuditController : ControllerBase
e.Type,
e.OldValue,
e.NewValue,
e.Note,
// Imported replies keep the mailbox subject in the owner's timeline.
Note = e.Type == "ReplyReceived" ? null : e.Note,
e.At,
e.JobApplicationId
})
@@ -1,7 +1,6 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using JobTrackerApi.Data;
using JobTrackerApi.Models;
using JobTrackerApi.Services;
@@ -31,10 +30,9 @@ namespace JobTrackerApi.Controllers
private readonly ICvTemplateRenderer _cvTemplateRenderer;
private readonly ICvPdfExporter _cvPdfExporter;
private readonly IJobCvMatchService _matchService;
private readonly IMemoryCache _cache;
private readonly IApplicationChecklistService _checklist;
public JobApplicationsController(JobTrackerContext db, ISummarizerService summarizer, UserManager<ApplicationUser> users, ICvTemplateRenderer? cvTemplateRenderer = null, ICvPdfExporter? cvPdfExporter = null, IJobCvMatchService? matchService = null, IMemoryCache? cache = null, IApplicationChecklistService? checklist = null)
public JobApplicationsController(JobTrackerContext db, ISummarizerService summarizer, UserManager<ApplicationUser> users, ICvTemplateRenderer? cvTemplateRenderer = null, ICvPdfExporter? cvPdfExporter = null, IJobCvMatchService? matchService = null, IApplicationChecklistService? checklist = null)
{
_checklist = checklist ?? new ApplicationChecklistService(db);
_db = db;
@@ -43,21 +41,6 @@ namespace JobTrackerApi.Controllers
_cvTemplateRenderer = cvTemplateRenderer ?? new CvTemplateRenderer();
_cvPdfExporter = cvPdfExporter ?? new ThrowingCvPdfExporter();
_matchService = matchService ?? new JobCvMatchService();
_cache = cache ?? new MemoryCache(new MemoryCacheOptions());
}
// ponytail: RulesEngine.GetSettings is per-user (falls back to the global RuleSettings
// singleton only when the user has no override), so the cache key must include the
// current user id -- a single global key would leak one user's follow-up rules to another.
private async Task<RuleSettings> GetCachedRuleSettingsAsync(CancellationToken cancellationToken)
{
var cacheKey = $"rulesettings:{_db.CurrentUserId ?? "anon"}";
var cached = await _cache.GetOrCreateAsync(cacheKey, async entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30);
return await RulesEngine.GetSettings(_db, cancellationToken);
});
return cached!;
}
private sealed class ThrowingCvPdfExporter : ICvPdfExporter
@@ -539,11 +522,10 @@ Canonical profile:
query = query.Where(j => j.Location != null && EF.Functions.Like(j.Location, like));
}
var settings = await GetCachedRuleSettingsAsync(cancellationToken);
var settings = await RulesEngine.GetSettings(_db, cancellationToken);
var now = DateTime.Now;
var lastMsg = await _db.Correspondences
.AsNoTracking()
Task<Dictionary<int, DateTime?>> LoadLatestMessagesAsync(IQueryable<Correspondence> messages) => messages
.GroupBy(c => c.JobApplicationId)
.Select(g => new { JobApplicationId = g.Key, Last = g.Max(x => x.Date) })
.ToDictionaryAsync(x => x.JobApplicationId, x => (DateTime?)x.Last, cancellationToken);
@@ -556,11 +538,12 @@ Canonical profile:
{
// Both filters depend on rule evaluation and workflow signals that include normalized
// note content, so evaluate before pagination to keep totals/pages correct.
var latestMessages = await LoadLatestMessagesAsync(_db.Correspondences.AsNoTracking());
var pre = await query.ToListAsync(cancellationToken);
var filtered = new List<JobApplication>();
foreach (var j in pre)
{
lastMsg.TryGetValue(j.Id, out var lm);
latestMessages.TryGetValue(j.Id, out var lm);
var d = RulesEngine.Evaluate(settings, j, now, lm);
var signal = BuildWorkflowSignal(j, d);
var matchesFollowUp = !needsFollowUp || d.NeedsFollowUp;
@@ -592,7 +575,7 @@ Canonical profile:
var dtoItems = new List<JobApplicationDto>();
foreach (var j in pageItems)
{
lastMsg.TryGetValue(j.Id, out var lm);
latestMessages.TryGetValue(j.Id, out var lm);
var d = RulesEngine.Evaluate(settings, j, now, lm);
dtoItems.Add(BuildJobApplicationDto(j, d));
}
@@ -623,6 +606,12 @@ Canonical profile:
.Take(pageSize)
.ToListAsync(cancellationToken);
if (items.Count == 0) return Ok(new PagedResult<JobApplicationDto>([], total, page, pageSize));
var pageIds = items.Select(job => job.Id).ToArray();
var lastMsg = await LoadLatestMessagesAsync(_db.Correspondences.AsNoTracking()
.Where(message => pageIds.Contains(message.JobApplicationId)));
var dtos = new List<JobApplicationDto>();
foreach (var j in items)
{
@@ -644,7 +633,7 @@ Canonical profile:
if (job is null) return NotFound();
var settings = await GetCachedRuleSettingsAsync(cancellationToken);
var settings = await RulesEngine.GetSettings(_db, cancellationToken);
var now = DateTime.Now;
var lm = await _db.Correspondences
.AsNoTracking()
@@ -687,7 +676,7 @@ Canonical profile:
if (upcomingDays < 1) upcomingDays = 1;
if (upcomingDays > 90) upcomingDays = 90;
var settings = await GetCachedRuleSettingsAsync(cancellationToken);
var settings = await RulesEngine.GetSettings(_db, cancellationToken);
var now = DateTime.Now;
var upcomingTo = now.AddDays(upcomingDays);
@@ -833,7 +822,7 @@ Canonical profile:
.Include(j => j.Company)
.FirstAsync(j => j.Id == job.Id, cancellationToken);
var settings = await GetCachedRuleSettingsAsync(cancellationToken);
var settings = await RulesEngine.GetSettings(_db, cancellationToken);
var followUp = RulesEngine.Evaluate(settings, created, DateTime.Now, lastMessageAt: null);
return CreatedAtAction(nameof(GetById), new { id = created.Id }, BuildJobApplicationDto(created, followUp));
}
@@ -1023,7 +1012,7 @@ Canonical profile:
await _db.SaveChangesAsync(cancellationToken);
var settings = await GetCachedRuleSettingsAsync(cancellationToken);
var settings = await RulesEngine.GetSettings(_db, cancellationToken);
var lastMsg = await _db.Correspondences
.AsNoTracking()
.Where(c => c.JobApplicationId == id)
@@ -1377,7 +1366,7 @@ Candidate CV/profile:
.FirstOrDefaultAsync(j => j.Id == id, cancellationToken);
if (job is null) return NotFound();
var settings = await GetCachedRuleSettingsAsync(cancellationToken);
var settings = await RulesEngine.GetSettings(_db, cancellationToken);
var now = DateTime.Now;
var lastMessageAt = await _db.Correspondences
.AsNoTracking()
@@ -41,6 +41,7 @@ public sealed class UsersController : ControllerBase
string? LastName,
string? DisplayName,
bool EmailConfirmed,
bool TwoFactorEnabled,
string? GoogleEmail,
DateTimeOffset? GoogleLinkedAt,
List<string> Roles,
@@ -292,6 +293,7 @@ public sealed class UsersController : ControllerBase
user.LastName,
user.DisplayName,
user.EmailConfirmed,
user.TwoFactorEnabled,
user.GoogleEmail,
user.GoogleLinkedAt,
roles,
@@ -1,5 +1,7 @@
# Europe country and language research matrix
The [EUROPE-READY-01 coverage companion](EUROPE_RELEASE_COVERAGE.md) tracks release evidence for these same candidate codes. This file remains the country/language research register.
Research checkpoint 2026-11-02; not a market-launch list or legal opinion. All entries are candidate scope. CLDR 49 provides an initial language relationship dataset; national/regional official-record cross-checks remain incomplete. Blank CLDR status is not proof of absence or recognition. No tag decides sovereignty, EU membership, provider rights or support. XK is a CLDR user-assigned territory code, not ISO 3166-1; do not silently persist it as an ISO identifier.
Source: [Unicode CLDR 49 territory-language data](https://www.unicode.org/cldr/charts/49/tsv/territory_language_information.tsv); retrieved SHA-256 `29bcadbb4362e1a7a3685f4bf199152809635acca58fab10a3576a0f7b55868c`. Population percentages are deliberately omitted; they are not product usage evidence.
+60
View File
@@ -0,0 +1,60 @@
territoryCode,scopeReview,countrySelectable,administrativeHierarchy,canonicalResolution,mapCountrySwitching,canonicalLocationFilters,providerCoverage,countryAwareResults,multiCountrySavedSearches,marketLanguageOptions,marketCatalogue,currencyAndTimezone,mobile,accessibility,countryTestEvidence,humanApproval,productionAvailability,existingNavFixture
AD,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
AL,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
AT,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
AX,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
BA,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
BE,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
BG,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
BY,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
CH,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
CY,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
CZ,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
DE,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
DK,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
EE,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
ES,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
FI,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
FO,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
FR,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
GB,AWAITING REVIEW,NOT IMPLEMENTED,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,BLOCKED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
GG,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
GI,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
GR,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
HR,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
HU,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
IE,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
IM,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
IS,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
IT,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
JE,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
LI,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
LT,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
LU,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
LV,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
MC,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
MD,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
ME,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
MK,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
MT,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
NL,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
NO,AWAITING REVIEW,NOT IMPLEMENTED,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,BLOCKED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,TESTED
PL,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
PT,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
RO,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
RS,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
RU,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
SE,AWAITING REVIEW,NOT IMPLEMENTED,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,BLOCKED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
SI,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
SJ,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
SK,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
SM,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
TR,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
UA,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
VA,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
XK,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
AM,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
AZ,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
GE,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
KZ,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
GL,AWAITING REVIEW,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,NOT IMPLEMENTED,AWAITING REVIEW,BLOCKED,NOT IMPLEMENTED
1 territoryCode scopeReview countrySelectable administrativeHierarchy canonicalResolution mapCountrySwitching canonicalLocationFilters providerCoverage countryAwareResults multiCountrySavedSearches marketLanguageOptions marketCatalogue currencyAndTimezone mobile accessibility countryTestEvidence humanApproval productionAvailability existingNavFixture
2 AD AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
3 AL AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
4 AT AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
5 AX AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
6 BA AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
7 BE AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
8 BG AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
9 BY AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
10 CH AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
11 CY AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
12 CZ AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
13 DE AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
14 DK AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
15 EE AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
16 ES AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
17 FI AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
18 FO AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
19 FR AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
20 GB AWAITING REVIEW NOT IMPLEMENTED AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED BLOCKED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
21 GG AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
22 GI AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
23 GR AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
24 HR AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
25 HU AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
26 IE AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
27 IM AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
28 IS AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
29 IT AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
30 JE AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
31 LI AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
32 LT AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
33 LU AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
34 LV AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
35 MC AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
36 MD AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
37 ME AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
38 MK AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
39 MT AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
40 NL AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
41 NO AWAITING REVIEW NOT IMPLEMENTED AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED BLOCKED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED TESTED
42 PL AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
43 PT AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
44 RO AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
45 RS AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
46 RU AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
47 SE AWAITING REVIEW NOT IMPLEMENTED AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED BLOCKED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
48 SI AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
49 SJ AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
50 SK AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
51 SM AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
52 TR AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
53 UA AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
54 VA AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
55 XK AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
56 AM AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
57 AZ AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
58 GE AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
59 KZ AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
60 GL AWAITING REVIEW NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED NOT IMPLEMENTED AWAITING REVIEW BLOCKED NOT IMPLEMENTED
+30
View File
@@ -0,0 +1,30 @@
# EUROPE-READY-01 release coverage
9 November 2026. The [coverage table](EUROPE_RELEASE_COVERAGE.csv) uses the exact 59 candidate codes from the existing [country/language register](EUROPE_COUNTRY_LANGUAGE_MATRIX.md). The roster retains its market and territory review flags. XK remains a candidate territory code outside ISO 3166-1. The [locale catalogue](LOCALE_CATALOG.json) remains the source of locale identities. The CSV records qualification status only.
The country columns refer to the new country-aware experience. Existing EN/NB interface support is global. Existing NAV source evidence is separate and marked `TESTED` for the narrow Norway fixture only. `BLOCKED` provider coverage for NO/SE/GB denotes the full Global Jobs entry and provider qualification gates. For other candidates, provider coverage has no implementation or approved claim. No row is accepted or released. Verified all 59 codes matched the research register once, all values used the approved status vocabulary, and only Norway carried the existing fixture result.
## Integrate with existing owners
Use GJ-00 `0ec9f98e6ed4a646fc5e017d8eb6fade07653f37` for the geography and provider-rights decisions, then its GJ-02 implementation contract for stable `LocationNode` and `LocationScope` identities. Keep administrative containment, settlement relationships, display names and provider-specific IDs distinct. The tree, query and map use the same resolved scopes and edition. The map is optional for search completion. When country changes invalidate a location, clear only that filter and explain why. Preserve user residence, UI language, advertisement languages and saved searches. Maintain separate per-document languages.
GISCO offers administrative and statistical data at several versions and scales. The administrative dataset page explicitly restricts its listed downloads to non-commercial use without a separate commercial agreement. Treat each proposed product's edition, licence, attribution, resolution and update policy as a required review item before ingestion. The LAU directory is evidence of available editions. [GISCO administrative terms](https://ec.europa.eu/eurostat/en/web/gisco/geodata/administrative-units), [GISCO LAU catalogue](https://gisco-services.ec.europa.eu/distribution/v2/lau/)
The public OSMF Nominatim service disallows autocomplete, limits traffic and asks users to avoid sending private or confidential data. It is excluded from the proposed interactive location search. A provider evaluation must establish a suitable licensed dataset or service, explicit quotas, attribution, privacy and fallback. It must also distinguish tile access, boundaries, geocoding and provider job-feed rights. No map, tile or geocoder service was activated. [Nominatim usage policy](https://operations.osmfoundation.org/policies/nominatim/), [OSMF tile policy](https://operations.osmfoundation.org/policies/tiles/)
## Cross-country acceptance queue
| Case | Required outcome | Status |
| --- | --- | --- |
| EN interface, residence NO, search GB | GB geography and qualified source capabilities; EN preserved | NOT RUN |
| NB interface, search SE | SE geography and source capabilities; NB preserved | NOT RUN |
| PL interface, search DE | Local locale formats and DE scope | NOT RUN |
| FR interface, search BE and FR | Both countries retain correct administrative paths and capability disclosures | NOT RUN |
| Cross-country search and map | Only selected areas/results determine viewport, sources and result eligibility | NOT RUN |
| Parent then child selection | Parent covers whole area until explicit child refinement; siblings remain independent | NOT RUN |
| Multiple towns and independent branches | Canonical scopes combine without checking unselected children | NOT RUN |
| Switch country with filters | Only incompatible geography clears, with an explanation | NOT RUN |
| Switch UI language with active search | Search scope, saved settings and document languages stay intact | NOT RUN |
| Save and reopen cross-border search | Stable identifiers, owner isolation and unchanged effective scope | NOT RUN |
Basic locale, location and geography contracts must pass for every code accepted into release scope. Real provider evidence, licensed map coverage, native-language review and the release gate remain separate. The CSV can advance each dimension only when the corresponding evidence is recorded.
+17
View File
@@ -0,0 +1,17 @@
# Attachment size localisation
3 November 2026. Isolated `codex/i18n-attachment-sizes` from published `ca519cacbec6ee8e385927ad31356dacc18b2f2d`. Ordinary localisation work is authorised independently of the pending A3 increment gate. This branch does not replace the newer A3 application tree.
`Attachments` and the frozen submitted-package attachment list displayed decimal points through `toFixed`, even with Norwegian UI text. They now use `Intl.NumberFormat` with the existing UI language. The attachment table keeps its existing 1024-based KB/MB threshold, zero KB decimals and one MB decimal. Frozen package labels keep one KB decimal. No stored file size, filename, snapshot, route, API, revision, download or generation language changes.
Verification:
- Red regression: two Norwegian-format cases failed, one English case passed; 58 cases were filtered, not executed. Native `attachment-size-red.json`.
- Full affected suites: **61 passed**, zero failed/skipped, two suites; `attachment-size-tests.json`. Includes EN/NB MB labels and changing the UI locale on a retained frozen package without a write.
- Typecheck, scoped ESLint for the four affected files, static-export build and `git diff --check`: PASSED.
- AST-only graph refresh PASSED:18,702 nodes/46,195 edges/1,119 communities. Optional SQL parser is absent and143 files yielded no symbols; these are graph coverage limits. Generated graph stays local.
- Independent static review found no actionable issues; verification reruns were not added to the61 cases.
Rollback reverts these four source/test changes; no database rollback is required. The published branch remains separate until its narrow delta is reconciled against the newer A3 baseline. Existing physical PDF metrics and visual acceptance are unaffected; no renderer source changed.
NOT RUN: new browser/device or physical PDF checks, complete European localisation, native-language review, backend/provider/live-model or release qualification. Existing tests and code remain responsible for file permissions and downloads; this display-only change adds no new access path. The 188 historical dynamic-call reviews remain accounted for and are not expanded by these three numeric-format regressions.
+13
View File
@@ -0,0 +1,13 @@
{
"base": "ca519cacbec6ee8e385927ad31356dacc18b2f2d",
"policy": "LF-normalised text SHA256",
"files": {
"job-tracker-ui/src/components/Attachments.tsx": "02081be8282cb3d1a525b336bededb8aabe561cc3b73e1b98e924f9ef945add1",
"job-tracker-ui/src/components/ApplicationAssets.tsx": "effcee6cfa0a43ebe0d73a0da625410dc98a6580fddda225b843e5e00d4e45f6",
"job-tracker-ui/src/attachments.test.tsx": "89bb3e277ae7be652073eec6d3b6188bcbeaea8b29b07478ff5b21654be8e7c1",
"job-tracker-ui/src/application-assets.test.tsx": "980a346cb4452ac4b7e6b689a963e5a23fc6d77410e47e66a422f9cd9c704e7b",
"docs/i18n/ATTACHMENT_SIZE_FORMATTING.md": "4576ccfc3de3b72cd3e5591c40f697b827d724b8f4fe588b54567dbe75252332",
"docs/i18n/attachment-size-red.json": "872882cb7d2937bf1df7f7a89810158c5de831381f56c6ae8bb0263d26b84d8e",
"docs/i18n/attachment-size-tests.json": "8b8188d432b7788f951cf2c67f790c6cd4d24553ed9accbeb702645b3d4b2c6a"
}
}
+43
View File
@@ -0,0 +1,43 @@
# Date-picker calendar-day preservation
11 November 2026. Baseline `ec57a24d77854bb416c9ea02b8b371be3e5554c0`, isolated branch `codex/i18n-deadline-picker-date`.
The Add and Edit job dialogs passed date-only strings through `new Date(value)`, which interprets a literal `YYYY-MM-DD` at UTC midnight. In Los Angeles, opening 23 November displayed the 22nd. Their picker change handlers then used `toISOString().slice(0, 10)`. Selecting local midnight on 23 November in Oslo or Kiritimati submitted the 22nd.
The existing wrapper pairs now use installed date-fns `parseISO` for literal dates and `format(value, "yyyy-MM-dd")` for the picker's local Date output. Non-literal parsing retains `new Date(value)`. Empty and invalid picker values retain their existing clearing behaviour. Edit's separate legacy `toDateInputValue` loading policy is preserved.
The affected callers are Add's applied date and deadline, and Edit's applied date, status-change date, reply date, follow-up date and deadline. All seven controls are date pickers backed by date-only state and request values. Revision and submit handlers are retained. There is no backend, timestamp serialization, dependency or migration change.
## Verification
The new component regression drives the actual Add/Edit state and conversion handlers with a picker test double implementing MUI's local-Date callback contract. Each run starts a new Jest process with the recorded timezone. It checks EN/NB values, a full create/save payload, source revision, five Edit/two Add controls, clearing, invalid picker values and an offset timestamp using the existing legacy loading policy.
| Process timezone | Before fix | After fix |
| --- | --- | --- |
| America/Los_Angeles | 5 failed | 5 passed |
| Europe/Oslo | 4 failed, 1 passed | 5 passed |
| Pacific/Kiritimati | 4 failed, 1 passed | 5 passed |
These are the same five cases executed in three environments. The nearby run passed 21 cases across date-picker, edit-revision, quick-capture and native file-input suites, including those same five cases. TypeScript without emit, ESLint on the three changed files and tracked source whitespace checks passed. The cached evidence check flagged the original TypeScript receipt's blank line at EOF. That raw receipt is retained unchanged in `evidence/date-picker-calendar-day/`.
Actual MUI browser interaction, screenshots, native devices and provider/API server verification were not run in this isolated increment. The root integration owner will qualify the rendered picker separately. Final I18N, A3, security and release acceptance remain open.
## Other reviewed date contracts
`CalendarAgenda` validates its date-only response, parses it at UTC noon and explicitly formats in UTC. The reviewed 23 November value stayed on the 23rd in all three zones. Its backend groups by the stored calendar date and explicitly retains the legacy timezone/precision limitation.
`CompaniesTable` formats next-contact and relationship dates using the viewer's local timezone. Its edit form takes the raw first ten characters. Literal `2026-11-23` therefore displays as the 22nd in Los Angeles, while `2026-11-23T23:30:00Z` displays as the 24th in Oslo and opens as the 23rd in the editor. The backend fields remain legacy `DateTime?` with no precision discriminator. The current locale test covers a noon UTC timestamp. These display/loading cases require a qualified date-versus-timestamp contract before a broader change.
The Jobs table similarly formats a literal deadline through local `Date`, and its current test expects that expression. Edit's retained `toDateInputValue` can also move an unspecified midnight timestamp back a day in positive zones. These are separate legacy precision/loading findings. This fix does not claim their closure or reconstruct missing timezone metadata.
Rollback reverts the two wrapper changes and their regression package. Existing persisted dates are not rewritten.
## Follow-up local-today default
From isolated checkpoint `f7c3617e`, Add's `getTodayIso` still selected the UTC date for initialization and a successful form reset. It now uses the already imported `format` with the browser's local Date. No persisted record is rewritten.
Two new component cases fix the UTC clock at `2026-11-23T00:30:00Z` and `2026-11-23T23:30:00Z`. Each timezone's red run had one failure and one pass, with the earlier five cases skipped. The final full suite passed seven cases in each of Los Angeles, Oslo and Kiritimati. That is seven distinct cases repeated in three environments, including the five earlier picker cases. TypeScript and two-file lint passed. The earlier 21-case nearby run belongs to the preceding checkpoint and was not rerun for this one-line follow-up.
The new cases cover initial creation, Create and add another resetting the default, and closing/reopening the resulting draft. Closing and reopening the same mounted dialog preserves its existing step and draft. It does not reset every open. The initial test draft assumed otherwise and was corrected to exercise the actual successful reset path. The only write is the explicit mocked creation request, whose selected date is asserted. API server, actual browser, export build and native checks remain unexecuted.
Follow-up receipts are in `evidence/date-picker-local-today/`. The legacy loading and Companies contract findings above remain open.
+15
View File
@@ -0,0 +1,15 @@
# Discovery title order follows UI language
10 November 2026. Baseline `aac0f3b3a9b452b48126ddaf26e1837eeadd2f6d`, branch `codex/i18n-discovery-order`.
The title sort used the browser's default collation and its memo omitted the UI language. Switching English to Bokmål left Å-prefixed titles before Z. The focused regression reproduced this on the unchanged baseline.
`JobDiscoveryPage` now passes its existing English/Bokmål display locale to `localeCompare` and includes that locale in the memo dependencies. The same locale still formats recorded timestamps. The change reaches ordinary and saved-search result arrays through their shared title sort.
The regression switches English → Bokmål → English with Å/Z fixtures, verifies each order, and checks that the role, municipality and title sort remain selected. Switching adds zero API reads and triggers no writes. Existing submitted search and provider contracts are retained.
24 tests in `job-discovery.test.tsx`, TypeScript without emit and ESLint on the two changed files passed. The initial red run selected one test and skipped the other 23. It is retained separately from the final suite result in `evidence/discovery-title-order/`.
Export build, rendered browser, native language/device and live-provider verification were not run in this isolated increment. Existing whole-application, European locale and final acceptance gates remain open. The root integration owner will review and publish this branch separately.
Rollback is the inverse of the two source/test changes. There are no schema, dependency or persisted-data changes.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
Test Suites: 1 passed, 1 total
Tests: 5 passed, 5 total
Snapshots: 0 total
Time: 6.688 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
Test Suites: 1 passed, 1 total
Tests: 5 passed, 5 total
Snapshots: 0 total
Time: 6.561 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
Test Suites: 1 passed, 1 total
Tests: 5 passed, 5 total
Snapshots: 0 total
Time: 7.132 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,10 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx edit-job-revision.test.tsx quick-capture.test.tsx file-picker-activation.test.tsx
Test Suites: 4 passed, 4 total
Tests: 21 passed, 21 total
Snapshots: 0 total
Time: 15.02 s
Ran all test suites matching job-date-picker-calendar.test.tsx|edit-job-revision.test.tsx|quick-capture.test.tsx|file-picker-activation.test.tsx.
@@ -0,0 +1,105 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
FAIL src/job-date-picker-calendar.test.tsx
● en Add date-only picker round trip retains the selected day and existing creation payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
39 | render(wrap(<AddJobModal open initialUrl="https://example.test/job" onClose={jest.fn()} onCreated={jest.fn()} />));
40 | await screen.findByDisplayValue("Teacher");
> 41 | expect(screen.getByLabelText(copy.addJobModalDeadline)).toHaveTextContent("2026-11-23");
| ^
42 | fireEvent.click(screen.getByRole("button", { name: `${copy.addJobModalDeadline} clear` }));
43 | expect(screen.getByLabelText(copy.addJobModalDeadline)).toBeEmptyDOMElement();
44 | fireEvent.click(screen.getByRole("button", { name: `${copy.addJobModalDeadline} invalid` }));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:41:59)
● nb Add date-only picker round trip retains the selected day and existing creation payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
39 | render(wrap(<AddJobModal open initialUrl="https://example.test/job" onClose={jest.fn()} onCreated={jest.fn()} />));
40 | await screen.findByDisplayValue("Teacher");
> 41 | expect(screen.getByLabelText(copy.addJobModalDeadline)).toHaveTextContent("2026-11-23");
| ^
42 | fireEvent.click(screen.getByRole("button", { name: `${copy.addJobModalDeadline} clear` }));
43 | expect(screen.getByLabelText(copy.addJobModalDeadline)).toBeEmptyDOMElement();
44 | fireEvent.click(screen.getByRole("button", { name: `${copy.addJobModalDeadline} invalid` }));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:41:59)
● en Edit date-only picker round trip preserves all five date controls and revision payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
59 | render(wrap(<EditJobDialog open jobId={1} onClose={jest.fn()} onSaved={jest.fn()} />));
60 | await screen.findByDisplayValue("Teacher");
> 61 | expect(screen.getByLabelText(copy.editJobDeadline)).toHaveTextContent("2026-11-23");
| ^
62 | fireEvent.click(screen.getByRole("button", { name: `${copy.editJobDeadline} clear` }));
63 | fireEvent.click(screen.getByRole("button", { name: `${copy.editJobDeadline} invalid` }));
64 | expect(screen.getByLabelText(copy.editJobDeadline)).toBeEmptyDOMElement();
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:61:55)
● nb Edit date-only picker round trip preserves all five date controls and revision payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
59 | render(wrap(<EditJobDialog open jobId={1} onClose={jest.fn()} onSaved={jest.fn()} />));
60 | await screen.findByDisplayValue("Teacher");
> 61 | expect(screen.getByLabelText(copy.editJobDeadline)).toHaveTextContent("2026-11-23");
| ^
62 | fireEvent.click(screen.getByRole("button", { name: `${copy.editJobDeadline} clear` }));
63 | fireEvent.click(screen.getByRole("button", { name: `${copy.editJobDeadline} invalid` }));
64 | expect(screen.getByLabelText(copy.editJobDeadline)).toBeEmptyDOMElement();
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:61:55)
● Edit retains its existing UTC calendar-day loading policy for a legacy offset timestamp
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-24
Received:
2026-11-23
75 | render(wrap(<EditJobDialog open jobId={1} onClose={jest.fn()} onSaved={jest.fn()} />));
76 | await screen.findByDisplayValue("Teacher");
> 77 | expect(screen.getByLabelText(translations.en.editJobDeadline)).toHaveTextContent("2026-11-24");
| ^
78 | expect(client.put).not.toHaveBeenCalled();
79 | });
80 |
at Object.toHaveTextContent (src/job-date-picker-calendar.test.tsx:77:66)
Test Suites: 1 failed, 1 total
Tests: 5 failed, 5 total
Snapshots: 0 total
Time: 4.077 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,86 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
FAIL src/job-date-picker-calendar.test.tsx
● en Add date-only picker round trip retains the selected day and existing creation payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
46 | for (const label of [copy.addJobModalDateApplied, copy.addJobModalDeadline]) {
47 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 48 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
49 | }
50 | fireEvent.click(screen.getByRole("button", { name: copy.continue }));
51 | for (let step = 0; step < 3; step++) fireEvent.click(screen.getByRole("button", { name: copy.skipAndContinue }));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:48:42)
● nb Add date-only picker round trip retains the selected day and existing creation payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
46 | for (const label of [copy.addJobModalDateApplied, copy.addJobModalDeadline]) {
47 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 48 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
49 | }
50 | fireEvent.click(screen.getByRole("button", { name: copy.continue }));
51 | for (let step = 0; step < 3; step++) fireEvent.click(screen.getByRole("button", { name: copy.skipAndContinue }));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:48:42)
● en Edit date-only picker round trip preserves all five date controls and revision payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
65 | for (const label of [copy.editJobAppliedOn, copy.editJobStatusChangedOn, copy.editJobReplyReceivedOn, copy.editJobFollowUpOn, copy.editJobDeadline]) {
66 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 67 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
68 | }
69 | fireEvent.click(screen.getByRole("button", { name: copy.save }));
70 | await waitFor(() => expect(client.put).toHaveBeenCalledWith("/jobapplications/1", expect.objectContaining({ expectedVersion: 7, dateApplied: "2026-11-23", deadline: "2026-11-23", followUpAt: "2026-11-23", responseDate: "2026-11-23" })));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:67:42)
● nb Edit date-only picker round trip preserves all five date controls and revision payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
65 | for (const label of [copy.editJobAppliedOn, copy.editJobStatusChangedOn, copy.editJobReplyReceivedOn, copy.editJobFollowUpOn, copy.editJobDeadline]) {
66 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 67 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
68 | }
69 | fireEvent.click(screen.getByRole("button", { name: copy.save }));
70 | await waitFor(() => expect(client.put).toHaveBeenCalledWith("/jobapplications/1", expect.objectContaining({ expectedVersion: 7, dateApplied: "2026-11-23", deadline: "2026-11-23", followUpAt: "2026-11-23", responseDate: "2026-11-23" })));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:67:42)
Test Suites: 1 failed, 1 total
Tests: 4 failed, 1 passed, 5 total
Snapshots: 0 total
Time: 4.882 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,86 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
FAIL src/job-date-picker-calendar.test.tsx
● en Add date-only picker round trip retains the selected day and existing creation payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
46 | for (const label of [copy.addJobModalDateApplied, copy.addJobModalDeadline]) {
47 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 48 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
49 | }
50 | fireEvent.click(screen.getByRole("button", { name: copy.continue }));
51 | for (let step = 0; step < 3; step++) fireEvent.click(screen.getByRole("button", { name: copy.skipAndContinue }));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:48:42)
● nb Add date-only picker round trip retains the selected day and existing creation payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
46 | for (const label of [copy.addJobModalDateApplied, copy.addJobModalDeadline]) {
47 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 48 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
49 | }
50 | fireEvent.click(screen.getByRole("button", { name: copy.continue }));
51 | for (let step = 0; step < 3; step++) fireEvent.click(screen.getByRole("button", { name: copy.skipAndContinue }));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:48:42)
● en Edit date-only picker round trip preserves all five date controls and revision payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
65 | for (const label of [copy.editJobAppliedOn, copy.editJobStatusChangedOn, copy.editJobReplyReceivedOn, copy.editJobFollowUpOn, copy.editJobDeadline]) {
66 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 67 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
68 | }
69 | fireEvent.click(screen.getByRole("button", { name: copy.save }));
70 | await waitFor(() => expect(client.put).toHaveBeenCalledWith("/jobapplications/1", expect.objectContaining({ expectedVersion: 7, dateApplied: "2026-11-23", deadline: "2026-11-23", followUpAt: "2026-11-23", responseDate: "2026-11-23" })));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:67:42)
● nb Edit date-only picker round trip preserves all five date controls and revision payload
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-23
Received:
2026-11-22
65 | for (const label of [copy.editJobAppliedOn, copy.editJobStatusChangedOn, copy.editJobReplyReceivedOn, copy.editJobFollowUpOn, copy.editJobDeadline]) {
66 | fireEvent.click(screen.getByRole("button", { name: `${label} choose` }));
> 67 | expect(screen.getByLabelText(label)).toHaveTextContent("2026-11-23");
| ^
68 | }
69 | fireEvent.click(screen.getByRole("button", { name: copy.save }));
70 | await waitFor(() => expect(client.put).toHaveBeenCalledWith("/jobapplications/1", expect.objectContaining({ expectedVersion: 7, dateApplied: "2026-11-23", deadline: "2026-11-23", followUpAt: "2026-11-23", responseDate: "2026-11-23" })));
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:67:42)
Test Suites: 1 failed, 1 total
Tests: 4 failed, 1 passed, 5 total
Snapshots: 0 total
Time: 4.669 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,4 @@
> job-tracker-ui@0.1.0 typecheck
> tsc --noEmit --incremental false
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
Test Suites: 1 passed, 1 total
Tests: 7 passed, 7 total
Snapshots: 0 total
Time: 8.432 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
Test Suites: 1 passed, 1 total
Tests: 7 passed, 7 total
Snapshots: 0 total
Time: 8.287 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx
Test Suites: 1 passed, 1 total
Tests: 7 passed, 7 total
Snapshots: 0 total
Time: 8.955 s
Ran all test suites matching job-date-picker-calendar.test.tsx.
@@ -0,0 +1,29 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx -t Add defaults and successful reset
FAIL src/job-date-picker-calendar.test.tsx
● Add defaults and successful reset use local today at 2026-11-23T00:30:00Z
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-22
Received:
2026-11-23
43 | const view = render(form(true));
44 | fireEvent.click(screen.getByRole("button", { name: translations.en.addJobModalEnterManually }));
> 45 | expect(screen.getByLabelText(translations.en.addJobModalDateApplied)).toHaveTextContent(expected);
| ^
46 | fireEvent.click(screen.getByRole("button", { name: `${translations.en.addJobModalDateApplied} choose` }));
47 | fireEvent.change(screen.getByRole("combobox", { name: translations.en.company }), { target: { value: "Synthetic school" } });
48 | fireEvent.change(screen.getByLabelText(translations.en.addJobModalJobTitle), { target: { value: "Teacher" } });
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:45:73)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 5 skipped, 1 passed, 7 total
Snapshots: 0 total
Time: 4.694 s
Ran all test suites matching job-date-picker-calendar.test.tsx with tests matching "Add defaults and successful reset".
@@ -0,0 +1,29 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx -t Add defaults and successful reset
FAIL src/job-date-picker-calendar.test.tsx
● Add defaults and successful reset use local today at 2026-11-23T23:30:00Z
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-24
Received:
2026-11-23
43 | const view = render(form(true));
44 | fireEvent.click(screen.getByRole("button", { name: translations.en.addJobModalEnterManually }));
> 45 | expect(screen.getByLabelText(translations.en.addJobModalDateApplied)).toHaveTextContent(expected);
| ^
46 | fireEvent.click(screen.getByRole("button", { name: `${translations.en.addJobModalDateApplied} choose` }));
47 | fireEvent.change(screen.getByRole("combobox", { name: translations.en.company }), { target: { value: "Synthetic school" } });
48 | fireEvent.change(screen.getByLabelText(translations.en.addJobModalJobTitle), { target: { value: "Teacher" } });
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:45:73)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 5 skipped, 1 passed, 7 total
Snapshots: 0 total
Time: 4.977 s
Ran all test suites matching job-date-picker-calendar.test.tsx with tests matching "Add defaults and successful reset".
@@ -0,0 +1,29 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-date-picker-calendar.test.tsx -t Add defaults and successful reset
FAIL src/job-date-picker-calendar.test.tsx
● Add defaults and successful reset use local today at 2026-11-23T23:30:00Z
expect(element).toHaveTextContent()
Expected element to have text content:
2026-11-24
Received:
2026-11-23
43 | const view = render(form(true));
44 | fireEvent.click(screen.getByRole("button", { name: translations.en.addJobModalEnterManually }));
> 45 | expect(screen.getByLabelText(translations.en.addJobModalDateApplied)).toHaveTextContent(expected);
| ^
46 | fireEvent.click(screen.getByRole("button", { name: `${translations.en.addJobModalDateApplied} choose` }));
47 | fireEvent.change(screen.getByRole("combobox", { name: translations.en.company }), { target: { value: "Synthetic school" } });
48 | fireEvent.change(screen.getByLabelText(translations.en.addJobModalJobTitle), { target: { value: "Teacher" } });
at toHaveTextContent (src/job-date-picker-calendar.test.tsx:45:73)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 5 skipped, 1 passed, 7 total
Snapshots: 0 total
Time: 4.542 s
Ran all test suites matching job-date-picker-calendar.test.tsx with tests matching "Add defaults and successful reset".
@@ -0,0 +1,4 @@
> job-tracker-ui@0.1.0 typecheck
> tsc --noEmit --incremental false
@@ -0,0 +1,33 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-discovery.test.tsx -t title sorting follows UI language changes
FAIL src/job-discovery.test.tsx
● title sorting follows UI language changes without refetching or changing discovery filters
expect(received).toEqual(expected) // deep equality
- Expected - 1
+ Received + 1
Array [
- "Zoologist",
"Åker agronom",
+ "Zoologist",
]
115 |
116 | act(() => { window.dispatchEvent(new StorageEvent("storage", { key: "uiLanguage", newValue: "nb" })); });
> 117 | expect(titles()).toEqual(["Zoologist", "Åker agronom"]);
| ^
118 | expect(screen.getByLabelText("Rolle eller bedrift")).toHaveValue("science");
119 | expect(screen.getByLabelText("Kommune")).toHaveValue("Oslo");
120 | expect(screen.getByRole("combobox", { name: translations.nb.jobDiscoverySort })).toHaveTextContent(translations.nb.jobDiscoverySortTitle);
at Object.toEqual (src/job-discovery.test.tsx:117:20)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 23 skipped, 24 total
Snapshots: 0 total
Time: 5.888 s
Ran all test suites matching job-discovery.test.tsx with tests matching "title sorting follows UI language changes".
@@ -0,0 +1,9 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-discovery.test.tsx
Test Suites: 1 passed, 1 total
Tests: 24 passed, 24 total
Snapshots: 0 total
Time: 8.499 s
Ran all test suites matching job-discovery.test.tsx.
@@ -0,0 +1,4 @@
> job-tracker-ui@0.1.0 typecheck
> tsc --noEmit --incremental false
+27
View File
@@ -0,0 +1,27 @@
# A3 Jobs performance integration
Base `6bfdbd9db72e06f18f8aa9aaf57b025bff55ce5b` on `codex/a3-ui-10`. Commit `b8292f6f7299daa704bbe41efa8081660c2b6e27` integrates the relevant deltas from isolated `af33e455` and `97d06180`. The salary call and read configuration were reapplied at their current A3 locations because the older JobTable context had changed. The current selection, filters, board and Trash implementations stay in place.
The mobile salary display uses the selected EN/NB number format and established period labels. Original text and unknown imported periods remain displayable. Jobs and Trash update existing error copy with the language without fetching the same page again. Retry continues to fetch the current query.
The deferred JobTable trial passed 96 selected tests across nine suites, full lint and the static export build with TypeScript. The first run had one obsolete Landing test selector for “Norsk”. The existing accessible name is “Norsk bokmål”. Only the test selector was updated. The first failure and green receipts are retained.
The comparison uses Chromium 151, cold isolated contexts, local static exports, blocked external requests, and a synthetic 15-application response. The separate desktop and emulated mobile profiles use fixed network and CPU settings. Public routes must request zero private application rows. Each cold Jobs load must request exactly one page. Gzip sizes are estimates at level 6, and route marker timings include browser polling. These are not production timings or field Web Vitals.
## Deferred JobTable trial held from A3
The temporary candidate used `b8292f6f` and the isolated App import change from `85ebbd9f`, with trial App blob `f98ce042fd36e0b5880aa6108c6d601a3976820f`. The baseline export was built from `6bfdbd9d`. [Paired data](evidence/a3-jobs/PAIRED.json) has three cold repeats per route, build and profile. Order alternated. A local graph index refresh briefly overlapped the experiment. Desktop used 40 ms / 10 Mbps / CPU 1×. The 390 px phone profile used 150 ms / 1.6 Mbps / CPU 4×.
| Route | Raw JS before → trial | Desktop median marker | Phone median marker |
| --- | ---: | ---: | ---: |
| Landing | 2,024,172 → 1,782,542 B | 2,445 → 1,921 ms | 12,124 → 11,445 ms |
| Login | 2,024,172 → 1,782,542 B | 2,448 → 1,924 ms | 11,997 → 10,789 ms |
| Jobs | 2,052,915 → 2,082,356 B | 2,433 → 2,440 ms | 13,314 → 13,773 ms |
The trial saves 241,630 raw JS bytes and 71,651 estimated gzip bytes on each public route. Jobs adds 29,441 raw bytes. The slow phone profile showed a 459 ms median first-row delay with all three candidate samples later than the baseline samples. Retain the eager JobTable import in A3. The isolated experiment remains available for a revised loading strategy that protects the Jobs marker.
## Published source checks
The final eager source at `b6ee418c7a93f1fe3dcdb687b26fd4cf8a489587` also integrates the isolated `4c12f769` Admin System metric change. It uses the current locale for database size and CV benchmark percentages, preserving status freshness and existing controls. No benchmark or diagnostic action was invoked. The final 55 tests across Admin System, JobTable and Jobs integration, full lint and static export with TypeScript passed. These tests overlap the trial run and are reported separately.
A focused [browser check](evidence/a3-jobs/LOCALE.json) dispatched an English-to-Bokmål storage event after the Jobs row was visible. The extra paged GET count fell from one to zero on desktop and emulated phone, with one initial GET on each build. The row remained visible, the document language changed and no write was attempted. One fresh context per build and profile. This check qualifies the cross-tab language change without saving preferences to a live account.
@@ -0,0 +1,11 @@
# PERF-01 Companies cache
Base `fd524a4b9d55d671d4f9c93134057d42f9cd6373`. The browser's Companies cache is scoped to the current owner. A response that started before invalidation could finish after its replacement and overwrite the fresh list. A pre-logout response could also write after signing back in as the same account. Separately, a mounting consumer could publish its initial empty array as cached data before the network request finished, so another consumer could miss the shared result.
Only the current in-flight response can now populate the cache. It must still match the active owner. The resource-state effect no longer writes a second copy into the shared cache. Existing readers, invalidation callers, request URL and server authorisation are unchanged.
Before the fix, the three added cases failed on the stale post-edit list, a missed shared response and the stale pre-logout list. After the fix, the two simultaneous readers both received the shared result with exactly one request. The post-invalidation check used exactly two requests across the old and new generations, with no extra request on a warm mount. Re-login and account switching checks also passed.
**Verification:** 16 tests across the account-scoped state, Edit Job revision and theme state suites passed. Targeted lint and TypeScript passed. The test worktree reused the installed dependency tree from the matching A3 lockfile. These are mock request counts, with no browser or production latency measurement.
The A3 integration used the exact source and regression delta from `21db35d2b965fbda2ddf5b419ac2646fcae05517`. Both input files matched its parent at A3 base `bca750446f1069eb55d648be838be192d70c2d30`. The fresh A3 run passed 37 tests across account-scoped state, JobTable density and Jobs integration, plus type-check and scoped lint. These runs overlap. [A3 receipt](../ui-modernisation/evidence/perf-company-cache/TESTS.txt)
@@ -0,0 +1,25 @@
# PERF-01 Rules settings freshness
Source baseline: `9c9fe48d5f321c653049f09ced5b7e27701fe2a8`; isolated branch `codex/perf-rules-freshness`.
Successful Rules settings saves previously left the API's owner-keyed 30-second cache unchanged. Settings could therefore display the saved values while Applications, Board filtering, details, reminders and readiness continued using old thresholds. Invalidating only the owner's entry would also miss global-fallback dependencies and permit an older asynchronous cache fill to repopulate stale data.
The job controller now reads through the existing `RulesEngine.GetSettings` owner/fallback implementation on each request. There is no rules cache to repopulate, including across separate API processes. Existing database/query-filter contracts and global `AddMemoryCache` remain unchanged. The unused optional constructor cache argument is removed; the following optional checklist argument retains its name and all existing callers compile. Create and AI-refresh responses share the same corrected settings read; neither endpoint is activated by these tests.
The cost is one owner-primary-key settings lookup per job request, plus a singleton lookup when no override exists. This correctness fix is not a measured latency or throughput improvement. No distributed invalidation infrastructure was introduced. A read begun before a committed update may return its earlier snapshot; a completed older response cannot cache that snapshot for later requests.
## Verification
- **RED:** Seven real SQLite cases with a shared `MemoryCache` failed before the application change, all with expected `True` / actual `False` at the post-save freshness assertion. These cover list, Board follow-up filtering, detail, reminders, readiness, owner isolation and global fallback. Local receipt: `JobTrackerApi.Tests/TestResults/rules-red.trx`.
- **PASSED:** The final focused regression run passed **35 distinct tests**, including eight new freshness cases, plus query parity, workflow signals, prospect rules and concurrent initialization. The eighth case pauses an older detail request at a mock identity lookup after rule evaluation, saves new rules, verifies a fresh request, completes the older response and verifies another fresh read. This uses no model or provider. Local receipt: `JobTrackerApi.Tests/TestResults/rules-regression.trx`.
- **PASSED:** `dotnet build "Job tracker.sln" --no-restore --verbosity quiet`: zero warnings/errors.
- **PASSED:** `git diff --check`.
- **PASSED:** `graphify update .` rebuilt the local AST graph without API/model use. It reported missing optional PDF/SQL parsers and files without extracted symbols; those are graph coverage limits, not application test failures. Generated `graphify-out/` remains local and untracked, as at the source worktree.
Durable machine-readable red/final result names, outcomes, counts and timestamps: [verification.json](evidence/rules-freshness/verification.json). Exact native red, development-green and final-regression TRX files are preserved as `.trx.gz` files alongside it. [native-receipts.json](evidence/rules-freshness/native-receipts.json) records raw/compressed SHA256 hashes and byte lengths; gzip decompression reproduces the original receipts without text transformations. The seven-test development-green run overlaps the final regression run.
Commands use the installed `C:\Users\Connor\.dotnet\dotnet.exe` SDK; the runtime-only Program Files executable cannot execute SDK commands. Test command: `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --no-restore --filter "FullyQualifiedName~RuleSettingsFreshnessTests|FullyQualifiedName~JobQueryParityTests|FullyQualifiedName~JobApplicationsWorkflowSignalsTests|FullyQualifiedName~RulesEngineProspectTests|FullyQualifiedName~ConcurrentInitializationTests"`.
## Limits and rollback
The seven-test green development run overlaps the final 35-test run and is not added to its total. The controlled older-request check is not a database isolation stress test. Failed-save injection, hosted MariaDB execution, multi-process load and production latency were not run. This does not qualify Phase 10, integrated security or release readiness. Reverting the package restores the old caching behavior and reintroduces the reproduced stale-settings defect. Publication/integration remains with the parent development lane.
@@ -0,0 +1,14 @@
# PERF-07 · Page-scoped application correspondence
Base `327d99dfdacc16f72e008807ea3f27805cf0c570` on `codex/a3-ui-10`. The ordinary applications table fetched the latest correspondence group for every owned application before paging. It now queries the existing latest-message aggregate once for the current page IDs. The normal board and empty page skip that unused aggregate. Follow-up and readiness filters still evaluate their existing full candidate set before paging to preserve membership and totals.
The focused SQLite test records and replays the actual SQL aggregate. Each fixture contains one correspondence group per owned application, one foreign application with correspondence, and a 15-row second page. The old runtime returned 250 and 2,500 aggregate rows. The new runtime returns exactly the 15 groups belonging to the page in both fixtures. The ordinary board and empty page now issue zero correspondence aggregate commands. The existing tenant filter, ordering, latest-message logic and response shapes are unchanged.
| Owned applications | Before aggregate rows | After aggregate rows |
| ---: | ---: | ---: |
| 250 | 250 | 15 |
| 2,500 | 2,500 | 15 |
**PASSED** 36 selected Release tests with pinned SDK 9.0.317 and no restore. 18 JobQueryParity, 10 ApplicationCalendar, five RulesEngineProspect and three OwnershipGuard cases. The 16 existing parity cases cover ordering, filters, board, ownership and pagination. Two expected pre-fix failures are preserved. [Native red and final test logs](../ui-modernisation/evidence/perf-job-page/)
These counts measure rows returned by the aggregate under a disposable SQLite fixture. MariaDB plan/rows examined, API response time and production performance remain unmeasured. No index, migration or worker configuration changed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,205 @@
{
"chromium": "151.0.7922.34",
"repetitions": 1,
"fixtureJobs": 15,
"profiles": [
{
"name": "desktop",
"viewport": {
"width": 1366,
"height": 900
},
"latencyMs": 40,
"downloadKbps": 10000,
"uploadKbps": 5000,
"cpu": 1
},
{
"name": "mobile",
"viewport": {
"width": 390,
"height": 844
},
"isMobile": true,
"hasTouch": true,
"deviceScaleFactor": 3,
"latencyMs": 150,
"downloadKbps": 1600,
"uploadKbps": 750,
"cpu": 4
}
],
"exports": {
"baseline": {
"root": "C:\\Users\\Connor\\AppData\\Local\\Temp\\a3-jobs-baseline-6bfdbd9d",
"indexSha256": "0c85270af2322b269312e76aa8ce14b5748d03ae4fd61ee3a611f2af617db68c"
},
"candidate": {
"root": "C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\out",
"indexSha256": "6c99c2c1b31cd567025e38add38c7c0300a04339c73f83b6068c5a326b995931"
}
},
"caveats": "Synthetic GET fixtures are immediately fulfilled, third-party calls are blocked, assets are uncompressed on loopback, sampled LCP/layout shifts are lab observations.",
"medians": [
{
"profile": "desktop",
"path": "/jobs",
"build": "baseline",
"contentMs": 2472,
"jsRawBytes": 2052915,
"jsGzip6Estimate": 606602
},
{
"profile": "desktop",
"path": "/jobs",
"build": "candidate",
"contentMs": 2445,
"jsRawBytes": 2052966,
"jsGzip6Estimate": 606643
},
{
"profile": "mobile",
"path": "/jobs",
"build": "baseline",
"contentMs": 13455,
"jsRawBytes": 2052915,
"jsGzip6Estimate": 606602
},
{
"profile": "mobile",
"path": "/jobs",
"build": "candidate",
"contentMs": 13233,
"jsRawBytes": 2052966,
"jsGzip6Estimate": 606643
}
],
"samples": [
{
"trial": 1,
"profile": "desktop",
"build": "baseline",
"path": "/jobs",
"localeReadDelta": 1,
"contentMs": 2472,
"sampledLcpMs": 2252,
"observedLayoutShiftSum": 0.23809328599150012,
"js": {
"files": 20,
"raw": 2052915,
"gzip6Estimate": 606602
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
},
{
"trial": 1,
"profile": "desktop",
"build": "candidate",
"path": "/jobs",
"localeReadDelta": 0,
"contentMs": 2445,
"sampledLcpMs": 2208,
"observedLayoutShiftSum": 0.23809328599150012,
"js": {
"files": 20,
"raw": 2052966,
"gzip6Estimate": 606643
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
},
{
"trial": 1,
"profile": "mobile",
"build": "baseline",
"path": "/jobs",
"localeReadDelta": 1,
"contentMs": 13455,
"sampledLcpMs": 12668,
"observedLayoutShiftSum": 0.03510786324402371,
"js": {
"files": 20,
"raw": 2052915,
"gzip6Estimate": 606602
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
},
{
"trial": 1,
"profile": "mobile",
"build": "candidate",
"path": "/jobs",
"localeReadDelta": 0,
"contentMs": 13233,
"sampledLcpMs": 12492,
"observedLayoutShiftSum": 0.03510786324402371,
"js": {
"files": 20,
"raw": 2052966,
"gzip6Estimate": 606643
},
"css": {
"files": 1,
"raw": 293,
"gzip6Estimate": 227
},
"api": [
"/api/auth/config",
"/api/auth/me",
"/api/jobapplications/reminders?upcomingDays=14",
"/api/notifications/unread-count",
"/api/companies",
"/api/jobapplications?page=1&pageSize=15&includeDeleted=false&sortBy=dateApplied&sortDir=desc"
],
"blockedExternal": [
"https://fonts.googleapis.com"
]
}
]
}
File diff suppressed because it is too large Load Diff
Binary file not shown.
@@ -0,0 +1,29 @@
{
"format": "Native VSTest TRX compressed with gzip; no text transformations",
"receipts": [
{
"rawFile": "rules-red.trx",
"rawBytes": 30627,
"rawSha256": "c74e5e9703924e1a1775bddab662d8327f3d66ce502ca61d917cd827317e9d68",
"compressedFile": "rules-red.trx.gz",
"compressedBytes": 2844,
"compressedSha256": "630785b741059e1398e777f0c8f84bdf3f7e748844547d7c468ec913cf0261aa"
},
{
"rawFile": "rules-green.trx",
"rawBytes": 12087,
"rawSha256": "7960a65a79f9208178d91b41a47469c7839ef4e8c352d077d7fe0fa7745354b3",
"compressedFile": "rules-green.trx.gz",
"compressedBytes": 2092,
"compressedSha256": "131c814b17df0fbbde67dea15ed9e65db2e1f2c801afada903453b504b4a64f6"
},
{
"rawFile": "rules-regression.trx",
"rawBytes": 53741,
"rawSha256": "e2e7e51902a167cdcb6fa46339476759f63331863f5a2953e3d64cf08b97b106",
"compressedFile": "rules-regression.trx.gz",
"compressedBytes": 6020,
"compressedSha256": "7c229b8beb9d2fa8f3ff453f58d5f3cfeac8987d1f79c0bac65db1a55c0883ca"
}
]
}
@@ -0,0 +1,228 @@
{
"baseline": "9c9fe48d5f321c653049f09ced5b7e27701fe2a8",
"scope": "Offline SQLite and mocked identity; no models/providers",
"red": {
"times": {
"creation": "2026-11-10T23:15:22.2984079+01:00",
"queuing": "2026-11-10T23:15:22.2984084+01:00",
"start": "2026-11-10T23:15:19.6116487+01:00",
"finish": "2026-11-10T23:15:22.3054244+01:00"
},
"counters": {
"total": "7",
"executed": "7",
"passed": "0",
"failed": "7",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"results": [
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"detail\")",
"outcome": "Failed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"reminders\")",
"outcome": "Failed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saving_owner_a_does_not_change_owner_b_and_old_readers_do_not_republish_stale_settings",
"outcome": "Failed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Global_save_refreshes_fallback_but_preserves_explicit_owner_override",
"outcome": "Failed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"readiness\")",
"outcome": "Failed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"board\")",
"outcome": "Failed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"list\")",
"outcome": "Failed"
}
]
},
"regression": {
"times": {
"creation": "2026-11-10T23:16:27.2319904+01:00",
"queuing": "2026-11-10T23:16:27.2319908+01:00",
"start": "2026-11-10T23:16:25.2545706+01:00",
"finish": "2026-11-10T23:16:31.6005940+01:00"
},
"counters": {
"total": "35",
"executed": "35",
"passed": "35",
"failed": "0",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"results": [
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"needs-work\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"readiness\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"correspondence\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Ordinary_table_materialises_correspondence_groups_only_for_the_returned_page(size: 2500)",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"custom\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RulesEngineProspectTests.A_prospect_is_never_followed_up_or_ghosted_however_old(status: \"Saved\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RulesEngineProspectTests.An_applied_job_with_no_applied_date_is_not_ghosted",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"combined\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"follow-up\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobApplicationsWorkflowSignalsTests.Readiness_keeps_package_gap_when_notes_do_not_contain_saved_answer_block",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"standard\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"foreign-company\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saving_owner_a_preserves_owner_b_and_existing_readers_see_subsequent_writes",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"deleted\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"interview\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.ConcurrentInitializationTests.Concurrent_checklist_reads_share_the_single_default_item_set",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RulesEngineProspectTests.A_prospect_is_never_followed_up_or_ghosted_however_old(status: \"Interested\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"notes\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"detail\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.ConcurrentInitializationTests.Concurrent_rule_reads_share_the_single_created_settings_row",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Ordinary_table_materialises_correspondence_groups_only_for_the_returned_page(size: 250)",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"list\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"none\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"location\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RulesEngineProspectTests.A_prospect_is_never_followed_up_or_ghosted_however_old(status: \"Preparing\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RulesEngineProspectTests.An_applied_job_past_the_threshold_still_ghosts",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"reminders\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"include-deleted\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"company\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Saved_owner_thresholds_are_visible_on_the_next_read(surface: \"board\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"all\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Completing_an_older_request_cannot_restore_old_rules_after_a_save",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.RuleSettingsFreshnessTests.Global_save_refreshes_fallback_but_preserves_explicit_owner_override",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobQueryParityTests.Table_pages_and_board_have_identical_owned_membership(scenario: \"search\")",
"outcome": "Passed"
},
{
"test": "JobTrackerApi.Tests.JobApplicationsWorkflowSignalsTests.Reminders_return_normalized_workflow_routes_for_package_and_follow_up_actions",
"outcome": "Passed"
}
]
}
}
@@ -0,0 +1,9 @@
# Admin Audit isolation on the A3 integration branch
Applied the controller and regression-test changes from security checkpoint `d4c486681ad51424bfd33545d518e87193ffbc56` to A3 base `2717c6afaf6375e2e1abd7d63cbfa613a802ce83`. Git comparisons confirmed both input files matched the security patch's parent and both outputs matched its committed files. No other security branch changes were integrated.
Admin Audit now omits the mailbox subject from imported `ReplyReceived` notes. The loopback HTTP fixture verified anonymous and non-admin denial, the redacted admin response, retained non-private audit details and the unchanged stored owner note. It also verified owner-scoped notification reads and writes and processing detail access. There was no migration or data rewrite.
**PASSED 57 selected backend tests**, zero failures or skips, pinned .NET SDK 9.0.317 in Release with no restore. The native [TRX](evidence/admin-audit-isolation/INTEGRATED.trx) records 31 AdminProcessing, 19 Gmail and 7 Users cases. The seven Users cases overlap the separate read-only 2FA checkpoint. The native hash before Git text normalisation is `840180a639bbc63f9869ae013faae33f10507a0152524c89590f44357fcacea5`.
The fixtures used an isolated local database and synthetic users. Broader audit minimisation, real MariaDB and live provider checks, approved support access and final integrated security testing remain open.
@@ -0,0 +1,15 @@
# IM10 initial localisation and preservation checkpoint
3 November 2026. Owner approved **"Approve IM09 and A3-IM10"**. Base `7a9de940dfdc41023f87a1ef38a5fd86a0b8e477` is published/remotely verified. This bounded checkpoint advances IM10; it does not complete cross-application or roadmap acceptance.
The reviewed attachment-size patch `1ce93ca0e3a906673e636e56f1b910756ca78bb2` was narrowly cherry-picked as `31ce70271663a5d57c7b2eb8f80cd69be5cc95ef`. Git reconciled the newer ApplicationAssets/test changes without conflict; the older branch tree was not merged. Fresh affected tests on this baseline: **63 PASSED**, zero failed/skipped, two suites. Original `docs/i18n/ATTACHMENT_SIZE_*` records bind the old isolated source and61-case run; they remain historical, not fresh integration evidence. Current source/evidence binding is the cross-app manifest.
Whole-document AI review displayed the internal `headline` ID when no title was supplied. It now falls back to the existing translated headline-override label. Supplied/original titles and unknown IDs keep existing behavior. A new regression failed before the fix and passes afterward: switching UI language changes only chrome, retaining the reviewed English proposal without another generation or apply. Full studio successor: **61 PASSED**, zero failed/skipped; existing direct-focus React act warnings remain. Total fresh unit coverage for this checkpoint is124 distinct cases/three suites, not the old61+new63+61 combined.
The existing AI/settings browser verifier was reused in an affected-review mode, with a separate output directory. **16 controlled journeys/16 axe scans** passed at320/390/768/1440, EN/NB and light/dark. Caption asserted, English output language retained under Norwegian UI, explicit review shown with zero mutations and16 synthetic proposal responses. No live model, semantic translation-quality, backend end-to-end, provider or physical-PDF claim. Original IM08 captures/manifests are not overwritten by this run. Native artifacts: `evidence/cross-app/browser-ai-review/REVIEW.json` and16 captures.
The TypeScript AST census confirms all34 inherited route patterns are registered. The complete57-group preservation register has the same LF-normalised hash as integration `d3d338376444b8abdcaf7200f682faa3daf1ad10`. Source statuses/required closures remain unchanged:56 PARTIAL/one DEFERRED. This is source membership and criteria preservation, not browser/auth/deployed or whole-capability acceptance. The approved design's frozen237c79b8 coverage pack was read for the full route/group map; no new design exploration or production-UI approval was inferred.
Typecheck, full lint, scoped verifier lint and static-export build PASSED. AST-only graph refreshed locally; optional SQL/symbol-less limits remain. Independent source/verifier/integration review found no actionable issues. Backend and physical-renderer sources are unchanged; no repeat backend/PDF run was justified for these display changes. Rollback reverts the caption patch and narrow attachment localisation integration; no database rollback.
Remaining authorised work: secondary-route connected/responsive/accessibility checks and an evidence-by-group reconciliation across the accepted A3 increments; combined affected regression and final A3 proposal. Native/human/provider, full European localisation, Phase10, Global Jobs dependencies, public homepage, final integrated security/recovery/hosted CI/release gates remain separate. Mounted AI entitlement refresh and granular Ghosted pause remain OPEN. Do not dispatch the general auth-changed event as a shortcut: it resets authResolved and can unmount drafts. No main merge, deployment, orchestrator or pre-P10 changes.
@@ -0,0 +1,67 @@
# A3 implementation preservation reconciliation
3 November 2026. All57 original groups and34 route patterns remain in the unchanged [preservation register](../pre-phase10-ux/preservation.json). The [source census](evidence/cross-app/PRESERVATION_CENSUS.json) retains each original requiredClosure/sourceCriterion. **56 PARTIAL/one DEFERRED remain historical capability statuses.** Owner acceptance of A3 presentation increments does not promote those statuses, waive linked criteria or grant providers/models/production access.
This table maps each group to bounded implementation evidence and identifies residual work. The accepted evidence remains bound to its implementation commit/manifest. New IM10 secondary qualification passed:85 unit cases/seven suites and16 controlled route journeys/96 scoped axe scans across EN/NB, both themes and320/390/768/1440. See SECONDARY_VALIDATION.md. Pilot/failure attempts do not add coverage; these results do not promote historical capability statuses.
| Group | Relevant A3 implementation evidence | Scope and remaining qualification |
|---|---|---|
| PRES-E01 | Shared theme; public/plans retained | Separate LAUNCH-SITE visual/claims and real billing availability gates. No new launch or pricing claim. |
| PRES-E02 | Navigation; account/admin; secondary public-auth tests | Controlled local access/recovery presentation. Real mail/challenge/token delivery and native checks remain distinct. |
| PRES-E03 | Account/admin; secondary legacy-relink tests | Existing sign-in provider/link/relink contracts retained. No real OAuth/link/provider validation. |
| PRES-E04 | Account/admin | Local 2FA/recovery/trusted-device fixtures and cancellation. Real credentials/delivery/native qualification open. |
| PRES-E05 | Account/admin | Session guards and confirmation fixtures; no real revocation for visual testing. |
| PRES-E06 | Account/admin | Identity-only fields, avatar/account restrictions; drafts retained across in-page section jumps. Canonical career data remains separate. |
| PRES-E07 | Navigation; shared theme | Sidebar/hybrid mobile/commands retained. Physical-device and full native accessibility remain separate. |
| PRES-E08 | Shared theme; Settings/AI; IM10 localisation | EN/NB hydration, feedback/dialog owners retained. Complete European/native-language qualification remains open. |
| PRES-E09 | Navigation; account/admin; original session boundaries | Existing private-state disposal and stale-request boundaries retained. No integrated-security acceptance inferred. |
| PRES-J01 | Discovery | Existing supported NAV presentation/attribution/geography retained. Global Jobs dependencies and provider rights not granted by A3. |
| PRES-J02 | Discovery | Controlled saved-search actions/alerts qualified; real provider/worker delivery remains separate. |
| PRES-J03 | Applications | Existing manual/URL/paste review and duplicate handling retained; no provider scraping added. |
| PRES-J04 | Applications; Settings capture owner | Existing capture/deep-link surfaces retained; extension/device/platform qualifications unchanged. |
| PRES-J05 | Applications | Table/filter/column/saved-view and mobile actions retained; broader native/device criteria not promoted. |
| PRES-J06 | Applications; secondary trash | Existing trash/restore/bulk contracts retained. Secondary browser trash state is empty; no real delete/restore. |
| PRES-J07 | Applications | Table/board/status/keyboard controlled journeys retained; real pointer/touch qualification separate. |
| PRES-J08 | Theme/navigation; secondary companies | Existing company/contact/relationship owner retained; secondary bounded fixtures, no real CRM writes. |
| PRES-J09 | Secondary offer comparison | Recorded facts/unknown compensation/links retained. No inferred salary, deadline provenance or financial advice. |
| PRES-J10 | Applications; Settings/import owners | CSV/JSON conversion/import/export owners retained. Original full data-fidelity/compatibility closure remains authoritative. |
| PRES-W01 | Applications; Career | Existing full workspace/sections/legacy aliases/context retained; no route removed. |
| PRES-W02 | Applications | Status/progression/details/timeline actions retain existing revision writers and permissions. |
| PRES-W03 | Applications; AI | Controlled analysis/review presentation. Live semantic AI and provider quality remain unqualified. |
| PRES-W04 | Applications | Existing checklist lifecycle/reorder/next-action owner retained. No replacement persistence layer. |
| PRES-W05 | Career | CV attach/select/tailor owner and canonical/variant boundaries retained; no live tailoring quality claim. |
| PRES-W06 | Career; workspace | Manual letter/preview/history/conflict/dirty protections retained, existing atomic assets writer unchanged. |
| PRES-W07 | Career; IM10 attachment localisation | Frozen package/snapshot/download ownership retained; displayed sizes change without changing bytes or filenames. |
| PRES-W08 | Workspace; IM10 attachment localisation | Existing upload/preview/download/consent/category owner retained; no file-access boundary changed. |
| PRES-W09 | Retained interview task components; Applications | Controlled manual/review scope only. No live AI quality or new stored interview scheduling claimed. |
| PRES-W10 | Retained debrief/follow-up components; Calendar | Original readiness/draft/date contracts retained; interview appointment data-model gap remains explicit. |
| PRES-W11 | Calendar; Settings/AI | Recorded date agenda/month and email switch qualified. Original precision/timezone data, real ICS/provider consent/delivery remain separate. |
| PRES-W12 | Workspace; account/admin; secondary operations | Existing async progress/failure/retry/cancel/notification owners retained. No real workers/models activated. |
| PRES-C01 | Career | Canonical full profile/long-tail/custom sections retained; no engine replacement or canonical-owner transfer. |
| PRES-C02 | Career | Overview, completion and edit actions retain existing import/raw/history owners. |
| PRES-C03 | Career | Existing upload/diff/review/accept/cancel controls retained. Deferred CV-import engine overhaul remains excluded. |
| PRES-C04 | Career/evidence owner retained | Original evidence-bank CRUD/source criteria remain authoritative; UI milestone is not full source-quality acceptance. |
| PRES-C05 | Career | Library/templates/share/PDF actions retained; real storage/publication/PDF qualifications remain separately evidenced. |
| PRES-C06 | Career; IM10 caption | Editor-left/preview-right, mobile panes and preview lifecycle retained; caption is app chrome, not renderer content. |
| PRES-C07 | Career | Existing section/item/document overrides and null-as-inherit retained; no settings schema change. |
| PRES-C08 | Career | Existing template/capability/typography/photo controls retained. Physical rendering evidence is reused where unaffected. |
| PRES-C09 | Career | Existing page/density/margins/document language/settings owner retained; UI language never silently translates document content. |
| PRES-C10 | Career | Undo/save/conflict/history/lifecycle contracts retained; focused reruns do not inflate accepted totals. |
| PRES-C11 | AI; IM10 caption | Historical DEFERRED semantic qualification remains. Controlled proposal invalidation/review/apply and caption language are tested; no live inference. |
| PRES-C12 | Career; secondary public CV | Public/private document surfaces retained. Mock HTML/PDF href checks are not renderer, real anonymous-access or physical-PDF qualification. |
| PRES-M01 | Workspace | Existing job-scoped manual correspondence/paste/search/delete owner retained; no real messages changed. |
| PRES-M02 | Workspace | Gmail import/thread/link/conflict owner retained; real provider OAuth/delivery/rights gates remain. |
| PRES-M03 | Workspace | Global inbox/filter/page/detail/source context qualified with fixtures; real provider data not accessed. |
| PRES-M04 | Workspace | Compose/reply/conflict/confirmation/uncertain-send fixtures qualified. No actual delivery or unsafe retry. |
| PRES-M05 | Navigation/workspace; legacy route retained | Existing review/link/reject/notes owner retained; final provider-backed review qualification remains separate. |
| PRES-M06 | Account/admin | Mailbox connections remain separate from sign-in providers; no real connect/disconnect or credentials. |
| PRES-S01 | Dashboard; secondary analytics | Existing metrics/activity/funnel/reporting and query owners retained; fixture values are not live user analytics. |
| PRES-S02 | Dashboard | Optional onboarding/skip/resume and original widget/schema-2/CAS/geometry protections retained. |
| PRES-S03 | Settings/AI; account/admin | Existing preference/rule/draft writers retained. Six numeric thresholds do not provide per-user Ghosted pause. |
| PRES-S04 | AI/Settings | Privacy/usage/entitlement/billing boundaries retained. Mounted entitlement display refresh gap remains OPEN; no inferred client grant. |
| PRES-S05 | Account/admin | Export/recent-sign-in/deletion confirmations retained. Offline fixtures do not qualify real backup/restore/recovery. |
| PRES-A01 | Account/admin | Existing roles/self/last-admin controls and local backend tests retained; no real account mutation for visual testing. |
| PRES-A02 | Account/admin | Existing audit/read/undo/restore owner retained; browser capture is empty and action scenarios are unit fixtures. |
| PRES-A03 | Account/admin | Existing system/mail/probe/benchmark/maintenance controls retained; browser unavailable-state checks are not real diagnostics/security/recovery acceptance. |
Evidence index: [theme](VALIDATION.md), [navigation](NAVIGATION_VALIDATION.md), [dashboard](DASHBOARD_VALIDATION.md), [applications](APPLICATIONS_VALIDATION.md), [discovery](DISCOVERY_VALIDATION.md), [career](CAREER_VALIDATION.md), [workspace](WORKSPACE_VALIDATION.md), [AI/settings](AI_SETTINGS_VALIDATION.md), [account/admin](ACCOUNT_ADMIN_VALIDATION.md), [IM10 localisation](CROSS_APP_LOCALISATION.md). Processing monitor is also retained at the34th route, /admin/processing; the historical group register is not expanded or rewritten to fabricate acceptance.
@@ -0,0 +1,25 @@
# A3 refinement and Europe-ready release
Owner addendum received 9 November 2026. Source `E:/Storage/Projects/Active/temp docs/final/additional/# Jobjakt — A3 refinement+EUJOBS.txt`, SHA-256 `5aaefea0e2fde342fd78917d0b9d9eb38c873d902095bdaa4389c9bb6d83397d`. The three adjacent reference images were reviewed. The job search image shows the current banner-first layout. The FINN example informs filter categories and hierarchy only. The admin image shows the alignment problem in the existing Users table. This work extends the approved A3 and existing roadmap owners.
| Work package | Next independently eligible slice | Gate or residual requirement |
| --- | --- | --- |
| Admin information isolation | The original redaction patch passed 62 tests on the security branch. [A3 integration](ADMIN_AUDIT_ISOLATION_VALIDATION.md) matched the exact source/test patch and passed 57 selected tests. The runs overlap and remain separate evidence. | Integrated security, remaining delivery paths, broader minimisation and deployment checks remain separate. |
| Discover Jobs | [Search-first layout](visual-correction/DISCOVERY_SEARCH_FIRST.md) and [mobile filter drawer](visual-correction/DISCOVERY_MOBILE_FILTERS.md) qualify existing NAV search, retained drafts, keyboard submit, source disclosure and responsive focus. | Expose new filters, map and multilingual suggestions only with qualified data and the existing GJ architecture. Focused detail and broader saved-search browser qualification remain open. |
| Applications | [Title-first rows and explicit bulk mode](visual-correction/APPLICATION_SELECTION_REVIEW.md) and [compact row actions](visual-correction/APPLICATION_ACTIONS_REVIEW.md) qualified at 36 configurations each. | Final native/visual review and broader server-backed workflows remain open. |
| Admin Users and Audit | [Compact user actions](visual-correction/ADMIN_USER_ACTIONS_REVIEW.md) preserve alignment and read-only 2FA. [Recent audit filtering and details](visual-correction/AUDIT_FILTERS_REVIEW.md) passed its own 36-configuration checks. Additional audit filters remain open. | 2FA recovery and private support access require explicit owner approval of their technical and privacy designs. |
| Job Correspondence | Continue inbox layout, mailbox-status presentation and existing explicit consent flow. | Provider verification, restricted scopes, multiple-account persistence and retention decisions retain their gates. Signing in grants no mailbox access. |
| System Status | [Status refresh evidence](visual-correction/SYSTEM_STATUS_REFRESH_REVIEW.md) and [diagnostics design](SYSTEM_DIAGNOSTICS_DESIGN.md) distinguish current, stale and unavailable readings. CV Benchmark Review is retained. | Predefined diagnostics require approved suites, isolated execution, role checks and audit. Live execution and per-signal telemetry remain open. |
| Terminology | “Prepare application” / “Klargjør søknaden” is visible in the scoped EN/NB application checks. | Continue broader terminology and European catalogue review. |
| Bookmarklet | [Dependency review](#bookmarklet-dependency-review) confirms the URL form already provides the primary import path. | Retain the existing bookmark-bar shortcut pending device parity and retirement approval. |
| EUROPE-READY-01 | [Coverage companion](../i18n/00/EUROPE_RELEASE_COVERAGE.md) added for all 59 existing candidate codes. | Qualified data/licences, implementation entry, additional locales, native review and release approval are separate. |
European acceptance requires independent residence, search countries and locations, interface language, job-ad languages and per-document languages. The query, accessible location tree and optional map must consume the same canonical location selection. Selecting a parent covers its area. Selecting children refines that branch, and independent branches combine. Changing countries clears only incompatible filters with an explanation. It preserves language and saved search definitions. Provider scope, map coverage, catalogue support and production availability must each have their own status.
Keep the 34 routes and 57 preservation groups reconciled in the existing A3 registers. Continue independent development under IM10 and the applicable phase gates. Production launch requires the country-by-country, native, accessibility, provider, security and recovery evidence in the addendum.
## Bookmarklet dependency review
`QuickCaptureCard` opens the existing `/?add=` route with the current page URL. It does not extract page content. The PWA share target and browser extension also use the capture route, and `App.tsx` resolves the URL into the existing Add Job flow. Removing the route would break multiple supported entry points.
The existing Add Job form supports direct URL paste, the same preview API and manual entry if preview is unavailable. The extension's URL contract passed all three local Node cases. Earlier synthetic coverage verified the Settings copy control and Discover-to-tracker preview/review journey. Neither proves that the extension or PWA replaces bookmark-bar capture on every supported device. No supported capture path was removed. Test installation, mobile sharing and bookmark-bar parity before nominating retirement.
@@ -0,0 +1,15 @@
# IM10 secondary-route qualification
3 November 2026. Approved IM10 continues from published `ccf8d26426235a7a54903162e539d9d613058465`. No application implementation change in this package: existing secondary components are retained and checked, rather than replaced or omitted.
**85 frontend tests/seven suites PASSED**, zero failed/skipped: companies/relationships, offers, operations, analytics, public authentication, public CV and Microsoft legacy relink. Native report under `evidence/secondary/frontend`. These suites are distinct from the initial IM10 localisation/studio124 cases; count209 distinct cases/ten suites across those two bounded packages, not a full frontend regression pass.
**16 controlled route journeys/96 scoped axe scans/captures PASSED** at320/390/768/1440, EN/NB and both themes. Six direct-entry surfaces: populated companies; recorded teacher and nursing offers with unknown values kept explicit; processing progress with unavailable task actions absent; populated analytics with24-month query navigation; empty trash; public CV fixture HTML and PDF link. Public route issued no identity read in this fixture. Zero mutations/page errors/returned WCAG-tagged axe violations/document overflow. These are bounded fixtures, not real datasets or provider results.
The verifier permits static assets at localhost4338 and intercepts every /api request to the app's existing development API origin localhost5202. It never continues API requests to a server. Other origins are blocked; only the existing Google-font stylesheet attempt was observed. The initial pilot blocked5202 too, producing the application read-error state; this was a verifier setup failure, preserved separately. Corrected pilot overlaps the full run, not extra coverage. No app API configuration or service changed.
No real deletion/restore, operation cancel/retry, credentials, provider, model, anonymous backend-access or PDF render/download operation was performed. The public CV HTML is a controlled preview, not renderer/physical-PDF qualification. Native/keyboard devices, screen readers, deployed security, hosted CI, data recovery and release acceptance remain separate.
Verifier scoped lint/syntax passed; AST-only graph refresh completed locally (18,882 nodes/46,576 edges/1,131 communities), with existing optional SQL and symbol-less-file limits. No dependency/build-source change justified another application build; the same124-case package export was used. The57-row preservation reconciliation self-check matches all57 original IDs exactly and retains their required closures/statuses. All34 route patterns remain in the separate AST census; six secondary route executions are not a claim of34 runtime routes passing.
Remaining IM10 work: final integrated evidence reconciliation/combined affected regression and consolidated A3 acceptance proposal; bounded mounted AI-entitlement refresh investigation continues separately. Granular Ghosted pause still lacks a persisted rules contract. Full Phase10, European localisation/Global Jobs/launch/security/recovery/release gates remain open. No main merge, deploy, orchestrator or pre-P10 changes.
@@ -0,0 +1,24 @@
# System Status and diagnostics
## What the page can report today
| Signal | Source and limit |
| --- | --- |
| Backend status and refresh | The admin status GET reports environment, build and runtime details. Its success indicates a response from that endpoint. The UI timestamp is when the browser received that response. A failed refresh retains the earlier timestamp with the existing warning. |
| Database | The status GET attempts database reads and reports connectivity and query warnings. This is a point-in-time observation. |
| AI | The status GET displays summarizer metrics and their own available timestamps. The manual probe is a separate existing action. A status response alone does not prove a model, OCR, or a processing task succeeded. |
| Processing | The Admin Processing monitor owns worker flags, recorded operations, counts, and recorded failures. A flag alone gives no liveness guarantee. Any future status summary should link to that owner and label unsupported queues or heartbeats as unavailable. |
| Mail, external providers and scheduled enrichment | No system-wide measurement is established in this slice. A per-user connection and configuration flags are insufficient evidence for service health. Aggregate only supported service signals and keep account or job content out of the admin view. |
| API errors and timings | Existing AI timings remain scoped to AI. General request error rates and latency need their own instrumented source, time window and sample counts. |
Source owners are `AdminSystemController.Get`, `AdminProcessingController` and `AdminSystemPage`. Preserve the separation between an observed value, an earlier value with its timestamp, a failure to read and a signal the app does not measure. Each eventual backend metric needs its own observation time and sampling window where applicable.
## Proposed operator flow
In an Advanced diagnostics section, list the approved suite name, description, target environment, last execution and result. An unavailable suite shows its reason and has no Start control. An authorised operator reviews the fixed environment and scope before starting. A run row shows queued, running and terminal status with time and progress from the runner. History exposes a bounded, sanitised summary and a run ID.
The existing `MaintenanceJobDispatcher` only accepts `cv-benchmark` and dispatches a fixed Gitea workflow from `main`. The workflow uses a private CV corpus and AI service on the production host and publishes reports back to the running backend. Its queue acknowledgement is not a completion receipt. Retain CV Benchmark Review and its historical evidence for CV extraction qualification. Keep dispatch separate from the proposed isolated suites. This review executed neither path.
The first candidate for isolated execution is a fixture-only API smoke suite with a disposable datastore, synthetic records and AI/mail/providers disabled. A server-side allowlist must bind each suite ID to an immutable executable, target and resource limits. Inputs must never include shell commands, arbitrary arguments, URLs, credentials or a caller-selected environment. Validate administrator role and current session on every read and start, and recheck authorisation at dispatch. Use a separate least-privilege runner without production credentials, mounts or network paths. Apply time and concurrency limits, deduplicate starts, and record actor, suite, environment, revision, time and outcome. User data and secrets must never enter logs or history. Show structured allowlisted results and retain them only for an agreed interval.
Before enabling Start, qualify role and session denial, unknown suite IDs, duplicate starts, expired runs, cancellation and timeout cleanup, sanitised output, and absence of access to production or provider routes. Qualify status and history with fixtures independently of execution. Actual suite approval, runner isolation, retention and deployment remain separate decisions.
+79
View File
@@ -0,0 +1,79 @@
# A3-IM10 Cross-application qualification
Applications runtime `bfbfaeb9` consolidates existing row controls into one keyboard menu while preserving selection, status, edit, Trash and Restore. See [application action review](visual-correction/APPLICATION_ACTIONS_REVIEW.md).
Discovery runtime `4f3541e5` adds the existing mobile filter drawer with 36 controlled configurations and one server-backed keyboard/import case. Application density follow-up `64603f56` passed all four server-backed EN/NB/theme cases. See [drawer review](visual-correction/DISCOVERY_MOBILE_FILTERS.md) and [density verification](visual-correction/APPLICATION_DENSITY_SERVER_REVIEW.md). Broader historical saved-search mobile sequences and final acceptance remain open.
Admin Users runtime `171a6908` groups existing row actions into one keyboard menu. See [Admin action evidence](visual-correction/ADMIN_USER_ACTIONS_REVIEW.md).
Audit runtime `cd69b769` combines exact event type and inclusive local dates with recent search and adds keyboard-expandable details for already permitted values. See [Audit filter review](visual-correction/AUDIT_FILTERS_REVIEW.md).
Audit runtime `1a8a97a5` adds local metadata search for the loaded recent-event window. Ten frontend tests and 72 controlled captures and scans passed. See [audit search evidence](visual-correction/AUDIT_SEARCH_REVIEW.md).
Admin Users runtime `e22f2d64` presents read-only 2FA and confirmation status. Seven backend tests, 14 frontend tests, lint, export and 36 scoped browser scans passed. See [account status evidence](visual-correction/ADMIN_USER_2FA_REVIEW.md).
System Status runtime `4981a242` displays the last successful browser read and preserves its timestamp when a refresh fails. See [refresh evidence](visual-correction/SYSTEM_STATUS_REFRESH_REVIEW.md) and the [separate diagnostics design](SYSTEM_DIAGNOSTICS_DESIGN.md).
Application list successor `1246994c` moves role ahead of employer and shows bulk controls in explicit selection mode. Passed 57 native tests, types, lint, build and 72 rendered states. [Application selection evidence](visual-correction/APPLICATION_SELECTION_REVIEW.md)
Discover Jobs search-first layout at `0540e84f` passed 26 native cases, types, lint, build and 108 controlled states across 36 configurations. [Search-first evidence](visual-correction/DISCOVERY_SEARCH_FIRST.md)
The owner's additional A3 refinements and mandatory Europe-ready criteria are tracked in the [refinement and Europe register](REFINEMENT_AND_EUROPE.md). It extends the current milestones and preserves their separate security, provider and release gates.
Settings privacy recovery passed 36 configurations and 180 states on unchanged runtime `e8e7d839`. Loading, unavailable, retry, rejected save and discard were exercised with fixture responses. [Settings recovery review](visual-correction/SETTINGS_RECOVERY_REVIEW.md)
Audit timestamp successor `2dc8fe4c` preserves date and time readability without inflating the table row. Nine native cases, types, lint, build and 36 focused rendered states passed. See [Audit date review](visual-correction/AUDIT_DATE_REVIEW.md).
Correspondence recovery passed 36 controlled configurations and 144 captured states on unchanged runtime `c7e8627c`. Review error/retry/empty/suggestion and draft 409 recovery were exercised without sending mail. [Mail recovery review](visual-correction/MAIL_RECOVERY_REVIEW.md)
Gmail review count wording in `e8e7d839` passed 54 targeted tests, types, lint, build and 36 focused read-only rendered states. [Review count wording](visual-correction/MAIL_REVIEW_COUNTS.md)
Admin heading successor `c7e8627c` removes repeated titles on four routes and retains route descriptions, section hierarchy and keyboard refresh focus. Passed 66 targeted native tests, types, lint, build, and 36 configurations with 324 captured states. Audit timestamp wrapping remains open as V25. See [Admin heading review](visual-correction/ADMIN_HEADINGS_REVIEW.md).
4 November follow-up source **c0ef4171d5451abfeba09321990380c395728c20**:23 native cases/four suites, types/full lint/build and8 representative configurations/48 states PASSED. Native/browser RED reproduced stale sibling agenda after scheduling; parent refresh token now updates it after successful schedule/clear, not failed PATCH, preserving month/view. Browser journey traverses real More/navigation/status/Reminders/context controls;16 intercepted mutations,zero unavailable reads/errors/axe. See visual-correction/FOLLOWUP_JOURNEY_REVIEW.md. No provider/backend scheduling/date-model/physical PDF acceptance. Publication remains pending HTTP502; last known remote8fef819c. Remaining route/error/owner/native/European/Phase10/security/recovery/release gates OPEN.
4 November CV-count source **122956b6a38f4dc06b461383f31fdaa2658a6fdb**:81 native cases/two suites, types/full lint/export build and36 configurations/72 caption states PASSED,zero writes/errors/axe violations. V23 one-entry/page captions corrected, no new dynamic calls; pagination, source content, settings and revision behavior preserved. See visual-correction/CV_COUNTS_REVIEW.md for retained failures and exact scope. Preceding CV journey7e2bf201 remains local-only pending publication; last successful remote8fef819c. No production/renderer/security/owner acceptance inferred.
4 November Profile→CV creation/edit/preview/download client journey on unchanged **9bfc51b067c4da4164b84578f5dacf452125ba62**:8 representative390/1440×EN/NB×theme journeys/40 states PASSED,16 intercepted creates/renames and8 revision-checked export/download events. No unexpected writes/errors/axe violations;8 company and8 template-preview reads unavailable. Selected contact/summary inheritance request and unchanged settings at rename checked; backend Profile rendering/physical PDF NOT RUN. Synthetic download bytes explicitly are not a PDF. See visual-correction/CV_JOURNEY_REVIEW.md. Matching-count receipt **8fef819c4e5a17eee65c8707d014155dea8a6322** published/readback-verified with1,256 integrity checks. Remaining application→follow-up/import/error/native/owner/security/recovery/release gates stay OPEN.
4 November matching-count source **9bfc51b067c4da4164b84578f5dacf452125ba62**:48 selected native cases/four suites, types/full lint/export build and36 configurations/72 table/board states PASSED,zero writes/unavailable reads/page errors/axe violations. V22 singular text resolved in EN/NB, no new dynamic translation call; existing locale-triggered active-view reload preserved. See visual-correction/MATCHING_COUNT_REVIEW.md for retained RED/path failures and exact superseded counts. Viewer24 families/864 actual bindings/28 frozen references;48 artifact selections passed separately. Discovery receipt **ed4ce4cc3a0fffecfa406793a60680e490fa6674** published and independently verified after one ordinary retry of a remote unpack checksum rejection;1,287 integrity checks matched. No infrastructure change. Remaining IM10/route/workflow/owner/native/European/security/recovery/release gates remain OPEN.
4 November discovery→preview→review→tracker qualification on unchanged runtime **a84a97cb61eda975d73690c818d56666f0929515**:36 connected journeys/144 rendered states PASSED;36 intercepted previews and36 creates, original source fields checked, no unexpected writes/unavailable reads/errors/axe violations. No actual provider/backend or attachment/AI execution. Existing wizard controls retained. Count grammar V22 found and remains open for the next bounded fix. Comparison viewer22 families/792 actual bindings/28 frozen references;44 artifact selections passed separately. Evidence Bank receipt **b5b9069d1e835197cc37c5e7e293c3a60857ec2f** is published/readback-verified with1,321 integrity checks. Other connected journeys and all final roadmap/native/owner/security/recovery/release gates remain OPEN.
4 November Evidence Bank qualification on unchanged runtime **a84a97cb61eda975d73690c818d56666f0929515**:36 controlled journeys/216 rendered states PASSED, drafts retained across sections/retry, valid drafts blocked while read fails, deletion cancelled. Zero writes, preview requests, page exceptions or axe violations;108 company fixture reads unavailable. Component/test unchanged fromb31; no unnecessary rebuild or native rerun. Existing form/owned evidence boundaries intentionally retained. See visual-correction/EVIDENCE_BANK_REVIEW.md. Comparison viewer21 families/756 image bindings/28 frozen references;42 artifact selections passed separately. Settings receipt **505b0c01b953002ef777eca9aea550715b217216** published/readback-verified with1,268 integrity checks. Full IM10/34 routes/57 groups, connected journeys, owner/native/European/Phase10/security/recovery/release acceptance remain OPEN.
4 November Settings/shared-feedback runtime **a84a97cb61eda975d73690c818d56666f0929515**:70 selected native cases/eight suites, types/full lint/export build and36 configurations/252 Settings states PASSED. QuickCapture decorative surface removed; actual interaction found and fixed the ToastProvider-outside-theme contrast defect. Feedback remains visible during contrast analysis. Zero writes/proposals/browser exceptions/axe violations;36 company reads unavailable fixtures. Viewer20 families/720 actual bindings/28 frozen references;40 artifact selections passed separately. Admin receipt **0e2ccfe98406d5d896c74482b0ba08a976c74c4a** is published/readback-verified with1,163 integrity checks. Evidence Bank verifier extension remains separate WIP, not part of Settings qualification. All final roadmap/owner/security/recovery/native gates remain OPEN.
4 November administration runtime **d651ce7aa41c2e296db20c2a28b2abe093884756**:60 native cases/four suites, types/full lint/export build and36 configurations/324 rendered admin states PASSED. Open diagnostic/audit/processing sections and divided benchmark findings remove decorative nesting. All reads synthetic;216 company reads unavailable and144 deliberate unavailable system reads. No mutation/probe/maintenance/SMTP/undo/restore/user action executed. See visual-correction/ADMIN_REVIEW.md for exact scope, source and limits.17-family comparison viewer has612 actual image bindings/26 immutable references and34 artifact selections; these are not extra application checks. Permission/action/error/human/owner and full roadmap acceptance remain OPEN. Settings read-only pilot is independent WIP and excluded from administration qualification.
4 November current localisation sourcecd116ab8:44 native cases/two suites, types/full lint/build and36 focused label states passed with zero writes. Singular count text is corrected in EN/NB without rewriting plural/provider data or adding dynamic translation calls. Mail workflow receipt1881fdb2 (runtimea9208ab4,39 tests/144 states,888 integrity checks) is published and independently verified; label-only runs do not repeat its send workflow. Current label receipt is being sealed. V18 administration, remaining state/journey review and all human/native/European/security/recovery/release/owner gates remain OPEN.
4 November mail successora9208ab4:39 native cases, types/full lint/export build and36 journeys/144 mail-only states PASSED. Divided messages, early jump, recorded context right on desktop/before prose on narrow screens; no new fetch or invented status/appointment. Preserved draft/confirmation/uncertain-send behavior uses72 synthetic requests only. Documentation, manifests and readback are being sealed; predecessor dd284782 is published/verified. V19 singular-count grammar and the remaining admin/Settings/evidence/error/connected-workflow, human/native/security/release checks remain OPEN. This is not final A3 or Phase10 acceptance.
4 November current source **b31ce6176bcb8f6a70d3e29ad4057b7cb74a1f53**:114 selected native tests/eight suites, types/full lint/export build and final36-configuration matrices PASSED: Career216, documents/mail216, calendar108, single-month markers36. These scoped checks do not complete IM10. Career unavailable fixture reads and all human/native/provider/security/release limits are explicit in visual-correction/CAREER_DOCUMENT_ACTIVITY.md. The later37-test flat-mail successor remains unbuilt and excluded from this runtime. Source/evidence receipt is being sealed for publication; published/verified predecessor is79d7bbe0. The navigable visual-correction/route-review.html uses11 real screen families, nine widths, EN/NB/themes and frozen A3 references; all396 actual image bindings and22 reference files plus two artifact smoke viewports passed. This is an evidence viewer, not another design concept or full34-route acceptance.
4 November latest continuation: public-language receipt **09904ecc6889e196139b1a4da448230e3d0e44c8** and account/editor receipt **368e90d57206df00204f16ced78d9379706a6878** are published and independently remotely verified. Public runtimefa6bd5d9:94 tests,504 scoped states and863 source/harness/evidence/export integrity checks. Account runtimeb6d830f2:97 tests,252 account states plus216 affected application states and827 integrity checks. These are separate packages; overlapping earlier runs are not added. Source census retains34 routes/57 preservation groups, not blanket functional or visual acceptance.
Local successora7d72673 contains offer literal-date fix, denser initial dashboard defaults and open discovery rows.101 selected tests, types/full lint/export build and six controlled timezone browser journeys passed; broader dashboard/discovery rendered qualification is active. Final milestone/owner visual review remains OPEN. visual-correction/ROUTE_COVERAGE.json and DISCREPANCIES.md are the current route/discrepancy owners. Earlier active/pending paragraphs below are historical where superseded by these source-bound records.
3 November 2026. Owner explicitly approved **"Approve IM09 and A3-IM10"**. Isolated `codex/a3-ui-10` starts at published/remotely verified receipt `7a9de940dfdc41023f87a1ef38a5fd86a0b8e477`, from implementation `773c943165669bfc97bee46c53f73f124f398c0c`. Earlier A3 milestones are accepted; do not rerun their unaffected evidence or ask again.
- [x] Reconcile baseline and narrowly inspect attachment-size localisation1ce93ca0; cherry-picked only its reviewed delta as31ce70271663a5d57c7b2eb8f80cd69be5cc95ef. No wholesale merge of its older application tree. Fresh63 affected tests passed on this newer baseline; original61-case evidence remains historical.
- [ ] Correct remaining bounded presentation/localisation issues, including technical headline ID in whole-document AI review. Preserve UI vs output language and unchanged proposals during UI-language changes.
- [ ] Reconcile all57 preservation groups and34 inherited routes against current source and accepted evidence; keep PARTIAL/DEFERRED/native/provider qualification honest.
- [ ] Connected EN/NB, themes, phone/tablet/desktop, secondary-route/keyboard/accessibility coverage and combined affected regression. Reuse unchanged accepted evidence, qualify concrete affected changes.
- [ ] Types/lint/build, source/evidence identities, independent review, local commits, phase-branch publication and remote readback.
- [ ] Consolidated A3 acceptance proposal and remaining owner/technical gates. Final integrated security/recovery/release remain separate.
OPEN: granular per-user Ghosted pause lacks a persisted rules contract. Mounted AI entitlement refresh requires investigation that preserves current server authority and form lifetimes; blindly dispatching auth-changed resets authResolved and can unmount drafts. No inferred client-side entitlement grant or weakened auth guard is authorised as a shortcut. Native-language/human/device, real provider/model and hosted/production checks remain separate. The autonomous backlog orchestrator stays paused and untouched.
Initial bounded qualification: headline review caption fixed using the existing EN/NB label; fresh61 studio cases passed, including language-switch preservation. Combined with63 assets/attachments cases,124 distinct cases/three suites.16 controlled AI-review configurations/scans passed with zero writes and synthetic proposals only. Source census passed:57 unchanged preservation groups/34 registered route patterns; historical statuses not promoted. Independent review found no actionable issues. See CROSS_APP_LOCALISATION.md. Broader secondary-route/browser/combined qualification remains OPEN; this is not complete IM10 or a new acceptance request.
Secondary checkpoint7aa54bff1fe376b798922b9da75feafa202dbb76 is published/remotely verified:85 cases/seven suites,16 controlled journeys/96 scoped scans,23 source/100 evidence hashes matched committed bytes. All57 preservation rows reconciled. See SECONDARY_VALIDATION.md and PRESERVATION_RECONCILIATION.md. Initial IM10 checkpointccf8d264 is also published/verified. No complete IM10 acceptance requested.
Active bounded fix (uncommitted): AI privacy Save now invokes an optional refresh callback; App rereads /auth/me and updates only same-owner, validated plan/entitlements without resetting authResolved or dispatching auth-changed. Lifetime/session/sequence guards reject stale completion; general auth refresh invalidates the availability lane. Card distinguishes saved preferences from refresh failure and preserves its mounted draft.39 selected tests/three suites,types/lint/build passed; browser pilot is being corrected to respect existing API identity-mismatch invalidation (session reset, not an inline warning). Targeted malformed-entitlement and same-owner/no-reload journeys must pass before publication. No backend/model/provider changes. Do not discard the active regression/fix files or claim the display gap closed until its actual evidence is qualified.
4 November successor: the owner added global flat visual correction and a whole-application definition of done. These extend approved IM10; earlier functional approvals remain evidence, not visual parity. Shared compact shell/open CV studio/flat continuous Settings sections are implemented. Mounted availability gap now has16 successful controlled journeys/64 scans with node/draft retention, malformed-grant rejection and wrong-identity session reset. CV visual matrix:36 configurations/108 scans/captures across all nine required widths, EN/NB and themes. Failed NB notice/tablet overlap attempts retained and fixed. Types/lint/build/census passed; independent source review found no actionable findings. The full34-route visual review, connected workflows, human/device/native language and final visual approval remain OPEN. See visual-correction/VALIDATION.md and DISCREPANCIES.md. Next eligible work: remaining route review and bounded remediation, beginning six secondary routes. Do not request final IM10 acceptance yet.
## Admin Users alignment checkpoint
10 November 2026. Runtime `dddec043664cd1e65f93469e112c92f4794b8821` passed 12 selected native tests, types, lint, export build and 36 controlled responsive accessibility scans. See [alignment review](visual-correction/ADMIN_USER_ALIGNMENT_REVIEW.md).
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,370 @@
<?xml version="1.0" encoding="utf-8"?>
<TestRun id="11caad6f-ec32-4ed4-a10b-87de5dc755a4" name="Connor@CESNIMDA 2026-11-10 12:47:29" runUser="Cesnimda\Connor" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Times creation="2026-11-10T12:47:29.9872552+01:00" queuing="2026-11-10T12:47:29.9872556+01:00" start="2026-11-10T12:47:28.0999819+01:00" finish="2026-11-10T12:47:36.9433050+01:00" />
<TestSettings name="default" id="e81e2d73-a700-4e1e-b0f3-7d5989555277">
<Deployment runDeploymentRoot="Connor_CESNIMDA_2026-11-10_12_47_29" />
</TestSettings>
<Results>
<UnitTestResult executionId="8de3ce5c-ae2d-40c7-87f0-0ca2308e1211" testId="a7460ecd-2dcf-3c01-9f4f-b564984877a7" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.User_authored_identity_labels_are_bounded_before_admin_projection" computerName="CESNIMDA" duration="00:00:00.1681982" startTime="2026-11-10T12:47:36.6297224+01:00" endTime="2026-11-10T12:47:36.6297226+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="8de3ce5c-ae2d-40c7-87f0-0ca2308e1211" />
<UnitTestResult executionId="67cce8fa-db94-4b94-bee6-a3558ea1cb17" testId="51e53c4c-b20b-ea5e-86f4-a0161dff998c" testName="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_imports_new_messages_for_known_thread_ids" computerName="CESNIMDA" duration="00:00:00.0191831" startTime="2026-11-10T12:47:30.6974563+01:00" endTime="2026-11-10T12:47:30.6974566+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="67cce8fa-db94-4b94-bee6-a3558ea1cb17" />
<UnitTestResult executionId="569b8d36-7dec-4805-8d00-864682547338" testId="74c020c1-6f43-8b47-6887-592371457b96" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Detail_exposes_import_identity_and_links_only_the_administrators_own_application" computerName="CESNIMDA" duration="00:00:00.2398351" startTime="2026-11-10T12:47:35.9620230+01:00" endTime="2026-11-10T12:47:35.9620232+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="569b8d36-7dec-4805-8d00-864682547338" />
<UnitTestResult executionId="4f1e5f93-5307-40e4-b01e-36294d6b8937" testId="eff0c740-5766-74d7-2b54-9a9d370feaf4" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;createdBefore=2026-10-16T00:00:00Z&quot;, expected: 1)" computerName="CESNIMDA" duration="00:00:00.1678106" startTime="2026-11-10T12:47:33.3176886+01:00" endTime="2026-11-10T12:47:33.3176888+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="4f1e5f93-5307-40e4-b01e-36294d6b8937" />
<UnitTestResult executionId="c58e9b03-b7c0-4030-ac46-64380c1a6100" testId="e8ec61a8-3045-28f2-d1c2-1d24f4b43888" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;q=owner%40example.test&quot;, expected: 2)" computerName="CESNIMDA" duration="00:00:00.2198735" startTime="2026-11-10T12:47:32.5001271+01:00" endTime="2026-11-10T12:47:32.5001277+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="c58e9b03-b7c0-4030-ac46-64380c1a6100" />
<UnitTestResult executionId="02ee36b8-42f2-45af-bea8-33838f5d0053" testId="b9e6b511-16dc-188e-b0b4-b3c6d1ea5901" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_reads_share_a_bounded_account_rate_limit" computerName="CESNIMDA" duration="00:00:00.2316325" startTime="2026-11-10T12:47:34.1316319+01:00" endTime="2026-11-10T12:47:34.1316321+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="02ee36b8-42f2-45af-bea8-33838f5d0053" />
<UnitTestResult executionId="44cb9c69-cc2d-4ca5-aeab-e2a47c8660a5" testId="a2bf0443-c430-60c1-dae2-66bd9de14f54" testName="JobTrackerApi.Tests.GmailControllerTests.Import_thread_reports_imported_and_skipped_counts_for_repeat_calls" computerName="CESNIMDA" duration="00:00:00.0161204" startTime="2026-11-10T12:47:30.7461004+01:00" endTime="2026-11-10T12:47:30.7461005+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="44cb9c69-cc2d-4ca5-aeab-e2a47c8660a5" />
<UnitTestResult executionId="fe44079a-21c8-4059-bd5d-a08e886edb97" testId="c178c4c9-46fe-d818-2172-b1790d08f76a" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.User_polling_does_not_expose_another_owners_notifications_or_processing_records" computerName="CESNIMDA" duration="00:00:00.2746237" startTime="2026-11-10T12:47:36.2372676+01:00" endTime="2026-11-10T12:47:36.2372677+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="fe44079a-21c8-4059-bd5d-a08e886edb97" />
<UnitTestResult executionId="1923acd6-7bb6-4e2b-b441-253f7b19e833" testId="c306a523-edb1-3483-b9d9-2894e7823843" testName="JobTrackerApi.Tests.UsersControllerTests.Delete_never_falls_back_to_identity_only_removal" computerName="CESNIMDA" duration="00:00:00.0096987" startTime="2026-11-10T12:47:28.9979080+01:00" endTime="2026-11-10T12:47:28.9979086+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="1923acd6-7bb6-4e2b-b441-253f7b19e833" />
<UnitTestResult executionId="9acc13c4-a745-4222-adaa-71780bf90ef2" testId="f94b62f1-217b-7b58-433f-78fa92c3b291" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;createdFrom=2026-11-01T00:00:00Z&amp;createdBefore=202&quot;···)" computerName="CESNIMDA" duration="00:00:00.1819018" startTime="2026-11-10T12:47:34.8536725+01:00" endTime="2026-11-10T12:47:34.8536727+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="9acc13c4-a745-4222-adaa-71780bf90ef2" />
<UnitTestResult executionId="586294a4-2dcf-454e-a214-568f5d316df4" testId="ee5f8413-131e-d373-5831-cf9def629bf1" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;worker=SECRET&quot;)" computerName="CESNIMDA" duration="00:00:00.1580689" startTime="2026-11-10T12:47:34.4986461+01:00" endTime="2026-11-10T12:47:34.4986463+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="586294a4-2dcf-454e-a214-568f5d316df4" />
<UnitTestResult executionId="b31589fb-25b8-46ff-9954-75c26497f048" testId="47c8243a-256a-9cd2-b778-0c1e655f34b2" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;createdBefore=2000-01-01T00:00:00Z&quot;)" computerName="CESNIMDA" duration="00:00:00.1970828" startTime="2026-11-10T12:47:31.8097143+01:00" endTime="2026-11-10T12:47:31.8097145+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="b31589fb-25b8-46ff-9954-75c26497f048" />
<UnitTestResult executionId="51ee6176-a76e-4491-914a-66d93744d21d" testId="1d05c8f0-b4f5-5979-c2ee-b89fb865b0c0" testName="JobTrackerApi.Tests.UsersControllerTests.Delete_rejects_deleting_the_final_administrator" computerName="CESNIMDA" duration="00:00:00.0016813" startTime="2026-11-10T12:47:30.3722823+01:00" endTime="2026-11-10T12:47:30.3722825+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="51ee6176-a76e-4491-914a-66d93744d21d" />
<UnitTestResult executionId="57b0b378-436f-435b-9af2-dcc426de54d6" testId="1cb270c5-b90d-5d22-75bd-18446f0697ab" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Failure_metadata_uses_the_recorded_failure_instead_of_later_success(status: &quot;waiting_for_retry&quot;)" computerName="CESNIMDA" duration="00:00:00.2498135" startTime="2026-11-10T12:47:30.8692912+01:00" endTime="2026-11-10T12:47:30.8692915+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="57b0b378-436f-435b-9af2-dcc426de54d6" />
<UnitTestResult executionId="5b0b2459-ae49-4722-adba-7bed3c009f01" testId="dd7892ca-83cf-70c9-d495-73e403f920fd" testName="JobTrackerApi.Tests.GmailControllerTests.Unlink_thread_removes_messages_and_sets_review_decision" computerName="CESNIMDA" duration="00:00:00.0337842" startTime="2026-11-10T12:47:30.6782028+01:00" endTime="2026-11-10T12:47:30.6782029+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="5b0b2459-ae49-4722-adba-7bed3c009f01" />
<UnitTestResult executionId="9bfd71e2-9ada-41c2-b07b-ebdb18281912" testId="07351a69-1a47-c2e2-c18a-4769689406b0" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Missing_failure_history_does_not_turn_success_time_into_failure_evidence" computerName="CESNIMDA" duration="00:00:00.2125900" startTime="2026-11-10T12:47:31.0834719+01:00" endTime="2026-11-10T12:47:31.0834722+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="9bfd71e2-9ada-41c2-b07b-ebdb18281912" />
<UnitTestResult executionId="2a2087db-8295-43cb-900e-c73d607c2cd5" testId="4bd6fee0-c227-757a-f276-68c01ee512d8" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;jobId=9999&quot;)" computerName="CESNIMDA" duration="00:00:00.2025462" startTime="2026-11-10T12:47:31.6121865+01:00" endTime="2026-11-10T12:47:31.6121868+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="2a2087db-8295-43cb-900e-c73d607c2cd5" />
<UnitTestResult executionId="fb41f0a4-f4e8-4543-9e72-04ce1aca543f" testId="dea07b3b-d253-0f24-49a5-19cddbb41e3d" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;jobId=-1&quot;)" computerName="CESNIMDA" duration="00:00:00.1558864" startTime="2026-11-10T12:47:35.1802603+01:00" endTime="2026-11-10T12:47:35.1802605+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="fb41f0a4-f4e8-4543-9e72-04ce1aca543f" />
<UnitTestResult executionId="b45a53e8-d0b5-43ce-bb63-6dcc7961abc9" testId="cc37b055-0622-5c79-604c-d07a5ef838f8" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;failureCode=timeout&quot;, expected: 1)" computerName="CESNIMDA" duration="00:00:00.2221399" startTime="2026-11-10T12:47:32.7227430+01:00" endTime="2026-11-10T12:47:32.7227432+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="b45a53e8-d0b5-43ce-bb63-6dcc7961abc9" />
<UnitTestResult executionId="63298b21-917e-4441-8dbd-8ae184722f45" testId="4df79739-2bb8-0135-a6f0-f166c5e9b5d1" testName="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_rejects_invalid_job_id" computerName="CESNIMDA" duration="00:00:00.0043986" startTime="2026-11-10T12:47:30.2755904+01:00" endTime="2026-11-10T12:47:30.2755907+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="63298b21-917e-4441-8dbd-8ae184722f45" />
<UnitTestResult executionId="c156852e-c30c-4bb3-8da6-18d6c877d646" testId="b026190f-186e-bc0e-53fe-ab0dd77e657f" testName="JobTrackerApi.Tests.GmailControllerTests.Manual_sync_auto_links_high_confidence_thread" computerName="CESNIMDA" duration="00:00:01.2753806" startTime="2026-11-10T12:47:30.1357307+01:00" endTime="2026-11-10T12:47:30.1357308+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="c156852e-c30c-4bb3-8da6-18d6c877d646" />
<UnitTestResult executionId="5140df60-ba05-428f-9f9c-1b88860f5fb6" testId="6e346171-7903-22b0-1ca1-205bad580edd" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;failureCode=SECRET&quot;)" computerName="CESNIMDA" duration="00:00:00.1693614" startTime="2026-11-10T12:47:35.0240143+01:00" endTime="2026-11-10T12:47:35.0240144+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="5140df60-ba05-428f-9f9c-1b88860f5fb6" />
<UnitTestResult executionId="48111a9b-1758-41fa-aa3a-5616a0f873ff" testId="1942bf4b-fda0-7b4a-34e9-25989c8770bd" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;q=Owned%20job%20title&quot;, expected: 1)" computerName="CESNIMDA" duration="00:00:00.1988022" startTime="2026-11-10T12:47:33.1493651+01:00" endTime="2026-11-10T12:47:33.1493653+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="48111a9b-1758-41fa-aa3a-5616a0f873ff" />
<UnitTestResult executionId="e1974ad5-bd96-4ede-83c9-f723b93a9f9c" testId="60b6bfd7-91ef-c23f-ffe4-217e3ea1388b" testName="JobTrackerApi.Tests.UsersControllerTests.List_marks_the_current_user_and_last_admin_safety_state" computerName="CESNIMDA" duration="00:00:00.1258170" startTime="2026-11-10T12:47:28.9886728+01:00" endTime="2026-11-10T12:47:28.9886861+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="e1974ad5-bd96-4ede-83c9-f723b93a9f9c" />
<UnitTestResult executionId="489e9d00-dd04-46cc-bbf0-f48133d55f67" testId="2955f7f4-3358-54dc-4c34-6196d3f41ffd" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Audit_log_keeps_mail_subjects_in_the_owner_record" computerName="CESNIMDA" duration="00:00:00.2234018" startTime="2026-11-10T12:47:36.4610583+01:00" endTime="2026-11-10T12:47:36.4610585+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="489e9d00-dd04-46cc-bbf0-f48133d55f67" />
<UnitTestResult executionId="c92891b2-33a3-4ad8-b414-ac5e8d88a4dc" testId="e371116d-e426-f109-65b7-9aacdf55f26c" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;q=SECRET_CV_CONTENT&quot;)" computerName="CESNIMDA" duration="00:00:00.3247592" startTime="2026-11-10T12:47:31.4091400+01:00" endTime="2026-11-10T12:47:31.4091402+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="c92891b2-33a3-4ad8-b414-ac5e8d88a4dc" />
<UnitTestResult executionId="1a485063-bc01-4bdd-8154-b9146eefb376" testId="57cc6d4c-b4ef-dbe0-fda3-1b6d1aca9b14" testName="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_rejects_invalid_job_id" computerName="CESNIMDA" duration="00:00:00.0031292" startTime="2026-11-10T12:47:30.3968141+01:00" endTime="2026-11-10T12:47:30.3968143+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="1a485063-bc01-4bdd-8154-b9146eefb376" />
<UnitTestResult executionId="93239259-7f61-45f0-aca1-01b886f8d0e3" testId="be04bf9f-c1f4-b71c-97dd-e2120c2888d9" testName="JobTrackerApi.Tests.GmailControllerTests.Unlink_thread_cannot_remove_another_users_messages" computerName="CESNIMDA" duration="00:00:00.0186862" startTime="2026-11-10T12:47:30.6416471+01:00" endTime="2026-11-10T12:47:30.6416473+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="93239259-7f61-45f0-aca1-01b886f8d0e3" />
<UnitTestResult executionId="a6c3862e-4d71-4cf7-a103-d8eb571799e3" testId="e036d814-b11e-3427-2124-d9513e6d8707" testName="JobTrackerApi.Tests.GmailControllerTests.Import_thread_rejects_missing_message_ids" computerName="CESNIMDA" duration="00:00:00.0025779" startTime="2026-11-10T12:47:30.6442962+01:00" endTime="2026-11-10T12:47:30.6442963+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="a6c3862e-4d71-4cf7-a103-d8eb571799e3" />
<UnitTestResult executionId="b589694d-77be-4a08-9d5e-5b3ccd4279c8" testId="c6411e65-2573-9b0a-b091-546a25c749e9" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_routes_require_the_server_administrator_role(identity: null, expected: Unauthorized)" computerName="CESNIMDA" duration="00:00:00.1565765" startTime="2026-11-10T12:47:35.3375191+01:00" endTime="2026-11-10T12:47:35.3375193+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="b589694d-77be-4a08-9d5e-5b3ccd4279c8" />
<UnitTestResult executionId="fb5c6fff-c754-4894-b0b5-9b0030de4e51" testId="ba5e704b-ca66-a258-1f80-cf0cc45d1215" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Event_cursor_is_exact_ordered_bounded_retained_and_redacted" computerName="CESNIMDA" duration="00:00:00.2075150" startTime="2026-11-10T12:47:34.3396155+01:00" endTime="2026-11-10T12:47:34.3396156+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="fb5c6fff-c754-4894-b0b5-9b0030de4e51" />
<UnitTestResult executionId="02343c11-b8bd-4b7b-ae7e-3e24697f7fec" testId="c290d6c2-2e12-8508-613f-1faef3e1e045" testName="JobTrackerApi.Tests.UsersControllerTests.List_uses_a_fixed_number_of_role_queries_for_many_users" computerName="CESNIMDA" duration="00:00:01.1848870" startTime="2026-11-10T12:47:30.1892412+01:00" endTime="2026-11-10T12:47:30.1892420+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="02343c11-b8bd-4b7b-ae7e-3e24697f7fec" />
<UnitTestResult executionId="ed1b3139-e25e-45e7-b246-f70bc26c4742" testId="925a248b-9a4e-193d-bb27-e3e23b1e39da" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;worker=document&quot;, expected: 1)" computerName="CESNIMDA" duration="00:00:00.2133301" startTime="2026-11-10T12:47:33.5314250+01:00" endTime="2026-11-10T12:47:33.5314252+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="ed1b3139-e25e-45e7-b246-f70bc26c4742" />
<UnitTestResult executionId="129053f7-1e66-482d-9ebb-2ba7ea5c2d05" testId="a55b51f5-22e2-c043-4279-8e10e60d7349" testName="JobTrackerApi.Tests.UsersControllerTests.SetRoles_revokes_existing_sessions_and_trusted_devices_when_roles_change" computerName="CESNIMDA" duration="00:00:00.1789071" startTime="2026-11-10T12:47:30.3704042+01:00" endTime="2026-11-10T12:47:30.3704043+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="129053f7-1e66-482d-9ebb-2ba7ea5c2d05" />
<UnitTestResult executionId="444fa49b-1e57-465f-a75a-fc07ae20d121" testId="9e5fc91d-b61e-dcc6-8ae5-726b071fb87e" testName="JobTrackerApi.Tests.GmailControllerTests.Import_returns_message_metadata_and_skips_repeat_message_imports" computerName="CESNIMDA" duration="00:00:00.1352545" startTime="2026-11-10T12:47:30.2711571+01:00" endTime="2026-11-10T12:47:30.2711581+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="444fa49b-1e57-465f-a75a-fc07ae20d121" />
<UnitTestResult executionId="1daa57b9-13a5-431c-82b9-269920b50bd2" testId="51ac4bbe-d7e5-71bc-246b-d1e99716f584" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;createdFrom=0001-01-01T00:00:00Z&quot;)" computerName="CESNIMDA" duration="00:00:00.1720494" startTime="2026-11-10T12:47:34.6712334+01:00" endTime="2026-11-10T12:47:34.6712337+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="1daa57b9-13a5-431c-82b9-269920b50bd2" />
<UnitTestResult executionId="b43447db-5dab-4ff5-8630-6d73543579cf" testId="a059c7b2-6e33-c9af-2afc-cd2dc65439f2" testName="JobTrackerApi.Tests.GmailControllerTests.Review_candidates_returns_threads_grouped_with_routing_summary" computerName="CESNIMDA" duration="00:00:00.0316115" startTime="2026-11-10T12:47:30.4285329+01:00" endTime="2026-11-10T12:47:30.4285332+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="b43447db-5dab-4ff5-8630-6d73543579cf" />
<UnitTestResult executionId="d694a9b9-4d2c-45ac-a01a-3188ac6cdeed" testId="d45d0798-7cfc-42f9-8819-a57a7edb9394" testName="JobTrackerApi.Tests.GmailControllerTests.Relink_thread_can_move_messages_from_other_jobs" computerName="CESNIMDA" duration="00:00:00.0617110" startTime="2026-11-10T12:47:30.5842680+01:00" endTime="2026-11-10T12:47:30.5842683+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="d694a9b9-4d2c-45ac-a01a-3188ac6cdeed" />
<UnitTestResult executionId="e34a7d2b-0770-40c9-a907-1176a7087708" testId="ee844046-726f-42f3-8975-8f9490d048fd" testName="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_reports_empty_and_disconnected_states" computerName="CESNIMDA" duration="00:00:00.0323731" startTime="2026-11-10T12:47:30.7299060+01:00" endTime="2026-11-10T12:47:30.7299061+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="e34a7d2b-0770-40c9-a907-1176a7087708" />
<UnitTestResult executionId="5a1c876e-8ff1-4639-ba28-c1ecd0f77cb4" testId="66fa9d2a-f717-592b-cce5-3f62affb59c8" testName="JobTrackerApi.Tests.GmailControllerTests.Save_review_decision_links_thread_and_imports_messages" computerName="CESNIMDA" duration="00:00:00.0695617" startTime="2026-11-10T12:47:30.5224364+01:00" endTime="2026-11-10T12:47:30.5224373+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="5a1c876e-8ff1-4639-ba28-c1ecd0f77cb4" />
<UnitTestResult executionId="cf1ada70-99ee-4f7f-8f70-63b60be1c7c8" testId="675f74a4-4cf4-d06d-d9d1-16f61fb606c0" testName="JobTrackerApi.Tests.GmailControllerTests.Suggested_jobs_and_create_suggested_job_create_job_and_link_thread" computerName="CESNIMDA" duration="00:00:00.1158230" startTime="2026-11-10T12:47:30.3914866+01:00" endTime="2026-11-10T12:47:30.3914869+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="cf1ada70-99ee-4f7f-8f70-63b60be1c7c8" />
<UnitTestResult executionId="51625678-7908-4524-8374-954f8161d146" testId="4d32ba02-105a-512c-8d73-cbe2ab1e1f04" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;worker=untracked&quot;)" computerName="CESNIMDA" duration="00:00:00.2049924" startTime="2026-11-10T12:47:32.0150643+01:00" endTime="2026-11-10T12:47:32.0150648+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="51625678-7908-4524-8374-954f8161d146" />
<UnitTestResult executionId="69e7d020-d39f-4f3e-9d9d-47c1418ac059" testId="5b993a1e-f2f6-86d5-406c-6a46db6e0332" testName="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_respects_owned_job_scope" computerName="CESNIMDA" duration="00:00:00.0015896" startTime="2026-11-10T12:47:30.7502283+01:00" endTime="2026-11-10T12:47:30.7502285+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="69e7d020-d39f-4f3e-9d9d-47c1418ac059" />
<UnitTestResult executionId="3fd18c4b-2df1-4070-972e-f5e4098f15e1" testId="aa87bb5b-2b89-868b-47a2-39dc87ec48cf" testName="JobTrackerApi.Tests.UsersControllerTests.SetRoles_rejects_removing_the_final_administrator" computerName="CESNIMDA" duration="00:00:00.0022426" startTime="2026-11-10T12:47:30.1914478+01:00" endTime="2026-11-10T12:47:30.1914478+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="3fd18c4b-2df1-4070-972e-f5e4098f15e1" />
<UnitTestResult executionId="2af791ed-e6c6-47d6-aa2c-ef78f5986b77" testId="44ff09f3-f13f-afad-c8bf-307264ed7dc8" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;worker=ai&quot;, expected: 2)" computerName="CESNIMDA" duration="00:00:00.1733522" startTime="2026-11-10T12:47:33.7051654+01:00" endTime="2026-11-10T12:47:33.7051656+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="2af791ed-e6c6-47d6-aa2c-ef78f5986b77" />
<UnitTestResult executionId="3ff86ef7-d491-417a-8694-53a79fc65e90" testId="0fbe1328-6f9f-13f7-50c5-20e6569e290d" testName="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_returns_empty_threads_when_gmail_has_no_matches" computerName="CESNIMDA" duration="00:00:00.0023762" startTime="2026-11-10T12:47:30.7485703+01:00" endTime="2026-11-10T12:47:30.7485704+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="3ff86ef7-d491-417a-8694-53a79fc65e90" />
<UnitTestResult executionId="4116a14a-1e10-4665-bb47-3b4578391ca1" testId="2522538b-2fec-c9fb-5377-f146f2da0ba0" testName="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_respects_owned_job_scope" computerName="CESNIMDA" duration="00:00:00.0240802" startTime="2026-11-10T12:47:30.4527166+01:00" endTime="2026-11-10T12:47:30.4527176+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="4116a14a-1e10-4665-bb47-3b4578391ca1" />
<UnitTestResult executionId="ed7b6f01-0078-419e-9cdd-225d62fd1c63" testId="812d5d43-7e52-ce08-7556-5a43f9ffdac0" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;createdFrom=2099-01-01T00:00:00Z&quot;)" computerName="CESNIMDA" duration="00:00:00.2641083" startTime="2026-11-10T12:47:32.2795573+01:00" endTime="2026-11-10T12:47:32.2795575+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="ed7b6f01-0078-419e-9cdd-225d62fd1c63" />
<UnitTestResult executionId="650b30eb-6ee8-4aa9-b679-459f376d9aa9" testId="624e5fd3-404d-bdf0-8372-cf7f2664fb3a" testName="JobTrackerApi.Tests.GmailControllerTests.Status_returns_sync_state_fields_for_connected_account" computerName="CESNIMDA" duration="00:00:00.0019830" startTime="2026-11-10T12:47:30.3935881+01:00" endTime="2026-11-10T12:47:30.3935882+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="650b30eb-6ee8-4aa9-b679-459f376d9aa9" />
<UnitTestResult executionId="e9e94364-518e-48da-85bb-2293ceb97541" testId="3703cdc9-1200-4a8e-e91b-e5b255b6349a" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;failureCode=processing_failed&quot;, expected: 1)" computerName="CESNIMDA" duration="00:00:00.2268643" startTime="2026-11-10T12:47:32.9501256+01:00" endTime="2026-11-10T12:47:32.9501259+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="e9e94364-518e-48da-85bb-2293ceb97541" />
<UnitTestResult executionId="c4e4891f-08ea-4f2e-a93c-ffc4b9fcb6bc" testId="a3b89ebc-353f-38b3-04d4-bd41ea0c21b8" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_routes_require_the_server_administrator_role(identity: &quot;ordinary&quot;, expected: Forbidden)" computerName="CESNIMDA" duration="00:00:00.1689039" startTime="2026-11-10T12:47:35.5069263+01:00" endTime="2026-11-10T12:47:35.5069265+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="c4e4891f-08ea-4f2e-a93c-ffc4b9fcb6bc" />
<UnitTestResult executionId="84f2372c-e3d3-49a0-9525-988cff0518ae" testId="49384e74-fc74-cc87-a819-9b1ba4a72e05" testName="JobTrackerApi.Tests.UsersControllerTests.SetRoles_allows_a_confirmed_self_demotion_when_another_admin_exists" computerName="CESNIMDA" duration="00:00:00.0062001" startTime="2026-11-10T12:47:29.0041804+01:00" endTime="2026-11-10T12:47:29.0041808+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="84f2372c-e3d3-49a0-9525-988cff0518ae" />
<UnitTestResult executionId="f353e41d-025b-4788-a433-1b61c95b8ff3" testId="70049eab-88eb-4514-024e-9b688c008eef" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Failure_metadata_uses_the_recorded_failure_instead_of_later_success(status: &quot;succeeded&quot;)" computerName="CESNIMDA" duration="00:00:01.7558250" startTime="2026-11-10T12:47:30.6186160+01:00" endTime="2026-11-10T12:47:30.6186162+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="f353e41d-025b-4788-a433-1b61c95b8ff3" />
<UnitTestResult executionId="03f46179-7da8-4564-a927-48e7505826f9" testId="2d9c9c47-2244-30b1-60dd-7a6c72fc4a26" testName="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_returns_ranked_threads_with_match_reasons_query_hits_and_import_flags" computerName="CESNIMDA" duration="00:00:00.0385743" startTime="2026-11-10T12:47:30.6229947+01:00" endTime="2026-11-10T12:47:30.6229954+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="03f46179-7da8-4564-a927-48e7505826f9" />
<UnitTestResult executionId="d4e22fc5-2fc8-4f02-9264-6f9c79a432f0" testId="5e6c8ff2-b0d7-8172-d7f7-7a4377ce492f" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_routes_require_the_server_administrator_role(identity: &quot;admin&quot;, expected: OK)" computerName="CESNIMDA" duration="00:00:00.2137631" startTime="2026-11-10T12:47:35.7213832+01:00" endTime="2026-11-10T12:47:35.7213838+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="d4e22fc5-2fc8-4f02-9264-6f9c79a432f0" />
<UnitTestResult executionId="e5597443-5941-4c01-ad96-35c961505a1f" testId="84f7e997-d635-149a-68bc-b02e9fcddd2d" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;jobId=2&quot;, expected: 1)" computerName="CESNIMDA" duration="00:00:00.1938259" startTime="2026-11-10T12:47:33.8995220+01:00" endTime="2026-11-10T12:47:33.8995223+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="e5597443-5941-4c01-ad96-35c961505a1f" />
<UnitTestResult executionId="fb6987a4-99b8-41e6-8633-512c52dab9bb" testId="369cf2cd-6a6b-3b6b-6836-0b22e26fda39" testName="JobTrackerApi.Tests.AdminProcessingControllerTests.Admin_projection_filters_owners_and_never_returns_raw_processing_contents_or_lease_data" computerName="CESNIMDA" duration="00:00:00.2376063" startTime="2026-11-10T12:47:36.8677176+01:00" endTime="2026-11-10T12:47:36.8677178+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="fb6987a4-99b8-41e6-8633-512c52dab9bb" />
</Results>
<TestDefinitions>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Detail_exposes_import_identity_and_links_only_the_administrators_own_application" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="74c020c1-6f43-8b47-6887-592371457b96">
<Execution id="569b8d36-7dec-4805-8d00-864682547338" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Detail_exposes_import_identity_and_links_only_the_administrators_own_application" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_routes_require_the_server_administrator_role(identity: &quot;admin&quot;, expected: OK)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="5e6c8ff2-b0d7-8172-d7f7-7a4377ce492f">
<Execution id="d4e22fc5-2fc8-4f02-9264-6f9c79a432f0" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Processing_routes_require_the_server_administrator_role" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Manual_sync_auto_links_high_confidence_thread" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="b026190f-186e-bc0e-53fe-ab0dd77e657f">
<Execution id="c156852e-c30c-4bb3-8da6-18d6c877d646" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Manual_sync_auto_links_high_confidence_thread" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Missing_failure_history_does_not_turn_success_time_into_failure_evidence" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="07351a69-1a47-c2e2-c18a-4769689406b0">
<Execution id="9bfd71e2-9ada-41c2-b07b-ebdb18281912" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Missing_failure_history_does_not_turn_success_time_into_failure_evidence" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_returns_empty_threads_when_gmail_has_no_matches" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="0fbe1328-6f9f-13f7-50c5-20e6569e290d">
<Execution id="3ff86ef7-d491-417a-8694-53a79fc65e90" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Job_candidates_returns_empty_threads_when_gmail_has_no_matches" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_reads_share_a_bounded_account_rate_limit" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="b9e6b511-16dc-188e-b0b4-b3c6d1ea5901">
<Execution id="02ee36b8-42f2-45af-bea8-33838f5d0053" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Processing_reads_share_a_bounded_account_rate_limit" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_rejects_invalid_job_id" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="4df79739-2bb8-0135-a6f0-f166c5e9b5d1">
<Execution id="63298b21-917e-4441-8dbd-8ae184722f45" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Job_candidates_rejects_invalid_job_id" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;jobId=2&quot;, expected: 1)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="84f7e997-d635-149a-68bc-b02e9fcddd2d">
<Execution id="e5597443-5941-4c01-ad96-35c961505a1f" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.List_marks_the_current_user_and_last_admin_safety_state" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="60b6bfd7-91ef-c23f-ffe4-217e3ea1388b">
<Execution id="e1974ad5-bd96-4ede-83c9-f723b93a9f9c" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="List_marks_the_current_user_and_last_admin_safety_state" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Review_candidates_returns_threads_grouped_with_routing_summary" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="a059c7b2-6e33-c9af-2afc-cd2dc65439f2">
<Execution id="b43447db-5dab-4ff5-8630-6d73543579cf" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Review_candidates_returns_threads_grouped_with_routing_summary" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.User_polling_does_not_expose_another_owners_notifications_or_processing_records" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="c178c4c9-46fe-d818-2172-b1790d08f76a">
<Execution id="fe44079a-21c8-4059-bd5d-a08e886edb97" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="User_polling_does_not_expose_another_owners_notifications_or_processing_records" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Admin_projection_filters_owners_and_never_returns_raw_processing_contents_or_lease_data" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="369cf2cd-6a6b-3b6b-6836-0b22e26fda39">
<Execution id="fb6987a4-99b8-41e6-8633-512c52dab9bb" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Admin_projection_filters_owners_and_never_returns_raw_processing_contents_or_lease_data" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;worker=SECRET&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="ee5f8413-131e-d373-5831-cf9def629bf1">
<Execution id="586294a4-2dcf-454e-a214-568f5d316df4" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Invalid_diagnostic_filters_fail_closed" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;createdBefore=2000-01-01T00:00:00Z&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="47c8243a-256a-9cd2-b778-0c1e655f34b2">
<Execution id="b31589fb-25b8-46ff-9954-75c26497f048" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_are_applied_before_pagination" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;createdFrom=2026-11-01T00:00:00Z&amp;createdBefore=202&quot;···)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="f94b62f1-217b-7b58-433f-78fa92c3b291">
<Execution id="9acc13c4-a745-4222-adaa-71780bf90ef2" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Invalid_diagnostic_filters_fail_closed" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Save_review_decision_links_thread_and_imports_messages" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="66fa9d2a-f717-592b-cce5-3f62affb59c8">
<Execution id="5a1c876e-8ff1-4639-ba28-c1ecd0f77cb4" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Save_review_decision_links_thread_and_imports_messages" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_routes_require_the_server_administrator_role(identity: null, expected: Unauthorized)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="c6411e65-2573-9b0a-b091-546a25c749e9">
<Execution id="b589694d-77be-4a08-9d5e-5b3ccd4279c8" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Processing_routes_require_the_server_administrator_role" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;jobId=9999&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="4bd6fee0-c227-757a-f276-68c01ee512d8">
<Execution id="2a2087db-8295-43cb-900e-c73d607c2cd5" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_are_applied_before_pagination" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;worker=ai&quot;, expected: 2)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="44ff09f3-f13f-afad-c8bf-307264ed7dc8">
<Execution id="2af791ed-e6c6-47d6-aa2c-ef78f5986b77" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Event_cursor_is_exact_ordered_bounded_retained_and_redacted" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="ba5e704b-ca66-a258-1f80-cf0cc45d1215">
<Execution id="fb5c6fff-c754-4894-b0b5-9b0030de4e51" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Event_cursor_is_exact_ordered_bounded_retained_and_redacted" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;createdBefore=2026-10-16T00:00:00Z&quot;, expected: 1)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="eff0c740-5766-74d7-2b54-9a9d370feaf4">
<Execution id="4f1e5f93-5307-40e4-b01e-36294d6b8937" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_respects_owned_job_scope" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="2522538b-2fec-c9fb-5377-f146f2da0ba0">
<Execution id="4116a14a-1e10-4665-bb47-3b4578391ca1" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Job_candidates_respects_owned_job_scope" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_reports_empty_and_disconnected_states" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="ee844046-726f-42f3-8975-8f9490d048fd">
<Execution id="e34a7d2b-0770-40c9-a907-1176a7087708" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Refresh_linked_threads_reports_empty_and_disconnected_states" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Processing_routes_require_the_server_administrator_role(identity: &quot;ordinary&quot;, expected: Forbidden)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="a3b89ebc-353f-38b3-04d4-bd41ea0c21b8">
<Execution id="c4e4891f-08ea-4f2e-a93c-ffc4b9fcb6bc" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Processing_routes_require_the_server_administrator_role" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.List_uses_a_fixed_number_of_role_queries_for_many_users" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="c290d6c2-2e12-8508-613f-1faef3e1e045">
<Execution id="02343c11-b8bd-4b7b-ae7e-3e24697f7fec" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="List_uses_a_fixed_number_of_role_queries_for_many_users" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;createdFrom=2099-01-01T00:00:00Z&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="812d5d43-7e52-ce08-7556-5a43f9ffdac0">
<Execution id="ed7b6f01-0078-419e-9cdd-225d62fd1c63" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_are_applied_before_pagination" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.SetRoles_revokes_existing_sessions_and_trusted_devices_when_roles_change" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="a55b51f5-22e2-c043-4279-8e10e60d7349">
<Execution id="129053f7-1e66-482d-9ebb-2ba7ea5c2d05" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="SetRoles_revokes_existing_sessions_and_trusted_devices_when_roles_change" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;createdFrom=0001-01-01T00:00:00Z&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="51ac4bbe-d7e5-71bc-246b-d1e99716f584">
<Execution id="1daa57b9-13a5-431c-82b9-269920b50bd2" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Invalid_diagnostic_filters_fail_closed" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Job_candidates_returns_ranked_threads_with_match_reasons_query_hits_and_import_flags" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="2d9c9c47-2244-30b1-60dd-7a6c72fc4a26">
<Execution id="03f46179-7da8-4564-a927-48e7505826f9" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Job_candidates_returns_ranked_threads_with_match_reasons_query_hits_and_import_flags" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Import_returns_message_metadata_and_skips_repeat_message_imports" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="9e5fc91d-b61e-dcc6-8ae5-726b071fb87e">
<Execution id="444fa49b-1e57-465f-a75a-fc07ae20d121" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Import_returns_message_metadata_and_skips_repeat_message_imports" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Status_returns_sync_state_fields_for_connected_account" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="624e5fd3-404d-bdf0-8372-cf7f2664fb3a">
<Execution id="650b30eb-6ee8-4aa9-b679-459f376d9aa9" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Status_returns_sync_state_fields_for_connected_account" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.Delete_never_falls_back_to_identity_only_removal" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="c306a523-edb1-3483-b9d9-2894e7823843">
<Execution id="1923acd6-7bb6-4e2b-b441-253f7b19e833" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="Delete_never_falls_back_to_identity_only_removal" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Failure_metadata_uses_the_recorded_failure_instead_of_later_success(status: &quot;succeeded&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="70049eab-88eb-4514-024e-9b688c008eef">
<Execution id="f353e41d-025b-4788-a433-1b61c95b8ff3" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Failure_metadata_uses_the_recorded_failure_instead_of_later_success" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Unlink_thread_cannot_remove_another_users_messages" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="be04bf9f-c1f4-b71c-97dd-e2120c2888d9">
<Execution id="93239259-7f61-45f0-aca1-01b886f8d0e3" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Unlink_thread_cannot_remove_another_users_messages" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_imports_new_messages_for_known_thread_ids" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="51e53c4c-b20b-ea5e-86f4-a0161dff998c">
<Execution id="67cce8fa-db94-4b94-bee6-a3558ea1cb17" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Refresh_linked_threads_imports_new_messages_for_known_thread_ids" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;q=Owned%20job%20title&quot;, expected: 1)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="1942bf4b-fda0-7b4a-34e9-25989c8770bd">
<Execution id="48111a9b-1758-41fa-aa3a-5616a0f873ff" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Audit_log_keeps_mail_subjects_in_the_owner_record" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="2955f7f4-3358-54dc-4c34-6196d3f41ffd">
<Execution id="489e9d00-dd04-46cc-bbf0-f48133d55f67" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Audit_log_keeps_mail_subjects_in_the_owner_record" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;failureCode=processing_failed&quot;, expected: 1)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="3703cdc9-1200-4a8e-e91b-e5b255b6349a">
<Execution id="e9e94364-518e-48da-85bb-2293ceb97541" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Failure_metadata_uses_the_recorded_failure_instead_of_later_success(status: &quot;waiting_for_retry&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="1cb270c5-b90d-5d22-75bd-18446f0697ab">
<Execution id="57b0b378-436f-435b-9af2-dcc426de54d6" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Failure_metadata_uses_the_recorded_failure_instead_of_later_success" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.Delete_rejects_deleting_the_final_administrator" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="1d05c8f0-b4f5-5979-c2ee-b89fb865b0c0">
<Execution id="51ee6176-a76e-4491-914a-66d93744d21d" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="Delete_rejects_deleting_the_final_administrator" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;jobId=-1&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="dea07b3b-d253-0f24-49a5-19cddbb41e3d">
<Execution id="fb41f0a4-f4e8-4543-9e72-04ce1aca543f" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Invalid_diagnostic_filters_fail_closed" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Suggested_jobs_and_create_suggested_job_create_job_and_link_thread" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="675f74a4-4cf4-d06d-d9d1-16f61fb606c0">
<Execution id="cf1ada70-99ee-4f7f-8f70-63b60be1c7c8" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Suggested_jobs_and_create_suggested_job_create_job_and_link_thread" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;q=SECRET_CV_CONTENT&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="e371116d-e426-f109-65b7-9aacdf55f26c">
<Execution id="c92891b2-33a3-4ad8-b414-ac5e8d88a4dc" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_are_applied_before_pagination" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;failureCode=timeout&quot;, expected: 1)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="cc37b055-0622-5c79-604c-d07a5ef838f8">
<Execution id="b45a53e8-d0b5-43ce-bb63-6dcc7961abc9" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;q=owner%40example.test&quot;, expected: 2)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="e8ec61a8-3045-28f2-d1c2-1d24f4b43888">
<Execution id="c58e9b03-b7c0-4030-ac46-64380c1a6100" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.User_authored_identity_labels_are_bounded_before_admin_projection" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="a7460ecd-2dcf-3c01-9f4f-b564984877a7">
<Execution id="8de3ce5c-ae2d-40c7-87f0-0ca2308e1211" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="User_authored_identity_labels_are_bounded_before_admin_projection" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_preserve_actual_owner_relationships(query: &quot;worker=document&quot;, expected: 1)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="925a248b-9a4e-193d-bb27-e3e23b1e39da">
<Execution id="ed1b3139-e25e-45e7-b246-f70bc26c4742" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_preserve_actual_owner_relationships" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Diagnostic_filters_are_applied_before_pagination(query: &quot;worker=untracked&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="4d32ba02-105a-512c-8d73-cbe2ab1e1f04">
<Execution id="51625678-7908-4524-8374-954f8161d146" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Diagnostic_filters_are_applied_before_pagination" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Unlink_thread_removes_messages_and_sets_review_decision" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="dd7892ca-83cf-70c9-d495-73e403f920fd">
<Execution id="5b0b2459-ae49-4722-adba-7bed3c009f01" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Unlink_thread_removes_messages_and_sets_review_decision" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Import_thread_reports_imported_and_skipped_counts_for_repeat_calls" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="a2bf0443-c430-60c1-dae2-66bd9de14f54">
<Execution id="44cb9c69-cc2d-4ca5-aeab-e2a47c8660a5" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Import_thread_reports_imported_and_skipped_counts_for_repeat_calls" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_rejects_invalid_job_id" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="57cc6d4c-b4ef-dbe0-fda3-1b6d1aca9b14">
<Execution id="1a485063-bc01-4bdd-8154-b9146eefb376" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Refresh_linked_threads_rejects_invalid_job_id" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.SetRoles_rejects_removing_the_final_administrator" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="aa87bb5b-2b89-868b-47a2-39dc87ec48cf">
<Execution id="3fd18c4b-2df1-4070-972e-f5e4098f15e1" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="SetRoles_rejects_removing_the_final_administrator" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Import_thread_rejects_missing_message_ids" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="e036d814-b11e-3427-2124-d9513e6d8707">
<Execution id="a6c3862e-4d71-4cf7-a103-d8eb571799e3" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Import_thread_rejects_missing_message_ids" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Relink_thread_can_move_messages_from_other_jobs" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="d45d0798-7cfc-42f9-8819-a57a7edb9394">
<Execution id="d694a9b9-4d2c-45ac-a01a-3188ac6cdeed" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Relink_thread_can_move_messages_from_other_jobs" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.AdminProcessingControllerTests.Invalid_diagnostic_filters_fail_closed(query: &quot;failureCode=SECRET&quot;)" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="6e346171-7903-22b0-1ca1-205bad580edd">
<Execution id="5140df60-ba05-428f-9f9c-1b88860f5fb6" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.AdminProcessingControllerTests" name="Invalid_diagnostic_filters_fail_closed" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.GmailControllerTests.Refresh_linked_threads_respects_owned_job_scope" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="5b993a1e-f2f6-86d5-406c-6a46db6e0332">
<Execution id="69e7d020-d39f-4f3e-9d9d-47c1418ac059" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.GmailControllerTests" name="Refresh_linked_threads_respects_owned_job_scope" />
</UnitTest>
<UnitTest name="JobTrackerApi.Tests.UsersControllerTests.SetRoles_allows_a_confirmed_self_demotion_when_another_admin_exists" storage="c:\users\connor\.codex\worktrees\direct-roadmap-integration\job tracker\jobtrackerapi.tests\bin\release\net9.0\jobtrackerapi.tests.dll" id="49384e74-fc74-cc87-a819-9b1ba4a72e05">
<Execution id="84f2372c-e3d3-49a0-9525-988cff0518ae" />
<TestMethod codeBase="C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\JobTrackerApi.Tests\bin\Release\net9.0\JobTrackerApi.Tests.dll" adapterTypeName="executor://xunit/VsTestRunner2/netcoreapp" className="JobTrackerApi.Tests.UsersControllerTests" name="SetRoles_allows_a_confirmed_self_demotion_when_another_admin_exists" />
</UnitTest>
</TestDefinitions>
<TestEntries>
<TestEntry testId="a7460ecd-2dcf-3c01-9f4f-b564984877a7" executionId="8de3ce5c-ae2d-40c7-87f0-0ca2308e1211" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="51e53c4c-b20b-ea5e-86f4-a0161dff998c" executionId="67cce8fa-db94-4b94-bee6-a3558ea1cb17" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="74c020c1-6f43-8b47-6887-592371457b96" executionId="569b8d36-7dec-4805-8d00-864682547338" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="eff0c740-5766-74d7-2b54-9a9d370feaf4" executionId="4f1e5f93-5307-40e4-b01e-36294d6b8937" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="e8ec61a8-3045-28f2-d1c2-1d24f4b43888" executionId="c58e9b03-b7c0-4030-ac46-64380c1a6100" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="b9e6b511-16dc-188e-b0b4-b3c6d1ea5901" executionId="02ee36b8-42f2-45af-bea8-33838f5d0053" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="a2bf0443-c430-60c1-dae2-66bd9de14f54" executionId="44cb9c69-cc2d-4ca5-aeab-e2a47c8660a5" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="c178c4c9-46fe-d818-2172-b1790d08f76a" executionId="fe44079a-21c8-4059-bd5d-a08e886edb97" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="c306a523-edb1-3483-b9d9-2894e7823843" executionId="1923acd6-7bb6-4e2b-b441-253f7b19e833" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="f94b62f1-217b-7b58-433f-78fa92c3b291" executionId="9acc13c4-a745-4222-adaa-71780bf90ef2" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="ee5f8413-131e-d373-5831-cf9def629bf1" executionId="586294a4-2dcf-454e-a214-568f5d316df4" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="47c8243a-256a-9cd2-b778-0c1e655f34b2" executionId="b31589fb-25b8-46ff-9954-75c26497f048" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="1d05c8f0-b4f5-5979-c2ee-b89fb865b0c0" executionId="51ee6176-a76e-4491-914a-66d93744d21d" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="1cb270c5-b90d-5d22-75bd-18446f0697ab" executionId="57b0b378-436f-435b-9af2-dcc426de54d6" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="dd7892ca-83cf-70c9-d495-73e403f920fd" executionId="5b0b2459-ae49-4722-adba-7bed3c009f01" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="07351a69-1a47-c2e2-c18a-4769689406b0" executionId="9bfd71e2-9ada-41c2-b07b-ebdb18281912" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="4bd6fee0-c227-757a-f276-68c01ee512d8" executionId="2a2087db-8295-43cb-900e-c73d607c2cd5" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="dea07b3b-d253-0f24-49a5-19cddbb41e3d" executionId="fb41f0a4-f4e8-4543-9e72-04ce1aca543f" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="cc37b055-0622-5c79-604c-d07a5ef838f8" executionId="b45a53e8-d0b5-43ce-bb63-6dcc7961abc9" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="4df79739-2bb8-0135-a6f0-f166c5e9b5d1" executionId="63298b21-917e-4441-8dbd-8ae184722f45" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="b026190f-186e-bc0e-53fe-ab0dd77e657f" executionId="c156852e-c30c-4bb3-8da6-18d6c877d646" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="6e346171-7903-22b0-1ca1-205bad580edd" executionId="5140df60-ba05-428f-9f9c-1b88860f5fb6" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="1942bf4b-fda0-7b4a-34e9-25989c8770bd" executionId="48111a9b-1758-41fa-aa3a-5616a0f873ff" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="60b6bfd7-91ef-c23f-ffe4-217e3ea1388b" executionId="e1974ad5-bd96-4ede-83c9-f723b93a9f9c" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="2955f7f4-3358-54dc-4c34-6196d3f41ffd" executionId="489e9d00-dd04-46cc-bbf0-f48133d55f67" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="e371116d-e426-f109-65b7-9aacdf55f26c" executionId="c92891b2-33a3-4ad8-b414-ac5e8d88a4dc" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="57cc6d4c-b4ef-dbe0-fda3-1b6d1aca9b14" executionId="1a485063-bc01-4bdd-8154-b9146eefb376" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="be04bf9f-c1f4-b71c-97dd-e2120c2888d9" executionId="93239259-7f61-45f0-aca1-01b886f8d0e3" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="e036d814-b11e-3427-2124-d9513e6d8707" executionId="a6c3862e-4d71-4cf7-a103-d8eb571799e3" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="c6411e65-2573-9b0a-b091-546a25c749e9" executionId="b589694d-77be-4a08-9d5e-5b3ccd4279c8" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="ba5e704b-ca66-a258-1f80-cf0cc45d1215" executionId="fb5c6fff-c754-4894-b0b5-9b0030de4e51" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="c290d6c2-2e12-8508-613f-1faef3e1e045" executionId="02343c11-b8bd-4b7b-ae7e-3e24697f7fec" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="925a248b-9a4e-193d-bb27-e3e23b1e39da" executionId="ed1b3139-e25e-45e7-b246-f70bc26c4742" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="a55b51f5-22e2-c043-4279-8e10e60d7349" executionId="129053f7-1e66-482d-9ebb-2ba7ea5c2d05" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="9e5fc91d-b61e-dcc6-8ae5-726b071fb87e" executionId="444fa49b-1e57-465f-a75a-fc07ae20d121" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="51ac4bbe-d7e5-71bc-246b-d1e99716f584" executionId="1daa57b9-13a5-431c-82b9-269920b50bd2" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="a059c7b2-6e33-c9af-2afc-cd2dc65439f2" executionId="b43447db-5dab-4ff5-8630-6d73543579cf" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="d45d0798-7cfc-42f9-8819-a57a7edb9394" executionId="d694a9b9-4d2c-45ac-a01a-3188ac6cdeed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="ee844046-726f-42f3-8975-8f9490d048fd" executionId="e34a7d2b-0770-40c9-a907-1176a7087708" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="66fa9d2a-f717-592b-cce5-3f62affb59c8" executionId="5a1c876e-8ff1-4639-ba28-c1ecd0f77cb4" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="675f74a4-4cf4-d06d-d9d1-16f61fb606c0" executionId="cf1ada70-99ee-4f7f-8f70-63b60be1c7c8" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="4d32ba02-105a-512c-8d73-cbe2ab1e1f04" executionId="51625678-7908-4524-8374-954f8161d146" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="5b993a1e-f2f6-86d5-406c-6a46db6e0332" executionId="69e7d020-d39f-4f3e-9d9d-47c1418ac059" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="aa87bb5b-2b89-868b-47a2-39dc87ec48cf" executionId="3fd18c4b-2df1-4070-972e-f5e4098f15e1" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="44ff09f3-f13f-afad-c8bf-307264ed7dc8" executionId="2af791ed-e6c6-47d6-aa2c-ef78f5986b77" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="0fbe1328-6f9f-13f7-50c5-20e6569e290d" executionId="3ff86ef7-d491-417a-8694-53a79fc65e90" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="2522538b-2fec-c9fb-5377-f146f2da0ba0" executionId="4116a14a-1e10-4665-bb47-3b4578391ca1" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="812d5d43-7e52-ce08-7556-5a43f9ffdac0" executionId="ed7b6f01-0078-419e-9cdd-225d62fd1c63" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="624e5fd3-404d-bdf0-8372-cf7f2664fb3a" executionId="650b30eb-6ee8-4aa9-b679-459f376d9aa9" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="3703cdc9-1200-4a8e-e91b-e5b255b6349a" executionId="e9e94364-518e-48da-85bb-2293ceb97541" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="a3b89ebc-353f-38b3-04d4-bd41ea0c21b8" executionId="c4e4891f-08ea-4f2e-a93c-ffc4b9fcb6bc" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="49384e74-fc74-cc87-a819-9b1ba4a72e05" executionId="84f2372c-e3d3-49a0-9525-988cff0518ae" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="70049eab-88eb-4514-024e-9b688c008eef" executionId="f353e41d-025b-4788-a433-1b61c95b8ff3" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="2d9c9c47-2244-30b1-60dd-7a6c72fc4a26" executionId="03f46179-7da8-4564-a927-48e7505826f9" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="5e6c8ff2-b0d7-8172-d7f7-7a4377ce492f" executionId="d4e22fc5-2fc8-4f02-9264-6f9c79a432f0" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="84f7e997-d635-149a-68bc-b02e9fcddd2d" executionId="e5597443-5941-4c01-ad96-35c961505a1f" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestEntry testId="369cf2cd-6a6b-3b6b-6836-0b22e26fda39" executionId="fb6987a4-99b8-41e6-8633-512c52dab9bb" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
</TestEntries>
<TestLists>
<TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
<TestList name="All Loaded Results" id="19431567-8539-422a-85d7-44ee4e166bda" />
</TestLists>
<ResultSummary outcome="Completed">
<Counters total="57" executed="57" passed="57" failed="0" error="0" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="0" notExecuted="0" disconnected="0" warning="0" completed="0" inProgress="0" pending="0" />
<Output>
<StdOut>[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 9.0.19)&#xD;
[xUnit.net 00:00:00.19] Discovering: JobTrackerApi.Tests&#xD;
[xUnit.net 00:00:00.33] Discovered: JobTrackerApi.Tests&#xD;
[xUnit.net 00:00:00.34] Starting: JobTrackerApi.Tests&#xD;
[xUnit.net 00:00:08.38] Finished: JobTrackerApi.Tests&#xD;
</StdOut>
</Output>
</ResultSummary>
</TestRun>
@@ -0,0 +1,14 @@
{
"date": "2026-11-03",
"branch": "codex/a3-ui-10",
"ownerApproval": "Approve IM09 and A3-IM10",
"base": "7a9de940dfdc41023f87a1ef38a5fd86a0b8e477",
"localisationDelta": { "original": "1ce93ca0e3a906673e636e56f1b910756ca78bb2", "integrated": "31ce70271663a5d57c7b2eb8f80cd69be5cc95ef", "scope": "Narrow cherry-pick, no wholesale older application merge", "freshCases": 63, "original61": "Historical isolated evidence, not fresh integration proof" },
"frontend": { "status": "PASSED", "distinctCases": 124, "suites": 3, "union": "63 application-assets/attachments +61 CV studio", "focused": "One new caption case overlaps61; red had one expected failure/60filtered NOT RUN", "warnings": "Existing studio direct-focus React act warnings; not warning-free" },
"browser": { "status": "PASSED", "configurations": 16, "scans": 16, "configuration": "320/390/768/1440 x EN/NB x light/dark", "mutations": 0, "proposals": "16 intercepted synthetic responses", "qualification": "Actual exported app; no backend/live model/semantic translation quality or physical PDF qualification" },
"sourceCensus": { "status": "PASSED", "groups": 57, "routePatterns": 34, "historicalStatuses": "56 PARTIAL/1 DEFERRED retained", "meaning": "Literal AST source membership and complete original register hash unchanged from d3d33837; not runtime/auth/whole-capability acceptance" },
"static": { "typecheck": "PASSED", "fullLint": "PASSED", "scopedVerifierLint": "PASSED", "build": "PASSED", "graph": "AST-only update completed locally; optional SQL parser absent and144 files yielded no symbols" },
"independentReview": "No actionable source/integration/verifier findings; no independent reruns added.",
"notRun": ["New backend or physical PDF run: sources unaffected", "Secondary-route connected browser qualification: still pending", "Native/human/European language qualification", "Real providers/models/hosted CI", "Integrated security/recovery/release/production"],
"remaining": ["Complete IM10 cross-application/secondary-route qualification", "Consolidated acceptance proposal", "AI mounted entitlement refresh and granular Ghosted pause remain open", "Full roadmap workstream gates remain separate"]
}
@@ -0,0 +1,915 @@
{
"base": "d3d338376444b8abdcaf7200f682faa3daf1ad10",
"policy": "Source membership and unchanged criteria only; no acceptance promotion.",
"sourceSha256": "d0dedb54af35b312d7f9194f74f8db8a493375b6397b52a87872f498ab0b0dd4",
"registerSha256": "a4c2a5a0244ea89381008218de32daee1f615a250eb3808b60e0ee103c674d4d",
"groups": [
{
"id": "PRES-E01",
"currentStatus": "PARTIAL",
"requiredClosure": "Public-page complete mobile/keyboard review and actual billing availability; no invented prices",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 0,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E02",
"currentStatus": "PARTIAL",
"requiredClosure": "Real mail/reset submit/Turnstile and token expiry/used-token cases; query loss is repaired for its tested scope",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 1,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E03",
"currentStatus": "PARTIAL",
"requiredClosure": "Actual consent/popups/revoked grants/relink; mailbox grants remain separate from sign-in",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 2,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E04",
"currentStatus": "PARTIAL",
"requiredClosure": "Real authenticator/recovery and reader/trusted-device traversal; sensitive confirmations retained",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 3,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E05",
"currentStatus": "PARTIAL",
"requiredClosure": "Native session-card refresh after remote revocation and complete device/AT acceptance",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 4,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E06",
"currentStatus": "PARTIAL",
"requiredClosure": "Complete avatar/remove/password/email-change native flow; account identity remains distinct from career facts",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 5,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E07",
"currentStatus": "PARTIAL",
"requiredClosure": "Spoken names/live state, settled drawer AX-name triage and historical command/dialog timing; no route silently hidden",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 6,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E08",
"currentStatus": "PARTIAL",
"requiredClosure": "Full OS/locale/state cross-product, contrast/incomplete axe, reader/reflow; save feedback is distinct from server500 root-cause repair",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 7,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-E09",
"currentStatus": "PARTIAL",
"requiredClosure": "Broader BFCache/offline/old-bundle/deployed cases; presentation never becomes authorization",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 8,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J01",
"currentStatus": "PARTIAL",
"requiredClosure": "Live NAV availability/freshness and long-result keyboard/narrow traversal",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 9,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J02",
"currentStatus": "PARTIAL",
"requiredClosure": "Actual scheduler-to-owned-notification delivery, human/mobile delete acceptance and intended-provider qualification; deterministic runner is not live NAV",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 10,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J03",
"currentStatus": "PARTIAL",
"requiredClosure": "Duplicate/company/date/interrupted creation and distinct creation-intent idempotency debt; preview/open is no-write",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 11,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J04",
"currentStatus": "PARTIAL",
"requiredClosure": "Installed extension/share/no-replay and attachment failure recovery; keep payload and safe-return contracts",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 12,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J05",
"currentStatus": "PARTIAL",
"requiredClosure": "Full saved-view CRUD/dirty page-size/history combinations and supported capacity; server query semantics unchanged",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 13,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J06",
"currentStatus": "PARTIAL",
"requiredClosure": "Complete selected-scope/partial-failure/dirty/manual combinations; no hard-delete substitution",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 14,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J07",
"currentStatus": "PARTIAL",
"requiredClosure": "Physical drag/touch/browser variants and O(N) full-array capacity; no capped hidden results or pipeline redefinition",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 15,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J08",
"currentStatus": "PARTIAL",
"requiredClosure": "Scoped in-modal failure proof follows P6 manifest; complete contact/date/source-link and human acceptance remain",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 16,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J09",
"currentStatus": "PARTIAL",
"requiredClosure": "Many-offer mobile/currency/date acceptance; no invented salary normalization",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 17,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-J10",
"currentStatus": "PARTIAL",
"requiredClosure": "Complete native roundtrip and target spreadsheet compatibility; job import is not account restore",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 18,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W01",
"currentStatus": "PARTIAL",
"requiredClosure": "`followMode` metadata retained; compose consumer deferred. P5-05 optional preview lacks production host; full page remains",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 19,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W02",
"currentStatus": "PARTIAL",
"requiredClosure": "Stored-event localisation/timezones/status-reload combinations ; job stale-replacement contract repaired within qualified MariaDB 12.2.2 scope",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 20,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W03",
"currentStatus": "PARTIAL",
"requiredClosure": "Real-model truthfulness/freshness/cancel quality; route entry never auto-generates; unrelated AI survives C11 withholding",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 21,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W04",
"currentStatus": "PARTIAL",
"requiredClosure": "Mobile interruption/edit/delete/reader; item identity and keyboard alternatives retained; no invented due-date schema",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 22,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W05",
"currentStatus": "PARTIAL",
"requiredClosure": "**P2-D01 remains ordinary passing**; broader attach-render/model/deployed combinations remain; owner/job association unchanged",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 23,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W06",
"currentStatus": "PARTIAL",
"requiredClosure": "Complete native history/reject/reader/model combinations; no canonical mutation or auto-send",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 24,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W07",
"currentStatus": "PARTIAL",
"requiredClosure": "Actual production restore/rollback/all-storage combinations; current edits/delete cannot mutate frozen bytes; capture is not delivery",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 25,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W08",
"currentStatus": "PARTIAL",
"requiredClosure": "Physical drop, full rename/download/reader and deployed storage; AI inclusion remains explicit",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 26,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W09",
"currentStatus": "PARTIAL",
"requiredClosure": "Real-model and physical software-keyboard/reload/reader; preparation is not a scheduled interview",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 27,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W10",
"currentStatus": "PARTIAL",
"requiredClosure": "Timezones/provider delivery; `followMode` reviewed compose UI remains deferred, no automatic send",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 28,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W11",
"currentStatus": "PARTIAL",
"requiredClosure": "F21 DST/date-only/offsets, real provider events/scheduler delivery and historical unconfirmed Rules500 cause",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 29,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-W12",
"currentStatus": "PARTIAL",
"requiredClosure": "Disconnect/reconnect and F20 enabled-worker fault recovery; stable operation IDs/no duplicate starts",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 30,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C01",
"currentStatus": "PARTIAL",
"requiredClosure": "Full long-tail mobile/human acceptance; canonical concurrency has bounded SQLite/MariaDB repair proof; singleton source distinct from identified variants",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 31,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C02",
"currentStatus": "PARTIAL",
"requiredClosure": "Complete native historical restore/clipboard/avatar/reader; live inherited CVs may reflect later source changes",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 32,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C03",
"currentStatus": "PARTIAL",
"requiredClosure": "Scanned/OCR corpus and complete low-confidence/discard/native-reader flow; extracted proposal is not canonical truth",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 33,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C04",
"currentStatus": "PARTIAL",
"requiredClosure": "Many-item/delete/keyboard/human acceptance; SQLite compatibility repaired with owner SQL preserved, full frontend/production acceptance remains qualified",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 34,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C05",
"currentStatus": "PARTIAL",
"requiredClosure": "Library migration not complete; publish/unpublish/old-slug revocation and every template combination required",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 35,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C06",
"currentStatus": "PARTIAL",
"requiredClosure": "Physical keyboard/touch/AT and broader short-height/wrapped/deployed cases; one editor/save/preview owner",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 36,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C07",
"currentStatus": "PARTIAL",
"requiredClosure": "Physical selection/drop/all-browser and exhaustive reset/inheritance combinations; sibling/canonical/frozen separation retained",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 37,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C08",
"currentStatus": "PARTIAL",
"requiredClosure": "Production fonts/portraits/wrapped lines/custom color/reader; schematic gallery is not final-photo qualification",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 38,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C09",
"currentStatus": "PARTIAL",
"requiredClosure": "Advanced cross-product/manual print/deployed fonts; UI locale distinct from document locale; no print geometry styling change",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 39,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C10",
"currentStatus": "PARTIAL",
"requiredClosure": "Long offline/history and IF-CV-UNSAVED-01 trace; settings history is not immutable historical profile/PDF; profile/job saves remain separate",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 40,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C11",
"currentStatus": "DEFERRED",
"requiredClosure": "**0/366 configured-target calls;0 human semantic reviews;review UI absent.** Production503 `cv_ai_unavailable`/no provider/no write remains; safe withholding is not generation acceptance",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 41,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-C12",
"currentStatus": "PARTIAL",
"requiredClosure": "Deployed Linux/font/photo/browser/manual-print qualification and complete revoke/busy-recovery cases; white print pages retained",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 42,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-M01",
"currentStatus": "PARTIAL",
"requiredClosure": "Full edit/delete/paste/reader native combinations; logging is not sending",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 43,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-M02",
"currentStatus": "PARTIAL",
"requiredClosure": "Actual provider threads/multi-account revoke/reconnect/sync failures; cross-job changes owner-bound",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 44,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-M03",
"currentStatus": "PARTIAL",
"requiredClosure": "Large mailbox/native attachments/complete reader acceptance; global inbox remains Phase7 migration",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 45,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-M04",
"currentStatus": "PARTIAL",
"requiredClosure": "Sandbox delivery/reconnect/dirty interruption; no automatic uncertain resend; reviewed `followMode` UI deferred",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 46,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-M05",
"currentStatus": "PARTIAL",
"requiredClosure": "Real provider and complete proposed-job create flow; route opening is no-write",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 47,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-M06",
"currentStatus": "PARTIAL",
"requiredClosure": "Real grants/revoke/token expiry/reconnect/IMAP safety; keep sign-in identity separate",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 48,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-S01",
"currentStatus": "PARTIAL",
"requiredClosure": "Exact cohort/timezone/sample/unsupported metrics and whole reader acceptance; no fabricated statistics or Analytics rebuild",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 49,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-S02",
"currentStatus": "PARTIAL",
"requiredClosure": "Historical500 causes unproved; full human/notification acceptance; order/resize/reset/cross-device design remains Phase8",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 50,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-S03",
"currentStatus": "PARTIAL",
"requiredClosure": "Language failure visibility is separate from RD11 server cause; RD12 notification locking/RD13 Rules500 and human/provider acceptance retained",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 51,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-S04",
"currentStatus": "PARTIAL",
"requiredClosure": "Checkout/webhook/portal and provider delivery; temporary C11 withholding cannot disable unrelated AI or imply successful review",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 52,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-S05",
"currentStatus": "PARTIAL",
"requiredClosure": "Current complete backup/restore/keys/tombstones/rollback and deletion/provider policy; downloading backup is not restore proof",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 53,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-A01",
"currentStatus": "PARTIAL",
"requiredClosure": "Mounted-role revoke/full persisted mutations/reset delivery; hiding navigation never authorizes API calls",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 54,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-A02",
"currentStatus": "PARTIAL",
"requiredClosure": "Native successful persisted undo/restore and unsupported-action denial; no generic undo semantics",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 55,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
},
{
"id": "PRES-A03",
"currentStatus": "PARTIAL",
"requiredClosure": "Actual guarded diagnostic/SMTP/model/maintenance and sensitive-output qualification; no production jobs launched",
"sourceCriterion": {
"path": "docs/redesign/phase-9/preservation.json",
"index": 56,
"originalCriteria": "docs/redesign/phase-2/PRESERVATION_MATRIX.md",
"laterResidual": "docs/redesign/phase-7/PRESERVATION.md"
}
}
],
"routes": [
{
"route": "/",
"owners": [
"Navigate",
"LandingPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/dashboard",
"owners": [
"DashboardView"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/analytics",
"owners": [
"AnalyticsPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/discover",
"owners": [
"JobDiscoveryPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/jobs",
"owners": [
"JobTable"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/jobs/:id",
"owners": [
"ApplicationWorkspacePage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/reminders",
"owners": [
"RemindersView"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/operations",
"owners": [
"OperationsPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/kanban",
"owners": [
"LegacyBoardRedirect"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/companies",
"owners": [
"CompaniesTable"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/offers",
"owners": [
"OfferComparisonPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/correspondence",
"owners": [
"CorrespondenceInboxPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/correspondence/review",
"owners": [
"LegacyCorrespondenceReviewRedirect"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/profile",
"owners": [
"ProfilePage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/applications/:id",
"owners": [
"LegacyApplicationRedirect"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/career",
"owners": [
"CareerWorkspacePage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/career/builder",
"owners": [
"CvBuilderPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/career/builder/:id",
"owners": [
"CvBuilderEditor"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/documents",
"owners": [
"DocumentsPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/admin/audit",
"owners": [
"AdminAuditPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/admin/users",
"owners": [
"AdminUsersPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/admin/system",
"owners": [
"AdminSystemPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/trash",
"owners": [
"JobTable"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/settings",
"owners": [
"SettingsView"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/settings/connected-accounts",
"owners": [
"ConnectedAccountsPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/login",
"owners": [
"LoginPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/register",
"owners": [
"LoginPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/forgot-password",
"owners": [
"ForgotPasswordPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/reset-password",
"owners": [
"ResetPasswordPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/verify-email",
"owners": [
"VerifyEmailPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/confirm-email-change",
"owners": [
"VerifyEmailPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/microsoft-legacy-relink",
"owners": [
"MicrosoftLegacyRelinkPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/cv/:slug",
"owners": [
"PublicCvPage"
],
"requiredClosure": "fresh route membership reconciliation plus affected connected workflow evidence; human checks remain distinct",
"sourceMembership": "PRESENT"
},
{
"route": "/admin/processing",
"owners": [
"AdminProcessingPage",
"AdminProcessingController"
],
"requiredClosure": "Human accessibility/device/native language and integrated acceptance remain separate.",
"sourceMembership": "PRESENT"
}
],
"limits": [
"57 historical group statuses and original criteria retained, not promoted.",
"Not browser/auth/provider/native/deployed or whole-capability acceptance. CalendarPage retains the original reminder route and owner internally."
]
}
@@ -0,0 +1,131 @@
{
"base": "7a9de940dfdc41023f87a1ef38a5fd86a0b8e477",
"policy": "LF-normalised text, raw PNG SHA256",
"scope": "Initial bounded IM10 checkpoint only, not final acceptance",
"sources": {
"job-tracker-ui/src/components/Attachments.tsx": "02081be8282cb3d1a525b336bededb8aabe561cc3b73e1b98e924f9ef945add1",
"job-tracker-ui/src/components/ApplicationAssets.tsx": "95465d9a881af97e55ad6f74ff283f81c452c645cc37ff28e7212ea7a32e9d57",
"job-tracker-ui/src/attachments.test.tsx": "89bb3e277ae7be652073eec6d3b6188bcbeaea8b29b07478ff5b21654be8e7c1",
"job-tracker-ui/src/application-assets.test.tsx": "d07f22661d8efbd65dbf4e92aa9722d6159438e6b354ed0c3c4a41c6d55b43ac",
"job-tracker-ui/src/views/CvBuilderEditor.tsx": "34672dabca47ac62d873e8d00842e71e82e668392b27a218b6d5641433200ca0",
"job-tracker-ui/src/cv-builder-deep-link.test.tsx": "75f1e8656be6e57e8ec38438009d59c5b179617b375fcdd01f75638a461ca14f",
"job-tracker-ui/src/cvBuilder.ts": "c021bafeabbc8ad3526d1b10b90ad8f7f0958ded8ed26eac8c1d28b53098b64d",
"job-tracker-ui/src/i18n/I18nProvider.tsx": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113",
"job-tracker-ui/src/i18n/translations.ts": "d3167487ec82e302bb26c9269b4a79b03a269b85ed8414b11cf38a9bb8f3d0a7",
"job-tracker-ui/src/App.tsx": "a176e52d81c4b6ded63c5f38cb27e853aa09312f2cc45fc7e5b5e44573e0fef3",
"job-tracker-ui/scripts/verify-a3-ai-settings.mjs": "373a77fd91b8982be497039acc27ae9aa2fd3b21232c1255228d7bfe451cd47b",
"job-tracker-ui/scripts/verify-a3-preservation.mjs": "b0fd604c5ca42185b6985df27f0157ddd07caf1e578d55532b79d3d5eacf84c7",
"job-tracker-ui/package.json": "3745394e406cefa40d30a87e840bccb359be147bac6ffba736e2ae90898a8626",
"job-tracker-ui/package-lock.json": "bf31e90d7af03e8af059db2aaf893925b9e8881a30a1688034ed88ef45d4fcab",
"docs/pre-phase10-ux/preservation.json": "a4c2a5a0244ea89381008218de32daee1f615a250eb3808b60e0ee103c674d4d",
"docs/ui-modernisation/UI-10.md": "356a6fda1411d7bd98ac06629c65f7aa4d4f81de6a97f8971cc4b0b23302e04a",
"docs/ui-modernisation/CROSS_APP_LOCALISATION.md": "aaa4c0e515629e7836929b22f0401df9de43158f1d1a27db4d8d25be600fa659"
},
"evidence": {
"browser-ai-review/ai-review-en-dark-1440.png": "7049cc12f57b4796ed2b963f7739e44d684c03587e18c71543a45f8eaa5f7147",
"browser-ai-review/ai-review-en-dark-320.png": "a507bc60317ea10a3efb65656a6cdeae3c6e9a27add74d60eb1c0c8953b3c3c1",
"browser-ai-review/ai-review-en-dark-390.png": "74f232cb0fd7ab17fcc067d0b0c839bfb2b4ded0f8042ee2e2d626ed3fadd1b8",
"browser-ai-review/ai-review-en-dark-768.png": "36d9ca233d913fccfc98032c28b338d53195f1bd26a7ce9a39979252cd18abea",
"browser-ai-review/ai-review-en-light-1440.png": "200eba8c65fe2b82ea77c77ff77494b13b53103c58aa74f0dbc4d2198e190bdf",
"browser-ai-review/ai-review-en-light-320.png": "bdb9a967a5f4fd77c30e6c8a8a869b4f0d914c1a0fa00bb62f5f9abd49b49bb3",
"browser-ai-review/ai-review-en-light-390.png": "a23682d8d49b8f0e921abdc00b33ae885da40294b3fe87b2e93905e8c31fe8d6",
"browser-ai-review/ai-review-en-light-768.png": "26bfd9f664375bdb14d69f7304fc58955fe3ad4f66304c77b80de1b5631f56aa",
"browser-ai-review/ai-review-nb-dark-1440.png": "da58bfdca3a744cabad648f3443280f3fa4e4630598a0771a02b087ad7364902",
"browser-ai-review/ai-review-nb-dark-320.png": "e2daecb27a684092553b6adad3329875c2ba3b4fd6053fb27034423a9c9d89f3",
"browser-ai-review/ai-review-nb-dark-390.png": "32f88f046f6ff78b36448670038cb09f5f8c4bf42aefa85a329f9e9905b5095d",
"browser-ai-review/ai-review-nb-dark-768.png": "8db2b94c961f19c81d578faa820b18abbf5113a755715692d0430dc8e4dfdd7e",
"browser-ai-review/ai-review-nb-light-1440.png": "a37237174378812aaeef368010543287dc3317285f4008108637a6f05fc87637",
"browser-ai-review/ai-review-nb-light-320.png": "f489b8ee922f623665bf4613e1950eed84ea63371b1ab91c357f8f954c5f7c5a",
"browser-ai-review/ai-review-nb-light-390.png": "87b800ec333f11b9c4d259852c73ca9f4ab3715a0c2845a0d42d72e7ba7c35fb",
"browser-ai-review/ai-review-nb-light-768.png": "7deeadc4621ef7f03f71ec79927dae7fb02156cb21fa233298b278fb51b2e5b8",
"browser-ai-review/REVIEW.json": "6337675839aa1d46120b6304f17c222970a85e3895f9a8eb2fa46fee88677696",
"CHECKS.json": "2113dc38ab21551293b4502fe50e939c793c705a63626a4fa35e28d9b47247bb",
"frontend/a3-cross-app-cv-tests.json": "7c0a31af27cfbb78c2455581de338c00c325b67a62684724cc21b28d9fbde970",
"frontend/a3-cross-app-localisation-tests.json": "ff74557cf54632cd535b65de0661ae602fa329e15350625dcaf745e83724e332",
"frontend/a3-cross-app-review-focused.json": "19d8e8e7bc1b9a8ddf6911dea362f182b00dae7afb4fb5f27850bef72cefe1a1",
"frontend/a3-cross-app-review-red.json": "fb4ac8d49c691998d42aba7f57c3b83f98dc23f2fb2ddb18802c80e14f58fe9b",
"PRESERVATION_CENSUS.json": "759297e6578274efc0f0c6cfea67c9e08b7d425efa62d1d7a043b9eb9805808d"
},
"export": {
"404.html": "b4c33da6d53512a33d317e329653dfa129b158aeb18d1655377a31fbbebd7b58",
"__next.__PAGE__.txt": "51f937e04cc1bc639c851e5e736bdae59ba173018eee670ec42c70ddef1253a6",
"__next._full.txt": "82bffb4dc5832441a8d1451368558e3f4ec4cda2a3bc96072e5efe87a6cac0b5",
"__next._tree.txt": "8170048bddec2d4f65b53f1cf5ab69fc454081429a0ad9325cb57468110e5efa",
"_next/static/bn2MCY_eRqJUjw-m-UfIm/_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea",
"_next/static/bn2MCY_eRqJUjw-m-UfIm/_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a",
"_next/static/bn2MCY_eRqJUjw-m-UfIm/_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00",
"_next/static/chunks/0-_aq6ipzcshj.js": "39f90c215bf52aef6274ed3dcc0f8af32e21a37fe8845b3bca0d6ea60da6a8c2",
"_next/static/chunks/0ah1fzqmie05a.js": "5c65505a7dcbac63ac71d254e619a4c800943bfb4fa16cd40c10cdbe7e9b6e31",
"_next/static/chunks/0bdt7ln111t48.js": "6184b1a61f22e2a640c17941634fdc75678ce93d142848d9f07f163e0d1fd201",
"_next/static/chunks/0bwvt3mysnclc.js": "7705667a1b75812b7833d9c9dff47fe023015e58e382c40f4507d9948c973af4",
"_next/static/chunks/0c-j9v44ea4gk.js": "d7e04926724f76dc50b5202522fab3bb553370d040396394e84c342de466512b",
"_next/static/chunks/0cz1d0mv5g_q7.js": "0973c1d64c88adc8e3c950410cb58b288f72118d5965b78049438deb8f2f9683",
"_next/static/chunks/0gamdsp7ql8cu.js": "f641cd9e2957f5c01234df02211a085f8e8fe2009cf84817e4143f3c477e1dc2",
"_next/static/chunks/0jcvc3qm6-lyk.js": "7c27e1fe373b822adc68c63096a5bf38444ad605b9743f0920271652989c56f1",
"_next/static/chunks/0q1wd_b10phzr.js": "307f4a4ed0f1ef2d87b9de51dbcac2382a39aa8bab359994ee7aa41529215b4e",
"_next/static/chunks/0q20g9o8x-k8z.js": "3d4d9086985419aa8866b032158196c774acb8bf318f3c8245508c8daa9c5148",
"_next/static/chunks/0q_pwu9jxv4-d.js": "42a43b3d7245a413c7c29b4cbe87823037a6dbc637e2e282c92405470e0f575d",
"_next/static/chunks/0yg1x7i96lj87.js": "2aad3c0f9e8b7b5a5123a2a439970c49db0be353236e22f9b6eafaaf01328c15",
"_next/static/chunks/14-lfugawba2w.js": "6a5780ca3c84d7f130f3c0a14431c85c7a1e799e2645b8c171161dab40a64360",
"_next/static/chunks/1435in_k_-dhc.js": "4757476512d5c4dd25f9264a18b304ed4824b23aff1c09e134fcbff21d9c36b6",
"_next/static/chunks/145oicobmjvm7.js": "d6bbbdeed1381652dc7412e5ce673a077579ecd5cee8934cb6b533c814098764",
"_next/static/chunks/14e7ovj0s3elm.js": "070567dd4d23fb9fa0b9ba132185a697af6578045d43b2b1c7bbb2a1594d935d",
"_next/static/chunks/16lfece6cnlln.js": "716363ba044f30b0e70440756b4e5eafa2d25f2e1628e855e3bc4ab9eabee3d3",
"_next/static/chunks/17eiliiibinqq.js": "790c342b1378a793260f9eac0b8c581261d517ee23320bb68995c43f9eaa36c1",
"_next/static/chunks/19zh-dmyml5oj.js": "2ab304f9b4155cdbac4d22e1b0b56b1c1f775c4bbb3ee93c425e297182bf522e",
"_next/static/chunks/1d0xrdyyzw7qc.js": "c11668ff1e152008e0d7b4454af12eb36c97df46a5860938e2eb5d8429b374a8",
"_next/static/chunks/1ke8pzecwofrg.css": "32e9ab963ebadebcbe2c68dffb24cfbfc8cc24255ad91b48b7941fc777bf7439",
"_next/static/chunks/1m4qrvmbq_fq9.js": "4d36c8ec83dc817f273178dc22f329ab026578075f58de68b6f133bcf911a8a1",
"_next/static/chunks/1req80b9jj38r.js": "eee4d2e3789e1215195dba99ad0f09d34f8c83da848322b76054722233e9dae3",
"_next/static/chunks/1wpxvpfa6li_4.js": "025ec0658f9480ccf14dd9be5cb28320ed14f4921c60ac9a2bf844d07bf4171b",
"_next/static/chunks/1xn023_28rgzj.js": "4f7f2108d030a48d039930736c92a55710975dddf419fe673f84d92899b1f575",
"_next/static/chunks/1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f",
"_next/static/chunks/1zi8i6dnxiac_.js": "8aea28bbe6a138e5d4b619429ca71570883a7aee974b86d5a4a746d90f704dbc",
"_next/static/chunks/22wx8--1b9tnq.js": "3f7d8e762371262c6a740b4dac21725b424847319afac46055e97074a99ff5f5",
"_next/static/chunks/2b49wlharl6fd.js": "40619f8a5a03fc7479b0679717b1e5ec0dea0a1944ce77f4ce9d29d2486fdb5c",
"_next/static/chunks/2br3ad_-bc7k9.js": "80fa55f7a32db4d743fda36747c36994fde00a0f53f2eb25b2a6d07c6fb97cd7",
"_next/static/chunks/2dmc6iqxm14fz.js": "3b20898e0cde315c48d6fd46abd562269bbf73c850528a4be2cfc2b9aa0c8f5e",
"_next/static/chunks/2ftgr1rx3r0dw.js": "8866e9ef62ab057bf9923604724edbb463bbdd6dd3fcbf614585f76005874811",
"_next/static/chunks/2ghgf2s9b2iou.js": "23d8ff31e2128d0541c1887785fb75885323fea7c5d4f35826513b75c12c2ae3",
"_next/static/chunks/2itnratrnd9c5.js": "8be0b191c2d54f7233ebf2f1e169b3bfef680fa93da21c08d8c43b05c3ec174f",
"_next/static/chunks/2kpcazmi6n6mk.js": "bea0de681fceff50056bfeccc5d035aff54d20918288051cb64bb259edd250c7",
"_next/static/chunks/2r6jrtuxq0e_x.js": "ac31577d9e5663a8f82645117a15743264054e5098b707c576e4e505398cc672",
"_next/static/chunks/2s2gjr6ro25dj.js": "7489e2ac285a05b563c2bcb4eaf9274bf930f2a7385f17d6d5e6850064b88b10",
"_next/static/chunks/2u5qve004opku.js": "be388d9a6aa423082bafb4584c3facc65ddfed71bcfa5c1d06b097b408c5ff97",
"_next/static/chunks/2xkey6z2nw7xp.js": "0f25bf09513b31298148cd262507b20b5a9ca5533317168c16481c544c6ffd6f",
"_next/static/chunks/2z42el0b2mp8_.js": "86ff990ef32c90c4839583e4f1d1bcbddb165dad3141b9fcd2ecec67f4ff24b8",
"_next/static/chunks/2z9e_b61gtc22.js": "b9d717dad26828438d4ff56cabca41a8055f5eaa54420fd0aeb6b4ba7d5baa0d",
"_next/static/chunks/31n24zcvyae0y.js": "110921bad10425af1d689cb939d97be75c7c0af9c35f8b16c5ff237db6fce893",
"_next/static/chunks/324qfub45abd6.js": "77ef8e17b89234fb19a80796d5d04d3e297c459e5cb41b35b5bc78c0b10b4984",
"_next/static/chunks/32_ah983ce851.js": "0c3cd0d2a5ad789e31226a9ea0506c50016804311a58548c7784b7b45aaecd14",
"_next/static/chunks/3329nxgnx3721.js": "ceedc7c69bf0617733b65bbf9f6a682a5d53177d4e8fdb86b8982cda2175f232",
"_next/static/chunks/357yqeklh7414.js": "0192ab7198ebbe299d34a934c504dd4b562d1cccebb6e9d4c5163930c881b14c",
"_next/static/chunks/3721l8sfm8icl.js": "06b67611b3a93515a375b803b54fe7063c049824f1ebf5c7f7db8701b5091e7c",
"_next/static/chunks/3bqn9b34na0b9.js": "f1b8ebcc1b22251c33c9f3a5d11c1f893cad2da2e8744a441e790f7347aa9e73",
"_next/static/chunks/3ckk_j5ril9ag.js": "87f631dae7b648d32171e9e05a3e000753ecb54f8d3b86a4401c0e4ab4d73553",
"_next/static/chunks/3gkylew_qn7cw.js": "7e6c74c81be0c41ab433e36d65b914f62c48f332922e27f7cc953476f4dd78cb",
"_next/static/chunks/3la4obitihzpv.js": "9a5a57b46db389b98f1fd5baa86eba1a360300dae9d1ff3ffeae7bc3378135b9",
"_next/static/chunks/3q4v10rrqy40n.js": "d87ff7b7a0f07d0d92eab3876481eb686a12d9c43d8b92cbe406aefa227a11c1",
"_next/static/chunks/3s4-jswh8gd_0.js": "38f29a1630a295d009178de7353b0138f8664a421ddf7f6adb7d6105ff747a68",
"_next/static/chunks/3u61o8t7m_jza.js": "86231c12e0f8cacc8638bed0bc4b34f645fc35e60de342dc154d3cce0c9a5afa",
"_next/static/chunks/40y_aqqilokr2.js": "1f5a5260316134d6bffe949400752ee6b42addf908ae714ef4ae4ebde916dddd",
"_next/static/chunks/43b5x8qjjh3ax.js": "6ee7261cf9a63e0e6ea181bbb09125e09948588b6e10b5c02727c686a6062a3a",
"_next/static/chunks/turbopack-25fzg9ay_1ss-.js": "c40f39e993a30c96d6247bb3a7b581538bb046efe8ef8ec07bea3ba32291750f",
"_not-found/__next._full.txt": "f9f9ca590aca43147f8296a55055a2d74adb084b15b1aa96aeb3824e2611c7e1",
"_not-found/__next._not-found/__PAGE__.txt": "9f06d77af71b3cb0cee6ed97464b8126c0a12d49a562ea4b96454b1854ad5253",
"_not-found/__next._tree.txt": "c24fdf123693e1e12f27fde3e9918c2c41030608b4e7883e133ee0cf268e9ca8",
"_not-found.html": "b4c33da6d53512a33d317e329653dfa129b158aeb18d1655377a31fbbebd7b58",
"_not-found.txt": "f9f9ca590aca43147f8296a55055a2d74adb084b15b1aa96aeb3824e2611c7e1",
"favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
"favicon.svg": "63ecf8f37f8bb146ecfae3917187c6b692d4e801641e8a314486a4007912f3a3",
"index.html": "4e4fde1f40864f519f0552becde231b341e1e9637d66c136ba7e367cbafdfdd1",
"index.txt": "82bffb4dc5832441a8d1451368558e3f4ec4cda2a3bc96072e5efe87a6cac0b5",
"logo192.png": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4",
"logo512.png": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4",
"manifest.json": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935",
"mockups/dashboard.svg": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc",
"mockups/pipeline.svg": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4",
"mockups/workspace.svg": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd",
"robots.txt": "e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c"
}
}
@@ -0,0 +1,387 @@
{
"screens": [
{
"width": 320,
"language": "en",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 320,
"language": "nb",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 320,
"language": "nb",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 390,
"language": "en",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 390,
"language": "en",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 390,
"language": "nb",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 390,
"language": "nb",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 768,
"language": "en",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 768,
"language": "en",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 768,
"language": "nb",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 768,
"language": "nb",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 1440,
"language": "en",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 1440,
"language": "en",
"mode": "dark",
"state": "ai-review",
"violations": []
},
{
"width": 1440,
"language": "nb",
"mode": "light",
"state": "ai-review",
"violations": []
},
{
"width": 1440,
"language": "nb",
"mode": "dark",
"state": "ai-review",
"violations": []
}
],
"journeys": [
{
"width": 320,
"language": "en",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 320,
"language": "en",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 320,
"language": "nb",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 320,
"language": "nb",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 390,
"language": "en",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 390,
"language": "en",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 390,
"language": "nb",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 390,
"language": "nb",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 768,
"language": "en",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 768,
"language": "en",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 768,
"language": "nb",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 768,
"language": "nb",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 1440,
"language": "en",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 1440,
"language": "en",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 1440,
"language": "nb",
"mode": "light",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
},
{
"width": 1440,
"language": "nb",
"mode": "dark",
"translatedReviewCaption": "PASS",
"explicitReviewWithoutApply": "PASS",
"uiLanguageDistinctFromOutputLanguage": "PASS"
}
],
"errors": [],
"unexpectedWrites": [],
"writes": [],
"proposals": [
{
"width": 320,
"language": "en",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 320,
"language": "en",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 320,
"language": "nb",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 320,
"language": "nb",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 390,
"language": "en",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 390,
"language": "en",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 390,
"language": "nb",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 390,
"language": "nb",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 768,
"language": "en",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 768,
"language": "en",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 768,
"language": "nb",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 768,
"language": "nb",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 1440,
"language": "en",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 1440,
"language": "en",
"mode": "dark",
"outputLanguage": "en"
},
{
"width": 1440,
"language": "nb",
"mode": "light",
"outputLanguage": "en"
},
{
"width": 1440,
"language": "nb",
"mode": "dark",
"outputLanguage": "en"
}
],
"unavailableReads": [
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies",
"/api/companies"
],
"blockedExternal": [
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com"
],
"limits": [
"All API, AI and preview results are synthetic fixtures. No model activation, semantic translation quality, backend end-to-end or physical PDF qualification.",
"No native device, screen reader, provider, integrated security, deployment or release acceptance."
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,260 @@
{
"screens": [
{
"width": 320,
"language": "en",
"mode": "light",
"state": "saved-without-unmount",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "malformed-grant-rejected",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "same-owner-refreshed",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "wrong-owner-session-reset",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "dark",
"state": "saved-without-unmount",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "dark",
"state": "malformed-grant-rejected",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "dark",
"state": "same-owner-refreshed",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "dark",
"state": "wrong-owner-session-reset",
"violations": []
},
{
"width": 320,
"language": "nb",
"mode": "light",
"state": "saved-without-unmount",
"violations": []
},
{
"width": 320,
"language": "nb",
"mode": "light",
"state": "malformed-grant-rejected",
"violations": [
{
"id": "scrollable-region-focusable",
"impact": "serious",
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3",
"RGAAv4",
"RGAA-7.3.2"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard in Safari",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.13/scrollable-region-focusable?application=playwright",
"nodes": [
{
"any": [
{
"id": "focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element should have focusable content"
},
{
"id": "focusable-element",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element should be focusable"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<div class=\"MuiAlert-message css-127h8j3\"><span class=\"MuiTypography-root MuiTypography-body1 css-14fcedb\">KI-hjelp er utilgjengelig</span> Du kan fortsette å redigere manuelt. Se gjennom KI-innstillingene og forbruket ditt før du prøver igjen.</div>",
"target": [
".css-xf0dje > .MuiAlert-message.css-127h8j3"
],
"failureSummary": "Fix any of the following:\n Element should have focusable content\n Element should be focusable"
}
]
}
]
}
],
"journeys": [
{
"width": 320,
"language": "en",
"mode": "light",
"formNodeAndDraftRetained": "PASS",
"malformedGrantRejected": "PASS",
"wrongIdentityResetsPrivateSession": "PASS",
"validServerAvailabilityWithoutReload": "PASS",
"noInference": "PASS"
},
{
"width": 320,
"language": "en",
"mode": "dark",
"formNodeAndDraftRetained": "PASS",
"malformedGrantRejected": "PASS",
"wrongIdentityResetsPrivateSession": "PASS",
"validServerAvailabilityWithoutReload": "PASS",
"noInference": "PASS"
}
],
"errors": [],
"unexpectedWrites": [],
"preferenceWrites": [
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": false
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": true
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": true
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": false
},
{
"width": 320,
"language": "en",
"mode": "dark",
"enabled": false
},
{
"width": 320,
"language": "en",
"mode": "dark",
"enabled": true
},
{
"width": 320,
"language": "en",
"mode": "dark",
"enabled": true
},
{
"width": 320,
"language": "en",
"mode": "dark",
"enabled": false
},
{
"width": 320,
"language": "nb",
"mode": "light",
"enabled": false
},
{
"width": 320,
"language": "nb",
"mode": "light",
"enabled": true
}
],
"wrongIdentities": [
{
"width": 320,
"language": "en",
"mode": "light"
},
{
"width": 320,
"language": "en",
"mode": "dark"
}
],
"malformedEntitlements": [
{
"width": 320,
"language": "en",
"mode": "light"
},
{
"width": 320,
"language": "en",
"mode": "dark"
},
{
"width": 320,
"language": "nb",
"mode": "light"
}
],
"previewReads": 5,
"blockedExternal": [
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com",
"https://fonts.googleapis.com"
],
"unavailableReads": [
"/api/companies",
"/api/cv/themes/modern/preview",
"/api/cv/themes/modern/preview",
"/api/companies",
"/api/cv/themes/modern/preview",
"/api/cv/themes/modern/preview",
"/api/companies",
"/api/cv/themes/modern/preview"
],
"limits": [
"Preferences, identity and preview responses are fixtures. No model/provider activation, real entitlement/security/production qualification.",
"Only the expected synthetic privacy PUTs are accepted; no generation/apply/document/canonical-profile writes."
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,47 @@
{
"screens": [
{
"width": 320,
"language": "en",
"mode": "light",
"state": "saved-without-unmount",
"violations": []
}
],
"journeys": [],
"errors": [],
"unexpectedWrites": [],
"preferenceWrites": [
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": false
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": true
}
],
"wrongIdentities": [
{
"width": 320,
"language": "en",
"mode": "light"
}
],
"previewReads": 0,
"blockedExternal": [
"https://fonts.googleapis.com",
"https://fonts.googleapis.com"
],
"unavailableReads": [
"/api/companies"
],
"limits": [
"Preferences, identity and preview responses are fixtures. No model/provider activation, real entitlement/security/production qualification.",
"Only the expected synthetic privacy PUTs are accepted; no generation/apply/document/canonical-profile writes."
]
}
@@ -0,0 +1,100 @@
{
"screens": [
{
"width": 320,
"language": "en",
"mode": "light",
"state": "saved-without-unmount",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "malformed-grant-rejected",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "same-owner-refreshed",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "wrong-owner-session-reset",
"violations": []
}
],
"journeys": [
{
"width": 320,
"language": "en",
"mode": "light",
"formNodeAndDraftRetained": "PASS",
"malformedGrantRejected": "PASS",
"wrongIdentityResetsPrivateSession": "PASS",
"validServerAvailabilityWithoutReload": "PASS",
"noInference": "PASS"
}
],
"errors": [],
"unexpectedWrites": [],
"preferenceWrites": [
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": false
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": true
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": true
},
{
"width": 320,
"language": "en",
"mode": "light",
"enabled": false
}
],
"wrongIdentities": [
{
"width": 320,
"language": "en",
"mode": "light"
}
],
"malformedEntitlements": [
{
"width": 320,
"language": "en",
"mode": "light"
}
],
"previewReads": 2,
"blockedExternal": [
"https://fonts.googleapis.com",
"https://fonts.googleapis.com"
],
"unavailableReads": [
"/api/companies",
"/api/cv/themes/modern/preview",
"/api/cv/themes/modern/preview"
],
"limits": [
"Preferences, identity and preview responses are fixtures. No model/provider activation, real entitlement/security/production qualification.",
"Only the expected synthetic privacy PUTs are accepted; no generation/apply/document/canonical-profile writes."
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Some files were not shown because too many files have changed in this diff Show More