GUIDE

Källor, rättelser och uppdateringar – följ uppgiften tillbaka

Börja med den uppgift du vill kontrollera. Följ originalet, läs datum och skilj en rättelse från ny forskning eller en ny publicering av samma text. [ACTIQS-PROCESS]

Separat granskad . Källornas egna datum framgår av underlagen.

Fråga vad underlaget faktiskt är

En produktdeklaration beskriver deklarerat innehåll. En bibliografisk post hjälper dig att hitta en publikation. En redaktionell sammanfattning förklarar ett underlag. ActiQs metodsida skiljer dessa slags information åt; en automatisk träff i publikationsregistret är inte bevis för en ingrediens effekt. [ACTIQS-METHOD]

Metodsidan anger också tre begränsningar: deklarerad mängd är inte laboratorieverifierat innehåll, okänd mängd är inte noll och en saknad interaktionspost är inget säkerhetsbesked. Behåll dessa skillnader när du granskar en uppgift. [ACTIQS-METHOD]

Läs mer än rubriken och hänvisningen

NCCIH rekommenderar att fråga vem som står bakom informationen, varför den finns och varifrån uppgifterna kommer. Centret påpekar att en nyhets sammanfattning kan lämna viktig information utanför. Försök därför läsa och förstå det original som påståendet hänvisar till. [NCCIH-TEN-FACTS] [NLM-CORRECTIONS]

En lättläst sammanfattning kan vara en väg in. NLM beskriver hur PubMed kan länka en patientsammanfattning till den vetenskapliga originalrapporten. De är olika texter: läs rätt dokument för den detalj du vill kontrollera. [NLM-CORRECTIONS]

Vad som finns bakom hänvisningen

Hänvisningarna leder till panelen Källor och hela underlag längre ned på sidan. Där finns källans adress och det underlag som tilldelades just texten. Läs också beskrivningen av omfattningen. Ett tilldelat faktablad betyder inte att alla dess refererade försöksrapporter har lästs separat. [ACTIQS-PROCESS]

Läs datumet tillsammans med vad det gäller

Notera studiens datum och leta efter nyare underlag. NCCIH framhåller att vetenskapliga metoder, kunskap och praxis förändras. Ett gammalt resultat behöver läsas i det större kunskapsläget. Ett nytt datum ersätter samtidigt inte frågan om vad texten faktiskt tillför. [NCCIH-TEN-FACTS] [NLM-CORRECTIONS] [ACTIQS-PROCESS]

NLM skiljer mellan en uppdaterad artikel och en återpublicering. En uppdatering länkas med bland annat ”Update in”, medan ”Republished in” kan betyda att samma artikel tryckts igen. Återpublicering är alltså inte i sig ett nytt forskningsresultat. [NLM-CORRECTIONS]

Nyhetsartikeln skiljer sitt publiceringsdatum från källans publiceringsdatum. En äldre studie kan alltså få en ny redaktionell redogörelse utan att studien är ny. I områdestexten och guiden anges separat granskningsdatum; källornas datum hör till underlagen. [NCCIH-TEN-FACTS] [NLM-CORRECTIONS] [ACTIQS-PROCESS]

En rättelse kan gälla en avgränsad uppgift

NLM använder beteckningen erratum för flera slags rättelser och tillägg, även rättelser av en enskild tabell eller bild. I PubMed kan ”Erratum in” länka originalets post till rättelsen. Läs rättelsemeddelandet för att se vad som ändrats. [NLM-CORRECTIONS]

Länken är en vägvisare, ingen beskrivning av rättelsens storlek. NLM skiljer inte konsekvent mellan produktionsfel och vetenskapliga metodfel i denna beteckning. Avgör därför inte felets betydelse enbart från ordet erratum. [NLM-CORRECTIONS]

En indragen artikel är en annan sorts meddelande

En retraction innebär att en artikel dragits tillbaka. En expression of concern är ett meddelande om oro kring artikelns tillförlitlighet, där en utredning kan följas av ett senare besked. Båda behöver läsas tillsammans med originalet. [NLM-CORRECTIONS]

NLM:s märkning av en indragen artikel skiljer inte mellan ärliga fel och oredlighet. Lägg därför inte till en förklaring om en viss forskares avsikt som inte står i det aktuella meddelandet. [NLM-CORRECTIONS]

Följ länken till en korrigerad helversion

Ibland rättas en artikel genom att hela texten publiceras på nytt. NLM skiljer ”Corrected and republished” från en vanlig återpublicering. Följ versionslänken så att du inte fortsätter citera en uppgift som har ersatts. [NLM-CORRECTIONS]

Gör en misstänkt avvikelse möjlig att kontrollera

Som praktiskt lässätt: spara sidans adress, titel och datumet du ser. Skriv av den berörda meningen eller tabellraden och ange vilket original, vilken rättelse eller vilken version du jämför med. Håll isär din iakttagelse och din föreslagna förklaring. [NCCIH-TEN-FACTS] [NLM-CORRECTIONS] [ACTIQS-METHOD]

Kontrollera först vilken sorts uppgift avvikelsen gäller. En saknad mängd får inte fyllas med noll, och en sökträff får inte behandlas som ett visat effektresultat. Dessa är begränsningar som ActiQs redan anger på sin metodsida. [ACTIQS-METHOD]

En ändrad slutsats behöver inte betyda ett gammalt skrivfel

Enligt NCCIH kommer det starkaste stödet från flera studier av olika forskargrupper. Ny kunskap kan ändra helhetsbilden även när den tidigare texten återgav dåtidens underlag korrekt. Skilj därför ny forskning från en rättelse av en specifik felaktig uppgift. [NCCIH-TEN-FACTS] [NLM-CORRECTIONS]

Vad ”separat granskad” betyder här

I ActiQs svenska läspaket granskas områdestextens eller guidens exakta hela version separat med AI mot det tilldelade underlaget. Granskningen ska omfatta även ingress, sammanfattande punkter och synliga hänvisningar. Efter godkänt beslut gör författaren en slutkontroll av samma version och original före publicering. [ACTIQS-PROCESS]

Detta är en kontroll av textens återgivning och källstöd. Det är inte medicinsk specialistgranskning eller ett besked om att produkten passar dig. En studies begränsningar kvarstår också när texten återger dem korrekt. [ACTIQS-PROCESS]

Vad en uppdatering behöver pröva

Ett godkännande gäller en viss text och ett visst källunderlag. Om texten eller dess tilldelade underlag ändras kan det gamla godkännandet inte användas som om den nya versionen redan vore granskad. Den nya hela versionen behöver kontrolleras innan den publiceras. [ACTIQS-PROCESS]

Den offentliga visningen kontrollerar också bindningen till de lagrade källversionerna. Det är inte en löpande kontroll av allt som publiceras på externa sajter. Ett granskningsdatum bevisar därför inte att en återförsäljares uppgifter just har hämtats igen eller att senare forskningsrättelser saknas. [ACTIQS-PROCESS]

Läs bild och kredit tillsammans

En bild märkt Illustrationsbild ska inte läsas som ett foto från den aktuella studien. Fotograf och bildtjänst anges vid bilden. Följ originalet om du vill kontrollera studiens egna illustrationer, tabeller eller försöksmaterial. [ACTIQS-PROCESS]

Kontakt och ansvar för rättelser

Nutri Nordic AB är huvudman och personuppgiftsansvarig för ActiQs och ansvarar även för drift- och säkerhetsincidenter. Den planerade kontaktadressen för frågor och rättelser är hello@actiqs.com. Brevlådan är ännu inte upprättad. Ange vilken sida och uppgift ditt ärende gäller och vilket original du jämför med. Skicka inte privata hälsouppgifter. [ACTIQS-OWNER] [ACTIQS-OWNER-CONTACT-STATUS]

Vad den här guiden hjälper dig med

Guiden hjälper dig att läsa källor och förbereda ett tydligt rättelseunderlag. NLM-källan beskriver PubMeds kopplingar mellan texter; den är ingen genomgång av alla publikationer. ActiQs metodsida beskriver ett begränsat informationsregister, inte ett komplett ingrediens- eller säkerhetsregister. [NLM-CORRECTIONS] [ACTIQS-METHOD]

Att ta med

Källor och hela underlag

ACTIQS-METHOD · ActiQs

Öppna källan

Two complete editorial prose sections and whole limitations/no-sales sidebar, anonymously read through browser. Source directory excluded; whole current procedural description, not clinical evidence.

URL: https://www.actiqs.com/sv/metod
Publisher: ActiQs
Source date: Not independently established; capture date is not publication date
Captured: 2026-10-18T18:42:30.088Z
Scope: Two complete editorial prose sections and whole limitations/no-sales sidebar, anonymously read through browser. Source directory excluded; whole current procedural description, not clinical evidence. Capture: Actual anonymous browser DOM; direct requests429, no documentHTTP200 or rawHTML claimed

Läs om ämnen och deklarationer

Följ granskade områdestexter, guider och deras källor. Till läspaketet →

Vad den första versionen innehåller

Ingrediensregistret innehåller korta egna grundbeskrivningar med referenser till NIH Office of Dietary Supplements. Uppgifterna är användarbidrag och kan vara ofullständiga. Separata, tydligt märkta fiktiva exempel används för mängdjämförelser. Publikationsregistret hämtar bibliografisk metadata från Europe PMC. En automatisk sökträff är bibliografisk metadata och används inte som bevis för en ingrediens effekt. Tre skillnader som alltid ska synas
En deklarerad mängd är inte ett laboratorieverifierat innehåll. Okänd mängd är inte noll. Saknad interaktionspost är inte ett säkerhetsbesked. Forskning och hälsopåståenden

ActiQs ska beskriva källor och deras begränsningar. Att citera en annan aktör är inte ett generellt undantag från regler om hälsopåståenden. Den som återanvänder data i produktmarknadsföring behöver bedöma den konkreta användningen. Livsmedelsverkets vägledning om närings- och hälsopåståenden →
Rättigheter till data

Registret sparar en rättighetsuppgift per källa. Grundbeskrivningar är egna sammanfattningar; referenslänkar är inte tillstånd att återpublicera originaltexter eller bilder. Import av nya produktdatabaser behöver en bedömning av villkor för vidareleverans. Under uppbyggnad

Täckningen är begränsad. Den här versionen är avsedd för granskning och utveckling och är inte ett komplett ingrediens- eller säkerhetsregister. Ingen produktförsäljning

ActiQs katalogiserar information. Sajten har ingen varukorg, inga produktköp och ingen försäljningsrankning.
NCCIH-TEN-FACTS · NIH National Center for Complementary and Integrative Health

Öppna källan

Whole main including introduction and all ten numbered facts via officialwebreader14..31. Sitefooter18October2026 is not an article update; linked originals not independently read.

URL: https://www.nccih.nih.gov/health/tips/10-things-to-know-about-the-science-of-health
Publisher: NIH National Center for Complementary and Integrative Health
Source date: Not independently established; sitefooter is not article date
Captured: 2026-10-18T18:00:36.954872+00:00
Scope: Whole main including introduction and all ten numbered facts via officialwebreader14..31. Sitefooter18October2026 is not an article update; linked originals not independently read.
Capture: official web reader; no direct rawHTML/PDFhash orHTTP200 claimed

# 10 Things To Know About the Science of Health

It’s sometimes difficult to tell the difference between health facts and myths, particularly around complementary and integrative health. Becoming familiar with scientific topics related to health research can help you better understand what you hear and read and make well-informed health decisions.

These 10 facts can give you a start in learning about the science of health. Want to know more? Check out our Know the Science online toolkit.
  1. Some online sources of information on complementary health approaches are useful, but others are inaccurate or misleading. If you're visiting an online health site for the first time or downloading a new app, ask these questions: Who runs or created the site or app? Do its claims seem too good to be true? Is it up-to-date? Where does the information come from? Why does the site or app exist? Is it selling something?
  2. Unless you read and understand the original sources for a health news story, it can be difficult to know whether the story is misleading or has left out important information. But the likelihood that the story is correct increases if it comes from a media outlet that isn’t promoting a point of view or cause, was written by a trained science or health reporter, and includes quotes from experts not connected to the study.
  3. Sometimes taking a prescription drug and dietary supplement together may increase the drug’s effects. The drug’s effects may become too strong, and unwanted side effects may increase.

  4. Sometimes taking a prescription drug and a supplement together may decrease the drug’s effects. This means that you aren’t getting the full benefit from the drug that your health care provider wants you to have.
  5. When it comes to medicine, there is no official definition for use of the term natural. And it’s important to know that “natural” does not always mean “safe.”

  6. Although many herbal or dietary supplements (and some prescription drugs) come from natural sources, “natural” does not always mean that it’s a better option for your health. Scientists are studying many of these products to identify what ingredients may be active and to better understand their effects in the body.
  7. Clinical trials to test whether a treatment is useful and safe in humans may vary in size and type. Well-planned clinical trials give the clearest information about whether a treatment is effective and safe. However, because they’re complicated, lengthy, and very, very expensive, they’re usually done only after smaller preliminary studies have shown some promise that the treatment may be helpful.
  8. The number of people participating in a study can affect the outcome of the study and what the results mean. Larger studies can increase the accuracy of the study findings and reduce the probability that any effect observed in the study was due to chance.

  9. The strongest evidence about whether a treatment is useful and safe consists of results from several studies by different investigators. Rarely does a single study provide a final, definitive answer.
  10. When looking for information from a study published in a medical journal, look at the date of the study. Was it conducted in the past year? 5 years? 15 years? As new information is learned, scientific standards and techniques change, and practices evolve. Looking at the date can provide insight into how the study fits into the larger evidence base on a particular topic.
NLM-CORRECTIONS · U.S. National Library of Medicine

Öppna källan

Whole current main, all linked-citation categories, examples and last-reviewed date; linked example articles/notices not independently assigned.

URL: https://www.nlm.nih.gov/bsd/policy/errata.html
Publisher: U.S. National Library of Medicine
Source date: 2026-02-10
Captured: 2026-10-18T18:40:37.098801+00:00
Scope: Whole current main, all linked-citation categories, examples and last-reviewed date; linked example articles/notices not independently assigned.
Capture: Actual HTTP200/rawHTML retained; main text extracted without paraphrase

Errata, Retractions, and Other Linked Citations in PubMed
Go to PubMed
NLM creates links in PubMed between citations for original articles and citations for retraction and erratum notices, expressions of concern, corrected and republished articles, comments, duplicate publications, updates, patient summaries, and republished articles. These links help users find the various citations associated with a given article. For help searching PubMed for linking citations, please see
Comment Correction Type
in online help.
NLM encourages publishers to follow the retraction, errata, and similar guidelines established by the
International Committee of Medical Journal Editors
and the
Committee on Publication Ethics
.
Errata
NLM does not differentiate between errors that originate in the publication process and those that result from errors of scientific logic or methodology, because journal editors do not make this distinction consistently or clearly. Corrections, corrigenda, addenda, and partial retractions (such as for a single graph, statement, table or image) for previously published articles are all uniformly considered by NLM to be errata.
Errata may be published to correct or add text or information that appears anywhere within an earlier published article. Errata must be labeled and published in citable form; that is, the erratum must appear on a numbered page in an issue of the journal that published the original article. For online journals or online-only content, the erratum must be readily discernable in the table of contents of a subsequent issue and must be associated with identifiable pagination or elocation. Publishers submit to NLM the citation data for an erratum notice and can find guidance on data submission at
XML help for data providers: Errata, retractions and comments
.
NLM links the citation for the erratum notice to the citation for the referent article, and the citation for the erratum notice is automatically indexed with the Publication Type Published Erratum [PT]. The citation for the erratum notice contains the phrase “Erratum for: [article title],” and the citation for the referent article contains the phrase “Erratum in: [article title].”
If the erratum involves correction of text or information that is part of the corresponding PubMed citation, such as the author, title or abstract, the publisher is responsible for updating the article citation to reflect the correction. Publishers can edit citation data at any time with the PubMed Data Management System (PMDM). More information may be found in
PMDM help
.
When appropriate, NLM will retain the ability to retrieve the data via the previous, uncorrected form of the citation. For example, if an author name has been corrected, NLM will retain the ability to search and retrieve the citation via the originally published, incorrect form of the author name, in addition to the ability to search and retrieve the citation via the corrected form of the author name. A notice about the correction in the citation will show both the incorrect spelling of the name and the corrected form.
If the erratum involves correction of a portion of the article that is not included in the NLM citation, such as the text, graphs, or tables, the erratum notice is simply linked to the citation for the corrected article.
For more information on errata in PubMed, please see
PubMed help
.
Example:
Erratum in:
PMID 28321512
Erratum for:
PMID 28405767
Retractions and Retraction Notices
Journals may retract or withdraw articles based on information from their authors, academic or institutional sponsor, editor or publisher, because of pervasive error or unsubstantiated or irreproducible data.  NLM creates links in PubMed between citations for original articles and citations for retraction notices based on information published by the journal. NLM does not differentiate between articles that are retracted because of honest error and those that are retracted because of scientific misconduct or plagiarism.
Retraction notices must clearly state that the article in question is being retracted or withdrawn in whole by an author of the retracted paper or author’s legal counsel; by the head of the department, dean, or director of the laboratory where the paper was produced; or by the journal editor.
Retraction notices must be labeled and published in citable form; that is, the retraction must appear on a numbered page in an issue of the journal that published the retracted article. For online journals or online-only content, the retraction notice must be readily discernible in the table of contents of a subsequent issue and must be associated with identifiable pagination or elocation.
Data providers can find more guidance in
XML help for data providers: Errata, retractions and comments
and
XML help for data providers: Ahead of print Withdrawn Policy
.
The Publication Type Retraction Notice [PT] is assigned to the citation for the retraction notice, and the citation is linked to the citation for the retracted article. The Publication Type Retracted Publication [PT] is assigned to the retracted article. Citations for retraction notices contain the phrase “Retraction of: [article title],” and citations for retracted articles contain the phrase “Retraction in: [article title].”
Example:
Retraction in:
PMID 19717156
Retraction of:
PMID 27326436
Expression of Concern
An expression of concern about the integrity of a published article is typically written by an editor using that phrase in the item title. It is the responsibility of the editor to initiate appropriate investigative procedures, discover the outcome of the investigation, and notify readers of that outcome in a subsequent issue of the journal. The outcome may require the publication of a retraction notice. The citation for an expression of concern is linked to the citation for the referent article. Citations for expressions of concern contain the phrase “Expression of concern for: [article title],” and citations for the referent article contain the phrase “Expression of concern in: [article title].”
Example:
Expression of concern in:
PMID 27552597
Expression of concern for:
PMID 27939408
Comments
Comments are substantive articles, letters or editorials that challenge, refute, support, or expand upon another published item. Among the types of articles that are considered comments are: invited comments on another article; letters to the editor that were inspired by a previous article; and articles that provide additional information to previous articles. A mere mention of one or more articles in the text or references does not constitute a comment. The commenting article must have been written primarily for the purpose of making a comment—that is, of drawing the reader’s attention to the referent article.
Since 1989, NLM has created links between commenting articles and the articles to which they refer. Citations for comments include the phrase “Comment on: [article title],” and citations for the referent article include the phrase “Comment in: [article title].” A commenting citation is indexed with the Publication Type Comment [PT].
The majority of comment links are for substantive comments published within the same journal title. Links are also made for comments to articles previously published in different journals when they consist of a substantive summary and analytical evaluation, especially in relation to evidence-based medicine. Some journals are largely devoted to this type of comment, such as
Evidence-Based Nursing
and
Evidence-Based Mental Health
.
Example:
Comment on:
PMID 28264092
Comment in:
PMID 28264080
Author Responses to Comments
Frequently, a published letter that NLM considers a comment will be immediately followed by a response written by the author(s) of the original article. Citations for such published author responses are linked to the commenting letter as well as the original article.
Prior to 2013, author replies were not cited separately but had their pagination included in the pagination of the commenting letter.
From 2013 to 2015, if the author reply had a non-distinctive title such as “Reply” or “Author Reply,” the title was amended to include the PMID of the commenting letter in the format “Author Reply: To PMID 12345678.”
Effective in 2016, NLM stopped editing the article title of author replies and accepts the article title as submitted by the publisher.
Example:
Comment in:
PMID 25732203
Comment on:
PMID 26899895
Comment on:
PMID 27062210
Corrected and Republished Articles
Occasionally, a journal may correct a previously published article by republishing the article in its entirety, often to rectify an editorial or printing error in the original article. The citation for the republished article is indexed with the additional Publication Type of Corrected and Republished Article [PT] and is linked to the citation for the original article. Citations for a republished article include the phrase “Corrected and republished from: [article title],” and citations for the original article include the phrase “Corrected and republished in: [article title].”
Example:
Corrected and republished in:
PMID 25661664
Corrected and republished from:
PMID 27049155
Journals also may correct a previously published article that was retracted due to errors in science. The citation for the republished article is indexed with the Publication Type of Corrected and Republished Article [PT] and is linked to the citation for the retracted article. Citations for a republished article include the phrase “Retracted and republished from: [article title],” and citations for the retracted article include the phrase “Retracted and republished in: [article title].”
Example:
Retracted and republished in:
PMID 23432189
Retracted and republished from:
PMID 29897866
Duplicate Publications
When NLM identifies an article that duplicates another article without acknowledgement, the citations for both articles are assigned the Publication Type of Duplicate Publication [PT]. Duplication may occur inadvertently through multiple submissions of a manuscript to different journals. When duplication is acknowledged and intentional to achieve wider dissemination of an article, such as a policy statement, the Duplicate Publication [PT] is not assigned.
The Publication Type of Duplicate Publication [PT] may be added to a citation with or without a formal notification from authors or journal editors. In the indexing process, indexers sometimes recognize duplicates; however, NLM does not routinely examine articles for originality.
Example:
PMID 26384862
PMID 26333029
A notice of duplicate publication is sometimes published within a journal when an occurrence of duplicate publication is discovered. Such notices are cited and indexed with the MeSH subject heading Duplicate Publication as Topic [MH], and comment linkages are created to each of the citations for the duplicate articles.
Updated Articles
An article that updates a previous article must explicitly state that it is an updated version of a previously published article or must appear in a journal that routinely publishes such updates as its primary content. NLM began to link citations for updated articles to the citation for the original article in 2001. The citation for the updated article contains the phrase “Update of: [article title],” and the citation for the original article contains the phrase “Update in: [article title].” Updated articles occur primarily in the Cochrane Database of Systematic Reviews.
Example:
Update in:
PMID 15846749
Update of:
PMID 18254074
Patient Summaries
Some journals routinely publish patient summaries of full articles that appear in the same journal issue. The summaries are intended for patients or the lay public to explain in non-technical terms the scientific or medical findings reported in the full article.
These citations are indexed with the Publication Type of Patient Education Handout [PT] and are linked to the corresponding citation for the full, scientific article. Citations for patient summaries contain the phrase “Original report in: [article title],” and citations for the original scientific article contain the phrase “Summary for patients in: [article title].”
Summary for patients in:
PMID 26903390
Original report in:
PMID 26902107
Republished (Reprinted) Articles
Journals occasionally republish (i.e., reprint) a significant article that was recently published in another journal. Such republished or reprinted articles are cited, and links are created between the citations for the original and republished article. The citation for the republished article is not indexed with MeSH headings. The citation for the republished article contains the phrase “Republished from: [article title],” and the citation for the original article contains the phrase “Republished in: [article title].”
This policy applies if there is an explicit indication that the article is being republished or reprinted, even if it is being republished in an abridged or different version from the original. (However, there is a distinction from corrected and republished articles, for which a different policy and pair of citation links are used.)
Example:
Republished in:
PMID 18234913
Republished from:
PMID 18364410
Last Reviewed: February 10, 2026
ACTIQS-PROCESS · ActiQs

ActiQs eget processunderlag: sju hela implementationsoriginal från angiven daterad webbversion. Ingen klinisk källa, ingen hämtad myndighetssida och ingen publik originaladress. Hela originalet återges här.

{
  "contract": "visitor-content-first-party-originals-v1-20261019",
  "publisher": "ActiQs",
  "origin_kind": "implementation_snapshot",
  "claims_scope": "publisher_process_and_responsibility_only",
  "recorded_at": "2026-10-19T07:43:09.003572+00:00",
  "provenance": {
    "bundle_sha256": "f57ba0c07cb0ff811b2dcbd8bfe408cc376db03969dcdd1980840456b09a8a26",
    "freeze_sha256": "25208267b37dfef4c46bbf1fe56d29af3ed2551f7cefc2f11d8c715cc9752072",
    "files": [
      {
        "path": "src/lib/visitor-publications.ts",
        "text": "import{createHash}from'node:crypto';\nimport{cache}from'react';\nimport{validateGuideRequest}from'./visitor-guides/review-request';\nimport{verifyGuideAttempt}from'./visitor-guides/exact-attempt-verifier.mjs';\nimport{asyncProductGuideSourcesMatch}from'./visitor-guides/async-product-source-guard';\nimport bundle from'../data/visitor-publications.json';\nimport type{Database}from'./database';\nconst hash=(v:string)=>createHash('sha256').update(v).digest('hex');\nfunction need(v:unknown,message:string):asserts v{if(!v)throw Error(message);}\nexport type VisitorPublication={job:any;attempt:any;journal:any;started:any;author_final:{draft_sha256:string;source_book_sha256:string;checked_at:string;author_identity:string}};\n/** Reads exported actual ledger rows. No input is allowed to supply an inferred approval. */\nexport function verifyVisitorPublication(p:VisitorPublication){\n const{job,attempt,journal,started,author_final:final}=p;\n need(job&&attempt&&journal&&started&&final,'Missing publication origin');\n need(job.id==='visitor-guide:'+hash(job.draft_text+'\\0'+job.source_book_text),'Job identity does not bind exact bytes');\n need(job.state==='ready'&&attempt.job_id===job.id&&attempt.attempt===job.attempts&&journal.id===job.id&&journal.attempt===job.attempts,'Wrong approved attempt');\n need(journal.response_json&&journal.received_at&&journal.dispatch_started_at,'No completed actual response');\n need(journal.owner===started.owner&&journal.token===started.lease_token,'Claim/journal owner mismatch');\n const start=Date.parse(journal.dispatch_started_at),end=Date.parse(journal.received_at),lease=Date.parse(started.lease_until);\n need(Number.isFinite(start)&&Number.isFinite(end)&&Number.isFinite(lease)&&end>=start&&end<lease,'Actual response outside claim lease');\n need(attempt.reviewer_identity===journal.owner&&attempt.model===journal.requested_model&&attempt.started_at===journal.dispatch_started_at&&attempt.finished_at===journal.received_at,'Attempt does not bind actual request');\n need(hash(journal.request_json)===journal.request_sha256,'Recorded request changed');\n const request=JSON.parse(journal.request_json),response=JSON.parse(journal.response_json);validateGuideRequest(request,job);\n need(response.representation==='choice-message-content'&&response.finish_reason!=='length'&&response.requested_model===journal.requested_model&&response.raw_response===attempt.raw_response&&response.raw_response_sha256===attempt.raw_response_sha256&&hash(response.raw_response)===response.raw_response_sha256,'Recorded response mismatch');\n const review=verifyGuideAttempt({draftBytes:Buffer.from(job.draft_text),sourceBookBytes:Buffer.from(job.source_book_text),job,attempt});\n need(final.author_identity===job.author_identity&&final.draft_sha256===job.draft_sha256&&final.source_book_sha256===job.source_book_sha256&&Number.isFinite(Date.parse(final.checked_at))&&Date.parse(final.checked_at)>=end,'Missing exact whole author final after review');\n const draft=JSON.parse(job.draft_text),book=JSON.parse(job.source_book_text);\n need(draft.schema_version===1&&draft.language==='sv'&&/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(draft.id)&&['area','guide'].includes(draft.content_kind??'guide'),'Unsupported published content');\n need(draft.source_book_sha256===job.source_book_sha256,'Source book binding mismatch');\n need(Array.isArray(book.sources)&&book.sources.length===draft.sources.length,'Incomplete originals');\n for(const s of book.sources)need(Array.isArray(s.original_sections)&&s.original_sections.length&&hash(JSON.stringify(s.original_sections))===s.captured_sections_sha256&&/^https:\\/\\//.test(s.source_url),'Invalid original or public source link');\n return{draft,book,review};\n}\n/** Only deployment-bundled, independently approved, still-current originals become public. */\nexport async function publishedVisitorContent(db:Database,areaIdentity?:string){\n const result=[];\n for(const raw of bundle.entries as VisitorPublication[]){\n  // A navigation filter only; every selected entry still requires exact approval and current sources.\n  if(areaIdentity){const draft=JSON.parse(raw.job.draft_text);if(draft.content_kind!=='area'||!draft.identity_ids?.includes(areaIdentity))continue;}\n  const checked=verifyVisitorPublication(raw);\n  if(!await asyncProductGuideSourcesMatch(db,raw.job))continue;\n  result.push(checked);\n }\n return result;\n}\nexport const visitorPublicationList=cache(async()=>{\n if(!bundle.entries.length)return[];\n const{database}=await import('./database');return publishedVisitorContent(await database());\n});\nexport async function visitorPublication(kind:'area'|'guide',id:string){return(await visitorPublicationList()).find(p=>(p.draft.content_kind??'guide')===kind&&p.draft.id===id)??null;}\nexport async function publishedVisitorProducts(){\n const candidates=bundle.products as{ id:string;record_id:string;version_id:string;name:string;ean13:string;hosted_verified_at:string }[];\n if(!candidates.length)return[];\n const{database}=await import('./database'),db=await database();\n const rows=await db.query<{id:string;current_version_id:string}>('SELECT id,current_version_id FROM retailer_product_records WHERE id IN ('+candidates.map(()=>'?').join(',')+')',candidates.map(p=>p.record_id));\n return candidates.filter(p=>Number.isFinite(Date.parse(p.hosted_verified_at))&&rows.some(r=>r.id===p.record_id&&r.current_version_id===p.version_id));\n}\n",
        "sha256": "90880e97f8c9caec3027290b83bb2501b362e7d664e7bbcff1f6e6db280ba464",
        "bytes": 5385
      },
      {
        "path": "src/lib/visitor-guides/exact-attempt-verifier.mjs",
        "text": "// Isolated exact-attempt verifier. No worker, database, model call or publication integration.\r\nimport {hash} from './guide-reader.mjs';\r\nimport {visibleBlocks} from './visible-coverage.mjs';\r\nconst requireValue=(v,m)=>{if(!v)throw Error(m);};\r\nexport function verifyGuideAttempt({draftBytes,sourceBookBytes,job,attempt}){\r\n requireValue(job&&attempt&&job.id===attempt.job_id,'Attempt/job mismatch');\r\n requireValue(job.state==='ready'&&Number.isSafeInteger(job.attempts)&&job.attempts>0&&attempt.attempt===job.attempts,'No current ready attempt');\r\n requireValue(attempt.outcome==='approved'&&attempt.started_at&&attempt.finished_at,'No finished approved attempt');\r\n const started=Date.parse(attempt.started_at),finished=Date.parse(attempt.finished_at);\r\n requireValue(Number.isFinite(started)&&Number.isFinite(finished)&&finished>=started,'Invalid attempt dates');\r\n requireValue(job.author_identity&&attempt.reviewer_identity&&job.author_identity!==attempt.reviewer_identity,'Separate reviewer required');\r\n requireValue(typeof attempt.model==='string'&&attempt.model.trim(),'Missing actual review model');\r\n const draftHash=hash(draftBytes),bookHash=hash(sourceBookBytes);\r\n requireValue(job.draft_sha256===draftHash&&attempt.draft_sha256===draftHash&&job.source_book_sha256===bookHash&&attempt.source_book_sha256===bookHash,'Exact input binding failed');\r\n requireValue(typeof attempt.raw_response==='string'&&attempt.raw_response.length>0&&hash(attempt.raw_response)===attempt.raw_response_sha256,'Raw response binding failed');\r\n const response=JSON.parse(attempt.raw_response);\r\n requireValue(response.decision==='approve'&&response.complete===true&&response.identity_preserved===true&&response.sources_supported===true&&response.no_unsupported_claims===true,'No complete semantic approval');\r\n requireValue(typeof response.confidence==='number'&&Number.isFinite(response.confidence)&&response.confidence>=.95&&response.confidence<=1,'Approval confidence insufficient');\r\n requireValue(typeof response.reason==='string'&&response.reason.trim(),'Missing actual reason');\r\n requireValue(!/\\b(?:reject|rejected|do not approve|cannot approve)\\b/i.test(response.reason),'Contradictory approval reason');\r\n requireValue(Array.isArray(response.findings)&&response.findings.length===0,'Unresolved findings');\r\n const draft=JSON.parse(draftBytes.toString('utf8')),blocks=visibleBlocks(draft),sources=new Set(draft.sources.map(s=>s.id));\r\n requireValue(response.visible_coverage_contract==='whole-visible-guide-v1'&&Array.isArray(response.visible_coverage)&&response.visible_coverage.length===blocks.length,'Incomplete visible review');\r\n for(const block of blocks){const matches=response.visible_coverage.filter(c=>c.block_id===block.id);requireValue(matches.length===1,'Missing/duplicate visible review');const c=matches[0];requireValue(c.supported===true&&c.text_sha256===block.text_sha256,'Unsupported/changed visible block');requireValue(Array.isArray(c.source_ids)&&c.source_ids.length>0&&new Set(c.source_ids).size===c.source_ids.length&&c.source_ids.every(id=>sources.has(id)),'Invalid visible source references');}\r\n return {draft_sha256:draftHash,source_book_sha256:bookHash,actual_response_sha256:attempt.raw_response_sha256,finished_at:attempt.finished_at,author_identity:job.author_identity,reviewer_identity:attempt.reviewer_identity,model:attempt.model,visible_coverage:response.visible_coverage,decision:'approve'};\r\n}\r\n",
        "sha256": "3d4eff1acf158fbeb5231e79ac40c9413c7423ed32b935628ca9be034cca6900",
        "bytes": 3436
      },
      {
        "path": "src/lib/visitor-guides/review-request.ts",
        "text": "// Exact guide request compiler. No inference, DB, scheduler or publication side effects.\n\nimport assert from 'node:assert/strict';\n\nimport{createHash}from'node:crypto';\n\nimport{visibleBlocks}from'./visible-coverage.mjs';\n\nimport{guideResponseSchema}from'./response-schema';\n\nconst sha=(s:string)=>createHash('sha256').update(s).digest('hex');\n\nconst previousClarification=`\\nUse the exact JSON key \"confidence\" for your number, never \"numeric\". visible_coverage MUST be an array of objects. Use every supplied block ID and its exact digest, including titles, headings and checklist items. Approval requires a nonempty list of assigned source IDs for EVERY block. Generic editorial wording is not an exception. Do not invent, auto-fill or copy author source hints as proof. Read all assigned original sections and independently determine actual support. If source support is absent or a claim is materially unsupported, return a coherent rejection with the exact block digest and a relevant contiguous original source quote explaining the conflict or limitation. Do not create an irrelevant citation merely to satisfy formatting. Do not claim approval when you cannot satisfy the existing source-bound contract. Author source hints identify where to look only; they are not reviewer findings or verified support.`;\n\nexport const clarification=previousClarification+`\\nThe Swedish guide may explain or paraphrase the assigned English or Swedish originals; its wording need not be verbatim source text. Judge whether its factual claims and limits are supported, not whether explanatory prose is a literal transcription. Only source_quote in a rejection finding must be an exact contiguous original quotation. Never approve unsupported generalizations or invent citations merely because paraphrasing is allowed.`;\nexport type JobInput={draft_text:string;source_book_text:string;draft_sha256:string;source_book_sha256:string};\n\nfunction manifest(draft:any){\n\n const texts=new Map<string,string>([['title',draft.title],['dek',draft.dek]]);\n\n for(const s of draft.sections){texts.set(`section:${s.id}:heading`,s.heading);s.paragraphs.forEach((v:string,i:number)=>texts.set(`section:${s.id}:paragraph:${i}`,v));}\n\n draft.checklist.forEach((v:string,i:number)=>texts.set(`checklist:${i}`,v));\n\n return visibleBlocks(draft).map((b:{id:string;text_sha256:string})=>{const text=texts.get(b.id);assert.equal(sha(text!),b.text_sha256);const section=draft.sections.find((s:any)=>b.id.startsWith(`section:${s.id}:`));return{...b,text,author_source_hints:section?.source_refs??[],hints_are_evidence:false};});\n\n}\n\nexport function buildGuideRequest(job:JobInput,instruction:string){\n\n assert.equal(sha(job.draft_text),job.draft_sha256);assert.equal(sha(job.source_book_text),job.source_book_sha256);\n\n const draft=JSON.parse(job.draft_text),book=JSON.parse(job.source_book_text),blocks=visibleBlocks(draft),reviewer_blocks=manifest(draft),sourceIds:string[]=draft.sources.map((s:any)=>s.id);\n\n assert.deepEqual(sourceIds,[...new Set(sourceIds)]);assert(sourceIds.every((id:string)=>book.sources.some((s:any)=>s.id===id)));\n\n const {outputSchema}=guideResponseSchema(blocks,sourceIds);\n\n return{instruction:instruction+clarification,whole_draft:draft,whole_source_book:book,visible_blocks:blocks,draft_sha256:job.draft_sha256,source_book_sha256:job.source_book_sha256,reviewer_blocks,request_transport:{contract:'guide-request-schema-binding-v1',output_schema:outputSchema,output_schema_sha256:sha(JSON.stringify(outputSchema))}};\n\n}\n\nexport function validateGuideRequest(input:any,job:JobInput){\n\n assert.equal(input.draft_sha256,job.draft_sha256);assert.equal(input.source_book_sha256,job.source_book_sha256);\n\n assert.deepEqual(input.whole_draft,JSON.parse(job.draft_text));assert.deepEqual(input.whole_source_book,JSON.parse(job.source_book_text));assert.deepEqual(input.visible_blocks,visibleBlocks(JSON.parse(job.draft_text)));\n\n // Completed historical requests retain the exact original JSON-object transport.\n\n if(input.request_transport===undefined){assert.equal(input.reviewer_blocks,undefined);return undefined;}\n\n assert.equal(input.request_transport.contract,'guide-request-schema-binding-v1');\n\n assert([previousClarification,clarification].some(suffix=>input.instruction.endsWith(suffix)));assert.deepEqual(input.reviewer_blocks,manifest(input.whole_draft));\n\n const {outputSchema}=guideResponseSchema(input.visible_blocks,input.whole_draft.sources.map((s:any)=>s.id));assert.deepEqual(input.request_transport.output_schema,outputSchema);assert.equal(input.request_transport.output_schema_sha256,sha(JSON.stringify(outputSchema)));\n\n return outputSchema;\n\n}\n\nexport function recordedGuideInput(input:any){return{draft:input.whole_draft,whole_source_book:input.whole_source_book,visible_blocks:input.visible_blocks,draft_sha256:input.draft_sha256,source_book_sha256:input.source_book_sha256,...(input.request_transport?{reviewer_blocks:input.reviewer_blocks}:{})};}\n\n",
        "sha256": "236d283318e21c855a6737b9f7f9640245da35fb194e554afd63491ccc85c60f",
        "bytes": 4964
      },
      {
        "path": "src/lib/visitor-guides/async-product-source-guard.ts",
        "text": "// Staged read-only source guard for the two product-declaration guide drafts.\nimport {createHash} from 'node:crypto';\nimport type {Database} from '../database';\ntype Input = {draft_text:string;source_book_text:string;draft_sha256:string;source_book_sha256:string};\ntype Source = {id:string;record_id:string;version_id:string;source_url:string;captured_sections_sha256:string;original_sections?:unknown[]};\nexport const visitorGuideSourceContract='visitor-content-typed-originals-v1-20261018';\ntype TypedSource=Source&{source_type?:'product_declaration'|'authority'|'chemical_identity_collection';raw_sha256?:string;members?:{id:string;version_id:string;name:string;definition:string}[]};\nconst hash=(s:string)=>createHash('sha256').update(s).digest('hex');\nconst valid=(s:Source)=>s&&['id','record_id','version_id','source_url','captured_sections_sha256'].every(k=>typeof s[k as keyof Source]==='string'&&String(s[k as keyof Source]).trim());\n\n// Caller keeps the transaction open across this check and its guarded mutation.\n// SELECTs alone do not establish external formulation freshness or hosted parity.\nexport async function asyncProductGuideSourcesMatch(db:Database,job:Input):Promise<boolean>{\n try{\n  if(!['sqlite','postgres'].includes(db.dialect??'')||hash(job.draft_text)!==job.draft_sha256||hash(job.source_book_text)!==job.source_book_sha256)return false;\n  const draft=JSON.parse(job.draft_text) as {source_book_sha256?:string;sources:TypedSource[]};\n  const book=JSON.parse(job.source_book_text) as {source_contract?:string;sources:TypedSource[]};\n  if(draft.source_book_sha256!==job.source_book_sha256||!Array.isArray(draft.sources)||!draft.sources.length||!Array.isArray(book.sources)||draft.sources.length!==book.sources.length)return false;\n  if(!draft.sources.every(valid)||!book.sources.every(valid)||new Set(draft.sources.map(s=>s.id)).size!==draft.sources.length||new Set(book.sources.map(s=>s.id)).size!==book.sources.length)return false;\n  for(const source of draft.sources){\n   const original=book.sources.find(s=>s.id===source.id);\n   if(!original||['record_id','version_id','source_url','captured_sections_sha256'].some(k=>original[k as keyof Source]!==source[k as keyof Source]))return false;\n   if(source.source_type!==original.source_type)return false;\n   if(!Array.isArray(original.original_sections)||!original.original_sections.length||hash(JSON.stringify(original.original_sections))!==source.captured_sections_sha256)return false;\n   if(source.source_type==='authority'){\n    if(book.source_contract!==visitorGuideSourceContract||source.raw_sha256!==original.raw_sha256)return false;\n    const rows=await db.query<{source_id:string;raw_text:string;raw_hash:string;payload_json:string}>(`SELECT v.source_id,v.raw_text,v.raw_hash,v.payload_json FROM ingredient_profile_source_current c JOIN ingredient_profile_source_versions v ON v.id=c.version_id WHERE c.source_id=? AND c.version_id=?`,[source.record_id,source.version_id]);\n    if(rows.length!==1||rows[0].source_id!==source.record_id||hash(rows[0].raw_text)!==rows[0].raw_hash||rows[0].raw_hash!==source.raw_sha256||JSON.parse(rows[0].payload_json).url!==source.source_url)return false;\n    if(JSON.stringify(original.original_sections)!==JSON.stringify([{kind:'authority',text:rows[0].raw_text}]))return false;\n    continue;\n   }\n   if(source.source_type==='chemical_identity_collection'){\n    const members=source.members;\n    if(book.source_contract!==visitorGuideSourceContract||!Array.isArray(members)||!members.length||JSON.stringify(members)!==JSON.stringify(original.members)||new Set(members.map(m=>m.id)).size!==members.length||hash(JSON.stringify(members))!==source.version_id)return false;\n    for(const member of members){\n     const rows=await db.query<{id:string;version_id:string;name:string;definition:string}>(`SELECT s.id,s.current_version_id AS version_id,s.name,v.definition FROM substances s JOIN substance_versions v ON v.id=s.current_version_id AND v.substance_id=s.id WHERE s.id=? AND s.obsolete=0`,[member.id]);\n     if(rows.length!==1||JSON.stringify(rows[0])!==JSON.stringify(member))return false;\n    }\n    if(JSON.stringify(original.original_sections)!==JSON.stringify(members.map(m=>({kind:'definition',text:JSON.stringify(m)}))))return false;\n    continue;\n   }\n   if(source.source_type!==undefined&&source.source_type!=='product_declaration')return false;\n   const records=await db.query<{current_version_id:string}>('SELECT current_version_id FROM retailer_product_records WHERE id=?',[source.record_id]);\n   if(records.length!==1||records[0].current_version_id!==source.version_id)return false;\n   const versions=await db.query<{record_id:string;payload_json:string}>('SELECT record_id,payload_json FROM retailer_product_versions WHERE id=?',[source.version_id]);\n   if(versions.length!==1||versions[0].record_id!==source.record_id||JSON.parse(versions[0].payload_json).source_url!==source.source_url)return false;\n   const links=await db.query<{job_id:string}>('SELECT job_id FROM retailer_recipe_links WHERE version_id=?',[source.version_id]);\n   if(links.length!==1)return false;\n   const jobs=await db.query<{sections_json:string}>('SELECT sections_json FROM retailer_recipe_jobs WHERE id=?',[links[0].job_id]);\n   if(jobs.length!==1||jobs[0].sections_json!==JSON.stringify(original.original_sections))return false;\n  }\n  return true;\n }catch{return false;}\n}\n",
        "sha256": "40e3c9d5125d8507078502b96ec63f3b0d7b28d4e16bd8de587fd3b2a429b4c1",
        "bytes": 5388
      },
      {
        "path": "src/components/visitor-content.tsx",
        "text": "import Link from'./localized-link';\nimport{Breadcrumb,LocalizedDate}from'./ui';\nimport type{verifyVisitorPublication}from'@/lib/visitor-publications';\ntype Publication=ReturnType<typeof verifyVisitorPublication>;\nexport function VisitorContent({entry,products=[]}:{entry:Publication;products?:{id:string;record_id:string;name:string}[]}){\n const{draft,book,review}=entry;\n const refs=(blockId:string)=>review.visible_coverage.find((c:any)=>c.block_id===blockId)?.source_ids??[];\n const citations=(blockId:string)=><span className=\"fine-print\">{refs(blockId).map((id:string)=><a key={id} href={'#kalla-'+id}> [{id}]</a>)}</span>;\n return <><Breadcrumb items={[{label:'Läs om ingredienser',href:'/las'},{label:draft.title}]}/><article className=\"panel prose\"><div className=\"eyebrow\">{draft.content_kind==='area'?'ÄMNESOMRÅDE':'GUIDE'}</div><h1>{draft.title}</h1><p className=\"lead\">{draft.dek}{citations('dek')}</p><p className=\"fine-print\">Separat granskad <LocalizedDate date={review.finished_at}/>. Källornas egna datum framgår av underlagen.</p><nav aria-label=\"På denna sida\"><ul>{draft.sections.map((s:any)=><li key={s.id}><a href={'#'+s.id}>{s.heading}</a></li>)}</ul></nav>{draft.sections.map((s:any)=><section className=\"section-space\" id={s.id} key={s.id}><h2>{s.heading}</h2>{s.paragraphs.map((text:string,i:number)=><p key={i}>{text}{citations(`section:${s.id}:paragraph:${i}`)}</p>)}</section>)}<section className=\"section-space\"><h2>Att ta med</h2><ul>{draft.checklist.map((text:string,i:number)=><li key={i}>{text}{citations(`checklist:${i}`)}</li>)}</ul></section>{draft.identity_ids?.length>0&&<section className=\"section-space\"><h2>Exakta ämnesposter och forskningsvägar</h2><ul>{draft.identity_ids.map((id:string)=><li key={id}><Link href={'/amnen/'+id}>{id}</Link> · <Link href={'/forskning?substance='+id}>Forskningsregistret för ämnet</Link></li>)}</ul></section>}{products.some(p=>draft.products?.includes(p.id))&&<section className=\"section-space\"><h2>Läs verkliga produktdeklarationer</h2><ul>{products.filter(p=>draft.products?.includes(p.id)).map(p=><li key={p.record_id}><Link href={'/produkter/retailer-'+p.record_id}>{p.name}</Link></li>)}</ul></section>}<section className=\"section-space\"><h2>Källor och hela underlag</h2>{book.sources.map((s:any)=><details id={'kalla-'+s.id} key={s.id} className=\"section-space\"><summary><strong>{s.id}</strong> · {s.publisher??'Produktdeklaration'}</summary><p><a href={s.source_url} target=\"_blank\" rel=\"noreferrer\">Öppna källan</a></p>{s.capture_scope&&<p className=\"fine-print\">{s.capture_scope}</p>}{(!s.source_type||s.source_type==='product_declaration')&&<p><Link href={'/produkter/retailer-'+s.record_id}>Läs produktdeklarationen på ActiQs</Link></p>}{s.original_sections.map((o:any,i:number)=><pre style={{whiteSpace:'pre-wrap',overflowWrap:'anywhere',font:'inherit'}} key={i}>{o.text}</pre>)}</details>)}</section></article></>;\n}\n",
        "sha256": "98a65a178e1960b540232848337774566316d788f36a528381216e3785e27904",
        "bytes": 2924
      },
      {
        "path": "src/components/news-photo.tsx",
        "text": "import data from '@/data/news-photos.json';\nimport {assignedNewsPhoto} from '@/lib/news-photo-assignment';\nimport type {Article} from '@/lib/types';\nexport function NewsPhoto({item,eager=false}:{item:Article;eager?:boolean}){\n const photo=item.editorial_photo??assignedNewsPhoto(data,item.id);\n const url=new URL(photo.url);url.searchParams.set('w',eager?'1400':'600');url.searchParams.set('q','85');url.searchParams.set('auto','format');\n return <figure className=\"editorial-photo\"><img src={url.toString()} width={eager?1400:600} height={eager?800:400} alt=\"\" loading={eager?'eager':'lazy'} fetchPriority={eager?'high':'auto'} decoding=\"async\"/><figcaption>Illustrationsbild · <a href={photo.link} target=\"_blank\" rel=\"nofollow noopener noreferrer\">{photo.credit}</a> / <a href=\"https://unsplash.com/?utm_source=actiqs&utm_medium=referral\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Unsplash</a></figcaption></figure>;\n}\n",
        "sha256": "101b511a21ddb14752f3939b56d042588c80ed4a2710ed86e2f49a1da7143bc1",
        "bytes": 932
      },
      {
        "path": "src/app/[lang]/nyheter/[slug]/page.tsx",
        "text": "import { T } from '@/components/translation';\nimport { notFound } from 'next/navigation';\nimport { articles,sources } from '@/lib/catalogue';\nimport { Breadcrumb,LocalizedDate } from '@/components/ui';\nimport {NewsPhoto} from '@/components/news-photo';\nimport {ArticleActions} from '@/components/article-actions';\nimport Link from '@/components/localized-link';\nimport {cache} from 'react';\nimport {database} from '@/lib/database';\nimport {newsRelatedIngredients} from '@/lib/news-related-ingredients';\nimport {NewsRelatedIngredients} from '@/components/news-related-ingredients';\nimport {canonicalUrl,jsonLd} from '@/lib/seo';\nimport {articleStructuredData} from '@/lib/structured-data';\nconst preparedArticles=cache(()=>articles(undefined,{longform:true}));\nexport async function generateMetadata({params}:{params:Promise<{slug:string}>}){const {slug}=await params;const item=(await preparedArticles()).find(a=>a.slug===slug);return item?{title:item.title,description:item.dek,openGraph:{type:'article' as const,siteName:'ActiQs',url:canonicalUrl('/nyheter/'+item.slug),locale:'sv_SE',title:item.title,description:item.dek,...item.published_at?{publishedTime:item.published_at}: {}}}:{robots:{index:false,follow:true}};}\nexport default async function Article({params}:{params:Promise<{slug:string;lang:string}>}){\n const {slug,lang}=await params;\n const [items,sourceRows]=await Promise.all([preparedArticles(),sources()]);\n const item=items.find(i=>i.slug===slug);if(!item)notFound();\n const relatedIngredients=await newsRelatedIngredients(await database(),item);\n const source=sourceRows.find(s=>s.id===item.source_id);\n const body=JSON.parse(item.body_json) as {heading:string;text:string}[];\n return <>{lang==='sv'&&<script type=\"application/ld+json\" dangerouslySetInnerHTML={{__html:jsonLd(articleStructuredData(item))}}/>}<Breadcrumb items={[{label:'Nyheter',href:'/nyheter'},{label:item.title}]}/>\n  <article className=\"article-body\">\n   <div className=\"eyebrow\"><T text={item.tier==='top'?'TOPPNYHET':item.tier==='note'?'NOTIS':'ARTIKEL'}/> · {item.published_at&&<LocalizedDate date={item.published_at}/>}</div>\n   <h1><T text={item.title}/></h1><p className=\"lead\"><T text={item.dek}/></p>\n   <ArticleActions slug={item.slug} title={item.title}/>\n   <NewsPhoto item={item} eager/>\n   {body.map((section,i)=><section key={i}><h2><T text={section.heading}/></h2>{section.text.split(/\\n\\s*\\n/).filter(Boolean).map((paragraph,index)=><p key={index}><T text={paragraph}/></p>)}</section>)}\n   {source&&<section className=\"panel\"><h2>Källunderlag</h2><p>{source.name}{source.publisher&&source.publisher.trim().toLowerCase()!==source.name.trim().toLowerCase()&&<> · {source.publisher}</>}</p>{item.event_date&&<p>Källans publiceringsdatum: <LocalizedDate date={item.event_date}/></p>}{item.primary_source&&<p>Kompletterande förstahandskälla: {item.primary_source.publisher} · {item.primary_source.date_label&&<>{item.primary_source.date_label}: </>}<LocalizedDate date={item.primary_source.date}/></p>}{item.primary_source?.attribution&&<p>{item.primary_source.attribution.authors}. {item.primary_source.attribution.title}. DOI: {item.primary_source.attribution.doi}. Bearbetad nyhetsredogörelse. <a href={item.primary_source.attribution.license_url}>Licens: CC BY 4.0</a>.</p>}{item.research_sources?.map((reference:{title:string;url:string;date?:string})=><p key={reference.url}><a href={reference.url} target=\"_blank\" rel=\"noreferrer\">{reference.title} ↗</a>{reference.date&&<> · Registeruppdatering: <LocalizedDate date={reference.date}/></>}</p>)}</section>}\n   {relatedIngredients&&<NewsRelatedIngredients data={relatedIngredients}/>}\n   <section className=\"section-space\"><h2>Läs vidare</h2>{items.filter(a=>a.id!==item.id).slice(0,3).map(a=><p key={a.id}><Link href={'/nyheter/'+a.slug}>{a.title} →</Link></p>)}</section>\n  </article>\n </>;\n}\n",
        "sha256": "dfbfb76f1b99150f863cfe0a98f4b35476799b99d2d78cbdeae3f83dc0281204",
        "bytes": 3869
      }
    ]
  }
}
ACTIQS-OWNER · ActiQs

Direkta mänskliga besked om ActiQs bolag, kontakt och incidentansvar. Ingen e-postleverans, svarstid eller rättslig behandlingspolicy verifierad. Hela uppgiften återges här; den har ingen publik originaladress.

{
  "contract": "visitor-content-first-party-originals-v1-20261019",
  "publisher": "ActiQs",
  "origin_kind": "owner_statement",
  "claims_scope": "publisher_process_and_responsibility_only",
  "recorded_at": "2026-10-19T07:43:09.003572+00:00",
  "provenance": {
    "statements": [
      {
        "question": "Vilken person eller juridisk person är ActiQs huvudman och personuppgiftsansvarig?",
        "answer": "Nutri Nordic AB"
      },
      {
        "question": "Vilken e-postadress ska användas för kontakt/rättelser och vem är incidentansvarig?",
        "answer": "hello@actiqs.com\nNutri Nordic AB"
      }
    ],
    "facts": {
      "principal": "Nutri Nordic AB",
      "data_controller": "Nutri Nordic AB",
      "contact_email": "hello@actiqs.com",
      "incident_responsible": "Nutri Nordic AB"
    }
  }
}
ACTIQS-OWNER-CONTACT-STATUS · ActiQs

Två hela direkta mänskliga fråge/svarspar: tidigare rollbesked samt senaste avtals-/brevlådebesked. Senaste svarets stavning bevarad. Brevlådan är enligt ägaren inte upprättad. Ingen leverans, vidarebefordran, gallringsfrist eller avtalsgranskning verifierad. Tidigare fullständigt kontakt-/incidentoriginal behålls separat i hela källpaketet.

{
  "contract": "visitor-content-first-party-originals-v1-20261019",
  "publisher": "ActiQs",
  "origin_kind": "owner_statement",
  "claims_scope": "publisher_process_and_responsibility_only",
  "recorded_at": "2026-10-19T09:27:17.744Z",
  "provenance": {
    "statements": [
      {
        "question": "Vilken person eller juridisk person är ActiQs huvudman och personuppgiftsansvarig, vilken fungerande e-postadress ska ta emot kontakt/rättelser och vem ansvarar för incidenter? Samma person får ha flera roller.",
        "answer": "Nutri Nordic AB"
      },
      {
        "question": "För integritetssidan behöver jag bekräfta två förhållanden som inte framgår av driftinställningarna: Är Nutri Nordic AB även avtalspart eller omfattad kund för ActiQs Vercel/Neon och Migadu? Är hello@actiqs.com en egen brevlåda hos Migadu eller vidarebefordras mejlen till en annan tjänst, och finns någon fastställd regel för när kontaktmejl raderas? Skriv gärna ”ingen fastställd regel” om en sådan saknas.",
        "answer": "Ja, avtalspart. Ja, hello@actiqs.com  är en genen snart. Har inte lagt upp det än"
      }
    ],
    "facts": {
      "principal": "Nutri Nordic AB",
      "data_controller": "Nutri Nordic AB",
      "incident_responsible": "Nutri Nordic AB",
      "contact_email": "hello@actiqs.com",
      "contracting_statement": "Ja, avtalspart.",
      "mailbox_creation_statement": "Har inte lagt upp det än"
    }
  }
}