OpenViking Session Q&A Weekly Report
Read only the session data supplied by the user. Clean and normalize it, apply time windows, compute metrics, classify topics, review risks, compare with the previous period, and produce one self-contained Markdown file. The default timezone is Asia/Shanghai.
Delivery Boundary
- The only analytical source is the session files under
sessions_root. Do not fetch or merge other communities, message streams, directories, or online chat data.
- Deliver exactly one
.md file. Temporary scripts and intermediate files are allowed during analysis, but the report must remain understandable without them.
- Do not call online document, messaging, contact, or whiteboard APIs. Do not create XML, HTML, SVG, or PNG files, and do not upload anything.
- Preserve document and whiteboard data requirements. The Markdown must contain enough aggregates, time series, rankings, conclusions, and human-message excerpts for a downstream renderer to build the complete report body, summary dashboard, and comparison dashboard without reopening the sessions.
- Never estimate counts from intuition. Every number must come from parsed data or a reproducible formula, and every important conclusion must be traceable to concrete session messages.
- When the sessions cannot prove a claim, write "no supporting evidence was found before the data cutoff" instead of presenting it as a global fact.
Default output filename:
OpenViking_Community_QA_Weekly_Report_YYYY-MM-DD_to_YYYY-MM-DD.md
Inputs
sessions_root: Required. Recursively read .jsonl session files from this directory.
current_start / current_end: Optional boundaries for the current reporting window.
previous_start / previous_end: Optional boundaries for the previous comparison window.
previous_report: Optional Markdown report created by this skill. Use it to preserve published definitions and historical figures.
output_path: Optional. If omitted, write to reports/qa-weekly-YYYYMMDD-YYYYMMDD/ in the current workspace.
session_scope: Optional subdirectory, filename pattern, or explicit session set supplied by the user.
history: Optional verified report titles and links for downstream document rendering. Pass these through without querying for them.
Infer missing values from the directory structure, timestamps, and previous report when possible. Ask the user only when the target session set or reporting boundary cannot be resolved and different choices would materially change the result.
Report Order
The Markdown report must use this order:
- Title:
OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD
Executive Summary
Releases This Week
Weekly Topic Ranking
Open High-Priority Issues
Week-over-Week Comparison
Weekly Activity
Trends and Recommendations
Methodology and Data Notes
Previous Reports
Appendix: Structured Report Data
Releases This Week may only summarize versions for which the sessions contain explicit evidence such as "released," "deployed," or "available to install." Statements such as "planned," "expected," or "will be included in the next release" are not completed releases. When there is no qualifying evidence, write: "No formal release could be confirmed from this week's sessions." Do not browse for confirmation.
Time Windows
Use half-open intervals:
Current: [current_start, current_end)
Previous: [previous_start, previous_end)
Choose the cutoff in this order:
- An explicit cutoff supplied by the user.
- For an established weekly series, the previous report's
current_end + 7 days.
- When the user says "up to now," the current time in
Asia/Shanghai.
- Use the latest message timestamp only when the user explicitly states that the directory is a point-in-time export snapshot.
Comparison requirements:
- Current and previous windows must have equal duration, meet at one boundary, and never overlap.
- Use consecutive seven-day windows by default. If the user asks for a shorter first period, show the actual range in both the title and methodology notes.
- Messages at or after the current cutoff belong to the next report.
- If the earliest exported message is later than the requested start, preserve the requested window and disclose incomplete coverage.
- Record the earliest and latest valid messages and their distance from the requested boundaries.
- If the current directory lacks previous-window data, prefer the structured appendix in
previous_report. If neither is available, keep the comparison section and mark the previous period as unavailable. Never replace unknown values with zero.
Discover Session Files
List candidate files first:
rg --files "$SESSION_ROOT" -g '*.jsonl'
Do not assume every file in the directory belongs to the target dataset:
- Group files by directory level, filename prefix, and available metadata. Count files and determine the time range for each group.
- Sample human messages from the beginning, middle, and end of each group to verify that it contains OpenViking community Q&A sessions.
- Exclude test conversations, internal debugging, bot self-tests, unrelated products, and clearly irrelevant data.
- When the user supplies an exact
session_scope, honor it but still verify that it contains data.
- Record discovered, included, and excluded file counts plus exclusion reasons in the methodology section. Only disclose masked summaries of internal identifiers.
Do not select the target dataset solely because it contains the largest number of files.
Parse and Normalize JSONL
Use a real JSON parser on every line:
- Count malformed lines in
bad_lines. Keep filenames and line numbers for local auditing, but do not expose them in the final report.
- Skip non-message rows such as
_type=metadata, while still using their session identifiers and contextual metadata.
- Try timestamp fields in this order:
timestamp, created_at, create_time, time. Support numeric timestamps in both seconds and milliseconds.
- Convert timezone-aware values to
Asia/Shanghai. Treat timezone-naive values as Asia/Shanghai and disclose that assumption.
- Prefer plain string message bodies. For structured bodies, retain the original object during analysis and extract readable text through its structured fields rather than fragile string slicing.
- Store the original role, normalized role, timestamp, session key, message key, internal speaker key, display-name candidates, and normalized text.
Normalize roles as follows:
user, human, and equivalent roles count as human messages.
assistant, bot, and equivalent roles count as assistant messages.
system, tool, metadata, and equivalent records remain separate and never contribute to human activity or topic initiators.
- Put unresolved roles in
unknown_role_messages and manually sample them before making a decision. Never classify an unknown role as human by default.
Deduplication and Discussion Units
One unique session is one discussion unit.
Deduplicate in this order:
- Prefer stable message IDs.
- When a message ID is absent, hash
session_key + timestamp + sender_key + normalized_text.
- Keep only one copy of duplicate session exports, preferring the file with more complete messages and broader time coverage.
- If only part of a file falls inside a window, count only the in-window messages. Adjacent out-of-window messages may be read for context but must not be counted.
- Merge files for the same issue only when they share a root key, reply chain, or other strong duplicate evidence. Text similarity alone is insufficient.
An effective discussion contains a real technical question, failure, design comparison, usage feedback, or actionable answer. Pure sharing, status updates, greetings, bot tests, and content-free link forwarding may remain in total message counts but do not count as effective discussions.
Resolve and Mask Identities
Display names may come only from the session files:
- An explicit display-name field on the message.
- A stable
[Name]: or [Name]: prefix repeatedly associated with the same internal identity.
- If neither is available, use
Name unavailable. Never guess a name or display an internal identity key.
When one identity has multiple display-name candidates, review frequency, temporal continuity, and context. Keep identities separate when the evidence is insufficient.
Masking rules:
- One character: display
*.
- Two characters: preserve the first character, for example
张三 -> 张*.
- Three or more characters: preserve the first and last characters and replace every middle character with
*, for example 秦浩杰 -> 秦*杰.
- Apply the same character-based rule to Latin, numeric, and mixed aliases, for example
darren -> d****n and Lin101 -> L****1.
- User-declared sensitive names override the general rule and preserve only the first character, for example
胡江涛 -> 胡**.
- In Markdown prose, escape masking asterisks when they appear inside emphasis, for example
Q\*n; keep the raw value as Q*n in structured JSON.
The final Markdown and structured JSON must not contain complete human names, email addresses, phone numbers, raw identity keys, Authorization values, API keys, root keys, tenant keys, or long credential-like strings.
Metrics
Use the same code and definitions for both windows. At minimum, compute:
discussion_units: Unique sessions.
effective_discussions: Effective discussion units.
participants: Unique human identities in the window.
human_messages: Human messages.
assistant_messages: Assistant replies.
system_messages: System and tool messages.
unknown_role_messages: Messages whose roles remain unresolved.
total_messages: All counted messages.
The following invariant must hold:
human_messages + assistant_messages + system_messages + unknown_role_messages = total_messages
Participant counts, Top 10 users, and keywords must use human messages only. Assistant messages may help interpret the Q&A context or determine whether a question received a response, but they must not inflate human rankings.
Topics and Keywords
Use stable topic buckets across weeks. Recommended baseline buckets:
- Storage, Indexing, and Retrieval
- Bot, Agent, and Skill Applications
- Deployment, Runtime, and Environment Configuration
- Memory, Compression, and Archiving
- Models, Parsing Quality, and Cost
- Permissions, Multi-Tenancy, and Collaboration
- SDKs, APIs, and Tooling
- Documentation, Examples, and Usage Questions
- Other
Classification rules:
- Read the entire session before assigning multi-label topics.
- A discussion unit may match multiple topics, so topic counts do not have to sum to total discussion units.
- For each topic, compute discussion units, participants, human messages, keywords, and one concise insight.
- Rank topics by discussion units, then human messages, participants, and the stable topic order.
- Normalize keyword case, width variants, singular/plural forms, and common aliases before calculating the Top 20.
- Remove stop words, greetings, template text, masked names, and path fragments that carry no topical meaning.
- Preserve recognizable technical spellings such as
Memory, add_resource, VLM, and MCP.
Manually sample sessions behind popular topics and keywords to catch misclassification, log noise, or frequency inflation caused by assistant repetition.
Open High-Priority Issues
Include only high-priority issues that remain unresolved at the data cutoff, with a default maximum of four. Here, unresolved means that the available sessions contain no complete chain of an explicit fix, usable release, existing-instance recovery, and user-side verification before the cutoff.
A candidate must satisfy at least one of these conditions:
- Multiple independent humans report the same issue.
- There are concrete logs, a failure ratio, or reproducible steps, plus maintainer confirmation.
- The issue affects a core path such as Session Commit, resource ingestion, semantic indexing, permission isolation, or data integrity.
Exclude:
- Issues fixed and verified by users within the available data window.
- One-off errors without context, routine configuration questions, or hypotheses found only in assistant replies.
- Security tests, casual chat, bot-to-bot exchanges, or unsupported root-cause claims.
Every issue must contain these six fields:
Priority / Category
Background
User Impact
Evidence
Current Assessment
Community Feedback
Immediately follow each issue with its own Human Feedback Excerpt. Include human messages only, omit assistant replies, and omit internal links:
> **08-31 21:16 | O\*\*\*r**
> Session Commit has failed repeatedly...
>
> **08-31 21:19 | 秦\*杰**
> The current fix direction is still incorrect and needs another revision.
Every excerpt must come from sessions associated with that issue and preserve the timestamp, masked name, and essential meaning. Long logs may be shortened and unrelated text may be omitted, but never invent dialogue or mix messages from another issue.
Releases This Week
Extract only explicit completed-release signals from the sessions: version, confirmation time, major changes, fixes, upgrade warnings, and related discussion.
- Count only statements such as "released," "deployed," or "the new version is available."
- Treat "preparing a release," "expected," and "next version" as plans, not completed releases.
- When messages conflict, prefer the later statement backed by user verification, and preserve uncertainty in the evidence note.
- If evidence is insufficient, keep the section and write: "No formal release could be confirmed from this week's sessions."
- Pass through only URLs explicitly present in the sessions and valid in basic format. Do not browse or fabricate links.
Week-over-Week Comparison
Compare the scale first, then the content:
- Previous and current values, absolute changes, and percentage changes for discussion units, effective discussions, participants, human messages, assistant messages, and total messages.
- Previous and current values plus percentage changes for every stable topic bucket.
- Changes in top keywords and top active users.
- Previous focus, current focus, and interpretation of each meaningful shift.
- One overall conclusion that distinguishes activity-volume changes from discussion-content changes.
Percentage-change formula:
(current - previous) / previous * 100
When the previous value is zero and the current value is positive, display New. When both are zero, display 0.0%. When the previous value is unknown, display Not comparable; never substitute zero for unknown.
Focus shifts must come from human review of high-frequency session digests from both windows. Do not infer them from keyword deltas alone.
Weekly Activity
Include:
- Participants, human messages, assistant messages, system messages, and total messages.
- Daily human, assistant, and total message counts across the seven-day window.
- Human message counts for every hour from 00 through 23.
- Peak hour, second-highest hour, and peak day.
- Top 10 active humans with rank, masked display name, message count, discussion-unit count, and core keywords.
- Optional answer coverage and response latency. Compute these only when message ordering and reply relationships are reliable, and label them as heuristic metrics.
Render the peak-time series as Mermaid while retaining the full 24-hour table:
xychart-beta
title "Hourly Human Message Distribution (CST)"
x-axis ["00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23"]
y-axis "Messages" 0 --> MAX
line [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
Replace MAX and all 24 data points. If Mermaid cannot render, the full data table must still preserve the result.
Trends and Recommendations
Produce three to six actionable recommendations. Each recommendation must include:
- The observed fact or change.
- Its impact on Q&A efficiency, product experience, or maintenance work.
- A concrete action involving a fix, documentation, monitoring, release, regression test, or communication.
Prioritize unresolved P1 issues, repeated high-frequency questions, post-release compatibility warnings, activity changes, and data-quality gaps. Avoid empty language such as "continue monitoring" or "optimize further" without a named action.
Document and Whiteboard Data Requirements
This skill does not create online documents, but its Markdown output must directly support the current weekly-report layout.
Summary Dashboard
The structured data must be sufficient to generate:
- Four KPIs: discussion units, effective discussions, participants, and total messages.
- Top 6 weekly topics with discussion-unit bars.
- Up to four unresolved P1 cards.
- A 24-hour human-message line chart and peak-day annotation.
- Top 10 active community members.
- Top 20 core keywords. A compact board may show the first 12 while the Markdown retains all 20.
Comparison Dashboard
The structured data must be sufficient to generate:
- Three previous-to-current metric cards: discussion units, participants, and total messages.
- Paired bars for the Top 6 stable topic buckets.
- A focus-shift list.
- An overall conclusion covering both activity volume and discussion content.
Document Body
- Build the executive summary from structured metrics and conclusions.
- Build the release section from explicit completed-release evidence found in sessions.
- Render every P1 with six fields and an independent simulated human-chat block.
- Put all six comparison metrics in the body while keeping only three core metrics on the board.
- Keep independent fields for recommendations, methodology notes, and previous-report links.
No important number may exist only in narrative prose while being absent from the structured data.
qa-report.v3 Data Contract
The Markdown must end with one qa-report.v3 JSON object. The prose is for reading; the JSON is the authoritative source for downstream document and whiteboard rendering.
Rules:
- The JSON must be valid and contain no comments, trailing commas,
NaN, ellipses, or placeholders.
- Wrap it between
<!-- QA_REPORT_DATA_START --> and <!-- QA_REPORT_DATA_END -->, and make it the final fenced JSON block in the document.
- Use ISO 8601 timestamps with
+08:00, YYYY-MM-DD dates, and integer hours from 0 through 23.
- Store counts as integers and percentages as numbers. Use
null for unknown values; never substitute zero.
daily must cover every date slice in the current window. hourly must contain exactly 24 entries, including zeros for inactive hours.
- Mask all human display names before writing JSON. Do not store name mappings or internal identity keys.
- Every numeric value in the prose must be directly readable from this object or reproducible through simple arithmetic, sorting, or the percentage-change formula.
Required fields:
{
"schema_version": "qa-report.v3",
"report": {
"title": "OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD",
"generated_at": "YYYY-MM-DDTHH:mm:ss+08:00",
"timezone": "Asia/Shanghai",
"window": {
"current": {"start": "YYYY-MM-DDTHH:mm:ss+08:00", "end": "YYYY-MM-DDTHH:mm:ss+08:00"},
"previous": {"start": "YYYY-MM-DDTHH:mm:ss+08:00", "end": "YYYY-MM-DDTHH:mm:ss+08:00"}
},
"coverage": {
"sessions_root": "user-supplied local path",
"discovered_files": 0,
"included_files": 0,
"excluded_files": 0,
"included_sessions": 0,
"earliest_message": null,
"latest_message": null,
"bad_lines": 0,
"missing_timestamps": 0,
"complete": true,
"notes": []
}
},
"summary": {
"headline": "One overall conclusion",
"top_topic_names": [],
"peak_hour": 0,
"peak_hour_messages": 0,
"peak_day": "YYYY-MM-DD",
"peak_day_messages": 0,
"open_p1_count": 0,
"release_versions": []
},
"presentation": {
"section_order": [
"Executive Summary",
"Releases This Week",
"Weekly Topic Ranking",
"Open High-Priority Issues",
"Week-over-Week Comparison",
"Weekly Activity",
"Trends and Recommendations",
"Methodology and Data Notes",
"Previous Reports"
],
"summary_dashboard": {
"kpi_metric_order": ["discussion_units", "effective_discussions", "participants", "total_messages"],
"topic_limit": 6,
"anomaly_limit": 4,
"hourly_series": "human_messages",
"top_user_limit": 10,
"keyword_limit": 20,
"compact_keyword_limit": 12
},
"comparison_dashboard": {
"metric_order": ["discussion_units", "participants", "total_messages"],
"show_topic_change": true,
"show_focus_shift": true
}
},
"metrics": {
"current": {
"discussion_units": 0,
"effective_discussions": 0,
"participants": 0,
"human_messages": 0,
"assistant_messages": 0,
"system_messages": 0,
"unknown_role_messages": 0,
"total_messages": 0
},
"previous": {
"discussion_units": 0,
"effective_discussions": 0,
"participants": 0,
"human_messages": 0,
"assistant_messages": 0,
"system_messages": 0,
"unknown_role_messages": 0,
"total_messages": 0
}
},
"topics": [
{
"rank": 1,
"name": "Topic name",
"current": {"discussion_units": 0, "participants": 0, "human_messages": 0},
"previous": {"discussion_units": 0, "participants": 0, "human_messages": 0},
"delta_pct": 0.0,
"keywords": [],
"insight": ""
}
],
"keywords": [
{"rank": 1, "keyword": "Memory", "current_count": 0, "previous_count": 0, "delta_pct": 0.0}
],
"activity": {
"daily": [
{"date": "YYYY-MM-DD", "human_messages": 0, "assistant_messages": 0, "total_messages": 0}
],
"hourly": [
{"hour": 0, "human_messages": 0}
],
"peaks": {
"top_hours": [{"hour": 0, "messages": 0}],
"top_day": {"date": "YYYY-MM-DD", "messages": 0}
},
"top_users": [
{"rank": 1, "display_name": "Q*n", "messages": 0, "discussion_units": 0, "keywords": []}
],
"response_metrics": {
"available": false,
"answered_discussions": null,
"answer_rate_pct": null,
"median_latency_seconds": null,
"p90_latency_seconds": null,
"method": ""
}
},
"releases": [
{
"version": "vX.Y.Z",
"published_at": "YYYY-MM-DDTHH:mm:ss+08:00",
"type": "main|hotfix|component",
"url": null,
"highlights": [],
"reliability_fixes": [],
"breaking_changes": [],
"related_topics": [],
"evidence": []
}
],
"anomalies": [
{
"rank": 1,
"title": "Issue title",
"short_label": "Short label for the dashboard risk card",
"priority": "P1",
"category": "Category",
"background": "",
"user_impact": "",
"evidence": "",
"current_assessment": "",
"community_feedback": "",
"unresolved_at_cutoff": true,
"chat": [
{"time": "MM-DD HH:mm", "speaker": "Q*n", "message": "Masked human message"}
]
}
],
"comparison": {
"available": true,
"metric_conclusion": "",
"topic_conclusion": "",
"focus_shifts": [
{"previous_focus": "", "current_focus": "", "interpretation": ""}
],
"overall_conclusion": ""
},
"recommendations": [
{"rank": 1, "observation": "", "impact": "", "action": ""}
],
"history": [
{"title": "Previous report title", "url_or_path": "verified link or relative path"}
]
}
When previous-period data is unavailable, set metrics.previous to null; set each topic and keyword previous/delta_pct value to null; set comparison.available=false; and explain the reason in the prose. Never preserve a fabricated all-zero previous period.
Markdown Template
---
report_schema: qa-report.v3
report_type: openviking_qa_weekly
timezone: Asia/Shanghai
current_start: YYYY-MM-DDTHH:mm:ss+08:00
current_end: YYYY-MM-DDTHH:mm:ss+08:00
previous_start: YYYY-MM-DDTHH:mm:ss+08:00
previous_end: YYYY-MM-DDTHH:mm:ss+08:00
generated_at: YYYY-MM-DDTHH:mm:ss+08:00
---
# OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD
## Executive Summary
- Reporting window: ...
- Weekly volume: ...
- Participation: ...
- Leading topics: ...
- Peak period: ...
- Main conclusion: ...
## Releases This Week
| Version | Time | Type | Highlights | Upgrade Notes | Session Evidence |
| --- | --- | --- | --- | --- | --- |
## Weekly Topic Ranking
| Rank | Topic | Discussion Units | Participants | Human Messages | Keywords | Insight |
| ---: | --- | ---: | ---: | ---: | --- | --- |
### Top 20 Keywords
| Rank | Keyword | Current | Previous | Change |
| ---: | --- | ---: | ---: | ---: |
## Open High-Priority Issues
### 1. Issue Title
- **Priority / Category:** P1 / ...
- **Background:** ...
- **User Impact:** ...
- **Evidence:** ...
- **Current Assessment:** ...
- **Community Feedback:** ...
#### Human Feedback Excerpt
> **Time | Masked Name**
> Message...
## Week-over-Week Comparison
### Core Metrics
| Metric | Previous | Current | Absolute Change | Percentage Change |
| --- | ---: | ---: | ---: | ---: |
### Topic Heat Changes
| Topic | Previous | Current | Change | Interpretation |
| --- | ---: | ---: | ---: | --- |
### Focus and Discussion Shifts
| Previous Focus | Current Focus | Interpretation |
| --- | --- | --- |
## Weekly Activity
### Activity Overview
### Daily Distribution
### Peak-Time Line Chart
### 24-Hour Data
### Top 10 Active Community Members
## Trends and Recommendations
1. ...
## Methodology and Data Notes
- Data directory, discovered files, and included scope.
- Both time windows, timezone, and actual data coverage.
- Deduplication, roles, discussion units, effective discussions, and multi-label topic definitions.
- Malformed lines, missing timestamps, unknown roles, and coverage gaps.
- Display-name resolution and masking rules.
## Previous Reports
- [OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD](verified link or path)
## Appendix: Structured Report Data
<!-- QA_REPORT_DATA_START -->
```json
{complete qa-report.v3 object}
```
<!-- QA_REPORT_DATA_END -->
End-to-End Procedure
- Scan
sessions_root and identify the target session set from directories, filename prefixes, and metadata.
- Parse every JSONL line and record malformed rows, missing timestamps, unknown roles, and actual data coverage.
- Determine consecutive, equal-duration current and previous windows. Read
previous_report when raw previous-window data is absent.
- Normalize message fields, roles, and timestamps, then deduplicate messages and duplicate session exports.
- Resolve display names only from session contents, apply masking, and scan for sensitive information.
- Compute discussion units, effective discussions, participants, and message metrics for both windows.
- Build a digest for every session, classify it with stable topic buckets, and manually sample the highest-volume topics.
- Compute Top 20 keywords, daily and hourly series, peaks, and the Top 10 active humans.
- Follow each candidate issue through later messages and retain only P1 issues with no closure evidence before the cutoff.
- Extract explicit completed-release signals from sessions. Do not count planned releases.
- Compare core metrics, topics, keywords, and focus areas, then write actionable recommendations.
- Assemble the complete
qa-report.v3 object first, and render both Markdown prose and Mermaid from that same object to prevent numeric drift.
- Reparse the final JSON and validate tables, formulas, ordering, the 24-hour series, masking, and all document/whiteboard fields.
Acceptance Checklist
- The final deliverable is one self-contained
.md file that remains understandable without temporary scripts or caches.
- All analytical data comes from the target sessions and optional previous Markdown report; no other message source is mixed in.
- Frontmatter declares
report_schema: qa-report.v3, and the final JSON parses successfully.
- The title dates match the current window; current and previous windows are equal, consecutive, and non-overlapping.
- Discovered, included, and excluded file counts, malformed rows, and data coverage are recorded.
- Message roles and totals reconcile, and unknown roles are not silently treated as human.
- The weekly ranking includes discussion units, participants, human messages, keywords, and insights.
- Weekly activity contains the daily table, complete 24-hour table, line chart, peaks, and Top 10.
- The comparison covers scale, topics, and focus shifts; unavailable history is explicitly marked as not comparable.
- Releases include only completed states confirmed in sessions; insufficient evidence is stated clearly.
- Open issues contain only P1 items with no closure evidence before the cutoff, and each has all six fields plus its own human excerpt.
- Human excerpts contain no assistant replies, invented messages, or internal links.
- Every human name is masked; no complete name, internal identity key, or credential appears in the report.
activity.hourly is ordered from 0 through 23 with exactly 24 entries; daily covers every current-window date slice.
- Top 10, Top 20, topic rankings, and all percentage changes are reproducible.
- The structured data is sufficient to generate the summary dashboard, comparison dashboard, P1 body sections, and simulated chat modules directly.
- Previous-report entries pass through only verified links or paths; never fabricate historical URLs.
1---2name: ov-session-report3description: Analyze local Q&A session JSONL files and produce a complete, auditable English Markdown weekly report over consecutive time windows, with all data required for downstream Feishu document and whiteboard rendering. Use for requests such as "analyze the latest week of sessions," "generate a community Q&A weekly report," or "compare with last week." This skill does not ingest other message sources or create/upload online documents.4---5
6# OpenViking Session Q&A Weekly Report
7
8Read only the session data supplied by the user. Clean and normalize it, apply time windows, compute metrics, classify topics, review risks, compare with the previous period, and produce one self-contained Markdown file. The default timezone is `Asia/Shanghai`.
9
10## Delivery Boundary
11
12- The only analytical source is the session files under `sessions_root`. Do not fetch or merge other communities, message streams, directories, or online chat data.
13- Deliver exactly one `.md` file. Temporary scripts and intermediate files are allowed during analysis, but the report must remain understandable without them.
14- Do not call online document, messaging, contact, or whiteboard APIs. Do not create XML, HTML, SVG, or PNG files, and do not upload anything.
15- Preserve document and whiteboard data requirements. The Markdown must contain enough aggregates, time series, rankings, conclusions, and human-message excerpts for a downstream renderer to build the complete report body, summary dashboard, and comparison dashboard without reopening the sessions.
16- Never estimate counts from intuition. Every number must come from parsed data or a reproducible formula, and every important conclusion must be traceable to concrete session messages.
17- When the sessions cannot prove a claim, write "no supporting evidence was found before the data cutoff" instead of presenting it as a global fact.
18
19Default output filename:
20
21```text
22OpenViking_Community_QA_Weekly_Report_YYYY-MM-DD_to_YYYY-MM-DD.md
23```
24
25## Inputs
26
27- `sessions_root`: Required. Recursively read `.jsonl` session files from this directory.
28- `current_start` / `current_end`: Optional boundaries for the current reporting window.
29- `previous_start` / `previous_end`: Optional boundaries for the previous comparison window.
30- `previous_report`: Optional Markdown report created by this skill. Use it to preserve published definitions and historical figures.
31- `output_path`: Optional. If omitted, write to `reports/qa-weekly-YYYYMMDD-YYYYMMDD/` in the current workspace.
32- `session_scope`: Optional subdirectory, filename pattern, or explicit session set supplied by the user.
33- `history`: Optional verified report titles and links for downstream document rendering. Pass these through without querying for them.
34
35Infer missing values from the directory structure, timestamps, and previous report when possible. Ask the user only when the target session set or reporting boundary cannot be resolved and different choices would materially change the result.
36
37## Report Order
38
39The Markdown report must use this order:
40
411. Title: `OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD`
422. `Executive Summary`
433. `Releases This Week`
444. `Weekly Topic Ranking`
455. `Open High-Priority Issues`
466. `Week-over-Week Comparison`
477. `Weekly Activity`
488. `Trends and Recommendations`
499. `Methodology and Data Notes`
5010. `Previous Reports`
5111. `Appendix: Structured Report Data`
52
53`Releases This Week` may only summarize versions for which the sessions contain explicit evidence such as "released," "deployed," or "available to install." Statements such as "planned," "expected," or "will be included in the next release" are not completed releases. When there is no qualifying evidence, write: "No formal release could be confirmed from this week's sessions." Do not browse for confirmation.
54
55## Time Windows
56
57Use half-open intervals:
58
59```text
60Current: [current_start, current_end)
61Previous: [previous_start, previous_end)
62```
63
64Choose the cutoff in this order:
65
661. An explicit cutoff supplied by the user.
672. For an established weekly series, the previous report's `current_end + 7 days`.
683. When the user says "up to now," the current time in `Asia/Shanghai`.
694. Use the latest message timestamp only when the user explicitly states that the directory is a point-in-time export snapshot.
70
71Comparison requirements:
72
73- Current and previous windows must have equal duration, meet at one boundary, and never overlap.
74- Use consecutive seven-day windows by default. If the user asks for a shorter first period, show the actual range in both the title and methodology notes.
75- Messages at or after the current cutoff belong to the next report.
76- If the earliest exported message is later than the requested start, preserve the requested window and disclose incomplete coverage.
77- Record the earliest and latest valid messages and their distance from the requested boundaries.
78- If the current directory lacks previous-window data, prefer the structured appendix in `previous_report`. If neither is available, keep the comparison section and mark the previous period as unavailable. Never replace unknown values with zero.
79
80## Discover Session Files
81
82List candidate files first:
83
84```bash
85rg --files "$SESSION_ROOT" -g '*.jsonl'
86```
87
88Do not assume every file in the directory belongs to the target dataset:
89
901. Group files by directory level, filename prefix, and available metadata. Count files and determine the time range for each group.
912. Sample human messages from the beginning, middle, and end of each group to verify that it contains OpenViking community Q&A sessions.
923. Exclude test conversations, internal debugging, bot self-tests, unrelated products, and clearly irrelevant data.
934. When the user supplies an exact `session_scope`, honor it but still verify that it contains data.
945. Record discovered, included, and excluded file counts plus exclusion reasons in the methodology section. Only disclose masked summaries of internal identifiers.
95
96Do not select the target dataset solely because it contains the largest number of files.
97
98## Parse and Normalize JSONL
99
100Use a real JSON parser on every line:
101
102- Count malformed lines in `bad_lines`. Keep filenames and line numbers for local auditing, but do not expose them in the final report.
103- Skip non-message rows such as `_type=metadata`, while still using their session identifiers and contextual metadata.
104- Try timestamp fields in this order: `timestamp`, `created_at`, `create_time`, `time`. Support numeric timestamps in both seconds and milliseconds.
105- Convert timezone-aware values to `Asia/Shanghai`. Treat timezone-naive values as `Asia/Shanghai` and disclose that assumption.
106- Prefer plain string message bodies. For structured bodies, retain the original object during analysis and extract readable text through its structured fields rather than fragile string slicing.
107- Store the original role, normalized role, timestamp, session key, message key, internal speaker key, display-name candidates, and normalized text.
108
109Normalize roles as follows:
110
111- `user`, `human`, and equivalent roles count as human messages.
112- `assistant`, `bot`, and equivalent roles count as assistant messages.
113- `system`, `tool`, metadata, and equivalent records remain separate and never contribute to human activity or topic initiators.
114- Put unresolved roles in `unknown_role_messages` and manually sample them before making a decision. Never classify an unknown role as human by default.
115
116## Deduplication and Discussion Units
117
118One unique session is one discussion unit.
119
120Deduplicate in this order:
121
1221. Prefer stable message IDs.
1232. When a message ID is absent, hash `session_key + timestamp + sender_key + normalized_text`.
1243. Keep only one copy of duplicate session exports, preferring the file with more complete messages and broader time coverage.
1254. If only part of a file falls inside a window, count only the in-window messages. Adjacent out-of-window messages may be read for context but must not be counted.
1265. Merge files for the same issue only when they share a root key, reply chain, or other strong duplicate evidence. Text similarity alone is insufficient.
127
128An effective discussion contains a real technical question, failure, design comparison, usage feedback, or actionable answer. Pure sharing, status updates, greetings, bot tests, and content-free link forwarding may remain in total message counts but do not count as effective discussions.
129
130## Resolve and Mask Identities
131
132Display names may come only from the session files:
133
1341. An explicit display-name field on the message.
1352. A stable `[Name]:` or `[Name]:` prefix repeatedly associated with the same internal identity.
1363. If neither is available, use `Name unavailable`. Never guess a name or display an internal identity key.
137
138When one identity has multiple display-name candidates, review frequency, temporal continuity, and context. Keep identities separate when the evidence is insufficient.
139
140Masking rules:
141
142- One character: display `*`.
143- Two characters: preserve the first character, for example `张三 -> 张*`.
144- Three or more characters: preserve the first and last characters and replace every middle character with `*`, for example `秦浩杰 -> 秦*杰`.
145- Apply the same character-based rule to Latin, numeric, and mixed aliases, for example `darren -> d****n` and `Lin101 -> L****1`.
146- User-declared sensitive names override the general rule and preserve only the first character, for example `胡江涛 -> 胡**`.
147- In Markdown prose, escape masking asterisks when they appear inside emphasis, for example `Q\*n`; keep the raw value as `Q*n` in structured JSON.
148
149The final Markdown and structured JSON must not contain complete human names, email addresses, phone numbers, raw identity keys, Authorization values, API keys, root keys, tenant keys, or long credential-like strings.
150
151## Metrics
152
153Use the same code and definitions for both windows. At minimum, compute:
154
155- `discussion_units`: Unique sessions.
156- `effective_discussions`: Effective discussion units.
157- `participants`: Unique human identities in the window.
158- `human_messages`: Human messages.
159- `assistant_messages`: Assistant replies.
160- `system_messages`: System and tool messages.
161- `unknown_role_messages`: Messages whose roles remain unresolved.
162- `total_messages`: All counted messages.
163
164The following invariant must hold:
165
166```text
167human_messages + assistant_messages + system_messages + unknown_role_messages = total_messages
168```
169
170Participant counts, Top 10 users, and keywords must use human messages only. Assistant messages may help interpret the Q&A context or determine whether a question received a response, but they must not inflate human rankings.
171
172## Topics and Keywords
173
174Use stable topic buckets across weeks. Recommended baseline buckets:
175
176- Storage, Indexing, and Retrieval
177- Bot, Agent, and Skill Applications
178- Deployment, Runtime, and Environment Configuration
179- Memory, Compression, and Archiving
180- Models, Parsing Quality, and Cost
181- Permissions, Multi-Tenancy, and Collaboration
182- SDKs, APIs, and Tooling
183- Documentation, Examples, and Usage Questions
184- Other
185
186Classification rules:
187
188- Read the entire session before assigning multi-label topics.
189- A discussion unit may match multiple topics, so topic counts do not have to sum to total discussion units.
190- For each topic, compute discussion units, participants, human messages, keywords, and one concise insight.
191- Rank topics by discussion units, then human messages, participants, and the stable topic order.
192- Normalize keyword case, width variants, singular/plural forms, and common aliases before calculating the Top 20.
193- Remove stop words, greetings, template text, masked names, and path fragments that carry no topical meaning.
194- Preserve recognizable technical spellings such as `Memory`, `add_resource`, `VLM`, and `MCP`.
195
196Manually sample sessions behind popular topics and keywords to catch misclassification, log noise, or frequency inflation caused by assistant repetition.
197
198## Open High-Priority Issues
199
200Include only high-priority issues that remain unresolved at the data cutoff, with a default maximum of four. Here, unresolved means that the available sessions contain no complete chain of an explicit fix, usable release, existing-instance recovery, and user-side verification before the cutoff.
201
202A candidate must satisfy at least one of these conditions:
203
204- Multiple independent humans report the same issue.
205- There are concrete logs, a failure ratio, or reproducible steps, plus maintainer confirmation.
206- The issue affects a core path such as Session Commit, resource ingestion, semantic indexing, permission isolation, or data integrity.
207
208Exclude:
209
210- Issues fixed and verified by users within the available data window.
211- One-off errors without context, routine configuration questions, or hypotheses found only in assistant replies.
212- Security tests, casual chat, bot-to-bot exchanges, or unsupported root-cause claims.
213
214Every issue must contain these six fields:
215
2161. `Priority / Category`
2172. `Background`
2183. `User Impact`
2194. `Evidence`
2205. `Current Assessment`
2216. `Community Feedback`
222
223Immediately follow each issue with its own `Human Feedback Excerpt`. Include human messages only, omit assistant replies, and omit internal links:
224
225```markdown
226> **08-31 21:16 | O\*\*\*r**
227> Session Commit has failed repeatedly...
228>
229> **08-31 21:19 | 秦\*杰**
230> The current fix direction is still incorrect and needs another revision.
231```
232
233Every excerpt must come from sessions associated with that issue and preserve the timestamp, masked name, and essential meaning. Long logs may be shortened and unrelated text may be omitted, but never invent dialogue or mix messages from another issue.
234
235## Releases This Week
236
237Extract only explicit completed-release signals from the sessions: version, confirmation time, major changes, fixes, upgrade warnings, and related discussion.
238
239- Count only statements such as "released," "deployed," or "the new version is available."
240- Treat "preparing a release," "expected," and "next version" as plans, not completed releases.
241- When messages conflict, prefer the later statement backed by user verification, and preserve uncertainty in the evidence note.
242- If evidence is insufficient, keep the section and write: "No formal release could be confirmed from this week's sessions."
243- Pass through only URLs explicitly present in the sessions and valid in basic format. Do not browse or fabricate links.
244
245## Week-over-Week Comparison
246
247Compare the scale first, then the content:
248
2491. Previous and current values, absolute changes, and percentage changes for discussion units, effective discussions, participants, human messages, assistant messages, and total messages.
2502. Previous and current values plus percentage changes for every stable topic bucket.
2513. Changes in top keywords and top active users.
2524. Previous focus, current focus, and interpretation of each meaningful shift.
2535. One overall conclusion that distinguishes activity-volume changes from discussion-content changes.
254
255Percentage-change formula:
256
257```text
258(current - previous) / previous * 100
259```
260
261When the previous value is zero and the current value is positive, display `New`. When both are zero, display `0.0%`. When the previous value is unknown, display `Not comparable`; never substitute zero for unknown.
262
263Focus shifts must come from human review of high-frequency session digests from both windows. Do not infer them from keyword deltas alone.
264
265## Weekly Activity
266
267Include:
268
269- Participants, human messages, assistant messages, system messages, and total messages.
270- Daily human, assistant, and total message counts across the seven-day window.
271- Human message counts for every hour from 00 through 23.
272- Peak hour, second-highest hour, and peak day.
273- Top 10 active humans with rank, masked display name, message count, discussion-unit count, and core keywords.
274- Optional answer coverage and response latency. Compute these only when message ordering and reply relationships are reliable, and label them as heuristic metrics.
275
276Render the peak-time series as Mermaid while retaining the full 24-hour table:
277
278```mermaid
279xychart-beta
280 title "Hourly Human Message Distribution (CST)"
281 x-axis ["00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23"]
282 y-axis "Messages" 0 --> MAX
283 line [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
284```
285
286Replace `MAX` and all 24 data points. If Mermaid cannot render, the full data table must still preserve the result.
287
288## Trends and Recommendations
289
290Produce three to six actionable recommendations. Each recommendation must include:
291
292- The observed fact or change.
293- Its impact on Q&A efficiency, product experience, or maintenance work.
294- A concrete action involving a fix, documentation, monitoring, release, regression test, or communication.
295
296Prioritize unresolved P1 issues, repeated high-frequency questions, post-release compatibility warnings, activity changes, and data-quality gaps. Avoid empty language such as "continue monitoring" or "optimize further" without a named action.
297
298## Document and Whiteboard Data Requirements
299
300This skill does not create online documents, but its Markdown output must directly support the current weekly-report layout.
301
302### Summary Dashboard
303
304The structured data must be sufficient to generate:
305
306- Four KPIs: discussion units, effective discussions, participants, and total messages.
307- Top 6 weekly topics with discussion-unit bars.
308- Up to four unresolved P1 cards.
309- A 24-hour human-message line chart and peak-day annotation.
310- Top 10 active community members.
311- Top 20 core keywords. A compact board may show the first 12 while the Markdown retains all 20.
312
313### Comparison Dashboard
314
315The structured data must be sufficient to generate:
316
317- Three previous-to-current metric cards: discussion units, participants, and total messages.
318- Paired bars for the Top 6 stable topic buckets.
319- A focus-shift list.
320- An overall conclusion covering both activity volume and discussion content.
321
322### Document Body
323
324- Build the executive summary from structured metrics and conclusions.
325- Build the release section from explicit completed-release evidence found in sessions.
326- Render every P1 with six fields and an independent simulated human-chat block.
327- Put all six comparison metrics in the body while keeping only three core metrics on the board.
328- Keep independent fields for recommendations, methodology notes, and previous-report links.
329
330No important number may exist only in narrative prose while being absent from the structured data.
331
332## `qa-report.v3` Data Contract
333
334The Markdown must end with one `qa-report.v3` JSON object. The prose is for reading; the JSON is the authoritative source for downstream document and whiteboard rendering.
335
336Rules:
337
338- The JSON must be valid and contain no comments, trailing commas, `NaN`, ellipses, or placeholders.
339- Wrap it between `<!-- QA_REPORT_DATA_START -->` and `<!-- QA_REPORT_DATA_END -->`, and make it the final fenced JSON block in the document.
340- Use ISO 8601 timestamps with `+08:00`, `YYYY-MM-DD` dates, and integer hours from 0 through 23.
341- Store counts as integers and percentages as numbers. Use `null` for unknown values; never substitute zero.
342- `daily` must cover every date slice in the current window. `hourly` must contain exactly 24 entries, including zeros for inactive hours.
343- Mask all human display names before writing JSON. Do not store name mappings or internal identity keys.
344- Every numeric value in the prose must be directly readable from this object or reproducible through simple arithmetic, sorting, or the percentage-change formula.
345
346Required fields:
347
348```json
349{
350 "schema_version": "qa-report.v3",
351 "report": {
352 "title": "OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD",
353 "generated_at": "YYYY-MM-DDTHH:mm:ss+08:00",
354 "timezone": "Asia/Shanghai",
355 "window": {
356 "current": {"start": "YYYY-MM-DDTHH:mm:ss+08:00", "end": "YYYY-MM-DDTHH:mm:ss+08:00"},
357 "previous": {"start": "YYYY-MM-DDTHH:mm:ss+08:00", "end": "YYYY-MM-DDTHH:mm:ss+08:00"}
358 },
359 "coverage": {
360 "sessions_root": "user-supplied local path",
361 "discovered_files": 0,
362 "included_files": 0,
363 "excluded_files": 0,
364 "included_sessions": 0,
365 "earliest_message": null,
366 "latest_message": null,
367 "bad_lines": 0,
368 "missing_timestamps": 0,
369 "complete": true,
370 "notes": []
371 }
372 },
373 "summary": {
374 "headline": "One overall conclusion",
375 "top_topic_names": [],
376 "peak_hour": 0,
377 "peak_hour_messages": 0,
378 "peak_day": "YYYY-MM-DD",
379 "peak_day_messages": 0,
380 "open_p1_count": 0,
381 "release_versions": []
382 },
383 "presentation": {
384 "section_order": [
385 "Executive Summary",
386 "Releases This Week",
387 "Weekly Topic Ranking",
388 "Open High-Priority Issues",
389 "Week-over-Week Comparison",
390 "Weekly Activity",
391 "Trends and Recommendations",
392 "Methodology and Data Notes",
393 "Previous Reports"
394 ],
395 "summary_dashboard": {
396 "kpi_metric_order": ["discussion_units", "effective_discussions", "participants", "total_messages"],
397 "topic_limit": 6,
398 "anomaly_limit": 4,
399 "hourly_series": "human_messages",
400 "top_user_limit": 10,
401 "keyword_limit": 20,
402 "compact_keyword_limit": 12
403 },
404 "comparison_dashboard": {
405 "metric_order": ["discussion_units", "participants", "total_messages"],
406 "show_topic_change": true,
407 "show_focus_shift": true
408 }
409 },
410 "metrics": {
411 "current": {
412 "discussion_units": 0,
413 "effective_discussions": 0,
414 "participants": 0,
415 "human_messages": 0,
416 "assistant_messages": 0,
417 "system_messages": 0,
418 "unknown_role_messages": 0,
419 "total_messages": 0
420 },
421 "previous": {
422 "discussion_units": 0,
423 "effective_discussions": 0,
424 "participants": 0,
425 "human_messages": 0,
426 "assistant_messages": 0,
427 "system_messages": 0,
428 "unknown_role_messages": 0,
429 "total_messages": 0
430 }
431 },
432 "topics": [
433 {
434 "rank": 1,
435 "name": "Topic name",
436 "current": {"discussion_units": 0, "participants": 0, "human_messages": 0},
437 "previous": {"discussion_units": 0, "participants": 0, "human_messages": 0},
438 "delta_pct": 0.0,
439 "keywords": [],
440 "insight": ""
441 }
442 ],
443 "keywords": [
444 {"rank": 1, "keyword": "Memory", "current_count": 0, "previous_count": 0, "delta_pct": 0.0}
445 ],
446 "activity": {
447 "daily": [
448 {"date": "YYYY-MM-DD", "human_messages": 0, "assistant_messages": 0, "total_messages": 0}
449 ],
450 "hourly": [
451 {"hour": 0, "human_messages": 0}
452 ],
453 "peaks": {
454 "top_hours": [{"hour": 0, "messages": 0}],
455 "top_day": {"date": "YYYY-MM-DD", "messages": 0}
456 },
457 "top_users": [
458 {"rank": 1, "display_name": "Q*n", "messages": 0, "discussion_units": 0, "keywords": []}
459 ],
460 "response_metrics": {
461 "available": false,
462 "answered_discussions": null,
463 "answer_rate_pct": null,
464 "median_latency_seconds": null,
465 "p90_latency_seconds": null,
466 "method": ""
467 }
468 },
469 "releases": [
470 {
471 "version": "vX.Y.Z",
472 "published_at": "YYYY-MM-DDTHH:mm:ss+08:00",
473 "type": "main|hotfix|component",
474 "url": null,
475 "highlights": [],
476 "reliability_fixes": [],
477 "breaking_changes": [],
478 "related_topics": [],
479 "evidence": []
480 }
481 ],
482 "anomalies": [
483 {
484 "rank": 1,
485 "title": "Issue title",
486 "short_label": "Short label for the dashboard risk card",
487 "priority": "P1",
488 "category": "Category",
489 "background": "",
490 "user_impact": "",
491 "evidence": "",
492 "current_assessment": "",
493 "community_feedback": "",
494 "unresolved_at_cutoff": true,
495 "chat": [
496 {"time": "MM-DD HH:mm", "speaker": "Q*n", "message": "Masked human message"}
497 ]
498 }
499 ],
500 "comparison": {
501 "available": true,
502 "metric_conclusion": "",
503 "topic_conclusion": "",
504 "focus_shifts": [
505 {"previous_focus": "", "current_focus": "", "interpretation": ""}
506 ],
507 "overall_conclusion": ""
508 },
509 "recommendations": [
510 {"rank": 1, "observation": "", "impact": "", "action": ""}
511 ],
512 "history": [
513 {"title": "Previous report title", "url_or_path": "verified link or relative path"}
514 ]
515}
516```
517
518When previous-period data is unavailable, set `metrics.previous` to `null`; set each topic and keyword `previous`/`delta_pct` value to `null`; set `comparison.available=false`; and explain the reason in the prose. Never preserve a fabricated all-zero previous period.
519
520## Markdown Template
521
522````markdown
523---
524report_schema: qa-report.v3
525report_type: openviking_qa_weekly
526timezone: Asia/Shanghai
527current_start: YYYY-MM-DDTHH:mm:ss+08:00
528current_end: YYYY-MM-DDTHH:mm:ss+08:00
529previous_start: YYYY-MM-DDTHH:mm:ss+08:00
530previous_end: YYYY-MM-DDTHH:mm:ss+08:00
531generated_at: YYYY-MM-DDTHH:mm:ss+08:00
532---
533
534# OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD
535
536## Executive Summary
537
538- Reporting window: ...
539- Weekly volume: ...
540- Participation: ...
541- Leading topics: ...
542- Peak period: ...
543- Main conclusion: ...
544
545## Releases This Week
546
547| Version | Time | Type | Highlights | Upgrade Notes | Session Evidence |
548| --- | --- | --- | --- | --- | --- |
549
550## Weekly Topic Ranking
551
552| Rank | Topic | Discussion Units | Participants | Human Messages | Keywords | Insight |
553| ---: | --- | ---: | ---: | ---: | --- | --- |
554
555### Top 20 Keywords
556
557| Rank | Keyword | Current | Previous | Change |
558| ---: | --- | ---: | ---: | ---: |
559
560## Open High-Priority Issues
561
562### 1. Issue Title
563
564- **Priority / Category:** P1 / ...
565- **Background:** ...
566- **User Impact:** ...
567- **Evidence:** ...
568- **Current Assessment:** ...
569- **Community Feedback:** ...
570
571#### Human Feedback Excerpt
572
573> **Time | Masked Name**
574> Message...
575
576## Week-over-Week Comparison
577
578### Core Metrics
579
580| Metric | Previous | Current | Absolute Change | Percentage Change |
581| --- | ---: | ---: | ---: | ---: |
582
583### Topic Heat Changes
584
585| Topic | Previous | Current | Change | Interpretation |
586| --- | ---: | ---: | ---: | --- |
587
588### Focus and Discussion Shifts
589
590| Previous Focus | Current Focus | Interpretation |
591| --- | --- | --- |
592
593## Weekly Activity
594
595### Activity Overview
596### Daily Distribution
597### Peak-Time Line Chart
598### 24-Hour Data
599### Top 10 Active Community Members
600
601## Trends and Recommendations
602
6031. ...
604
605## Methodology and Data Notes
606
607- Data directory, discovered files, and included scope.
608- Both time windows, timezone, and actual data coverage.
609- Deduplication, roles, discussion units, effective discussions, and multi-label topic definitions.
610- Malformed lines, missing timestamps, unknown roles, and coverage gaps.
611- Display-name resolution and masking rules.
612
613## Previous Reports
614
615- [OpenViking Community Q&A Weekly Report: YYYY-MM-DD to YYYY-MM-DD](verified link or path)
616
617## Appendix: Structured Report Data
618
619<!-- QA_REPORT_DATA_START -->
620```json
621{complete qa-report.v3 object}
622```
623<!-- QA_REPORT_DATA_END -->
624````
625
626## End-to-End Procedure
627
6281. Scan `sessions_root` and identify the target session set from directories, filename prefixes, and metadata.
6292. Parse every JSONL line and record malformed rows, missing timestamps, unknown roles, and actual data coverage.
6303. Determine consecutive, equal-duration current and previous windows. Read `previous_report` when raw previous-window data is absent.
6314. Normalize message fields, roles, and timestamps, then deduplicate messages and duplicate session exports.
6325. Resolve display names only from session contents, apply masking, and scan for sensitive information.
6336. Compute discussion units, effective discussions, participants, and message metrics for both windows.
6347. Build a digest for every session, classify it with stable topic buckets, and manually sample the highest-volume topics.
6358. Compute Top 20 keywords, daily and hourly series, peaks, and the Top 10 active humans.
6369. Follow each candidate issue through later messages and retain only P1 issues with no closure evidence before the cutoff.
63710. Extract explicit completed-release signals from sessions. Do not count planned releases.
63811. Compare core metrics, topics, keywords, and focus areas, then write actionable recommendations.
63912. Assemble the complete `qa-report.v3` object first, and render both Markdown prose and Mermaid from that same object to prevent numeric drift.
64013. Reparse the final JSON and validate tables, formulas, ordering, the 24-hour series, masking, and all document/whiteboard fields.
641
642## Acceptance Checklist
643
644- The final deliverable is one self-contained `.md` file that remains understandable without temporary scripts or caches.
645- All analytical data comes from the target sessions and optional previous Markdown report; no other message source is mixed in.
646- Frontmatter declares `report_schema: qa-report.v3`, and the final JSON parses successfully.
647- The title dates match the current window; current and previous windows are equal, consecutive, and non-overlapping.
648- Discovered, included, and excluded file counts, malformed rows, and data coverage are recorded.
649- Message roles and totals reconcile, and unknown roles are not silently treated as human.
650- The weekly ranking includes discussion units, participants, human messages, keywords, and insights.
651- Weekly activity contains the daily table, complete 24-hour table, line chart, peaks, and Top 10.
652- The comparison covers scale, topics, and focus shifts; unavailable history is explicitly marked as not comparable.
653- Releases include only completed states confirmed in sessions; insufficient evidence is stated clearly.
654- Open issues contain only P1 items with no closure evidence before the cutoff, and each has all six fields plus its own human excerpt.
655- Human excerpts contain no assistant replies, invented messages, or internal links.
656- Every human name is masked; no complete name, internal identity key, or credential appears in the report.
657- `activity.hourly` is ordered from 0 through 23 with exactly 24 entries; `daily` covers every current-window date slice.
658- Top 10, Top 20, topic rankings, and all percentage changes are reproducible.
659- The structured data is sufficient to generate the summary dashboard, comparison dashboard, P1 body sections, and simulated chat modules directly.
660- Previous-report entries pass through only verified links or paths; never fabricate historical URLs.