docs: consolidate repository guides and preserve audit history

This commit is contained in:
cesnimda
2026-09-11 14:22:41 +02:00
parent 115441a409
commit 682a3028bb
404 changed files with 3402 additions and 2621 deletions
@@ -14,7 +14,7 @@ namespace JobTrackerApi.Services;
//
// The flow is strictly one-directional — CareerProfile -> CvVariant -> application output. Nothing
// here writes upward: no method touches CareerProfile or its children.
// docs/architecture/application-workspace.md.
// docs/architecture/overview.md.
public sealed record ApplicationCvDto(
int? AttachedVariantId,
string? AttachedVariantName,
@@ -12,7 +12,7 @@ namespace JobTrackerApi.Services;
// /readiness endpoint computes, and are re-synced on every read, so "readiness says X is missing" and
// "the checklist says X is pending" cannot drift apart. Readiness keeps its API contract and becomes
// the calculation; the checklist is what the user actually works from and edits.
// docs/architecture/application-workspace.md.
// docs/architecture/overview.md.
public sealed record ChecklistItemDto(
int Id,
string? SystemKey,
@@ -18,7 +18,7 @@ namespace JobTrackerApi.Services;
// The AI narrative is deliberately NOT here: it stays in AiWorkspaceService's "job-analysis" and
// "career-match" modules, which are suggestion-only, append-only (AiInteraction is the version
// history), and require the user to act on them. Nothing in this file writes to the CareerProfile,
// a CvVariant, or the JobApplication. docs/architecture/application-workspace.md.
// a CvVariant, or the JobApplication. docs/architecture/overview.md.
public sealed record JobAnalysisDto(
string? Role,
string? Company,
@@ -10,7 +10,7 @@ namespace JobTrackerApi.Services;
// writes nothing, stores nothing, and adds no table. It turns rows like
// ("StatusChanged", "Applied", "Interview") into a sentence, tags each event with a category and
// whether it is a milestone, and groups the result by day so the workspace can render a real
// timeline instead of a flat list. docs/architecture/application-workspace.md.
// timeline instead of a flat list. docs/architecture/overview.md.
public sealed record TimelineEventDto(
int Id,
string Type,
@@ -9,7 +9,7 @@ namespace JobTrackerApi.Services;
// This is an AGGREGATE READ ONLY. It owns no data and duplicates none: the CV comes from the Phase 4
// CvVariant lens, documents from Attachments, activity from JobEvent, AI history from AiInteraction,
// stage semantics from JobPipeline. Nothing here writes, and no career data is copied.
// docs/architecture/application-workspace.md.
// docs/architecture/overview.md.
public sealed record WorkspaceCvDto(int? VariantId, string? VariantName, string? ThemeId, bool HasTailoredCvText, DateTimeOffset? UpdatedAtUtc);
public sealed record WorkspaceActivityDto(string Type, string? Detail, DateTime At);
public sealed record WorkspaceNextStepDto(string Key, string Label, string Reason, string? Section);
+1 -1
View File
@@ -9,7 +9,7 @@ namespace JobTrackerApi.Services;
// the anonymous /health endpoint. /health used to read the APP_VERSION *environment
// variable* directly, which compose never sets under that name — it passes App__Version,
// binding to the App:Version configuration key. So /health always reported "unknown".
// See docs/release-candidate-review.md (N2).
// See docs/infrastructure/deployment.md for the health/version verification contract.
public static class BuildMetadata
{
// Ignore unresolved shell/compose placeholders that would otherwise leak into the
@@ -6,7 +6,7 @@ namespace JobTrackerApi.Services;
// Phase 3: two-way projection between the relational CareerProfile children and the
// StructuredCvProfile shape (the derived blob + the frontend/AI edit unit).
// See docs/architecture/career-profile-model.md.
// See docs/architecture/overview.md.
//
// Relational holds: Experience, Education, Skill, Project, Certification, Language.
// LongTailJson holds the rest of StructuredCvProfile: Contact, Summary, Interests, OtherSections,
@@ -5,7 +5,7 @@ using Microsoft.EntityFrameworkCore;
namespace JobTrackerApi.Services;
// Career Workspace foundation (see docs/career-workspace-implementation-roadmap.md, Phase F1).
// Career Workspace foundation (see docs/roadmap/todo.md).
// Bounded to the profile/CV domain -- job tracking is untouched. Every existing read path still
// goes through ApplicationUser.ProfileCvStructureJson (dual-write window); this service is the
// single place stable item IDs and normalized dates get assigned, and where profile history is
@@ -3,7 +3,7 @@ namespace JobTrackerApi.Services.EmailProviders
/// <summary>
/// Provider-neutral email operations so job correspondence can be sourced from Gmail,
/// Microsoft Graph, generic IMAP, or manual/free-text entry behind a single seam.
/// See docs/remaster/PRODUCT_DIRECTION.md (multi-provider email). Gmail is the first
/// See docs/architecture/integrations.md (multi-provider email). Gmail is the first
/// implementation (<see cref="GmailProvider"/>); the controller migration and additional
/// providers land in follow-up slices.
/// </summary>
@@ -13,7 +13,7 @@ namespace JobTrackerApi.Services;
//
// Follow-ups reuse what already exists: JobApplication.FollowUpAt for the date (RulesEngine and the
// reminder hosted service already act on it) and ApplicationChecklistItem for the task. No second
// reminder system. docs/architecture/application-workspace.md.
// reminder system. docs/architecture/overview.md.
public sealed record InterviewPrepItemDto(
int Id,
string Category,
+1 -1
View File
@@ -11,7 +11,7 @@ namespace JobTrackerApi.Services;
//
// Events are derived from the TRANSITION, not from the resulting state, so one user action produces
// at most one lifecycle event and re-saving an unchanged status produces none.
// docs/architecture/application-workspace.md.
// docs/architecture/overview.md.
public static class JobLifecycleEvents
{
/// <summary>
@@ -121,7 +121,7 @@ public static class StartupInitializationExtensions
// migration-owned tables do not exist yet. Repairing an absent table is not this pass's job --
// it is skipped, Migrate() creates it, and the post-Migrate pass then finds it and reconciles.
// Without this guard a clean MariaDB install died on "Table 'CareerProfiles' doesn't exist".
// See docs/infrastructure/database-ownership.md.
// See docs/database/migrations.md.
private static void EnsureMySqlIndex(DbConnection c, string table, string indexName, string columnsSql, bool unique = false)
{
if (!HasMySqlTable(c, table)) return;
@@ -276,7 +276,7 @@ public static class StartupInitializationExtensions
// the migration-created tables and finishes compatibility repair.
//
// Every statement in here is existence-guarded, so running it twice is a no-op scan on an
// already-correct database. docs/infrastructure/database-ownership.md.
// already-correct database. docs/database/migrations.md.
void ReconcileSchema()
{
if (useSqliteBootstrap)
+1 -1
View File
@@ -15,7 +15,7 @@ public interface IThemedCvRenderer
// ONE render path for every theme. The theme (data) drives layout, palette, typography and spacing;
// the variant settings apply a few runtime overrides (accent, fonts, density, page size, photo,
// icons, page numbers). Adding a theme never touches this file. docs/architecture/cv-theme-engine.md.
// icons, page numbers). Adding a theme never touches this file. docs/architecture/frontend.md.
public sealed class ThemedCvRenderer : IThemedCvRenderer
{
public ThemedCvRenderResult Render(CvRenderModel model, CvTheme theme, CvVariantSettings settings)