Virtual Pages - Source Excerpt 67
Summary
This source excerpt preserves a bounded section of 2IA.org/wp-content/themes/twoia-intelligence/inc/virtual-pages.php so readers can inspect the evidence without opening the full source file.
**Source path:** 2IA.org/wp-content/themes/twoia-intelligence/inc/virtual-pages.php
__( 'A false positive is not just an error message. It is the moment a system points at the wrong person, the wrong relationship, the wrong intent, the wrong risk category, or the wrong explanation, and then gives that mistake institutional weight.', 'two-identities-anonymous' ),
__( 'Errors travel because systems copy each other. A flag can become a note, a note can become a score, a score can become a denial, a denial can become a record, and the record can be reused by people who never saw the weak original evidence. That is why the correction route matters as much as the original match.', 'two-identities-anonymous' ),
__( 'The public-interest story is strongest when it shows the chain: what signal was misread, who acted on it, where it moved, what harm followed, what proof would fix it, and who has authority to repair every downstream copy. Without that path, the burden falls on the person harmed by the mistake while the system keeps the confidence.', 'two-identities-anonymous' ),
),
'research-archive' => array(
__( 'An archive is not a storage closet. It is the memory system for public accountability. If it works, a reader can see which route a claim belongs to, what source class supports it, what was corrected, what remains open, and what future record would make the page stronger.', 'two-identities-anonymous' ),
__( 'The archive matters because rights work decays when memory is scattered. A policy changes, a vendor page disappears, a public statement is revised, a record request returns late, or a correction narrows an old claim. Without an archive, those changes become private recollection. With one, they become public history.', 'two-identities-anonymous' ),
__( 'The archive keeps the project honest about its own growth. It preserves the difference between source memory and public copy, between a useful summary and a raw dump, between a live issue and a duplicate, and between a strong claim and a deferred question still waiting for records.', 'two-identities-anonymous' ),
),
'organizations' => array(
__( 'A useful directory does not begin with prestige. It begins with fit. The reader may need a records platform, a state civil-liberties affiliate, a bail or reentry group, a digital-rights guide, an investigative lab, an AI standards body, or a historical explainer. Those are different needs, and a serious directory should not flatten them into one list of impressive names.', 'two-identities-anonymous' ),
__( 'The directory also needs evidence discipline. An organization can change name, merge, close intake, shift programs, update contact paths, or publish claims that are only partly current. A useful entry carries official-source proof, a last-reviewed date, a jurisdiction note, and a correction path so readers can challenge stale or wrong information.', 'two-identities-anonymous' ),
__( 'Some entries need more than verification. Leaderless banners, hacktivist histories, leak archives, and contested claimant groups are public-interest subjects, not service providers. They need legal context, attribution humility, harm limits, and no operational instruction.', 'two-identities-anonymous' ),
),
'support' => array(
__( 'Support pages are part of the trust story because funding, newsletters, forms, volunteer intake, and growth tools can quietly change a privacy-first project. A support path that collects too much data, promises access, creates fake urgency, or rewards spectacle can weaken the work it claims to fund.', 'two-identities-anonymous' ),
__( 'The right support story is concrete. Support makes visible public work possible: issue hubs, records guides, source review, accessibility fixes, correction handling, public-interest research, and preservation of reviewed material. Readers can see what improved because support existed.', 'two-identities-anonymous' ),
__( 'Support also has to respect the reader. People can donate, subscribe, volunteer, share, or simply read without being profiled into a growth funnel. The privacy promise belongs beside the support ask itself, not hidden behind a footer policy that nobody sees before acting.', 'two-identities-anonymous' ),
),
'about' => array(
__( 'The About page does not ask for trust by sounding official. It earns trust by making the project legible: what it covers, what it refuses, what records matter, how corrections work, why independence matters, and how civil liberties shape the whole publication.', 'two-identities-anonymous' ),
__( '2IA is strongest when it is blunt without pretending to have secret authority. The work is public intelligence in the civic sense: records, rights, policies, procurement, metadata, AI inference, false positives, anonymous speech, correction, and oversight. The point is not mystique. The point is to make public power easier to inspect.', 'two-identities-anonymous' ),
__( 'The About route also protects the tone. Proud and loud does not mean reckless. It means the site can defend liberty, name accountable power, and speak plainly while still refusing doxxing, harassment, evasion, private-person profiling, or claims that cannot be corrected.', 'two-identities-anonymous' ),
),
);
return $contexts[ $parent_slug ] ?? array(
sprintf(
/* translators: %s: parent page title. */
__( '%s belongs to the public accountability map. Its details connect the visible claim to records, rights, uncertainty, correction, and lawful civic pressure without turning curiosity into exposure.', 'two-identities-anonymous' ),
$parent_title
),
);
}
/**
* Return topic-specific narrative paragraphs for a detail page.
*
* @param array $page Section-backed child route definition.
* @param array $section Section definition.
* @return array
*/
function twoia_get_virtual_dossier_topic_context( $page, $section ) {
$title = isset( $section['title'] ) ? wp_strip_all_tags( $section['title'] ) : $page['title'];
$body = isset( $section['body'] ) ? wp_strip_all_tags( $section['body'] ) : '';
$parent_slug = isset( $page['parent_slug'] ) ? sanitize_title( $page['parent_slug'] ) : '';
$brief_slug = isset( $page['brief_slug'] ) ? sanitize_title( $page['brief_slug'] ) : sanitize_title( $title );
$topic_key = strtolower( $brief_slug . ' ' . $title . ' ' . $body );