Add Timeline documentation pages (about, guide, tech)
3 new public pages matching the korrespond doc pattern: timeline-about.php (marketing), timeline-guide.php (user guide), timeline-tech.php (tech showcase). Hero images + 4 screenshots in assets/images/timeline/. Doc links added to timeline.php and preview.php?tool=timeline. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 78 KiB |
@@ -574,6 +574,14 @@ $sample = $samples[$slug];
|
||||
<span style="color:rgba(255,255,255,0.4);">·</span>
|
||||
<a href="/korrespond-tech.php" style="color:#fff; opacity:0.85; font-size:0.88rem; text-decoration:none; border-bottom:1px solid rgba(255,255,255,0.4); padding-bottom:2px;">How it works</a>
|
||||
</div>
|
||||
<?php elseif ($slug === 'timeline'): ?>
|
||||
<div style="margin-top:1.5rem; padding-top:1.5rem; border-top:1px solid rgba(255,255,255,0.15); display:flex; gap:1rem; flex-wrap:wrap; justify-content:center;">
|
||||
<a href="/timeline-about.php" style="color:#fff; opacity:0.85; font-size:0.88rem; text-decoration:none; border-bottom:1px solid rgba(255,255,255,0.4); padding-bottom:2px;">About Timeline</a>
|
||||
<span style="color:rgba(255,255,255,0.4);">·</span>
|
||||
<a href="/timeline-guide.php" style="color:#fff; opacity:0.85; font-size:0.88rem; text-decoration:none; border-bottom:1px solid rgba(255,255,255,0.4); padding-bottom:2px;">User guide</a>
|
||||
<span style="color:rgba(255,255,255,0.4);">·</span>
|
||||
<a href="/timeline-tech.php" style="color:#fff; opacity:0.85; font-size:0.88rem; text-decoration:none; border-bottom:1px solid rgba(255,255,255,0.4); padding-bottom:2px;">How it works</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="lt-preview-cta__tools">
|
||||
|
||||
@@ -0,0 +1,259 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
require_once __DIR__ . '/includes/bootstrap.php';
|
||||
|
||||
$uiLang = dbnToolsCurrentLanguage();
|
||||
$isAuthed = dbnToolsIsAuthenticated();
|
||||
$langPath = '/timeline-about.php';
|
||||
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/timeline.php');
|
||||
$registerUrl = 'https://dobetternorge.no/register.php';
|
||||
$ctaUrl = $isAuthed ? '/timeline.php' : ($toolsLogin);
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="<?= htmlspecialchars($uiLang) ?>">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Timeline — Every date in your case, instantly mapped · Do Better Norge Tools</title>
|
||||
<meta name="description" content="Timeline extracts every temporal event from Norwegian legal documents into a sortable, confidence-scored chronology. Recognises 12+ date formats, classifies by type and confidence, surfaces next steps.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://tools.dobetternorge.no/timeline-about.php">
|
||||
<meta property="og:title" content="Timeline — AI date extraction for Norwegian legal documents">
|
||||
<meta property="og:description" content="AI timeline tool for Norwegian case notes, court decisions, and correspondence. Extracts absolute, relative, and recurring dates with confidence scoring.">
|
||||
<meta property="og:type" content="website">
|
||||
<meta name="theme-color" content="#00205B">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
|
||||
<link rel="stylesheet" href="assets/css/tools.css">
|
||||
</head>
|
||||
<body class="kdoc-page">
|
||||
|
||||
<header class="lt-nav">
|
||||
<a href="https://dobetternorge.no" class="lt-nav__brand">
|
||||
<picture>
|
||||
<source srcset="assets/images/logo-header.webp" type="image/webp">
|
||||
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
|
||||
</picture>
|
||||
<span class="lt-nav__badge">Legal Tools</span>
|
||||
</a>
|
||||
<div class="lt-nav__right">
|
||||
<nav class="shell-lang-switcher" aria-label="Language">
|
||||
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
|
||||
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
|
||||
<?php endforeach; ?>
|
||||
</nav>
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php" class="lt-nav__cta lt-nav__cta--enter">Open Timeline →</a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta">Sign in</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<nav class="kdoc-doc-nav" aria-label="Timeline documentation">
|
||||
<div class="kdoc-doc-nav__inner">
|
||||
<a href="/timeline-about.php" class="is-active">About</a>
|
||||
<a href="/timeline-guide.php">User guide</a>
|
||||
<a href="/timeline-tech.php">How it works</a>
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php">← Open the tool</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.82),rgba(0,20,60,0.88)), url('assets/images/timeline/hero-marketing.png') center/cover no-repeat;">
|
||||
<div class="kdoc-hero__inner">
|
||||
<p class="kdoc-hero__kicker">Events · Deadlines · Milestones</p>
|
||||
<h1 class="kdoc-hero__title">Every date in your case, instantly mapped.</h1>
|
||||
<p class="kdoc-hero__sub">Timeline reads Norwegian case notes, court decisions, and correspondence — then extracts every temporal reference into a sortable, confidence-scored chronology. Know what happened, when, and what comes next.</p>
|
||||
|
||||
<div class="kdoc-hero__stats">
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>12+</strong>
|
||||
<span>date formats recognised</span>
|
||||
</div>
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>5</strong>
|
||||
<span>event types classified</span>
|
||||
</div>
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>4</strong>
|
||||
<span>focus filter modes</span>
|
||||
</div>
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>3</strong>
|
||||
<span>confidence levels</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="kdoc-hero__ctas">
|
||||
<a href="<?= htmlspecialchars($ctaUrl) ?>" class="kdoc-btn-primary">Try Timeline free →</a>
|
||||
<a href="/timeline-guide.php" class="kdoc-btn-secondary">User guide</a>
|
||||
<a href="/timeline-tech.php" class="kdoc-btn-secondary">How it works</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- What you get -->
|
||||
<section class="kdoc-section--alt">
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">What you get</p>
|
||||
<h2 class="kdoc-section__title">Three things that change how you read a case.</h2>
|
||||
<div class="kdoc-features">
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">📅</span>
|
||||
<h3 class="kdoc-feature-card__title">AI date extraction</h3>
|
||||
<p class="kdoc-feature-card__body">Timeline recognises 12+ Norwegian date formats — from <code>30.07.2015</code> to <em>tre uker etter vedtaket</em> to <em>hver mandag</em>. Every temporal reference in your document is surfaced, not just the obvious calendar dates.</p>
|
||||
</div>
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">🎯</span>
|
||||
<h3 class="kdoc-feature-card__title">Confidence scoring per event</h3>
|
||||
<p class="kdoc-feature-card__body">Every extracted event is tagged HIGH, MEDIUM, or LOW confidence based on how explicitly the date appears in the source. Use the confidence filter to hide uncertain events when you need a clean, defensible timeline.</p>
|
||||
</div>
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">🔍</span>
|
||||
<h3 class="kdoc-feature-card__title">Evidence trail & next step</h3>
|
||||
<p class="kdoc-feature-card__body">Below every timeline: a full Evidence Trail listing every source document, a What Remains Uncertain list for dates the AI couldn't resolve, and a single Next Practical Step recommendation for your case.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- How it works (3-step) -->
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">How it works</p>
|
||||
<h2 class="kdoc-section__title">Upload → extract → review. In under a minute.</h2>
|
||||
<p class="kdoc-section__sub">Three steps from raw case documents to a complete, sortable timeline.</p>
|
||||
|
||||
<div class="kdoc-steps">
|
||||
<div class="kdoc-step-card">
|
||||
<span class="kdoc-step-card__num">1</span>
|
||||
<h3 class="kdoc-step-card__title">Upload documents or paste text</h3>
|
||||
<p class="kdoc-step-card__body">Upload up to 5 files (PDF, DOCX, TXT) or paste up to 128,000 characters of case text. Add optional context notes to help the AI interpret abbreviations, actor names, or document-specific date conventions.</p>
|
||||
<p class="kdoc-step-card__example">E.g. “D refers to the defendant throughout. All dates are in 2024 unless stated otherwise.”</p>
|
||||
</div>
|
||||
<span class="kdoc-step-arrow" aria-hidden="true">→</span>
|
||||
<div class="kdoc-step-card">
|
||||
<span class="kdoc-step-card__num">2</span>
|
||||
<h3 class="kdoc-step-card__title">AI extracts & classifies</h3>
|
||||
<p class="kdoc-step-card__body">The engine reads every sentence, recognising Norwegian date formats and classifying each event by type (absolute, relative, recurring, conditional, period) and assigning a confidence score. Focus filters scope the extraction to what matters most for your case.</p>
|
||||
<p class="kdoc-step-card__example">Returns structured output: date · type · confidence · actor · description · source excerpt</p>
|
||||
</div>
|
||||
<span class="kdoc-step-arrow" aria-hidden="true">→</span>
|
||||
<div class="kdoc-step-card">
|
||||
<span class="kdoc-step-card__num">3</span>
|
||||
<h3 class="kdoc-step-card__title">Review the sortable timeline</h3>
|
||||
<p class="kdoc-step-card__body">Events appear in document order or sorted chronologically. Search by keyword, filter by confidence, and review each event's source excerpt. The evidence trail and next step recommendation appear below the timeline.</p>
|
||||
<p class="kdoc-step-card__example">Sort: document order ↔ chronological · Search any keyword · Filter by confidence</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Screenshots -->
|
||||
<section class="kdoc-section--alt">
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Screenshots</p>
|
||||
<h2 class="kdoc-section__title">See it in action.</h2>
|
||||
<div class="kdoc-gallery">
|
||||
<div class="kdoc-gallery__item">
|
||||
<img src="assets/images/timeline/form-top.png" alt="Timeline form — engine selection and advanced settings panel showing Focus, Confidence, Background events, and Date types" class="kdoc-screenshot" loading="lazy">
|
||||
<p class="kdoc-gallery__caption">The form: choose engine, focus filter, confidence, background events, and date type settings.</p>
|
||||
</div>
|
||||
<div class="kdoc-gallery__item">
|
||||
<img src="assets/images/timeline/output-timeline.png" alt="Timeline output showing ABSOLUTE and PERIOD date cards with HIGH and MEDIUM confidence badges, actor names, event descriptions" class="kdoc-screenshot" loading="lazy">
|
||||
<p class="kdoc-gallery__caption">Timeline output: each event shows date, type badge, confidence badge, actor, description, and source excerpt.</p>
|
||||
</div>
|
||||
<div class="kdoc-gallery__item">
|
||||
<img src="assets/images/timeline/output-detail.png" alt="Detailed timeline events from a Barnevernet case — social workers Judith and Trude, 2025 dates" class="kdoc-screenshot" loading="lazy">
|
||||
<p class="kdoc-gallery__caption">Detailed events from a Barnevernet case, with named actors and verified source excerpts.</p>
|
||||
</div>
|
||||
<div class="kdoc-gallery__item">
|
||||
<img src="assets/images/timeline/evidence-trail.png" alt="Evidence Trail section with source documents, What Remains Uncertain list, and Next Practical Step recommendation" class="kdoc-screenshot" loading="lazy">
|
||||
<p class="kdoc-gallery__caption">Evidence Trail, What Remains Uncertain, and Next Practical Step appear below every timeline.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Fine-tuned LLM spotlight -->
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Under the hood</p>
|
||||
<h2 class="kdoc-section__title">Powered by a purpose-built legal LLM.</h2>
|
||||
<div class="kdoc-llm-spotlight">
|
||||
<div>
|
||||
<span class="kdoc-llm-spotlight__badge">Fine-tuned model</span>
|
||||
<h3 class="kdoc-llm-spotlight__title">dbn-legal-agent</h3>
|
||||
<p class="kdoc-llm-spotlight__body">A QLoRA fine-tune trained on Norwegian child-welfare and administrative law text — case notes, court decisions, and Barnevernet correspondence. Unlike a general-purpose LLM, dbn-legal-agent understands the temporal patterns of Norwegian legal proceedings: when an appeal window closes, what <em>akutt</em> means procedurally, how Fylkesnemnda milestones are sequenced. It runs on the GPU/cuttlefish engine as the local extraction backbone.</p>
|
||||
</div>
|
||||
<div class="kdoc-llm-stats">
|
||||
<div class="kdoc-llm-stat">
|
||||
<strong>QLoRA</strong>
|
||||
<span>fine-tune method</span>
|
||||
</div>
|
||||
<div class="kdoc-llm-stat">
|
||||
<strong>12+</strong>
|
||||
<span>date formats</span>
|
||||
</div>
|
||||
<div class="kdoc-llm-stat">
|
||||
<strong>5</strong>
|
||||
<span>event types</span>
|
||||
</div>
|
||||
<div class="kdoc-llm-stat">
|
||||
<strong>GPU</strong>
|
||||
<span>local engine</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Focus filter showcase -->
|
||||
<section class="kdoc-section--alt">
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Focus filters</p>
|
||||
<h2 class="kdoc-section__title">Extract only what your case needs.</h2>
|
||||
<p class="kdoc-section__sub">Four modes scope the extraction pipeline to the events that matter most for your situation.</p>
|
||||
<div class="kdoc-features">
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">📅</span>
|
||||
<h3 class="kdoc-feature-card__title">All events ★</h3>
|
||||
<p class="kdoc-feature-card__body">Default. Extracts every temporal reference in the document — background dates, operational events, deadlines, and narrative context. Best for building a complete picture from scratch.</p>
|
||||
</div>
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">⚖️</span>
|
||||
<h3 class="kdoc-feature-card__title">Legal deadlines</h3>
|
||||
<p class="kdoc-feature-card__body">Scopes extraction to filing deadlines, appeal windows, and statutory time limits. Filters out narrative and background dates. Use when you need to know exactly what dates you must act on.</p>
|
||||
</div>
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">🏛️</span>
|
||||
<h3 class="kdoc-feature-card__title">Court hearings</h3>
|
||||
<p class="kdoc-feature-card__body">Focuses on tribunal sessions, mediation dates, and court appearances. Ideal for preparing for a hearing or reconstructing the full history of proceedings.</p>
|
||||
</div>
|
||||
<div class="kdoc-feature-card">
|
||||
<span class="kdoc-feature-card__icon">👤</span>
|
||||
<h3 class="kdoc-feature-card__title">CPS milestones</h3>
|
||||
<p class="kdoc-feature-card__body">Targets Barnevernet interventions, akuttplassering dates, tiltaksplan milestones, and Fylkesnemnda proceedings. The most targeted mode for child welfare cases.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA strip -->
|
||||
<section class="kdoc-cta-strip">
|
||||
<h2 class="kdoc-cta-strip__title">Ready to map your case?</h2>
|
||||
<p class="kdoc-cta-strip__sub">Free for Do Better Norge members. No credit card required.</p>
|
||||
<div class="kdoc-hero__ctas">
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php" class="kdoc-btn-primary">Open Timeline →</a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="kdoc-btn-primary">Sign in to use Timeline →</a>
|
||||
<a href="<?= htmlspecialchars($registerUrl) ?>" class="kdoc-btn-secondary">Register free</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php require_once __DIR__ . '/includes/footer.php'; ?>
|
||||
<script src="assets/js/tools.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,343 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
require_once __DIR__ . '/includes/bootstrap.php';
|
||||
|
||||
$uiLang = dbnToolsCurrentLanguage();
|
||||
$isAuthed = dbnToolsIsAuthenticated();
|
||||
$langPath = '/timeline-guide.php';
|
||||
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/timeline.php');
|
||||
$registerUrl = 'https://dobetternorge.no/register.php';
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="<?= htmlspecialchars($uiLang) ?>">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Timeline User Guide — How to extract dates from Norwegian legal documents</title>
|
||||
<meta name="description" content="Step-by-step guide to using Timeline: choose an engine, set focus and confidence filters, upload files, read the timeline output, and interpret the evidence trail.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://tools.dobetternorge.no/timeline-guide.php">
|
||||
<meta property="og:title" content="Timeline User Guide">
|
||||
<meta property="og:description" content="How to use Timeline to extract and classify dates from Norwegian case notes, court decisions, and correspondence.">
|
||||
<meta name="theme-color" content="#00205B">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
|
||||
<link rel="stylesheet" href="assets/css/tools.css">
|
||||
</head>
|
||||
<body class="kdoc-page">
|
||||
|
||||
<header class="lt-nav">
|
||||
<a href="https://dobetternorge.no" class="lt-nav__brand">
|
||||
<picture>
|
||||
<source srcset="assets/images/logo-header.webp" type="image/webp">
|
||||
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
|
||||
</picture>
|
||||
<span class="lt-nav__badge">Legal Tools</span>
|
||||
</a>
|
||||
<div class="lt-nav__right">
|
||||
<nav class="shell-lang-switcher" aria-label="Language">
|
||||
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
|
||||
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
|
||||
<?php endforeach; ?>
|
||||
</nav>
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php" class="lt-nav__cta lt-nav__cta--enter">Open Timeline →</a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta">Sign in</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<nav class="kdoc-doc-nav" aria-label="Timeline documentation">
|
||||
<div class="kdoc-doc-nav__inner">
|
||||
<a href="/timeline-about.php">About</a>
|
||||
<a href="/timeline-guide.php" class="is-active">User guide</a>
|
||||
<a href="/timeline-tech.php">How it works</a>
|
||||
<?php if ($isAuthed): ?><a href="/timeline.php">← Open the tool</a><?php endif; ?>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.78),rgba(0,20,60,0.86)), url('assets/images/timeline/hero-guide.png') center/cover no-repeat;">
|
||||
<div class="kdoc-hero__inner">
|
||||
<p class="kdoc-hero__kicker">User Guide · Timeline</p>
|
||||
<h1 class="kdoc-hero__title">How to use Timeline.</h1>
|
||||
<p class="kdoc-hero__sub">A step-by-step walkthrough of every control — from choosing your engine and focus filter to reading the output and understanding the evidence trail.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- TOC + content -->
|
||||
<div class="kdoc-section">
|
||||
|
||||
<div class="kdoc-toc">
|
||||
<p class="kdoc-toc__title">In this guide</p>
|
||||
<ol>
|
||||
<li><a href="#engine">Choose your engine</a></li>
|
||||
<li><a href="#focus">Focus filter</a></li>
|
||||
<li><a href="#confidence">Confidence filter</a></li>
|
||||
<li><a href="#background">Background events</a></li>
|
||||
<li><a href="#datetypes">Date types</a></li>
|
||||
<li><a href="#upload">Upload files</a></li>
|
||||
<li><a href="#paste">Pasted text & context notes</a></li>
|
||||
<li><a href="#reading">Reading the timeline</a></li>
|
||||
<li><a href="#evidence">Evidence trail, uncertainty & next step</a></li>
|
||||
<li><a href="#tips">Tips & gotchas</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<!-- Step 1: Engine -->
|
||||
<div class="kdoc-guide-step" id="engine">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">1</span>
|
||||
<h2 class="kdoc-guide-step__title">Choose your engine</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>The engine controls the AI model used for extraction. Azure engines use your BNL Azure credits. The GPU engine runs the LiteLLM proxy on the local cuttlefish server with the dbn-legal-agent fine-tuned model.</p>
|
||||
</div>
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Engine</th>
|
||||
<th>Speed</th>
|
||||
<th>Best for</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Azure gpt-4o-mini ★</td>
|
||||
<td>Fast (~15 s)</td>
|
||||
<td>Default. Everyday extractions, long documents, first pass.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Azure gpt-4o</td>
|
||||
<td>Best quality (~45 s)</td>
|
||||
<td>Complex documents, overlapping events, ambiguous or poorly formatted source text.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>GPU / cuttlefish</td>
|
||||
<td>Local (~25 s)</td>
|
||||
<td>Maximum privacy. Runs entirely on local GPU with dbn-legal-agent fine-tuned model. Requires cuttlefish server online.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Step 2: Focus filter -->
|
||||
<div class="kdoc-guide-step" id="focus">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">2</span>
|
||||
<h2 class="kdoc-guide-step__title">Focus filter</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>The focus filter scopes what kinds of events the AI looks for. Found in the Advanced settings panel (click to expand).</p>
|
||||
</div>
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Mode</th>
|
||||
<th>What it extracts</th>
|
||||
<th>When to use</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>All events ★</td>
|
||||
<td>Every temporal reference in the document — background, operational, deadlines, narrative</td>
|
||||
<td>Building a complete chronology from scratch</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Legal deadlines</td>
|
||||
<td>Filing deadlines, appeal windows, statutory time limits</td>
|
||||
<td>Checking whether you've missed a deadline or when you must act next</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Court hearings</td>
|
||||
<td>Tribunal sessions, mediation dates, court appearances</td>
|
||||
<td>Preparing for a hearing or reconstructing hearing history</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>CPS milestones</td>
|
||||
<td>Barnevernet interventions, akuttplassering, tiltaksplan milestones, Fylkesnemnda proceedings</td>
|
||||
<td>Child welfare cases needing a CPS-specific chronology</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Step 3: Confidence -->
|
||||
<div class="kdoc-guide-step" id="confidence">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">3</span>
|
||||
<h2 class="kdoc-guide-step__title">Confidence filter</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>Controls whether uncertain events appear in the output. Also in the Advanced settings panel.</p>
|
||||
</div>
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>What it does</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Show all events ★</td>
|
||||
<td>Returns all extracted events including LOW-confidence ones (shown in grey). Use for a complete picture — decide yourself what to trust.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Hide low-confidence</td>
|
||||
<td>Suppresses any event the model isn't reasonably certain about. Use when you need a clean, defensible timeline for court or legal filing.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="kdoc-guide-step__body" style="margin-top:1rem;">
|
||||
<p>LOW-confidence events are typically those where the date is implied rather than stated, relative to an unclear reference point, or extracted from a degraded or ambiguous section of the source.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 4: Background events -->
|
||||
<div class="kdoc-guide-step" id="background">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">4</span>
|
||||
<h2 class="kdoc-guide-step__title">Background events</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p><strong>Default: ON (checked).</strong> When checked, historical context dates are included — dates like <em>“born 30.07.2015”</em>, <em>“met around 2011/2012”</em>, <em>“married in 2009”</em>. These establish the narrative and biographical context of a case.</p>
|
||||
<p style="margin-top:0.8rem;"><strong>When to uncheck:</strong> if you only want operational events and decisions — not biographical background. Unchecking substantially reduces event count in case notes that mix history with current proceedings. Useful when you're building a deadline tracker or action list rather than a full chronology.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 5: Date types -->
|
||||
<div class="kdoc-guide-step" id="datetypes">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">5</span>
|
||||
<h2 class="kdoc-guide-step__title">Date types</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p><strong>Default: ON (checked).</strong> When checked, relative references (<em>“tre uker etter vedtaket”</em>), recurring patterns (<em>“each Monday”</em>, <em>“every 6 months”</em>), and conditional dates (<em>“if no response within 14 days”</em>) are included alongside absolute dates.</p>
|
||||
<p style="margin-top:0.8rem;"><strong>When to uncheck:</strong> if you need only exact calendar dates — for example when exporting to a calendar app, a deadline tracker, or a court submission that requires hard dates only. Unchecking removes all events without a resolvable absolute date.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 6: Upload files -->
|
||||
<div class="kdoc-guide-step" id="upload">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">6</span>
|
||||
<h2 class="kdoc-guide-step__title">Upload files</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__screenshot">
|
||||
<img src="assets/images/timeline/form-top.png" alt="Timeline form showing engine selection, advanced settings panel, and file upload zone" class="kdoc-screenshot" style="max-width:700px;" loading="lazy">
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>Drag files onto the upload zone or click <strong>browse</strong>. A file list appears below with a Clear button to remove files.</p>
|
||||
<p style="margin-top:0.8rem;"><strong>Supported formats:</strong> <strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong>. Up to 5 files per run.</p>
|
||||
<p style="margin-top:0.8rem;">Files are extracted to text in memory. <strong>Nothing is written to disk. Nothing is retained after the session ends.</strong></p>
|
||||
<p style="margin-top:0.8rem;">Upload and pasted text can be combined — the AI reads all sources together as a single input. If a case spans multiple documents, upload them all and let the tool assemble one unified timeline.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 7: Pasted text + context notes -->
|
||||
<div class="kdoc-guide-step" id="paste">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">7</span>
|
||||
<h2 class="kdoc-guide-step__title">Pasted text & context notes</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>Paste up to <strong>128,000 characters</strong> of text into the main text area — approximately 90–100 pages of A4. This can include case notes, decision letters, correspondence, or any document containing dates.</p>
|
||||
<p style="margin-top:0.8rem;"><strong>Context notes</strong> (optional, up to 2,000 characters): use this field to guide the AI on ambiguities in your document. These notes are passed directly into the extraction prompt and are not stored. Good examples:</p>
|
||||
<ul style="margin-top:0.6rem; padding-left:1.4rem; font-size:0.9rem; line-height:1.8;">
|
||||
<li><em>“All dates are in 2024 unless stated otherwise.”</em></li>
|
||||
<li><em>“D refers to the defendant, M is the mother, BV is Barnevernet.”</em></li>
|
||||
<li><em>“The document is a summary of events, not in chronological order.”</em></li>
|
||||
<li><em>“'Vedtaket' always refers to the omsorgsovertakelse decision of 12.03.2024.”</em></li>
|
||||
<li><em>“Focus on the father's actions. Ignore events relating to the sister.”</em></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 8: Reading the output -->
|
||||
<div class="kdoc-guide-step" id="reading">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">8</span>
|
||||
<h2 class="kdoc-guide-step__title">Reading the timeline</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__screenshot">
|
||||
<img src="assets/images/timeline/output-timeline.png" alt="Timeline output showing date cards with ABSOLUTE badge, HIGH confidence, actor names, event descriptions, and source excerpts" class="kdoc-screenshot" style="max-width:800px;" loading="lazy">
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>Each event card in the timeline contains:</p>
|
||||
<ul style="padding-left:1.4rem; font-size:0.9rem; line-height:1.8; margin-top:0.5rem;">
|
||||
<li><strong>Date:</strong> the resolved date. Absolute events show a formatted date (e.g. <em>2025-04-09</em>). Relative events show the expressed reference (e.g. <em>“three weeks after the decision”</em>). Periods show start–end.</li>
|
||||
<li><strong>Date type badge:</strong> one of <code>ABSOLUTE</code> / <code>RELATIVE</code> / <code>RECURRING</code> / <code>CONDITIONAL</code> / <code>PERIOD</code>. Tells you how the date was expressed in the source.</li>
|
||||
<li><strong>Confidence badge:</strong> <code>HIGH</code> (green — clearly stated), <code>MEDIUM</code> (amber — inferred), <code>LOW</code> (grey — ambiguous). LOW events appear greyed out when "Show all" is selected.</li>
|
||||
<li><strong>Actor:</strong> the person, institution, or body the event is attributed to (named or by role).</li>
|
||||
<li><strong>Event description:</strong> a concise one-sentence summary of what happened on that date.</li>
|
||||
<li><strong>Source excerpt:</strong> the exact text from your document that produced this event.</li>
|
||||
</ul>
|
||||
<p style="margin-top:0.8rem;"><strong>Sorting:</strong> use the sort toggle above the timeline to switch between <strong>Document order</strong> (the order events appear in your source) and <strong>Chronological</strong> (oldest to newest).</p>
|
||||
<p style="margin-top:0.6rem;"><strong>Search:</strong> type any keyword to filter events. The search matches against date, actor, description, and source excerpt simultaneously.</p>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__screenshot" style="margin-top:1rem;">
|
||||
<img src="assets/images/timeline/output-detail.png" alt="Detailed timeline events with Barnevernet social workers Judith and Trude, meetings in April and May 2025" class="kdoc-screenshot" style="max-width:800px;" loading="lazy">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 9: Evidence trail -->
|
||||
<div class="kdoc-guide-step" id="evidence">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">9</span>
|
||||
<h2 class="kdoc-guide-step__title">Evidence trail, uncertainty & next step</h2>
|
||||
</div>
|
||||
<div class="kdoc-guide-step__screenshot">
|
||||
<img src="assets/images/timeline/evidence-trail.png" alt="Evidence Trail section with three source documents listed, What Remains Uncertain bullet list, and Next Practical Step recommendation" class="kdoc-screenshot" style="max-width:700px;" loading="lazy">
|
||||
</div>
|
||||
<div class="kdoc-guide-step__body">
|
||||
<p>Three sub-sections appear below every timeline:</p>
|
||||
<ul style="padding-left:1.4rem; font-size:0.9rem; line-height:1.9; margin-top:0.5rem;">
|
||||
<li><strong>Evidence Trail:</strong> lists every source document (or paste) that contributed events, with a title and excerpt identifying the source. Use this to verify that all your documents were processed and to trace any event back to its origin.</li>
|
||||
<li><strong>What Remains Uncertain:</strong> a bulleted list of dates the AI could not fully resolve — undated events, events with ambiguous years, relative dates with no resolvable anchor. This is what you still need to verify or obtain manually.</li>
|
||||
<li><strong>Next Practical Step:</strong> a single AI-generated recommended action based on the overall timeline — for example: <em>“Verify whether the 6-week appeal window from the 12.03.2024 omsorgsovertakelse has elapsed and document any missed deadline formally.”</em></li>
|
||||
</ul>
|
||||
<p style="margin-top:0.8rem;">The disclaimer at the bottom confirms that Timeline provides <em>preparation support</em>, not legal advice.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tips -->
|
||||
<div class="kdoc-guide-step" id="tips">
|
||||
<div class="kdoc-guide-step__header">
|
||||
<span class="kdoc-guide-step__num">10</span>
|
||||
<h2 class="kdoc-guide-step__title">Tips & gotchas</h2>
|
||||
</div>
|
||||
<div class="kdoc-tips">
|
||||
<div class="kdoc-tip"><strong>Use context notes for abbreviations.</strong> If your document uses internal abbreviations (D, M, BV, BH, the father, the case worker) consistently, naming them in the context notes dramatically improves actor attribution across all events.</div>
|
||||
<div class="kdoc-tip"><strong>Combine upload and paste for best coverage.</strong> Upload the main decision letter and paste related case notes into the text area. The AI reads all sources together and produces one unified timeline.</div>
|
||||
<div class="kdoc-tip"><strong>Run All events first, then re-run with focus.</strong> Start with the default "All events" mode to see the full picture. Then re-run with a specific focus mode (e.g. Legal deadlines) if you need a filtered view for a submission.</div>
|
||||
<div class="kdoc-tip"><strong>Date types off for clean deadline lists.</strong> If you're exporting to a calendar or deadline tracker, uncheck "Date types" to return only resolved calendar dates — no relative or recurring entries to sort through.</div>
|
||||
<div class="kdoc-tip"><strong>GPU engine for maximum privacy.</strong> The cuttlefish engine processes entirely locally using dbn-legal-agent — nothing leaves your network. Use it for the most sensitive case material.</div>
|
||||
<div class="kdoc-tip"><strong>LOW confidence isn't wrong — it's uncertain.</strong> A LOW confidence event may still be correct and important. Read the source excerpt for each LOW event before dismissing it — the AI may have found a real date that was just expressed ambiguously.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /kdoc-section -->
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="kdoc-cta-strip">
|
||||
<h2 class="kdoc-cta-strip__title">Ready to try it?</h2>
|
||||
<p class="kdoc-cta-strip__sub">Free for Do Better Norge members.</p>
|
||||
<div class="kdoc-hero__ctas">
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php" class="kdoc-btn-primary">Open Timeline →</a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="kdoc-btn-primary">Sign in to use Timeline →</a>
|
||||
<a href="<?= htmlspecialchars($registerUrl) ?>" class="kdoc-btn-secondary">Register free</a>
|
||||
<?php endif; ?>
|
||||
<a href="/timeline-tech.php" class="kdoc-btn-secondary">How it works under the hood</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php require_once __DIR__ . '/includes/footer.php'; ?>
|
||||
<script src="assets/js/tools.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,419 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
require_once __DIR__ . '/includes/bootstrap.php';
|
||||
|
||||
$uiLang = dbnToolsCurrentLanguage();
|
||||
$isAuthed = dbnToolsIsAuthenticated();
|
||||
$langPath = '/timeline-tech.php';
|
||||
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/timeline.php');
|
||||
$registerUrl = 'https://dobetternorge.no/register.php';
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="<?= htmlspecialchars($uiLang) ?>">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>How Timeline works — 3-pass extraction, Norwegian date recognition, fine-tuned LLM</title>
|
||||
<meta name="description" content="Technical deep-dive: how Timeline uses a 3-pass pipeline to extract and classify temporal events from Norwegian legal documents, with 12+ date format recognition and confidence scoring.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://tools.dobetternorge.no/timeline-tech.php">
|
||||
<meta property="og:title" content="How Timeline works — AI date extraction pipeline">
|
||||
<meta property="og:description" content="Rule-based pre-pass, LLM extraction, and post-processing. Norwegian date format recognition, event classification schema, multi-engine support.">
|
||||
<meta name="theme-color" content="#00205B">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap">
|
||||
<link rel="stylesheet" href="assets/css/tools.css">
|
||||
</head>
|
||||
<body class="kdoc-page">
|
||||
|
||||
<header class="lt-nav">
|
||||
<a href="https://dobetternorge.no" class="lt-nav__brand">
|
||||
<picture>
|
||||
<source srcset="assets/images/logo-header.webp" type="image/webp">
|
||||
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
|
||||
</picture>
|
||||
<span class="lt-nav__badge">Legal Tools</span>
|
||||
</a>
|
||||
<div class="lt-nav__right">
|
||||
<nav class="shell-lang-switcher" aria-label="Language">
|
||||
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
|
||||
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
|
||||
<?php endforeach; ?>
|
||||
</nav>
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php" class="lt-nav__cta lt-nav__cta--enter">Open Timeline →</a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta">Sign in</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<nav class="kdoc-doc-nav" aria-label="Timeline documentation">
|
||||
<div class="kdoc-doc-nav__inner">
|
||||
<a href="/timeline-about.php">About</a>
|
||||
<a href="/timeline-guide.php">User guide</a>
|
||||
<a href="/timeline-tech.php" class="is-active">How it works</a>
|
||||
<?php if ($isAuthed): ?><a href="/timeline.php">← Open the tool</a><?php endif; ?>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="kdoc-hero" style="background: linear-gradient(rgba(5,15,40,0.85),rgba(5,15,40,0.92)), url('assets/images/timeline/hero-tech.png') center/cover no-repeat;">
|
||||
<div class="kdoc-hero__inner">
|
||||
<p class="kdoc-hero__kicker">Technical Showcase · How the AI reads time</p>
|
||||
<h1 class="kdoc-hero__title">How Timeline knows when things happened.</h1>
|
||||
<p class="kdoc-hero__sub">A full walkthrough of the 3-pass extraction pipeline, Norwegian date format recognition, event classification schema, multi-engine architecture, and the fine-tuned dbn-legal-agent model.</p>
|
||||
|
||||
<div class="kdoc-hero__stats">
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>12+</strong>
|
||||
<span>date formats</span>
|
||||
</div>
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>5</strong>
|
||||
<span>event types</span>
|
||||
</div>
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>3</strong>
|
||||
<span>pipeline passes</span>
|
||||
</div>
|
||||
<div class="kdoc-hero__stat">
|
||||
<strong>3</strong>
|
||||
<span>engine options</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Architecture overview -->
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Architecture</p>
|
||||
<h2 class="kdoc-section__title">Three passes. Each with a distinct job.</h2>
|
||||
<p class="kdoc-section__sub">The pipeline is intentionally sequential — Pass 1 is rule-based and near-instant; Pass 2 is the LLM extraction; Pass 3 post-processes and scores the output.</p>
|
||||
|
||||
<div class="kdoc-pipeline">
|
||||
<div class="kdoc-pipeline__pass">
|
||||
<span class="kdoc-pipeline__pass-badge kdoc-pipeline__pass-badge--mini">Pass 1 · PHP / regex</span>
|
||||
<h3 class="kdoc-pipeline__pass-title">Detect & normalise known formats</h3>
|
||||
<p class="kdoc-pipeline__pass-body">A deterministic pattern-matching pass runs before any LLM call. It scans the full input for dates matching 12+ Norwegian formats and normalises them to ISO 8601:</p>
|
||||
<ul>
|
||||
<li><code>dd.mm.yyyy</code> → <code>YYYY-MM-DD</code></li>
|
||||
<li><code>d. månedsnavn yyyy</code> → resolved calendar date</li>
|
||||
<li>Diary-format lines (starting with a date + colon) → auto-tagged as events</li>
|
||||
<li>Two-digit years → always interpreted as <code>20YY</code></li>
|
||||
</ul>
|
||||
<p class="kdoc-pipeline__pass-body" style="margin-top:0.7rem;">Normalised anchors are injected into the LLM prompt to reduce hallucinated or misread dates.</p>
|
||||
</div>
|
||||
<div class="kdoc-pipeline__arrow-down" aria-hidden="true">→</div>
|
||||
<div class="kdoc-pipeline__pass">
|
||||
<span class="kdoc-pipeline__pass-badge">Pass 2 · gpt-4o-mini / gpt-4o / dbn-legal-agent</span>
|
||||
<h3 class="kdoc-pipeline__pass-title">Extract, classify & score</h3>
|
||||
<p class="kdoc-pipeline__pass-body">The LLM reads the full document alongside the pre-pass anchors. For every temporal reference it returns a structured JSON event object:</p>
|
||||
<ul>
|
||||
<li><code>date</code> — resolved ISO date, or verbatim string if unresolvable</li>
|
||||
<li><code>date_type</code> — <code>absolute</code> | <code>relative</code> | <code>recurring</code> | <code>conditional</code> | <code>period</code></li>
|
||||
<li><code>confidence</code> — <code>high</code> | <code>medium</code> | <code>low</code></li>
|
||||
<li><code>actor</code> — attributed entity (from source text, not inferred)</li>
|
||||
<li><code>description</code> — one-sentence event summary</li>
|
||||
<li><code>source_excerpt</code> — verbatim text fragment (max 200 chars)</li>
|
||||
</ul>
|
||||
<p class="kdoc-pipeline__pass-body" style="margin-top:0.7rem;">The prompt explicitly instructs the model not to invent dates or actors not present in the source. Temperature is set to 0.1 for deterministic output.</p>
|
||||
</div>
|
||||
<div class="kdoc-pipeline__arrow-down" aria-hidden="true">→</div>
|
||||
<div class="kdoc-pipeline__pass">
|
||||
<span class="kdoc-pipeline__pass-badge kdoc-pipeline__pass-badge--optional">Pass 3 · PHP post-processor</span>
|
||||
<h3 class="kdoc-pipeline__pass-title">Filter, sort & assemble</h3>
|
||||
<p class="kdoc-pipeline__pass-body">PHP applies all active filters before returning the result:</p>
|
||||
<ul>
|
||||
<li><strong>Focus filter</strong> — strips events not matching the requested focus mode (deadlines / hearings / CPS)</li>
|
||||
<li><strong>Confidence filter</strong> — removes LOW-confidence events if requested</li>
|
||||
<li><strong>Background filter</strong> — strips background/narrative events if unchecked</li>
|
||||
<li><strong>Date-type filter</strong> — strips relative/recurring events if unchecked</li>
|
||||
</ul>
|
||||
<p class="kdoc-pipeline__pass-body" style="margin-top:0.7rem;">The post-processor then assembles the <code>what_remains_uncertain</code> list and the <code>next_practical_step</code> recommendation.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Date recognition -->
|
||||
<section class="kdoc-section--alt">
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Date recognition</p>
|
||||
<h2 class="kdoc-section__title">12+ Norwegian date formats, all recognised.</h2>
|
||||
<p class="kdoc-section__sub">Norwegian legal documents use a wide variety of date notations. The Pass 1 pre-pass recognises all of these deterministically; the LLM handles the rest in Pass 2.</p>
|
||||
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Format</th>
|
||||
<th>Example</th>
|
||||
<th>Notes</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>dd.mm.yyyy</code></td>
|
||||
<td>30.07.2015</td>
|
||||
<td>Standard Norwegian numeric</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>dd.mm.yy</code></td>
|
||||
<td>09.04.25</td>
|
||||
<td>Two-digit year → always 20YY</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>d. månedsnavn yyyy</code></td>
|
||||
<td>3. mars 2024</td>
|
||||
<td>Written month in bokmål/nynorsk</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>d. månedsnavn</code></td>
|
||||
<td>15. januar</td>
|
||||
<td>Year inferred by proximity scanning</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>yyyy-mm-dd</code></td>
|
||||
<td>2024-03-12</td>
|
||||
<td>ISO 8601</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>månedsnavn yyyy</code></td>
|
||||
<td>mars 2024</td>
|
||||
<td>Month + year only</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>yyyy</code></td>
|
||||
<td>2024</td>
|
||||
<td>Year-only reference</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Season + year</td>
|
||||
<td>høsten 2023</td>
|
||||
<td>Seasonal reference → Q3/Q4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Diary-format line</td>
|
||||
<td>18.09.2025: Møte avholdt</td>
|
||||
<td>Date + colon → auto-tagged as event</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Relative reference</td>
|
||||
<td>tre uker etter vedtaket</td>
|
||||
<td>Anchored to nearest resolved event</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Recurring pattern</td>
|
||||
<td>hver mandag</td>
|
||||
<td>Classified as <code>recurring</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Period / range</td>
|
||||
<td>fra mars til juni 2024</td>
|
||||
<td>Yields <code>start_date</code> + <code>end_date</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Classification schema -->
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Classification schema</p>
|
||||
<h2 class="kdoc-section__title">Five event types. Three confidence levels.</h2>
|
||||
|
||||
<h3 style="font-family:'Crimson Pro',serif; font-size:1.15rem; font-weight:700; margin:0 0 0.8rem; color:var(--dbn-blue);">date_type values</h3>
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>date_type</th>
|
||||
<th>Definition</th>
|
||||
<th>Example</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>absolute</code></td>
|
||||
<td>A specific, resolvable calendar date</td>
|
||||
<td><em>30.07.2015</em> → 2015-07-30</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>relative</code></td>
|
||||
<td>A date expressed relative to another event</td>
|
||||
<td><em>tre uker etter vedtaket</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>recurring</code></td>
|
||||
<td>A pattern that repeats on a schedule</td>
|
||||
<td><em>each Monday</em>, <em>every 6 months</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>conditional</code></td>
|
||||
<td>A date contingent on a condition being met</td>
|
||||
<td><em>if no response within 14 days</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>period</code></td>
|
||||
<td>A date range or duration with start and end</td>
|
||||
<td><em>fra mars til juni 2024</em></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 style="font-family:'Crimson Pro',serif; font-size:1.15rem; font-weight:700; margin:2rem 0 0.8rem; color:var(--dbn-blue);">confidence levels</h3>
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>confidence</th>
|
||||
<th>Meaning</th>
|
||||
<th>Visual in timeline</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>high</code></td>
|
||||
<td>Date is explicitly and unambiguously stated in the source text</td>
|
||||
<td>Green badge</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>medium</code></td>
|
||||
<td>Date is inferred, approximate, or stated with slight ambiguity</td>
|
||||
<td>Amber badge</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>low</code></td>
|
||||
<td>Date is implied, undated, or extracted from a degraded/ambiguous passage</td>
|
||||
<td>Grey badge</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 style="font-family:'Crimson Pro',serif; font-size:1.15rem; font-weight:700; margin:2rem 0 0.8rem; color:var(--dbn-blue);">Actor attribution rules</h3>
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Rule</th>
|
||||
<th>Example</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Named entity in the same sentence</td>
|
||||
<td><em>“Trude [saksbehandler] ringte 14. mars”</em> → actor: Trude</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Role label without a name</td>
|
||||
<td><em>“Barnevernet fattet vedtak”</em> → actor: Barnevernet</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No clear attribution in sentence</td>
|
||||
<td>actor: <code>[unattributed]</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Document-level default</td>
|
||||
<td>If no per-event actor, defaults to the document sender/issuing body</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Multi-engine -->
|
||||
<section class="kdoc-section--alt">
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Engines</p>
|
||||
<h2 class="kdoc-section__title">Three engines, one structured output.</h2>
|
||||
<p class="kdoc-section__sub">All engines return the same JSON schema — the post-processor handles all three identically. Engine choice affects speed, quality, and privacy only.</p>
|
||||
|
||||
<table class="kdoc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Engine</th>
|
||||
<th>Model</th>
|
||||
<th>Latency</th>
|
||||
<th>Best for</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Azure gpt-4o-mini ★</td>
|
||||
<td><code>gpt-4o-mini</code> (Azure West Europe)</td>
|
||||
<td>~15 s</td>
|
||||
<td>Default. Fast, cost-efficient, handles most legal documents well.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Azure gpt-4o</td>
|
||||
<td><code>gpt-4o</code> (Azure West Europe)</td>
|
||||
<td>~45 s</td>
|
||||
<td>Complex documents, overlapping events, poor-quality or dense source text.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>GPU / cuttlefish</td>
|
||||
<td><code>dbn-legal-agent</code> via LiteLLM proxy</td>
|
||||
<td>~25 s</td>
|
||||
<td>Maximum privacy. Entirely local. Fine-tuned on Norwegian legal corpus.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Fine-tuned LLM -->
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Fine-tuned model</p>
|
||||
<h2 class="kdoc-section__title">dbn-legal-agent: trained on Norwegian legal text.</h2>
|
||||
|
||||
<div class="kdoc-finetune">
|
||||
<span class="kdoc-finetune__badge">QLoRA fine-tune</span>
|
||||
<h3 class="kdoc-finetune__title">dbn-legal-agent</h3>
|
||||
<p class="kdoc-finetune__body">A QLoRA (Quantized Low-Rank Adaptation) fine-tune trained on Norwegian child-welfare and administrative law text — case notes, court decisions, Barnevernet correspondence, Fylkesnemnda decisions, and Statsforvalter rulings. The model has internalised the temporal patterns of Norwegian legal proceedings: the procedural sequence of an omsorgsovertakelse, the typical timeline of a tiltaksplan review cycle, what <em>akutt</em> means as a temporal signal, how Fylkesnemnda milestones are ordered.</p>
|
||||
<p class="kdoc-finetune__body" style="margin-top:0.8rem;">In the Timeline GPU engine, dbn-legal-agent runs as the primary extraction model via the LiteLLM proxy on cuttlefish. The structured JSON output schema is identical to the Azure engines — the same post-processing pipeline applies regardless of which engine produced the extraction. No Azure API calls are made when the GPU engine is selected.</p>
|
||||
<div class="kdoc-finetune__chips">
|
||||
<span class="kdoc-finetune__chip">QLoRA</span>
|
||||
<span class="kdoc-finetune__chip">Norwegian legal corpus</span>
|
||||
<span class="kdoc-finetune__chip">case notes</span>
|
||||
<span class="kdoc-finetune__chip">court decisions</span>
|
||||
<span class="kdoc-finetune__chip">Barnevernet</span>
|
||||
<span class="kdoc-finetune__chip">Fylkesnemnda</span>
|
||||
<span class="kdoc-finetune__chip">LiteLLM proxy</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Privacy by design -->
|
||||
<section class="kdoc-section--alt">
|
||||
<div class="kdoc-section">
|
||||
<p class="kdoc-section__eyebrow">Privacy & security</p>
|
||||
<h2 class="kdoc-section__title">Your documents never leave your session.</h2>
|
||||
|
||||
<div class="kdoc-privacy">
|
||||
<p class="kdoc-privacy__title">Privacy by design</p>
|
||||
<ul>
|
||||
<li>All uploaded files are extracted to text <strong>in memory</strong> using PHP's in-process file handlers. The raw binary is never written to disk on the server.</li>
|
||||
<li>Session context (pasted text, uploaded content, extracted timeline events) is scoped to your authenticated session and discarded when the session ends.</li>
|
||||
<li>Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) is configured on the <strong>West Europe</strong> region. Data processed via Azure OpenAI is not used for model training under the default enterprise agreement.</li>
|
||||
<li>The GPU/cuttlefish engine processes entirely locally — no data leaves your network. The LiteLLM proxy on cuttlefish receives your document text and returns structured JSON; nothing is forwarded to an external API.</li>
|
||||
<li>Telemetry logged: tool name, engine, focus mode, event count, latency. <strong>No document text, case references, actor names, or extracted events are logged.</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="kdoc-cta-strip">
|
||||
<h2 class="kdoc-cta-strip__title">See it work on your case.</h2>
|
||||
<p class="kdoc-cta-strip__sub">Free for Do Better Norge members. All engines available to every member.</p>
|
||||
<div class="kdoc-hero__ctas">
|
||||
<?php if ($isAuthed): ?>
|
||||
<a href="/timeline.php" class="kdoc-btn-primary">Open Timeline →</a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="kdoc-btn-primary">Sign in to use Timeline →</a>
|
||||
<a href="<?= htmlspecialchars($registerUrl) ?>" class="kdoc-btn-secondary">Register free</a>
|
||||
<?php endif; ?>
|
||||
<a href="/timeline-guide.php" class="kdoc-btn-secondary">User guide</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php require_once __DIR__ . '/includes/footer.php'; ?>
|
||||
<script src="assets/js/tools.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -15,6 +15,14 @@ require_once __DIR__ . '/includes/layout.php';
|
||||
<button type="button" class="lang-btn" data-lang="pl">🇵🇱 PL</button>
|
||||
</div>
|
||||
|
||||
<div class="korr-doc-links">
|
||||
<a href="/timeline-about.php" target="_blank">About this tool</a>
|
||||
<span aria-hidden="true">·</span>
|
||||
<a href="/timeline-guide.php" target="_blank">User guide</a>
|
||||
<span aria-hidden="true">·</span>
|
||||
<a href="/timeline-tech.php" target="_blank">How it works</a>
|
||||
</div>
|
||||
|
||||
<div class="control-row" id="timelineEngineControl">
|
||||
<span class="control-label" data-i18n="timelineEngine">Engine</span>
|
||||
<label><input type="radio" name="timelineEngine" value="azure_mini" checked id="timelineEngineAzureMini"> <span data-i18n="timelineEngineAzureMini">Azure gpt-4o-mini</span> ★ <small class="control-hint">(fast)</small></label>
|
||||
|
||||