The animated t-SNE 'embedding landscape' added no real analytical value and
its cumulative-by-month logic was inherently confusing (ancient drafts
appearing late in the animation). Removed entirely rather than maintained.
Drops the /timeline route, template, nav link, data builder
(get_timeline_animation_data / _compute_timeline_animation_data) and its test.
The Overview mini-timeline and /api/timeline (separate features) are untouched.
After the chronological-order fix the page opened on the earliest month
(1995-12), showing only a handful of same-colored dots while the legend
listed every category — looked broken.
- Initialise the plot on the LAST frame (full landscape); Play now replays
the build-up from the start (fromcurrent: false), slider starts at the end.
- Make _extract_month robust: year-only / junk dates (ISO/ETSI 'time' like
'2015/CD Amd 2', bare '2023', '') no longer yield malformed month labels
('2015-/C') or a garbled 'unknown' frame badge.
- Drop undated docs from the temporal animation (they remain on /landscape).
At the full initial frame every category has points, so the legend matches
what is drawn.
The animated t-SNE landscape delivered points in embedding-dict order, not
chronological order. The front-end cumulative filter (p.month <= frame) then
inserted new points mid-array between frames, so Plotly's index-based frame
transition animated existing markers flying to other drafts' coordinates.
Visible symptom: a couple of points jumping around instead of a growing map.
Sorting points by (month, name) makes each frame's per-category marker list
an append-only prefix of the next, so transitions only add markers.
Verified on the live DB: 188 non-append-only frame transitions before, 0 after.
insert_gaps did a blanket 'DELETE FROM gaps', which fails with
'FOREIGN KEY constraint failed' whenever proposal_gaps references a gap
(generated proposals). Delete only gaps not referenced by a proposal so
the refresh preserves proposal linkage and never trips the FK.
Also logs the 2026-05-22 data refresh (761->889 drafts) in dev-journal.
The fetch pipeline left the 128 new drafts (2026-05 delta) without full
text — the per-source text download skipped them. This script downloads
text from the IETF archive using the recorded revision, probing 00-09 and
the bare name as fallback. Run before 'analyze' so rating uses full text.
The CMD ran 'python src/webui/app.py' which defaults to --host 127.0.0.1,
unreachable from outside the container. Bind 0.0.0.0:5000 explicitly.
No --dev flag => PRODUCTION mode (admin routes 404). Deployed at
ietf.nennemann.de (see dev-journal).
Corrects the ACT acronym expansion to "Agent Context Token" in the
reference implementation. Adds proper pyproject.toml for the act package
and the MCP+LangGraph PoC planning document.
End-to-end PoC demonstrating Agent Context Token authorization and
Execution Context Token accountability over MCP tool calls, using a
LangGraph agent with ES256-signed JWT tokens and DAG verification.
New LaTeX paper analyzing the AI-agent standardization landscape across
IETF Internet-Drafts. Includes bibliography, updated Makefile for
pdflatex+bibtex build, and gitignore entries for build artifacts.
Cross-spec interop validation between ietf-act and ietf-ect:
- new packages/interop/ sibling package (ietf-act-ect-interop)
- 32 tests pass: shared claims, algorithm matrix, DAG structure,
divergence handling, anti-goals
- documents ES256 raw signature wire-compatibility
- documents airtight typ separation (act+jwt vs exec+jwt)
Hazards surfaced:
- ACTLedger.append() silently accepts ECT Payload via duck-typing
(both have .jti) — documented in interop README as a production
hazard requiring external isinstance checks
Session handoff:
- SESSION-2026-04-12.md — snapshot of decisions, artifacts, open
actions, and next-session starting points
Also: session-end commit of hash-format fix propagation to
packages/ect/ (the fix was applied to the old refimpl location
but did not propagate through the parallel package-move agent).
Pipeline refresh:
- Extract ideas from 46 remaining drafts (844 total ideas now)
- Clear stale llm_cache entries blocking re-extraction
- Re-run gap analysis with expanded corpus: 10 gaps (was 12), fresh IDs #1-#10
- Re-link 3 proposals to new gap IDs
- Add scripts/pipeline-refresh.sh for reproducible runs
Draft generation moved from gaps to proposals:
- Remove "Generate Internet-Draft" section from gap detail page
- Add it to proposal detail page instead (proposals → generate I-D flow)
- New route POST /proposals/<id>/generate with richer context
(proposal title + description + linked gap topics)
- Remove misleading "Search related drafts" link from gap page
(related drafts already shown inline)
Public page polish:
- Overview: update subtitle to mention all 6 standards bodies
- About: describe multi-source scope (IETF, ISO, ITU-T, ETSI, NIST, W3C)
- About: add guiding question ("Where is the AI agent standards race heading?")
- Obsidian export button hidden in production mode (prior commit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace all CDN script tags (marked, plotly) with self-hosted static files
- Add DOMPurify for sanitizing markdown-rendered HTML
- Add escapeHtml() helper to base.html for all innerHTML operations
- Sanitize dynamic data in innerHTML across 13 templates
- Add security headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy)
- Add SSRF protection to proposal intake URL fetcher (block private/loopback IPs)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blog drafting section (dev-only):
- BlogDraftGenerator gathers project data (gaps, proposals, stats) as
context and calls Claude to produce Medium-style blog posts
- DB schema: blog_drafts table with title, content, tags, cost tracking
- Web UI: list, generate (async with live preview), detail (rendered +
source toggle), edit, and export routes
- 6 writing styles: deep-dive, overview, opinion, listicle, comparison,
series-post
- Nav link added to sidebar under Proposals
Bug fixes found via route testing (scripts/test_all_routes.py):
- /authors/<id>: Draft.status → Draft.states (correct attribute name)
- /false-positives: add missing `import re` in ratings.py
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Different revisions of the same draft (e.g. draft-foo-bar-00, -01, -02)
were showing up as separate results. Now keeps only the highest-scoring
revision per base draft name.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Constants were defined in the old monolithic data.py but not carried
over to data/analysis.py during the split, breaking /trends page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The _initialized singleton in auth.py prevented hooks from registering
on the correct app instance when create_app() was called twice (once
eagerly at import, once from __main__). Removed the guard and made
the module-level app lazy. Also adds feature backlog and architecture
assessment from the review team.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Author detail page (/authors/<person_id>): shows author info, all drafts
with ratings, and co-authors with shared draft counts. Public route.
- Idea detail page (/ideas/<idea_id>): shows idea metadata, source draft,
and top-5 most similar ideas via embedding cosine similarity. Admin route.
- Gap detail page: added "Related Drafts" section that finds drafts by
extracting draft names from evidence text and searching by topic keywords.
- Updated author links across templates to use /authors/<person_id> URLs.
- Added DB methods: get_author_by_id, get_author_drafts, get_coauthors.
- Extended top_authors to include person_id (5th tuple element).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Include data/drafts.db so other machines don't need to re-run
expensive Claude API calls (~$3+ of analysis, 474 drafts, 403 authors,
1262 ideas, 12 gaps). Add scripts/db-export.sh and scripts/db-import.sh
for portable compressed SQL dump sharing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add full proposal system: DB schema (proposals + proposal_gaps tables),
CLI `ietf intake` command, and web UI with Quick Generate on /proposals/new.
The new page merges AI intake (paste URL/text → Haiku generates multiple
proposals auto-linked to gaps) with manual form entry. Generated proposals
are clickable cards that fill the editor below for refinement.
Uses claude_model_cheap (Haiku) for cost-efficient web intake. Includes
CaML-inspired draft proposals from arXiv:2503.18813 analysis.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dev-only pages (sources, trends, complexity, idea-analysis, false-positives,
similarity, landscape, export) now require @admin_required and are hidden
from nav in production mode. Citations page keeps the graph public but
hides influence/BCP tabs behind --dev flag.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add /architecture page: system-of-systems view with 8 layers, component
cards, gap markers, source coverage chart, and clickable detail sidebar
- Give author clusters meaningful names from orgs + draft topic keywords
- Filter false positives (73 drafts, 54 ideas) from idea clusters,
architecture, ideas listing, and search results
- Add NIST source fetcher with curated catalog of 11 AI publications
- New pages: trends, complexity, sources, false positives, idea analysis
- Clickable gap cards with full details (evidence, priority, nearby work)
- Component detail panel with linked drafts and top ideas
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add `ietf auto` command: fetches, analyzes, embeds, extracts ideas,
and refreshes gaps across all sources with cost-based auto-approval
- Fix SourceDocument→Draft conversion in auto fetch step
- Fix gap_analysis method name in auto command
- Process all 270 unrated ETSI/ISO/ITU/NIST drafts (761 total, all rated)
- Update web UI templates and data layer for multi-source support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Release prep:
- Version bump to 0.3.0 (pyproject.toml, cli.py)
- Rewrite README.md with current stats (475 drafts, 713 authors, 501 ideas)
- Add CONTRIBUTING.md with dev setup and code conventions
Blog site:
- Add scripts/build-site.py (markdown → HTML with clean CSS, dark mode, nav)
- Generate static site in docs/blog/ (10 pages)
- Ready for GitHub Pages deployment
Academic paper (paper/main.tex):
- Update all counts: 474→475 drafts, 557→710 authors, 1907→462 ideas, 11→12 gaps
- Add false-positive filtering methodology (113 excluded, 361 relevant)
- Add cross-org convergence analysis (132 ideas, 33% rate)
- Add GDPR compliance gap to gap table
- Add LLM-as-judge caveats to rating methodology and limitations
- Add FIPA, IEEE P3394, W3C WoT to related work with bibliography entries
- Fix safety ratio to show monthly variation (1.5:1 to 21:1)
Pipeline:
- Fetch 1 new draft (475 total), 3 new authors (713 total)
- Fix 16 ruff lint errors across test files
- All 106 tests pass
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blog posts (all 10 files updated):
- Update all counts to match DB: 434 drafts, 557 authors, 419 ideas, 11 gaps
- Fix EU AI Act timeline to August 2026 (5 months, not 18)
- Reframe growth claim from "36x" to actual monthly figures (5→61→85)
- Add safety ratio nuance (1.5:1 to 21:1 monthly variation)
- Fix composite scores (4.8→4.75, 4.6→4.5)
- Add OAuth/GDPR consent distinction (Art. 6(1)(a), Art. 28)
- Add EU AI Act Annex III + MDR context to hospital scenario
- Add FIPA, IEEE P3394, eIDAS 2.0 references
- Add GDPR gap paragraph (DPIA, erasure, portability, purpose limitation)
- Rewrite Post 04 gap table to match actual DB gap names
Methodology:
- Expand methodology.md: pipeline docs, limitations, related work
- Add LLM-as-judge caveats and explicit rating rubric to analyzer.py
- Add clustering threshold rationale to embeddings.py
- Add gap analysis grounding notes to analyzer.py
- Add Limitations section to Post 07
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each cluster card now shows draft count badge and up to 5 linked draft
titles with clickable links to draft detail pages. Data collected from
member nodes' draft lists during cluster detection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Search results (FTS5 + Ollama embeddings) are shown immediately at no
cost. AI synthesis via Claude is behind a "Synthesize" button that the
user must explicitly click. Results are cached permanently so repeat
visitors never trigger API calls.
- Split ask into search_only() (free) and ask() (paid, cached)
- GET /ask now uses search_only — no Claude tokens spent
- POST /api/ask/synthesize triggers Claude (Haiku, ~$0.001)
- Cached answers shown with "cached" badge, no re-generation
- Template shows sources immediately + optional synthesize button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Clicking an author in the network graph opens /drafts?q=AuthorName
but search only checked draft name/title/summary. Now also matches
against author names via a JOIN on draft_authors + authors tables.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Raise co-authorship threshold from 1 to 2 shared drafts (498→156 nodes)
- Tune D3 force parameters for large graphs: capped link strength,
wider distance, adaptive charge, lower velocity decay
- Add initial circular layout to prevent explosion on load
- Fix cluster highlighting with fallback name matching and
position validation before zoom-to-fit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Self-host Tailwind, Plotly, D3.js (no more CDN requests)
- Self-host Inter font (no more Google Fonts requests)
- Replace JetBrains Mono with system monospace font stack
- Zero external requests when visiting the site (GDPR-safe)
- Add /impressum page (§5 TMG, §18 MStV)
- Add /datenschutz page (DSGVO Art. 13/14)
- Hosting: Hetzner, no cookies, no tracking, no analytics
- Add Impressum/Datenschutz links to sidebar footer
- Configure Flask static_folder for local asset serving
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix RFC URLs with leading zeros (rfc0020 -> rfc20) via int filter
- Draft refs: internal link for drafts in our DB, Datatracker for external
- BCP refs: link to rfc-editor.org/info/bcpN
- Add DB connection teardown (@app.teardown_appcontext)
- Fix JS syntax error in gap_demo.html (HTML-escaped string in script tag)
- Add URL encoding to all query params in drafts.html and draft_detail.html
- Fix variable shadowing of Flask's g import in gaps_demo()
- Add None safety for ideas search data attribute
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tighten idea extraction prompts (1-4 ideas, no sub-features) reducing
1,907 ideas to 468 across 434 drafts (78% reduction)
- Add embedding-based dedup (ietf dedup-ideas) for same-draft similarity
- Add novelty scoring (ietf ideas score) and filtering (ietf ideas filter)
using Claude to rate ideas 1-5, removing 49 generic building blocks
- Final count: 419 high-quality ideas (avg 1.1/draft)
- Web UI: gap explorer with live draft generation and pre-generated demos
- Web UI: D3.js author collaboration network (498 nodes, 1142 edges,
68 clusters, org filtering, interactive zoom/pan)
- Academic paper: 15-page LaTeX workshop paper analyzing the 434-draft
AI agent standards landscape
- Save improvement ideas backlog to data/reports/improvement-ideas.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>