QA Wrap

Privacy policy

Published by Nader Alzghoul. Effective 8 September 2026, revised from the version of 3 September to describe the permission model and the first-run notice. Applies to the QA Wrap browser extension on every browser it is published for: Chrome and Edge. The policy is the same on both, because the extension does the same thing on both.

The one-sentence version

QA Wrap is local-first: everything it records stays in your browser profile on your machine, and nothing leaves it except where you configure Jira, a tracker or a webhook, or where you send the one request you wrote in the API tool or run the link checker, and press a button that names where the data is going.

What it records, and where it goes

While a session is recording, and only in a window you have woken up, the extension keeps:

  • the clicks, typing, navigations and form steps you perform on the page under test, with a locator for each element;
  • the page's network requests and console output, so a failure can be linked to the action that caused it;
  • screenshots, full-page captures and screen or tab recordings you start, or that start by themselves on a site you ticked;
  • notes you type, the charter you set, and the settings you choose.

All of it is written to IndexedDB and chrome.storage inside your browser profile. There is no QA Wrap server. The extension makes no request to any host of its own, carries no analytics, and loads no remote code; the accessibility engine (axe-core) is bundled inside the package.

When you switch on "pre-roll buffer" (off by default), an awake tab keeps its last 60 seconds of events in memory on the page only; nothing is stored or sent until you start a session, and the buffer is discarded on navigation, tab close, sleep, or switching it off.

Two more powers are off until you tick them, for one site at a time, in the popup on that site: start recording by itself, and take a screenshot on the first error of each kind. Each keeps only the site's address in your browser. Automatic recording records what you do on that site, shows a small dot on the page, and stops after 30 minutes without activity. Automatic screenshots are not scanned for secrets and stay in this browser. Neither power uploads anything; filing and sharing stay a button you press. Settings lists the sites and turns each power off.

What it deliberately does not record

Four layers, applied before anything is written, in this order:

  1. What you masked by hand. Press Mask real data and click anything on the page: a name, a national number, a whole column. It is covered by an opaque block for the rest of the session: in every screenshot, in the video, through every navigation. The words underneath are removed from the event, skipped by the page map, and never written into the report. The report says how many values were masked, so a reviewer knows something was withheld rather than never seen.

    A block, not a blur. A short string behind a Gaussian blur can be recovered by rendering candidates and comparing, which has been done to published redactions more than once.

  2. What has the shape of a secret. Payment card numbers (validated against the Luhn check digit, so an order reference is not mistaken for one), IBANs (validated mod-97), bearer tokens, API keys, JSON web tokens and private key blocks are removed from every recorded value. National and record numbers, and email addresses, can be added in Settings. They are off by default because a ten-digit national number and a ten-digit order reference are the same shape, and a tester testing order references needs to read them.

  3. What has the name of a secret. A field of type password, an autocomplete of cc-number or one-time-code, or a label matching pass|secret|token|otp|pin|cvv|card|iban|كلمة المرور, recorded as "a password was typed", never as its value. You can add your own pattern.

  4. Cookie values, never written into a session or an export, even while the cookie editor is open. The one place a cookie value is kept is a saved cookie profile: if you save one, its cookies, values included, sit in chrome.storage.local on this machine until you delete that profile.

Two things these layers do not reach. A request you compose by hand in the request tool is stored as you sent it, with its Authorization header and body. And a token in the query string of a recorded URL, or in a response preview, reaches the HAR, YAML and Postman exports as the page sent it. Treat those files as you would the page's own traffic.

None of this is a substitute for judgement: no rule can know that a name on screen belongs to a real patient. That is what masking by hand is for, and why the two exist together.

When data does leave your machine

Only when you set up one of the 18 services in Settings, then Integrations, and only when you press the corresponding button on a report:

Show the table
DestinationWhat is sentWhere
Jirathe defect report or test case for one session, and the evidence attachments you tickedyour own Jira site, using your personal API token
GitHub, GitLab, Azure DevOps, Linear, Trello, ClickUp, Asana, Shortcut, YouTrackthe defect report for one session, and evidence attachments where the tracker accepts themthe tracker's API (your own server for a self-hosted one), using a personal token you paste
Slack, Microsoft Teams, Mattermost (as a webhook), Discord, Google Chat, a custom webhooka summary of one sessionthe webhook URL you configured
Mattermost (as a signed-in account, from the report page)a summary of one session, after your organisation's policy is checked and the text is scanned for secrets; the send is listed under what left this machinethe Mattermost server address you typed, using your personal access token, which is kept encrypted in the credential vault
Telegrama summary of one sessionapi.telegram.org, using the bot token and chat you configured
Link checkera HEAD or GET request to each link on the page you chose, sent without cookies; addresses on your own machine or network are skipped unless the page is one; the run is listed under what left this machine as a count, with no link textthe host of each link; your organisation's policy (integrations off) is checked first and refuses before anything is sent
Email (.eml)nothing is sent: a message file is written to your machine, for you to open and send yourselfyour own disk

Evidence attachments. When you file to Jira you choose what travels with the report: screenshots, and the export formats you tick, such as the report file, a screen or tab recording, or the network log (HAR). Nothing is attached that you did not tick, and nothing is attached without the press.

Secret scanning covers text, not media. Before anything leaves, the report text and every text attachment (report files, logs, HAR) are scanned for the shape of a secret; a hit blocks the send or, if you choose, is replaced by a marker. Screenshots, recordings and other media attachments are not secret-scanned: no scanner looks inside an image or a video. The filing result lists the files that were not scanned, so check them by eye, and use Mask real data before capturing, because masked values are covered in the pixels themselves.

Per-service host grants. QA Wrap holds no permission to any of these hosts at install. The first time you save or test a service, Chrome asks, in its own dialog, for that one address (for example https://your-company.atlassian.net, https://api.telegram.org, or the webhook's own host), and nothing wider. Refuse it and that service does not work; nothing is sent. Take it back in Chrome's extension settings under Site access and the service stops.

Each of those buttons asks for confirmation and says that the data is leaving your machine. Leave the integration empty and the button never appears.

AI writing (optional, off by default)

If you turn on AI writing in Settings, the Suggest title and steps button appears in a report. When you press it, QA Wrap shows you a rough count of what will be sent and the exact text, and only when you press Send does it send that text, once, to the provider you chose (Anthropic, OpenAI or OpenRouter), with your own API key. The text is the same text «Copy for AI» makes: the steps, the failing requests, the console errors and the environment, with passwords, tokens and other secrets masked first. Screenshots, recordings, cookies and saved credentials are not sent. Your key is kept only on this computer, is not synced or exported, and you can remove it in Settings. The first time, the browser asks permission to reach that provider. QA Wrap calls no other AI service, and it sends only when you press Send. Each send appears in the list of what has left your machine (host and size, no content). What the provider does with the text is set by your agreement with them. The answer is shown as «suggested» next to what was recorded; your recorded steps and expected result stay as they were.

Files you export do not phone home either

An exported HTML report, SRS, manual or link map is opened somewhere else, often on a machine that is not yours, and until version 3.1.0 it carried one line that mattered here: the shared document stylesheet pulled its typeface from Google's font service. QA Wrap never made that request. The browser that opened the file did, which told Google's font service the reader's IP address, their browser, and the moment they opened a QA Wrap document.

That line has been removed. The document carries the typeface instead: the Thmanyah faces out of the extension's own ui/fonts.css, written into the file as base64 data: URIs, which asks nobody for anything. An exported document now makes no network request at all, so nothing about who reads one of these files, or when, reaches anybody. tools/test-exporters.mjs opens a freshly built report in a real browser, waits for its fonts, records every request it attempts, and fails if there is one.

Documents exported before this version still carry the old line. Deleting the @import line at the top of their <style> block stops it; nothing else in the file depends on it.

Tokens and webhooks you paste are encrypted at rest: one AES-GCM-256 ciphertext record in chrome.storage.local on this machine, opened with a non-extractable key kept in the extension's own IndexedDB, or with a passphrase you choose in Settings (PBKDF2-SHA256). They are decrypted only inside the extension's service worker at the moment of use; extension pages see them masked. The one exception is the Mattermost account token, which the report page opens only while it is posting to Mattermost. They are never synced through your Google account, never written into an export, and never sent anywhere except the service they belong to when you press File. The vault defeats disk and profile scanners and sync leaks; it does not defeat malware running as you while QA Wrap is unlocked, so use tokens scoped to issue creation and revoke them when you are done.

Saved cookie profiles and the variables you keep in the API tool are sealed the same way: each is its own AES-GCM record in chrome.storage.local, opened with the same key. A variable whose name looks like a credential is shown masked, with a Show button. Erase all removes both records without asking for the passphrase.

Chrome sync, when you have it on, carries only your preference settings: the recording, retention, sound, keyboard and layout choices and the interface language. Your tester name, the workspace you joined and the save-folder name are kept in chrome.storage.local on this machine, and credentials stay in the vault. Three of them are text you type: the "Save into" download folder, the extra mask pattern and the extra redaction words. They sync with the rest, so keep secrets and client names out of them, or switch Chrome sync off. Session data, screenshots and recordings stay on this machine.

Retention and deletion

Finished sessions are deleted after 30 days by default. The session record, its events, its screenshots, its recordings and its replay log go together, on a daily schedule and once when the browser starts, so a machine that is switched off overnight does not skip a day. A running session is never touched. You can set the window to anything from one day to a year, or to never, but never is a choice you make, not the state you are left in.

A pinned session is kept past the retention window. A session you pinned is not deleted by the daily sweep, whatever its age, until you unpin it.

A session the browser never let finish is closed, not kept for ever. If Chrome is killed, the machine loses power, or the extension is updated while a session is recording, nothing gets the chance to write the session's end time, and a session with no end time used to be skipped by the deletion above forever, because a session still in progress must not be deleted out from under you. At the next start, any session left open that is not the one you are recording now is marked interrupted and given an end time: the moment of its last recorded event, or its own start if it recorded nothing. From then on it is deleted on the same schedule as any other. Four things it can no longer know (how many values were masked, which cookies were present, how many rules fired, which tools were used) are recorded as unknown rather than as zero.

If you upgraded from an earlier version, nothing is deleted until you choose a window. A profile that never had a retention setting is read as never, not as 30 days, so an update cannot quietly delete sessions you recorded before the setting existed. Settings, then Privacy, asks you once. Thirty days is the default for a fresh install, where it is a default you are told about rather than a policy applied to history.

Settings, then Privacy, has a Run it now button, so you can watch the policy work rather than take its word for it.

Erase all (Settings, then Privacy) removes every session with its events, screenshots, recordings and replay logs, and your saved cookie profiles. Your settings are kept. A saved cookie profile belongs to no session, so retention never touches it: it goes with Erase all, or when you delete that profile.

You can also delete any session by hand from the timeline panel or the report. Exports you have saved are ordinary files in the folder you chose, and are not touched by any of this: they are yours. Uninstalling removes the database and the settings from the browser profile.

The standards this is built against

Nothing here is a certification. These are the controls a certification would ask to see, named so that a security review can check them off.

Show the table
MeasureWhat it answers to
Masking by hand; redaction by value shapeGDPR Art. 5(1)(c) data minimisation
Both on by defaultGDPR Art. 25 protection by design and by default; ISO/IEC 27701 cl. 7.4
Opaque blocks over values in capturesISO/IEC 27002:2022 control 8.11 data masking
30-day retention, deletion including media, and interrupted sessions closed so retention reaches themGDPR Art. 5(1)(e) storage limitation
Everything local; no analytics, no telemetry, no remote codeGDPR Art. 5(1)(f) integrity and confidentiality; Chrome Web Store Limited Use
No site access at install; one origin asked for at the moment it is usedGDPR Art. 5(1)(c) data minimisation; Chrome Web Store minimum permissions
A first-run notice the popup shows, and nothing else, until it is acceptedGDPR Art. 13 information at collection; Chrome Web Store prominent disclosure and consent
Egress only on an explicit press, to a destination you configuredGDPR Art. 5(1)(b) purpose limitation
Tokens in an AES-GCM vault in storage.local, never synced, never exportedISO/IEC 27002:2022 control 8.24 use of cryptography and secrets
Manifest V3, strict CSP, no remotely hosted code, no evalOWASP secure extension practice; Web Store policy

The extension has no server. There is no account, no identifier, no analytics and no crash reporting: nothing to breach, because nothing is collected. That is a design decision rather than a promise, and tools/release-check.mjs fails the build if an analytics endpoint or remotely hosted code ever appears in the package.

Which sites it is allowed on

QA Wrap can read every website from the moment it is installed. The install dialog says so ("read and change all your data on all websites"). Being able to read a site is not capturing it: QA Wrap captures only after you press Wake up or Start, and then only the focused tab or window, for as long as it is focused.

Press Wake up on the page you are testing; Chrome does not ask again, because the access was given at install. You can take it back in Chrome's own extension settings under Site access, and the extension's scripts leave those sites with it. A window you have not woken is not recorded. The Jira helper runs on Jira pages (UI only; notifications only when you turn them on, and only to your own Jira host).

Asleep does not mean nothing is loaded. Asleep means no session records, no request hook is installed and no tool acts. On every site, QA Wrap's eight page scripts (about 146 KB of source per frame) stay loaded and record only once you wake that window.

On a managed machine an administrator can set hostPermissionsPolicy to ask (the default), all or none. The policy grants nothing by itself.

The notice you read first

On installation QA Wrap opens one page, in Arabic and English, before any tool can be used: what it stores and where, what a recording captures, what masking does and does not do, that it can read every site but captures only a window you wake, and the line about the microphone. Until you accept it the popup shows that card and nothing else.

Accepting writes three values into chrome.storage.local on this machine: consentedAt, consentVersion and consentRevision: the moment you accepted, the build you accepted it for and the revision of the welcome wording. They identify nothing and nobody, they are never synced and never exported. The extension compares consentRevision with the current revision when it starts, so if the wording is revised you are asked again; consentVersion only records the build, and an ordinary update does not re-ask.

Permissions, and why each one is there

Show the table
PermissionUsed for
storage, unlimitedStoragesessions, screenshots and recordings in your profile; a long session can exceed the default quota
activeTab, tabsthe URL and title of the page under test; opening the report and settings pages
scriptinginjecting the tools into the page you are testing, on demand, and registering the page scripts
webNavigationrecording navigations, the status of the page itself, and the frame tree a locator inside an iframe needs
webRequestreading six security headers off each response while a session is recording and only on sites you have granted access to, so the fine-print report measures them instead of asking you to. Observation only: nothing is blocked, modified or redirected, no other header is kept, and the listener is attached only while a session runs
cookiesthe cookie editor and saved cookie profiles
contextMenusthe right-click menu entries
notificationsa desktop notice when a session is saved, when a recording starts or stops, and when the extension goes to sleep; nothing in one is sent anywhere, and Settings turns them off
sidePanelthe docked workbench
clipboardWritecopying a locator
alarmsthe daily purge of sessions older than the retention period you set, which must run even while the service worker is suspended
downloadssaving exports to the folder you chose
offscreenencoding recordings and GIFs, which needs a document
tabCapturerecording the tab when you press Record
debuggermeasuring which of the page's JavaScript ran (code coverage) when you press Measure; Chrome shows it at install, and the debugger stays detached until you press Measure
optional desktopCapturerecording a window or the whole screen; asked for the first time you choose one of those, and refusable
the site you are oncovered by the <all_urls> host permission below; it is captured only after you press Wake up or Start, and then only while its tab or window is focused
optional the address of a service you set upasked for by name the first time you save or test Jira, a tracker, a chat webhook or Telegram, and no wider; refusable, and revocable in Chrome's extension settings
host permission <all_urls>held from install; the install dialog shows it as reading and changing your data on all websites. The page scripts record only once you wake that window

Changes and contact

Changes to this policy are recorded in the extension's release notes. This page and PRIVACY.md in the package carry the same text.

Questions go to Nader Alzghoul at naderalzghoulbusiness@gmail.com, or through the support page.

سياسة الخصوصية

من نشر نادر الزغول. سارية اعتبارا من 8 سبتمبر 2026، منقحة عن نسخة 3 سبتمبر لتصف نموذج الأذونات لكل موقع وإشعار التشغيل الأول. تسري على امتداد QA Wrap في Chrome وEdge. السياسة نفسها في كليهما، لأن الامتداد يفعل الشيء نفسه في كل منهما.

النسخة بجملة واحدة

QA Wrap محلي أولا: كل ما يسجله يبقى في ملف متصفحك على جهازك، ولا شيء يغادره إلا حيث تعد Jira أو أداة تتبع أو ويب هوك، أو ترسل الطلب الواحد الذي كتبته في أداة API أو تشغل فاحص الروابط، وتضغط زرا يسمي إلى أين تذهب البيانات.

ما الذي يسجله، وإلى أين يذهب

أثناء تسجيل جلسة، وفقط في نافذة أيقظتها، يحفظ الامتداد:

  • النقرات، والكتابة، والتنقلات، وخطوات النماذج التي تجريها على الصفحة قيد الاختبار، مع محدد لكل عنصر؛
  • طلبات الشبكة الخاصة بالصفحة نفسها ومخرجات وحدة التحكم، حتى يمكن ربط العطل بالإجراء الذي تسبب فيه؛
  • لقطات الشاشة، واللقطات الكاملة للصفحة، وتسجيلات الشاشة أو التبويب التي تبدؤها أو التي تبدأ تلقائيًا في موقع حدّدته؛
  • الملاحظات التي تكتبها، وميثاق الاختبار الذي تحدده، والإعدادات التي تختارها.

كل ذلك يكتب في IndexedDB وفي chrome.storage داخل ملف متصفحك. لا يوجد خادم لـ QA Wrap. لا يرسل الامتداد أي طلب إلى أي مضيف من عنده، ولا يحمل أي تحليلات، ولا يحمل أي شيفرة عن بعد؛ محرك إمكانية الوصول (axe-core) مدمج داخل الحزمة.

عند تشغيل «مخزن ما قبل التسجيل» (وهو مطفأ افتراضيا)، يحتفظ التبويب المستيقظ بآخر 60 ثانية من الأحداث في ذاكرة الصفحة وحدها؛ ولا يخزن شيء ولا يرسل قبل أن تبدأ جلسة، ويمسح المخزن عند التنقل أو إغلاق التبويب أو النوم أو إطفاء الخيار.

هناك قدرتان أخريان مطفأتان حتى تحدّدهما، لموقع واحد في كل مرة ومن النافذة المنبثقة في ذلك الموقع: بدء التسجيل تلقائيًا، والتقاط لقطة شاشة عند أول خطأ من كل نوع. تحفظ كل واحدة عنوان الموقع فقط داخل متصفحك. يسجّل التسجيل التلقائي ما تفعله في ذلك الموقع، ويُظهر نقطة صغيرة على الصفحة، ويتوقف بعد 30 دقيقة دون نشاط. لا تُفحص اللقطات التلقائية بحثًا عن الأسرار وتبقى داخل هذا المتصفح. لا ترفع أي من القدرتين شيئًا؛ يبقى الإيداع والمشاركة زرًّا تضغطه. تعرض الإعدادات المواقع وتتيح إيقاف كل قدرة.

ما لا يسجله عمدا

أربع طبقات، تطبق قبل كتابة أي شيء، بهذا الترتيب:

  1. ما أخفيته يدويا. اضغط أخف البيانات الحقيقية وانقر أي عنصر في الصفحة: اسم، رقم وطني، عمود كامل. يغطى بكتلة معتمة لبقية الجلسة: في كل لقطة شاشة، وفي الفيديو، وعبر كل تنقل. تحذف الكلمات التي تحته من الحدث، وتتخطاها خريطة الصفحة، ولا تكتب أبدا في التقرير. يقول التقرير كم قيمة أخفيت، حتى يعرف المراجع أن شيئا حجب لا أنه لم ير قط.

    كتلة، لا تمويه. يمكن استرجاع نص قصير خلف تمويه غاوسي بتوليد احتمالات ومقارنتها، وقد حدث ذلك بالفعل لبيانات منشورة أخفيت بهذه الطريقة أكثر من مرة.

  2. ما له شكل السر. تحذف من كل قيمة مسجلة أرقام بطاقات الدفع (المتحقق منها برقم لون Luhn، حتى لا يخلط مرجع طلب برقم بطاقة)، وأرقام IBAN (المتحقق منها بمعامل mod-97)، ورموز الدخول، ومفاتيح واجهات البرمجة، ورموز JSON للويب، وكتل المفاتيح الخاصة. يمكن إضافة الأرقام الوطنية وأرقام السجلات وعناوين البريد الإلكتروني في الإعدادات. وهي معطلة افتراضيا لأن رقما وطنيا من عشر خانات ورقم مرجع طلب من عشر خانات لهما الشكل نفسه، ومختبر يختبر مراجع الطلبات يحتاج إلى قراءتها.

  3. ما له اسم السر. حقل من نوع password، أو خاصية autocomplete بقيمة cc-number أو one-time-code، أو تسمية تطابق pass|secret|token|otp|pin|cvv|card|iban|كلمة المرور، تسجل بعبارة "كتبت كلمة مرور"، لا بقيمتها أبدا. يمكنك إضافة نمطك الخاص.

  4. قيم الكعكات (cookies)، لا تكتب في جلسة ولا في ملف مصدر قط ولو كان محرر الكعكات مفتوحا. والمكان الوحيد الذي تحفظ فيه قيمة كعكة هو ملف كعكات محفوظ: إن حفظت ملفا فكعكاته، بقيمها، تبقى في chrome.storage.local على هذا الجهاز إلى أن تحذف ذلك الملف.

أمران لا تبلغهما هذه الطبقات. الطلب الذي تكتبه بيدك في أداة الطلبات يخزن كما أرسلته، برأس Authorization وجسمه. ورمز موجود في سلسلة استعلام عنوان مسجل، أو في معاينة استجابة، يصل إلى تصديرات HAR وYAML وPostman كما أرسلته الصفحة. عامل هذه الملفات كما تعامل حركة مرور الصفحة نفسها.

لا شيء من هذا بديل عن الحكم البشري: لا قاعدة تعرف أن اسما على الشاشة يخص مريضا حقيقيا. ولهذا وجد الإخفاء اليدوي، ولهذا يتعايش الاثنان معا.

متى تغادر البيانات جهازك

فقط حين تعد إحدى الخدمات الثماني عشرة في الإعدادات، ثم التكاملات، وفقط حين تضغط الزر المقابل على تقرير:

اعرض الجدول
الوجهةما يرسلإلى أين
Jiraتقرير العطل أو حالة الاختبار لجلسة واحدة، ومرفقات الأدلة التي حددتهاموقع Jira الخاص بك، برمز واجهة برمجة تطبيقات شخصي
GitHub وGitLab وAzure DevOps وLinear وTrello وClickUp وAsana وShortcut وYouTrackتقرير العطل لجلسة واحدة، ومرفقات الأدلة حيث تقبلها أداة التتبعواجهة برمجة تطبيقات أداة التتبع (خادمك أنت إن كانت مستضافة ذاتيا)، برمز شخصي تلصقه
Slack وMicrosoft Teams وMattermost (عبر رابط خطافي) وDiscord وGoogle Chat، أو رابط خطافي مخصصملخص لجلسة واحدةرابط الـ webhook الذي أعددته
Mattermost (حساب مسجل الدخول، من صفحة التقرير)ملخص لجلسة واحدة، بعد التحقق من سياسة مؤسستك وفحص النص بحثاً عن الأسرار؛ ويظهر الإرسال ضمن ما غادر هذا الجهازعنوان خادم Mattermost الذي كتبته، برمز وصول شخصي يحفظ مشفراً في خزنة بيانات الاعتماد
Telegramملخص لجلسة واحدةapi.telegram.org، برمز البوت والمحادثة اللذين أعددتهما
فاحص الروابططلب HEAD أو GET إلى كل رابط في الصفحة التي اخترتها، يرسل دون ملفات تعريف الارتباط؛ تتخطى العناوين الموجودة على جهازك أو شبكتك ما لم تكن الصفحة منها؛ ويسجل التشغيل تحت ما غادر هذا الجهاز عددا فقط دون نص الروابطمضيف كل رابط؛ تفحص سياسة مؤسستك (إيقاف التكاملات) أولا وترفض قبل إرسال أي شيء
البريد الإلكتروني (.eml)لا يرسل شيء: يكتب ملف رسالة على جهازك لتفتحه وترسله بنفسكقرصك أنت

مرفقات الأدلة. عند الإيداع في Jira تختار ما يسافر مع التقرير: لقطات الشاشة وصيغ التصدير التي تحددها، مثل ملف التقرير أو تسجيل الشاشة أو التبويب أو سجل الشبكة (HAR). لا يرفق شيء لم تحدده، ولا يرفق شيء دون ضغطتك.

فحص الأسرار يشمل النصوص لا الوسائط. قبل أن يغادر أي شيء، يفحص نص التقرير وكل مرفق نصي (ملفات التقارير والسجلات وHAR) بحثا عن شكل السر؛ وأي إصابة تمنع الإرسال أو، إن اخترت، تستبدل بعلامة. أما لقطات الشاشة والتسجيلات وغيرها من مرفقات الوسائط فهي غير مفحوصة بحثا عن الأسرار: لا ماسح ينظر داخل صورة أو مقطع فيديو. تسرد نتيجة الإيداع الملفات التي لم تفحص، فراجعها بعينك، واستخدم إخفاء البيانات الحقيقية قبل الالتقاط، لأن القيم المخفية تغطى في البكسلات نفسها.

منح الوصول لكل خدمة. لا يملك QA Wrap عند التثبيت إذنا بأي من هذه المضيفات. في أول مرة تحفظ فيها خدمة أو تختبرها يسألك Chrome، في نافذته الخاصة، عن ذلك العنوان وحده (مثل https://your-company.atlassian.net أو https://api.telegram.org أو مضيف الـ webhook نفسه) ولا شيء أوسع. إن رفضت فلن تعمل الخدمة ولن يرسل شيء. استرجعه من إعدادات الامتدادات في Chrome تحت الوصول إلى المواقع فتتوقف الخدمة.

كل واحد من تلك الأزرار يطلب تأكيدا ويقول إن البيانات تغادر جهازك. اترك التكامل فارغا ولن يظهر الزر إطلاقا.

الكتابة بالذكاء الاصطناعي (اختياري ومُعطَّل افتراضيًا)

إذا شغّلتَ الكتابة بالذكاء الاصطناعي من الإعدادات يظهر زر اقتراح العنوان والخطوات داخل التقرير. عند الضغط عليه يعرض QA Wrap عدًّا تقريبيًا لما سيُرسَل والنص نفسه بالضبط، ولا يرسل إلا عندما تضغط إرسال، وبطلب واحد فقط، إلى المزوّد الذي اخترتَه (Anthropic أو OpenAI أو OpenRouter) بمفتاح API الخاص بك. النص هو نفسه الذي يصنعه زر «انسخ للذكاء الاصطناعي»: الخطوات والطلبات الفاشلة وأخطاء وحدة التحكم والبيئة، بعد إخفاء كلمات المرور والرموز وسائر الأسرار. لا تُرسَل لقطات الشاشة ولا التسجيلات ولا ملفات تعريف الارتباط ولا بيانات الاعتماد المحفوظة أبدًا. يبقى مفتاحك على هذا الحاسوب فقط، ولا يُزامَن ولا يُصدَّر، ويمكنك حذفه من الإعدادات. وفي المرة الأولى يطلب المتصفح إذنًا بالوصول إلى هذا المزوّد. لا يجري QA Wrap أي اتصال آخر بأي خدمة ذكاء اصطناعي، ولا في الخلفية. وكل إرسال يظهر في قائمة ما غادر جهازك (المضيف والحجم دون المحتوى). ما يفعله المزوّد بالنص تحدده اتفاقيتك معه. يظهر الجواب بوسم «مقترح» بجانب ما سُجّل، ولا تتغيّر خطواتك المسجّلة ولا النتيجة المتوقعة أبدًا.

الملفات التي تصدرها لا تتصل بأي جهة أيضا

تقرير HTML مصدر، أو مواصفة متطلبات، أو دليل، أو خريطة روابط، يفتح في مكان آخر، غالبا على جهاز ليس جهازك، وحتى النسخة 3.1.0 كان يحمل سطرا واحدا كان مهما هنا: كانت صفحة الأنماط المشتركة للمستند تجلب خطها من خدمة الخطوط لدى Google. لم يرسل QA Wrap ذلك الطلب أبدا؛ المتصفح الذي فتح الملف هو من فعل، وهذا أخبر خدمة الخطوط لدى Google بعنوان IP الخاص بالقارئ، ومتصفحه، ولحظة فتحه لمستند QA Wrap.

حذف ذلك السطر. يحمل المستند الخط بدلا من ذلك: أوجه خط Thmanyah من ملف ui/fonts.css الخاص بالامتداد نفسه، مكتوبة في الملف روابط data: بترميز base64، ولا تطلب شيئا من أحد. المستند المصدر الآن لا يرسل أي طلب شبكة إطلاقا، فلا شيء عمن يقرأ أحد هذه الملفات، أو متى، يصل إلى أي جهة. يفتح tools/test-exporters.mjs تقريرا جديد البناء في متصفح حقيقي، وينتظر خطوطه، ويسجل كل طلب يحاول إرساله، ويفشل الاختبار إن وجد طلب واحد.

المستندات المصدرة قبل هذه النسخة لا تزال تحمل السطر القديم. حذف سطر @import أعلى كتلة <style> فيها يوقف ذلك؛ لا شيء آخر في الملف يعتمد عليه.

الرموز والروابط الخطافية التي تلصقها مشفرة أثناء التخزين: سجل واحد مشفر بـ AES-GCM-256 في chrome.storage.local على هذا الجهاز، يفتح بمفتاح غير قابل للاستخراج محفوظ في IndexedDB الخاص بالامتداد، أو بعبارة مرور تختارها في الإعدادات (PBKDF2-SHA256). لا يفك تشفيرها إلا داخل العامل الخدمي للامتداد لحظة الاستخدام؛ وترى صفحات الامتداد نسخة مقنعة منها. والاستثناء الوحيد رمز حساب Mattermost، إذ تفتحه صفحة التقرير أثناء إرسال المشاركة فقط. لا تزامن أبدا عبر حساب Google الخاص بك، ولا تكتب أبدا في تصدير، ولا ترسل أبدا إلى أي مكان سوى الخدمة التي تخصها حين تضغط "أودع". تحمي الخزنة من ماسحات القرص والملف الشخصي ومن تسربات المزامنة؛ ولا تحمي من برمجية خبيثة تعمل باسمك بينما QA Wrap مفتوح، فاستخدم رموزا مقصورة على إنشاء التذاكر وألغها حين تنتهي.

تُختم ملفات تعريف الارتباط المحفوظة والمتغيرات التي تحفظها في أداة واجهة البرمجة بالطريقة نفسها: لكل منها سجل AES-GCM خاص به في chrome.storage.local، يُفتح بالمفتاح نفسه. ويظهر المتغير الذي يشبه اسمه بيانات اعتماد مقنّعا مع زر «إظهار». ويزيل «مسح الكل» السجلين دون طلب عبارة المرور.

مزامنة Chrome، حين تشغلها، تحمل تفضيلاتك فقط: خيارات التسجيل والاحتفاظ والصوت والاختصارات والتخطيط ولغة الواجهة. أما اسم المختبر والمساحة المشتركة التي انضممت إليها واسم مجلد الحفظ فتبقى في chrome.storage.local على هذا الجهاز، وتبقى بيانات الاعتماد في الخزنة. ثلاثة منها نصوص تكتبها بنفسك: مجلد الحفظ «احفظ في» ونمط الإخفاء الإضافي وكلمات الحجب الإضافية. تُزامَن مع بقية التفضيلات، فأبقِ الأسرار وأسماء العملاء خارجها، أو أوقف مزامنة Chrome. تبقى بيانات الجلسات ولقطات الشاشة والتسجيلات على هذا الجهاز.

الاحتفاظ والحذف

تحذف الجلسات المنتهية بعد 30 يوما افتراضيا. تحذف سجل الجلسة، وأحداثها، ولقطاتها، وتسجيلاتها، وسجل إعادة العرض الخاص بها معا، بجدول يومي ومرة واحدة عند بدء تشغيل المتصفح، حتى لا يفوت جهاز مطفأ طوال الليل يوما من الحذف. لا تمس جلسة قيد التشغيل أبدا. يمكنك ضبط المدة من يوم واحد إلى سنة، أو إلى أبدا، لكن أبدا اختيار تتخذه، لا حالة تترك فيها.

الجلسة المثبتة تبقى بعد انتهاء مدة الاحتفاظ. لا يحذف الجدول اليومي جلسة ثبتها أنت مهما قدم عهدها، حتى تلغي تثبيتها.

الجلسة التي لم يسمح لها المتصفح بالانتهاء تغلق، لا تحفظ إلى الأبد. إن أغلق Chrome قسرا، أو انقطعت الطاقة عن الجهاز، أو حدث الامتداد أثناء تسجيل جلسة، فلا تحصل الجلسة على فرصة لكتابة وقت انتهائها، وكانت جلسة بلا وقت انتهاء تتخطاها عملية الحذف أعلاه إلى الأبد، لأن جلسة لا تزال قيد التقدم يجب ألا تحذف من تحتك. عند بدء التشغيل التالي، توسم أي جلسة تركت مفتوحة وليست الجلسة التي تسجلها الآن بأنها مقطوعة، ويمنح لها وقت انتهاء: لحظة آخر حدث سجل فيها، أو بدايتها هي إن لم تسجل شيئا. من تلك اللحظة تحذف بالجدول نفسه كأي جلسة أخرى. أربعة أمور لم تعد تعرفها (كم قيمة أخفيت، وأي كعكات كانت موجودة، وكم قاعدة عملت، وأي أدوات استخدمت) تسجل كمجهولة لا كصفر.

إن حدثت من نسخة أقدم، لا يحذف شيء حتى تختار مدة. يقرأ الملف الذي لم يحمل إعداد احتفاظ قط على أنه أبدا، لا 30 يوما، حتى لا يحذف تحديث بصمت جلسات سجلتها قبل وجود الإعداد. تسألك الإعدادات، ثم الخصوصية، مرة واحدة. ثلاثون يوما هي الافتراض لتثبيت جديد، حيث هو افتراض تخبر به لا سياسة تطبق على تاريخ سابق.

تحمل الإعدادات، ثم الخصوصية، زر نفذها الآن، حتى تشاهد السياسة تعمل بدل أن تأخذ كلمتها فقط.

امسح كل الجلسات والتسجيلات (الإعدادات ثم الخصوصية) يزيل كل جلسة مع أحداثها ولقطاتها وتسجيلاتها وسجلات إعادة العرض، وملفات الكعكات المحفوظة. وتبقى إعداداتك. ملف الكعكات المحفوظ لا ينتمي إلى جلسة، فلا يمسه الاحتفاظ المحدد بمدة: يزول بذلك الزر، أو حين تحذف ذلك الملف.

يمكنك أيضا حذف أي جلسة يدويا من لوحة الخط الزمني أو من التقرير. الملفات المصدرة التي حفظتها ملفات عادية في المجلد الذي اخترته، ولا يمسها شيء من هذا: إنها ملكك. إلغاء التثبيت يحذف قاعدة البيانات والإعدادات من ملف المتصفح.

المعايير التي تبني عليها الأداة

لا شيء هنا شهادة اعتماد. هذه هي الضوابط التي ستطلب شهادة اعتماد رؤيتها، مسماة حتى تستطيع مراجعة أمنية التحقق منها.

اعرض الجدول
الإجراءما يستجيب له
الإخفاء اليدوي؛ التنقيح حسب شكل القيمةGDPR المادة 5(1)(ج) تقليل البيانات
كلاهما مفعل افتراضياGDPR المادة 25 الحماية بالتصميم وبالافتراض؛ ISO/IEC 27701 البند 7.4
كتل معتمة فوق القيم في اللقطاتISO/IEC 27002:2022 الضابط 8.11 إخفاء البيانات
احتفاظ لمدة 30 يوما، وحذف يشمل الوسائط، وإغلاق الجلسات المقطوعة حتى يصلها الاحتفاظGDPR المادة 5(1)(ه) تحديد مدة التخزين
كل شيء محلي؛ لا تحليلات، لا قياس عن بعد، لا شيفرة عن بعدGDPR المادة 5(1)(و) السلامة والسرية؛ سياسة الاستخدام المحدود لمتجر Chrome الإلكتروني
لا التقاط قبل الإيقاظ أو البدء، ثم النافذة التي عليها التركيز فقطGDPR المادة 5(1)(ج) تقليل البيانات؛ الحد الأدنى من الأذونات في متجر Chrome الإلكتروني
إشعار أول تشغيل تعرضه النافذة المنبثقة وحده إلى أن يقبلGDPR المادة 13 المعلومات عند الجمع؛ الإفصاح البارز والموافقة في متجر Chrome الإلكتروني
مغادرة البيانات فقط بضغطة صريحة، إلى وجهة أعددتها أنتGDPR المادة 5(1)(ب) تحديد الغرض
الرموز في خزنة AES-GCM داخل storage.local، لا تزامن أبدا، لا تصدر أبداISO/IEC 27002:2022 الضابط 8.24 استخدام التشفير والأسرار
Manifest V3، سياسة أمان محتوى صارمة، لا شيفرة مستضافة عن بعد، لا evalOWASP ممارسات الامتدادات الآمنة؛ سياسة المتجر

لا يملك الامتداد خادما. لا يوجد حساب، ولا معرف، ولا تحليلات، ولا تقارير أعطال: لا شيء يخترق، لأنه لا شيء يجمع. هذا قرار تصميم لا وعد فحسب، ويفشل tools/release-check.mjs عملية البناء إن ظهرت نقطة نهاية تحليلات أو شيفرة مستضافة عن بعد في الحزمة يوما ما.

المواقع المسموح للامتداد بالعمل عليها

يستطيع QA Wrap قراءة كل المواقع منذ لحظة التثبيت. تقول نافذة التثبيت ذلك ("قراءة بياناتك وتغييرها على جميع المواقع"). القدرة على القراءة ليست التقاط: لا يلتقط QA Wrap شيئا حتى تضغط أيقظ أو ابدأ، ثم يلتقط التبويب أو النافذة التي عليها التركيز فقط، وما دام التركيز عليها.

اضغط أيقظ على الصفحة التي تختبرها؛ لا يسألك Chrome شيئا آخر لأن الوصول مُنح عند التثبيت. يمكنك سحبه من إعدادات الامتدادات في Chrome تحت الوصول إلى المواقع، وتغادر شيفرة الامتداد تلك المواقع معه. لا يسجل شيء من نافذة لم توقظها. تعمل مساعدة Jira على صفحات Jira (الواجهة فقط؛ الإشعارات فقط حين تشغّلها، وإلى مضيف Jira الخاص بك وحده).

النوم لا يعني أن لا شيء محمل. النوم يعني أن لا جلسة تسجل، ولا خطاف طلبات مثبتا، ولا أداة تعمل. وفي كل موقع تبقى سكربتات الصفحة الثمانية في QA Wrap (نحو 146 كيلوبايت من الشيفرة لكل إطار) محملة ولا تسجل شيئا حتى توقظ تلك النافذة.

على الأجهزة المُدارة يستطيع المسؤول ضبط hostPermissionsPolicy على ask (الافتراضي) أو all أو none. السياسة لا تمنح شيئا بذاتها.

الإشعار الذي تقرؤه أولا

عند التثبيت يفتح QA Wrap صفحة واحدة، بالعربية والإنجليزية، قبل أن تستخدم أي أداة: ما الذي يخزنه وأين، وما الذي يلتقطه التسجيل، وما الذي يفعله الإخفاء وما لا يفعله، وأنه يبدأ أنه يستطيع قراءة كل موقع لكنه لا يلتقط إلا نافذة توقظها، والسطر الخاص بالميكروفون. إلى أن تقبله لا تعرض النافذة المنبثقة سوى تلك البطاقة.

يكتب القبول ثلاث قيم في chrome.storage.local على هذا الجهاز: consentedAt وconsentVersion وconsentRevision، وهي لحظة القبول والنسخة التي قبلتها ونسخة صياغة صفحة الترحيب. لا تحدد هوية أي أحد، ولا تزامن ولا تصدر أبدا. تقارن الإضافة consentRevision بالنسخة الحالية عند التشغيل، فإذا نقحت الصياغة سئلت من جديد؛ أما consentVersion فسجل للإصدار فقط، والتحديث العادي لا يعيد السؤال.

الأذونات، ولماذا يوجد كل واحد منها

اعرض الجدول
الإذنيستخدم من أجل
storage، unlimitedStorageالجلسات ولقطات الشاشة والتسجيلات في ملفك؛ يمكن لجلسة طويلة أن تتجاوز الحصة الافتراضية
activeTab، tabsعنوان الصفحة قيد الاختبار وعنوانها الظاهر؛ فتح صفحتي التقرير والإعدادات
scriptingحقن الأدوات في الصفحة التي تختبرها، عند الطلب، وتسجيل سكربتات الصفحة على المواقع التي سمحت بها
webNavigationتسجيل التنقلات، وحالة الصفحة نفسها، وشجرة الإطارات التي يحتاجها محدد داخل iframe
webRequestقراءة ست ترويسات أمنية من كل استجابة أثناء تسجيل جلسة، وفي المواقع التي منحتها الوصول فقط، ليقيسها تقرير التفاصيل الدقيقة بدل أن يطلب منك ذلك. مراقبة فقط: لا شيء يحجب أو يعدل أو يعاد توجيهه، ولا ترويسة أخرى تحفظ، ولا يرفق المستمع إلا أثناء تشغيل جلسة
cookiesمحرر الكعكات وملفات الكعكات المحفوظة
contextMenusعناصر قائمة النقر بزر الفأرة الأيمن
notificationsإشعار على سطح المكتب عند حفظ جلسة، وعند بدء تسجيل أو إيقافه، وعند ذهاب الامتداد إلى النوم؛ لا يرسل شيء منها إلى أي مكان، ويعطلها الإعدادات
sidePanelمساحة العمل المثبتة على جانب المتصفح
clipboardWriteنسخ محدد عنصر
alarmsالتنظيف اليومي للجلسات الأقدم من مدة الاحتفاظ التي حددتها، وهو يجب أن يعمل حتى أثناء تعليق العامل الخدمي
downloadsحفظ الملفات المصدرة في المجلد الذي اخترته
offscreenترميز التسجيلات وملفات GIF، وهو ما يحتاج مستندا
tabCaptureتسجيل التبويب حين تضغط تسجيل
debuggerقياس أي جزء من شيفرة الصفحة نفذ (تغطية الشيفرة) حين تضغط قس؛ يعرضه Chrome عند التثبيت، ويبقى المنقح غير موصول حتى تضغط قس
اختياري desktopCaptureتسجيل نافذة أو الشاشة كلها؛ يطلب أول مرة تختار فيها أحدهما، ويمكن رفضه
الموقع الذي أنت عليهيغطيه إذن المضيف <all_urls> أدناه؛ لا يلتقط شيء حتى تضغط أيقظ أو ابدأ، ثم ما دام تبويبه أو نافذته عليها التركيز
اختياري عنوان خدمة أعددتهايطلب بالاسم أول مرة تحفظ أو تختبر Jira أو أداة تتبع أو webhook محادثة أو Telegram، ولا أوسع؛ يمكن رفضه وسحبه من إعدادات الامتدادات في Chrome
إذن المضيف <all_urls>ممنوح منذ التثبيت؛ تعرضه نافذة التثبيت قراءةً لبياناتك وتغييرا لها على جميع المواقع. لا تسجل سكربتات الصفحة شيئا حتى توقظ تلك النافذة

التغييرات والتواصل

تسجل التغييرات على هذه السياسة في ملاحظات إصدار الامتداد. هذه الصفحة و PRIVACY.md داخل الحزمة يحملان النص نفسه.

توجه الأسئلة إلى نادر الزغول على naderalzghoulbusiness@gmail.com، أو عبر صفحة الدعم.

More from Nader

المزيد من نادر