10

At Why is the result of this for and while loop different? [duplicate] (and that's just an example), I've voted to close the question as a duplicate.

But because of my reputation on the tag, that question has been closed straight away with the "Users with the [shell] gold badge can single-handedly mark [shell] questions as duplicates" message.

I don't like it for several reasons:

  • I'm not aware of all the questions posted around here. I know (and sometimes manage to remember) about the ones I've answered, so that's the ones I will typically suggest as duplicate. There may be better ones. So there's an unfair bias here toward high-rep users I'd say.
  • When I click close, I do mean suggest to close or vote to close. I like that being reviewed by others, including the OP who may want to edit the question to clarify why his question is different.
  • When I see "Closed by John Doe", my reaction is "Who's that John Doe, who does he think he is?", while when I see "Closed by John Doe, user2, user3, user4...", even if I don't agree, my reaction is "fair enough, it's been closed through a democratic process by several people who cared to consider the relevance of the question".
  • I don't know which tags I have a gold badge for, nor want to have to check what were the original tags in the question, so I don't know when "close" is a close or a vote to close.

On Unix.SE, that's aggravated by the fact that half the questions are initially tagged as or , while most of the time, they're really about neither, but more about , , , , , ...

Some are re-tagged properly, and that means the original tag (like bash (I don't even use that shell and I've got a gold badge on that!)) is no longer visible, which makes the UI even more misleading.

That example above is quite typical. The question was a FAQ, it's a very common issue. I've seen countless similar questions on usenet, and a few on SE as well. It's a shell question, but it's a problem caused by ssh, so tags don't help. Searching for them is not easy. I've voted to close as a duplicate of the first one I found.

So, is there a way to relinquish one's right to close questions single-handedly (other than by creating a separate user as I just did)?

Alternatively, could the interface please be changed so the "close" link becomes a "close!" one, or some other way like a different colour or confirmation dialog to make it clear that the question is going to be single-handedly closed.

5

As long as the system doesn't warn you or allows you to relinquish the right to close "immediately" there are at least two things you could consider to do, for the tags you have a gold badge for right now and for any future ones:

  1. Edit the appropriate tag descriptions and insert a warning that alerts the person applying the tag, with an appropriate text that there is a member with a gold badge that might close posts, with this tag, with one stroke.

  2. Install greasemonkey and in it the script at the bottom of this post to make the UI less misleading.

    It highlights "close" in red, for any question that has a tag matching the list passed in with check_tags(). It does so both while reviewing, as when just browsing posts. The review page loads the actual post per AJAX, that is why the waitForKeyElements is necessary.

    You would still have the tedious job of adapting the script every time for each new, tag related, gold badge. But fortunately you only have to do that once per tag. If that becomes too heavy a burden on your time you might consider parsing your badge information and updating the script automatically (once per day or more frequent as necessary).


// ==UserScript==
// @name        Highlight close
// @namespace   http://ruamel.eu
// @description Highlight close for posts with specific tags
// @match       http://*.stackexchange.com/*
// @match       http://*.stackoverflow.com/*
// @version     1
// @grant       none
// ==/UserScript==

function highlight_close() {
  var elem = document.querySelector('.close-question-link');
  if (elem != '') {
    elem.style.color = 'red';
  }
  var elems = document.querySelectorAll('input');
  for (var i = 0; i < elems.length; i++) {
    if (elems[i].value == 'Close') {
       elems[i].style.backgroundColor = 'red';
    }
  }
}

function check_tags(tags) {
  var posttags = document.querySelectorAll('a.post-tag');
  for (var i = 0; i < posttags.length; i++) {
    for (var j = 0; j < tags.length; j++) {
      if (posttags[i].text == tags[j]) {
        highlight_close();
        return;
      }
    }
  }
}

function wait_check_tags(jNode) {
check_tags(['shell', 'bash']);   /* <<<<<<< extend here */
}

/* https://gist.githubusercontent.com/BrockA/2625891/raw/waitForKeyElements.js */
/*--- waitForKeyElements():  A utility function, for Greasemonkey scripts,
    that detects and handles AJAXed content.

    Usage example:

        waitForKeyElements (
            "div.comments"
            , commentCallbackFunction
        );

        //--- Page-specific function to do what we want when the node is found.
        function commentCallbackFunction (jNode) {
            jNode.text ("This comment changed by waitForKeyElements().");
        }

    IMPORTANT: This function requires your script to have loaded jQuery.
*/
function waitForKeyElements (
    selectorTxt,    /* Required: The jQuery selector string that
                        specifies the desired element(s).
                    */
    actionFunction, /* Required: The code to run when elements are
                        found. It is passed a jNode to the matched
                        element.
                    */
    bWaitOnce,      /* Optional: If false, will continue to scan for
                        new elements even after the first match is
                        found.
                    */
    iframeSelector  /* Optional: If set, identifies the iframe to
                        search.
                    */
) {
    var targetNodes, btargetsFound;

    if (typeof iframeSelector == "undefined")
        targetNodes     = $(selectorTxt);
    else
        targetNodes     = $(iframeSelector).contents ()
                                           .find (selectorTxt);

    if (targetNodes  &&  targetNodes.length > 0) {
        btargetsFound   = true;
        /*--- Found target node(s).  Go through each and act if they
            are new.
        */
        targetNodes.each ( function () {
            var jThis        = $(this);
            var alreadyFound = jThis.data ('alreadyFound')  ||  false;

            if (!alreadyFound) {
                //--- Call the payload function.
                var cancelFound     = actionFunction (jThis);
                if (cancelFound)
                    btargetsFound   = false;
                else
                    jThis.data ('alreadyFound', true);
            }
        } );
    }
    else {
        btargetsFound   = false;
    }

    //--- Get the timer-control variable for this selector.
    var controlObj      = waitForKeyElements.controlObj  ||  {};
    var controlKey      = selectorTxt.replace (/[^\w]/g, "_");
    var timeControl     = controlObj [controlKey];

    //--- Now set or clear the timer as appropriate.
    if (btargetsFound  &&  bWaitOnce  &&  timeControl) {
        //--- The only condition where we need to clear the timer.
        clearInterval (timeControl);
        delete controlObj [controlKey]
    }
    else {
        //--- Set a timer, if needed.
        if ( ! timeControl) {
            timeControl = setInterval ( function () {
                    waitForKeyElements (    selectorTxt,
                                            actionFunction,
                                            bWaitOnce,
                                            iframeSelector
                                        );
                },
                300
            );
            controlObj [controlKey] = timeControl;
        }
    }
    waitForKeyElements.controlObj   = controlObj;
}

waitForKeyElements('div.user-info', wait_check_tags, true);
  • 1
    I just realise I am only at close to 20% of the requirement of this script being useful for myself. I had better spent my time on answering main site questions ;-) – Anthon Oct 28 '14 at 6:52
  • +2 ;-) Thanks for the greasemonkey stuff. I suppose one could also use the SE API to retrieve the list of gold tags, but since that doesn't change often it's probably better to skip doing another query and hardcode the tags as an optimisation. – Stéphane Chazelas Oct 28 '14 at 8:17
  • Where it may not work however is that your ability to close is based on the initial tags while I suppose post-tag are the current tags. – Stéphane Chazelas Oct 28 '14 at 8:20
  • @StéphaneChazelas I was not aware of the difference between initial and current tags, and I will have some difficulty testing this myself (re my first comment). The code scans the post for current tags using the 'post-tag' class, I don't think removed tags are (hidden) somewhere in the page, but I will have look. – Anthon Oct 28 '14 at 8:42
  • @StéphaneChazelas To get all tags ever associated with a post I could retrieve the edit history of the page (assuming it has one) and run the scan for post-tag on that. That is an extra page retrieve (for edited post), and maybe a bit costly, but I think one can do that. Unfortunately it doesn't allow me to get rid of the waitForKeyElements. Let me know if you want me to look into that, it should not be too hard. – Anthon Oct 28 '14 at 9:09
  • I believe SE has an API to retrieve random information in a programmatical way. I suppose you'd be able to use that to retrieve the initial tags and the list of gold tags (that latter one you may want to cache). That's probably a lot effort. As it is now, it's good enough for me, though any improvement would be welcome. – Stéphane Chazelas Oct 28 '14 at 9:41
  • @StéphaneChazelas I presume Anthon is referring to your current answers, make sure they are tagged correctly, and don't use irrelevant ones, that would give you the gold badge in first place (although we should really start stripping several posts of the linux tag). – Braiam Oct 29 '14 at 3:26
  • @Braiam Your suggestion doesn't make sense, this discussion is not about him adding a tag, but about finding already removed tags. If I understand Stephane correctly, the problem lies with the fact that even if one of his gold badge tags was removed removed from the question he still has the closing power. That is why I have to look at the history. It is not his job to make sure they are tagged correctly before closing a question. – Anthon Oct 29 '14 at 4:33
  • and I'm talking about his current or future answers on post, that allows him to hold the gold tag badge, to make sure that the tags are correctly applied, instead of generics ones (like he says in his post about linux and bash). This also helps the system, since it would suggest the most fitting tag instead of the generics. Editing tags of your existing posts helps in his current and future situation. – Braiam Oct 29 '14 at 4:44
  • @Braiam Ok that makes more sense. The linearity of the comments here (and the required brevity) often make it difficult to follow threads. Stephane could even start deleting tags from old posts where he is threatening to get a gold badge ;-) – Anthon Oct 29 '14 at 4:48
  • 2
    Point one about editing the tag wikis seems like a bad idea to me. – Caleb Oct 29 '14 at 19:16
  • @caleb To me too, it would be an absurd approach and likely not very effective anyway. – Anthon Oct 29 '14 at 19:32
7

You don't like it because the normal vote-to-close behavior tricks you into thinking your opinion is worth less than it really is.

But it is a trick. Your opinion is worth a lot.

Finding duplicates is hard. You have to know what to search for, and then know enough about the topic to say whether the results match what's being asked. No one has complete knowledge of every question asked - the chance that you'll know of a suitable original upon viewing a newly-asked duplicate are slim, which is why search is built into the close UI and why the selections of previous voters (or flaggers) are visible by default. In practice, most folks who aren't the first voter don't bother seeking out duplicates unless the one previously chosen was blatantly wrong... and sometimes not even then.

So, you might make a mistake. You're probably better equipped to not make mistakes than most of the people here, but to err is human. You were probably already making the occasional mistake... To date, you've cast 149 close votes here, and 114 have directly resulted in the questions being closed. One was later reopened. An additional 22 were later closed after your vote aged. You're not perfect, but you're doing far better at getting it right than the system is at preventing you from getting it wrong.

If you do make a mistake, there are still checks: others can vote to reopen, and there's a review queue for that too. If someone finds a better duplicate, they can just edit a link in - no harm done. And if you realize you've erred, you can reopen such questions with a single vote as well.

The intent here is to speed things up when there's a pretty good chance you're right - not to make it harder to correct on those rare occasions when you're not. So continue focusing on doing the best you can, and be ready to admit it if you happen to make a mistake. That's all that's asked of anyone... Regardless of the weight of their votes.

  • 1
    Thanks. I can see where you're coming from. I still find the UI misleading though. I've been annoyed in more than half the occurrences. – Stéphane Chazelas Oct 27 '14 at 16:08
-2

Quick Survey

Do you think the handling is not ideal and should be improved

Please:

  • upvote if you agree
  • downvote if you think it's as good as it will ever get and/or is not worth improving.
  • do nothing if you don't care either way.
  • 1
    I'm sure it can be improved, nothing is perfect, but how? If you're unsure about closing a question as a duplicate, ask in chat. If worse comes to worse and you make a mistake, the question can be reopened; if you can close in one go then you can reopen in one go. – Gilles Nov 9 '14 at 2:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .